@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,554 @@
|
|
|
1
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
2
|
+
import {
|
|
3
|
+
EDITABLE_ARTIFACT_MCP_CODEMODE_PATHS,
|
|
4
|
+
ToolGatewayInvokeResponse,
|
|
5
|
+
ToolGatewayTargetApprovalResponse,
|
|
6
|
+
type ToolGatewayIdentity,
|
|
7
|
+
type ToolGatewayResolveRequest,
|
|
8
|
+
type ToolGatewayInvokeRequest,
|
|
9
|
+
type ToolGatewayTargetApprovalRequest,
|
|
10
|
+
type ToolGatewayResolvedTool,
|
|
11
|
+
type ToolGatewayManifestRequest,
|
|
12
|
+
type ToolGatewayTarget,
|
|
13
|
+
} from "@opengeni/contracts";
|
|
14
|
+
import {
|
|
15
|
+
type AccessGrantAuthorization,
|
|
16
|
+
type ApiRouteDeps,
|
|
17
|
+
withSiteSessionOrigin,
|
|
18
|
+
siteViewerForGrant,
|
|
19
|
+
} from "@opengeni/core";
|
|
20
|
+
import {
|
|
21
|
+
beginTargetToolGatewayCall,
|
|
22
|
+
getWorkspaceArtifactContentRef,
|
|
23
|
+
issueToolGatewayApproval,
|
|
24
|
+
ToolGatewayApprovalOperationStartedError,
|
|
25
|
+
ToolGatewayApprovalRateLimitError,
|
|
26
|
+
WorkspaceArtifactNotFoundError,
|
|
27
|
+
type Database,
|
|
28
|
+
} from "@opengeni/db";
|
|
29
|
+
import {
|
|
30
|
+
digestCanonicalJson,
|
|
31
|
+
digestToolGatewayDefinition,
|
|
32
|
+
projectToolGatewayPath,
|
|
33
|
+
type PreparedToolGatewayCall,
|
|
34
|
+
} from "@opengeni/tool-gateway";
|
|
35
|
+
import { HTTPException } from "hono/http-exception";
|
|
36
|
+
import { ApiHttpError } from "./http/api-error";
|
|
37
|
+
import {
|
|
38
|
+
prepareWorkspaceToolGateway,
|
|
39
|
+
requireWorkspaceSiteToolAuthorization,
|
|
40
|
+
requireWorkspaceToolGatewayAuthorization,
|
|
41
|
+
throwWorkspaceToolGatewayHttpError,
|
|
42
|
+
type PreparedWorkspaceToolGateway,
|
|
43
|
+
type WorkspaceSiteVersionResolver,
|
|
44
|
+
type WorkspaceToolGatewayAuthorization,
|
|
45
|
+
} from "./workspace-tool-gateway";
|
|
46
|
+
import {
|
|
47
|
+
isPublishedSiteToolAuthorization,
|
|
48
|
+
publishedSiteToolAuthority,
|
|
49
|
+
} from "./site-publishing/page-tool-authority";
|
|
50
|
+
import { resolveSiteSessionOrigin } from "./site-session-origin";
|
|
51
|
+
import { TargetAuthorityFence, targetFenceCaller } from "./workspace-tool-target-fence";
|
|
52
|
+
|
|
53
|
+
export type TargetGatewayOptions = {
|
|
54
|
+
signal?: AbortSignal;
|
|
55
|
+
/** The route's fresh human grant; organization keys and external actors use their own reads. */
|
|
56
|
+
reauthorize?: () => Promise<void>;
|
|
57
|
+
prepare?: typeof prepareWorkspaceToolGateway;
|
|
58
|
+
begin?: typeof beginTargetToolGatewayCall;
|
|
59
|
+
issue?: typeof issueToolGatewayApproval;
|
|
60
|
+
authorizeSite?: typeof requireWorkspaceSiteToolAuthorization;
|
|
61
|
+
/** Observes the request's fence (statistics), never its authority. */
|
|
62
|
+
onFence?: (fence: TargetAuthorityFence) => void;
|
|
63
|
+
};
|
|
64
|
+
const unavailable = () => new HTTPException(404, { message: "tool_unavailable" });
|
|
65
|
+
const key = (identity: ToolGatewayIdentity) =>
|
|
66
|
+
JSON.stringify([identity.serverId, identity.toolName]);
|
|
67
|
+
const samePath = (a: readonly string[], b: readonly string[]) =>
|
|
68
|
+
a.length === b.length && a.every((part, index) => part === b[index]);
|
|
69
|
+
|
|
70
|
+
function projectedPath(identity: ToolGatewayIdentity) {
|
|
71
|
+
const alias =
|
|
72
|
+
identity.serverId === "opengeni"
|
|
73
|
+
? EDITABLE_ARTIFACT_MCP_CODEMODE_PATHS[
|
|
74
|
+
identity.toolName as keyof typeof EDITABLE_ARTIFACT_MCP_CODEMODE_PATHS
|
|
75
|
+
]
|
|
76
|
+
: undefined;
|
|
77
|
+
return projectToolGatewayPath({ identity, ...(alias ? { codemodePath: alias } : {}) });
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Reads a pinned Site as the request's caller may see it. Targeted routes admit
|
|
82
|
+
* no attempt-scoped grant (`requireWorkspaceToolGatewayAuthorization`), so whom
|
|
83
|
+
* a caller reads Sites as follows from its grant alone and is resolved once per
|
|
84
|
+
* request. Every read still filters by it, so an audience change applies at
|
|
85
|
+
* the next evaluation.
|
|
86
|
+
*/
|
|
87
|
+
async function siteVersionReader(
|
|
88
|
+
deps: ApiRouteDeps,
|
|
89
|
+
authorization: WorkspaceToolGatewayAuthorization,
|
|
90
|
+
): Promise<WorkspaceSiteVersionResolver> {
|
|
91
|
+
if (isPublishedSiteToolAuthorization(authorization))
|
|
92
|
+
return publishedSiteToolAuthority(authorization).readVersion;
|
|
93
|
+
const viewer = await siteViewerForGrant(deps.db, authorization.grant);
|
|
94
|
+
return async (db, grant, artifactId, versionId) =>
|
|
95
|
+
await getWorkspaceArtifactContentRef(db, grant.workspaceId, viewer, artifactId, versionId);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** Site paths are matched to the stored allowlist before any provider work. */
|
|
99
|
+
async function siteTarget(
|
|
100
|
+
deps: ApiRouteDeps,
|
|
101
|
+
authorization: WorkspaceToolGatewayAuthorization,
|
|
102
|
+
request: ToolGatewayResolveRequest,
|
|
103
|
+
options: TargetGatewayOptions,
|
|
104
|
+
): Promise<{
|
|
105
|
+
target: ToolGatewayTarget;
|
|
106
|
+
site?: {
|
|
107
|
+
context: { siteArtifactId: string; siteVersionId: string; identity: ToolGatewayIdentity };
|
|
108
|
+
visible: WorkspaceSiteVersionResolver;
|
|
109
|
+
};
|
|
110
|
+
}> {
|
|
111
|
+
if (!request.siteArtifactId || !request.siteVersionId) return { target: request.target };
|
|
112
|
+
const visible = await siteVersionReader(deps, authorization);
|
|
113
|
+
let identity: ToolGatewayIdentity;
|
|
114
|
+
if ("identity" in request.target) identity = request.target.identity;
|
|
115
|
+
else {
|
|
116
|
+
try {
|
|
117
|
+
const { status, version } = await visible(
|
|
118
|
+
deps.db,
|
|
119
|
+
authorization.grant,
|
|
120
|
+
request.siteArtifactId,
|
|
121
|
+
request.siteVersionId,
|
|
122
|
+
);
|
|
123
|
+
const path = request.target.path;
|
|
124
|
+
const matches = version.requestedTools.filter((item) => samePath(projectedPath(item), path));
|
|
125
|
+
if (status !== "active" || version.id !== request.siteVersionId || matches.length !== 1)
|
|
126
|
+
throw unavailable();
|
|
127
|
+
identity = matches[0]!;
|
|
128
|
+
} catch {
|
|
129
|
+
throw new HTTPException(403, { message: "site_tool_not_authorized" });
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
const context = {
|
|
133
|
+
siteArtifactId: request.siteArtifactId,
|
|
134
|
+
siteVersionId: request.siteVersionId,
|
|
135
|
+
identity,
|
|
136
|
+
};
|
|
137
|
+
await (options.authorizeSite ?? requireWorkspaceSiteToolAuthorization)(
|
|
138
|
+
deps.db,
|
|
139
|
+
authorization.grant,
|
|
140
|
+
context,
|
|
141
|
+
visible,
|
|
142
|
+
);
|
|
143
|
+
return { target: { identity }, site: { context, visible } };
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* The request's single live fence. The owner closes it strictly after the
|
|
148
|
+
* awaited preparation cleanup. `targeted` requests must install their route.
|
|
149
|
+
*/
|
|
150
|
+
export function createTargetFence(
|
|
151
|
+
deps: ApiRouteDeps,
|
|
152
|
+
authorization: WorkspaceToolGatewayAuthorization,
|
|
153
|
+
options: TargetGatewayOptions,
|
|
154
|
+
targeted: boolean,
|
|
155
|
+
): TargetAuthorityFence {
|
|
156
|
+
const fence = new TargetAuthorityFence({
|
|
157
|
+
db: deps.db,
|
|
158
|
+
targeted,
|
|
159
|
+
caller: isPublishedSiteToolAuthorization(authorization)
|
|
160
|
+
? { standalone: publishedSiteToolAuthority(authorization).reauthorize }
|
|
161
|
+
: targetFenceCaller(deps, authorization, options.reauthorize),
|
|
162
|
+
signal: options.signal,
|
|
163
|
+
});
|
|
164
|
+
options.onFence?.(fence);
|
|
165
|
+
return fence;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
function resolvedTool(
|
|
169
|
+
prepared: PreparedWorkspaceToolGateway,
|
|
170
|
+
target: ToolGatewayTarget,
|
|
171
|
+
): ToolGatewayResolvedTool {
|
|
172
|
+
const matches = prepared.toolGatewayCatalog.entries.filter((entry) =>
|
|
173
|
+
"identity" in target
|
|
174
|
+
? key(entry.identity) === key(target.identity)
|
|
175
|
+
: samePath(entry.codemodePath, target.path),
|
|
176
|
+
);
|
|
177
|
+
if (matches.length !== 1) throw unavailable();
|
|
178
|
+
const entry = matches[0]!;
|
|
179
|
+
return {
|
|
180
|
+
version: 1,
|
|
181
|
+
entry,
|
|
182
|
+
definitionDigest: digestToolGatewayDefinition(prepared.toolGatewayCatalog, entry),
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
async function withTarget<T>(
|
|
187
|
+
deps: ApiRouteDeps,
|
|
188
|
+
authorization: WorkspaceToolGatewayAuthorization,
|
|
189
|
+
request: ToolGatewayResolveRequest,
|
|
190
|
+
options: TargetGatewayOptions,
|
|
191
|
+
use: (
|
|
192
|
+
prepared: PreparedWorkspaceToolGateway,
|
|
193
|
+
tool: ToolGatewayResolvedTool,
|
|
194
|
+
fence: TargetAuthorityFence,
|
|
195
|
+
) => Promise<T>,
|
|
196
|
+
): Promise<T> {
|
|
197
|
+
requireWorkspaceToolGatewayAuthorization(authorization);
|
|
198
|
+
options.signal?.throwIfAborted();
|
|
199
|
+
const fence = createTargetFence(deps, authorization, options, true);
|
|
200
|
+
let prepared: PreparedWorkspaceToolGateway | undefined;
|
|
201
|
+
try {
|
|
202
|
+
// Admission: the live caller, then the exact pinned Site entry.
|
|
203
|
+
await fence.admit();
|
|
204
|
+
const { target, site } = await siteTarget(deps, authorization, request, options);
|
|
205
|
+
if (site)
|
|
206
|
+
fence.setSite(async (db) => {
|
|
207
|
+
await (options.authorizeSite ?? requireWorkspaceSiteToolAuthorization)(
|
|
208
|
+
db,
|
|
209
|
+
authorization.grant,
|
|
210
|
+
site.context,
|
|
211
|
+
site.visible,
|
|
212
|
+
);
|
|
213
|
+
});
|
|
214
|
+
let tool: ToolGatewayResolvedTool;
|
|
215
|
+
try {
|
|
216
|
+
// Preparation installs the route part before any provider is built and
|
|
217
|
+
// evaluates the fence once at every physical-request boundary.
|
|
218
|
+
prepared = await (options.prepare ?? prepareWorkspaceToolGateway)(deps, authorization, {
|
|
219
|
+
target,
|
|
220
|
+
firstPartySettings: "caller",
|
|
221
|
+
...(options.signal ? { signal: options.signal } : {}),
|
|
222
|
+
fence,
|
|
223
|
+
});
|
|
224
|
+
options.signal?.throwIfAborted();
|
|
225
|
+
tool = resolvedTool(prepared, target);
|
|
226
|
+
} catch (error) {
|
|
227
|
+
// A physical boundary that denied (or could not read) authority drops an
|
|
228
|
+
// optional connector silently or fails a required one; report that
|
|
229
|
+
// outcome instead of an opaque missing tool.
|
|
230
|
+
return await fence.settle(error);
|
|
231
|
+
}
|
|
232
|
+
return await use(prepared, tool, fence);
|
|
233
|
+
} finally {
|
|
234
|
+
if (prepared) await closeTargetPreparation(deps, prepared);
|
|
235
|
+
// Strictly after the awaited cleanup (whose session DELETE stays fenced):
|
|
236
|
+
// nothing is authorized once the request scope ends.
|
|
237
|
+
fence.close();
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
async function closeTargetPreparation(deps: ApiRouteDeps, prepared: PreparedWorkspaceToolGateway) {
|
|
242
|
+
try {
|
|
243
|
+
await prepared.close();
|
|
244
|
+
} catch {
|
|
245
|
+
// Cleanup cannot replace a confirmed result or an outcome-unknown receipt.
|
|
246
|
+
// Neither provider exception text nor tool/caller content belongs in logs.
|
|
247
|
+
try {
|
|
248
|
+
deps.observability?.warn("target_tool_cleanup_failed");
|
|
249
|
+
} catch {
|
|
250
|
+
/* Observability is not settlement authority. */
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
export async function resolveWorkspaceToolTarget(
|
|
256
|
+
deps: ApiRouteDeps,
|
|
257
|
+
authorization: WorkspaceToolGatewayAuthorization,
|
|
258
|
+
request: ToolGatewayResolveRequest,
|
|
259
|
+
options: TargetGatewayOptions = {},
|
|
260
|
+
) {
|
|
261
|
+
return await withTarget(deps, authorization, request, options, async (_prepared, tool, fence) => {
|
|
262
|
+
// The definition is disclosed only while the complete fence still holds.
|
|
263
|
+
await fence.check({ retryable: true });
|
|
264
|
+
return tool;
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
function assertDefinition(tool: ToolGatewayResolvedTool, expected: string | undefined) {
|
|
269
|
+
if (expected !== undefined && expected !== tool.definitionDigest)
|
|
270
|
+
throw new ApiHttpError(409, {
|
|
271
|
+
code: "conflict",
|
|
272
|
+
message: "The tool definition changed before execution.",
|
|
273
|
+
retryable: true,
|
|
274
|
+
outcomeUnknown: false,
|
|
275
|
+
details: { code: "tool_definition_stale" },
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
function approvalBinding(
|
|
280
|
+
call: PreparedToolGatewayCall,
|
|
281
|
+
request: { siteArtifactId?: string | undefined; siteVersionId?: string | undefined },
|
|
282
|
+
) {
|
|
283
|
+
if (!call.effectDigest)
|
|
284
|
+
throw new HTTPException(503, { message: "tool_effect_binding_unavailable" });
|
|
285
|
+
return digestCanonicalJson({
|
|
286
|
+
domain: "opengeni.target-tool-approval",
|
|
287
|
+
version: 2,
|
|
288
|
+
effectDigest: call.effectDigest,
|
|
289
|
+
siteArtifactId: request.siteArtifactId ?? null,
|
|
290
|
+
siteVersionId: request.siteVersionId ?? null,
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
const hashToken = (value: string) => createHash("sha256").update(value).digest("hex");
|
|
294
|
+
|
|
295
|
+
function approvalError(error: unknown): never {
|
|
296
|
+
if (error instanceof ToolGatewayApprovalOperationStartedError)
|
|
297
|
+
throw new ApiHttpError(409, {
|
|
298
|
+
code: "conflict",
|
|
299
|
+
message:
|
|
300
|
+
"This operation may already have executed. Reconcile its outcome before creating another operation.",
|
|
301
|
+
retryable: false,
|
|
302
|
+
outcomeUnknown: true,
|
|
303
|
+
details: { code: "tool_gateway_operation_already_started" },
|
|
304
|
+
});
|
|
305
|
+
if (error instanceof ToolGatewayApprovalRateLimitError)
|
|
306
|
+
throw new HTTPException(429, { message: "tool_approval_rate_limited" });
|
|
307
|
+
throwWorkspaceToolGatewayHttpError(error);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
export async function invokeWorkspaceToolTarget(
|
|
311
|
+
deps: ApiRouteDeps,
|
|
312
|
+
authorization: WorkspaceToolGatewayAuthorization,
|
|
313
|
+
request: ToolGatewayInvokeRequest,
|
|
314
|
+
options: TargetGatewayOptions = {},
|
|
315
|
+
) {
|
|
316
|
+
return await withTarget(deps, authorization, request, options, async (prepared, tool, fence) => {
|
|
317
|
+
assertDefinition(tool, request.expectedDefinitionDigest);
|
|
318
|
+
const meta: Record<string, unknown> = { approvalConfirmed: true, targetedCall: true };
|
|
319
|
+
let call: PreparedToolGatewayCall;
|
|
320
|
+
try {
|
|
321
|
+
call = await prepared.toolGateway.prepareCall(
|
|
322
|
+
{
|
|
323
|
+
operationId: request.operationId,
|
|
324
|
+
catalogDigest: prepared.toolGatewayCatalog.digest,
|
|
325
|
+
identity: tool.entry.identity,
|
|
326
|
+
arguments: request.arguments,
|
|
327
|
+
caller: { kind: "http", subjectId: authorization.grant.subjectId },
|
|
328
|
+
},
|
|
329
|
+
{ transportMeta: meta, ...(options.signal ? { signal: options.signal } : {}) },
|
|
330
|
+
);
|
|
331
|
+
// Caller, Site, route and the decided action policy, before admission.
|
|
332
|
+
await fence.check({ retryable: true });
|
|
333
|
+
const approvalRequired =
|
|
334
|
+
call.approvalDecision === "ask" ||
|
|
335
|
+
(call.approvalDecision === undefined && tool.entry.approval === "human");
|
|
336
|
+
const accepted = await (options.begin ?? beginTargetToolGatewayCall)(deps.db, {
|
|
337
|
+
...authorization.grant,
|
|
338
|
+
operationId: request.operationId,
|
|
339
|
+
identity: tool.entry.identity,
|
|
340
|
+
targetBindingDigest: approvalBinding(call, request),
|
|
341
|
+
argumentsDigest: digestCanonicalJson(request.arguments),
|
|
342
|
+
approvalAuthorityDigest: call.approvalAuthorityDigest,
|
|
343
|
+
approvalRequired,
|
|
344
|
+
...(request.approvalToken ? { tokenHash: hashToken(request.approvalToken) } : {}),
|
|
345
|
+
});
|
|
346
|
+
if (!accepted) throw new HTTPException(409, { message: "tool_gateway_approval_required" });
|
|
347
|
+
meta.approvalConfirmed = approvalRequired || request.approvalToken !== undefined;
|
|
348
|
+
} catch (error) {
|
|
349
|
+
approvalError(error);
|
|
350
|
+
}
|
|
351
|
+
const origin = isPublishedSiteToolAuthorization(authorization)
|
|
352
|
+
? publishedSiteToolAuthority(authorization).origin
|
|
353
|
+
: request.siteArtifactId && request.siteVersionId
|
|
354
|
+
? await resolveSiteSessionOrigin(
|
|
355
|
+
deps.db,
|
|
356
|
+
authorization.grant,
|
|
357
|
+
request.siteArtifactId,
|
|
358
|
+
request.siteVersionId,
|
|
359
|
+
)
|
|
360
|
+
: null;
|
|
361
|
+
// The last application-level fence before dispatch. A remote provider
|
|
362
|
+
// request is fenced again at its own physical boundary.
|
|
363
|
+
try {
|
|
364
|
+
await fence.check({ retryable: false });
|
|
365
|
+
} catch (error) {
|
|
366
|
+
throwWorkspaceToolGatewayHttpError(error);
|
|
367
|
+
}
|
|
368
|
+
// Once dispatched, even output validation or cancellation cannot prove nonexecution.
|
|
369
|
+
try {
|
|
370
|
+
const result = await (origin
|
|
371
|
+
? withSiteSessionOrigin(origin, () => call.execute())
|
|
372
|
+
: call.execute());
|
|
373
|
+
return ToolGatewayInvokeResponse.parse({ operationId: request.operationId, tool, result });
|
|
374
|
+
} catch {
|
|
375
|
+
throw new ApiHttpError(502, {
|
|
376
|
+
code: "upstream_unavailable",
|
|
377
|
+
message: "The tool call ended without a confirmed result. Reconcile before retrying.",
|
|
378
|
+
retryable: false,
|
|
379
|
+
outcomeUnknown: true,
|
|
380
|
+
details: { code: "tool_outcome_unknown" },
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
export async function approveWorkspaceToolTarget(
|
|
387
|
+
deps: ApiRouteDeps,
|
|
388
|
+
authorization: AccessGrantAuthorization,
|
|
389
|
+
request: ToolGatewayTargetApprovalRequest,
|
|
390
|
+
options: TargetGatewayOptions = {},
|
|
391
|
+
) {
|
|
392
|
+
return await withTarget(
|
|
393
|
+
deps,
|
|
394
|
+
authorization,
|
|
395
|
+
{ ...request, target: { identity: request.identity } },
|
|
396
|
+
options,
|
|
397
|
+
async (prepared, tool, fence) => {
|
|
398
|
+
assertDefinition(tool, request.expectedDefinitionDigest);
|
|
399
|
+
try {
|
|
400
|
+
const call = await prepared.toolGateway.prepareCall(
|
|
401
|
+
{
|
|
402
|
+
operationId: request.operationId,
|
|
403
|
+
catalogDigest: prepared.toolGatewayCatalog.digest,
|
|
404
|
+
identity: tool.entry.identity,
|
|
405
|
+
arguments: request.arguments,
|
|
406
|
+
caller: { kind: "http", subjectId: authorization.grant.subjectId },
|
|
407
|
+
},
|
|
408
|
+
{
|
|
409
|
+
transportMeta: { approvalConfirmed: true },
|
|
410
|
+
...(options.signal ? { signal: options.signal } : {}),
|
|
411
|
+
},
|
|
412
|
+
);
|
|
413
|
+
if (
|
|
414
|
+
call.approvalDecision !== "ask" &&
|
|
415
|
+
!(call.approvalDecision === undefined && tool.entry.approval === "human")
|
|
416
|
+
)
|
|
417
|
+
throw new HTTPException(422, { message: "tool_does_not_require_human_approval" });
|
|
418
|
+
await fence.check({ retryable: true });
|
|
419
|
+
const approvalToken = `ogta_${randomBytes(32).toString("base64url")}`;
|
|
420
|
+
const expiresAt = new Date(Date.now() + 5 * 60_000);
|
|
421
|
+
await (options.issue ?? issueToolGatewayApproval)(deps.db, {
|
|
422
|
+
...authorization.grant,
|
|
423
|
+
bindingVersion: 2,
|
|
424
|
+
targetBindingDigest: approvalBinding(call, request),
|
|
425
|
+
tokenHash: hashToken(approvalToken),
|
|
426
|
+
operationId: request.operationId,
|
|
427
|
+
identity: tool.entry.identity,
|
|
428
|
+
argumentsDigest: digestCanonicalJson(request.arguments),
|
|
429
|
+
approvalAuthorityDigest: call.approvalAuthorityDigest,
|
|
430
|
+
expiresAt,
|
|
431
|
+
});
|
|
432
|
+
return ToolGatewayTargetApprovalResponse.parse({
|
|
433
|
+
bindingVersion: 2,
|
|
434
|
+
operationId: request.operationId,
|
|
435
|
+
tool,
|
|
436
|
+
approvalToken,
|
|
437
|
+
expiresAt: expiresAt.toISOString(),
|
|
438
|
+
});
|
|
439
|
+
} catch (error) {
|
|
440
|
+
approvalError(error);
|
|
441
|
+
}
|
|
442
|
+
},
|
|
443
|
+
);
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
/**
|
|
447
|
+
* Every requested identity must still be on the pinned Site version; with none
|
|
448
|
+
* requested, the version itself must still be the active one. Each evaluation
|
|
449
|
+
* reads the Site once, as the caller may see it, and checks every identity
|
|
450
|
+
* against that read.
|
|
451
|
+
*/
|
|
452
|
+
function manifestSiteCheck(
|
|
453
|
+
authorization: AccessGrantAuthorization,
|
|
454
|
+
site: { siteArtifactId: string; siteVersionId: string },
|
|
455
|
+
identities: readonly ToolGatewayIdentity[],
|
|
456
|
+
visible: WorkspaceSiteVersionResolver,
|
|
457
|
+
options: TargetGatewayOptions,
|
|
458
|
+
) {
|
|
459
|
+
return async (db: Database) => {
|
|
460
|
+
let read: ReturnType<WorkspaceSiteVersionResolver> | undefined;
|
|
461
|
+
const pinned = () =>
|
|
462
|
+
(read ??= visible(db, authorization.grant, site.siteArtifactId, site.siteVersionId));
|
|
463
|
+
if (identities.length === 0) {
|
|
464
|
+
let status: string;
|
|
465
|
+
let versionId: string;
|
|
466
|
+
try {
|
|
467
|
+
const content = await pinned();
|
|
468
|
+
status = content.status;
|
|
469
|
+
versionId = content.version.id;
|
|
470
|
+
} catch (error) {
|
|
471
|
+
if (error instanceof WorkspaceArtifactNotFoundError)
|
|
472
|
+
throw new HTTPException(403, { message: "site_tool_not_authorized" });
|
|
473
|
+
throw error;
|
|
474
|
+
}
|
|
475
|
+
if (status !== "active" || versionId !== site.siteVersionId)
|
|
476
|
+
throw new HTTPException(403, { message: "site_tool_not_authorized" });
|
|
477
|
+
}
|
|
478
|
+
for (const identity of identities)
|
|
479
|
+
await (options.authorizeSite ?? requireWorkspaceSiteToolAuthorization)(
|
|
480
|
+
db,
|
|
481
|
+
authorization.grant,
|
|
482
|
+
{ ...site, identity },
|
|
483
|
+
pinned,
|
|
484
|
+
);
|
|
485
|
+
};
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
/** Compatibility discovery is bounded by requested identities, grouped per connector. */
|
|
489
|
+
export async function resolveWorkspaceToolManifest(
|
|
490
|
+
deps: ApiRouteDeps,
|
|
491
|
+
authorization: AccessGrantAuthorization,
|
|
492
|
+
request: ToolGatewayManifestRequest,
|
|
493
|
+
options: TargetGatewayOptions = {},
|
|
494
|
+
) {
|
|
495
|
+
requireWorkspaceToolGatewayAuthorization(authorization);
|
|
496
|
+
options.signal?.throwIfAborted();
|
|
497
|
+
const identities = [
|
|
498
|
+
...new Map(request.identities.map((identity) => [key(identity), identity])).values(),
|
|
499
|
+
];
|
|
500
|
+
const fence = createTargetFence(deps, authorization, options, false);
|
|
501
|
+
let prepared: PreparedWorkspaceToolGateway | undefined;
|
|
502
|
+
try {
|
|
503
|
+
// Admission: the live caller, then the pinned Site entries.
|
|
504
|
+
await fence.admit();
|
|
505
|
+
const { siteArtifactId, siteVersionId } = request;
|
|
506
|
+
if (siteArtifactId && siteVersionId) {
|
|
507
|
+
const authorizeSite = manifestSiteCheck(
|
|
508
|
+
authorization,
|
|
509
|
+
{ siteArtifactId, siteVersionId },
|
|
510
|
+
identities,
|
|
511
|
+
await siteVersionReader(deps, authorization),
|
|
512
|
+
options,
|
|
513
|
+
);
|
|
514
|
+
await authorizeSite(deps.db);
|
|
515
|
+
fence.setSite(authorizeSite);
|
|
516
|
+
}
|
|
517
|
+
try {
|
|
518
|
+
prepared = await (options.prepare ?? prepareWorkspaceToolGateway)(deps, authorization, {
|
|
519
|
+
allowedIdentities: identities,
|
|
520
|
+
firstPartySettings: "caller",
|
|
521
|
+
...(options.signal ? { signal: options.signal } : {}),
|
|
522
|
+
fence,
|
|
523
|
+
});
|
|
524
|
+
options.signal?.throwIfAborted();
|
|
525
|
+
// Definitions are disclosed only while the fence still holds.
|
|
526
|
+
await fence.check({ retryable: true });
|
|
527
|
+
// A requested tool dropped because a boundary denied or could not read
|
|
528
|
+
// authority reports that outcome, never a silently partial manifest.
|
|
529
|
+
const listed = new Set(
|
|
530
|
+
prepared.toolGatewayCatalog.entries.map((entry) => key(entry.identity)),
|
|
531
|
+
);
|
|
532
|
+
if (identities.some((identity) => !listed.has(key(identity)))) {
|
|
533
|
+
const failure = await fence.failure();
|
|
534
|
+
if (failure) throw failure;
|
|
535
|
+
}
|
|
536
|
+
} catch (error) {
|
|
537
|
+
return await fence.settle(error);
|
|
538
|
+
}
|
|
539
|
+
const catalog = prepared.toolGatewayCatalog;
|
|
540
|
+
const tools = catalog.entries.map((entry) => ({
|
|
541
|
+
version: 1 as const,
|
|
542
|
+
entry,
|
|
543
|
+
definitionDigest: digestToolGatewayDefinition(catalog, entry),
|
|
544
|
+
}));
|
|
545
|
+
return {
|
|
546
|
+
version: 1 as const,
|
|
547
|
+
digest: digestCanonicalJson({ domain: "opengeni.tool-manifest", version: 1, tools }),
|
|
548
|
+
tools,
|
|
549
|
+
};
|
|
550
|
+
} finally {
|
|
551
|
+
if (prepared) await closeTargetPreparation(deps, prepared);
|
|
552
|
+
fence.close();
|
|
553
|
+
}
|
|
554
|
+
}
|