@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,53 @@
|
|
|
1
|
+
import { type ApiRouteDeps, type SiteClampedResource } from "@opengeni/core";
|
|
2
|
+
import type { Context, Next } from "hono";
|
|
3
|
+
/**
|
|
4
|
+
* The only writes (any method but `GET`, `HEAD` and `OPTIONS`) a
|
|
5
|
+
* Site-started agent may send under `/v1/workspaces/:workspaceId`, matched
|
|
6
|
+
* on the path after the workspace id. Every other write is refused, so a
|
|
7
|
+
* route family added later starts closed to it.
|
|
8
|
+
*/
|
|
9
|
+
export declare const SITE_AGENT_WRITES: readonly RegExp[];
|
|
10
|
+
/**
|
|
11
|
+
* Writes open to a Site-started agent for one method only, where the same
|
|
12
|
+
* path also manages something. A Site's named query runs with `POST`
|
|
13
|
+
* (exactly what its page may call, under the query's audience; Site SQL's
|
|
14
|
+
* own clamp limits it to the Site the agent was started from), while `PUT`
|
|
15
|
+
* and `DELETE` on that path define and delete the query and stay closed, as
|
|
16
|
+
* does every other Site SQL route (settings, migrations, ad hoc statements,
|
|
17
|
+
* import and reset).
|
|
18
|
+
*/
|
|
19
|
+
export declare const SITE_AGENT_METHOD_WRITES: readonly {
|
|
20
|
+
method: string;
|
|
21
|
+
pattern: RegExp;
|
|
22
|
+
}[];
|
|
23
|
+
/**
|
|
24
|
+
* Whether a Site-started agent may send a `method` write to `path` (before
|
|
25
|
+
* the Site content rule). Without a method only the path-wide allowlist
|
|
26
|
+
* applies.
|
|
27
|
+
*/
|
|
28
|
+
export declare function siteAgentMayWrite(path: string, method?: string): boolean;
|
|
29
|
+
/** What a refused write to `path` names. */
|
|
30
|
+
export declare function siteAgentWriteResource(path: string): SiteClampedResource;
|
|
31
|
+
/**
|
|
32
|
+
* Server-side boundary for agents started from a Site page (a published
|
|
33
|
+
* Site, or a console frame). Such an agent acts with the page's reach: it
|
|
34
|
+
* does not learn and cannot widen anyone's access. Under
|
|
35
|
+
* `/v1/workspaces/:workspaceId` it may send only the writes in
|
|
36
|
+
* `SITE_AGENT_WRITES` (its tools, its conversations, files and content, and
|
|
37
|
+
* reads sent as POST) and `SITE_AGENT_METHOD_WRITES` (running a Site's named
|
|
38
|
+
* SQL queries); any other write, including `PATCH` or `DELETE` on the
|
|
39
|
+
* workspace itself and browser or computer sessions (which can drive the
|
|
40
|
+
* viewer's Chrome or screen), is refused with 403 before the route runs. It also
|
|
41
|
+
* changes a published Site's content only for a Site it was started from.
|
|
42
|
+
* Reads are unaffected, and so is every caller that is not a Site-clamped
|
|
43
|
+
* agent. The first-party tools that write workspace state (`knowledge_save`,
|
|
44
|
+
* `instruction_policy_save`, `secret_save`, `skill_save`,
|
|
45
|
+
* `company_profile_propose`, the Connected Machine, sandbox environment and
|
|
46
|
+
* fleet tools (`run_on`, `sandbox_attach`, `sandbox_swap`,
|
|
47
|
+
* `sandbox_provision`), the artifact tools and their siblings) check the
|
|
48
|
+
* same clamp themselves.
|
|
49
|
+
*
|
|
50
|
+
* Paths are matched as Hono routes them (`c.req.path`, percent-decoded), so
|
|
51
|
+
* an encoded segment cannot reach a route this guard did not recognize.
|
|
52
|
+
*/
|
|
53
|
+
export declare function siteClampedAgentGuard(deps: ApiRouteDeps): (c: Context, next: Next) => Promise<void>;
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import type { ApiRouteDeps } from "@opengeni/core";
|
|
2
|
+
import type { SiteDataCollectionDefinitionRequest, SiteDataDescribeResponse, SiteDataFileScope, SiteDataImportRequest, SiteDataQueryRequest, SiteDataWriteOperation } from "@opengeni/contracts";
|
|
3
|
+
import { type SiteDataFile, type SiteDataRecord } from "@opengeni/db";
|
|
4
|
+
import { type SiteDataAuthority, type SiteDataDeps, type SiteDataSurface } from "./service.js";
|
|
5
|
+
/** Shared Site Data operations for HTTP routes, the Site bridge and agent tools. */
|
|
6
|
+
export declare const SITE_DATA_EXPORT_MAX_RECORDS = 10000;
|
|
7
|
+
export declare const SITE_DATA_IMPORT_MAX_RECORDS = 1000;
|
|
8
|
+
/** CSV imports accept at most this many columns. */
|
|
9
|
+
export declare const SITE_DATA_IMPORT_MAX_COLUMNS = 1000;
|
|
10
|
+
/** CSV exports name at most this many data columns; wider data goes in one JSON column. */
|
|
11
|
+
export declare const SITE_DATA_EXPORT_MAX_COLUMNS = 200;
|
|
12
|
+
/** Exports stop adding records past this many bytes and report truncation. */
|
|
13
|
+
export declare const SITE_DATA_EXPORT_MAX_BYTES: number;
|
|
14
|
+
export declare function describeSiteData(deps: SiteDataDeps, grant: SiteDataAuthority, siteId: string): Promise<SiteDataDescribeResponse>;
|
|
15
|
+
export declare function defineSiteDataCollection(deps: SiteDataDeps, grant: SiteDataAuthority, siteId: string, name: string, definition: SiteDataCollectionDefinitionRequest): Promise<{
|
|
16
|
+
collection: import("@opengeni/db").SiteDataCollection;
|
|
17
|
+
created: boolean;
|
|
18
|
+
}>;
|
|
19
|
+
export declare function deleteSiteDataCollection(deps: SiteDataDeps, grant: SiteDataAuthority, siteId: string, name: string): Promise<{
|
|
20
|
+
deletedRecords: number;
|
|
21
|
+
}>;
|
|
22
|
+
export declare function resetSiteDataCollection(deps: SiteDataDeps, grant: SiteDataAuthority, siteId: string, name: string): Promise<{
|
|
23
|
+
deletedRecords: number;
|
|
24
|
+
}>;
|
|
25
|
+
export declare function querySiteData(deps: SiteDataDeps, grant: SiteDataAuthority, siteId: string, query: SiteDataQueryRequest, surface?: SiteDataSurface): Promise<import("@opengeni/db").SiteDataQueryResult>;
|
|
26
|
+
export declare function getSiteDataRecord(deps: SiteDataDeps, grant: SiteDataAuthority, siteId: string, request: {
|
|
27
|
+
collection: string;
|
|
28
|
+
id?: string | undefined;
|
|
29
|
+
key?: string | undefined;
|
|
30
|
+
}, surface?: SiteDataSurface): Promise<SiteDataRecord | null>;
|
|
31
|
+
export declare function writeSiteData(deps: SiteDataDeps, grant: SiteDataAuthority, siteId: string, operations: SiteDataWriteOperation[], surface?: SiteDataSurface): Promise<{
|
|
32
|
+
results: import("@opengeni/db").SiteDataWriteResultItem[];
|
|
33
|
+
summary: import("@opengeni/db").SiteDataWriteSummary;
|
|
34
|
+
}>;
|
|
35
|
+
/** RFC 4180 CSV: quoted fields, doubled quotes, CRLF or LF rows. */
|
|
36
|
+
/**
|
|
37
|
+
* Parse CSV text into rows (the first is the header). Optional limits stop
|
|
38
|
+
* parsing as soon as a row has too many cells or there are too many records,
|
|
39
|
+
* before any record is built.
|
|
40
|
+
*/
|
|
41
|
+
export declare function parseSiteDataCsv(text: string, limits?: {
|
|
42
|
+
maxColumns?: number;
|
|
43
|
+
maxRecords?: number;
|
|
44
|
+
}): string[][];
|
|
45
|
+
export declare function siteDataCsvCell(value: unknown): string;
|
|
46
|
+
/**
|
|
47
|
+
* Turn import CSV into records: the header names dotted data paths. Column
|
|
48
|
+
* and row caps apply while parsing, before any record is built, and each
|
|
49
|
+
* record is built in one pass.
|
|
50
|
+
*/
|
|
51
|
+
export declare function siteDataCsvRecords(csv: string): Record<string, unknown>[];
|
|
52
|
+
export declare function importSiteData(deps: SiteDataDeps, grant: SiteDataAuthority, siteId: string, collection: string, request: SiteDataImportRequest): Promise<{
|
|
53
|
+
imported: number;
|
|
54
|
+
}>;
|
|
55
|
+
/**
|
|
56
|
+
* An import's error, with how many records it had already imported. Once a
|
|
57
|
+
* batch committed, sending the same import again would duplicate it, so the
|
|
58
|
+
* error is no longer retryable and its message says what was imported.
|
|
59
|
+
*/
|
|
60
|
+
export declare function siteDataImportFailure(error: unknown, imported: number): unknown;
|
|
61
|
+
/**
|
|
62
|
+
* About how much JSON a CSV becomes once parsed: its text, plus the header
|
|
63
|
+
* repeated as field names on every row.
|
|
64
|
+
*/
|
|
65
|
+
export declare function csvValidationBytes(csv: string): number;
|
|
66
|
+
export declare function exportSiteData(deps: SiteDataDeps, grant: SiteDataAuthority, siteId: string, collection: string, format: "json" | "csv"): Promise<{
|
|
67
|
+
collection: string;
|
|
68
|
+
format: "json" | "csv";
|
|
69
|
+
records: number;
|
|
70
|
+
truncated: boolean;
|
|
71
|
+
content: string;
|
|
72
|
+
}>;
|
|
73
|
+
export declare function uploadSiteDataFile(deps: SiteDataDeps & Pick<ApiRouteDeps, "objectStorage">, grant: SiteDataAuthority, siteId: string, input: {
|
|
74
|
+
name: string | null | undefined;
|
|
75
|
+
contentType: string | null | undefined;
|
|
76
|
+
/**
|
|
77
|
+
* The file's bytes, or a reader for a request body: it is called only
|
|
78
|
+
* after access, the rate window and the quota (with the declared size,
|
|
79
|
+
* when known) have passed, so refused uploads are never read.
|
|
80
|
+
*/
|
|
81
|
+
body: Uint8Array | {
|
|
82
|
+
declaredBytes?: number | undefined;
|
|
83
|
+
read: () => Promise<Uint8Array>;
|
|
84
|
+
};
|
|
85
|
+
scope?: SiteDataFileScope | undefined;
|
|
86
|
+
}, surface?: SiteDataSurface): Promise<SiteDataFile>;
|
|
87
|
+
export declare function listSiteDataFiles(deps: SiteDataDeps, grant: SiteDataAuthority, siteId: string, options: {
|
|
88
|
+
limit?: number;
|
|
89
|
+
cursor?: string | null;
|
|
90
|
+
}, surface?: SiteDataSurface): Promise<{
|
|
91
|
+
files: SiteDataFile[];
|
|
92
|
+
nextCursor: string | null;
|
|
93
|
+
}>;
|
|
94
|
+
export declare function getSiteDataFileUrl(deps: SiteDataDeps & Pick<ApiRouteDeps, "objectStorage">, grant: SiteDataAuthority, siteId: string, fileId: string, surface?: SiteDataSurface, audience?: "public" | "sandbox"): Promise<{
|
|
95
|
+
file: SiteDataFile;
|
|
96
|
+
url: string;
|
|
97
|
+
expiresAt: string;
|
|
98
|
+
}>;
|
|
99
|
+
export declare function deleteSiteDataFile(deps: SiteDataDeps & Pick<ApiRouteDeps, "objectStorage">, grant: SiteDataAuthority, siteId: string, fileId: string, surface?: SiteDataSurface): Promise<{
|
|
100
|
+
deleted: {
|
|
101
|
+
id: string;
|
|
102
|
+
};
|
|
103
|
+
}>;
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import type { ApiRouteDeps } from "@opengeni/core";
|
|
2
|
+
import type { AccessGrant, SiteDataDescribeResponse } from "@opengeni/contracts";
|
|
3
|
+
import { type Database, type SiteDataCaller, type SiteDataLimits, type SiteDataSite, type SiteDataStore, type SiteDataWriteOptions, type SiteDataWriteSummary } from "@opengeni/db";
|
|
4
|
+
/**
|
|
5
|
+
* Site Data service: resolves who is calling (manager or viewer, and their
|
|
6
|
+
* principal), applies Site state rules, and wires validation and usage
|
|
7
|
+
* metering into the backend-neutral store. Every surface (HTTP, the Site
|
|
8
|
+
* bridge, first-party agent tools) goes through here.
|
|
9
|
+
*/
|
|
10
|
+
export type SiteDataDeps = Pick<ApiRouteDeps, "db" | "settings">;
|
|
11
|
+
export type SiteDataAccess = {
|
|
12
|
+
site: SiteDataSite;
|
|
13
|
+
caller: SiteDataCaller;
|
|
14
|
+
subjectId: string | null;
|
|
15
|
+
store: SiteDataStore;
|
|
16
|
+
limits: SiteDataLimits;
|
|
17
|
+
writeOptions: SiteDataWriteOptions;
|
|
18
|
+
};
|
|
19
|
+
/** One store per database handle. */
|
|
20
|
+
export declare function siteDataStore(db: Database): SiteDataStore;
|
|
21
|
+
export declare function siteDataLimits(settings: ApiRouteDeps["settings"]): SiteDataLimits;
|
|
22
|
+
export declare function publicSiteDataLimits(limits: SiteDataLimits): SiteDataDescribeResponse["limits"];
|
|
23
|
+
/** Most schema nodes (objects or booleans) a collection schema may have. */
|
|
24
|
+
export declare const SITE_DATA_MAX_SCHEMA_NODES = 2000;
|
|
25
|
+
/** Most properties one object schema may name (CSV imports allow 1,000 columns). */
|
|
26
|
+
export declare const SITE_DATA_MAX_SCHEMA_PROPERTIES = 1000;
|
|
27
|
+
/** Most branches one allOf, anyOf or oneOf may have. */
|
|
28
|
+
export declare const SITE_DATA_MAX_SCHEMA_BRANCHES = 16;
|
|
29
|
+
/** Most enum values a whole collection schema may list. */
|
|
30
|
+
export declare const SITE_DATA_MAX_SCHEMA_ENUM_TOTAL = 500;
|
|
31
|
+
/** Deepest schema nesting a collection schema may have. */
|
|
32
|
+
export declare const SITE_DATA_MAX_SCHEMA_DEPTH = 16;
|
|
33
|
+
/** Most values an `enum` may list. */
|
|
34
|
+
export declare const SITE_DATA_MAX_SCHEMA_ENUM = 100;
|
|
35
|
+
/**
|
|
36
|
+
* Most checks a schema may run on each repeated value (an array element or an
|
|
37
|
+
* additional property): see siteDataSchemaRepeatedCost. A record can repeat a
|
|
38
|
+
* value up to about 128K times, so this bounds the cost of checking it.
|
|
39
|
+
*/
|
|
40
|
+
export declare const SITE_DATA_MAX_SCHEMA_REPEATED_COST = 600;
|
|
41
|
+
/**
|
|
42
|
+
* Validators with more generated code than this run unoptimized, about four
|
|
43
|
+
* times slower (measured), so their repeated cost counts four times.
|
|
44
|
+
*/
|
|
45
|
+
export declare const SITE_DATA_LARGE_VALIDATOR_SOURCE = 200000;
|
|
46
|
+
/** Every keyword a collection schema may use. */
|
|
47
|
+
export declare const SITE_DATA_SCHEMA_KEYWORDS: readonly string[];
|
|
48
|
+
/**
|
|
49
|
+
* The most checks a schema runs on one repeated value: an array element or an
|
|
50
|
+
* additional property's value, which a record can hold about 128K of. Each
|
|
51
|
+
* schema object costs 1, plus 1 per enum value, property and required name;
|
|
52
|
+
* an allOf, anyOf or oneOf branch costs 6 (a failed branch is the costliest
|
|
53
|
+
* check, measured). Branches apply to the same value, so their costs add;
|
|
54
|
+
* children apply to different values, so only the costliest counts. Per node:
|
|
55
|
+
*
|
|
56
|
+
* - all(n): the costliest value n's subtree checks, n's own value included;
|
|
57
|
+
* - repeated(n): the costliest value below n that sits under `items` or
|
|
58
|
+
* `additionalProperties`.
|
|
59
|
+
*
|
|
60
|
+
* Both are upper bounds, computed in one pass over the schema.
|
|
61
|
+
*/
|
|
62
|
+
export declare function siteDataSchemaRepeatedCost(schema: unknown): number;
|
|
63
|
+
/**
|
|
64
|
+
* Walk a collection schema against the keyword allowlist, counting nodes,
|
|
65
|
+
* properties, enum values and depth, then bound its cost per repeated value.
|
|
66
|
+
* Returns the first problem, or null when the schema is supported.
|
|
67
|
+
*/
|
|
68
|
+
export declare function siteDataSchemaProblem(schema: unknown): string | null;
|
|
69
|
+
/** Compiled validators currently cached (for tests). */
|
|
70
|
+
export declare function siteDataSchemaCacheSize(): number;
|
|
71
|
+
export declare function validateSiteDataRecord(schema: Record<string, unknown>, data: Record<string, unknown>): string | null;
|
|
72
|
+
/** Check a collection's JSON Schema is supported and compiles before it is stored. */
|
|
73
|
+
export declare function assertSiteDataSchema(schema: Record<string, unknown> | null | undefined): void;
|
|
74
|
+
/** Total record JSON one write, batch or import request may carry. */
|
|
75
|
+
export declare const SITE_DATA_MAX_REQUEST_RECORD_BYTES: number;
|
|
76
|
+
/**
|
|
77
|
+
* Schema validation time one request may spend, checked before each record
|
|
78
|
+
* after the first, so one record always completes.
|
|
79
|
+
*/
|
|
80
|
+
export declare const SITE_DATA_VALIDATION_BUDGET_MS = 250;
|
|
81
|
+
/** Validation time every validating request reserves at admission. */
|
|
82
|
+
export declare const SITE_DATA_VALIDATION_RESERVE_BASE_MS = 25;
|
|
83
|
+
/** Additional reservation per byte of JSON the request validates (1 µs). */
|
|
84
|
+
export declare const SITE_DATA_VALIDATION_RESERVE_MS_PER_BYTE = 0.001;
|
|
85
|
+
/** How far a write may pass its reservation before records that grew are sent again. */
|
|
86
|
+
export declare const SITE_DATA_VALIDATION_RESERVE_SLACK_MS = 25;
|
|
87
|
+
/**
|
|
88
|
+
* The validation time a request reserves at admission: a base plus a little
|
|
89
|
+
* per byte it will validate, capped at the request budget. Small requests
|
|
90
|
+
* reserve little, so many can run at once; an overrun is charged when the
|
|
91
|
+
* request settles.
|
|
92
|
+
*/
|
|
93
|
+
export declare function siteDataValidationReservationMs(bytes: number): number;
|
|
94
|
+
/**
|
|
95
|
+
* Bytes of JSON in these values, counting only until the reservation would
|
|
96
|
+
* reach the budget (larger requests reserve the whole budget anyway).
|
|
97
|
+
*/
|
|
98
|
+
export declare function siteDataValidationBytes(values: Iterable<unknown>): number;
|
|
99
|
+
/** The clock validation time is measured with; tests replace `now`. */
|
|
100
|
+
export declare const siteDataValidationClock: {
|
|
101
|
+
now: () => number;
|
|
102
|
+
};
|
|
103
|
+
/** Schema compile and validation time one request spent, in milliseconds. */
|
|
104
|
+
export type SiteDataValidationMeter = {
|
|
105
|
+
ms: number;
|
|
106
|
+
};
|
|
107
|
+
/**
|
|
108
|
+
* Check a write, batch or import before the store takes the Site's lock:
|
|
109
|
+
*
|
|
110
|
+
* - its records total at most 4 MB of JSON (`quota_exceeded`, `request_bytes`);
|
|
111
|
+
* - every insert and put record matches its collection's schema;
|
|
112
|
+
* - every patch and increment result, merged from the stored record, matches
|
|
113
|
+
* too (if the record changes before the lock, the write checks it again);
|
|
114
|
+
* - schema compiling and validation spend at most 250 ms per request: once
|
|
115
|
+
* anything was compiled or checked, each later operation is refused before
|
|
116
|
+
* it runs when the budget is spent, and the event loop gets a turn after
|
|
117
|
+
* every compile or check, even for a skipped record.
|
|
118
|
+
*
|
|
119
|
+
* Every millisecond spent, here and inside the write, is added to `meter`
|
|
120
|
+
* for the caller to settle. Returns write options that skip re-validating
|
|
121
|
+
* the records already checked and keep any check left for inside the write on
|
|
122
|
+
* the same budget. Inside the write only this request's compiled validators
|
|
123
|
+
* are used: a schema that changed since is a retryable `conflict`
|
|
124
|
+
* (reason `schema_changed`), never a compile under the Site's lock.
|
|
125
|
+
*
|
|
126
|
+
* With `reservedMs` (what the request reserved at admission), every patch
|
|
127
|
+
* or increment result it checks is counted at 1 µs per byte of JSON, and one
|
|
128
|
+
* is refused before it is checked when the request's total would pass its
|
|
129
|
+
* reservation by more than 25 ms. That happens when a record grew after
|
|
130
|
+
* admission (a large write landing first): a retryable `conflict` (reason
|
|
131
|
+
* `record_grew`), so the retry reserves for its real size. A re-check inside
|
|
132
|
+
* the write first uses what the check before the lock already counted, so
|
|
133
|
+
* only real growth counts. Inserts, puts and imports carry their data at
|
|
134
|
+
* admission and stay on the time budget, as does a reservation already at
|
|
135
|
+
* the budget (a retry could not reserve more).
|
|
136
|
+
*/
|
|
137
|
+
export declare function prevalidateSiteDataWrite(access: Pick<SiteDataAccess, "store" | "caller" | "limits" | "writeOptions">, operations: readonly unknown[], options?: {
|
|
138
|
+
budgetMs?: number;
|
|
139
|
+
meter?: SiteDataValidationMeter;
|
|
140
|
+
reservedMs?: number;
|
|
141
|
+
}): Promise<SiteDataWriteOptions>;
|
|
142
|
+
/**
|
|
143
|
+
* The record owner: the person, or the person an agent or schedule acts for.
|
|
144
|
+
* A person-less agent owns records as its scheduled task when a schedule's
|
|
145
|
+
* run created its session (`schedule:<taskId>`, stable across runs), and as
|
|
146
|
+
* its own session otherwise (`agent:session:<sessionId>`).
|
|
147
|
+
*/
|
|
148
|
+
export declare function siteDataPrincipal(grant: AccessGrant, subjectId: string | null, scheduledTaskId?: string | null): string;
|
|
149
|
+
/** The writer recorded on records: agents are distinct from the person they act for. */
|
|
150
|
+
export declare function siteDataActor(grant: AccessGrant, subjectId: string | null): string;
|
|
151
|
+
/**
|
|
152
|
+
* Managers may manage the Site's data, each with `artifacts:publish`: its
|
|
153
|
+
* owner, a workspace admin, an agent acting for one of those people, or a
|
|
154
|
+
* person-less workspace API key, configured key or service credential. A Site
|
|
155
|
+
* without an owner is managed by its creator. An agent without a person (for
|
|
156
|
+
* example a person-less scheduled task) is a viewer, whatever credential
|
|
157
|
+
* started it. Agents whose session came from a Site page are clamped to that
|
|
158
|
+
* Site's viewer rules in resolveSiteDataAccess.
|
|
159
|
+
*/
|
|
160
|
+
export declare function siteDataRole(grant: AccessGrant, site: Pick<SiteDataSite, "ownerSubjectId" | "createdBySubjectId">, subjectId: string | null): "manager" | "viewer";
|
|
161
|
+
export type SiteDataSurface = {
|
|
162
|
+
/** The pinned Site id a host attached to a Site-originated request. */
|
|
163
|
+
frameSiteId?: string | null;
|
|
164
|
+
/** Management surfaces: describe, define, delete, reset, import, export. */
|
|
165
|
+
management?: boolean;
|
|
166
|
+
};
|
|
167
|
+
/**
|
|
168
|
+
* A viewer of a published Site, resolved and authorized by site-runtime (the
|
|
169
|
+
* gateway-signed API): a signed-in person (`user:<subject>`) or an anonymous
|
|
170
|
+
* guest (`guest:<visitor>`). Always a framed viewer of exactly this Site;
|
|
171
|
+
* guests reach only what each collection's guest rule allows.
|
|
172
|
+
*/
|
|
173
|
+
export type PublishedSiteDataViewer = {
|
|
174
|
+
kind: "published_viewer";
|
|
175
|
+
accountId: string;
|
|
176
|
+
workspaceId: string;
|
|
177
|
+
site: SiteDataSite;
|
|
178
|
+
principal: string;
|
|
179
|
+
guest: boolean;
|
|
180
|
+
};
|
|
181
|
+
/** Who is calling Site Data: an access grant, or a published Site viewer. */
|
|
182
|
+
export type SiteDataAuthority = AccessGrant | PublishedSiteDataViewer;
|
|
183
|
+
/**
|
|
184
|
+
* Resolve the Site and caller. not_found when the caller cannot see the Site
|
|
185
|
+
* (by audience); forbidden for an archived Site (viewers and Site frames) and
|
|
186
|
+
* for management by anyone but a manager outside the Site frame.
|
|
187
|
+
*/
|
|
188
|
+
export declare function resolveSiteDataAccess(deps: SiteDataDeps, authority: SiteDataAuthority, siteId: string, surface?: SiteDataSurface): Promise<SiteDataAccess>;
|
|
189
|
+
/**
|
|
190
|
+
* Usage metering in `usage_only` mode (docs/credit-boundaries-rollout.md): the
|
|
191
|
+
* workspace pays for viewer-triggered usage; events are recorded in the write
|
|
192
|
+
* transaction and never debit credits until a reviewed rate is enabled. The
|
|
193
|
+
* workspace's Site storage level (Site SQL plus Site Data) is refreshed in
|
|
194
|
+
* its platform usage in the same transaction; any charge for it settles with
|
|
195
|
+
* the next platform usage the API meters (a Site SQL call or a gateway
|
|
196
|
+
* request report).
|
|
197
|
+
*/
|
|
198
|
+
export declare function meterSiteData(tx: Database, grant: Pick<AccessGrant, "accountId" | "workspaceId">, caller: SiteDataCaller, subjectId: string | null, kind: "write" | "upload", summary: SiteDataWriteSummary): Promise<void>;
|
|
199
|
+
/** Normalize and check a declared upload type; images and PDFs must match their bytes. */
|
|
200
|
+
export declare function siteDataFileContentType(declared: string | null | undefined, bytes: Uint8Array): string;
|
|
201
|
+
export declare function siteDataFileName(name: string | null | undefined): string;
|
|
202
|
+
export declare function siteDataObjectKey(workspaceId: string, siteId: string, fileId: string): string;
|
|
203
|
+
export declare function sha256Hex(bytes: Uint8Array): string;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type ApiRouteDeps } from "@opengeni/core";
|
|
2
|
+
import type { Context, Next } from "hono";
|
|
3
|
+
import { ApiHttpError } from "./http/api-error.js";
|
|
4
|
+
/**
|
|
5
|
+
* Server-side boundary for requests a host forwarded from a Site frame (the
|
|
6
|
+
* console bridge, a Codemode preview). Hosts already hold Site code to the
|
|
7
|
+
* `SITE_OPERATIONS` allowlist; the API enforces it again for any request that
|
|
8
|
+
* carries the host's frame headers:
|
|
9
|
+
*
|
|
10
|
+
* - only allowlisted operations reach a handler;
|
|
11
|
+
* - Site Data only for the frame's own published Site (403, as the Site Data
|
|
12
|
+
* service's own frame clamp answers);
|
|
13
|
+
* - a session list names only the frame's own Site;
|
|
14
|
+
* - a per-session operation reaches only a session the same Site (or, for a
|
|
15
|
+
* frame without a published Site, the same mounted frame) started; anything
|
|
16
|
+
* else is the same 404 as a missing session;
|
|
17
|
+
* - a message, draft, queue or control body carries only the fields Site
|
|
18
|
+
* code may set (`siteFrameBodyRefusal`): text and how the model answers it.
|
|
19
|
+
* Approval decisions, answers to questions, resources, personal resource
|
|
20
|
+
* attachments, MCP credential updates, connection accounts and model
|
|
21
|
+
* context are refused with 403 `site_frame_field_forbidden`; the person
|
|
22
|
+
* gives those in the console. Session creates get the same treatment in
|
|
23
|
+
* the create route, which also applies the minimal Site profile;
|
|
24
|
+
* - a session operation runs inside its validated Site origin, so every
|
|
25
|
+
* session or turn it starts records which Site it came from.
|
|
26
|
+
*
|
|
27
|
+
* Ordinary handlers still authorize every allowed operation with the
|
|
28
|
+
* viewer's own authority.
|
|
29
|
+
*/
|
|
30
|
+
export declare function siteFrameGuard(deps: ApiRouteDeps): (c: Context, next: Next) => Promise<void>;
|
|
31
|
+
/** 403 for a body field Site code may not send; names the field, never its value. */
|
|
32
|
+
export declare function siteFrameFieldForbidden(field: string): ApiHttpError;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { type FirstPartyMcpToolName, type SiteLimitProfileKind } from "@opengeni/contracts";
|
|
2
|
+
import type { ApiRouteDeps } from "@opengeni/core";
|
|
3
|
+
import { type SiteRuntimeConversationViewerKind } from "@opengeni/db";
|
|
4
|
+
import type { PublishedSiteDataViewer } from "../site-data/service.js";
|
|
5
|
+
import { type SiteRuntimeHost } from "./runtime.js";
|
|
6
|
+
/**
|
|
7
|
+
* A published Site's own data tools for its agent. Every Site agent
|
|
8
|
+
* conversation (members, invited people and public visitors) gets them,
|
|
9
|
+
* pinned on the server to that Site and acting as the conversation's viewer:
|
|
10
|
+
* the same audience checks and row binding as the Site's page (per-viewer
|
|
11
|
+
* collections, owner binding, `:viewer` and query audiences such as
|
|
12
|
+
* `signed_in` or `managers`). Site management tools (publication, migrate,
|
|
13
|
+
* define, reset, import, export, enable, files and so on) are never given.
|
|
14
|
+
*
|
|
15
|
+
* - `site_data_query`, `site_data_write`: the Site's collections under the
|
|
16
|
+
* viewer's access rules (guests only what each collection's guest rule allows).
|
|
17
|
+
* - `site_sql_run`: the Site's named queries, when Site SQL is on.
|
|
18
|
+
* - `site_sql_query`: read-only statements, for workspace members only, when
|
|
19
|
+
* Site SQL is on.
|
|
20
|
+
*/
|
|
21
|
+
export declare const SITE_AGENT_DATA_TOOLS: readonly ["site_data_query", "site_data_write"];
|
|
22
|
+
export declare const SITE_AGENT_SQL_TOOLS: readonly ["site_sql_run"];
|
|
23
|
+
export declare const SITE_AGENT_MEMBER_SQL_TOOLS: readonly ["site_sql_query"];
|
|
24
|
+
/** The first-party permissions those tools need (Site Data writes need publish). */
|
|
25
|
+
export declare const SITE_AGENT_DATA_TOOL_PERMISSIONS: readonly ["artifacts:read", "artifacts:publish"];
|
|
26
|
+
export declare const SITE_AGENT_OTHER_SITE_MESSAGE = "This Site's assistant can only use this Site's data";
|
|
27
|
+
export declare const SITE_AGENT_MANAGEMENT_MESSAGE = "This Site's assistant can use the Site's data, not manage the Site";
|
|
28
|
+
/** The data tools one viewer's Site agent conversation gets, within the deployment's tools. */
|
|
29
|
+
export declare function siteAgentDataToolNames(input: {
|
|
30
|
+
viewerKind: SiteRuntimeConversationViewerKind;
|
|
31
|
+
/** Site SQL is offered here and turned on for this Site. */
|
|
32
|
+
siteSql: boolean;
|
|
33
|
+
/** The deployment's first-party tool allowlist. */
|
|
34
|
+
allowed: readonly string[];
|
|
35
|
+
}): FirstPartyMcpToolName[];
|
|
36
|
+
/** Whether Site SQL is offered on this deployment and turned on for the Site. */
|
|
37
|
+
export declare function siteAgentSiteSqlOn(deps: Pick<ApiRouteDeps, "db" | "settings">, scope: {
|
|
38
|
+
accountId: string;
|
|
39
|
+
workspaceId: string;
|
|
40
|
+
}, siteId: string): Promise<boolean>;
|
|
41
|
+
/** The data tools for a new conversation of this viewer on this Site. */
|
|
42
|
+
export declare function siteAgentDataToolsForStart(deps: Pick<ApiRouteDeps, "db" | "settings">, scope: {
|
|
43
|
+
accountId: string;
|
|
44
|
+
workspaceId: string;
|
|
45
|
+
}, siteId: string, viewerKind: SiteRuntimeConversationViewerKind): Promise<FirstPartyMcpToolName[]>;
|
|
46
|
+
/** This Site's viewer (`user:<subject>` or `guest:<visitor>`) as Site Data and Site SQL see it. */
|
|
47
|
+
export declare function sitePublishedDataViewer(host: Pick<SiteRuntimeHost, "scope" | "site">, principal: string, guest: boolean): PublishedSiteDataViewer;
|
|
48
|
+
/**
|
|
49
|
+
* The Site agent's instructions: which Site and viewer it serves and what its
|
|
50
|
+
* data tools may do, then the owner's own instructions for the Site.
|
|
51
|
+
*/
|
|
52
|
+
export declare function siteAgentInstructions(host: Pick<SiteRuntimeHost, "site">, viewer: {
|
|
53
|
+
kind: SiteRuntimeConversationViewerKind;
|
|
54
|
+
}, dataTools: readonly string[], ownerInstructions: string | null | undefined): string;
|
|
55
|
+
/** A Site agent conversation's data context: the pinned Site and the viewer it acts as. */
|
|
56
|
+
export type SiteAgentDataContext = {
|
|
57
|
+
kind: "site";
|
|
58
|
+
siteId: string;
|
|
59
|
+
viewerKind: SiteRuntimeConversationViewerKind;
|
|
60
|
+
viewer: PublishedSiteDataViewer;
|
|
61
|
+
/** The limit profile kind in force (Site SQL limits follow it). */
|
|
62
|
+
profileKind: SiteLimitProfileKind;
|
|
63
|
+
/**
|
|
64
|
+
* Count one write against the guest write limit (anonymous guests only);
|
|
65
|
+
* null when allowed, else the seconds to wait.
|
|
66
|
+
*/
|
|
67
|
+
guestWrite: () => Promise<number | null>;
|
|
68
|
+
};
|
|
69
|
+
export type SiteAgentDataResolution = {
|
|
70
|
+
kind: "ordinary";
|
|
71
|
+
} | {
|
|
72
|
+
kind: "refused";
|
|
73
|
+
message: string;
|
|
74
|
+
} | SiteAgentDataContext;
|
|
75
|
+
/**
|
|
76
|
+
* Whether an agent session is a published Site's agent and, if so, the Site
|
|
77
|
+
* and viewer its data tools act for. Ordinary sessions resolve `ordinary`.
|
|
78
|
+
* A Site agent whose conversation, Site or publication cannot be confirmed,
|
|
79
|
+
* or whose member viewer has left the workspace, is refused (fail closed).
|
|
80
|
+
*/
|
|
81
|
+
export declare function resolveSiteAgentDataContext(deps: Pick<ApiRouteDeps, "db" | "settings" | "objectStorage">, scope: {
|
|
82
|
+
accountId: string;
|
|
83
|
+
workspaceId: string;
|
|
84
|
+
}, sessionId: string): Promise<SiteAgentDataResolution>;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { Settings } from "@opengeni/config";
|
|
2
|
+
import { type OrganizationModelDefaults, type WorkspaceSessionDefaults } from "@opengeni/contracts";
|
|
3
|
+
import { type WorkspaceModelSelection } from "@opengeni/core";
|
|
4
|
+
import { type Database } from "@opengeni/db";
|
|
5
|
+
/**
|
|
6
|
+
* The model of a Site agent conversation by who the viewer is.
|
|
7
|
+
*
|
|
8
|
+
* People outside the workspace (invited people and public visitors) never
|
|
9
|
+
* use a subscription-billed model (a connected Codex, Claude or other
|
|
10
|
+
* subscription): Site limits measure real money, and visitors must not use
|
|
11
|
+
* up a subscription's rate limits or terms. When the Site agent's model is a
|
|
12
|
+
* subscription model (or the workspace default it falls back to is one),
|
|
13
|
+
* they get the workspace's default credit-billed model instead, chosen the
|
|
14
|
+
* same way as the workspace's ordinary default over the credit-billed models
|
|
15
|
+
* only. When the workspace has none, they are refused. Workspace members use
|
|
16
|
+
* the Site agent's model, subscriptions included.
|
|
17
|
+
*/
|
|
18
|
+
export type SiteOutsideModelChoice =
|
|
19
|
+
/** The Site agent's model (or the workspace default it resolves to), not a subscription. */
|
|
20
|
+
{
|
|
21
|
+
kind: "same";
|
|
22
|
+
model: string;
|
|
23
|
+
} | {
|
|
24
|
+
kind: "fallback";
|
|
25
|
+
model: string;
|
|
26
|
+
} | {
|
|
27
|
+
kind: "unavailable";
|
|
28
|
+
};
|
|
29
|
+
/** Whether a model is billed through a subscription rather than credits. */
|
|
30
|
+
export declare function isSubscriptionBilledModel(selections: readonly WorkspaceModelSelection[], model: string): boolean;
|
|
31
|
+
/** The decision for people outside the workspace, from already-loaded selections. */
|
|
32
|
+
export declare function siteOutsideModelChoice(input: {
|
|
33
|
+
settings: Settings;
|
|
34
|
+
selections: readonly WorkspaceModelSelection[];
|
|
35
|
+
/** The Site agent's model; null uses the workspace default. */
|
|
36
|
+
agentModel: string | null;
|
|
37
|
+
workspaceDefaults: WorkspaceSessionDefaults | null;
|
|
38
|
+
organizationDefaults: OrganizationModelDefaults["sessionDefaults"] | null;
|
|
39
|
+
}): SiteOutsideModelChoice;
|
|
40
|
+
/** Actual catalog billing, not just provider-name heuristics, fences every admission. */
|
|
41
|
+
export declare function siteCreditModelIds(deps: {
|
|
42
|
+
db: Database;
|
|
43
|
+
settings: Settings;
|
|
44
|
+
}, scope: {
|
|
45
|
+
accountId: string;
|
|
46
|
+
workspaceId: string;
|
|
47
|
+
}, siteId: string): Promise<string[]>;
|
|
48
|
+
/** Load the workspace's model selection and decide for people outside the workspace. */
|
|
49
|
+
export declare function resolveSiteOutsideModel(deps: {
|
|
50
|
+
db: Database;
|
|
51
|
+
settings: Settings;
|
|
52
|
+
}, scope: {
|
|
53
|
+
accountId: string;
|
|
54
|
+
workspaceId: string;
|
|
55
|
+
}, input: {
|
|
56
|
+
siteId: string;
|
|
57
|
+
agentModel: string | null;
|
|
58
|
+
}): Promise<SiteOutsideModelChoice>;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type ApiRouteDeps } from "@opengeni/core";
|
|
2
|
+
import type { SiteRuntimeHost } from "./runtime.js";
|
|
3
|
+
import type { SiteRuntimeViewer } from "./viewer.js";
|
|
4
|
+
export declare const SITE_AGENT_DEFAULTS_VERSION = 1;
|
|
5
|
+
/**
|
|
6
|
+
* Before admitting more work, converge pre-redesign published-host sessions to
|
|
7
|
+
* the same Site-local tools as a new conversation. This is a trusted host
|
|
8
|
+
* upgrade, not a caller-controlled tool-policy edit. The route has already
|
|
9
|
+
* checked ownership, current audience, models and the retained connector set;
|
|
10
|
+
* each data-tool execution still resolves the live viewer independently.
|
|
11
|
+
*
|
|
12
|
+
* The session writer lock makes the config, permissions, sandbox, instructions,
|
|
13
|
+
* audit event and completion marker atomic. Failed writes remain retryable.
|
|
14
|
+
* Existing attempts keep their accepted execution policy; no turn is rewritten.
|
|
15
|
+
*/
|
|
16
|
+
export declare function normalizeSiteAgentSession(deps: Pick<ApiRouteDeps, "db" | "settings" | "bus" | "objectStorage">, host: SiteRuntimeHost, viewer: SiteRuntimeViewer, sessionId: string, retainedToolIds: readonly string[]): Promise<void>;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Settings } from "@opengeni/config";
|
|
2
|
+
/**
|
|
3
|
+
* Pluggable content scanning for published Sites. `none` is the default; the
|
|
4
|
+
* Google Web Risk scanner runs only with OPENGENI_SITES_WEB_RISK_API_KEY. A
|
|
5
|
+
* scan looks up the absolute URLs found in a Site's HTML when it is published
|
|
6
|
+
* and records findings for moderation. It never blocks publishing, and a
|
|
7
|
+
* disabled or failing scanner records nothing that blocks either.
|
|
8
|
+
*/
|
|
9
|
+
export type SiteContentScanFinding = {
|
|
10
|
+
url: string;
|
|
11
|
+
threatTypes: string[];
|
|
12
|
+
};
|
|
13
|
+
export type SiteContentScanResult = {
|
|
14
|
+
status: "none" | "clean" | "flagged" | "error";
|
|
15
|
+
findings: SiteContentScanFinding[];
|
|
16
|
+
};
|
|
17
|
+
export type SiteContentScanner = {
|
|
18
|
+
readonly name: "none" | "web_risk";
|
|
19
|
+
scanHtml(html: string): Promise<SiteContentScanResult>;
|
|
20
|
+
};
|
|
21
|
+
/** Most distinct URLs one scan looks up (bounds cost per publish). */
|
|
22
|
+
export declare const SITE_SCAN_MAX_URLS = 20;
|
|
23
|
+
/** Distinct absolute http(s) URLs in the HTML, first seen first, at most `limit`. */
|
|
24
|
+
export declare function siteHtmlUrls(html: string, limit?: number): string[];
|
|
25
|
+
export declare const noneSiteContentScanner: SiteContentScanner;
|
|
26
|
+
export declare function createWebRiskSiteContentScanner(apiKey: string, options?: {
|
|
27
|
+
fetch?: typeof fetch;
|
|
28
|
+
}): SiteContentScanner;
|
|
29
|
+
export declare function createSiteContentScanner(settings: Pick<Settings, "sitesWebRiskApiKey">, options?: {
|
|
30
|
+
fetch?: typeof fetch;
|
|
31
|
+
}): SiteContentScanner;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { SiteHostMapRecord } from "@opengeni/contracts";
|
|
2
|
+
import type { Settings } from "@opengeni/config";
|
|
3
|
+
/**
|
|
4
|
+
* Optional Cloudflare edge sync for published Sites. Postgres is the source
|
|
5
|
+
* of truth; the KV host map and the edge cache are rebuildable copies. With
|
|
6
|
+
* no Cloudflare settings every call is a no-op.
|
|
7
|
+
*
|
|
8
|
+
* Writes go through the Cloudflare REST API with plain fetch (no SDK, each
|
|
9
|
+
* call bounded by a 10 s timeout) and never block the database write: callers
|
|
10
|
+
* schedule them after commit, each is retried a few times and then logged.
|
|
11
|
+
* The caller reads what a hostname should hold in a short transaction under
|
|
12
|
+
* the hostname's lock and commits before any of these calls, so no database
|
|
13
|
+
* transaction or lock waits on Cloudflare; after writing it re-reads the
|
|
14
|
+
* hostname and writes again if it moved meanwhile. One process runs at most
|
|
15
|
+
* one sync per hostname at a time. A writer never replaces a newer
|
|
16
|
+
* generation (read, compare, write; KV has no compare-and-set, so writers in
|
|
17
|
+
* two processes racing within one round trip can still land out of order,
|
|
18
|
+
* until the entry's TTL ends it). Generations come from one database
|
|
19
|
+
* sequence shared by every hostname, so a later change to a label (a move,
|
|
20
|
+
* an unpublish tombstone, a takedown) always carries a higher generation
|
|
21
|
+
* than anything written before.
|
|
22
|
+
*
|
|
23
|
+
* Staleness bound: the API itself refuses a suspended or unpublished Site on
|
|
24
|
+
* the very next site-runtime call (it re-checks publication status and access
|
|
25
|
+
* every time). The edge copies lag behind: Cloudflare KV propagates a write
|
|
26
|
+
* to other locations within about 60 s, every KV entry expires after
|
|
27
|
+
* `sitesHostMapTtlSeconds` (default 300 s), and the gateway caches host
|
|
28
|
+
* lookups for up to 60 s and access checks for 30 s. A takedown also purges
|
|
29
|
+
* the host's edge cache when a zone id is configured. The after-commit sync
|
|
30
|
+
* runs in process, so a restart can lose a pending write; the next signed
|
|
31
|
+
* host lookup for that label re-syncs a stale record, and the TTL bounds the
|
|
32
|
+
* rest. A missed sync is therefore corrected within TTL + 60 s at worst.
|
|
33
|
+
*/
|
|
34
|
+
export type SiteEdgeSyncSettings = Pick<Settings, "sitesCloudflareApiToken" | "sitesCloudflareAccountId" | "sitesCloudflareKvNamespaceId" | "sitesCloudflareZoneId" | "sitesHostMapTtlSeconds">;
|
|
35
|
+
export type SiteEdgeSync = {
|
|
36
|
+
readonly kvEnabled: boolean;
|
|
37
|
+
readonly purgeEnabled: boolean;
|
|
38
|
+
/** Write the host-map record unless the edge already holds a newer generation. */
|
|
39
|
+
putHostRecord(record: SiteHostMapRecord): Promise<"written" | "skipped_newer" | "disabled">;
|
|
40
|
+
/** Purge the edge cache for one hostname. */
|
|
41
|
+
purgeHost(hostname: string): Promise<"purged" | "disabled">;
|
|
42
|
+
};
|
|
43
|
+
export type SiteEdgeSyncOptions = {
|
|
44
|
+
fetch?: typeof fetch;
|
|
45
|
+
attempts?: number;
|
|
46
|
+
backoffMs?: number;
|
|
47
|
+
};
|
|
48
|
+
export declare function createSiteEdgeSync(settings: SiteEdgeSyncSettings, options?: SiteEdgeSyncOptions): SiteEdgeSync;
|