@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
package/src/routes/connect.ts
CHANGED
|
@@ -1,26 +1,28 @@
|
|
|
1
1
|
import { createHash, createHmac, randomUUID } from "node:crypto";
|
|
2
2
|
import type { Hono } from "hono";
|
|
3
3
|
import { HTTPException } from "hono/http-exception";
|
|
4
|
+
import { getConnectBeginReplay } from "@opengeni/db/connect-attempts";
|
|
4
5
|
import {
|
|
5
6
|
AdvanceConnectRequest,
|
|
6
7
|
BeginConnectRequest,
|
|
7
8
|
ConnectOperationRequest,
|
|
8
9
|
ConnectProvider,
|
|
9
10
|
ConnectAccount,
|
|
11
|
+
preparedMcpHeaders,
|
|
10
12
|
} from "@opengeni/contracts/connect";
|
|
11
13
|
import {
|
|
12
14
|
API_INTEGRATION_OAUTH_CREDENTIAL_ROLE,
|
|
13
15
|
InstallApiIntegrationRequest,
|
|
14
16
|
stableJson,
|
|
17
|
+
assertOrganizationIntegrationAllowed,
|
|
15
18
|
OPENGENI_PERSONAL_SLACK_MCP_URL,
|
|
16
|
-
OPENGENI_PR_REVIEW_PACK_ID,
|
|
17
19
|
} from "@opengeni/contracts";
|
|
18
20
|
import {
|
|
19
21
|
CORE_INTEGRATION_DEFINITIONS,
|
|
20
22
|
createPinnedIntegrationTransport,
|
|
21
23
|
} from "@opengeni/capabilities";
|
|
22
24
|
import {
|
|
23
|
-
beginConnectAttempt,
|
|
25
|
+
beginConnectAttempt as persistConnectAttempt,
|
|
24
26
|
getConnectAttempt,
|
|
25
27
|
listPendingConnectAttempts,
|
|
26
28
|
withWorkspaceSubjectRls,
|
|
@@ -30,9 +32,8 @@ import {
|
|
|
30
32
|
createConnection,
|
|
31
33
|
updateConnection,
|
|
32
34
|
encryptEnvironmentValue,
|
|
33
|
-
|
|
35
|
+
normalizedCredentialHeaders,
|
|
34
36
|
listGitHubInstallationAccessForWorkspace,
|
|
35
|
-
getPackInstallation,
|
|
36
37
|
listPrReviewAppRegistrations,
|
|
37
38
|
listSocialConnections,
|
|
38
39
|
getSocialConnection,
|
|
@@ -45,7 +46,9 @@ import {
|
|
|
45
46
|
isFikenConnection,
|
|
46
47
|
isOpenGeniSlackBotConnection,
|
|
47
48
|
prepareCapabilityEnable,
|
|
49
|
+
prepareMcpConnectionActivation,
|
|
48
50
|
buildCapabilityCatalog,
|
|
51
|
+
integrationKeyForConnectProvider,
|
|
49
52
|
type ApiRouteDeps,
|
|
50
53
|
} from "@opengeni/core";
|
|
51
54
|
import { isPersonalConnectionOwnerPrincipal } from "../connection-ownership";
|
|
@@ -67,20 +70,28 @@ import {
|
|
|
67
70
|
GOOGLE_DRIVE_CREDENTIAL_ROLE,
|
|
68
71
|
googleDriveScopesAllowCapability,
|
|
69
72
|
} from "@opengeni/contracts/google-drive";
|
|
70
|
-
import {
|
|
73
|
+
import { ATLASSIAN_NATIVE_RETIRED_MESSAGE } from "@opengeni/contracts/atlassian-native-retirement";
|
|
71
74
|
import {
|
|
72
75
|
curatedOAuthReadiness,
|
|
73
76
|
startApiIntegrationProviderOAuth,
|
|
74
77
|
} from "../integrations/provider-oauth";
|
|
75
78
|
import { resolveForRoute, validatedIntegrationInstallInput } from "./api-integrations";
|
|
76
79
|
import { executeConnectOperation } from "@opengeni/core";
|
|
77
|
-
import {
|
|
80
|
+
import { withOrganizationIntegrationPolicyFence } from "@opengeni/db/organization-integration-policy";
|
|
81
|
+
import {
|
|
82
|
+
startMcpOAuth,
|
|
83
|
+
requireIntegrationsStateSecret,
|
|
84
|
+
gmailOAuthClientConfigured,
|
|
85
|
+
} from "../integrations/oauth-client";
|
|
78
86
|
import { OFFICIAL_GMAIL_MCP_URL } from "../integrations/oauth-profiles";
|
|
79
87
|
import { z } from "zod";
|
|
80
88
|
import {
|
|
81
89
|
WORKSPACE_OPENROUTER_CONNECTION_DOMAIN,
|
|
90
|
+
WORKSPACE_OPPER_CONNECTION_DOMAIN,
|
|
82
91
|
VERCEL_AI_GATEWAY_CONNECTION_DOMAIN,
|
|
83
92
|
} from "@opengeni/config";
|
|
93
|
+
import { parseRequestJson } from "../http/request-body";
|
|
94
|
+
import { connectRequestActor, assertAgentPreparedConnect } from "../prepared-mcp-actor";
|
|
84
95
|
|
|
85
96
|
/** Shared durable setup entry. Provider completion is distinct from
|
|
86
97
|
* subsequent preview/install; never report an OAuth token as a ready integration. */
|
|
@@ -101,13 +112,13 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
101
112
|
"workspace:read",
|
|
102
113
|
);
|
|
103
114
|
const external = authorization.contextIntegrity;
|
|
104
|
-
const
|
|
105
|
-
const personal = isPersonalConnectionOwnerPrincipal(authorization);
|
|
106
|
-
const lensPack = await getPackInstallation(
|
|
115
|
+
const policy = await withOrganizationIntegrationPolicyFence(
|
|
107
116
|
deps.db,
|
|
108
|
-
authorization.grant
|
|
109
|
-
|
|
117
|
+
authorization.grant,
|
|
118
|
+
async (_tx, current) => current,
|
|
110
119
|
);
|
|
120
|
+
const canWrite = hasPermission(authorization.grant.permissions, "connections:write");
|
|
121
|
+
const personal = isPersonalConnectionOwnerPrincipal(authorization);
|
|
111
122
|
let mcpConfigured = false;
|
|
112
123
|
let credentialConfigured = false;
|
|
113
124
|
try {
|
|
@@ -118,7 +129,7 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
118
129
|
} catch {
|
|
119
130
|
/* Missing operator configuration is catalog readiness, not actor authority. */
|
|
120
131
|
}
|
|
121
|
-
|
|
132
|
+
const providers = [
|
|
122
133
|
...(["x", "reddit"] as const).map((providerId) => {
|
|
123
134
|
let configured = mcpConfigured;
|
|
124
135
|
try {
|
|
@@ -197,21 +208,6 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
197
208
|
setup: [protocol, "installation"],
|
|
198
209
|
}),
|
|
199
210
|
),
|
|
200
|
-
ConnectProvider.parse({
|
|
201
|
-
id: "atlassian",
|
|
202
|
-
label: "Atlassian (Jira and Confluence)",
|
|
203
|
-
family: "atlassian",
|
|
204
|
-
readiness:
|
|
205
|
-
!external || !canWrite || !personal
|
|
206
|
-
? "unsupported"
|
|
207
|
-
: mcpConfigured &&
|
|
208
|
-
deps.settings.atlassianClientId?.trim() &&
|
|
209
|
-
deps.settings.atlassianClientSecret?.trim()
|
|
210
|
-
? "available"
|
|
211
|
-
: "needs_configuration",
|
|
212
|
-
ownership: personal ? ["personal"] : [],
|
|
213
|
-
setup: ["oauth"],
|
|
214
|
-
}),
|
|
215
211
|
ConnectProvider.parse({
|
|
216
212
|
id: "slack-bot",
|
|
217
213
|
label: "Slack workspace bot",
|
|
@@ -235,7 +231,7 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
235
231
|
readiness:
|
|
236
232
|
!external || !canWrite || !personal
|
|
237
233
|
? "unsupported"
|
|
238
|
-
: mcpConfigured
|
|
234
|
+
: mcpConfigured && gmailOAuthClientConfigured(deps.settings)
|
|
239
235
|
? "available"
|
|
240
236
|
: "needs_configuration",
|
|
241
237
|
ownership: personal ? ["personal"] : [],
|
|
@@ -243,17 +239,17 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
243
239
|
}),
|
|
244
240
|
ConnectProvider.parse({
|
|
245
241
|
id: "slack-personal",
|
|
246
|
-
label: "
|
|
242
|
+
label: "Slack account",
|
|
247
243
|
family: "slack",
|
|
248
244
|
readiness:
|
|
249
|
-
!external || !canWrite
|
|
245
|
+
!external || !canWrite
|
|
250
246
|
? "unsupported"
|
|
251
247
|
: mcpConfigured &&
|
|
252
248
|
deps.settings.slackClientId?.trim() &&
|
|
253
249
|
deps.settings.slackClientSecret?.trim()
|
|
254
250
|
? "available"
|
|
255
251
|
: "needs_configuration",
|
|
256
|
-
ownership: personal ? ["personal"] : [],
|
|
252
|
+
ownership: personal ? ["workspace", "personal"] : ["workspace"],
|
|
257
253
|
setup: ["oauth"],
|
|
258
254
|
}),
|
|
259
255
|
ConnectProvider.parse({
|
|
@@ -288,7 +284,7 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
288
284
|
}),
|
|
289
285
|
ConnectProvider.parse({
|
|
290
286
|
id: "github-lens",
|
|
291
|
-
label: "
|
|
287
|
+
label: "Opengeni Lens PR review",
|
|
292
288
|
family: "github-lens",
|
|
293
289
|
readiness:
|
|
294
290
|
!external ||
|
|
@@ -296,7 +292,6 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
296
292
|
!hasPermission(authorization.grant.permissions, "secrets:write")
|
|
297
293
|
? "unsupported"
|
|
298
294
|
: credentialConfigured &&
|
|
299
|
-
lensPack?.status === "active" &&
|
|
300
295
|
deps.settings.sandboxBackend !== "selfhosted" &&
|
|
301
296
|
prReviewGitHubAppMissingSettings(deps.settings).length === 0
|
|
302
297
|
? "available"
|
|
@@ -391,7 +386,16 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
391
386
|
ownership: personal ? ["workspace", "personal"] : ["workspace"],
|
|
392
387
|
setup: ["credentials"],
|
|
393
388
|
}),
|
|
394
|
-
]
|
|
389
|
+
];
|
|
390
|
+
return c.json(
|
|
391
|
+
providers.filter(
|
|
392
|
+
(provider) =>
|
|
393
|
+
policy.mode === "unrestricted" ||
|
|
394
|
+
policy.allowedIntegrationKeys.includes(
|
|
395
|
+
integrationKeyForConnectProvider(provider.id) ?? "",
|
|
396
|
+
),
|
|
397
|
+
),
|
|
398
|
+
);
|
|
395
399
|
});
|
|
396
400
|
app.get("/v1/workspaces/:workspaceId/connect/accounts", async (c) => {
|
|
397
401
|
const workspaceId = c.req.param("workspaceId");
|
|
@@ -508,22 +512,6 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
508
512
|
: "auth_needed",
|
|
509
513
|
}),
|
|
510
514
|
];
|
|
511
|
-
if (connection.metadata.credentialRole === ATLASSIAN_CREDENTIAL_ROLE)
|
|
512
|
-
return [
|
|
513
|
-
ConnectAccount.parse({
|
|
514
|
-
id: connection.id,
|
|
515
|
-
version: connection.version,
|
|
516
|
-
providerId: "atlassian",
|
|
517
|
-
label: String(connection.metadata.displayName ?? "Atlassian"),
|
|
518
|
-
ownership: "personal",
|
|
519
|
-
status:
|
|
520
|
-
connection.status === "revoked"
|
|
521
|
-
? "disabled"
|
|
522
|
-
: connection.status === "active"
|
|
523
|
-
? "connected"
|
|
524
|
-
: "auth_needed",
|
|
525
|
-
}),
|
|
526
|
-
];
|
|
527
515
|
if (isFikenConnection(connection))
|
|
528
516
|
return [
|
|
529
517
|
ConnectAccount.parse({
|
|
@@ -579,9 +567,12 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
579
567
|
status:
|
|
580
568
|
connection.status === "revoked"
|
|
581
569
|
? "disabled"
|
|
582
|
-
: connection.
|
|
583
|
-
|
|
584
|
-
|
|
570
|
+
: connection.metadata.mcpUrl === OFFICIAL_GMAIL_MCP_URL &&
|
|
571
|
+
connection.subjectId === null
|
|
572
|
+
? "auth_needed"
|
|
573
|
+
: connection.status === "active"
|
|
574
|
+
? "connected"
|
|
575
|
+
: "auth_needed",
|
|
585
576
|
}),
|
|
586
577
|
];
|
|
587
578
|
if (connection.metadata.credentialRole !== API_INTEGRATION_OAUTH_CREDENTIAL_ROLE) return [];
|
|
@@ -619,7 +610,7 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
619
610
|
...(deps.apiIntegrationSourceFetch ? { fetchImpl: deps.apiIntegrationSourceFetch } : {}),
|
|
620
611
|
});
|
|
621
612
|
app.post("/v1/workspaces/:workspaceId/connect/attempts/:attemptId/advance", async (c) => {
|
|
622
|
-
const input =
|
|
613
|
+
const input = await parseRequestJson(c, AdvanceConnectRequest);
|
|
623
614
|
const action = input.action;
|
|
624
615
|
const workspaceId = c.req.param("workspaceId");
|
|
625
616
|
const permission =
|
|
@@ -635,21 +626,19 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
635
626
|
const continuation = externalActorContinuationForAuthorization(authorization);
|
|
636
627
|
if (!authorization.contextIntegrity)
|
|
637
628
|
throw new HTTPException(403, { message: "Verified Connect authority required" });
|
|
638
|
-
const
|
|
639
|
-
|
|
640
|
-
workspaceId,
|
|
641
|
-
subjectId: authorization.grant.subjectId,
|
|
642
|
-
personalOwnerVerified: isPersonalConnectionOwnerPrincipal(authorization),
|
|
643
|
-
...(continuation ? { externalContinuation: continuation } : {}),
|
|
644
|
-
};
|
|
629
|
+
const actor = await connectRequestActor(deps, authorization);
|
|
630
|
+
const scope = actor.scope;
|
|
645
631
|
// Reject invalid caller selections before taking a durable operation claim.
|
|
646
632
|
// Older revisions still go through the receipt-aware claim path for replay.
|
|
647
633
|
const stored = await getConnectAttempt(deps.db, scope, c.req.param("attemptId"));
|
|
648
634
|
const before = stored.attempt;
|
|
635
|
+
assertAgentPreparedConnect(actor, before);
|
|
649
636
|
const advancePermission =
|
|
650
637
|
before.providerId === "mcp-install" ? "capabilities:manage" : permission;
|
|
651
638
|
if (!hasPermission(authorization.grant.permissions, advancePermission))
|
|
652
639
|
throw new HTTPException(403, { message: `${advancePermission} required` });
|
|
640
|
+
if (before.mcpSetup && !hasPermission(authorization.grant.permissions, "capabilities:manage"))
|
|
641
|
+
throw new HTTPException(403, { message: "capabilities:manage required" });
|
|
653
642
|
if (before.providerId === "mcp-install") {
|
|
654
643
|
if (action.type !== "credentials")
|
|
655
644
|
throw new HTTPException(422, { message: "Choose an MCP capability" });
|
|
@@ -717,7 +706,7 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
717
706
|
await requireConnectOwnerAuthority(tx, scope, installationPermission, origin);
|
|
718
707
|
if (before.providerId === "github-lens") {
|
|
719
708
|
await requireConnectOwnerAuthority(tx, scope, "secrets:write", origin);
|
|
720
|
-
await requireGitHubLensConnect({ ...deps, db: tx }
|
|
709
|
+
await requireGitHubLensConnect({ ...deps, db: tx });
|
|
721
710
|
}
|
|
722
711
|
},
|
|
723
712
|
execute: async (attempt) =>
|
|
@@ -754,6 +743,7 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
754
743
|
const resolved = await resolveForRoute({
|
|
755
744
|
deps,
|
|
756
745
|
transport,
|
|
746
|
+
accountId: scope.accountId,
|
|
757
747
|
workspaceId,
|
|
758
748
|
subjectId: scope.subjectId,
|
|
759
749
|
payload: {
|
|
@@ -880,31 +870,43 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
880
870
|
if (["mcp-bearer", "mcp-headers"].includes(before.providerId)) {
|
|
881
871
|
if (action.type !== "credentials")
|
|
882
872
|
throw new HTTPException(422, { message: "MCP credentials required" });
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
.max(
|
|
899
|
-
.
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
873
|
+
let values: { mcpUrl: string; headers: string } | { mcpUrl: string; token: string };
|
|
874
|
+
if (before.mcpSetup) {
|
|
875
|
+
try {
|
|
876
|
+
values = {
|
|
877
|
+
mcpUrl: before.mcpSetup.endpointUrl,
|
|
878
|
+
headers: JSON.stringify(preparedMcpHeaders(before.mcpSetup, action.values)),
|
|
879
|
+
};
|
|
880
|
+
} catch {
|
|
881
|
+
throw new HTTPException(422, { message: "Supply exactly the requested secret fields" });
|
|
882
|
+
}
|
|
883
|
+
} else {
|
|
884
|
+
values =
|
|
885
|
+
before.providerId === "mcp-headers"
|
|
886
|
+
? z
|
|
887
|
+
.object({
|
|
888
|
+
mcpUrl: z.string().url().max(4096),
|
|
889
|
+
headers: z.string().min(2).max(65_536),
|
|
890
|
+
})
|
|
891
|
+
.strict()
|
|
892
|
+
.parse(action.values)
|
|
893
|
+
: z
|
|
894
|
+
.object({
|
|
895
|
+
mcpUrl: z.string().url().max(4096),
|
|
896
|
+
token: z
|
|
897
|
+
.string()
|
|
898
|
+
.min(1)
|
|
899
|
+
.max(16_384)
|
|
900
|
+
.regex(/^[^\u0000-\u0020\u007f]+$/),
|
|
901
|
+
})
|
|
902
|
+
.strict()
|
|
903
|
+
.parse(action.values);
|
|
904
|
+
}
|
|
903
905
|
let credentialHeaders: Record<string, string>;
|
|
904
906
|
try {
|
|
905
907
|
credentialHeaders =
|
|
906
908
|
"headers" in values
|
|
907
|
-
?
|
|
909
|
+
? normalizedCredentialHeaders(
|
|
908
910
|
z.record(z.string(), z.string()).parse(JSON.parse(values.headers)),
|
|
909
911
|
)
|
|
910
912
|
: { authorization: `Bearer ${values.token}` };
|
|
@@ -915,9 +917,11 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
915
917
|
}
|
|
916
918
|
const destination = new URL(values.mcpUrl);
|
|
917
919
|
if (
|
|
918
|
-
[
|
|
919
|
-
|
|
920
|
-
|
|
920
|
+
[
|
|
921
|
+
WORKSPACE_OPENROUTER_CONNECTION_DOMAIN,
|
|
922
|
+
VERCEL_AI_GATEWAY_CONNECTION_DOMAIN,
|
|
923
|
+
WORKSPACE_OPPER_CONNECTION_DOMAIN,
|
|
924
|
+
].some((domain) => domain === destination.hostname)
|
|
921
925
|
)
|
|
922
926
|
throw new HTTPException(422, {
|
|
923
927
|
message: "Use the dedicated workspace provider credential flow",
|
|
@@ -941,11 +945,43 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
941
945
|
expectedRevision: input.expectedRevision,
|
|
942
946
|
operationId: input.idempotencyKey,
|
|
943
947
|
inputDigest: createHmac("sha256", encryptionKey).update(stableJson(input)).digest("hex"),
|
|
944
|
-
|
|
945
|
-
|
|
948
|
+
beforeOperation: actor.beforeOperation,
|
|
949
|
+
authorize: async (tx, attempt, origin) => {
|
|
950
|
+
await requireConnectOwnerAuthority(tx, scope, "connections:write", origin);
|
|
951
|
+
if (attempt.mcpSetup)
|
|
952
|
+
await requireConnectOwnerAuthority(tx, scope, "capabilities:manage", origin);
|
|
953
|
+
},
|
|
946
954
|
execute: async (attempt) => {
|
|
947
955
|
if (attempt.state !== "credential_input")
|
|
948
956
|
throw new HTTPException(409, { message: "Reload the current credential setup" });
|
|
957
|
+
let activation: Awaited<ReturnType<typeof prepareMcpConnectionActivation>> | undefined;
|
|
958
|
+
if (attempt.mcpSetup) {
|
|
959
|
+
try {
|
|
960
|
+
activation = await prepareMcpConnectionActivation({
|
|
961
|
+
grant: actor.grant,
|
|
962
|
+
settings: deps.settings,
|
|
963
|
+
setup: attempt.mcpSetup,
|
|
964
|
+
ownership: attempt.ownership,
|
|
965
|
+
headers: credentialHeaders,
|
|
966
|
+
...(deps.mcpCapabilityProbe ? { probe: deps.mcpCapabilityProbe } : {}),
|
|
967
|
+
});
|
|
968
|
+
} catch {
|
|
969
|
+
// No credential/catalog write has occurred. Settle this exact
|
|
970
|
+
// operation without recording provider text or secret values.
|
|
971
|
+
return {
|
|
972
|
+
commit: async (_tx, current) => ({
|
|
973
|
+
...current,
|
|
974
|
+
revision: current.revision + 1,
|
|
975
|
+
error: {
|
|
976
|
+
code: "mcp_verification_failed",
|
|
977
|
+
message:
|
|
978
|
+
"Could not verify the MCP connection. Check the key and server, then submit again.",
|
|
979
|
+
retryable: false,
|
|
980
|
+
},
|
|
981
|
+
}),
|
|
982
|
+
};
|
|
983
|
+
}
|
|
984
|
+
}
|
|
949
985
|
const credentialEncrypted = encryptEnvironmentValue(
|
|
950
986
|
encryptionKey,
|
|
951
987
|
JSON.stringify({ headers: credentialHeaders }),
|
|
@@ -1002,11 +1038,20 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
1002
1038
|
createdBySubjectId: scope.subjectId,
|
|
1003
1039
|
});
|
|
1004
1040
|
if (!connection) throw new HTTPException(409, { message: "MCP account changed" });
|
|
1041
|
+
if (activation) await activation.commit(tx, connection);
|
|
1042
|
+
const { error: _error, ...settled } = current;
|
|
1005
1043
|
return {
|
|
1006
|
-
...
|
|
1044
|
+
...settled,
|
|
1007
1045
|
revision: current.revision + 1,
|
|
1008
1046
|
state: "complete",
|
|
1009
1047
|
credentialsCommitted: true,
|
|
1048
|
+
...(activation
|
|
1049
|
+
? {
|
|
1050
|
+
integrationInstalled: true,
|
|
1051
|
+
completionRequirement: "integration" as const,
|
|
1052
|
+
mcpCapabilityId: activation.capabilityId,
|
|
1053
|
+
}
|
|
1054
|
+
: {}),
|
|
1010
1055
|
nextAction: { type: "none" },
|
|
1011
1056
|
account: {
|
|
1012
1057
|
id: connection.id,
|
|
@@ -1052,6 +1097,9 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
1052
1097
|
throw new HTTPException(409, { message: "Reload the current connection setup" });
|
|
1053
1098
|
const started = await startMcpOAuth(deps, {
|
|
1054
1099
|
...scope,
|
|
1100
|
+
...(before.providerId === "gmail" || before.providerId === "slack-personal"
|
|
1101
|
+
? { integrationKey: before.providerId }
|
|
1102
|
+
: {}),
|
|
1055
1103
|
...(continuation ? { externalContinuation: continuation } : {}),
|
|
1056
1104
|
connectAttemptId: attempt.id,
|
|
1057
1105
|
personalOwnershipAllowed: isPersonalConnectionOwnerPrincipal(authorization),
|
|
@@ -1144,6 +1192,7 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
1144
1192
|
const resolved = await resolveForRoute({
|
|
1145
1193
|
deps,
|
|
1146
1194
|
transport,
|
|
1195
|
+
accountId: scope.accountId,
|
|
1147
1196
|
workspaceId,
|
|
1148
1197
|
subjectId: scope.subjectId,
|
|
1149
1198
|
payload: previewRequest,
|
|
@@ -1214,19 +1263,11 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
1214
1263
|
);
|
|
1215
1264
|
});
|
|
1216
1265
|
app.post("/v1/workspaces/:workspaceId/connect/attempts/:attemptId/cancel", async (c) => {
|
|
1217
|
-
const input =
|
|
1266
|
+
const input = await parseRequestJson(c, ConnectOperationRequest);
|
|
1218
1267
|
const workspaceId = c.req.param("workspaceId");
|
|
1219
1268
|
const authorization = await requireAccessGrantAuthorization(c, deps, workspaceId);
|
|
1220
|
-
const
|
|
1221
|
-
|
|
1222
|
-
throw new HTTPException(403, { message: "Verified Connect authority required" });
|
|
1223
|
-
const scope = {
|
|
1224
|
-
accountId: authorization.grant.accountId,
|
|
1225
|
-
workspaceId,
|
|
1226
|
-
subjectId: authorization.grant.subjectId,
|
|
1227
|
-
personalOwnerVerified: isPersonalConnectionOwnerPrincipal(authorization),
|
|
1228
|
-
...(continuation ? { externalContinuation: continuation } : {}),
|
|
1229
|
-
};
|
|
1269
|
+
const actor = await connectRequestActor(deps, authorization);
|
|
1270
|
+
const scope = actor.scope;
|
|
1230
1271
|
return c.json(
|
|
1231
1272
|
await executeConnectOperation({
|
|
1232
1273
|
db: deps.db,
|
|
@@ -1237,7 +1278,10 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
1237
1278
|
inputDigest: createHash("sha256")
|
|
1238
1279
|
.update(stableJson({ ...input, action: "cancel" }))
|
|
1239
1280
|
.digest("hex"),
|
|
1281
|
+
purpose: "cancellation",
|
|
1282
|
+
beforeOperation: actor.beforeOperation,
|
|
1240
1283
|
authorize: async (tx, attempt, origin) => {
|
|
1284
|
+
assertAgentPreparedConnect(actor, attempt);
|
|
1241
1285
|
const permission =
|
|
1242
1286
|
attempt.providerId === "mcp-install"
|
|
1243
1287
|
? "capabilities:manage"
|
|
@@ -1275,7 +1319,7 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
1275
1319
|
if (!deps.settings.integrationsEnabled)
|
|
1276
1320
|
throw new HTTPException(403, { message: "integrations disabled" });
|
|
1277
1321
|
const workspaceId = c.req.param("workspaceId");
|
|
1278
|
-
const input =
|
|
1322
|
+
const input = await parseRequestJson(c, BeginConnectRequest);
|
|
1279
1323
|
const setupPermission =
|
|
1280
1324
|
input.providerId === "mcp-install"
|
|
1281
1325
|
? "capabilities:manage"
|
|
@@ -1299,6 +1343,12 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
1299
1343
|
throw new HTTPException(403, {
|
|
1300
1344
|
message: "Verified Connect authority required",
|
|
1301
1345
|
});
|
|
1346
|
+
if (input.mcpSetup && !hasPermission(authorization.grant.permissions, "capabilities:manage"))
|
|
1347
|
+
throw new HTTPException(403, { message: "capabilities:manage required" });
|
|
1348
|
+
if (input.providerId === "atlassian")
|
|
1349
|
+
throw new HTTPException(410, { message: ATLASSIAN_NATIVE_RETIRED_MESSAGE });
|
|
1350
|
+
if (input.providerId === "gmail" && input.ownership !== "personal")
|
|
1351
|
+
throw new HTTPException(422, { message: "Gmail connections must be personal-owned" });
|
|
1302
1352
|
let target: URL;
|
|
1303
1353
|
try {
|
|
1304
1354
|
target = new URL(input.returnUrl);
|
|
@@ -1312,16 +1362,69 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
1312
1362
|
/[\u0000-\u0020\u007f]/.test(input.returnUrl)
|
|
1313
1363
|
)
|
|
1314
1364
|
throw new HTTPException(400, { message: "invalid return URL" });
|
|
1315
|
-
const
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
subjectId: authorization.grant.subjectId,
|
|
1319
|
-
personalOwnerVerified: isPersonalConnectionOwnerPrincipal(authorization),
|
|
1320
|
-
...(continuation ? { externalContinuation: continuation } : {}),
|
|
1321
|
-
};
|
|
1365
|
+
const actor = await connectRequestActor(deps, authorization);
|
|
1366
|
+
const scope = actor.scope;
|
|
1367
|
+
assertAgentPreparedConnect(actor, input);
|
|
1322
1368
|
return c.json(
|
|
1323
|
-
await
|
|
1324
|
-
|
|
1369
|
+
await (async () => {
|
|
1370
|
+
// Remote setup preparation stays outside the policy and actor transactions.
|
|
1371
|
+
// Repeat both admissions when persisting the resulting attempt.
|
|
1372
|
+
const tx = deps.db;
|
|
1373
|
+
const admit = () =>
|
|
1374
|
+
withOrganizationIntegrationPolicyFence(deps.db, scope, async (policyTx, policy) => {
|
|
1375
|
+
await actor.beforeOperation?.(policyTx);
|
|
1376
|
+
return withWorkspaceSubjectRls(
|
|
1377
|
+
policyTx,
|
|
1378
|
+
workspaceId,
|
|
1379
|
+
scope.subjectId,
|
|
1380
|
+
async (actorTx) => {
|
|
1381
|
+
await requireConnectOwnerAuthority(actorTx, scope, setupPermission);
|
|
1382
|
+
if (input.mcpSetup)
|
|
1383
|
+
await requireConnectOwnerAuthority(actorTx, scope, "capabilities:manage");
|
|
1384
|
+
const replay = await getConnectBeginReplay(actorTx, scope, {
|
|
1385
|
+
idempotencyKey: input.idempotencyKey,
|
|
1386
|
+
requestDigest: createHash("sha256").update(stableJson(input)).digest("hex"),
|
|
1387
|
+
returnUrl: input.returnUrl,
|
|
1388
|
+
...(continuation ? { externalContinuation: continuation } : {}),
|
|
1389
|
+
});
|
|
1390
|
+
if (replay) return replay;
|
|
1391
|
+
assertOrganizationIntegrationAllowed(
|
|
1392
|
+
policy,
|
|
1393
|
+
integrationKeyForConnectProvider(input.providerId),
|
|
1394
|
+
);
|
|
1395
|
+
return null;
|
|
1396
|
+
},
|
|
1397
|
+
);
|
|
1398
|
+
});
|
|
1399
|
+
const replay = await admit();
|
|
1400
|
+
if (replay) return replay;
|
|
1401
|
+
const beginConnectAttempt = async (
|
|
1402
|
+
_db: Parameters<typeof persistConnectAttempt>[0],
|
|
1403
|
+
_scope: Parameters<typeof persistConnectAttempt>[1],
|
|
1404
|
+
attemptInput: Parameters<typeof persistConnectAttempt>[2],
|
|
1405
|
+
) =>
|
|
1406
|
+
withOrganizationIntegrationPolicyFence(deps.db, scope, async (policyTx, policy) => {
|
|
1407
|
+
await actor.beforeOperation?.(policyTx);
|
|
1408
|
+
return withWorkspaceSubjectRls(
|
|
1409
|
+
policyTx,
|
|
1410
|
+
workspaceId,
|
|
1411
|
+
scope.subjectId,
|
|
1412
|
+
async (actorTx) => {
|
|
1413
|
+
await requireConnectOwnerAuthority(actorTx, scope, setupPermission);
|
|
1414
|
+
if (input.mcpSetup)
|
|
1415
|
+
await requireConnectOwnerAuthority(actorTx, scope, "capabilities:manage");
|
|
1416
|
+
return persistConnectAttempt(actorTx, scope, {
|
|
1417
|
+
...attemptInput,
|
|
1418
|
+
authorizeAcquisition: async () => {
|
|
1419
|
+
assertOrganizationIntegrationAllowed(
|
|
1420
|
+
policy,
|
|
1421
|
+
integrationKeyForConnectProvider(input.providerId),
|
|
1422
|
+
);
|
|
1423
|
+
},
|
|
1424
|
+
});
|
|
1425
|
+
},
|
|
1426
|
+
);
|
|
1427
|
+
});
|
|
1325
1428
|
const id = randomUUID();
|
|
1326
1429
|
if (input.providerId === "mcp-install") {
|
|
1327
1430
|
if (
|
|
@@ -1467,7 +1570,7 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
1467
1570
|
if (!hasPermission(authorization.grant.permissions, "secrets:write"))
|
|
1468
1571
|
throw new HTTPException(403, { message: "secrets:write required" });
|
|
1469
1572
|
await requireConnectOwnerAuthority(tx, scope, "secrets:write");
|
|
1470
|
-
await requireGitHubLensConnect({ ...deps, db: tx }
|
|
1573
|
+
await requireGitHubLensConnect({ ...deps, db: tx });
|
|
1471
1574
|
}
|
|
1472
1575
|
const navigation = githubAppConnectNavigation(
|
|
1473
1576
|
deps,
|
|
@@ -1501,7 +1604,7 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
1501
1604
|
if (["openapi", "graphql"].includes(input.providerId)) {
|
|
1502
1605
|
if (input.reconnectAccountId)
|
|
1503
1606
|
throw new HTTPException(422, { message: "Select the service connection during setup" });
|
|
1504
|
-
if (input.ownership === "personal" && !
|
|
1607
|
+
if (input.ownership === "personal" && !scope.personalOwnerVerified)
|
|
1505
1608
|
throw new HTTPException(403, { message: "personal ownership unavailable" });
|
|
1506
1609
|
const choices = hasPermission(authorization.grant.permissions, "connections:read")
|
|
1507
1610
|
? (await listConnectionsMetadata(tx, workspaceId, scope.subjectId))
|
|
@@ -1595,14 +1698,6 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
1595
1698
|
"fiken-token",
|
|
1596
1699
|
].includes(input.providerId)
|
|
1597
1700
|
) {
|
|
1598
|
-
if (input.providerId === "slack-personal" && input.ownership !== "personal")
|
|
1599
|
-
throw new HTTPException(422, {
|
|
1600
|
-
message: "Hosted Slack MCP requires personal ownership",
|
|
1601
|
-
});
|
|
1602
|
-
if (input.providerId === "gmail" && input.ownership !== "personal")
|
|
1603
|
-
throw new HTTPException(422, {
|
|
1604
|
-
message: "Gmail requires personal ownership; each user connects their own account",
|
|
1605
|
-
});
|
|
1606
1701
|
if (input.providerId === "fiken-token" && input.ownership !== "workspace")
|
|
1607
1702
|
throw new HTTPException(422, { message: "Fiken is workspace-owned" });
|
|
1608
1703
|
requireEnvironmentEncryption(deps.settings);
|
|
@@ -1633,7 +1728,7 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
1633
1728
|
(existing.subjectId === null ? "workspace" : "personal") !== input.ownership)
|
|
1634
1729
|
)
|
|
1635
1730
|
throw new HTTPException(404, { message: "MCP account not found for this ownership" });
|
|
1636
|
-
if (input.ownership === "personal" && !
|
|
1731
|
+
if (input.ownership === "personal" && !scope.personalOwnerVerified)
|
|
1637
1732
|
throw new HTTPException(403, { message: "personal ownership unavailable" });
|
|
1638
1733
|
return beginConnectAttempt(tx, scope, {
|
|
1639
1734
|
...(continuation ? { externalContinuation: continuation } : {}),
|
|
@@ -1649,7 +1744,8 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
1649
1744
|
state: "credential_input",
|
|
1650
1745
|
credentialsCommitted: false,
|
|
1651
1746
|
integrationInstalled: false,
|
|
1652
|
-
completionRequirement: "connection",
|
|
1747
|
+
completionRequirement: input.mcpSetup ? "integration" : "connection",
|
|
1748
|
+
...(input.mcpSetup ? { mcpSetup: input.mcpSetup } : {}),
|
|
1653
1749
|
...(existing
|
|
1654
1750
|
? {
|
|
1655
1751
|
account: {
|
|
@@ -1664,50 +1760,57 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
1664
1760
|
: {}),
|
|
1665
1761
|
nextAction: {
|
|
1666
1762
|
type: "credentials",
|
|
1667
|
-
fields:
|
|
1668
|
-
?
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
|
|
1672
|
-
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
|
|
1683
|
-
|
|
1684
|
-
|
|
1685
|
-
|
|
1686
|
-
|
|
1687
|
-
|
|
1688
|
-
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
]
|
|
1700
|
-
: input.providerId === "mcp-headers"
|
|
1763
|
+
fields: input.mcpSetup
|
|
1764
|
+
? input.mcpSetup.secretFields.map((field) => ({
|
|
1765
|
+
name: field.id,
|
|
1766
|
+
label: field.label,
|
|
1767
|
+
required: true,
|
|
1768
|
+
secret: true,
|
|
1769
|
+
}))
|
|
1770
|
+
: ["slack-personal", "gmail"].includes(input.providerId)
|
|
1771
|
+
? []
|
|
1772
|
+
: input.providerId === "fiken-token"
|
|
1773
|
+
? [
|
|
1774
|
+
{
|
|
1775
|
+
name: "apiToken",
|
|
1776
|
+
label: "Fiken API token",
|
|
1777
|
+
required: true,
|
|
1778
|
+
secret: true,
|
|
1779
|
+
},
|
|
1780
|
+
{
|
|
1781
|
+
name: "defaultCompanySlug",
|
|
1782
|
+
label: "Default company slug (optional)",
|
|
1783
|
+
required: false,
|
|
1784
|
+
secret: false,
|
|
1785
|
+
},
|
|
1786
|
+
]
|
|
1787
|
+
: [
|
|
1788
|
+
{
|
|
1789
|
+
name: "mcpUrl",
|
|
1790
|
+
label: "MCP server URL",
|
|
1791
|
+
required: true,
|
|
1792
|
+
secret: false,
|
|
1793
|
+
},
|
|
1794
|
+
...(input.providerId === "mcp-bearer"
|
|
1701
1795
|
? [
|
|
1702
1796
|
{
|
|
1703
|
-
name: "
|
|
1704
|
-
label: "
|
|
1797
|
+
name: "token",
|
|
1798
|
+
label: "Bearer credential",
|
|
1705
1799
|
required: true,
|
|
1706
1800
|
secret: true,
|
|
1707
1801
|
},
|
|
1708
1802
|
]
|
|
1709
|
-
:
|
|
1710
|
-
|
|
1803
|
+
: input.providerId === "mcp-headers"
|
|
1804
|
+
? [
|
|
1805
|
+
{
|
|
1806
|
+
name: "headers",
|
|
1807
|
+
label: "Credential headers (JSON)",
|
|
1808
|
+
required: true,
|
|
1809
|
+
secret: true,
|
|
1810
|
+
},
|
|
1811
|
+
]
|
|
1812
|
+
: []),
|
|
1813
|
+
],
|
|
1711
1814
|
},
|
|
1712
1815
|
expiresAt: new Date(Date.now() + 15 * 60_000).toISOString(),
|
|
1713
1816
|
},
|
|
@@ -1867,30 +1970,29 @@ export function registerConnectRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
1867
1970
|
expiresAt: started.expiresAt,
|
|
1868
1971
|
},
|
|
1869
1972
|
});
|
|
1870
|
-
}),
|
|
1973
|
+
})(),
|
|
1871
1974
|
);
|
|
1872
1975
|
});
|
|
1873
1976
|
app.get("/v1/workspaces/:workspaceId/connect/attempts", async (c) => {
|
|
1874
1977
|
const workspaceId = c.req.param("workspaceId");
|
|
1875
|
-
const
|
|
1978
|
+
const authorization = await requireAccessGrantAuthorization(c, deps, workspaceId);
|
|
1979
|
+
const actor = await connectRequestActor(deps, authorization);
|
|
1980
|
+
const { grant } = actor;
|
|
1876
1981
|
return c.json(
|
|
1877
|
-
(
|
|
1878
|
-
|
|
1879
|
-
|
|
1880
|
-
|
|
1881
|
-
|
|
1882
|
-
})
|
|
1883
|
-
).filter((attempt) => canReadAttempt(grant.permissions, attempt.providerId)),
|
|
1982
|
+
(await listPendingConnectAttempts(deps.db, actor.scope)).filter(
|
|
1983
|
+
(attempt) =>
|
|
1984
|
+
canReadAttempt(grant.permissions, attempt.providerId) &&
|
|
1985
|
+
(!actor.preparedOnly || (attempt.providerId === "mcp-headers" && attempt.mcpSetup)),
|
|
1986
|
+
),
|
|
1884
1987
|
);
|
|
1885
1988
|
});
|
|
1886
1989
|
app.get("/v1/workspaces/:workspaceId/connect/attempts/:attemptId", async (c) => {
|
|
1887
1990
|
const workspaceId = c.req.param("workspaceId");
|
|
1888
|
-
const
|
|
1889
|
-
const
|
|
1890
|
-
|
|
1891
|
-
|
|
1892
|
-
|
|
1893
|
-
);
|
|
1991
|
+
const authorization = await requireAccessGrantAuthorization(c, deps, workspaceId);
|
|
1992
|
+
const actor = await connectRequestActor(deps, authorization);
|
|
1993
|
+
const { grant } = actor;
|
|
1994
|
+
const { attempt } = await getConnectAttempt(deps.db, actor.scope, c.req.param("attemptId"));
|
|
1995
|
+
assertAgentPreparedConnect(actor, attempt);
|
|
1894
1996
|
if (!canReadAttempt(grant.permissions, attempt.providerId))
|
|
1895
1997
|
throw new HTTPException(403, { message: "Connect read permission required" });
|
|
1896
1998
|
return c.json(attempt);
|