@opengeni/api-router 3.0.1 → 3.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/access-grant-rls.d.ts +8 -1
- package/dist/admission-trace.d.ts +8 -0
- package/dist/app.d.ts +50 -3
- package/dist/app.js +10 -1
- package/dist/artifact-catalog-cursor.d.ts +1 -0
- package/dist/attached-browser-viewer.d.ts +11 -0
- package/dist/auth/managed-auth-attempt-context.d.ts +2 -0
- package/dist/auth/managed-auth-rate-limits.d.ts +167 -0
- package/dist/auth/managed-auth-session-adapter.d.ts +9 -1
- package/dist/auth/managed-auth.d.ts +72 -5
- package/dist/auth/managed-sign-in-notifications.d.ts +4 -0
- package/dist/auth/new-signups-gate.d.ts +23 -0
- package/dist/auth/signup-funnel-metrics.d.ts +44 -0
- package/dist/azure-live.d.ts +28 -0
- package/dist/browser-action-fences.d.ts +13 -0
- package/dist/browser-controller-authority.d.ts +1 -61
- package/dist/browser-ephemeral.d.ts +5 -0
- package/dist/browser-lost-runtime-end.d.ts +24 -0
- package/dist/browser-state-authority.d.ts +1 -27
- package/dist/chunk-OGQDXVXY.js +18 -0
- package/dist/chunk-OGQDXVXY.js.map +1 -0
- package/dist/{chunk-AJ62T5QN.js → chunk-OT56OY4V.js} +80503 -39869
- package/dist/chunk-OT56OY4V.js.map +1 -0
- package/dist/claude-default-models.d.ts +19 -0
- package/dist/claude-subscription-core.d.ts +50 -0
- package/dist/claude-subscription-oauth.d.ts +36 -0
- package/dist/claude-subscription-profile.d.ts +9 -0
- package/dist/claude-subscription-usage.d.ts +6 -0
- package/dist/claude-workspace-connection.d.ts +15 -0
- package/dist/codemode.d.ts +40 -5
- package/dist/codex-realtime.d.ts +29 -3
- package/dist/codex-session-pointers.d.ts +19 -0
- package/dist/connection-ownership.d.ts +6 -3
- package/dist/controller-data-plane.d.ts +16 -0
- package/dist/credit-promotion-snapshot.d.ts +6 -0
- package/dist/editable-artifact-source-session.d.ts +3 -0
- package/dist/editable-artifact-websocket.d.ts +5 -3
- package/dist/fatal-process-boundary.d.ts +9 -1
- package/dist/github-access.d.ts +7 -1
- package/dist/github-browser-flow.d.ts +1 -1
- package/dist/http/acting-person.d.ts +36 -0
- package/dist/http/api-contract-compat.d.ts +19 -0
- package/dist/http/api-error.d.ts +50 -1
- package/dist/http/auth.d.ts +8 -1
- package/dist/http/cors.d.ts +12 -0
- package/dist/http/deprecation.d.ts +42 -0
- package/dist/http/keyed-admission.d.ts +12 -0
- package/dist/http/local-browser-boundary.d.ts +72 -0
- package/dist/http/metrics-listener.d.ts +22 -0
- package/dist/http/path-identifier.d.ts +17 -0
- package/dist/http/registered-route-label.d.ts +16 -0
- package/dist/http/rejection-telemetry.d.ts +34 -0
- package/dist/http/request-body.d.ts +27 -0
- package/dist/http/request-source.d.ts +41 -3
- package/dist/http/sse.d.ts +12 -1
- package/dist/http/unmatched-route.d.ts +18 -0
- package/dist/http/user-content.d.ts +36 -0
- package/dist/http/variable-sets-removed.d.ts +41 -0
- package/dist/http/websocket-upgrade-dispatch.d.ts +18 -0
- package/dist/index.js +1279 -108
- package/dist/index.js.map +1 -1
- package/dist/integration-connect-metrics.d.ts +35 -0
- package/dist/integration-endpoint-test.d.ts +20 -0
- package/dist/integrations/api-integrations.d.ts +2 -2
- package/dist/integrations/atlassian.d.ts +8 -3
- package/dist/integrations/fiken.d.ts +3 -1
- package/dist/integrations/github-lens-connect.d.ts +37 -66
- package/dist/integrations/google-drive.d.ts +2 -0
- package/dist/integrations/integration-commit-authority.d.ts +13 -0
- package/dist/integrations/marketplace-plugin.d.ts +43 -43
- package/dist/integrations/oauth-client.d.ts +171 -12
- package/dist/integrations/oauth-profiles.d.ts +42 -13
- package/dist/integrations/onepassword-vault-provider.d.ts +9 -0
- package/dist/integrations/slack-bot.d.ts +285 -7
- package/dist/integrations/slack-file-upload-flow.d.ts +62 -0
- package/dist/integrations/slack-interactions.d.ts +89 -10
- package/dist/integrations/slack-mrkdwn.d.ts +41 -0
- package/dist/integrations/slack-routing.d.ts +1 -1
- package/dist/integrations/slack-session-defaults.d.ts +58 -0
- package/dist/integrations/slack-task-file-upload.d.ts +36 -0
- package/dist/integrations/slack-tool-review.d.ts +5 -0
- package/dist/interaction-agent-access.d.ts +13 -8
- package/dist/interaction-agent-version.d.ts +21 -0
- package/dist/interaction-holder-heartbeat.d.ts +5 -0
- package/dist/interaction-metrics.d.ts +27 -2
- package/dist/interaction-route-stages.d.ts +25 -0
- package/dist/interaction-secrets-vault.d.ts +20 -0
- package/dist/interaction-secrets.d.ts +103 -0
- package/dist/mcp/action-catalog-types.d.ts +14 -0
- package/dist/mcp/action-catalog.gen.d.ts +2 -0
- package/dist/mcp/action-descriptions.d.ts +4 -0
- package/dist/mcp/action-schema-imports.gen.d.ts +1 -0
- package/dist/mcp/capability-account-readiness.d.ts +7 -0
- package/dist/mcp/child-read-evidence.d.ts +9 -0
- package/dist/mcp/company-profile-agent-admin.d.ts +12 -0
- package/dist/mcp/contract-input.d.ts +13 -0
- package/dist/mcp/documents.d.ts +2 -0
- package/dist/mcp/first-party-tool-permissions.d.ts +3 -606
- package/dist/mcp/notification-tools.d.ts +26 -0
- package/dist/mcp/orchestration-failure-diagnostic.d.ts +43 -0
- package/dist/mcp/scheduled-task-input.d.ts +1309 -0
- package/dist/mcp/scheduled-task-view.d.ts +217 -3
- package/dist/mcp/secret-tools.d.ts +14 -0
- package/dist/mcp/server.d.ts +108 -5
- package/dist/mcp/session-admin-access-tools.d.ts +33 -0
- package/dist/mcp/session-event-errors.d.ts +28 -0
- package/dist/mcp/session-event-view.d.ts +62 -0
- package/dist/mcp/session-view.d.ts +15 -0
- package/dist/mcp/session-wait.d.ts +18 -0
- package/dist/mcp/site-agent-clamp-tools.d.ts +38 -0
- package/dist/mcp/site-data-tools.d.ts +22 -0
- package/dist/mcp/site-publication-tools.d.ts +19 -0
- package/dist/mcp/site-sql-tools.d.ts +27 -0
- package/dist/mcp-oauth.d.ts +37 -4
- package/dist/model-calls/chat-completions.d.ts +87 -0
- package/dist/model-calls/pending-usage-settlements.d.ts +57 -0
- package/dist/model-calls/service.d.ts +36 -0
- package/dist/model-catalog.d.ts +9 -3
- package/dist/native-push-dispatch.d.ts +69 -0
- package/dist/observability.d.ts +3 -1
- package/dist/organization-mcp.d.ts +82 -0
- package/dist/prepared-mcp-actor.d.ts +77 -0
- package/dist/prepared-mcp-permissions.d.ts +8 -0
- package/dist/routes/analytics-consent.d.ts +26 -0
- package/dist/routes/api-integrations.d.ts +11 -0
- package/dist/routes/api-keys.d.ts +7 -7
- package/dist/routes/automations.d.ts +2 -0
- package/dist/routes/billing.d.ts +59 -0
- package/dist/routes/browser-sessions.d.ts +65 -2
- package/dist/routes/chat-completions.d.ts +11 -0
- package/dist/routes/claude-core-usage.d.ts +20 -0
- package/dist/routes/claude-subscription-accounts.d.ts +3 -0
- package/dist/routes/claude-subscription-oauth.d.ts +3 -0
- package/dist/routes/client-errors.d.ts +182 -0
- package/dist/routes/codex-core.d.ts +401 -0
- package/dist/routes/codex.d.ts +64 -2
- package/dist/routes/computer-sessions.d.ts +6 -1
- package/dist/routes/desktop-distribution.d.ts +32 -0
- package/dist/routes/github-browser-fonts.gen.d.ts +2 -0
- package/dist/routes/github-browser-pages.d.ts +27 -0
- package/dist/routes/inbox.d.ts +13 -0
- package/dist/routes/insights-response-cache.d.ts +10 -0
- package/dist/routes/insights-usage.d.ts +12 -0
- package/dist/routes/insights.d.ts +28 -0
- package/dist/routes/interaction-placement-message.d.ts +7 -0
- package/dist/routes/managed-sign-in-methods.d.ts +6 -0
- package/dist/routes/model-account-choice.d.ts +13 -0
- package/dist/routes/model-account-settings.d.ts +19 -0
- package/dist/routes/native-app-auth.d.ts +12 -0
- package/dist/routes/organization-integration-policy.d.ts +8 -0
- package/dist/routes/organization-integrations.d.ts +6 -0
- package/dist/routes/organization-mcp-connections.d.ts +3 -0
- package/dist/routes/organization-model-defaults.d.ts +9 -0
- package/dist/routes/organization-service-accounts.d.ts +3 -0
- package/dist/routes/personal-api-keys.d.ts +3 -0
- package/dist/routes/session-admin-access.d.ts +3 -0
- package/dist/routes/session-artifact-associations.d.ts +4 -0
- package/dist/routes/session-history-imports.d.ts +20 -0
- package/dist/routes/sessions.d.ts +38 -2
- package/dist/routes/site-data.d.ts +18 -0
- package/dist/routes/site-publishing.d.ts +5 -0
- package/dist/routes/site-runtime.d.ts +31 -0
- package/dist/routes/site-sql.d.ts +16 -0
- package/dist/routes/slack-bot-access.d.ts +3 -0
- package/dist/routes/subscription-account-pools.d.ts +21 -0
- package/dist/routes/subscription-core-http.d.ts +5 -0
- package/dist/routes/subscription-pool-access.d.ts +37 -0
- package/dist/routes/subscription-pool-core.d.ts +153 -0
- package/dist/routes/supergrok.d.ts +6 -6
- package/dist/routes/usage-allowances.d.ts +12 -0
- package/dist/routes/variable-sets-removed.d.ts +2 -0
- package/dist/routes/vault-providers.d.ts +34 -0
- package/dist/routes/vaults.d.ts +3 -0
- package/dist/routes/workspace-integrations.d.ts +35 -0
- package/dist/routes/workspace-model-providers.d.ts +4 -0
- package/dist/routes/workspaces.d.ts +11 -2
- package/dist/sandbox/agent-update.d.ts +64 -0
- package/dist/sandbox/auth-callout.d.ts +8 -0
- package/dist/sandbox/channel-a.d.ts +15 -1
- package/dist/sandbox/enrollment.d.ts +26 -4
- package/dist/sandbox/machine-audience.d.ts +29 -0
- package/dist/sandbox/machines.d.ts +15 -2
- package/dist/sandbox/metrics-ingestion.d.ts +6 -2
- package/dist/sandbox/screen-control.d.ts +85 -0
- package/dist/sandbox/viewer.d.ts +5 -1
- package/dist/sandbox-file-artifacts.d.ts +17 -1
- package/dist/scheduled-task-blockers.d.ts +39 -0
- package/dist/scheduled-task-deletion.d.ts +3 -4
- package/dist/scheduled-task-lifecycle.d.ts +14 -0
- package/dist/secret-answers.d.ts +40 -0
- package/dist/session-create-observability.d.ts +5 -0
- package/dist/session-event-view-36GO3IL7.js +528 -0
- package/dist/session-event-view-36GO3IL7.js.map +1 -0
- package/dist/signed-state-secret.d.ts +18 -0
- package/dist/site-agent-guard.d.ts +53 -0
- package/dist/site-data/operations.d.ts +103 -0
- package/dist/site-data/service.d.ts +203 -0
- package/dist/site-frame-guard.d.ts +32 -0
- package/dist/site-publishing/agent-data-tools.d.ts +84 -0
- package/dist/site-publishing/agent-model.d.ts +58 -0
- package/dist/site-publishing/agent-session.d.ts +16 -0
- package/dist/site-publishing/content-scanner.d.ts +31 -0
- package/dist/site-publishing/edge-sync.d.ts +48 -0
- package/dist/site-publishing/gateway-signature.d.ts +56 -0
- package/dist/site-publishing/limits.d.ts +63 -0
- package/dist/site-publishing/page-tool-authority.d.ts +30 -0
- package/dist/site-publishing/platform-usage.d.ts +113 -0
- package/dist/site-publishing/platform.d.ts +21 -0
- package/dist/site-publishing/readiness.d.ts +62 -0
- package/dist/site-publishing/runtime.d.ts +179 -0
- package/dist/site-publishing/service.d.ts +264 -0
- package/dist/site-publishing/session-events.d.ts +22 -0
- package/dist/site-publishing/session-views.d.ts +36 -0
- package/dist/site-publishing/viewer.d.ts +40 -0
- package/dist/site-session-origin.d.ts +31 -6
- package/dist/site-sql/format.d.ts +47 -0
- package/dist/site-sql/gateway.d.ts +50 -0
- package/dist/site-sql/service.d.ts +213 -0
- package/dist/temporal-schedule-sync.d.ts +26 -0
- package/dist/transcription/billing-refusal.d.ts +8 -0
- package/dist/transcription/normalize.d.ts +23 -0
- package/dist/transcription/providers/azure-mai.d.ts +12 -0
- package/dist/transcription/providers/azure-openai.d.ts +4 -0
- package/dist/transcription/providers/openai.d.ts +16 -0
- package/dist/transcription/providers/subscription-core.d.ts +39 -0
- package/dist/transcription/service.d.ts +10 -1
- package/dist/transcription/wav-duration.d.ts +8 -0
- package/dist/workspace-tool-gateway-attestations.d.ts +37 -0
- package/dist/workspace-tool-gateway-observability.d.ts +16 -0
- package/dist/workspace-tool-gateway-secrets.d.ts +27 -0
- package/dist/workspace-tool-gateway.d.ts +102 -6
- package/dist/workspace-tool-target-fence.d.ts +116 -0
- package/dist/workspace-tool-target.d.ts +225 -0
- package/dist/workspace-webhook-dispatch.d.ts +26 -0
- package/dist/xai-subscription-core.d.ts +60 -0
- package/package.json +25 -20
- package/src/access-grant-rls.ts +64 -14
- package/src/admission-trace.ts +14 -0
- package/src/app.ts +1684 -252
- package/src/artifact-catalog-cursor.ts +1 -0
- package/src/attached-browser-viewer.ts +26 -0
- package/src/auth/managed-auth-attempt-context.ts +9 -0
- package/src/auth/managed-auth-rate-limits.ts +252 -0
- package/src/auth/managed-auth-session-adapter.ts +64 -29
- package/src/auth/managed-auth.ts +303 -35
- package/src/auth/managed-email.ts +18 -1
- package/src/auth/managed-sign-in-notifications.ts +81 -0
- package/src/auth/new-signups-gate.ts +49 -0
- package/src/auth/organization-user-setup.ts +3 -3
- package/src/auth/signup-funnel-metrics.ts +164 -0
- package/src/azure-live.ts +103 -0
- package/src/browser-action-fences.ts +45 -0
- package/src/browser-controller-authority.ts +1 -186
- package/src/browser-ephemeral.ts +39 -0
- package/src/browser-lost-runtime-end.ts +71 -0
- package/src/browser-state-authority.ts +1 -236
- package/src/claude-default-models.ts +37 -0
- package/src/claude-subscription-core.ts +154 -0
- package/src/claude-subscription-oauth.ts +352 -0
- package/src/claude-subscription-profile.ts +73 -0
- package/src/claude-subscription-usage.ts +51 -0
- package/src/claude-workspace-connection.ts +82 -0
- package/src/codemode.ts +236 -39
- package/src/codex-realtime.ts +181 -53
- package/src/codex-session-pointers.ts +80 -0
- package/src/company-brain-okf.ts +1 -1
- package/src/connected-machine-computer-access.ts +2 -1
- package/src/connection-ownership.ts +19 -13
- package/src/controller-data-plane.ts +34 -0
- package/src/credit-promotion-snapshot.ts +36 -0
- package/src/editable-artifact-production.ts +10 -0
- package/src/editable-artifact-source-session.ts +123 -0
- package/src/editable-artifact-websocket.ts +16 -3
- package/src/fatal-process-boundary.ts +67 -3
- package/src/gateway-realtime.ts +12 -8
- package/src/github-access.ts +31 -5
- package/src/github-browser-flow.ts +1 -1
- package/src/http/acting-person.ts +105 -0
- package/src/http/api-contract-compat.ts +49 -0
- package/src/http/api-error.ts +210 -2
- package/src/http/auth.ts +68 -4
- package/src/http/cors.ts +37 -5
- package/src/http/deprecation.ts +118 -0
- package/src/http/keyed-admission.ts +29 -0
- package/src/http/local-browser-boundary.ts +343 -0
- package/src/http/metrics-listener.ts +57 -0
- package/src/http/path-identifier.ts +54 -0
- package/src/http/registered-route-label.ts +34 -0
- package/src/http/rejection-telemetry.ts +120 -0
- package/src/http/request-body.ts +127 -0
- package/src/http/request-source.ts +154 -13
- package/src/http/sse.ts +88 -28
- package/src/http/unmatched-route.ts +60 -0
- package/src/http/user-content.ts +158 -0
- package/src/http/variable-sets-removed.ts +122 -0
- package/src/http/websocket-upgrade-dispatch.ts +29 -0
- package/src/index.ts +107 -57
- package/src/integration-connect-metrics.ts +228 -0
- package/src/integration-endpoint-test.ts +291 -0
- package/src/integrations/api-integrations.ts +81 -7
- package/src/integrations/atlassian.ts +202 -83
- package/src/integrations/fiken.ts +66 -38
- package/src/integrations/github-app-connect.ts +64 -18
- package/src/integrations/github-lens-connect.ts +8 -29
- package/src/integrations/google-drive.ts +448 -152
- package/src/integrations/integration-commit-authority.ts +69 -0
- package/src/integrations/marketplace-plugin.ts +1 -1
- package/src/integrations/oauth-client.ts +733 -193
- package/src/integrations/oauth-profiles.ts +116 -45
- package/src/integrations/onepassword-vault-provider.ts +16 -0
- package/src/integrations/personal-github-repositories.ts +1 -1
- package/src/integrations/personal-github.ts +61 -35
- package/src/integrations/provider-oauth.ts +67 -85
- package/src/integrations/slack-app-home.ts +5 -5
- package/src/integrations/slack-bot.ts +893 -201
- package/src/integrations/slack-file-upload-flow.ts +147 -0
- package/src/integrations/slack-install.ts +7 -7
- package/src/integrations/slack-interactions.ts +1589 -299
- package/src/integrations/slack-mrkdwn.ts +193 -0
- package/src/integrations/slack-routing.ts +2 -2
- package/src/integrations/slack-session-defaults.ts +224 -0
- package/src/integrations/slack-task-file-upload.ts +323 -0
- package/src/integrations/slack-tool-review.ts +65 -0
- package/src/integrations/social-oauth.ts +90 -58
- package/src/interaction-agent-access.ts +40 -20
- package/src/interaction-agent-version.ts +85 -0
- package/src/interaction-holder-heartbeat.ts +24 -8
- package/src/interaction-metrics.ts +164 -2
- package/src/interaction-route-stages.ts +94 -0
- package/src/interaction-secrets-vault.ts +213 -0
- package/src/interaction-secrets.ts +426 -0
- package/src/mcp/action-catalog-types.ts +14 -0
- package/src/mcp/action-catalog.gen.ts +8014 -0
- package/src/mcp/action-descriptions.ts +299 -0
- package/src/mcp/action-schema-imports.gen.ts +304 -0
- package/src/mcp/capability-account-readiness.ts +17 -0
- package/src/mcp/child-read-evidence.ts +19 -0
- package/src/mcp/company-profile-agent-admin.ts +13 -0
- package/src/mcp/contract-input.ts +165 -0
- package/src/mcp/documents.ts +9 -2
- package/src/mcp/editable-artifacts.ts +29 -11
- package/src/mcp/files.ts +5 -1
- package/src/mcp/first-party-tool-permissions.ts +7 -285
- package/src/mcp/knowledge-entries.ts +108 -34
- package/src/mcp/notification-tools.ts +480 -0
- package/src/mcp/orchestration-failure-diagnostic.ts +43 -0
- package/src/mcp/scheduled-task-input.ts +89 -0
- package/src/mcp/scheduled-task-view.ts +63 -3
- package/src/mcp/secret-tools.ts +185 -0
- package/src/mcp/server.ts +2213 -1116
- package/src/mcp/session-admin-access-tools.ts +163 -0
- package/src/mcp/session-event-errors.ts +123 -0
- package/src/mcp/session-event-view.ts +395 -13
- package/src/mcp/session-view.ts +3 -0
- package/src/mcp/session-wait.ts +67 -7
- package/src/mcp/site-agent-clamp-tools.ts +140 -0
- package/src/mcp/site-data-tools.ts +339 -0
- package/src/mcp/site-publication-tools.ts +201 -0
- package/src/mcp/site-sql-tools.ts +427 -0
- package/src/mcp-oauth.ts +635 -45
- package/src/model-calls/chat-completions.ts +352 -0
- package/src/model-calls/pending-usage-settlements.ts +125 -0
- package/src/model-calls/service.ts +694 -0
- package/src/model-catalog.ts +68 -17
- package/src/native-push-dispatch.ts +457 -0
- package/src/observability.ts +15 -1
- package/src/organization-mcp.ts +485 -0
- package/src/prepared-mcp-actor.ts +154 -0
- package/src/prepared-mcp-permissions.ts +38 -0
- package/src/routes/analytics-consent.ts +123 -0
- package/src/routes/api-integrations.ts +268 -9
- package/src/routes/api-keys.ts +164 -25
- package/src/routes/artifact-catalog.ts +111 -0
- package/src/routes/automations.ts +163 -90
- package/src/routes/billing.ts +535 -59
- package/src/routes/browser-sessions.ts +966 -342
- package/src/routes/canonical-human-identities.ts +61 -0
- package/src/routes/capabilities.ts +112 -5
- package/src/routes/channels.ts +4 -3
- package/src/routes/chat-completions.ts +235 -0
- package/src/routes/claude-core-usage.ts +147 -0
- package/src/routes/claude-subscription-accounts.ts +233 -0
- package/src/routes/claude-subscription-oauth.ts +175 -0
- package/src/routes/client-errors.ts +394 -0
- package/src/routes/codex-core.ts +687 -0
- package/src/routes/codex.ts +1277 -1119
- package/src/routes/company-brain.ts +4 -0
- package/src/routes/computer-sessions.ts +319 -85
- package/src/routes/connect.ts +277 -175
- package/src/routes/connections.ts +690 -363
- package/src/routes/desktop-distribution.ts +217 -0
- package/src/routes/documents.ts +13 -7
- package/src/routes/editable-artifacts.ts +74 -4
- package/src/routes/enrollments.ts +110 -16
- package/src/routes/external-identity-links.ts +13 -12
- package/src/routes/files.ts +41 -16
- package/src/routes/github-browser-fonts.gen.ts +12 -0
- package/src/routes/github-browser-pages.ts +258 -0
- package/src/routes/github.ts +200 -75
- package/src/routes/inbox.ts +353 -0
- package/src/routes/insights-response-cache.ts +83 -0
- package/src/routes/insights-usage.ts +345 -0
- package/src/routes/insights.ts +103 -8
- package/src/routes/install.ts +51 -10
- package/src/routes/integration-facets.ts +70 -28
- package/src/routes/interaction-placement-message.ts +12 -0
- package/src/routes/knowledge.ts +136 -27
- package/src/routes/machines.ts +189 -135
- package/src/routes/managed-auth-session-sets.ts +43 -10
- package/src/routes/managed-onboarding.ts +39 -19
- package/src/routes/managed-sign-in-methods.ts +433 -0
- package/src/routes/memory-slack-publications.ts +3 -2
- package/src/routes/model-account-choice.ts +194 -0
- package/src/routes/model-account-settings.ts +235 -0
- package/src/routes/model-connection-access.ts +210 -48
- package/src/routes/native-app-auth.ts +296 -0
- package/src/routes/organization-integration-policy.ts +116 -0
- package/src/routes/organization-integrations.ts +326 -0
- package/src/routes/organization-mcp-connections.ts +183 -0
- package/src/routes/organization-memberships.ts +205 -19
- package/src/routes/organization-model-defaults.ts +110 -0
- package/src/routes/organization-model-providers.ts +74 -3
- package/src/routes/organization-service-accounts.ts +128 -0
- package/src/routes/organization-sessions.ts +21 -5
- package/src/routes/personal-api-keys.ts +184 -0
- package/src/routes/personal-github-git-broker.ts +2 -2
- package/src/routes/personal-github.ts +9 -4
- package/src/routes/plugins.ts +46 -7
- package/src/routes/pr-review-github.ts +105 -118
- package/src/routes/pr-review.ts +88 -82
- package/src/routes/preference-registry.ts +18 -0
- package/src/routes/rigs.ts +48 -13
- package/src/routes/scheduled-tasks.ts +347 -27
- package/src/routes/session-admin-access.ts +271 -0
- package/src/routes/session-artifact-associations.ts +164 -0
- package/src/routes/session-history-imports.ts +305 -0
- package/src/routes/sessions.ts +1682 -363
- package/src/routes/site-data.ts +340 -0
- package/src/routes/site-publishing.ts +584 -0
- package/src/routes/site-runtime.ts +1944 -0
- package/src/routes/site-sql.ts +263 -0
- package/src/routes/skill-content.ts +72 -7
- package/src/routes/skills.ts +5 -4
- package/src/routes/slack-bot-access.ts +108 -0
- package/src/routes/social.ts +27 -15
- package/src/routes/subscription-account-pools.ts +209 -0
- package/src/routes/subscription-core-http.ts +18 -0
- package/src/routes/subscription-pool-access.ts +180 -0
- package/src/routes/subscription-pool-core.ts +552 -0
- package/src/routes/supergrok.ts +174 -655
- package/src/routes/transcription-recordings.ts +71 -4
- package/src/routes/transcriptions.ts +26 -2
- package/src/routes/usage-allowances.ts +381 -0
- package/src/routes/variable-sets-removed.ts +19 -0
- package/src/routes/vault-providers.ts +782 -0
- package/src/routes/vaults.ts +421 -0
- package/src/routes/video-generation.ts +30 -12
- package/src/routes/workspace-artifacts.ts +165 -53
- package/src/routes/workspace-integrations.ts +576 -0
- package/src/routes/workspace-model-providers.ts +148 -0
- package/src/routes/workspace-state.ts +4 -0
- package/src/routes/workspaces.ts +625 -117
- package/src/sandbox/agent-update.ts +315 -0
- package/src/sandbox/auth-callout.ts +104 -21
- package/src/sandbox/channel-a.ts +165 -55
- package/src/sandbox/enrollment.ts +131 -22
- package/src/sandbox/machine-audience.ts +192 -0
- package/src/sandbox/machines.ts +75 -31
- package/src/sandbox/metrics-ingestion.ts +133 -2
- package/src/sandbox/rematerialize.ts +51 -21
- package/src/sandbox/screen-control.ts +289 -0
- package/src/sandbox/viewer.ts +33 -58
- package/src/sandbox-file-artifacts.ts +53 -27
- package/src/scheduled-task-blockers.ts +293 -0
- package/src/scheduled-task-deletion.ts +13 -3
- package/src/scheduled-task-lifecycle.ts +84 -0
- package/src/secret-answers.ts +119 -0
- package/src/session-create-observability.ts +46 -0
- package/src/session-realtime-context.ts +26 -4
- package/src/signed-state-secret.ts +58 -0
- package/src/site-agent-guard.ts +261 -0
- package/src/site-data/operations.ts +777 -0
- package/src/site-data/service.ts +1043 -0
- package/src/site-frame-guard.ts +107 -0
- package/src/site-publishing/agent-data-tools.ts +250 -0
- package/src/site-publishing/agent-model.ts +127 -0
- package/src/site-publishing/agent-session.ts +148 -0
- package/src/site-publishing/content-scanner.ts +93 -0
- package/src/site-publishing/edge-sync.ts +148 -0
- package/src/site-publishing/gateway-signature.ts +198 -0
- package/src/site-publishing/limits.ts +315 -0
- package/src/site-publishing/page-tool-authority.ts +111 -0
- package/src/site-publishing/platform-usage.ts +479 -0
- package/src/site-publishing/platform.ts +98 -0
- package/src/site-publishing/readiness.ts +330 -0
- package/src/site-publishing/runtime.ts +831 -0
- package/src/site-publishing/service.ts +1282 -0
- package/src/site-publishing/session-events.ts +262 -0
- package/src/site-publishing/session-views.ts +262 -0
- package/src/site-publishing/viewer.ts +75 -0
- package/src/site-session-origin.ts +91 -6
- package/src/site-sql/format.ts +134 -0
- package/src/site-sql/gateway.ts +168 -0
- package/src/site-sql/service.ts +1636 -0
- package/src/site-uploads.ts +27 -5
- package/src/temporal-schedule-sync.ts +74 -0
- package/src/transcription/billing-refusal.ts +14 -0
- package/src/transcription/normalize.ts +77 -0
- package/src/transcription/providers/azure-mai.ts +98 -0
- package/src/transcription/providers/azure-openai.ts +16 -7
- package/src/transcription/providers/codex-subscription.ts +190 -67
- package/src/transcription/providers/openai.ts +79 -5
- package/src/transcription/providers/subscription-core.ts +125 -0
- package/src/transcription/providers/xai-subscription.ts +81 -83
- package/src/transcription/segmenter.ts +7 -1
- package/src/transcription/service.ts +239 -10
- package/src/transcription/wav-duration.ts +39 -0
- package/src/workspace-deletion.ts +25 -1
- package/src/workspace-tool-gateway-attestations.ts +133 -0
- package/src/workspace-tool-gateway-observability.ts +64 -0
- package/src/workspace-tool-gateway-secrets.ts +104 -0
- package/src/workspace-tool-gateway.ts +921 -103
- package/src/workspace-tool-target-fence.ts +380 -0
- package/src/workspace-tool-target.ts +554 -0
- package/src/workspace-webhook-dispatch.ts +225 -0
- package/src/xai-realtime.ts +85 -81
- package/src/xai-subscription-core.ts +172 -0
- package/dist/browser-auth-broker.d.ts +0 -20
- package/dist/chunk-AJ62T5QN.js.map +0 -1
- package/dist/connection-authority-owner.d.ts +0 -59
- package/dist/routes/connection-authorities.d.ts +0 -3
- package/dist/routes/environments.d.ts +0 -5
- package/dist/routes/host-mcp-bindings.d.ts +0 -5
- package/dist/routes/host-mcp-resolvers.d.ts +0 -3
- package/dist/routes/packs.d.ts +0 -3
- package/dist/session-event-view-MU3HMNV3.js +0 -264
- package/dist/session-event-view-MU3HMNV3.js.map +0 -1
- package/dist/xai-subscription-auth.d.ts +0 -23
- package/src/browser-auth-broker.ts +0 -155
- package/src/connection-authority-owner.ts +0 -61
- package/src/routes/connection-authorities.ts +0 -139
- package/src/routes/environments.ts +0 -388
- package/src/routes/host-mcp-bindings.ts +0 -122
- package/src/routes/host-mcp-resolvers.ts +0 -41
- package/src/routes/packs.ts +0 -784
- package/src/xai-subscription-auth.ts +0 -139
|
@@ -0,0 +1,576 @@
|
|
|
1
|
+
import { randomBytes, randomUUID } from "node:crypto";
|
|
2
|
+
import { environmentsEncryptionKeyBytes, sandboxImageAllowlist } from "@opengeni/config";
|
|
3
|
+
import {
|
|
4
|
+
CreateWorkspaceWebhookRequest,
|
|
5
|
+
CreateWorkspaceWebhookResponse,
|
|
6
|
+
GetWorkspaceCredentialProviderResponse,
|
|
7
|
+
ListWorkspaceWebhookDeliveriesResponse,
|
|
8
|
+
OPENGENI_EVENT_ID_HEADER,
|
|
9
|
+
OPENGENI_TEST_REQUEST_NIL_ID,
|
|
10
|
+
OPENGENI_WEBHOOK_TEST_EVENT_TYPE,
|
|
11
|
+
TestWorkspaceCredentialProviderResponse,
|
|
12
|
+
TestWorkspaceWebhookResponse,
|
|
13
|
+
WorkspaceInheritedIntegrationsResponse,
|
|
14
|
+
type CredentialProviderRequest,
|
|
15
|
+
ListWorkspaceWebhooksResponse,
|
|
16
|
+
PutWorkspaceCredentialProviderRequest,
|
|
17
|
+
PutWorkspaceCredentialProviderResponse,
|
|
18
|
+
RotateWorkspaceCredentialProviderSecretResponse,
|
|
19
|
+
RotateWorkspaceWebhookSecretResponse,
|
|
20
|
+
resolveWorkspaceDefaultSandboxImage,
|
|
21
|
+
UpdateWorkspaceWebhookRequest,
|
|
22
|
+
WorkspaceCredentialProvider,
|
|
23
|
+
WorkspaceWebhook,
|
|
24
|
+
WorkspaceWebhookDelivery,
|
|
25
|
+
type AccessGrant,
|
|
26
|
+
} from "@opengeni/contracts";
|
|
27
|
+
import {
|
|
28
|
+
requireAccessGrant,
|
|
29
|
+
requireWorkspaceSettingsGrant,
|
|
30
|
+
type ApiRouteDeps,
|
|
31
|
+
} from "@opengeni/core";
|
|
32
|
+
import {
|
|
33
|
+
createWorkspaceWebhook,
|
|
34
|
+
decryptEnvironmentValue,
|
|
35
|
+
deleteWorkspaceCredentialProvider,
|
|
36
|
+
deleteWorkspaceWebhook,
|
|
37
|
+
encryptEnvironmentValue,
|
|
38
|
+
getWorkspace,
|
|
39
|
+
getOrganizationCredentialProvider,
|
|
40
|
+
getWorkspaceCredentialProvider,
|
|
41
|
+
getWorkspaceWebhook,
|
|
42
|
+
integrationWorkspaceFilterMatches,
|
|
43
|
+
listOrganizationWebhooks,
|
|
44
|
+
listWorkspaceWebhookDeliveries,
|
|
45
|
+
listWorkspaceWebhooks,
|
|
46
|
+
redeliverWorkspaceWebhookDelivery,
|
|
47
|
+
resolveInitiatingHuman,
|
|
48
|
+
resolveWorkspaceCredentialProvider,
|
|
49
|
+
rotateWorkspaceCredentialProviderSecret,
|
|
50
|
+
rotateWorkspaceWebhookSecret,
|
|
51
|
+
updateWorkspaceWebhook,
|
|
52
|
+
upsertWorkspaceCredentialProvider,
|
|
53
|
+
withCredentialProviderConfigurationLock,
|
|
54
|
+
WorkspaceWebhookLimitError,
|
|
55
|
+
type WorkspaceCredentialProviderRow,
|
|
56
|
+
type WorkspaceWebhookDeliveryRow,
|
|
57
|
+
type WorkspaceWebhookRow,
|
|
58
|
+
} from "@opengeni/db";
|
|
59
|
+
import { isLocalTestEnvironment, type pinnedFetch } from "@opengeni/network";
|
|
60
|
+
import { sendIntegrationEndpointTest } from "../integration-endpoint-test";
|
|
61
|
+
import type { Context, Hono } from "hono";
|
|
62
|
+
import { HTTPException } from "hono/http-exception";
|
|
63
|
+
import { z } from "zod";
|
|
64
|
+
|
|
65
|
+
export function newIntegrationSecret(prefix: string): string {
|
|
66
|
+
return `${prefix}_${randomBytes(32).toString("base64url")}`;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function iso(value: Date | null): string | null {
|
|
70
|
+
return value ? value.toISOString() : null;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export function integrationWebhookFields(row: Omit<WorkspaceWebhookRow, "workspaceId">) {
|
|
74
|
+
return {
|
|
75
|
+
id: row.id,
|
|
76
|
+
url: row.url,
|
|
77
|
+
eventTypes: row.eventTypes,
|
|
78
|
+
enabled: row.enabled,
|
|
79
|
+
description: row.description,
|
|
80
|
+
createdAt: row.createdAt.toISOString(),
|
|
81
|
+
updatedAt: row.updatedAt.toISOString(),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function webhookProjection(row: WorkspaceWebhookRow): WorkspaceWebhook {
|
|
86
|
+
return WorkspaceWebhook.parse({ ...integrationWebhookFields(row), workspaceId: row.workspaceId });
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export function integrationDeliveryProjection(
|
|
90
|
+
row: WorkspaceWebhookDeliveryRow,
|
|
91
|
+
): WorkspaceWebhookDelivery {
|
|
92
|
+
return WorkspaceWebhookDelivery.parse({
|
|
93
|
+
id: row.id,
|
|
94
|
+
webhookId: row.webhookId,
|
|
95
|
+
eventId: row.eventId,
|
|
96
|
+
eventType: row.eventType,
|
|
97
|
+
status: row.deliveredAt ? "delivered" : row.failedAt ? "failed" : "pending",
|
|
98
|
+
attempts: row.attempts,
|
|
99
|
+
lastStatus: row.lastStatus,
|
|
100
|
+
lastError: row.lastError,
|
|
101
|
+
nextAttemptAt: row.deliveredAt || row.failedAt ? null : iso(row.nextAttemptAt),
|
|
102
|
+
deliveredAt: iso(row.deliveredAt),
|
|
103
|
+
failedAt: iso(row.failedAt),
|
|
104
|
+
createdAt: row.createdAt.toISOString(),
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export function integrationProviderFields(
|
|
109
|
+
row: Omit<WorkspaceCredentialProviderRow, "workspaceId">,
|
|
110
|
+
) {
|
|
111
|
+
return {
|
|
112
|
+
url: row.url,
|
|
113
|
+
enabled: row.enabled,
|
|
114
|
+
timeoutMs: row.timeoutMs,
|
|
115
|
+
createdAt: row.createdAt.toISOString(),
|
|
116
|
+
updatedAt: row.updatedAt.toISOString(),
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function providerProjection(row: WorkspaceCredentialProviderRow): WorkspaceCredentialProvider {
|
|
121
|
+
return WorkspaceCredentialProvider.parse({
|
|
122
|
+
...integrationProviderFields(row),
|
|
123
|
+
workspaceId: row.workspaceId,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export async function integrationBody<T extends z.ZodTypeAny>(
|
|
128
|
+
c: Context,
|
|
129
|
+
schema: T,
|
|
130
|
+
invalidStatus: 400 | 422 = 400,
|
|
131
|
+
): Promise<z.output<T>> {
|
|
132
|
+
const parsed = schema.safeParse(await c.req.json().catch(() => null));
|
|
133
|
+
if (!parsed.success) {
|
|
134
|
+
throw new HTTPException(invalidStatus, {
|
|
135
|
+
message: parsed.error.issues[0]?.message ?? "Invalid request",
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
return parsed.data;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export function integrationRouteConfiguration(
|
|
142
|
+
deps: ApiRouteDeps,
|
|
143
|
+
scope: "workspace" | "organization",
|
|
144
|
+
) {
|
|
145
|
+
return {
|
|
146
|
+
requireKey(): Uint8Array {
|
|
147
|
+
const key = environmentsEncryptionKeyBytes(deps.settings);
|
|
148
|
+
if (!key) {
|
|
149
|
+
throw new HTTPException(503, {
|
|
150
|
+
message: `OPENGENI_ENVIRONMENTS_ENCRYPTION_KEY is required for ${scope} integrations`,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
return key;
|
|
154
|
+
},
|
|
155
|
+
requireDeployableUrl(url: string): void {
|
|
156
|
+
if (!isLocalTestEnvironment(deps.settings.environment) && !url.startsWith("https://")) {
|
|
157
|
+
throw new HTTPException(422, { message: "URL must use https" });
|
|
158
|
+
}
|
|
159
|
+
},
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export function isIntegrationAgent(
|
|
164
|
+
grant: Pick<AccessGrant, "principalKind" | "metadata">,
|
|
165
|
+
): boolean {
|
|
166
|
+
return (
|
|
167
|
+
grant.principalKind === "agent_attempt" ||
|
|
168
|
+
grant.metadata?.["turnId"] !== undefined ||
|
|
169
|
+
grant.metadata?.["attemptId"] !== undefined
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/** A test request waits at most this long, whatever the provider's run timeout. */
|
|
174
|
+
const TEST_TIMEOUT_MS = 10_000;
|
|
175
|
+
|
|
176
|
+
export type WorkspaceIntegrationRouteOptions = {
|
|
177
|
+
/** Tests inject a fetch; production uses the pinned outbound client. */
|
|
178
|
+
fetch?: typeof pinnedFetch;
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
export function registerWorkspaceIntegrationRoutes(
|
|
182
|
+
app: Hono,
|
|
183
|
+
deps: ApiRouteDeps,
|
|
184
|
+
options: WorkspaceIntegrationRouteOptions = {},
|
|
185
|
+
): void {
|
|
186
|
+
// Configuring where credentials come from or where events go is a human or
|
|
187
|
+
// host decision; an agent may never redirect its own credential source.
|
|
188
|
+
const requireIntegrationAdmin = async (c: Context, workspaceId: string): Promise<AccessGrant> => {
|
|
189
|
+
const grant = await requireWorkspaceSettingsGrant(c, deps, workspaceId);
|
|
190
|
+
if (isIntegrationAgent(grant)) {
|
|
191
|
+
throw new HTTPException(403, {
|
|
192
|
+
message: "Agent attempts cannot manage workspace integrations",
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
return grant;
|
|
196
|
+
};
|
|
197
|
+
const { requireKey, requireDeployableUrl } = integrationRouteConfiguration(deps, "workspace");
|
|
198
|
+
|
|
199
|
+
app.get("/v1/workspaces/:workspaceId/credential-provider", async (c) => {
|
|
200
|
+
const workspaceId = c.req.param("workspaceId");
|
|
201
|
+
const grant = await requireIntegrationAdmin(c, workspaceId);
|
|
202
|
+
const row = await getWorkspaceCredentialProvider(deps.db, {
|
|
203
|
+
accountId: grant.accountId,
|
|
204
|
+
workspaceId,
|
|
205
|
+
});
|
|
206
|
+
c.header("cache-control", "private, no-store");
|
|
207
|
+
return c.json(
|
|
208
|
+
GetWorkspaceCredentialProviderResponse.parse({
|
|
209
|
+
provider: row ? providerProjection(row) : null,
|
|
210
|
+
}),
|
|
211
|
+
);
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
app.put("/v1/workspaces/:workspaceId/credential-provider", async (c) => {
|
|
215
|
+
const workspaceId = c.req.param("workspaceId");
|
|
216
|
+
const grant = await requireIntegrationAdmin(c, workspaceId);
|
|
217
|
+
const request = await integrationBody(c, PutWorkspaceCredentialProviderRequest);
|
|
218
|
+
requireDeployableUrl(request.url);
|
|
219
|
+
const scope = { accountId: grant.accountId, workspaceId };
|
|
220
|
+
const {
|
|
221
|
+
row: providerRow,
|
|
222
|
+
secret: signingSecret,
|
|
223
|
+
created,
|
|
224
|
+
} = await withCredentialProviderConfigurationLock(deps.db, scope, async (tx) => {
|
|
225
|
+
const existing = await getWorkspaceCredentialProvider(tx, scope);
|
|
226
|
+
const secret = existing ? undefined : newIntegrationSecret("ogcp");
|
|
227
|
+
const row = await upsertWorkspaceCredentialProvider(tx, {
|
|
228
|
+
...scope,
|
|
229
|
+
url: request.url,
|
|
230
|
+
enabled: request.enabled ?? true,
|
|
231
|
+
timeoutMs: request.timeoutMs ?? 10_000,
|
|
232
|
+
createdBySubjectId: grant.subjectId,
|
|
233
|
+
...(secret ? { secretEncrypted: encryptEnvironmentValue(requireKey(), secret) } : {}),
|
|
234
|
+
});
|
|
235
|
+
return { row, secret, created: !existing };
|
|
236
|
+
});
|
|
237
|
+
c.header("cache-control", "private, no-store");
|
|
238
|
+
return c.json(
|
|
239
|
+
PutWorkspaceCredentialProviderResponse.parse({
|
|
240
|
+
provider: providerProjection(providerRow),
|
|
241
|
+
...(signingSecret ? { secret: signingSecret } : {}),
|
|
242
|
+
}),
|
|
243
|
+
created ? 201 : 200,
|
|
244
|
+
);
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
app.delete("/v1/workspaces/:workspaceId/credential-provider", async (c) => {
|
|
248
|
+
const workspaceId = c.req.param("workspaceId");
|
|
249
|
+
const grant = await requireIntegrationAdmin(c, workspaceId);
|
|
250
|
+
await deleteWorkspaceCredentialProvider(deps.db, { accountId: grant.accountId, workspaceId });
|
|
251
|
+
return c.body(null, 204);
|
|
252
|
+
});
|
|
253
|
+
app.post("/v1/workspaces/:workspaceId/credential-provider/rotate-secret", async (c) => {
|
|
254
|
+
const workspaceId = c.req.param("workspaceId");
|
|
255
|
+
const grant = await requireIntegrationAdmin(c, workspaceId);
|
|
256
|
+
const secret = newIntegrationSecret("ogcp");
|
|
257
|
+
const row = await rotateWorkspaceCredentialProviderSecret(deps.db, {
|
|
258
|
+
accountId: grant.accountId,
|
|
259
|
+
workspaceId,
|
|
260
|
+
secretEncrypted: encryptEnvironmentValue(requireKey(), secret),
|
|
261
|
+
});
|
|
262
|
+
if (!row) throw new HTTPException(404, { message: "Credential provider not found" });
|
|
263
|
+
c.header("cache-control", "private, no-store");
|
|
264
|
+
return c.json(
|
|
265
|
+
RotateWorkspaceCredentialProviderSecretResponse.parse({
|
|
266
|
+
provider: providerProjection(row),
|
|
267
|
+
secret,
|
|
268
|
+
}),
|
|
269
|
+
);
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
app.get("/v1/workspaces/:workspaceId/webhooks", async (c) => {
|
|
273
|
+
const workspaceId = c.req.param("workspaceId");
|
|
274
|
+
const grant = await requireIntegrationAdmin(c, workspaceId);
|
|
275
|
+
const rows = await listWorkspaceWebhooks(deps.db, { accountId: grant.accountId, workspaceId });
|
|
276
|
+
c.header("cache-control", "private, no-store");
|
|
277
|
+
return c.json(ListWorkspaceWebhooksResponse.parse({ webhooks: rows.map(webhookProjection) }));
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
app.post("/v1/workspaces/:workspaceId/webhooks", async (c) => {
|
|
281
|
+
const workspaceId = c.req.param("workspaceId");
|
|
282
|
+
const grant = await requireIntegrationAdmin(c, workspaceId);
|
|
283
|
+
const request = await integrationBody(c, CreateWorkspaceWebhookRequest);
|
|
284
|
+
requireDeployableUrl(request.url);
|
|
285
|
+
const secret = newIntegrationSecret("whsec");
|
|
286
|
+
try {
|
|
287
|
+
const row = await createWorkspaceWebhook(deps.db, {
|
|
288
|
+
accountId: grant.accountId,
|
|
289
|
+
workspaceId,
|
|
290
|
+
url: request.url,
|
|
291
|
+
secretEncrypted: encryptEnvironmentValue(requireKey(), secret),
|
|
292
|
+
eventTypes: request.eventTypes,
|
|
293
|
+
enabled: request.enabled ?? true,
|
|
294
|
+
description: request.description ?? null,
|
|
295
|
+
createdBySubjectId: grant.subjectId,
|
|
296
|
+
});
|
|
297
|
+
c.header("cache-control", "private, no-store");
|
|
298
|
+
return c.json(
|
|
299
|
+
CreateWorkspaceWebhookResponse.parse({ webhook: webhookProjection(row), secret }),
|
|
300
|
+
201,
|
|
301
|
+
);
|
|
302
|
+
} catch (error) {
|
|
303
|
+
if (error instanceof WorkspaceWebhookLimitError) {
|
|
304
|
+
throw new HTTPException(409, { message: error.message });
|
|
305
|
+
}
|
|
306
|
+
throw error;
|
|
307
|
+
}
|
|
308
|
+
});
|
|
309
|
+
|
|
310
|
+
app.get("/v1/workspaces/:workspaceId/webhooks/:webhookId", async (c) => {
|
|
311
|
+
const workspaceId = c.req.param("workspaceId");
|
|
312
|
+
const webhookId = z.string().uuid().safeParse(c.req.param("webhookId"));
|
|
313
|
+
if (!webhookId.success) throw new HTTPException(404, { message: "Webhook not found" });
|
|
314
|
+
const grant = await requireIntegrationAdmin(c, workspaceId);
|
|
315
|
+
const row = await getWorkspaceWebhook(deps.db, {
|
|
316
|
+
accountId: grant.accountId,
|
|
317
|
+
workspaceId,
|
|
318
|
+
webhookId: webhookId.data,
|
|
319
|
+
});
|
|
320
|
+
if (!row) throw new HTTPException(404, { message: "Webhook not found" });
|
|
321
|
+
c.header("cache-control", "private, no-store");
|
|
322
|
+
return c.json(webhookProjection(row));
|
|
323
|
+
});
|
|
324
|
+
|
|
325
|
+
app.patch("/v1/workspaces/:workspaceId/webhooks/:webhookId", async (c) => {
|
|
326
|
+
const workspaceId = c.req.param("workspaceId");
|
|
327
|
+
const webhookId = z.string().uuid().safeParse(c.req.param("webhookId"));
|
|
328
|
+
if (!webhookId.success) throw new HTTPException(404, { message: "Webhook not found" });
|
|
329
|
+
const grant = await requireIntegrationAdmin(c, workspaceId);
|
|
330
|
+
const request = await integrationBody(c, UpdateWorkspaceWebhookRequest);
|
|
331
|
+
if (request.url) requireDeployableUrl(request.url);
|
|
332
|
+
const row = await updateWorkspaceWebhook(deps.db, {
|
|
333
|
+
accountId: grant.accountId,
|
|
334
|
+
workspaceId,
|
|
335
|
+
webhookId: webhookId.data,
|
|
336
|
+
...(request.url !== undefined ? { url: request.url } : {}),
|
|
337
|
+
...(request.eventTypes !== undefined ? { eventTypes: request.eventTypes } : {}),
|
|
338
|
+
...(request.enabled !== undefined ? { enabled: request.enabled } : {}),
|
|
339
|
+
...(request.description !== undefined ? { description: request.description } : {}),
|
|
340
|
+
});
|
|
341
|
+
if (!row) throw new HTTPException(404, { message: "Webhook not found" });
|
|
342
|
+
return c.json(webhookProjection(row));
|
|
343
|
+
});
|
|
344
|
+
|
|
345
|
+
app.delete("/v1/workspaces/:workspaceId/webhooks/:webhookId", async (c) => {
|
|
346
|
+
const workspaceId = c.req.param("workspaceId");
|
|
347
|
+
const webhookId = z.string().uuid().safeParse(c.req.param("webhookId"));
|
|
348
|
+
if (!webhookId.success) throw new HTTPException(404, { message: "Webhook not found" });
|
|
349
|
+
const grant = await requireIntegrationAdmin(c, workspaceId);
|
|
350
|
+
const deleted = await deleteWorkspaceWebhook(deps.db, {
|
|
351
|
+
accountId: grant.accountId,
|
|
352
|
+
workspaceId,
|
|
353
|
+
webhookId: webhookId.data,
|
|
354
|
+
});
|
|
355
|
+
if (!deleted) throw new HTTPException(404, { message: "Webhook not found" });
|
|
356
|
+
return c.body(null, 204);
|
|
357
|
+
});
|
|
358
|
+
app.post("/v1/workspaces/:workspaceId/webhooks/:webhookId/rotate-secret", async (c) => {
|
|
359
|
+
const workspaceId = c.req.param("workspaceId");
|
|
360
|
+
const id = z.string().uuid().safeParse(c.req.param("webhookId"));
|
|
361
|
+
if (!id.success) throw new HTTPException(404, { message: "Webhook not found" });
|
|
362
|
+
const grant = await requireIntegrationAdmin(c, workspaceId);
|
|
363
|
+
const secret = newIntegrationSecret("whsec");
|
|
364
|
+
const row = await rotateWorkspaceWebhookSecret(deps.db, {
|
|
365
|
+
accountId: grant.accountId,
|
|
366
|
+
workspaceId,
|
|
367
|
+
webhookId: id.data,
|
|
368
|
+
secretEncrypted: encryptEnvironmentValue(requireKey(), secret),
|
|
369
|
+
});
|
|
370
|
+
if (!row) throw new HTTPException(404, { message: "Webhook not found" });
|
|
371
|
+
c.header("cache-control", "private, no-store");
|
|
372
|
+
return c.json(
|
|
373
|
+
RotateWorkspaceWebhookSecretResponse.parse({
|
|
374
|
+
webhook: webhookProjection(row),
|
|
375
|
+
secret,
|
|
376
|
+
}),
|
|
377
|
+
);
|
|
378
|
+
});
|
|
379
|
+
|
|
380
|
+
app.get("/v1/workspaces/:workspaceId/webhooks/:webhookId/deliveries", async (c) => {
|
|
381
|
+
const workspaceId = c.req.param("workspaceId");
|
|
382
|
+
const webhookId = z.string().uuid().safeParse(c.req.param("webhookId"));
|
|
383
|
+
if (!webhookId.success) throw new HTTPException(404, { message: "Webhook not found" });
|
|
384
|
+
const grant = await requireIntegrationAdmin(c, workspaceId);
|
|
385
|
+
const scope = { accountId: grant.accountId, workspaceId, webhookId: webhookId.data };
|
|
386
|
+
if (!(await getWorkspaceWebhook(deps.db, scope))) {
|
|
387
|
+
throw new HTTPException(404, { message: "Webhook not found" });
|
|
388
|
+
}
|
|
389
|
+
const limit = z.coerce.number().int().min(1).max(200).catch(50).parse(c.req.query("limit"));
|
|
390
|
+
const rows = await listWorkspaceWebhookDeliveries(deps.db, { ...scope, limit });
|
|
391
|
+
c.header("cache-control", "private, no-store");
|
|
392
|
+
return c.json(
|
|
393
|
+
ListWorkspaceWebhookDeliveriesResponse.parse({
|
|
394
|
+
deliveries: rows.map(integrationDeliveryProjection),
|
|
395
|
+
}),
|
|
396
|
+
);
|
|
397
|
+
});
|
|
398
|
+
|
|
399
|
+
app.post(
|
|
400
|
+
"/v1/workspaces/:workspaceId/webhooks/:webhookId/deliveries/:deliveryId/redeliver",
|
|
401
|
+
async (c) => {
|
|
402
|
+
const workspaceId = c.req.param("workspaceId");
|
|
403
|
+
const ids = z
|
|
404
|
+
.object({ webhookId: z.string().uuid(), deliveryId: z.string().uuid() })
|
|
405
|
+
.safeParse({ webhookId: c.req.param("webhookId"), deliveryId: c.req.param("deliveryId") });
|
|
406
|
+
if (!ids.success) throw new HTTPException(404, { message: "Delivery not found" });
|
|
407
|
+
const grant = await requireIntegrationAdmin(c, workspaceId);
|
|
408
|
+
const row = await redeliverWorkspaceWebhookDelivery(deps.db, {
|
|
409
|
+
accountId: grant.accountId,
|
|
410
|
+
workspaceId,
|
|
411
|
+
...ids.data,
|
|
412
|
+
});
|
|
413
|
+
if (!row) {
|
|
414
|
+
throw new HTTPException(409, {
|
|
415
|
+
message: "Only a delivered or failed delivery can be redelivered",
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
return c.json(integrationDeliveryProjection(row));
|
|
419
|
+
},
|
|
420
|
+
);
|
|
421
|
+
|
|
422
|
+
// Organization registrations that reach this workspace, so its administrators
|
|
423
|
+
// can see where its events go and which credential provider runs inherit.
|
|
424
|
+
app.get("/v1/workspaces/:workspaceId/inherited-integrations", async (c) => {
|
|
425
|
+
const workspaceId = c.req.param("workspaceId");
|
|
426
|
+
const grant = await requireIntegrationAdmin(c, workspaceId);
|
|
427
|
+
const workspace = await getWorkspace(deps.db, workspaceId);
|
|
428
|
+
c.header("cache-control", "private, no-store");
|
|
429
|
+
// Organization registrations never cover a Personal workspace.
|
|
430
|
+
if (!workspace || workspace.accountId !== grant.accountId || workspace.kind !== "shared") {
|
|
431
|
+
return c.json(
|
|
432
|
+
WorkspaceInheritedIntegrationsResponse.parse({ credentialProvider: null, webhooks: [] }),
|
|
433
|
+
);
|
|
434
|
+
}
|
|
435
|
+
// Matched like the runtime resolver, but shown even while this workspace
|
|
436
|
+
// overrides it, so the page can say what its own provider replaces.
|
|
437
|
+
const organizationProvider = await getOrganizationCredentialProvider(deps.db, {
|
|
438
|
+
accountId: grant.accountId,
|
|
439
|
+
});
|
|
440
|
+
const inheritedProvider =
|
|
441
|
+
organizationProvider?.enabled &&
|
|
442
|
+
integrationWorkspaceFilterMatches(organizationProvider.workspaceFilter, workspace)
|
|
443
|
+
? organizationProvider
|
|
444
|
+
: null;
|
|
445
|
+
const organizationWebhooks = await listOrganizationWebhooks(deps.db, {
|
|
446
|
+
accountId: grant.accountId,
|
|
447
|
+
});
|
|
448
|
+
return c.json(
|
|
449
|
+
WorkspaceInheritedIntegrationsResponse.parse({
|
|
450
|
+
credentialProvider: inheritedProvider
|
|
451
|
+
? {
|
|
452
|
+
url: inheritedProvider.url,
|
|
453
|
+
timeoutMs: inheritedProvider.timeoutMs,
|
|
454
|
+
updatedAt: inheritedProvider.updatedAt.toISOString(),
|
|
455
|
+
}
|
|
456
|
+
: null,
|
|
457
|
+
webhooks: organizationWebhooks
|
|
458
|
+
.filter(
|
|
459
|
+
(webhook) =>
|
|
460
|
+
webhook.enabled &&
|
|
461
|
+
integrationWorkspaceFilterMatches(webhook.workspaceFilter, workspace),
|
|
462
|
+
)
|
|
463
|
+
.map((webhook) => ({
|
|
464
|
+
id: webhook.id,
|
|
465
|
+
url: webhook.url,
|
|
466
|
+
eventTypes: webhook.eventTypes,
|
|
467
|
+
description: webhook.description,
|
|
468
|
+
})),
|
|
469
|
+
}),
|
|
470
|
+
);
|
|
471
|
+
});
|
|
472
|
+
|
|
473
|
+
// "Send test event": one signed `webhook.test` POST, sent now, never queued.
|
|
474
|
+
app.post("/v1/workspaces/:workspaceId/webhooks/:webhookId/test", async (c) => {
|
|
475
|
+
const workspaceId = c.req.param("workspaceId");
|
|
476
|
+
const webhookId = z.string().uuid().safeParse(c.req.param("webhookId"));
|
|
477
|
+
if (!webhookId.success) throw new HTTPException(404, { message: "Webhook not found" });
|
|
478
|
+
const grant = await requireIntegrationAdmin(c, workspaceId);
|
|
479
|
+
const row = await getWorkspaceWebhook(deps.db, {
|
|
480
|
+
accountId: grant.accountId,
|
|
481
|
+
workspaceId,
|
|
482
|
+
webhookId: webhookId.data,
|
|
483
|
+
});
|
|
484
|
+
if (!row) throw new HTTPException(404, { message: "Webhook not found" });
|
|
485
|
+
const workspace = await getWorkspace(deps.db, workspaceId);
|
|
486
|
+
const eventId = randomUUID();
|
|
487
|
+
const body = JSON.stringify({
|
|
488
|
+
id: eventId,
|
|
489
|
+
type: OPENGENI_WEBHOOK_TEST_EVENT_TYPE,
|
|
490
|
+
lane: "workspace",
|
|
491
|
+
workspaceId,
|
|
492
|
+
workspace: {
|
|
493
|
+
id: workspaceId,
|
|
494
|
+
externalSource: workspace?.externalSource ?? null,
|
|
495
|
+
externalId: workspace?.externalId ?? null,
|
|
496
|
+
},
|
|
497
|
+
sessionId: null,
|
|
498
|
+
turnId: null,
|
|
499
|
+
occurredAt: new Date().toISOString(),
|
|
500
|
+
data: { webhookId: row.id },
|
|
501
|
+
});
|
|
502
|
+
const result = await sendIntegrationEndpointTest({
|
|
503
|
+
kind: "webhook",
|
|
504
|
+
url: row.url,
|
|
505
|
+
secret: decryptEnvironmentValue(requireKey(), row.secretEncrypted),
|
|
506
|
+
body,
|
|
507
|
+
headers: { [OPENGENI_EVENT_ID_HEADER]: eventId },
|
|
508
|
+
timeoutMs: TEST_TIMEOUT_MS,
|
|
509
|
+
settings: deps.settings,
|
|
510
|
+
...(options.fetch ? { fetch: options.fetch } : {}),
|
|
511
|
+
});
|
|
512
|
+
c.header("cache-control", "private, no-store");
|
|
513
|
+
return c.json(TestWorkspaceWebhookResponse.parse({ result }));
|
|
514
|
+
});
|
|
515
|
+
|
|
516
|
+
// "Test connection": a signed `purpose: "test"` request to the provider this
|
|
517
|
+
// workspace's runs use. A paused workspace provider is still tested, so it
|
|
518
|
+
// can be checked before it is turned back on.
|
|
519
|
+
app.post("/v1/workspaces/:workspaceId/credential-provider/test", async (c) => {
|
|
520
|
+
const workspaceId = c.req.param("workspaceId");
|
|
521
|
+
const grant = await requireIntegrationAdmin(c, workspaceId);
|
|
522
|
+
const scope = { accountId: grant.accountId, workspaceId };
|
|
523
|
+
const own = await getWorkspaceCredentialProvider(deps.db, scope);
|
|
524
|
+
const provider = own ?? (await resolveWorkspaceCredentialProvider(deps.db, scope));
|
|
525
|
+
if (!provider) throw new HTTPException(404, { message: "Credential provider not found" });
|
|
526
|
+
const lane = "workspaceId" in provider ? ("workspace" as const) : ("organization" as const);
|
|
527
|
+
const initiatingHuman = await resolveInitiatingHuman(deps.db, scope, grant.subjectId);
|
|
528
|
+
const initiator = { kind: "subject" as const, subjectId: grant.subjectId };
|
|
529
|
+
const request: CredentialProviderRequest = {
|
|
530
|
+
type: "credentials.request",
|
|
531
|
+
lane,
|
|
532
|
+
mcpServers: [],
|
|
533
|
+
purpose: "test",
|
|
534
|
+
forceRefresh: true,
|
|
535
|
+
accountId: grant.accountId,
|
|
536
|
+
workspaceId,
|
|
537
|
+
sessionId: OPENGENI_TEST_REQUEST_NIL_ID,
|
|
538
|
+
rootSessionId: OPENGENI_TEST_REQUEST_NIL_ID,
|
|
539
|
+
parentSessionId: null,
|
|
540
|
+
turnId: OPENGENI_TEST_REQUEST_NIL_ID,
|
|
541
|
+
attemptId: OPENGENI_TEST_REQUEST_NIL_ID,
|
|
542
|
+
initiator,
|
|
543
|
+
initiatorContext: { kind: "human", initiator, context: {} },
|
|
544
|
+
initiatingHumanSubjectId: grant.subjectId,
|
|
545
|
+
initiatingHuman,
|
|
546
|
+
sandboxBackend: deps.settings.sandboxBackend,
|
|
547
|
+
sandboxOs: "linux",
|
|
548
|
+
};
|
|
549
|
+
const result = await sendIntegrationEndpointTest({
|
|
550
|
+
kind: "credential-provider",
|
|
551
|
+
url: provider.url,
|
|
552
|
+
secret: decryptEnvironmentValue(requireKey(), provider.secretEncrypted),
|
|
553
|
+
body: JSON.stringify(request),
|
|
554
|
+
timeoutMs: Math.min(provider.timeoutMs, TEST_TIMEOUT_MS),
|
|
555
|
+
settings: deps.settings,
|
|
556
|
+
...(options.fetch ? { fetch: options.fetch } : {}),
|
|
557
|
+
});
|
|
558
|
+
c.header("cache-control", "private, no-store");
|
|
559
|
+
return c.json(
|
|
560
|
+
TestWorkspaceCredentialProviderResponse.parse({ lane, url: provider.url, result }),
|
|
561
|
+
);
|
|
562
|
+
});
|
|
563
|
+
|
|
564
|
+
// The images a workspace may choose as its default sandbox image.
|
|
565
|
+
app.get("/v1/workspaces/:workspaceId/sandbox-images", async (c) => {
|
|
566
|
+
const workspaceId = c.req.param("workspaceId");
|
|
567
|
+
await requireAccessGrant(c, deps, workspaceId, "workspace:read");
|
|
568
|
+
const workspace = await getWorkspace(deps.db, workspaceId);
|
|
569
|
+
const images = sandboxImageAllowlist(deps.settings);
|
|
570
|
+
const selected = resolveWorkspaceDefaultSandboxImage(workspace?.settings);
|
|
571
|
+
return c.json({
|
|
572
|
+
images,
|
|
573
|
+
selected: selected && images.includes(selected) ? selected : null,
|
|
574
|
+
});
|
|
575
|
+
});
|
|
576
|
+
}
|