@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
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import type { AccessGrant } from "@opengeni/contracts";
|
|
2
|
+
import {
|
|
3
|
+
SITE_AGENT_COMPUTE_MESSAGE,
|
|
4
|
+
siteAgentClamp,
|
|
5
|
+
siteSessionClamp,
|
|
6
|
+
siteClampedAgentMessage,
|
|
7
|
+
type ApiRouteDeps,
|
|
8
|
+
type SiteAgentClamp,
|
|
9
|
+
type SiteClampedResource,
|
|
10
|
+
} from "@opengeni/core";
|
|
11
|
+
import {
|
|
12
|
+
getEditableArtifactCreationAgent,
|
|
13
|
+
getPublishedSite,
|
|
14
|
+
getPublishedSiteVersion,
|
|
15
|
+
getSession,
|
|
16
|
+
} from "@opengeni/db";
|
|
17
|
+
|
|
18
|
+
/** A refused write by an agent started from a Site page, as first-party tools return it. */
|
|
19
|
+
export function siteAgentClampedToolResult(message: string) {
|
|
20
|
+
return {
|
|
21
|
+
isError: true as const,
|
|
22
|
+
content: [
|
|
23
|
+
{
|
|
24
|
+
type: "text" as const,
|
|
25
|
+
text: JSON.stringify({ error: { code: "site_agent_clamped", message } }),
|
|
26
|
+
},
|
|
27
|
+
],
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export type SiteAgentClampedToolResult = ReturnType<typeof siteAgentClampedToolResult>;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Null, or the refusal when `grant` is an agent started from a Site page
|
|
35
|
+
* (the Site clamp): such an agent cannot create or change `what`.
|
|
36
|
+
*/
|
|
37
|
+
export async function siteAgentClampRefusal(
|
|
38
|
+
deps: Pick<ApiRouteDeps, "db">,
|
|
39
|
+
grant: AccessGrant,
|
|
40
|
+
what: SiteClampedResource,
|
|
41
|
+
): Promise<SiteAgentClampedToolResult | null> {
|
|
42
|
+
return (await siteAgentClamp(deps.db, grant))?.clamped
|
|
43
|
+
? siteAgentClampedToolResult(siteClampedAgentMessage(what))
|
|
44
|
+
: null;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Null, or the refusal when `grant` is an agent started from a Site page:
|
|
49
|
+
* such an agent cannot run on, attach, swap or provision sandboxes or
|
|
50
|
+
* Connected Machines (the viewer's machines among them).
|
|
51
|
+
*/
|
|
52
|
+
export async function siteAgentComputeRefusal(
|
|
53
|
+
deps: Pick<ApiRouteDeps, "db">,
|
|
54
|
+
grant: AccessGrant,
|
|
55
|
+
): Promise<SiteAgentClampedToolResult | null> {
|
|
56
|
+
return (await siteAgentClamp(deps.db, grant))?.clamped
|
|
57
|
+
? siteAgentClampedToolResult(SITE_AGENT_COMPUTE_MESSAGE)
|
|
58
|
+
: null;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** The first-party tools that write documents, spreadsheets and presentations. */
|
|
62
|
+
export const SITE_AGENT_EDITABLE_ARTIFACT_WRITE_TOOLS: ReadonlySet<string> = new Set([
|
|
63
|
+
"editable_artifact_create",
|
|
64
|
+
"editable_artifact_import",
|
|
65
|
+
"editable_artifact_apply",
|
|
66
|
+
]);
|
|
67
|
+
|
|
68
|
+
export const SITE_AGENT_EDITABLE_ARTIFACT_RESOURCE =
|
|
69
|
+
"documents, spreadsheets or presentations the Site did not declare" as const;
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Whether a Site-clamped agent may write documents, spreadsheets and
|
|
73
|
+
* presentations: only when a published Site it was started from declares a
|
|
74
|
+
* first-party editing tool (`editable_artifact_create`, `_import` or
|
|
75
|
+
* `_apply`) in its current version's requested tools. Console frames (no
|
|
76
|
+
* published Site) and Sites that declare none may not; a read that fails
|
|
77
|
+
* refuses. Existing artifacts additionally need immutable creation provenance
|
|
78
|
+
* in this same Site-clamped session tree; merely reading/associating one is not
|
|
79
|
+
* authority to edit it. There is no explicit artifact declaration surface yet.
|
|
80
|
+
*/
|
|
81
|
+
export async function siteAgentMayEditArtifacts(
|
|
82
|
+
deps: Pick<ApiRouteDeps, "db">,
|
|
83
|
+
grant: Pick<AccessGrant, "accountId" | "workspaceId" | "metadata">,
|
|
84
|
+
clamp: SiteAgentClamp,
|
|
85
|
+
artifactId?: string,
|
|
86
|
+
): Promise<boolean> {
|
|
87
|
+
if (!clamp.clamped) return true;
|
|
88
|
+
const scope = { accountId: grant.accountId, workspaceId: grant.workspaceId };
|
|
89
|
+
if (artifactId !== undefined) {
|
|
90
|
+
const callerId = grant.metadata?.sessionId;
|
|
91
|
+
if (typeof callerId !== "string" || !/^[0-9a-f]{32}$/u.test(artifactId)) return false;
|
|
92
|
+
const creator = await getEditableArtifactCreationAgent(deps.db, scope, artifactId);
|
|
93
|
+
if (!creator) return false;
|
|
94
|
+
const [caller, source, sourceClamp] = await Promise.all([
|
|
95
|
+
getSession(deps.db, scope.workspaceId, callerId),
|
|
96
|
+
getSession(deps.db, scope.workspaceId, creator.sessionId),
|
|
97
|
+
siteSessionClamp(deps.db, scope, creator.sessionId, creator.turnId),
|
|
98
|
+
]);
|
|
99
|
+
if (
|
|
100
|
+
!caller ||
|
|
101
|
+
!source ||
|
|
102
|
+
!sourceClamp.clamped ||
|
|
103
|
+
(caller.rootSessionId ?? caller.id) !== (source.rootSessionId ?? source.id) ||
|
|
104
|
+
sourceClamp.originSiteIds.length === 0 ||
|
|
105
|
+
sourceClamp.originSiteIds.some((siteId) => !clamp.originSiteIds.includes(siteId))
|
|
106
|
+
)
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
for (const siteId of clamp.originSiteIds) {
|
|
110
|
+
const site = await getPublishedSite(deps.db, scope, siteId).catch(() => null);
|
|
111
|
+
if (!site?.currentVersionId) continue;
|
|
112
|
+
const version = await getPublishedSiteVersion(
|
|
113
|
+
deps.db,
|
|
114
|
+
scope,
|
|
115
|
+
siteId,
|
|
116
|
+
site.currentVersionId,
|
|
117
|
+
).catch(() => null);
|
|
118
|
+
if (
|
|
119
|
+
version?.requestedTools.some(
|
|
120
|
+
(tool) =>
|
|
121
|
+
tool.serverId === "opengeni" &&
|
|
122
|
+
SITE_AGENT_EDITABLE_ARTIFACT_WRITE_TOOLS.has(tool.toolName),
|
|
123
|
+
)
|
|
124
|
+
)
|
|
125
|
+
return true;
|
|
126
|
+
}
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/** Null, or the refusal of an undeclared document, spreadsheet or presentation write. */
|
|
131
|
+
export async function siteAgentEditableArtifactRefusal(
|
|
132
|
+
deps: Pick<ApiRouteDeps, "db">,
|
|
133
|
+
grant: AccessGrant,
|
|
134
|
+
artifactId?: string,
|
|
135
|
+
): Promise<SiteAgentClampedToolResult | null> {
|
|
136
|
+
const clamp = await siteAgentClamp(deps.db, grant);
|
|
137
|
+
if (!clamp?.clamped || (await siteAgentMayEditArtifacts(deps, grant, clamp, artifactId)))
|
|
138
|
+
return null;
|
|
139
|
+
return siteAgentClampedToolResult(siteClampedAgentMessage(SITE_AGENT_EDITABLE_ARTIFACT_RESOURCE));
|
|
140
|
+
}
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import {
|
|
3
|
+
SiteDataAccessMode,
|
|
4
|
+
SiteDataCollectionDefinitionRequest,
|
|
5
|
+
SiteDataFileScope,
|
|
6
|
+
SiteDataImportRequest,
|
|
7
|
+
SiteDataQueryRequest,
|
|
8
|
+
SiteDataWriteRequest,
|
|
9
|
+
type AccessGrant,
|
|
10
|
+
} from "@opengeni/contracts";
|
|
11
|
+
import type { ApiRouteDeps } from "@opengeni/core";
|
|
12
|
+
import { SiteDataError } from "@opengeni/db";
|
|
13
|
+
import * as z4 from "zod/v4";
|
|
14
|
+
import { contractToolInput } from "./contract-input";
|
|
15
|
+
import {
|
|
16
|
+
defineSiteDataCollection,
|
|
17
|
+
deleteSiteDataCollection,
|
|
18
|
+
deleteSiteDataFile,
|
|
19
|
+
describeSiteData,
|
|
20
|
+
exportSiteData,
|
|
21
|
+
importSiteData,
|
|
22
|
+
listSiteDataFiles,
|
|
23
|
+
querySiteData,
|
|
24
|
+
resetSiteDataCollection,
|
|
25
|
+
getSiteDataFileUrl,
|
|
26
|
+
uploadSiteDataFile,
|
|
27
|
+
writeSiteData,
|
|
28
|
+
} from "../site-data/operations";
|
|
29
|
+
import {
|
|
30
|
+
SITE_AGENT_MANAGEMENT_MESSAGE,
|
|
31
|
+
SITE_AGENT_OTHER_SITE_MESSAGE,
|
|
32
|
+
type SiteAgentDataContext,
|
|
33
|
+
type SiteAgentDataResolution,
|
|
34
|
+
} from "../site-publishing/agent-data-tools";
|
|
35
|
+
|
|
36
|
+
type JsonResult = (value: unknown) => {
|
|
37
|
+
content: Array<{ type: "text"; text: string }>;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
const SiteIdInput = z4.string().uuid().describe("The Site (published artifact) id.");
|
|
41
|
+
const CollectionInput = z4
|
|
42
|
+
.string()
|
|
43
|
+
.regex(/^[A-Za-z][A-Za-z0-9_-]{0,63}$/)
|
|
44
|
+
.describe("Collection name.");
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* First-party Site Data tools. They act with the agent's own authority: the
|
|
48
|
+
* person it acts for (a chat's person or a schedule's owner) decides whether
|
|
49
|
+
* it manages the Site's data or is one of its viewers.
|
|
50
|
+
*
|
|
51
|
+
* A published Site's own agent (`siteAgent` resolves a Site context) is
|
|
52
|
+
* different: only `site_data_query` and `site_data_write` work, pinned to
|
|
53
|
+
* that Site (any other siteId is refused) and acting as the conversation's
|
|
54
|
+
* viewer, exactly as the Site's page does; every other tool refuses it.
|
|
55
|
+
*/
|
|
56
|
+
export function registerSiteDataTools(
|
|
57
|
+
server: McpServer,
|
|
58
|
+
deps: ApiRouteDeps,
|
|
59
|
+
grant: AccessGrant,
|
|
60
|
+
authorize: () => Promise<void>,
|
|
61
|
+
json: JsonResult,
|
|
62
|
+
siteAgent?: () => Promise<SiteAgentDataResolution>,
|
|
63
|
+
): void {
|
|
64
|
+
const call =
|
|
65
|
+
<A extends { siteId: string }>(
|
|
66
|
+
fn: (args: A) => Promise<unknown>,
|
|
67
|
+
forSiteAgent?: (site: SiteAgentDataContext, args: A) => Promise<unknown>,
|
|
68
|
+
) =>
|
|
69
|
+
async (args: A) => {
|
|
70
|
+
await authorize();
|
|
71
|
+
try {
|
|
72
|
+
const site = siteAgent ? await siteAgent() : null;
|
|
73
|
+
if (site && site.kind !== "ordinary") {
|
|
74
|
+
if (site.kind === "refused") throw new SiteDataError("forbidden", site.message);
|
|
75
|
+
if (!forSiteAgent) throw new SiteDataError("forbidden", SITE_AGENT_MANAGEMENT_MESSAGE);
|
|
76
|
+
if (args.siteId !== site.siteId)
|
|
77
|
+
throw new SiteDataError("forbidden", SITE_AGENT_OTHER_SITE_MESSAGE);
|
|
78
|
+
return json(await forSiteAgent(site, args));
|
|
79
|
+
}
|
|
80
|
+
return json(await fn(args));
|
|
81
|
+
} catch (error) {
|
|
82
|
+
if (!(error instanceof SiteDataError)) throw error;
|
|
83
|
+
const envelope = {
|
|
84
|
+
error: { code: error.code, message: error.message, details: error.details },
|
|
85
|
+
};
|
|
86
|
+
return {
|
|
87
|
+
content: [{ type: "text" as const, text: JSON.stringify(envelope, null, 2) }],
|
|
88
|
+
structuredContent: envelope,
|
|
89
|
+
isError: true as const,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
server.registerTool(
|
|
95
|
+
"site_data_describe",
|
|
96
|
+
{
|
|
97
|
+
description:
|
|
98
|
+
"Describe a Site's stored data: its collections (access mode, schema, record count and size), file usage and quotas. Only the Site's managers (its owner, a workspace admin, or an agent acting for them) can use Site Data management tools.",
|
|
99
|
+
inputSchema: { siteId: SiteIdInput },
|
|
100
|
+
},
|
|
101
|
+
call(({ siteId }: { siteId: string }) => describeSiteData(deps, grant, siteId)),
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
server.registerTool(
|
|
105
|
+
"site_data_define_collection",
|
|
106
|
+
{
|
|
107
|
+
description:
|
|
108
|
+
'Create, update or delete a collection of JSON records for a Site. Pages read and write it with site.data. Access modes: shared (viewers read and write every record), shared_read (viewers read; only managers write, e.g. a dashboard fed by a schedule), per_viewer (each viewer sees only their own records; managers see all unless privateRecords), append_only (viewers add and read their own, e.g. a form). Change the access mode only while the collection is empty. Set action to "delete" with confirm: true to delete the collection and its records.',
|
|
109
|
+
inputSchema: contractToolInput(
|
|
110
|
+
z4.object({
|
|
111
|
+
siteId: SiteIdInput,
|
|
112
|
+
name: CollectionInput,
|
|
113
|
+
action: z4
|
|
114
|
+
.enum(["upsert", "delete"])
|
|
115
|
+
.optional()
|
|
116
|
+
.describe("upsert (default) creates or updates; delete removes the collection."),
|
|
117
|
+
...SiteDataCollectionDefinitionRequest.shape,
|
|
118
|
+
accessMode: SiteDataAccessMode.optional().describe("Required for upsert."),
|
|
119
|
+
confirm: z4.boolean().optional().describe("Must be true to delete."),
|
|
120
|
+
}),
|
|
121
|
+
),
|
|
122
|
+
},
|
|
123
|
+
call(
|
|
124
|
+
async (args: {
|
|
125
|
+
siteId: string;
|
|
126
|
+
name: string;
|
|
127
|
+
action?: "upsert" | "delete" | undefined;
|
|
128
|
+
accessMode?: z4.infer<typeof SiteDataAccessMode> | undefined;
|
|
129
|
+
privateRecords?: boolean | undefined;
|
|
130
|
+
guestAccess?: "none" | "read" | "append" | "own" | undefined;
|
|
131
|
+
jsonSchema?: Record<string, unknown> | null | undefined;
|
|
132
|
+
indexedFields?: string[] | undefined;
|
|
133
|
+
uniqueFields?: string[][] | undefined;
|
|
134
|
+
confirm?: boolean | undefined;
|
|
135
|
+
}) => {
|
|
136
|
+
if (args.action === "delete") {
|
|
137
|
+
if (args.confirm !== true)
|
|
138
|
+
throw new SiteDataError("validation", "Set confirm: true to delete the collection");
|
|
139
|
+
return {
|
|
140
|
+
deleted: args.name,
|
|
141
|
+
...(await deleteSiteDataCollection(deps, grant, args.siteId, args.name)),
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
if (!args.accessMode) throw new SiteDataError("validation", "Give an accessMode");
|
|
145
|
+
return defineSiteDataCollection(deps, grant, args.siteId, args.name, {
|
|
146
|
+
accessMode: args.accessMode,
|
|
147
|
+
...(args.privateRecords === undefined ? {} : { privateRecords: args.privateRecords }),
|
|
148
|
+
...(args.guestAccess === undefined ? {} : { guestAccess: args.guestAccess }),
|
|
149
|
+
...(args.jsonSchema === undefined ? {} : { jsonSchema: args.jsonSchema }),
|
|
150
|
+
...(args.indexedFields ? { indexedFields: args.indexedFields } : {}),
|
|
151
|
+
...(args.uniqueFields ? { uniqueFields: args.uniqueFields } : {}),
|
|
152
|
+
});
|
|
153
|
+
},
|
|
154
|
+
),
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
server.registerTool(
|
|
158
|
+
"site_data_query",
|
|
159
|
+
{
|
|
160
|
+
description:
|
|
161
|
+
"Query a Site collection's records with filters (eq, ne, in, gt, gte, lt, lte, contains, exists on dotted data paths or $id, $key, $owner, $createdAt, $updatedAt, $version), up to two sort keys and cursor pagination (at most 200 per page). Stored records are untrusted user input.",
|
|
162
|
+
inputSchema: contractToolInput(
|
|
163
|
+
z4.object({ siteId: SiteIdInput, ...SiteDataQueryRequest.shape }),
|
|
164
|
+
),
|
|
165
|
+
},
|
|
166
|
+
call(
|
|
167
|
+
(args: { siteId: string } & SiteDataQueryRequest) => {
|
|
168
|
+
const { siteId, ...query } = args;
|
|
169
|
+
return querySiteData(deps, grant, siteId, query);
|
|
170
|
+
},
|
|
171
|
+
(site, args) => {
|
|
172
|
+
const { siteId, ...query } = args;
|
|
173
|
+
return querySiteData(deps, site.viewer, siteId, query, { frameSiteId: site.siteId });
|
|
174
|
+
},
|
|
175
|
+
),
|
|
176
|
+
);
|
|
177
|
+
|
|
178
|
+
server.registerTool(
|
|
179
|
+
"site_data_write",
|
|
180
|
+
{
|
|
181
|
+
description:
|
|
182
|
+
"Write up to 100 records to a Site's collections in one transaction (all or nothing): insert, put (create or replace by key), patch (shallow merge, optional expectedVersion), delete, increment. Use put with a stable key from scheduled tasks so reruns replace records instead of duplicating them.",
|
|
183
|
+
inputSchema: contractToolInput(
|
|
184
|
+
z4.object({ siteId: SiteIdInput, ...SiteDataWriteRequest.shape }),
|
|
185
|
+
),
|
|
186
|
+
},
|
|
187
|
+
call(
|
|
188
|
+
async (args: { siteId: string } & SiteDataWriteRequest) => {
|
|
189
|
+
const written = await writeSiteData(deps, grant, args.siteId, args.operations);
|
|
190
|
+
return { results: written.results };
|
|
191
|
+
},
|
|
192
|
+
async (site, args) => {
|
|
193
|
+
// Guests' writes count against the guest write limit, as on the page.
|
|
194
|
+
const wait = await site.guestWrite();
|
|
195
|
+
if (wait !== null)
|
|
196
|
+
throw new SiteDataError("rate_limited", "Too many writes; try again shortly", {
|
|
197
|
+
retryAfterSeconds: wait,
|
|
198
|
+
});
|
|
199
|
+
const written = await writeSiteData(deps, site.viewer, args.siteId, args.operations, {
|
|
200
|
+
frameSiteId: site.siteId,
|
|
201
|
+
});
|
|
202
|
+
return { results: written.results };
|
|
203
|
+
},
|
|
204
|
+
),
|
|
205
|
+
);
|
|
206
|
+
|
|
207
|
+
server.registerTool(
|
|
208
|
+
"site_data_import",
|
|
209
|
+
{
|
|
210
|
+
description:
|
|
211
|
+
"Import up to 1000 records into a Site collection from JSON objects or CSV text (header row; values import as text). With keyField, each record's key comes from that field and re-importing replaces records. Applied in atomic batches of 100.",
|
|
212
|
+
inputSchema: contractToolInput(
|
|
213
|
+
z4.object({
|
|
214
|
+
siteId: SiteIdInput,
|
|
215
|
+
collection: CollectionInput,
|
|
216
|
+
...SiteDataImportRequest.shape,
|
|
217
|
+
}),
|
|
218
|
+
// The full contract keeps its cross-field check: json needs records, csv needs csv.
|
|
219
|
+
SiteDataImportRequest,
|
|
220
|
+
),
|
|
221
|
+
},
|
|
222
|
+
call((args: { siteId: string; collection: string } & SiteDataImportRequest) => {
|
|
223
|
+
const { siteId, collection, ...request } = args;
|
|
224
|
+
return importSiteData(deps, grant, siteId, collection, request);
|
|
225
|
+
}),
|
|
226
|
+
);
|
|
227
|
+
|
|
228
|
+
server.registerTool(
|
|
229
|
+
"site_data_export",
|
|
230
|
+
{
|
|
231
|
+
description:
|
|
232
|
+
"Export a Site collection as JSON or CSV text (up to 10,000 records, oldest first; truncated says whether more exist).",
|
|
233
|
+
inputSchema: {
|
|
234
|
+
siteId: SiteIdInput,
|
|
235
|
+
collection: CollectionInput,
|
|
236
|
+
format: z4.enum(["json", "csv"]).optional().describe("json (default) or csv."),
|
|
237
|
+
},
|
|
238
|
+
},
|
|
239
|
+
call((args: { siteId: string; collection: string; format?: "json" | "csv" | undefined }) =>
|
|
240
|
+
exportSiteData(deps, grant, args.siteId, args.collection, args.format ?? "json"),
|
|
241
|
+
),
|
|
242
|
+
);
|
|
243
|
+
|
|
244
|
+
server.registerTool(
|
|
245
|
+
"site_data_reset",
|
|
246
|
+
{
|
|
247
|
+
description:
|
|
248
|
+
"Delete every record in a Site collection and keep its definition. This cannot be undone; pass confirm: true only when the person asked to clear it.",
|
|
249
|
+
inputSchema: {
|
|
250
|
+
siteId: SiteIdInput,
|
|
251
|
+
collection: CollectionInput,
|
|
252
|
+
confirm: z4.literal(true).describe("Must be true."),
|
|
253
|
+
},
|
|
254
|
+
},
|
|
255
|
+
call((args: { siteId: string; collection: string; confirm: true }) =>
|
|
256
|
+
resetSiteDataCollection(deps, grant, args.siteId, args.collection),
|
|
257
|
+
),
|
|
258
|
+
);
|
|
259
|
+
|
|
260
|
+
server.registerTool(
|
|
261
|
+
"site_files_list",
|
|
262
|
+
{
|
|
263
|
+
description:
|
|
264
|
+
"List a Site's stored files (uploaded by its pages or by agents). Give fileId to get a short-lived download URL for one file.",
|
|
265
|
+
inputSchema: {
|
|
266
|
+
siteId: SiteIdInput,
|
|
267
|
+
fileId: z4.string().uuid().optional().describe("Return a download URL for this file."),
|
|
268
|
+
cursor: z4.string().max(4096).optional().describe("nextCursor from the last page."),
|
|
269
|
+
},
|
|
270
|
+
},
|
|
271
|
+
call(
|
|
272
|
+
async (args: { siteId: string; fileId?: string | undefined; cursor?: string | undefined }) =>
|
|
273
|
+
args.fileId
|
|
274
|
+
? getSiteDataFileUrl(deps, grant, args.siteId, args.fileId, {}, "sandbox")
|
|
275
|
+
: listSiteDataFiles(deps, grant, args.siteId, { cursor: args.cursor ?? null }),
|
|
276
|
+
),
|
|
277
|
+
);
|
|
278
|
+
|
|
279
|
+
server.registerTool(
|
|
280
|
+
"site_files_upload",
|
|
281
|
+
{
|
|
282
|
+
description:
|
|
283
|
+
"Store a file for a Site (at most 10 MB by default): images, PDF, text, CSV, JSON, audio, video, Office or zip. Give text for text content or base64 for binary content. Pages list and open files with site.files.",
|
|
284
|
+
inputSchema: {
|
|
285
|
+
siteId: SiteIdInput,
|
|
286
|
+
name: z4.string().min(1).max(255).describe("File name."),
|
|
287
|
+
contentType: z4.string().max(255).describe("MIME type, such as image/png or text/csv."),
|
|
288
|
+
text: z4
|
|
289
|
+
.string()
|
|
290
|
+
.max(deps.settings.siteDataMaxFileBytes)
|
|
291
|
+
.optional()
|
|
292
|
+
.describe("Text content."),
|
|
293
|
+
base64: z4
|
|
294
|
+
.string()
|
|
295
|
+
.max(Math.ceil(deps.settings.siteDataMaxFileBytes / 3) * 4 + 4)
|
|
296
|
+
.regex(/^[A-Za-z0-9+/]*={0,2}$/u)
|
|
297
|
+
.optional()
|
|
298
|
+
.describe("Base64-encoded binary content."),
|
|
299
|
+
scope: SiteDataFileScope.optional().describe(
|
|
300
|
+
"shared (default): every viewer can open it. private: only the uploader and the Site's managers.",
|
|
301
|
+
),
|
|
302
|
+
},
|
|
303
|
+
},
|
|
304
|
+
call(
|
|
305
|
+
(args: {
|
|
306
|
+
siteId: string;
|
|
307
|
+
name: string;
|
|
308
|
+
contentType: string;
|
|
309
|
+
text?: string | undefined;
|
|
310
|
+
base64?: string | undefined;
|
|
311
|
+
scope?: "shared" | "private" | undefined;
|
|
312
|
+
}) => {
|
|
313
|
+
if ((args.text === undefined) === (args.base64 === undefined))
|
|
314
|
+
throw new SiteDataError("validation", "Give exactly one of text or base64");
|
|
315
|
+
const bytes =
|
|
316
|
+
args.text !== undefined
|
|
317
|
+
? new TextEncoder().encode(args.text)
|
|
318
|
+
: new Uint8Array(Buffer.from(args.base64!, "base64"));
|
|
319
|
+
return uploadSiteDataFile(deps, grant, args.siteId, {
|
|
320
|
+
name: args.name,
|
|
321
|
+
contentType: args.contentType,
|
|
322
|
+
body: bytes,
|
|
323
|
+
...(args.scope ? { scope: args.scope } : {}),
|
|
324
|
+
});
|
|
325
|
+
},
|
|
326
|
+
),
|
|
327
|
+
);
|
|
328
|
+
|
|
329
|
+
server.registerTool(
|
|
330
|
+
"site_files_delete",
|
|
331
|
+
{
|
|
332
|
+
description: "Delete a Site's stored file.",
|
|
333
|
+
inputSchema: { siteId: SiteIdInput, fileId: z4.string().uuid().describe("File id.") },
|
|
334
|
+
},
|
|
335
|
+
call((args: { siteId: string; fileId: string }) =>
|
|
336
|
+
deleteSiteDataFile(deps, grant, args.siteId, args.fileId),
|
|
337
|
+
),
|
|
338
|
+
);
|
|
339
|
+
}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import {
|
|
3
|
+
SitePublishWarningFix,
|
|
4
|
+
UpsertSitePublicationRequest,
|
|
5
|
+
type AccessGrant,
|
|
6
|
+
type SitePublication,
|
|
7
|
+
} from "@opengeni/contracts";
|
|
8
|
+
import type { ApiRouteDeps } from "@opengeni/core";
|
|
9
|
+
import { getSitePublication, SiteDataError } from "@opengeni/db";
|
|
10
|
+
import * as z4 from "zod/v4";
|
|
11
|
+
import { ApiHttpError } from "../http/api-error";
|
|
12
|
+
import { contractToolInput } from "./contract-input";
|
|
13
|
+
import { siteDataHttpError } from "../routes/site-data";
|
|
14
|
+
import { siteSqlHttpError } from "../routes/site-sql";
|
|
15
|
+
import { applySitePublishWarningFix, SiteFixTargetMissing } from "../site-publishing/readiness";
|
|
16
|
+
import { SiteSqlError } from "../site-sql/service";
|
|
17
|
+
import {
|
|
18
|
+
requireSiteManager,
|
|
19
|
+
requireSitesDomain,
|
|
20
|
+
resolveSiteManagement,
|
|
21
|
+
runSitePublishing,
|
|
22
|
+
siteHostnameAvailability,
|
|
23
|
+
sitePublicationView,
|
|
24
|
+
sitePublishingError,
|
|
25
|
+
upsertSitePublicationForManager,
|
|
26
|
+
} from "../site-publishing/service";
|
|
27
|
+
|
|
28
|
+
type JsonResult = (value: unknown) => {
|
|
29
|
+
content: Array<{ type: "text"; text: string }>;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
const SiteIdInput = z4.string().uuid().describe("The Site (published artifact) id.");
|
|
33
|
+
|
|
34
|
+
/** What people outside the workspace may do, stated in every publication answer. */
|
|
35
|
+
export const SITE_AUDIENCE_RULES =
|
|
36
|
+
"Workspace members may use everything the Site declares, within what they may do in the workspace, and are never limited by Site limits. People outside the workspace (invited people and public visitors) get only the Site's own data: Site Data (by each collection's access mode, and its guest access for anonymous visitors), Site SQL named queries their audience allows, and the page. They never get workspace tools or subscription-billed models, and their assistant use counts toward the Site limit.";
|
|
37
|
+
|
|
38
|
+
/** A publication as the agent tools answer it: the audience rules and what to fix next. */
|
|
39
|
+
function publicationAnswer(publication: SitePublication) {
|
|
40
|
+
return {
|
|
41
|
+
...publication,
|
|
42
|
+
audienceRules: SITE_AUDIENCE_RULES,
|
|
43
|
+
...(publication.warnings.length > 0
|
|
44
|
+
? {
|
|
45
|
+
nextStep:
|
|
46
|
+
"Fix these readiness warnings before sharing the Site: apply a warning's fix with site_publication_apply_fix, or change the page, collection or query yourself, then read the publication again.",
|
|
47
|
+
}
|
|
48
|
+
: {}),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* First-party tools for publishing a Site on its own hostname. They act with
|
|
54
|
+
* the agent's own authority: only a Site's managers (its owner, a workspace
|
|
55
|
+
* admin, or an agent acting for one) read or change its publication, and
|
|
56
|
+
* only a workspace admin changes its limits. Takedown stays with people.
|
|
57
|
+
*/
|
|
58
|
+
export function registerSitePublicationTools(
|
|
59
|
+
server: McpServer,
|
|
60
|
+
deps: ApiRouteDeps,
|
|
61
|
+
grant: AccessGrant,
|
|
62
|
+
authorize: () => Promise<void>,
|
|
63
|
+
json: JsonResult,
|
|
64
|
+
): void {
|
|
65
|
+
const call =
|
|
66
|
+
<A>(fn: (args: A) => Promise<unknown>) =>
|
|
67
|
+
async (args: A) => {
|
|
68
|
+
await authorize();
|
|
69
|
+
try {
|
|
70
|
+
return json(await runSitePublishing(() => fn(args)));
|
|
71
|
+
} catch (error) {
|
|
72
|
+
if (!(error instanceof ApiHttpError)) throw error;
|
|
73
|
+
const envelope = {
|
|
74
|
+
error: { code: error.code, message: error.message, details: error.details ?? {} },
|
|
75
|
+
};
|
|
76
|
+
return {
|
|
77
|
+
content: [{ type: "text" as const, text: JSON.stringify(envelope, null, 2) }],
|
|
78
|
+
structuredContent: envelope,
|
|
79
|
+
isError: true as const,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
server.registerTool(
|
|
85
|
+
"site_publication_get",
|
|
86
|
+
{
|
|
87
|
+
description:
|
|
88
|
+
"Read how a Site is published on its own hostname: its URL, access (members, invited, public), status, embedded agent, limits, open abuse reports, usage and readiness warnings (what won't work for its audience, each with a suggestion and an optional safe fix). Returns published: false for a Site that has never been published. Only the Site's managers can use it.",
|
|
89
|
+
inputSchema: { siteId: SiteIdInput },
|
|
90
|
+
},
|
|
91
|
+
call(async ({ siteId }: { siteId: string }) => {
|
|
92
|
+
requireSitesDomain(deps.settings);
|
|
93
|
+
const management = await resolveSiteManagement(deps, grant, siteId);
|
|
94
|
+
requireSiteManager(management);
|
|
95
|
+
const publication = await getSitePublication(deps.db, management.scope, management.record.id);
|
|
96
|
+
return publication
|
|
97
|
+
? {
|
|
98
|
+
published: true,
|
|
99
|
+
publication: publicationAnswer(
|
|
100
|
+
await sitePublicationView(deps, management.scope, publication),
|
|
101
|
+
),
|
|
102
|
+
}
|
|
103
|
+
: { published: false, siteId };
|
|
104
|
+
}),
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
server.registerTool(
|
|
108
|
+
"site_publication_update",
|
|
109
|
+
{
|
|
110
|
+
description:
|
|
111
|
+
"Publish a Site on its own hostname (https://<label>.<sites domain>/), or change its publication. The Site must be shared with the workspace. access: members (workspace members sign in), invited (members and invitedEmails), public (anyone; may be off on this deployment). status: \"unpublished\" stops serving it and keeps its hostname. Audience rules: people outside the workspace (invited and public) get only the Site's own data (Site Data, Site SQL named queries and the page), never workspace tools or subscription models; for invited or public Sites build on Site Data, Site SQL and the page, and set collection guest access and query audiences to match. The answer lists readiness warnings: fix them before sharing (site_publication_apply_fix applies a safe fix). The agent's use by people outside the workspace counts toward the Site limit ($10 a month by default); members are never limited. Changing limitProfile or giving the agent workspace tools (agent.tools, for members only) needs a workspace admin; agent.guestTools is retired and ignored. Public puts the Site on the internet; make a Site public only when the person asked for it.",
|
|
112
|
+
inputSchema: contractToolInput(
|
|
113
|
+
z4.object({ siteId: SiteIdInput, ...UpsertSitePublicationRequest.shape }),
|
|
114
|
+
),
|
|
115
|
+
},
|
|
116
|
+
call(async ({ siteId, ...rest }: { siteId: string } & Record<string, unknown>) => {
|
|
117
|
+
const request = UpsertSitePublicationRequest.safeParse(rest);
|
|
118
|
+
if (!request.success)
|
|
119
|
+
throw sitePublishingError(
|
|
120
|
+
400,
|
|
121
|
+
"validation_failed",
|
|
122
|
+
"site_invalid_request",
|
|
123
|
+
request.error.issues
|
|
124
|
+
.slice(0, 3)
|
|
125
|
+
.map((issue) => `${issue.path.join(".") || "request"}: ${issue.message}`)
|
|
126
|
+
.join("; "),
|
|
127
|
+
);
|
|
128
|
+
// An agent started from a Site page (or acting in a turn one sent) is refused.
|
|
129
|
+
const management = await resolveSiteManagement(deps, grant, siteId, { mutate: true });
|
|
130
|
+
return publicationAnswer(
|
|
131
|
+
(await upsertSitePublicationForManager(deps, grant, management, request.data)).publication,
|
|
132
|
+
);
|
|
133
|
+
}),
|
|
134
|
+
);
|
|
135
|
+
|
|
136
|
+
server.registerTool(
|
|
137
|
+
"site_publication_apply_fix",
|
|
138
|
+
{
|
|
139
|
+
description:
|
|
140
|
+
"Apply the safe fix of a Site publication readiness warning (the warning's fix object): set a Site Data collection's guest access, or a Site SQL named query's audience. Everything else about the collection or query stays as it is. Returns the publication with fresh warnings. Only the Site's managers can use it.",
|
|
141
|
+
inputSchema: contractToolInput(
|
|
142
|
+
z4.object({ siteId: SiteIdInput, fix: SitePublishWarningFix }),
|
|
143
|
+
),
|
|
144
|
+
},
|
|
145
|
+
call(async ({ siteId, fix }: { siteId: string; fix: unknown }) => {
|
|
146
|
+
requireSitesDomain(deps.settings);
|
|
147
|
+
const parsed = SitePublishWarningFix.safeParse(fix);
|
|
148
|
+
if (!parsed.success)
|
|
149
|
+
throw sitePublishingError(400, "validation_failed", "site_invalid_request", "Invalid fix");
|
|
150
|
+
const management = await resolveSiteManagement(deps, grant, siteId, { mutate: true });
|
|
151
|
+
requireSiteManager(management);
|
|
152
|
+
const publication = await getSitePublication(deps.db, management.scope, management.record.id);
|
|
153
|
+
if (!publication)
|
|
154
|
+
throw sitePublishingError(
|
|
155
|
+
404,
|
|
156
|
+
"not_found",
|
|
157
|
+
"site_not_published",
|
|
158
|
+
"This Site is not published",
|
|
159
|
+
);
|
|
160
|
+
try {
|
|
161
|
+
await applySitePublishWarningFix(
|
|
162
|
+
deps,
|
|
163
|
+
grant,
|
|
164
|
+
management.scope,
|
|
165
|
+
management.record.id,
|
|
166
|
+
parsed.data,
|
|
167
|
+
);
|
|
168
|
+
} catch (error) {
|
|
169
|
+
if (error instanceof SiteFixTargetMissing)
|
|
170
|
+
throw sitePublishingError(404, "not_found", "site_fix_target_missing", error.message);
|
|
171
|
+
if (error instanceof SiteDataError) throw siteDataHttpError(error);
|
|
172
|
+
if (error instanceof SiteSqlError) throw siteSqlHttpError(error);
|
|
173
|
+
throw error;
|
|
174
|
+
}
|
|
175
|
+
return publicationAnswer(await sitePublicationView(deps, management.scope, publication));
|
|
176
|
+
}),
|
|
177
|
+
);
|
|
178
|
+
|
|
179
|
+
server.registerTool(
|
|
180
|
+
"site_hostname_check",
|
|
181
|
+
{
|
|
182
|
+
description:
|
|
183
|
+
"Check whether a hostname label is valid and free for a Site (labels are unique across all workspaces; a released label is held for 30 days).",
|
|
184
|
+
inputSchema: {
|
|
185
|
+
label: z4.string().min(1).max(63).describe("Hostname label, e.g. team-crm."),
|
|
186
|
+
siteId: SiteIdInput.optional().describe(
|
|
187
|
+
"The Site that would use it (its own label is free).",
|
|
188
|
+
),
|
|
189
|
+
},
|
|
190
|
+
},
|
|
191
|
+
call(async ({ label, siteId }: { label: string; siteId?: string | undefined }) => {
|
|
192
|
+
requireSitesDomain(deps.settings);
|
|
193
|
+
return await siteHostnameAvailability(
|
|
194
|
+
deps,
|
|
195
|
+
{ accountId: grant.accountId, workspaceId: grant.workspaceId },
|
|
196
|
+
label.toLowerCase(),
|
|
197
|
+
siteId ?? null,
|
|
198
|
+
);
|
|
199
|
+
}),
|
|
200
|
+
);
|
|
201
|
+
}
|