@opengeni/api-router 0.30.1 → 1.0.0
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 +3 -0
- package/dist/admission-trace.d.ts +8 -0
- package/dist/api-websocket.d.ts +18 -0
- package/dist/app.d.ts +50 -2
- package/dist/app.js +12 -1
- package/dist/artifact-catalog-cursor.d.ts +27 -0
- package/dist/auth/managed-auth-attempt-context.d.ts +10 -0
- package/dist/auth/managed-auth-rate-limits.d.ts +167 -0
- package/dist/auth/managed-auth-session-adapter.d.ts +6 -0
- package/dist/auth/managed-auth.d.ts +102 -3
- package/dist/auth/managed-email.d.ts +29 -0
- package/dist/auth/managed-sign-in-notifications.d.ts +4 -0
- package/dist/auth/new-signups-gate.d.ts +23 -0
- package/dist/auth/organization-user-setup.d.ts +80 -0
- package/dist/auth/signup-funnel-metrics.d.ts +44 -0
- package/dist/browser-controller-authority.d.ts +1 -61
- package/dist/browser-ephemeral.d.ts +5 -0
- package/dist/browser-state-authority.d.ts +1 -27
- package/dist/chunk-6TZ5LG3O.js +123948 -0
- package/dist/chunk-6TZ5LG3O.js.map +1 -0
- package/dist/chunk-OGQDXVXY.js +18 -0
- package/dist/chunk-OGQDXVXY.js.map +1 -0
- package/dist/claude-subscription-account-conflicts.d.ts +1 -0
- package/dist/claude-subscription-account-usage.d.ts +39 -0
- package/dist/claude-subscription-oauth.d.ts +25 -0
- package/dist/claude-subscription-profile.d.ts +9 -0
- package/dist/claude-subscription-usage.d.ts +44 -0
- package/dist/claude-workspace-connection.d.ts +15 -0
- package/dist/codemode.d.ts +32 -1
- package/dist/company-brain-okf.d.ts +24 -0
- package/dist/connected-machine-computer-access.d.ts +11 -0
- package/dist/connection-ownership.d.ts +54 -0
- package/dist/controller-data-plane.d.ts +32 -0
- package/dist/editable-artifact-office-import.d.ts +7 -4
- package/dist/editable-artifact-source-session.d.ts +3 -0
- package/dist/editable-artifact-websocket.d.ts +10 -18
- package/dist/editable-artifact-workspace-files.d.ts +1 -1
- package/dist/fatal-process-boundary.d.ts +25 -0
- package/dist/github-access.d.ts +31 -2
- package/dist/http/acting-person.d.ts +24 -0
- package/dist/http/api-contract-compat.d.ts +19 -0
- package/dist/http/api-error.d.ts +27 -1
- package/dist/http/cors.d.ts +17 -0
- package/dist/http/deprecation.d.ts +42 -0
- package/dist/http/interaction-control-error.d.ts +13 -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/request-body.d.ts +27 -0
- package/dist/http/request-source.d.ts +52 -0
- package/dist/http/sse.d.ts +17 -6
- package/dist/http/unmatched-route.d.ts +18 -0
- package/dist/http/user-content.d.ts +36 -0
- package/dist/http/websocket-upgrade-dispatch.d.ts +18 -0
- package/dist/index.d.ts +10 -3
- package/dist/index.js +1129 -166
- package/dist/index.js.map +1 -1
- package/dist/integration-endpoint-test.d.ts +20 -0
- package/dist/integrations/api-integrations.d.ts +2 -2
- package/dist/integrations/atlassian.d.ts +29 -3
- package/dist/integrations/connect-authority.d.ts +1 -0
- package/dist/integrations/connect-callback-return.d.ts +6 -0
- package/dist/integrations/fiken.d.ts +16 -2
- package/dist/integrations/github-app-connect.d.ts +47 -0
- package/dist/integrations/github-installation-proof.d.ts +3 -0
- package/dist/integrations/github-lens-connect.d.ts +116 -0
- package/dist/integrations/github-skill-source.d.ts +1 -5
- package/dist/integrations/google-drive.d.ts +25 -0
- package/dist/integrations/integration-commit-authority.d.ts +13 -0
- package/dist/integrations/marketplace-plugin.d.ts +2691 -0
- package/dist/integrations/oauth-client.d.ts +178 -18
- package/dist/integrations/oauth-profiles.d.ts +222 -0
- package/dist/integrations/oauth-return-path.d.ts +1 -0
- package/dist/integrations/personal-github-repositories.d.ts +84 -0
- package/dist/integrations/personal-github.d.ts +42 -0
- package/dist/integrations/pr-review-provider.d.ts +22 -0
- package/dist/integrations/provider-oauth.d.ts +19 -1
- package/dist/integrations/slack-app-home.d.ts +24 -0
- package/dist/integrations/slack-bot.d.ts +367 -12
- package/dist/integrations/slack-file-upload-flow.d.ts +62 -0
- package/dist/integrations/slack-install.d.ts +20 -0
- package/dist/integrations/slack-interactions.d.ts +113 -10
- package/dist/integrations/slack-mrkdwn.d.ts +41 -0
- package/dist/integrations/slack-routing.d.ts +120 -0
- package/dist/integrations/slack-session-defaults.d.ts +58 -0
- package/dist/integrations/slack-task-file-upload.d.ts +36 -0
- package/dist/integrations/social-oauth.d.ts +7 -0
- package/dist/interaction-agent-access.d.ts +15 -0
- package/dist/interaction-frame-proxy.d.ts +68 -0
- package/dist/interaction-metrics.d.ts +2 -0
- package/dist/mcp/action-catalog-types.d.ts +9 -0
- package/dist/mcp/action-catalog.gen.d.ts +2 -0
- package/dist/mcp/capability-account-readiness.d.ts +7 -0
- package/dist/mcp/child-read-evidence.d.ts +9 -0
- package/dist/mcp/command-read.d.ts +24 -0
- package/dist/mcp/company-profile-agent-admin.d.ts +44 -0
- package/dist/mcp/contract-input.d.ts +11 -0
- package/dist/mcp/documents.d.ts +7 -5
- package/dist/mcp/files.d.ts +2 -2
- package/dist/mcp/first-party-tool-permissions.d.ts +650 -0
- package/dist/mcp/knowledge-entries.d.ts +5 -0
- package/dist/mcp/orchestration-failure-diagnostic.d.ts +43 -0
- package/dist/mcp/receipts.d.ts +9 -0
- package/dist/mcp/request-abort.d.ts +19 -0
- package/dist/mcp/scheduled-task-input.d.ts +1189 -0
- package/dist/mcp/scheduled-task-view.d.ts +22 -4
- package/dist/mcp/server.d.ts +255 -3
- package/dist/mcp/session-event-view.d.ts +94 -0
- package/dist/mcp/session-view.d.ts +66 -2
- package/dist/mcp/session-wait.d.ts +174 -0
- package/dist/mcp-oauth.d.ts +52 -0
- package/dist/model-catalog.d.ts +11 -31
- package/dist/observability.d.ts +3 -1
- package/dist/organization-mcp.d.ts +52 -0
- package/dist/organization-recovery-notifications.d.ts +41 -0
- package/dist/routes/analytics-consent.d.ts +26 -0
- package/dist/routes/api-integrations.d.ts +25 -0
- package/dist/routes/api-keys.d.ts +17 -0
- package/dist/routes/artifact-catalog.d.ts +6 -0
- package/dist/routes/automations.d.ts +19 -0
- package/dist/routes/billing.d.ts +49 -0
- package/dist/routes/browser-sessions.d.ts +71 -3
- 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 +146 -0
- package/dist/routes/codex.d.ts +76 -2
- package/dist/routes/company-brain.d.ts +3 -0
- package/dist/routes/company-profile.d.ts +2 -1
- package/dist/routes/computer-sessions.d.ts +14 -0
- package/dist/routes/connect.d.ts +5 -0
- package/dist/routes/editable-artifacts.d.ts +2 -0
- package/dist/routes/external-identity-links.d.ts +6 -0
- package/dist/routes/feedback.d.ts +3 -0
- package/dist/routes/files.d.ts +4 -0
- package/dist/routes/github-browser-pages.d.ts +12 -0
- package/dist/routes/github.d.ts +2 -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 +30 -1
- package/dist/routes/knowledge.d.ts +3 -0
- package/dist/routes/managed-auth-session-sets.d.ts +26 -0
- package/dist/routes/managed-onboarding.d.ts +29 -0
- package/dist/routes/managed-sign-in-methods.d.ts +6 -0
- package/dist/routes/model-connection-access.d.ts +3 -0
- package/dist/routes/organization-integration-policy.d.ts +3 -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-providers.d.ts +3 -0
- package/dist/routes/organization-recovery.d.ts +19 -0
- package/dist/routes/organization-service-accounts.d.ts +3 -0
- package/dist/routes/organization-sessions.d.ts +26 -0
- package/dist/routes/personal-github-git-broker.d.ts +29 -0
- package/dist/routes/personal-github.d.ts +3 -0
- package/dist/routes/pr-review-github.d.ts +3 -0
- package/dist/routes/pr-review.d.ts +3 -0
- package/dist/routes/session-artifact-associations.d.ts +4 -0
- package/dist/routes/session-history-imports.d.ts +9 -0
- package/dist/routes/sessions.d.ts +44 -6
- package/dist/routes/skill-content.d.ts +4 -0
- package/dist/routes/skill-install-authority.d.ts +6 -0
- package/dist/routes/subscription-account-pools.d.ts +34 -0
- package/dist/routes/subscription-pool-access.d.ts +16 -0
- package/dist/routes/supergrok.d.ts +6 -1
- package/dist/routes/usage-allowances.d.ts +12 -0
- package/dist/routes/user-resource-authorities.d.ts +3 -0
- package/dist/routes/workspace-artifacts.d.ts +2 -1
- package/dist/routes/workspace-capture.d.ts +10 -2
- package/dist/routes/workspace-integrations.d.ts +35 -0
- package/dist/routes/workspace-learning.d.ts +3 -0
- package/dist/routes/workspace-model-providers.d.ts +4 -0
- package/dist/routes/workspaces.d.ts +29 -0
- package/dist/sandbox/auth-callout.d.ts +8 -0
- package/dist/sandbox/channel-a.d.ts +19 -1
- package/dist/sandbox/connection-authority.d.ts +3 -0
- package/dist/sandbox/enrollment.d.ts +9 -1
- package/dist/sandbox/machines.d.ts +5 -2
- package/dist/sandbox/metrics-ingestion.d.ts +28 -20
- package/dist/sandbox/rematerialize.d.ts +2 -0
- package/dist/sandbox/session-attach-variable-sets.d.ts +30 -0
- package/dist/sandbox/viewer.d.ts +26 -1
- package/dist/sandbox-file-artifacts.d.ts +50 -0
- package/dist/scheduled-task-deletion.d.ts +13 -0
- package/dist/session-create-observability.d.ts +5 -0
- package/dist/session-event-view-MPS2OZD3.js +292 -0
- package/dist/session-event-view-MPS2OZD3.js.map +1 -0
- package/dist/site-session-origin.d.ts +13 -0
- package/dist/site-uploads.d.ts +41 -0
- package/dist/slack-reaction-files.d.ts +1 -1
- package/dist/temporal-schedule-cleanup.d.ts +1 -0
- package/dist/temporal-schedule-sync.d.ts +26 -0
- package/dist/transcription/providers/xai-subscription.d.ts +1 -0
- package/dist/transcription/service.d.ts +2 -1
- package/dist/work-discovery-observability.d.ts +33 -0
- package/dist/workspace-artifact-content.d.ts +28 -0
- package/dist/workspace-artifact-provenance.d.ts +7 -0
- package/dist/workspace-delete-observability.d.ts +10 -0
- package/dist/workspace-deletion.d.ts +6 -0
- package/dist/workspace-state-projection.d.ts +3 -5
- package/dist/workspace-tool-gateway-observability.d.ts +17 -0
- package/dist/workspace-tool-gateway.d.ts +123 -0
- package/dist/workspace-webhook-dispatch.d.ts +26 -0
- package/package.json +23 -19
- package/src/access-grant-rls.ts +75 -0
- package/src/admission-trace.ts +14 -0
- package/src/api-websocket.ts +23 -0
- package/src/app.ts +1974 -256
- package/src/artifact-catalog-cursor.ts +60 -0
- package/src/auth/managed-auth-attempt-context.ts +70 -0
- package/src/auth/managed-auth-rate-limits.ts +252 -0
- package/src/auth/managed-auth-session-adapter.ts +222 -0
- package/src/auth/managed-auth.ts +536 -60
- package/src/auth/managed-email.ts +174 -0
- 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 +307 -0
- package/src/auth/signup-funnel-metrics.ts +164 -0
- package/src/browser-controller-authority.ts +1 -186
- package/src/browser-ephemeral.ts +39 -0
- package/src/browser-state-authority.ts +1 -236
- package/src/claude-subscription-account-conflicts.ts +12 -0
- package/src/claude-subscription-account-usage.ts +48 -0
- package/src/claude-subscription-oauth.ts +362 -0
- package/src/claude-subscription-profile.ts +73 -0
- package/src/claude-subscription-usage.ts +97 -0
- package/src/claude-workspace-connection.ts +82 -0
- package/src/codemode.ts +194 -30
- package/src/codex-realtime.ts +8 -2
- package/src/company-brain-okf.ts +340 -0
- package/src/connected-machine-computer-access.ts +33 -0
- package/src/connection-ownership.ts +199 -0
- package/src/controller-data-plane.ts +81 -0
- package/src/editable-artifact-native-kernel.ts +26 -15
- package/src/editable-artifact-office-import.ts +77 -9
- package/src/editable-artifact-production.ts +23 -7
- package/src/editable-artifact-source-session.ts +123 -0
- package/src/editable-artifact-websocket.ts +27 -21
- package/src/editable-artifact-workspace-files.ts +31 -6
- package/src/fatal-process-boundary.ts +246 -0
- package/src/gateway-realtime.ts +1 -1
- package/src/github-access.ts +147 -5
- package/src/http/acting-person.ts +71 -0
- package/src/http/api-contract-compat.ts +49 -0
- package/src/http/api-error.ts +115 -1
- package/src/http/auth.ts +48 -0
- package/src/http/cors.ts +67 -0
- package/src/http/deprecation.ts +118 -0
- package/src/http/interaction-control-error.ts +164 -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/request-body.ts +127 -0
- package/src/http/request-source.ts +178 -0
- package/src/http/sse.ts +486 -132
- package/src/http/unmatched-route.ts +60 -0
- package/src/http/user-content.ts +158 -0
- package/src/http/websocket-upgrade-dispatch.ts +29 -0
- package/src/index.ts +157 -52
- package/src/integration-endpoint-test.ts +291 -0
- package/src/integrations/api-integrations.ts +98 -11
- package/src/integrations/atlassian.ts +474 -136
- package/src/integrations/connect-authority.ts +2 -0
- package/src/integrations/connect-callback-return.ts +86 -0
- package/src/integrations/fiken.ts +354 -64
- package/src/integrations/github-app-connect.ts +435 -0
- package/src/integrations/github-installation-proof.ts +60 -0
- package/src/integrations/github-lens-connect.ts +76 -0
- package/src/integrations/github-skill-source.ts +2 -142
- package/src/integrations/google-drive.ts +820 -222
- package/src/integrations/integration-commit-authority.ts +69 -0
- package/src/integrations/marketplace-plugin.ts +48 -0
- package/src/integrations/oauth-client.ts +1356 -459
- package/src/integrations/oauth-profiles.ts +537 -0
- package/src/integrations/oauth-return-path.ts +18 -0
- package/src/integrations/personal-github-repositories.ts +674 -0
- package/src/integrations/personal-github.ts +825 -0
- package/src/integrations/pr-review-provider.ts +246 -0
- package/src/integrations/provider-oauth.ts +250 -22
- package/src/integrations/slack-app-home.ts +300 -0
- package/src/integrations/slack-bot.ts +963 -239
- package/src/integrations/slack-file-upload-flow.ts +147 -0
- package/src/integrations/slack-install.ts +83 -0
- package/src/integrations/slack-interactions.ts +3170 -474
- package/src/integrations/slack-mrkdwn.ts +193 -0
- package/src/integrations/slack-routing.ts +337 -0
- package/src/integrations/slack-session-defaults.ts +224 -0
- package/src/integrations/slack-task-file-upload.ts +323 -0
- package/src/integrations/social-oauth.ts +213 -15
- package/src/interaction-agent-access.ts +48 -0
- package/src/interaction-frame-proxy.ts +409 -0
- package/src/interaction-metrics.ts +30 -0
- package/src/mcp/action-catalog-types.ts +9 -0
- package/src/mcp/action-catalog.gen.ts +6696 -0
- package/src/mcp/capability-account-readiness.ts +17 -0
- package/src/mcp/child-read-evidence.ts +19 -0
- package/src/mcp/command-read.ts +109 -0
- package/src/mcp/company-profile-agent-admin.ts +198 -0
- package/src/mcp/contract-input.ts +141 -0
- package/src/mcp/documents.ts +65 -377
- package/src/mcp/editable-artifacts.ts +12 -6
- package/src/mcp/files.ts +80 -38
- package/src/mcp/first-party-tool-permissions.ts +305 -0
- package/src/mcp/knowledge-entries.ts +322 -0
- package/src/mcp/orchestration-failure-diagnostic.ts +43 -0
- package/src/mcp/receipts.ts +34 -0
- package/src/mcp/request-abort.ts +44 -0
- package/src/mcp/scheduled-task-input.ts +76 -0
- package/src/mcp/scheduled-task-view.ts +44 -3
- package/src/mcp/server.ts +3030 -1267
- package/src/mcp/session-event-view.ts +383 -0
- package/src/mcp/session-view.ts +84 -3
- package/src/mcp/session-wait.ts +665 -0
- package/src/mcp-oauth.ts +1123 -0
- package/src/model-catalog.ts +91 -333
- package/src/observability.ts +15 -1
- package/src/organization-mcp.ts +397 -0
- package/src/organization-recovery-notifications.ts +103 -0
- package/src/routes/analytics-consent.ts +123 -0
- package/src/routes/api-integrations.ts +364 -74
- package/src/routes/api-keys.ts +336 -10
- package/src/routes/artifact-catalog.ts +279 -0
- package/src/routes/automations.ts +768 -0
- package/src/routes/billing.ts +461 -46
- package/src/routes/browser-sessions.ts +839 -131
- package/src/routes/canonical-human-identities.ts +90 -14
- package/src/routes/capabilities.ts +107 -6
- package/src/routes/channels.ts +20 -3
- package/src/routes/claude-subscription-accounts.ts +334 -0
- package/src/routes/claude-subscription-oauth.ts +142 -0
- package/src/routes/client-errors.ts +362 -0
- package/src/routes/codex.ts +833 -116
- package/src/routes/company-brain.ts +322 -0
- package/src/routes/company-profile.ts +65 -1
- package/src/routes/computer-sessions.ts +557 -106
- package/src/routes/connect.ts +1938 -0
- package/src/routes/connections.ts +1040 -349
- package/src/routes/documents.ts +488 -287
- package/src/routes/editable-artifacts.ts +79 -9
- package/src/routes/enrollments.ts +135 -39
- package/src/routes/environments.ts +154 -58
- package/src/routes/external-identity-links.ts +201 -0
- package/src/routes/feedback.ts +113 -0
- package/src/routes/files.ts +337 -39
- package/src/routes/github-browser-pages.ts +162 -0
- package/src/routes/github.ts +446 -144
- package/src/routes/insights-response-cache.ts +83 -0
- package/src/routes/insights-usage.ts +345 -0
- package/src/routes/insights.ts +153 -19
- package/src/routes/install.ts +133 -38
- package/src/routes/integration-facets.ts +107 -33
- package/src/routes/interaction-resources.ts +30 -3
- package/src/routes/knowledge.ts +488 -0
- package/src/routes/machines.ts +313 -15
- package/src/routes/managed-auth-session-sets.ts +1218 -0
- package/src/routes/managed-onboarding.ts +337 -0
- package/src/routes/managed-sign-in-methods.ts +433 -0
- package/src/routes/memory-slack-publications.ts +3 -2
- package/src/routes/model-connection-access.ts +208 -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 +178 -0
- package/src/routes/organization-memberships.ts +1019 -27
- package/src/routes/organization-model-providers.ts +293 -0
- package/src/routes/organization-recovery.ts +325 -0
- package/src/routes/organization-service-accounts.ts +128 -0
- package/src/routes/organization-sessions.ts +350 -0
- package/src/routes/personal-github-git-broker.ts +785 -0
- package/src/routes/personal-github.ts +370 -0
- package/src/routes/plugins.ts +251 -22
- package/src/routes/pr-review-github.ts +881 -0
- package/src/routes/pr-review.ts +622 -0
- package/src/routes/preference-registry.ts +12 -93
- package/src/routes/rigs.ts +167 -50
- package/src/routes/scheduled-tasks.ts +346 -41
- package/src/routes/session-artifact-associations.ts +87 -0
- package/src/routes/session-history-imports.ts +280 -0
- package/src/routes/sessions.ts +2306 -264
- package/src/routes/skill-content.ts +297 -0
- package/src/routes/skill-install-authority.ts +64 -0
- package/src/routes/skills.ts +62 -9
- package/src/routes/social.ts +46 -18
- package/src/routes/subscription-account-pools.ts +436 -0
- package/src/routes/subscription-pool-access.ts +126 -0
- package/src/routes/supergrok.ts +219 -303
- package/src/routes/transcription-recordings.ts +38 -3
- package/src/routes/transcriptions.ts +4 -0
- package/src/routes/usage-allowances.ts +378 -0
- package/src/routes/user-resource-authorities.ts +138 -0
- package/src/routes/video-generation.ts +14 -10
- package/src/routes/workspace-artifacts.ts +275 -69
- package/src/routes/workspace-capture.ts +21 -0
- package/src/routes/workspace-integrations.ts +576 -0
- package/src/routes/workspace-learning.ts +159 -0
- package/src/routes/workspace-model-providers.ts +148 -0
- package/src/routes/workspace-state.ts +38 -25
- package/src/routes/workspaces.ts +1004 -127
- package/src/sandbox/auth-callout.ts +96 -19
- package/src/sandbox/channel-a.ts +323 -24
- package/src/sandbox/connection-authority.ts +3 -0
- package/src/sandbox/enrollment.ts +81 -6
- package/src/sandbox/machines.ts +218 -76
- package/src/sandbox/metrics-ingestion.ts +411 -62
- package/src/sandbox/rematerialize.ts +121 -19
- package/src/sandbox/session-attach-variable-sets.ts +131 -0
- package/src/sandbox/viewer.ts +280 -25
- package/src/sandbox-file-artifacts.ts +413 -0
- package/src/scheduled-task-deletion.ts +138 -0
- package/src/session-create-observability.ts +46 -0
- package/src/session-realtime-context.ts +6 -3
- package/src/site-session-origin.ts +48 -0
- package/src/site-uploads.ts +224 -0
- package/src/slack-reaction-files.ts +16 -5
- package/src/temporal-schedule-cleanup.ts +13 -0
- package/src/temporal-schedule-sync.ts +74 -0
- package/src/transcription/providers/codex-subscription.ts +2 -0
- package/src/transcription/providers/openai.ts +1 -0
- package/src/transcription/providers/xai-subscription.ts +49 -3
- package/src/transcription/segmenter.ts +8 -2
- package/src/transcription/service.ts +43 -6
- package/src/work-discovery-observability.ts +121 -0
- package/src/workspace-artifact-content.ts +144 -0
- package/src/workspace-artifact-provenance.ts +104 -0
- package/src/workspace-delete-observability.ts +75 -0
- package/src/workspace-deletion.ts +73 -0
- package/src/workspace-state-projection.ts +18 -148
- package/src/workspace-tool-gateway-observability.ts +100 -0
- package/src/workspace-tool-gateway.ts +870 -0
- package/src/workspace-webhook-dispatch.ts +190 -0
- package/src/xai-subscription-auth.ts +9 -2
- package/dist/chunk-2PQMSRCB.js +0 -49759
- package/dist/chunk-2PQMSRCB.js.map +0 -1
- package/dist/routes/packs.d.ts +0 -3
- package/src/routes/packs.ts +0 -729
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CredentialProviderResponse,
|
|
3
|
+
OPENGENI_SIGNATURE_HEADER,
|
|
4
|
+
signOpenGeniPayload,
|
|
5
|
+
type IntegrationEndpointTestResult,
|
|
6
|
+
} from "@opengeni/contracts";
|
|
7
|
+
import {
|
|
8
|
+
DestinationPolicyError,
|
|
9
|
+
pinnedFetch,
|
|
10
|
+
type OutboundNetworkSettings,
|
|
11
|
+
} from "@opengeni/network";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* One synchronous, signed test request to an integration endpoint, sent
|
|
15
|
+
* through the same pinned outbound policy as real deliveries. Nothing is
|
|
16
|
+
* stored. A provider's credential values never leave this function: only
|
|
17
|
+
* their names are returned.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
const RESPONSE_EXCERPT_BYTES = 1024;
|
|
21
|
+
/** A provider answer is parsed in full, like a real run's (5 MiB). */
|
|
22
|
+
const PROVIDER_RESPONSE_BYTES = 5 * 1024 * 1024;
|
|
23
|
+
|
|
24
|
+
export type IntegrationEndpointTestInput = {
|
|
25
|
+
kind: "webhook" | "credential-provider";
|
|
26
|
+
url: string;
|
|
27
|
+
secret: string;
|
|
28
|
+
/** The exact body to sign and send. */
|
|
29
|
+
body: string;
|
|
30
|
+
/** Extra identity headers (the webhook event id). */
|
|
31
|
+
headers?: Record<string, string>;
|
|
32
|
+
timeoutMs: number;
|
|
33
|
+
settings: OutboundNetworkSettings;
|
|
34
|
+
fetch?: typeof pinnedFetch;
|
|
35
|
+
now?: () => number;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
function causeCode(error: unknown): string | null {
|
|
39
|
+
let current: unknown = error;
|
|
40
|
+
for (let depth = 0; depth < 4 && current && typeof current === "object"; depth += 1) {
|
|
41
|
+
const code = (current as { code?: unknown }).code;
|
|
42
|
+
if (typeof code === "string") return code;
|
|
43
|
+
current = (current as { cause?: unknown }).cause;
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** What went wrong reaching the endpoint, in words an administrator can act on. */
|
|
49
|
+
export function integrationTestNetworkError(error: unknown): string {
|
|
50
|
+
if (error instanceof DestinationPolicyError) {
|
|
51
|
+
if (error.reason === "https_required") return "The URL must use https.";
|
|
52
|
+
if (error.reason === "dns_failed" || error.reason === "dns_empty") {
|
|
53
|
+
return "The hostname couldn't be resolved. Check the URL.";
|
|
54
|
+
}
|
|
55
|
+
if (error.reason === "private_or_special_use") {
|
|
56
|
+
return "The URL points to a private network address, which this server doesn't allow.";
|
|
57
|
+
}
|
|
58
|
+
return `${error.message}.`;
|
|
59
|
+
}
|
|
60
|
+
if (error instanceof Error && (error.name === "TimeoutError" || error.name === "AbortError")) {
|
|
61
|
+
return "The endpoint didn't answer in time.";
|
|
62
|
+
}
|
|
63
|
+
switch (causeCode(error)) {
|
|
64
|
+
case "ECONNREFUSED":
|
|
65
|
+
return "The connection was refused. Check that the service is running.";
|
|
66
|
+
case "ECONNRESET":
|
|
67
|
+
return "The connection was reset before the endpoint answered.";
|
|
68
|
+
case "ENOTFOUND":
|
|
69
|
+
case "EAI_AGAIN":
|
|
70
|
+
return "The hostname couldn't be resolved. Check the URL.";
|
|
71
|
+
case "CERT_HAS_EXPIRED":
|
|
72
|
+
case "DEPTH_ZERO_SELF_SIGNED_CERT":
|
|
73
|
+
case "SELF_SIGNED_CERT_IN_CHAIN":
|
|
74
|
+
case "UNABLE_TO_VERIFY_LEAF_SIGNATURE":
|
|
75
|
+
case "ERR_TLS_CERT_ALTNAME_INVALID":
|
|
76
|
+
return "The endpoint's TLS certificate isn't trusted.";
|
|
77
|
+
default:
|
|
78
|
+
return "The endpoint couldn't be reached.";
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
async function readUpTo(
|
|
83
|
+
response: Response,
|
|
84
|
+
maxBytes: number,
|
|
85
|
+
): Promise<{ text: string; truncated: boolean }> {
|
|
86
|
+
const reader = response.body?.getReader();
|
|
87
|
+
if (!reader) return { text: "", truncated: false };
|
|
88
|
+
const chunks: Uint8Array[] = [];
|
|
89
|
+
let total = 0;
|
|
90
|
+
let truncated = false;
|
|
91
|
+
for (;;) {
|
|
92
|
+
const { done, value } = await reader.read();
|
|
93
|
+
if (done) break;
|
|
94
|
+
if (total + value.byteLength > maxBytes) {
|
|
95
|
+
chunks.push(value.subarray(0, maxBytes - total));
|
|
96
|
+
total = maxBytes;
|
|
97
|
+
truncated = true;
|
|
98
|
+
await reader.cancel().catch(() => undefined);
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
chunks.push(value);
|
|
102
|
+
total += value.byteLength;
|
|
103
|
+
}
|
|
104
|
+
return { text: new TextDecoder().decode(Buffer.concat(chunks)), truncated };
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function excerpt(text: string, truncated: boolean): string | null {
|
|
108
|
+
const trimmed = text.trim();
|
|
109
|
+
if (!trimmed) return null;
|
|
110
|
+
const bounded = new TextDecoder().decode(
|
|
111
|
+
new TextEncoder().encode(trimmed).subarray(0, RESPONSE_EXCERPT_BYTES),
|
|
112
|
+
);
|
|
113
|
+
return truncated || bounded.length < trimmed.length ? `${bounded}…` : bounded;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/** The names of what a run would receive. Values are dropped here. */
|
|
117
|
+
export function credentialProviderTestSummary(
|
|
118
|
+
response: CredentialProviderResponse,
|
|
119
|
+
): NonNullable<IntegrationEndpointTestResult["credentials"]> {
|
|
120
|
+
const authNeeded = (response.status === "not_applicable" ? [] : (response.authNeeded ?? [])).map(
|
|
121
|
+
(entry) => ({
|
|
122
|
+
reason: entry.reason,
|
|
123
|
+
providerDomain: entry.providerDomain ?? null,
|
|
124
|
+
message: entry.message ?? null,
|
|
125
|
+
}),
|
|
126
|
+
);
|
|
127
|
+
if (response.status !== "ok") {
|
|
128
|
+
return {
|
|
129
|
+
status: response.status,
|
|
130
|
+
environment: [],
|
|
131
|
+
files: [],
|
|
132
|
+
git: [],
|
|
133
|
+
mcp: [],
|
|
134
|
+
expiresAt: null,
|
|
135
|
+
authNeeded,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
return {
|
|
139
|
+
status: "ok",
|
|
140
|
+
environment: Object.keys(response.environment ?? {}).sort(),
|
|
141
|
+
files: (response.files ?? []).map((file) => file.path),
|
|
142
|
+
git: (response.git ?? []).map((entry) => entry.host.toLowerCase()),
|
|
143
|
+
mcp: (response.mcp ?? []).map((entry) => entry.url),
|
|
144
|
+
expiresAt: response.expiresAt ?? null,
|
|
145
|
+
authNeeded,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function statusAdvice(kind: IntegrationEndpointTestInput["kind"], status: number): string {
|
|
150
|
+
if (status >= 300 && status < 400) {
|
|
151
|
+
return `The endpoint answered HTTP ${status}. Redirects aren't followed: use the final URL.`;
|
|
152
|
+
}
|
|
153
|
+
if (status === 401 || status === 403) {
|
|
154
|
+
return `The endpoint refused the request (HTTP ${status}). Check that it verifies with this ${
|
|
155
|
+
kind === "webhook" ? "webhook's" : "provider's"
|
|
156
|
+
} signing secret.`;
|
|
157
|
+
}
|
|
158
|
+
if (status === 404 || status === 405) {
|
|
159
|
+
return `The endpoint answered HTTP ${status}. Check the URL and that it accepts POST.`;
|
|
160
|
+
}
|
|
161
|
+
return `The endpoint answered HTTP ${status}.`;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export async function sendIntegrationEndpointTest(
|
|
165
|
+
input: IntegrationEndpointTestInput,
|
|
166
|
+
): Promise<IntegrationEndpointTestResult> {
|
|
167
|
+
const now = input.now ?? Date.now;
|
|
168
|
+
const started = now();
|
|
169
|
+
const elapsed = () => Math.max(0, Math.round(now() - started));
|
|
170
|
+
const base = { request: input.body, credentials: null };
|
|
171
|
+
let response: Response;
|
|
172
|
+
try {
|
|
173
|
+
response = await (input.fetch ?? pinnedFetch)(
|
|
174
|
+
input.url,
|
|
175
|
+
{
|
|
176
|
+
method: "POST",
|
|
177
|
+
headers: {
|
|
178
|
+
"content-type": "application/json",
|
|
179
|
+
"user-agent":
|
|
180
|
+
input.kind === "webhook" ? "OpenGeni-Webhooks/1" : "OpenGeni-CredentialProvider/1",
|
|
181
|
+
[OPENGENI_SIGNATURE_HEADER]: await signOpenGeniPayload(input.secret, input.body),
|
|
182
|
+
...input.headers,
|
|
183
|
+
},
|
|
184
|
+
body: input.body,
|
|
185
|
+
signal: AbortSignal.timeout(input.timeoutMs),
|
|
186
|
+
},
|
|
187
|
+
input.settings,
|
|
188
|
+
{
|
|
189
|
+
label: input.kind === "webhook" ? "Webhook" : "Credential provider",
|
|
190
|
+
requireHttpsOutsideLocalTest: true,
|
|
191
|
+
},
|
|
192
|
+
);
|
|
193
|
+
} catch (error) {
|
|
194
|
+
return {
|
|
195
|
+
...base,
|
|
196
|
+
ok: false,
|
|
197
|
+
status: null,
|
|
198
|
+
durationMs: elapsed(),
|
|
199
|
+
error: integrationTestNetworkError(error),
|
|
200
|
+
responseBody: null,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
const status = response.status;
|
|
204
|
+
const success = status >= 200 && status < 300;
|
|
205
|
+
let read: { text: string; truncated: boolean };
|
|
206
|
+
try {
|
|
207
|
+
read = await readUpTo(
|
|
208
|
+
response,
|
|
209
|
+
success && input.kind === "credential-provider"
|
|
210
|
+
? PROVIDER_RESPONSE_BYTES
|
|
211
|
+
: RESPONSE_EXCERPT_BYTES,
|
|
212
|
+
);
|
|
213
|
+
} catch (error) {
|
|
214
|
+
return {
|
|
215
|
+
...base,
|
|
216
|
+
ok: false,
|
|
217
|
+
status,
|
|
218
|
+
durationMs: elapsed(),
|
|
219
|
+
error: integrationTestNetworkError(error),
|
|
220
|
+
responseBody: null,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
const durationMs = elapsed();
|
|
224
|
+
if (!success) {
|
|
225
|
+
return {
|
|
226
|
+
...base,
|
|
227
|
+
ok: false,
|
|
228
|
+
status,
|
|
229
|
+
durationMs,
|
|
230
|
+
error: statusAdvice(input.kind, status),
|
|
231
|
+
responseBody: excerpt(read.text, read.truncated),
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
if (input.kind === "webhook") {
|
|
235
|
+
return {
|
|
236
|
+
...base,
|
|
237
|
+
ok: true,
|
|
238
|
+
status,
|
|
239
|
+
durationMs,
|
|
240
|
+
error: null,
|
|
241
|
+
responseBody: excerpt(read.text, read.truncated),
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
// A successful provider answer may carry credentials: never echo its bytes.
|
|
245
|
+
if (read.truncated) {
|
|
246
|
+
return {
|
|
247
|
+
...base,
|
|
248
|
+
ok: false,
|
|
249
|
+
status,
|
|
250
|
+
durationMs,
|
|
251
|
+
error: "The answer is larger than 5 MB.",
|
|
252
|
+
responseBody: null,
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
let json: unknown;
|
|
256
|
+
try {
|
|
257
|
+
json = JSON.parse(read.text);
|
|
258
|
+
} catch {
|
|
259
|
+
return {
|
|
260
|
+
...base,
|
|
261
|
+
ok: false,
|
|
262
|
+
status,
|
|
263
|
+
durationMs,
|
|
264
|
+
error:
|
|
265
|
+
'The answer isn\'t JSON. Return a credential response such as {"status":"not_applicable"}.',
|
|
266
|
+
responseBody: null,
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
const parsed = CredentialProviderResponse.safeParse(json);
|
|
270
|
+
if (!parsed.success) {
|
|
271
|
+
const issue = parsed.error.issues[0];
|
|
272
|
+
const where = issue?.path.length ? ` at ${issue.path.join(".")}` : "";
|
|
273
|
+
return {
|
|
274
|
+
...base,
|
|
275
|
+
ok: false,
|
|
276
|
+
status,
|
|
277
|
+
durationMs,
|
|
278
|
+
error: `The answer isn't a valid credential response${where}: ${issue?.message ?? "invalid"}.`,
|
|
279
|
+
responseBody: null,
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
return {
|
|
283
|
+
...base,
|
|
284
|
+
ok: true,
|
|
285
|
+
status,
|
|
286
|
+
durationMs,
|
|
287
|
+
error: null,
|
|
288
|
+
responseBody: null,
|
|
289
|
+
credentials: credentialProviderTestSummary(parsed.data),
|
|
290
|
+
};
|
|
291
|
+
}
|
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
googleDiscoveryToOpenApi,
|
|
11
11
|
integrationDefinitionById,
|
|
12
12
|
parseOpenApiDocument,
|
|
13
|
+
MAX_CURATED_INTEGRATION_SPEC_BYTES,
|
|
13
14
|
type IntegrationCredentialResolver,
|
|
14
15
|
type IntegrationInvocationAuthority,
|
|
15
16
|
type IntegrationTransport,
|
|
@@ -18,12 +19,12 @@ import {
|
|
|
18
19
|
import {
|
|
19
20
|
ApiIntegrationPreview,
|
|
20
21
|
type ApiIntegrationAuthPreview,
|
|
21
|
-
type
|
|
22
|
+
type InlineOpenApiDocumentSource,
|
|
23
|
+
type IntegrationSourceInput,
|
|
24
|
+
type IntegrationSourceProjection,
|
|
22
25
|
} from "@opengeni/contracts";
|
|
23
26
|
import type { StoredApiIntegrationRevision } from "@opengeni/db";
|
|
24
27
|
|
|
25
|
-
const MAX_CURATED_DEFINITION_SOURCE_BYTES = 64 * 1024 * 1024;
|
|
26
|
-
|
|
27
28
|
export type ApiIntegrationConnectionDescriptor = {
|
|
28
29
|
id: string;
|
|
29
30
|
kind: "oauth2" | "api_key" | "app_install" | "delegated";
|
|
@@ -41,7 +42,7 @@ export type ResolvedApiIntegrationPreview = {
|
|
|
41
42
|
};
|
|
42
43
|
|
|
43
44
|
export async function resolveApiIntegrationPreview(input: {
|
|
44
|
-
source:
|
|
45
|
+
source: IntegrationSourceInput;
|
|
45
46
|
connection: ApiIntegrationConnectionDescriptor | null;
|
|
46
47
|
transport: IntegrationTransport;
|
|
47
48
|
credentialResolver?: IntegrationCredentialResolver;
|
|
@@ -56,6 +57,9 @@ export async function resolveApiIntegrationPreview(input: {
|
|
|
56
57
|
if (input.source.kind === "openapi") {
|
|
57
58
|
return await resolveOpenApi(input, input.source.url, input.source.baseUrl);
|
|
58
59
|
}
|
|
60
|
+
if (input.source.kind === "openapi_document") {
|
|
61
|
+
return resolveInlineOpenApiDocument(input, input.source);
|
|
62
|
+
}
|
|
59
63
|
let openApiFailure: unknown;
|
|
60
64
|
try {
|
|
61
65
|
return await resolveOpenApi(input, input.source.url, input.source.baseUrl);
|
|
@@ -86,13 +90,18 @@ async function resolveDefinition(
|
|
|
86
90
|
const bytes = await fetchIntegrationSourceDocument(
|
|
87
91
|
input.transport,
|
|
88
92
|
definition.source.url,
|
|
89
|
-
|
|
93
|
+
MAX_CURATED_INTEGRATION_SPEC_BYTES,
|
|
90
94
|
);
|
|
91
95
|
let document: Record<string, unknown>;
|
|
92
96
|
if (definition.source.kind === "google_discovery") {
|
|
93
97
|
document = googleDiscoveryToOpenApi(JSON.parse(new TextDecoder().decode(bytes)));
|
|
94
98
|
} else {
|
|
95
|
-
document = filterOpenApiDocumentForDefinition(
|
|
99
|
+
document = filterOpenApiDocumentForDefinition(
|
|
100
|
+
parseOpenApiDocument(bytes, {
|
|
101
|
+
maxBytes: MAX_CURATED_INTEGRATION_SPEC_BYTES,
|
|
102
|
+
}),
|
|
103
|
+
definition,
|
|
104
|
+
);
|
|
96
105
|
}
|
|
97
106
|
const identity = integrationInstallationIdentity("openapi", definition.id, definition.source.url);
|
|
98
107
|
const revision = compileOpenApiRevision(document, {
|
|
@@ -100,6 +109,9 @@ async function resolveDefinition(
|
|
|
100
109
|
sourceUrl: definition.source.url,
|
|
101
110
|
baseUrl: definition.baseUrl,
|
|
102
111
|
provider: definition.provider.id,
|
|
112
|
+
...(definition.source.kind === "openapi" && definition.source.schemaMode
|
|
113
|
+
? { schemaMode: definition.source.schemaMode }
|
|
114
|
+
: {}),
|
|
103
115
|
});
|
|
104
116
|
const baseUrl = firstOpenApiServerUrl(revision);
|
|
105
117
|
const providerDomain = definition.provider.domain;
|
|
@@ -109,7 +121,7 @@ async function resolveDefinition(
|
|
|
109
121
|
scopes: [...definition.authentication.scopes],
|
|
110
122
|
};
|
|
111
123
|
return resolvedPreview({
|
|
112
|
-
source: input.source,
|
|
124
|
+
source: storedSourceProjection(input.source),
|
|
113
125
|
definitionId: definition.id,
|
|
114
126
|
definitionProvenance: "curated",
|
|
115
127
|
identity,
|
|
@@ -153,7 +165,7 @@ async function resolveOpenApi(
|
|
|
153
165
|
const discovered = discoverOpenApiAuth(document);
|
|
154
166
|
const auth = authPreview(discovered, providerDomain, input.connection);
|
|
155
167
|
return resolvedPreview({
|
|
156
|
-
source: input.source,
|
|
168
|
+
source: storedSourceProjection(input.source),
|
|
157
169
|
definitionId: identity.sourceDerivedDefinitionId,
|
|
158
170
|
definitionProvenance: "workspace",
|
|
159
171
|
identity,
|
|
@@ -171,6 +183,75 @@ async function resolveOpenApi(
|
|
|
171
183
|
});
|
|
172
184
|
}
|
|
173
185
|
|
|
186
|
+
/** URL/definition sources echo exactly; inline documents never reach here. */
|
|
187
|
+
function storedSourceProjection(source: IntegrationSourceInput): IntegrationSourceProjection {
|
|
188
|
+
if (source.kind === "openapi_document") {
|
|
189
|
+
throw new Error("Inline OpenAPI documents are projected by their digest");
|
|
190
|
+
}
|
|
191
|
+
return source;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* An inline document has no URL: identity comes from the caller's stable
|
|
196
|
+
* `sourceKey`, relative server URLs cannot resolve (absolute servers or
|
|
197
|
+
* `baseUrl` are required), and the preview echoes only the document digest.
|
|
198
|
+
* Execution uses the same pinned transport and network policy as any other
|
|
199
|
+
* custom Integration.
|
|
200
|
+
*/
|
|
201
|
+
function resolveInlineOpenApiDocument(
|
|
202
|
+
input: Parameters<typeof resolveApiIntegrationPreview>[0],
|
|
203
|
+
source: InlineOpenApiDocumentSource,
|
|
204
|
+
): ResolvedApiIntegrationPreview {
|
|
205
|
+
const document = parseOpenApiDocument(source.document);
|
|
206
|
+
const identity = integrationInstallationIdentity(
|
|
207
|
+
"openapi",
|
|
208
|
+
source.sourceKey,
|
|
209
|
+
`document:${source.sourceKey}`,
|
|
210
|
+
);
|
|
211
|
+
let revision: ReturnType<typeof compileOpenApiRevision>;
|
|
212
|
+
try {
|
|
213
|
+
revision = compileOpenApiRevision(document, {
|
|
214
|
+
definitionId: identity.sourceDerivedDefinitionId,
|
|
215
|
+
...(source.baseUrl ? { baseUrl: source.baseUrl } : {}),
|
|
216
|
+
});
|
|
217
|
+
} catch (error) {
|
|
218
|
+
const code = (error as { code?: unknown }).code;
|
|
219
|
+
if (code === "openapi_server_invalid" || code === "openapi_server_missing") {
|
|
220
|
+
throw new Error(
|
|
221
|
+
"An inline OpenAPI document needs absolute servers[].url values or an explicit baseUrl",
|
|
222
|
+
{ cause: error },
|
|
223
|
+
);
|
|
224
|
+
}
|
|
225
|
+
throw error;
|
|
226
|
+
}
|
|
227
|
+
const resolvedBaseUrl = firstOpenApiServerUrl(revision);
|
|
228
|
+
const providerDomain = new URL(resolvedBaseUrl).hostname.toLowerCase();
|
|
229
|
+
const discovered = discoverOpenApiAuth(document);
|
|
230
|
+
const auth = authPreview(discovered, providerDomain, input.connection);
|
|
231
|
+
return resolvedPreview({
|
|
232
|
+
source: {
|
|
233
|
+
kind: "openapi_document",
|
|
234
|
+
sourceKey: source.sourceKey,
|
|
235
|
+
documentSha256: createHash("sha256").update(source.document, "utf8").digest("hex"),
|
|
236
|
+
...(source.baseUrl ? { baseUrl: source.baseUrl } : {}),
|
|
237
|
+
},
|
|
238
|
+
definitionId: identity.sourceDerivedDefinitionId,
|
|
239
|
+
definitionProvenance: "workspace",
|
|
240
|
+
identity,
|
|
241
|
+
revision,
|
|
242
|
+
provider: null,
|
|
243
|
+
providerDomain,
|
|
244
|
+
baseUrl: resolvedBaseUrl,
|
|
245
|
+
sourceUrl: null,
|
|
246
|
+
name: revision.title,
|
|
247
|
+
description: revision.description ?? null,
|
|
248
|
+
auth,
|
|
249
|
+
connection: input.connection,
|
|
250
|
+
requiredScopes: auth.kind === "oauth2" ? auth.scopes : [],
|
|
251
|
+
authScheme: discovered,
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
|
|
174
255
|
async function resolveGraphql(
|
|
175
256
|
input: Parameters<typeof resolveApiIntegrationPreview>[0],
|
|
176
257
|
endpoint: string,
|
|
@@ -194,7 +275,7 @@ async function resolveGraphql(
|
|
|
194
275
|
? connectionAuthPreview(input.connection, providerDomain)
|
|
195
276
|
: ({ kind: "none" } as const);
|
|
196
277
|
return resolvedPreview({
|
|
197
|
-
source: input.source,
|
|
278
|
+
source: storedSourceProjection(input.source),
|
|
198
279
|
definitionId: identity.sourceDerivedDefinitionId,
|
|
199
280
|
definitionProvenance: "workspace",
|
|
200
281
|
identity,
|
|
@@ -213,7 +294,7 @@ async function resolveGraphql(
|
|
|
213
294
|
}
|
|
214
295
|
|
|
215
296
|
function resolvedPreview(input: {
|
|
216
|
-
source:
|
|
297
|
+
source: IntegrationSourceProjection;
|
|
217
298
|
definitionId: string;
|
|
218
299
|
definitionProvenance: "curated" | "workspace";
|
|
219
300
|
identity: ReturnType<typeof integrationInstallationIdentity>;
|
|
@@ -221,7 +302,7 @@ function resolvedPreview(input: {
|
|
|
221
302
|
provider: string | null;
|
|
222
303
|
providerDomain: string;
|
|
223
304
|
baseUrl: string;
|
|
224
|
-
sourceUrl: string;
|
|
305
|
+
sourceUrl: string | null;
|
|
225
306
|
name: string;
|
|
226
307
|
description: string | null;
|
|
227
308
|
auth: ApiIntegrationAuthPreview;
|
|
@@ -229,6 +310,12 @@ function resolvedPreview(input: {
|
|
|
229
310
|
requiredScopes: string[];
|
|
230
311
|
authScheme: Record<string, unknown>;
|
|
231
312
|
}): ResolvedApiIntegrationPreview {
|
|
313
|
+
// Include whitespace headroom for PostgreSQL jsonb::text when estimating size.
|
|
314
|
+
// The database constraint remains authoritative. Refuse during preview,
|
|
315
|
+
// before the execute-once installation claims an operation it cannot persist.
|
|
316
|
+
if (Buffer.byteLength(JSON.stringify(input.revision, null, 2), "utf8") > 4 * 1024 * 1024) {
|
|
317
|
+
throw new Error("Compiled integration exceeds the supported 4 MiB storage limit");
|
|
318
|
+
}
|
|
232
319
|
const deprecated = input.revision.tools.filter((tool) => tool.deprecated).length;
|
|
233
320
|
const warnings = [
|
|
234
321
|
...(deprecated > 0
|