@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,326 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CreateOrganizationWebhookRequest,
|
|
3
|
+
CreateOrganizationWebhookResponse,
|
|
4
|
+
GetOrganizationCredentialProviderResponse,
|
|
5
|
+
ListOrganizationWebhookDeliveriesResponse,
|
|
6
|
+
ListOrganizationWebhooksResponse,
|
|
7
|
+
OrganizationCredentialProvider,
|
|
8
|
+
OrganizationWebhook,
|
|
9
|
+
PutOrganizationCredentialProviderRequest,
|
|
10
|
+
PutOrganizationCredentialProviderResponse,
|
|
11
|
+
RotateOrganizationCredentialProviderSecretResponse,
|
|
12
|
+
RotateOrganizationWebhookSecretResponse,
|
|
13
|
+
UpdateOrganizationWebhookRequest,
|
|
14
|
+
type AccessContext,
|
|
15
|
+
} from "@opengeni/contracts";
|
|
16
|
+
import {
|
|
17
|
+
accountScopedApiKeyWorkspaceAuthority,
|
|
18
|
+
accessGrantAuthorizationFromContext,
|
|
19
|
+
requireAccountAdminAuthorizationStamp,
|
|
20
|
+
requireAccessContext,
|
|
21
|
+
requireCanonicalLocalAccountAdministrator,
|
|
22
|
+
type AccessGrantAuthorization,
|
|
23
|
+
type ApiRouteDeps,
|
|
24
|
+
isVerifiedDelegatedHumanAuthorization,
|
|
25
|
+
} from "@opengeni/core";
|
|
26
|
+
import {
|
|
27
|
+
createOrganizationWebhook,
|
|
28
|
+
deleteOrganizationCredentialProvider,
|
|
29
|
+
deleteOrganizationWebhook,
|
|
30
|
+
encryptEnvironmentValue,
|
|
31
|
+
getOrganizationCredentialProvider,
|
|
32
|
+
getOrganizationWebhook,
|
|
33
|
+
listOrganizationWebhookDeliveries,
|
|
34
|
+
listOrganizationWebhooks,
|
|
35
|
+
OrganizationWebhookLimitError,
|
|
36
|
+
redeliverOrganizationWebhookDelivery,
|
|
37
|
+
rotateOrganizationCredentialProviderSecret,
|
|
38
|
+
rotateOrganizationWebhookSecret,
|
|
39
|
+
updateOrganizationWebhook,
|
|
40
|
+
upsertOrganizationCredentialProvider,
|
|
41
|
+
withCredentialProviderConfigurationLock,
|
|
42
|
+
type OrganizationCredentialProviderRow,
|
|
43
|
+
type OrganizationWebhookRow,
|
|
44
|
+
} from "@opengeni/db";
|
|
45
|
+
import type { Context, Hono } from "hono";
|
|
46
|
+
import { HTTPException } from "hono/http-exception";
|
|
47
|
+
import { z } from "zod";
|
|
48
|
+
import { organizationApiKeyAccess, requireOrganizationApiKeyControlPermission } from "./api-keys";
|
|
49
|
+
import { requireSameOriginBrowserMutation } from "./codex";
|
|
50
|
+
import {
|
|
51
|
+
integrationBody as body,
|
|
52
|
+
integrationDeliveryProjection as deliveryProjection,
|
|
53
|
+
integrationProviderFields,
|
|
54
|
+
integrationRouteConfiguration,
|
|
55
|
+
integrationWebhookFields,
|
|
56
|
+
isIntegrationAgent,
|
|
57
|
+
newIntegrationSecret,
|
|
58
|
+
} from "./workspace-integrations";
|
|
59
|
+
|
|
60
|
+
/** Account administrators or verified full-access organization keys; never workspace keys. */
|
|
61
|
+
export function requireOrganizationIntegrationAdmin(
|
|
62
|
+
context: AccessContext,
|
|
63
|
+
organizationId: string,
|
|
64
|
+
authorization?: AccessGrantAuthorization,
|
|
65
|
+
): string {
|
|
66
|
+
if (context.workspaceGrants.some(isIntegrationAgent)) {
|
|
67
|
+
throw new HTTPException(403, {
|
|
68
|
+
message: "Agent attempts cannot manage organization integrations",
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
const grant = context.accountGrants.find(
|
|
72
|
+
(candidate) =>
|
|
73
|
+
candidate.accountId === organizationId && candidate.subjectId === context.subjectId,
|
|
74
|
+
);
|
|
75
|
+
if (!grant) {
|
|
76
|
+
throw new HTTPException(403, { message: "missing permission: account:admin" });
|
|
77
|
+
}
|
|
78
|
+
if (context.subjectId.startsWith("api_key:")) {
|
|
79
|
+
requireOrganizationApiKeyControlPermission(context, organizationId);
|
|
80
|
+
const authority = accountScopedApiKeyWorkspaceAuthority(context);
|
|
81
|
+
if (
|
|
82
|
+
!authority ||
|
|
83
|
+
authority.accountId !== organizationId ||
|
|
84
|
+
organizationApiKeyAccess(authority.permissions) !== "full"
|
|
85
|
+
) {
|
|
86
|
+
throw new HTTPException(403, { message: "organization API key authority required" });
|
|
87
|
+
}
|
|
88
|
+
} else {
|
|
89
|
+
if (!grant.permissions.includes("account:admin"))
|
|
90
|
+
throw new HTTPException(403, { message: "missing permission: account:admin" });
|
|
91
|
+
if (
|
|
92
|
+
!authorization ||
|
|
93
|
+
!(
|
|
94
|
+
authorization.canonicalManagedHumanSession ||
|
|
95
|
+
authorization.canonicalLocalHumanSession ||
|
|
96
|
+
isVerifiedDelegatedHumanAuthorization(authorization)
|
|
97
|
+
) ||
|
|
98
|
+
authorization.grant.accountId !== organizationId ||
|
|
99
|
+
authorization.authenticatedSubjectId !== context.subjectId ||
|
|
100
|
+
context.workspaceGrants.some((candidate) => candidate.metadata?.delegated === true)
|
|
101
|
+
) {
|
|
102
|
+
throw new HTTPException(403, { message: "Canonical organization administrator required" });
|
|
103
|
+
}
|
|
104
|
+
requireAccountAdminAuthorizationStamp(authorization);
|
|
105
|
+
}
|
|
106
|
+
return grant.subjectId;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function providerProjection(
|
|
110
|
+
row: OrganizationCredentialProviderRow,
|
|
111
|
+
): OrganizationCredentialProvider {
|
|
112
|
+
return OrganizationCredentialProvider.parse({
|
|
113
|
+
...integrationProviderFields(row),
|
|
114
|
+
organizationId: row.accountId,
|
|
115
|
+
workspaceFilter: row.workspaceFilter,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
function webhookProjection(row: OrganizationWebhookRow): OrganizationWebhook {
|
|
119
|
+
return OrganizationWebhook.parse({
|
|
120
|
+
...integrationWebhookFields(row),
|
|
121
|
+
organizationId: row.accountId,
|
|
122
|
+
workspaceFilter: row.workspaceFilter,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export function registerOrganizationIntegrationRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
127
|
+
const scope = async (c: Context) => {
|
|
128
|
+
const id = z.string().uuid().safeParse(c.req.param("organizationId"));
|
|
129
|
+
if (!id.success) throw new HTTPException(422, { message: "invalid organization id" });
|
|
130
|
+
const context = await requireAccessContext(c, deps);
|
|
131
|
+
const accountId = id.data.toLowerCase();
|
|
132
|
+
let authorization: AccessGrantAuthorization | undefined;
|
|
133
|
+
if (!accountScopedApiKeyWorkspaceAuthority(context)) {
|
|
134
|
+
if (deps.settings.productAccessMode === "local") {
|
|
135
|
+
authorization = (await requireCanonicalLocalAccountAdministrator(c, deps, accountId))
|
|
136
|
+
.authorization;
|
|
137
|
+
} else {
|
|
138
|
+
const grant = context.workspaceGrants.find(
|
|
139
|
+
(candidate) => candidate.accountId === accountId,
|
|
140
|
+
);
|
|
141
|
+
if (grant) authorization = accessGrantAuthorizationFromContext(context, grant);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
const subjectId = requireOrganizationIntegrationAdmin(context, accountId, authorization);
|
|
145
|
+
if (!accountScopedApiKeyWorkspaceAuthority(context) && !["GET", "HEAD"].includes(c.req.method))
|
|
146
|
+
requireSameOriginBrowserMutation(c, deps);
|
|
147
|
+
c.header("cache-control", "private, no-store");
|
|
148
|
+
return { accountId, subjectId };
|
|
149
|
+
};
|
|
150
|
+
const { requireKey, requireDeployableUrl: requireUrl } = integrationRouteConfiguration(
|
|
151
|
+
deps,
|
|
152
|
+
"organization",
|
|
153
|
+
);
|
|
154
|
+
const encrypted = (secret: string): string => encryptEnvironmentValue(requireKey(), secret);
|
|
155
|
+
const webhookId = (c: Context): string => {
|
|
156
|
+
const id = z.string().uuid().safeParse(c.req.param("webhookId"));
|
|
157
|
+
if (!id.success) throw new HTTPException(404, { message: "Webhook not found" });
|
|
158
|
+
return id.data;
|
|
159
|
+
};
|
|
160
|
+
const base = "/v1/organizations/:organizationId";
|
|
161
|
+
app.get(`${base}/credential-provider`, async (c) => {
|
|
162
|
+
const target = await scope(c);
|
|
163
|
+
const row = await getOrganizationCredentialProvider(deps.db, target);
|
|
164
|
+
return c.json(
|
|
165
|
+
GetOrganizationCredentialProviderResponse.parse({
|
|
166
|
+
provider: row ? providerProjection(row) : null,
|
|
167
|
+
}),
|
|
168
|
+
);
|
|
169
|
+
});
|
|
170
|
+
app.put(`${base}/credential-provider`, async (c) => {
|
|
171
|
+
const target = await scope(c);
|
|
172
|
+
const request = await body(c, PutOrganizationCredentialProviderRequest, 422);
|
|
173
|
+
requireUrl(request.url);
|
|
174
|
+
const {
|
|
175
|
+
row: providerRow,
|
|
176
|
+
secret: signingSecret,
|
|
177
|
+
created,
|
|
178
|
+
} = await withCredentialProviderConfigurationLock(deps.db, target, async (tx) => {
|
|
179
|
+
const existing = await getOrganizationCredentialProvider(tx, target);
|
|
180
|
+
const secret = existing ? undefined : newIntegrationSecret("ogcp");
|
|
181
|
+
const row = await upsertOrganizationCredentialProvider(tx, {
|
|
182
|
+
accountId: target.accountId,
|
|
183
|
+
url: request.url,
|
|
184
|
+
enabled: request.enabled ?? true,
|
|
185
|
+
timeoutMs: request.timeoutMs ?? 10_000,
|
|
186
|
+
workspaceFilter: request.workspaceFilter,
|
|
187
|
+
createdBySubjectId: target.subjectId,
|
|
188
|
+
...(secret ? { secretEncrypted: encrypted(secret) } : {}),
|
|
189
|
+
});
|
|
190
|
+
return { row, secret, created: !existing };
|
|
191
|
+
});
|
|
192
|
+
return c.json(
|
|
193
|
+
PutOrganizationCredentialProviderResponse.parse({
|
|
194
|
+
provider: providerProjection(providerRow),
|
|
195
|
+
...(signingSecret ? { secret: signingSecret } : {}),
|
|
196
|
+
}),
|
|
197
|
+
created ? 201 : 200,
|
|
198
|
+
);
|
|
199
|
+
});
|
|
200
|
+
app.delete(`${base}/credential-provider`, async (c) => {
|
|
201
|
+
await deleteOrganizationCredentialProvider(deps.db, await scope(c));
|
|
202
|
+
return c.body(null, 204);
|
|
203
|
+
});
|
|
204
|
+
app.post(`${base}/credential-provider/rotate-secret`, async (c) => {
|
|
205
|
+
const target = await scope(c);
|
|
206
|
+
const secret = newIntegrationSecret("ogcp");
|
|
207
|
+
const row = await rotateOrganizationCredentialProviderSecret(deps.db, {
|
|
208
|
+
...target,
|
|
209
|
+
secretEncrypted: encrypted(secret),
|
|
210
|
+
});
|
|
211
|
+
if (!row) throw new HTTPException(404, { message: "Credential provider not found" });
|
|
212
|
+
return c.json(
|
|
213
|
+
RotateOrganizationCredentialProviderSecretResponse.parse({
|
|
214
|
+
provider: providerProjection(row),
|
|
215
|
+
secret,
|
|
216
|
+
}),
|
|
217
|
+
);
|
|
218
|
+
});
|
|
219
|
+
app.get(`${base}/webhooks`, async (c) => {
|
|
220
|
+
const rows = await listOrganizationWebhooks(deps.db, await scope(c));
|
|
221
|
+
return c.json(
|
|
222
|
+
ListOrganizationWebhooksResponse.parse({ webhooks: rows.map(webhookProjection) }),
|
|
223
|
+
);
|
|
224
|
+
});
|
|
225
|
+
app.post(`${base}/webhooks`, async (c) => {
|
|
226
|
+
const target = await scope(c);
|
|
227
|
+
const request = await body(c, CreateOrganizationWebhookRequest, 422);
|
|
228
|
+
requireUrl(request.url);
|
|
229
|
+
const secret = newIntegrationSecret("whsec");
|
|
230
|
+
try {
|
|
231
|
+
const row = await createOrganizationWebhook(deps.db, {
|
|
232
|
+
accountId: target.accountId,
|
|
233
|
+
url: request.url,
|
|
234
|
+
secretEncrypted: encrypted(secret),
|
|
235
|
+
eventTypes: request.eventTypes,
|
|
236
|
+
enabled: request.enabled ?? true,
|
|
237
|
+
description: request.description ?? null,
|
|
238
|
+
workspaceFilter: request.workspaceFilter,
|
|
239
|
+
createdBySubjectId: target.subjectId,
|
|
240
|
+
});
|
|
241
|
+
return c.json(
|
|
242
|
+
CreateOrganizationWebhookResponse.parse({ webhook: webhookProjection(row), secret }),
|
|
243
|
+
201,
|
|
244
|
+
);
|
|
245
|
+
} catch (error) {
|
|
246
|
+
if (error instanceof OrganizationWebhookLimitError)
|
|
247
|
+
throw new HTTPException(409, { message: error.message });
|
|
248
|
+
throw error;
|
|
249
|
+
}
|
|
250
|
+
});
|
|
251
|
+
app.get(`${base}/webhooks/:webhookId`, async (c) => {
|
|
252
|
+
const target = await scope(c);
|
|
253
|
+
const row = await getOrganizationWebhook(deps.db, {
|
|
254
|
+
accountId: target.accountId,
|
|
255
|
+
webhookId: webhookId(c),
|
|
256
|
+
});
|
|
257
|
+
if (!row) throw new HTTPException(404, { message: "Webhook not found" });
|
|
258
|
+
return c.json(webhookProjection(row));
|
|
259
|
+
});
|
|
260
|
+
app.patch(`${base}/webhooks/:webhookId`, async (c) => {
|
|
261
|
+
const target = await scope(c);
|
|
262
|
+
const request = await body(c, UpdateOrganizationWebhookRequest, 422);
|
|
263
|
+
if (request.url) requireUrl(request.url);
|
|
264
|
+
const row = await updateOrganizationWebhook(deps.db, {
|
|
265
|
+
accountId: target.accountId,
|
|
266
|
+
webhookId: webhookId(c),
|
|
267
|
+
...(request.url !== undefined ? { url: request.url } : {}),
|
|
268
|
+
...(request.eventTypes !== undefined ? { eventTypes: request.eventTypes } : {}),
|
|
269
|
+
...(request.enabled !== undefined ? { enabled: request.enabled } : {}),
|
|
270
|
+
...(request.description !== undefined ? { description: request.description } : {}),
|
|
271
|
+
...(request.workspaceFilter !== undefined
|
|
272
|
+
? { workspaceFilter: request.workspaceFilter }
|
|
273
|
+
: {}),
|
|
274
|
+
});
|
|
275
|
+
if (!row) throw new HTTPException(404, { message: "Webhook not found" });
|
|
276
|
+
return c.json(webhookProjection(row));
|
|
277
|
+
});
|
|
278
|
+
app.delete(`${base}/webhooks/:webhookId`, async (c) => {
|
|
279
|
+
const target = await scope(c);
|
|
280
|
+
if (!(await deleteOrganizationWebhook(deps.db, { ...target, webhookId: webhookId(c) }))) {
|
|
281
|
+
throw new HTTPException(404, { message: "Webhook not found" });
|
|
282
|
+
}
|
|
283
|
+
return c.body(null, 204);
|
|
284
|
+
});
|
|
285
|
+
app.post(`${base}/webhooks/:webhookId/rotate-secret`, async (c) => {
|
|
286
|
+
const target = await scope(c);
|
|
287
|
+
const secret = newIntegrationSecret("whsec");
|
|
288
|
+
const row = await rotateOrganizationWebhookSecret(deps.db, {
|
|
289
|
+
...target,
|
|
290
|
+
webhookId: webhookId(c),
|
|
291
|
+
secretEncrypted: encrypted(secret),
|
|
292
|
+
});
|
|
293
|
+
if (!row) throw new HTTPException(404, { message: "Webhook not found" });
|
|
294
|
+
return c.json(
|
|
295
|
+
RotateOrganizationWebhookSecretResponse.parse({
|
|
296
|
+
webhook: webhookProjection(row),
|
|
297
|
+
secret,
|
|
298
|
+
}),
|
|
299
|
+
);
|
|
300
|
+
});
|
|
301
|
+
app.get(`${base}/webhooks/:webhookId/deliveries`, async (c) => {
|
|
302
|
+
const target = { ...(await scope(c)), webhookId: webhookId(c) };
|
|
303
|
+
if (!(await getOrganizationWebhook(deps.db, target)))
|
|
304
|
+
throw new HTTPException(404, { message: "Webhook not found" });
|
|
305
|
+
const limit = z.coerce.number().int().min(1).max(200).catch(50).parse(c.req.query("limit"));
|
|
306
|
+
const rows = await listOrganizationWebhookDeliveries(deps.db, { ...target, limit });
|
|
307
|
+
return c.json(
|
|
308
|
+
ListOrganizationWebhookDeliveriesResponse.parse({ deliveries: rows.map(deliveryProjection) }),
|
|
309
|
+
);
|
|
310
|
+
});
|
|
311
|
+
app.post(`${base}/webhooks/:webhookId/deliveries/:deliveryId/redeliver`, async (c) => {
|
|
312
|
+
const target = await scope(c);
|
|
313
|
+
const id = z.string().uuid().safeParse(c.req.param("deliveryId"));
|
|
314
|
+
if (!id.success) throw new HTTPException(404, { message: "Delivery not found" });
|
|
315
|
+
const row = await redeliverOrganizationWebhookDelivery(deps.db, {
|
|
316
|
+
...target,
|
|
317
|
+
webhookId: webhookId(c),
|
|
318
|
+
deliveryId: id.data,
|
|
319
|
+
});
|
|
320
|
+
if (!row)
|
|
321
|
+
throw new HTTPException(409, {
|
|
322
|
+
message: "Only a delivered or failed delivery can be redelivered",
|
|
323
|
+
});
|
|
324
|
+
return c.json(deliveryProjection(row));
|
|
325
|
+
});
|
|
326
|
+
}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { UpdateOrganizationMcpConnectionRequest, type AccessContext } from "@opengeni/contracts";
|
|
2
|
+
import {
|
|
3
|
+
getManagedUserProfilesByIds,
|
|
4
|
+
getWorkspace,
|
|
5
|
+
listOrganizationMcpConnections,
|
|
6
|
+
revokeOrganizationMcpConnection,
|
|
7
|
+
updateOrganizationMcpConnectionAccess,
|
|
8
|
+
type OrganizationMcpConnection,
|
|
9
|
+
} from "@opengeni/db";
|
|
10
|
+
import { hasPermission, requireAccessContext, type ApiRouteDeps } from "@opengeni/core";
|
|
11
|
+
import type { Context, Hono } from "hono";
|
|
12
|
+
import { HTTPException } from "hono/http-exception";
|
|
13
|
+
import { isAgentActingAsPerson, requireFullAccessIfAgent } from "../http/acting-person";
|
|
14
|
+
import { z } from "zod";
|
|
15
|
+
|
|
16
|
+
import { requireSameOriginBrowserMutation } from "./codex";
|
|
17
|
+
|
|
18
|
+
/* ----------------------------------------------------------------------------
|
|
19
|
+
Connected agents: outside MCP clients people signed in to the organization
|
|
20
|
+
server with. Everyone sees and manages their own; owners and admins see and
|
|
21
|
+
can disconnect everyone's. Only the person who connected an agent changes
|
|
22
|
+
what it can do. An agent with the person's full access can do this as them;
|
|
23
|
+
an agent with less can't use these routes, so it can never widen its own
|
|
24
|
+
access.
|
|
25
|
+
-------------------------------------------------------------------------- */
|
|
26
|
+
|
|
27
|
+
export function registerOrganizationMcpConnectionRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
28
|
+
app.get("/v1/organizations/:organizationId/mcp-connections", async (c) => {
|
|
29
|
+
const { context, organizationId, admin } = await requireOrganizationPerson(c, deps);
|
|
30
|
+
const connections = await listOrganizationMcpConnections(deps.db, {
|
|
31
|
+
accountId: organizationId,
|
|
32
|
+
...(admin ? {} : { subjectId: context.subjectId }),
|
|
33
|
+
});
|
|
34
|
+
c.header("cache-control", "no-store");
|
|
35
|
+
return c.json({
|
|
36
|
+
connections: await projectConnections(deps, connections),
|
|
37
|
+
canManageAll: admin,
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
app.patch("/v1/organizations/:organizationId/mcp-connections/:connectionId", async (c) => {
|
|
42
|
+
requireSameOriginBrowserMutation(c, deps);
|
|
43
|
+
const { context, organizationId } = await requireOrganizationPerson(c, deps);
|
|
44
|
+
const connection = await requireConnection(deps, organizationId, c.req.param("connectionId"));
|
|
45
|
+
if (connection.subjectId !== context.subjectId) {
|
|
46
|
+
throw new HTTPException(403, {
|
|
47
|
+
message: "Only the person who connected this agent can change what it can do.",
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
const parsed = UpdateOrganizationMcpConnectionRequest.safeParse(
|
|
51
|
+
await c.req.json().catch(() => null),
|
|
52
|
+
);
|
|
53
|
+
if (!parsed.success) throw new HTTPException(400, { message: "invalid access setting" });
|
|
54
|
+
const access = parsed.data.access;
|
|
55
|
+
if (access.workspaceScope.kind === "selected") {
|
|
56
|
+
for (const workspaceId of access.workspaceScope.workspaceIds) {
|
|
57
|
+
const workspace = await getWorkspace(deps.db, workspaceId);
|
|
58
|
+
if (workspace?.accountId !== organizationId) {
|
|
59
|
+
throw new HTTPException(400, {
|
|
60
|
+
message: "a selected workspace is not in this organization",
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
await updateOrganizationMcpConnectionAccess(deps.db, {
|
|
66
|
+
accountId: organizationId,
|
|
67
|
+
connectionId: connection.id,
|
|
68
|
+
organizationAccess: access,
|
|
69
|
+
});
|
|
70
|
+
const [updated] = await projectConnections(
|
|
71
|
+
deps,
|
|
72
|
+
await listOrganizationMcpConnections(deps.db, {
|
|
73
|
+
accountId: organizationId,
|
|
74
|
+
connectionId: connection.id,
|
|
75
|
+
}),
|
|
76
|
+
);
|
|
77
|
+
if (!updated) throw new HTTPException(404, { message: "connected agent not found" });
|
|
78
|
+
return c.json(updated);
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
app.delete("/v1/organizations/:organizationId/mcp-connections/:connectionId", async (c) => {
|
|
82
|
+
requireSameOriginBrowserMutation(c, deps);
|
|
83
|
+
const { context, organizationId, admin } = await requireOrganizationPerson(c, deps);
|
|
84
|
+
const connection = await requireConnection(deps, organizationId, c.req.param("connectionId"));
|
|
85
|
+
if (connection.subjectId !== context.subjectId && !admin) {
|
|
86
|
+
throw new HTTPException(403, {
|
|
87
|
+
message: "Only the person who connected this agent, or an admin, can disconnect it.",
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
await revokeOrganizationMcpConnection(deps.db, {
|
|
91
|
+
accountId: organizationId,
|
|
92
|
+
connectionId: connection.id,
|
|
93
|
+
});
|
|
94
|
+
return c.body(null, 204);
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* A member of the organization, signed in in this browser, or an agent with
|
|
100
|
+
* their full access. Keys and limited agents are refused.
|
|
101
|
+
*/
|
|
102
|
+
async function requireOrganizationPerson(
|
|
103
|
+
c: Context,
|
|
104
|
+
deps: ApiRouteDeps,
|
|
105
|
+
): Promise<{ context: AccessContext; organizationId: string; admin: boolean }> {
|
|
106
|
+
const agent = isAgentActingAsPerson(c);
|
|
107
|
+
if (agent) requireFullAccessIfAgent(c, "Managing connected agents");
|
|
108
|
+
else if (
|
|
109
|
+
deps.settings.productAccessMode !== "managed" ||
|
|
110
|
+
!c.req.header("cookie") ||
|
|
111
|
+
c.req.header("authorization")
|
|
112
|
+
) {
|
|
113
|
+
throw new HTTPException(403, {
|
|
114
|
+
message: "Manage connected agents in the Opengeni app in your browser.",
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
const context = await requireAccessContext(c, deps);
|
|
118
|
+
const organizationId = c.req.param("organizationId") ?? "";
|
|
119
|
+
const grant = context.accountGrants.find((each) => each.accountId === organizationId);
|
|
120
|
+
if (context.mode !== "managed" || !context.subjectId.startsWith("user:") || !grant) {
|
|
121
|
+
throw new HTTPException(404, { message: "organization not found" });
|
|
122
|
+
}
|
|
123
|
+
return { context, organizationId, admin: hasPermission(grant.permissions, "account:admin") };
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
async function requireConnection(
|
|
127
|
+
deps: ApiRouteDeps,
|
|
128
|
+
organizationId: string,
|
|
129
|
+
connectionId: string,
|
|
130
|
+
): Promise<OrganizationMcpConnection> {
|
|
131
|
+
if (!z.string().uuid().safeParse(connectionId).success) {
|
|
132
|
+
throw new HTTPException(404, { message: "connected agent not found" });
|
|
133
|
+
}
|
|
134
|
+
const [connection] = await listOrganizationMcpConnections(deps.db, {
|
|
135
|
+
accountId: organizationId,
|
|
136
|
+
connectionId,
|
|
137
|
+
});
|
|
138
|
+
if (!connection) throw new HTTPException(404, { message: "connected agent not found" });
|
|
139
|
+
return connection;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
async function projectConnections(deps: ApiRouteDeps, connections: OrganizationMcpConnection[]) {
|
|
143
|
+
const userIds = connections
|
|
144
|
+
.map((connection) => connection.subjectId)
|
|
145
|
+
.filter((subjectId) => subjectId.startsWith("user:"))
|
|
146
|
+
.map((subjectId) => subjectId.slice("user:".length));
|
|
147
|
+
const profiles = new Map(
|
|
148
|
+
(await getManagedUserProfilesByIds(deps.db, userIds)).map((profile) => [
|
|
149
|
+
`user:${profile.id}`,
|
|
150
|
+
profile,
|
|
151
|
+
]),
|
|
152
|
+
);
|
|
153
|
+
return connections.map((connection) => {
|
|
154
|
+
const profile = profiles.get(connection.subjectId);
|
|
155
|
+
return {
|
|
156
|
+
id: connection.id,
|
|
157
|
+
clientName: connection.clientName ?? "MCP client",
|
|
158
|
+
clientHost: clientHost(connection.redirectUris),
|
|
159
|
+
actor: "user" as const,
|
|
160
|
+
connectedBy: {
|
|
161
|
+
subjectId: connection.subjectId,
|
|
162
|
+
name: profile?.name?.trim() || profile?.email || "Someone",
|
|
163
|
+
},
|
|
164
|
+
policy: connection.organizationAccess,
|
|
165
|
+
createdAt: connection.connectedAt.toISOString(),
|
|
166
|
+
lastUsedAt: connection.lastUsedAt?.toISOString() ?? null,
|
|
167
|
+
expiresAt: connection.expiresAt.toISOString(),
|
|
168
|
+
revokedAt: null,
|
|
169
|
+
};
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
function clientHost(redirectUris: string[]): string | null {
|
|
174
|
+
for (const value of redirectUris) {
|
|
175
|
+
try {
|
|
176
|
+
const url = new URL(value);
|
|
177
|
+
return url.host || url.protocol.replace(/:$/u, "");
|
|
178
|
+
} catch {
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return null;
|
|
183
|
+
}
|