@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,123 @@
|
|
|
1
|
+
// Content-free analytics consent beacon.
|
|
2
|
+
//
|
|
3
|
+
// When a person answers the web console's optional-analytics banner, the
|
|
4
|
+
// browser reports only the closed decision (`granted` or `denied`). Each
|
|
5
|
+
// accepted report increments `opengeni_analytics_consent_total{decision}`, so
|
|
6
|
+
// product reports can state how much of the audience the consent-gated
|
|
7
|
+
// analytics providers never see. The body carries no identifier, URL, cookie,
|
|
8
|
+
// or user content, the browser sends it with `credentials: "omit"`, and the
|
|
9
|
+
// route writes no log line. It admits anonymous callers because the banner is
|
|
10
|
+
// answered before sign-in too. Any HTTP client that omits `Origin` can still
|
|
11
|
+
// send reports up to the admission ceiling, so read the counter as a ratio of
|
|
12
|
+
// decisions, not as a count of people.
|
|
13
|
+
import type { Settings } from "@opengeni/config";
|
|
14
|
+
import {
|
|
15
|
+
ANALYTICS_CONSENT_DECISIONS,
|
|
16
|
+
ANALYTICS_CONSENT_PATH,
|
|
17
|
+
ANALYTICS_CONSENT_REPORT_MAX_BYTES,
|
|
18
|
+
type AnalyticsConsentDecision,
|
|
19
|
+
} from "@opengeni/contracts/analytics-consent-report";
|
|
20
|
+
import type { Observability } from "@opengeni/observability";
|
|
21
|
+
import type { Context, Hono } from "hono";
|
|
22
|
+
import { bodyLimit } from "hono/body-limit";
|
|
23
|
+
import { z } from "zod";
|
|
24
|
+
|
|
25
|
+
import { isAllowedBrowserOrigin } from "../http/cors";
|
|
26
|
+
import { createKeyedAdmission, type KeyedAdmission } from "../http/keyed-admission";
|
|
27
|
+
|
|
28
|
+
export { ANALYTICS_CONSENT_DECISIONS, ANALYTICS_CONSENT_PATH, type AnalyticsConsentDecision };
|
|
29
|
+
|
|
30
|
+
const REJECTION_REASONS = ["invalid", "too_large", "origin", "rate_limited"] as const;
|
|
31
|
+
type RejectionReason = (typeof REJECTION_REASONS)[number];
|
|
32
|
+
|
|
33
|
+
export const AnalyticsConsentReport = z
|
|
34
|
+
.object({ decision: z.enum(ANALYTICS_CONSENT_DECISIONS) })
|
|
35
|
+
.strict();
|
|
36
|
+
export type AnalyticsConsentReport = z.infer<typeof AnalyticsConsentReport>;
|
|
37
|
+
|
|
38
|
+
const CONSENT_METRIC = {
|
|
39
|
+
name: "opengeni_analytics_consent_total",
|
|
40
|
+
help: "Answers to the web console's optional-analytics banner, by closed decision. Admission is bounded per API process, so this is a lower bound.",
|
|
41
|
+
} as const;
|
|
42
|
+
const REJECTIONS_METRIC = {
|
|
43
|
+
name: "opengeni_analytics_consent_reports_rejected_total",
|
|
44
|
+
help: "Analytics consent reports the API refused, by closed reason.",
|
|
45
|
+
} as const;
|
|
46
|
+
|
|
47
|
+
export type AnalyticsConsentAdmission = KeyedAdmission<AnalyticsConsentDecision>;
|
|
48
|
+
|
|
49
|
+
export function parseAnalyticsConsentReport(body: string | null): AnalyticsConsentReport | null {
|
|
50
|
+
if (
|
|
51
|
+
body === null ||
|
|
52
|
+
new TextEncoder().encode(body).byteLength > ANALYTICS_CONSENT_REPORT_MAX_BYTES
|
|
53
|
+
) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
let value: unknown;
|
|
57
|
+
try {
|
|
58
|
+
value = JSON.parse(body);
|
|
59
|
+
} catch {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
const parsed = AnalyticsConsentReport.safeParse(value);
|
|
63
|
+
return parsed.success ? parsed.data : null;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* The exact beacon request. The app-wide request-body limit skips it because
|
|
68
|
+
* the route enforces its own small limit on the streamed body.
|
|
69
|
+
*/
|
|
70
|
+
export function isAnalyticsConsentReportRequest(method: string, pathname: string): boolean {
|
|
71
|
+
return method === "POST" && pathname === ANALYTICS_CONSENT_PATH;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export function registerAnalyticsConsentRoutes(
|
|
75
|
+
app: Hono,
|
|
76
|
+
deps: {
|
|
77
|
+
observability: Observability;
|
|
78
|
+
settings: Pick<Settings, "corsAllowOriginRegex" | "publicBaseUrl" | "webBaseUrl">;
|
|
79
|
+
admission?: AnalyticsConsentAdmission;
|
|
80
|
+
},
|
|
81
|
+
): void {
|
|
82
|
+
const { observability, settings } = deps;
|
|
83
|
+
// Consent answers are rare (once per browser), so a small burst and a slow
|
|
84
|
+
// refill still cover a launch-day spike on each API process.
|
|
85
|
+
const admission =
|
|
86
|
+
deps.admission ??
|
|
87
|
+
createKeyedAdmission<AnalyticsConsentDecision>({ capacity: 60, refillPerSecond: 1 });
|
|
88
|
+
// Publish every finite series at zero so the first answer after a deploy is
|
|
89
|
+
// an increase from a baseline rather than a series appearing from nothing.
|
|
90
|
+
for (const decision of ANALYTICS_CONSENT_DECISIONS) {
|
|
91
|
+
observability.incrementCounter({ ...CONSENT_METRIC, labels: { decision }, amount: 0 });
|
|
92
|
+
}
|
|
93
|
+
for (const reason of REJECTION_REASONS) {
|
|
94
|
+
observability.incrementCounter({ ...REJECTIONS_METRIC, labels: { reason }, amount: 0 });
|
|
95
|
+
}
|
|
96
|
+
const reject = (c: Context, reason: RejectionReason, status: 400 | 403 | 413 | 429) => {
|
|
97
|
+
observability.incrementCounter({ ...REJECTIONS_METRIC, labels: { reason } });
|
|
98
|
+
c.header("cache-control", "no-store");
|
|
99
|
+
return c.body(null, status);
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
app.post(
|
|
103
|
+
ANALYTICS_CONSENT_PATH,
|
|
104
|
+
bodyLimit({
|
|
105
|
+
maxSize: ANALYTICS_CONSENT_REPORT_MAX_BYTES,
|
|
106
|
+
onError: (c) => reject(c, "too_large", 413),
|
|
107
|
+
}),
|
|
108
|
+
async (c) => {
|
|
109
|
+
c.header("cache-control", "no-store");
|
|
110
|
+
// Browsers always send Origin on this POST, so a foreign page cannot
|
|
111
|
+
// inflate the counter through its visitors' browsers.
|
|
112
|
+
const origin = c.req.header("origin");
|
|
113
|
+
if (origin !== undefined && !isAllowedBrowserOrigin(origin, settings)) {
|
|
114
|
+
return reject(c, "origin", 403);
|
|
115
|
+
}
|
|
116
|
+
const report = parseAnalyticsConsentReport(await c.req.text().catch(() => null));
|
|
117
|
+
if (!report) return reject(c, "invalid", 400);
|
|
118
|
+
if (!admission.admit(report.decision)) return reject(c, "rate_limited", 429);
|
|
119
|
+
observability.incrementCounter({ ...CONSENT_METRIC, labels: { decision: report.decision } });
|
|
120
|
+
return c.body(null, 204);
|
|
121
|
+
},
|
|
122
|
+
);
|
|
123
|
+
}
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
} from "@opengeni/capabilities";
|
|
8
8
|
import {
|
|
9
9
|
ApiIntegrationPreview,
|
|
10
|
+
OrganizationIntegrationDeniedError,
|
|
10
11
|
ListIntegrationDefinitionsResponse,
|
|
11
12
|
ApiIntegrationUninstallPreview,
|
|
12
13
|
InstallApiIntegrationRequest,
|
|
@@ -17,12 +18,19 @@ import {
|
|
|
17
18
|
UninstallApiIntegrationResult,
|
|
18
19
|
type AccessGrant,
|
|
19
20
|
} from "@opengeni/contracts";
|
|
20
|
-
import { requireAccessGrant, type ApiRouteDeps } from "@opengeni/core";
|
|
21
21
|
import {
|
|
22
|
+
requireAccessGrant,
|
|
23
|
+
integrationSourceForOrganizationPolicy,
|
|
24
|
+
type ApiRouteDeps,
|
|
25
|
+
} from "@opengeni/core";
|
|
26
|
+
import { withOrganizationIntegrationPolicyFence } from "@opengeni/db/organization-integration-policy";
|
|
27
|
+
import {
|
|
28
|
+
ApiIntegrationConnectionReferenceError,
|
|
22
29
|
ApiIntegrationInstallationVersionConflictError,
|
|
23
30
|
buildConnectionTokenResolver,
|
|
24
31
|
getApiIntegrationUninstallPreview,
|
|
25
32
|
getConnectionMetadata,
|
|
33
|
+
getApiIntegrationReconciliationSnapshot,
|
|
26
34
|
installApiIntegration,
|
|
27
35
|
IntegrationFacetBindingOwnershipConflictError,
|
|
28
36
|
IntegrationFacetBindingVersionConflictError,
|
|
@@ -40,6 +48,8 @@ import {
|
|
|
40
48
|
type ApiIntegrationConnectionDescriptor,
|
|
41
49
|
type ResolvedApiIntegrationPreview,
|
|
42
50
|
} from "../integrations/api-integrations";
|
|
51
|
+
import { ApiHttpError } from "../http/api-error";
|
|
52
|
+
import { parseRequestJson } from "../http/request-body";
|
|
43
53
|
|
|
44
54
|
export type ApiIntegrationRouteOverrides = Readonly<{ fetchImpl?: FetchLike }>;
|
|
45
55
|
|
|
@@ -81,6 +91,14 @@ export function validatedIntegrationInstallInput(
|
|
|
81
91
|
throw new HTTPException(422, {
|
|
82
92
|
message: "Choose a Personal Connection before installing for yourself.",
|
|
83
93
|
});
|
|
94
|
+
if (payload.autoApprovedTools?.length) {
|
|
95
|
+
const selected = new Set(payload.allowedTools ?? resolved.preview.tools.map((tool) => tool.id));
|
|
96
|
+
const outside = payload.autoApprovedTools.find((tool) => !selected.has(tool));
|
|
97
|
+
if (outside)
|
|
98
|
+
throw new HTTPException(422, {
|
|
99
|
+
message: `autoApprovedTools must name selected Integration tools: ${outside.slice(0, 200)}`,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
84
102
|
return {
|
|
85
103
|
accountId: grant.accountId,
|
|
86
104
|
workspaceId,
|
|
@@ -108,12 +126,63 @@ export function validatedIntegrationInstallInput(
|
|
|
108
126
|
: {}),
|
|
109
127
|
requiredScopes: resolved.requiredScopes,
|
|
110
128
|
ownership: resolved.preview.connectionOwnership === "personal" ? "subject" : "workspace",
|
|
111
|
-
...(payload.allowedTools
|
|
129
|
+
...(payload.allowedTools
|
|
130
|
+
? { allowedTools: validatedAllowedToolIds(payload.allowedTools, resolved.revision.tools) }
|
|
131
|
+
: {}),
|
|
132
|
+
...(payload.autoApprovedTools ? { autoApprovedTools: payload.autoApprovedTools } : {}),
|
|
112
133
|
facetDefinitions: integrationFacetDefinitions(resolved.preview.definitionId),
|
|
113
134
|
revision: resolved.revision,
|
|
114
135
|
};
|
|
115
136
|
}
|
|
116
137
|
|
|
138
|
+
const MAX_REPORTED_TOOL_IDS = 50;
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* `allowedTools` names tools by their preview `id`, the stable identity the
|
|
142
|
+
* install persists. Reject anything else as a client error that lists the
|
|
143
|
+
* valid ids; a caller that sent a preview `operationKey` is told which id it
|
|
144
|
+
* maps to rather than having it silently reinterpreted.
|
|
145
|
+
*/
|
|
146
|
+
export function validatedAllowedToolIds(
|
|
147
|
+
allowedTools: readonly string[],
|
|
148
|
+
tools: readonly { id: string; operationKey: string }[],
|
|
149
|
+
): string[] {
|
|
150
|
+
const ids = new Set(tools.map((tool) => tool.id));
|
|
151
|
+
const unknown = [
|
|
152
|
+
...new Set(allowedTools.map((tool) => tool.trim()).filter((tool) => !ids.has(tool))),
|
|
153
|
+
];
|
|
154
|
+
if (unknown.length === 0) return [...allowedTools];
|
|
155
|
+
const operationKeyMatches = unknown.flatMap((value) => {
|
|
156
|
+
const tool = tools.find((candidate) => candidate.operationKey === value);
|
|
157
|
+
return tool ? [{ operationKey: value, id: tool.id }] : [];
|
|
158
|
+
});
|
|
159
|
+
const validToolIds = tools.map((tool) => tool.id);
|
|
160
|
+
const shownUnknown = unknown.slice(0, 10);
|
|
161
|
+
const hint =
|
|
162
|
+
operationKeyMatches.length > 0
|
|
163
|
+
? ` allowedTools takes tool ids, not operationKeys: ${operationKeyMatches
|
|
164
|
+
.slice(0, 5)
|
|
165
|
+
.map((match) => `${match.operationKey} -> ${match.id}`)
|
|
166
|
+
.join(", ")}.`
|
|
167
|
+
: "";
|
|
168
|
+
throw new ApiHttpError(422, {
|
|
169
|
+
code: "validation_failed",
|
|
170
|
+
message: `allowedTools contains unknown tool ids: ${shownUnknown.join(", ")}${
|
|
171
|
+
unknown.length > shownUnknown.length
|
|
172
|
+
? `, and ${unknown.length - shownUnknown.length} more`
|
|
173
|
+
: ""
|
|
174
|
+
}. Use the \`id\` of each tool in the Integration preview.${hint}`,
|
|
175
|
+
retryable: false,
|
|
176
|
+
details: {
|
|
177
|
+
code: "unknown_integration_tools",
|
|
178
|
+
unknownTools: shownUnknown,
|
|
179
|
+
operationKeyMatches: operationKeyMatches.slice(0, MAX_REPORTED_TOOL_IDS),
|
|
180
|
+
validToolIds: validToolIds.slice(0, MAX_REPORTED_TOOL_IDS),
|
|
181
|
+
validToolIdCount: validToolIds.length,
|
|
182
|
+
},
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
|
|
117
186
|
export function registerApiIntegrationRoutes(
|
|
118
187
|
app: Hono,
|
|
119
188
|
deps: ApiRouteDeps,
|
|
@@ -205,24 +274,37 @@ export function registerApiIntegrationRoutes(
|
|
|
205
274
|
app.post("/v1/workspaces/:workspaceId/integrations/preview", async (c) => {
|
|
206
275
|
const workspaceId = c.req.param("workspaceId");
|
|
207
276
|
const grant = await requireAccessGrant(c, deps, workspaceId, "workspace:read");
|
|
208
|
-
const payload =
|
|
277
|
+
const payload = await parseRequestJson(c, PreviewApiIntegrationRequest);
|
|
209
278
|
const resolved = await resolveForRoute({
|
|
210
279
|
deps,
|
|
211
280
|
transport,
|
|
281
|
+
accountId: grant.accountId,
|
|
212
282
|
workspaceId,
|
|
213
283
|
subjectId: grant.subjectId,
|
|
214
284
|
payload,
|
|
215
285
|
});
|
|
216
|
-
|
|
286
|
+
const credentialWarnings = await connectionCredentialPlacementWarnings(
|
|
287
|
+
deps,
|
|
288
|
+
workspaceId,
|
|
289
|
+
grant.subjectId,
|
|
290
|
+
resolved.preview,
|
|
291
|
+
);
|
|
292
|
+
return c.json(
|
|
293
|
+
ApiIntegrationPreview.parse({
|
|
294
|
+
...resolved.preview,
|
|
295
|
+
warnings: [...resolved.preview.warnings, ...credentialWarnings].slice(0, 32),
|
|
296
|
+
}),
|
|
297
|
+
);
|
|
217
298
|
});
|
|
218
299
|
|
|
219
300
|
app.post("/v1/workspaces/:workspaceId/integrations/install", async (c) => {
|
|
220
301
|
const workspaceId = c.req.param("workspaceId");
|
|
221
302
|
const grant = await requireAccessGrant(c, deps, workspaceId, "capabilities:manage");
|
|
222
|
-
const payload =
|
|
303
|
+
const payload = await parseRequestJson(c, InstallApiIntegrationRequest);
|
|
223
304
|
const resolved = await resolveForRoute({
|
|
224
305
|
deps,
|
|
225
306
|
transport,
|
|
307
|
+
accountId: grant.accountId,
|
|
226
308
|
workspaceId,
|
|
227
309
|
subjectId: grant.subjectId,
|
|
228
310
|
payload,
|
|
@@ -234,6 +316,11 @@ export function registerApiIntegrationRoutes(
|
|
|
234
316
|
payload.expectedInstanceVersion === undefined ? 201 : 200,
|
|
235
317
|
);
|
|
236
318
|
} catch (error) {
|
|
319
|
+
if (error instanceof ApiIntegrationConnectionReferenceError) {
|
|
320
|
+
throw new HTTPException(error.reason === "not_found" ? 404 : 422, {
|
|
321
|
+
message: error.reason === "not_found" ? "connection not found" : error.message,
|
|
322
|
+
});
|
|
323
|
+
}
|
|
237
324
|
if (
|
|
238
325
|
error instanceof IntegrationFacetBindingVersionConflictError ||
|
|
239
326
|
error instanceof IntegrationFacetBindingVersionRequiredError ||
|
|
@@ -274,7 +361,7 @@ export function registerApiIntegrationRoutes(
|
|
|
274
361
|
const grant = await requireAccessGrant(c, deps, workspaceId, "capabilities:manage");
|
|
275
362
|
const capabilityId = decodeURIComponent(c.req.param("capabilityId"));
|
|
276
363
|
const instanceKey = decodeURIComponent(c.req.param("instanceKey"));
|
|
277
|
-
const payload =
|
|
364
|
+
const payload = await parseRequestJson(c, UninstallApiIntegrationRequest);
|
|
278
365
|
try {
|
|
279
366
|
return c.json(
|
|
280
367
|
UninstallApiIntegrationResult.parse(
|
|
@@ -308,21 +395,45 @@ export function registerApiIntegrationRoutes(
|
|
|
308
395
|
export async function resolveForRoute(input: {
|
|
309
396
|
deps: ApiRouteDeps;
|
|
310
397
|
transport: ReturnType<typeof createPinnedIntegrationTransport>;
|
|
398
|
+
accountId: string;
|
|
311
399
|
workspaceId: string;
|
|
312
400
|
subjectId: string;
|
|
313
401
|
payload: PreviewApiIntegrationRequest | InstallApiIntegrationRequest;
|
|
314
402
|
}): ReturnType<typeof resolveApiIntegrationPreview> {
|
|
403
|
+
const payload = structuredClone(input.payload);
|
|
404
|
+
const preparation = await withOrganizationIntegrationPolicyFence(
|
|
405
|
+
input.deps.db,
|
|
406
|
+
input,
|
|
407
|
+
async (tx, policy) => {
|
|
408
|
+
try {
|
|
409
|
+
return { source: integrationSourceForOrganizationPolicy(policy, payload.source) };
|
|
410
|
+
} catch (error) {
|
|
411
|
+
if (!(error instanceof OrganizationIntegrationDeniedError)) throw error;
|
|
412
|
+
const install = InstallApiIntegrationRequest.safeParse(payload);
|
|
413
|
+
if (install.success) {
|
|
414
|
+
const resolved = await storedReconciliationPreview(
|
|
415
|
+
{ ...input, deps: { ...input.deps, db: tx } },
|
|
416
|
+
install.data,
|
|
417
|
+
);
|
|
418
|
+
if (resolved) return { resolved };
|
|
419
|
+
}
|
|
420
|
+
throw error;
|
|
421
|
+
}
|
|
422
|
+
},
|
|
423
|
+
);
|
|
424
|
+
if (preparation.resolved) return preparation.resolved;
|
|
425
|
+
const source = preparation.source!;
|
|
315
426
|
try {
|
|
316
|
-
const connection =
|
|
427
|
+
const connection = payload.connectionId
|
|
317
428
|
? await requireVisibleConnection(
|
|
318
429
|
input.deps,
|
|
319
430
|
input.workspaceId,
|
|
320
431
|
input.subjectId,
|
|
321
|
-
|
|
432
|
+
payload.connectionId,
|
|
322
433
|
)
|
|
323
434
|
: null;
|
|
324
435
|
return await resolveApiIntegrationPreview({
|
|
325
|
-
source
|
|
436
|
+
source,
|
|
326
437
|
connection: connectionDescriptor(connection),
|
|
327
438
|
transport: input.transport,
|
|
328
439
|
authority: {
|
|
@@ -353,6 +464,154 @@ export async function resolveForRoute(input: {
|
|
|
353
464
|
}
|
|
354
465
|
}
|
|
355
466
|
|
|
467
|
+
async function storedReconciliationPreview(
|
|
468
|
+
input: { deps: ApiRouteDeps; accountId: string; workspaceId: string; subjectId: string },
|
|
469
|
+
payload: InstallApiIntegrationRequest,
|
|
470
|
+
): Promise<ResolvedApiIntegrationPreview | null> {
|
|
471
|
+
const snapshot = await getApiIntegrationReconciliationSnapshot(input.deps.db, {
|
|
472
|
+
accountId: input.accountId,
|
|
473
|
+
workspaceId: input.workspaceId,
|
|
474
|
+
subjectId: input.subjectId,
|
|
475
|
+
source: payload.source,
|
|
476
|
+
expectedRevisionId: payload.expectedRevisionId,
|
|
477
|
+
expectedContentSha256: payload.expectedContentSha256,
|
|
478
|
+
...(payload.connectionId !== undefined ? { connectionId: payload.connectionId } : {}),
|
|
479
|
+
...(payload.instanceKey !== undefined ? { instanceKey: payload.instanceKey } : {}),
|
|
480
|
+
...(payload.allowedTools !== undefined ? { allowedTools: payload.allowedTools } : {}),
|
|
481
|
+
});
|
|
482
|
+
if (!snapshot) return null;
|
|
483
|
+
const { runtime, baseServerId, name, provider, requiredScopes } = snapshot;
|
|
484
|
+
const connection = payload.connectionId
|
|
485
|
+
? await requireVisibleConnection(
|
|
486
|
+
input.deps,
|
|
487
|
+
input.workspaceId,
|
|
488
|
+
input.subjectId,
|
|
489
|
+
payload.connectionId,
|
|
490
|
+
)
|
|
491
|
+
: null;
|
|
492
|
+
const scheme = runtime.authScheme;
|
|
493
|
+
const auth = !apiIntegrationRequiresConnection(scheme)
|
|
494
|
+
? { kind: "none" }
|
|
495
|
+
: scheme.kind === "oauth2"
|
|
496
|
+
? { kind: "oauth2", providerDomain: runtime.providerDomain, scopes: requiredScopes }
|
|
497
|
+
: scheme.kind === "api_key"
|
|
498
|
+
? {
|
|
499
|
+
kind: "api_key",
|
|
500
|
+
providerDomain: runtime.providerDomain,
|
|
501
|
+
carrier: scheme.carrier,
|
|
502
|
+
name: scheme.name,
|
|
503
|
+
}
|
|
504
|
+
: scheme.kind === "http"
|
|
505
|
+
? { kind: "http", providerDomain: runtime.providerDomain, scheme: scheme.scheme }
|
|
506
|
+
: null;
|
|
507
|
+
if (!auth) return null;
|
|
508
|
+
return {
|
|
509
|
+
preview: ApiIntegrationPreview.parse({
|
|
510
|
+
source: payload.source,
|
|
511
|
+
definitionId: runtime.definitionId,
|
|
512
|
+
definitionProvenance: runtime.definitionProvenance,
|
|
513
|
+
protocol: runtime.protocol,
|
|
514
|
+
capabilityId: runtime.capabilityId,
|
|
515
|
+
pluginKey: runtime.pluginKey,
|
|
516
|
+
serverId: baseServerId,
|
|
517
|
+
name,
|
|
518
|
+
description: runtime.description,
|
|
519
|
+
provider,
|
|
520
|
+
providerDomain: runtime.providerDomain,
|
|
521
|
+
baseUrl: runtime.baseUrl,
|
|
522
|
+
sourceUrl: runtime.sourceUrl,
|
|
523
|
+
revisionId: runtime.revision.id,
|
|
524
|
+
contentSha256: runtime.revision.contentSha256,
|
|
525
|
+
auth,
|
|
526
|
+
connectionId: connection?.id ?? null,
|
|
527
|
+
connectionOwnership: connection ? (connection.subjectId ? "personal" : "workspace") : null,
|
|
528
|
+
tools: runtime.revision.tools.map((tool) => ({
|
|
529
|
+
id: tool.id,
|
|
530
|
+
operationKey: tool.operationKey,
|
|
531
|
+
name: tool.name,
|
|
532
|
+
description: tool.description,
|
|
533
|
+
safety: tool.safety,
|
|
534
|
+
approvalMode: tool.approvalMode,
|
|
535
|
+
deprecated: tool.deprecated,
|
|
536
|
+
})),
|
|
537
|
+
warnings: [],
|
|
538
|
+
}),
|
|
539
|
+
revision: runtime.revision,
|
|
540
|
+
provider,
|
|
541
|
+
requiredScopes,
|
|
542
|
+
authScheme: runtime.authScheme,
|
|
543
|
+
};
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
/**
|
|
547
|
+
* Advisory preview check that the selected credential Connection delivers
|
|
548
|
+
* its secret where the API description says the provider reads it. Compares
|
|
549
|
+
* carrier and name only; never returns or logs a credential value. Install is
|
|
550
|
+
* unchanged: descriptions are often imprecise, so a mismatch warns instead of
|
|
551
|
+
* refusing a Connection the provider may actually accept.
|
|
552
|
+
*/
|
|
553
|
+
async function connectionCredentialPlacementWarnings(
|
|
554
|
+
deps: ApiRouteDeps,
|
|
555
|
+
workspaceId: string,
|
|
556
|
+
subjectId: string,
|
|
557
|
+
preview: ApiIntegrationPreview,
|
|
558
|
+
): Promise<string[]> {
|
|
559
|
+
if (!preview.connectionId || (preview.auth.kind !== "api_key" && preview.auth.kind !== "http")) {
|
|
560
|
+
return [];
|
|
561
|
+
}
|
|
562
|
+
const connection = await getConnectionMetadata(
|
|
563
|
+
deps.db,
|
|
564
|
+
workspaceId,
|
|
565
|
+
preview.connectionId,
|
|
566
|
+
subjectId,
|
|
567
|
+
);
|
|
568
|
+
if (!connection || connection.kind === "oauth2") return [];
|
|
569
|
+
let result: Awaited<ReturnType<ReturnType<typeof buildConnectionTokenResolver>>>;
|
|
570
|
+
try {
|
|
571
|
+
result = await buildConnectionTokenResolver(
|
|
572
|
+
deps.db,
|
|
573
|
+
deps.settings,
|
|
574
|
+
)({
|
|
575
|
+
workspaceId,
|
|
576
|
+
...(connection.subjectId ? { subjectId } : {}),
|
|
577
|
+
serverId: `preview_${connection.id}`,
|
|
578
|
+
connectionRef: {
|
|
579
|
+
connectionId: connection.id,
|
|
580
|
+
providerDomain: connection.providerDomain,
|
|
581
|
+
kind: connection.kind,
|
|
582
|
+
subjectScope: connection.subjectId ? "subject" : "workspace",
|
|
583
|
+
},
|
|
584
|
+
destinationUrl: preview.baseUrl,
|
|
585
|
+
credentialTarget: "http_api",
|
|
586
|
+
});
|
|
587
|
+
} catch {
|
|
588
|
+
return [];
|
|
589
|
+
}
|
|
590
|
+
if (result.status === "auth_needed") return [];
|
|
591
|
+
const expected =
|
|
592
|
+
preview.auth.kind === "api_key"
|
|
593
|
+
? { carrier: preview.auth.carrier, name: preview.auth.name }
|
|
594
|
+
: { carrier: "header" as const, name: "Authorization" };
|
|
595
|
+
const placements =
|
|
596
|
+
result.placements ??
|
|
597
|
+
Object.keys(result.headers).map((name) => ({ carrier: "header" as const, name }));
|
|
598
|
+
const matches = placements.some(
|
|
599
|
+
(placement) =>
|
|
600
|
+
placement.carrier === expected.carrier &&
|
|
601
|
+
(placement.carrier === "header"
|
|
602
|
+
? placement.name.toLowerCase() === expected.name.toLowerCase()
|
|
603
|
+
: placement.name === expected.name),
|
|
604
|
+
);
|
|
605
|
+
if (matches) return [];
|
|
606
|
+
const actual = placements
|
|
607
|
+
.slice(0, 3)
|
|
608
|
+
.map((placement) => `${placement.carrier} "${placement.name.slice(0, 64)}"`)
|
|
609
|
+
.join(", ");
|
|
610
|
+
return [
|
|
611
|
+
`The API description expects the credential in ${expected.carrier} "${expected.name.slice(0, 64)}", but the selected Connection sends it in ${actual}. Calls may be rejected as unauthenticated.`,
|
|
612
|
+
];
|
|
613
|
+
}
|
|
614
|
+
|
|
356
615
|
async function requireVisibleConnection(
|
|
357
616
|
deps: ApiRouteDeps,
|
|
358
617
|
workspaceId: string,
|