@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,380 @@
|
|
|
1
|
+
import {
|
|
2
|
+
externalContinuationCommitAuthorizer,
|
|
3
|
+
hasPermission,
|
|
4
|
+
isVerifiedOrganizationServiceAuthorization,
|
|
5
|
+
type AccessGrantAuthorization,
|
|
6
|
+
type ApiRouteDeps,
|
|
7
|
+
} from "@opengeni/core";
|
|
8
|
+
import {
|
|
9
|
+
readActiveExternalOrganizationKeyAuthority,
|
|
10
|
+
withAccountRls,
|
|
11
|
+
withDatabaseStatementTimeout,
|
|
12
|
+
type Database,
|
|
13
|
+
} from "@opengeni/db";
|
|
14
|
+
import { ToolGatewayApprovalRequiredError, ToolGatewayBlockedError } from "@opengeni/tool-gateway";
|
|
15
|
+
import { HTTPException } from "hono/http-exception";
|
|
16
|
+
import { ApiHttpError } from "./http/api-error";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* One evaluation's budget. Below the MCP SDK's 5 s setup-request timeout, so a
|
|
20
|
+
* stalled authority read is reported as unavailable authority rather than
|
|
21
|
+
* silently dropping the target connector (a 404).
|
|
22
|
+
*/
|
|
23
|
+
export const TARGET_FENCE_DEADLINE_MS = 2_500;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* A part of the live fence. `db` is the evaluation's bounded transaction;
|
|
27
|
+
* `stop` aborts once the evaluation's deadline passes or its request ends. The
|
|
28
|
+
* evaluation checks it before each part; the route part also checks it between
|
|
29
|
+
* its capability, integration and connection reads.
|
|
30
|
+
*/
|
|
31
|
+
export type TargetFenceCheck = (db: Database, stop: AbortSignal) => Promise<void>;
|
|
32
|
+
|
|
33
|
+
export type TargetFenceCaller = {
|
|
34
|
+
/** Read inside the evaluation's bounded transaction. */
|
|
35
|
+
scoped?: TargetFenceCheck;
|
|
36
|
+
/** Runs beside it: its own bounded transaction, or the route's fresh grant. */
|
|
37
|
+
standalone?: (stop: AbortSignal) => Promise<void>;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
type Outcome = "denied" | "approval_required" | "unavailable" | "aborted" | "closed";
|
|
41
|
+
|
|
42
|
+
export type TargetFenceStats = {
|
|
43
|
+
/** Started evaluations (caller-only plus full). */
|
|
44
|
+
evaluations: number;
|
|
45
|
+
full: number;
|
|
46
|
+
/** Wall time spent inside evaluations, summed (they may overlap). */
|
|
47
|
+
durationMs: number;
|
|
48
|
+
outcomes: Partial<Record<Outcome, number>>;
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
class TargetFenceClosedError extends Error {
|
|
52
|
+
constructor() {
|
|
53
|
+
super("target request scope has ended");
|
|
54
|
+
this.name = "TargetFenceClosedError";
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
class TargetFenceDeadlineError extends Error {
|
|
59
|
+
constructor() {
|
|
60
|
+
super("target authority deadline exceeded");
|
|
61
|
+
this.name = "TargetFenceDeadlineError";
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Authority could not be read in time: a 503 distinct from a provider failure
|
|
67
|
+
* (502, outcome unknown). Never names the target, its connector or its owner.
|
|
68
|
+
*/
|
|
69
|
+
export function targetAuthorityUnavailable(retryable: boolean): ApiHttpError {
|
|
70
|
+
return new ApiHttpError(503, {
|
|
71
|
+
code: "upstream_unavailable",
|
|
72
|
+
message: "Tool authority could not be verified. Retry the request.",
|
|
73
|
+
retryable,
|
|
74
|
+
outcomeUnknown: false,
|
|
75
|
+
details: { code: "tool_authority_unavailable" },
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Live caller authority for one targeted request. A verified organization key
|
|
81
|
+
* is read without a lock or write (admission already recorded its use); an
|
|
82
|
+
* external continuation keeps its complete commit authorizer; a person keeps
|
|
83
|
+
* the route's fresh grant (`reauthorize`), unchanged. That grant runs outside
|
|
84
|
+
* the evaluation's transaction: the deadline answers the request without
|
|
85
|
+
* cancelling it.
|
|
86
|
+
*/
|
|
87
|
+
export function targetFenceCaller(
|
|
88
|
+
deps: Pick<ApiRouteDeps, "db">,
|
|
89
|
+
authorization: AccessGrantAuthorization,
|
|
90
|
+
reauthorize: (() => Promise<void>) | undefined,
|
|
91
|
+
): TargetFenceCaller {
|
|
92
|
+
const grant = authorization.grant;
|
|
93
|
+
const external = externalContinuationCommitAuthorizer(authorization);
|
|
94
|
+
if (external)
|
|
95
|
+
return {
|
|
96
|
+
standalone: async (stop) =>
|
|
97
|
+
await withDatabaseStatementTimeout(deps.db, TARGET_FENCE_DEADLINE_MS, async (bounded) => {
|
|
98
|
+
stop.throwIfAborted();
|
|
99
|
+
await withAccountRls(bounded, grant.accountId, async (tx) => await external(tx));
|
|
100
|
+
// A stopped evaluation rolls back instead of committing a late decision.
|
|
101
|
+
stop.throwIfAborted();
|
|
102
|
+
}),
|
|
103
|
+
};
|
|
104
|
+
if (isVerifiedOrganizationServiceAuthorization(authorization)) {
|
|
105
|
+
const keyId = grant.subjectId.slice("api_key:".length);
|
|
106
|
+
const permissions = [...grant.permissions];
|
|
107
|
+
return {
|
|
108
|
+
scoped: async (db) => {
|
|
109
|
+
const live = await readActiveExternalOrganizationKeyAuthority(
|
|
110
|
+
db,
|
|
111
|
+
grant.accountId,
|
|
112
|
+
keyId,
|
|
113
|
+
grant.workspaceId,
|
|
114
|
+
);
|
|
115
|
+
if (
|
|
116
|
+
!live ||
|
|
117
|
+
permissions.some(
|
|
118
|
+
(permission) => !hasPermission(live.permissions, permission, live.permissionMode),
|
|
119
|
+
)
|
|
120
|
+
)
|
|
121
|
+
throw new HTTPException(403, { message: "service gateway authority changed" });
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
// Never a fence without a live caller.
|
|
126
|
+
if (!reauthorize) throw new Error("a person's targeted request requires the route's fresh grant");
|
|
127
|
+
return { standalone: async () => await reauthorize() };
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* The single live fence of one targeted request: exact caller, pinned Site,
|
|
132
|
+
* selected route (connector configuration and connection) and action policy.
|
|
133
|
+
*
|
|
134
|
+
* Every evaluation reads current state; nothing is cached, shared between
|
|
135
|
+
* physical requests, or reused across requests. `full()` runs once for each
|
|
136
|
+
* installed physical-request boundary, after that request's last credential
|
|
137
|
+
* step. Its Site, route, policy and organization-key reads share one
|
|
138
|
+
* transaction bounded by `statement_timeout`; an external actor's authorizer
|
|
139
|
+
* runs in a second bounded transaction and a person's fresh grant beside them.
|
|
140
|
+
* At the deadline the evaluation is answered as unavailable authority and no
|
|
141
|
+
* further part starts. The running part may still finish its current read and
|
|
142
|
+
* issue its remaining ones (a pinned Site's version after its artifact, the
|
|
143
|
+
* next selected connection), each bounded by the statement timeout; the
|
|
144
|
+
* transaction then rolls back.
|
|
145
|
+
* Boundaries swallow hook failures, so the fence records each outcome itself;
|
|
146
|
+
* `settle()` reports a recorded denial or unavailable authority instead of an
|
|
147
|
+
* opaque missing connector. After `close()` (strictly after the awaited
|
|
148
|
+
* cleanup) every evaluation fails, so nothing is authorized once the request
|
|
149
|
+
* scope ends.
|
|
150
|
+
*/
|
|
151
|
+
export class TargetAuthorityFence {
|
|
152
|
+
#site: TargetFenceCheck | undefined;
|
|
153
|
+
#route: TargetFenceCheck | undefined;
|
|
154
|
+
#policy: TargetFenceCheck | undefined;
|
|
155
|
+
#closed = false;
|
|
156
|
+
#denied: { error: unknown } | undefined;
|
|
157
|
+
#approval: { error: unknown } | undefined;
|
|
158
|
+
#unavailable = false;
|
|
159
|
+
readonly #pending = new Set<Promise<void>>();
|
|
160
|
+
readonly stats: TargetFenceStats = { evaluations: 0, full: 0, durationMs: 0, outcomes: {} };
|
|
161
|
+
|
|
162
|
+
constructor(
|
|
163
|
+
private readonly input: {
|
|
164
|
+
db: Database;
|
|
165
|
+
/** A targeted request must install its route before any full evaluation. */
|
|
166
|
+
targeted: boolean;
|
|
167
|
+
caller: TargetFenceCaller;
|
|
168
|
+
signal?: AbortSignal | undefined;
|
|
169
|
+
deadlineMs?: number;
|
|
170
|
+
},
|
|
171
|
+
) {}
|
|
172
|
+
|
|
173
|
+
get #deadlineMs() {
|
|
174
|
+
return this.input.deadlineMs ?? TARGET_FENCE_DEADLINE_MS;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/** Each part is installed once; a later install never replaces it. */
|
|
178
|
+
setSite(check: TargetFenceCheck): void {
|
|
179
|
+
if (this.#site) throw new Error("target Site fence is already installed");
|
|
180
|
+
this.#site = check;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/** Installed by preparation before any provider is constructed. */
|
|
184
|
+
setRoute(check: TargetFenceCheck): void {
|
|
185
|
+
if (this.#route) throw new Error("target route fence is already installed");
|
|
186
|
+
this.#route = check;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/** Installed when the selected call's action policy is decided. */
|
|
190
|
+
setPolicy(check: TargetFenceCheck): void {
|
|
191
|
+
if (this.#policy) throw new Error("target action policy fence is already installed");
|
|
192
|
+
this.#policy = check;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/** Live caller only: before credential acquisition may refresh or record use. */
|
|
196
|
+
async caller(): Promise<void> {
|
|
197
|
+
await this.#evaluate(false);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/** Admission: the live caller, with unavailable authority as a retryable 503. */
|
|
201
|
+
async admit(): Promise<void> {
|
|
202
|
+
try {
|
|
203
|
+
await this.caller();
|
|
204
|
+
} catch (error) {
|
|
205
|
+
throw this.#public(error, true);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/** Caller, Site, route and policy: once per physical provider request. */
|
|
210
|
+
async full(): Promise<void> {
|
|
211
|
+
await this.#evaluate(true);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/** Credential hooks report a boolean; their failure is recorded, not lost. */
|
|
215
|
+
async allows(): Promise<boolean> {
|
|
216
|
+
try {
|
|
217
|
+
await this.full();
|
|
218
|
+
return true;
|
|
219
|
+
} catch {
|
|
220
|
+
return false;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* An explicit fence before an application step. Denials keep their error;
|
|
226
|
+
* unavailable authority becomes a 503 (retryable only before begin).
|
|
227
|
+
*/
|
|
228
|
+
async check(options: { retryable: boolean }): Promise<void> {
|
|
229
|
+
try {
|
|
230
|
+
await this.full();
|
|
231
|
+
} catch (error) {
|
|
232
|
+
throw this.#public(error, options.retryable);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/** Transport boundary of a credential-fenced connector: no database read. */
|
|
237
|
+
assertOpen(): void {
|
|
238
|
+
if (this.#closed) throw new TargetFenceClosedError();
|
|
239
|
+
this.input.signal?.throwIfAborted();
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
close(): void {
|
|
243
|
+
this.#closed = true;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Classify a failed preparation or a missing target. Waits (bounded) for
|
|
248
|
+
* evaluations already started, then prefers a recorded denial, then an
|
|
249
|
+
* approval change, then unavailable authority; otherwise `error` stands.
|
|
250
|
+
* In-flight, aborted and post-close evaluations never decide by themselves.
|
|
251
|
+
*/
|
|
252
|
+
async settle(
|
|
253
|
+
error: unknown,
|
|
254
|
+
options: { retryable: boolean } = { retryable: true },
|
|
255
|
+
): Promise<never> {
|
|
256
|
+
throw (await this.failure(options)) ?? error;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
async failure(options: { retryable: boolean } = { retryable: true }): Promise<unknown> {
|
|
260
|
+
if (this.input.signal?.aborted) return undefined;
|
|
261
|
+
if (this.#pending.size > 0) {
|
|
262
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
263
|
+
await Promise.race([
|
|
264
|
+
Promise.allSettled([...this.#pending]),
|
|
265
|
+
new Promise((resolve) => (timer = setTimeout(resolve, this.#deadlineMs))),
|
|
266
|
+
]);
|
|
267
|
+
clearTimeout(timer);
|
|
268
|
+
}
|
|
269
|
+
if (this.input.signal?.aborted) return undefined;
|
|
270
|
+
if (this.#denied) return this.#denied.error;
|
|
271
|
+
if (this.#approval) return this.#approval.error;
|
|
272
|
+
if (this.#unavailable) return targetAuthorityUnavailable(options.retryable);
|
|
273
|
+
return undefined;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
#public(error: unknown, retryable: boolean): unknown {
|
|
277
|
+
const outcome = this.#outcome(error);
|
|
278
|
+
return outcome === "unavailable" ? targetAuthorityUnavailable(retryable) : error;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
#outcome(error: unknown): Outcome {
|
|
282
|
+
if (error instanceof TargetFenceClosedError) return "closed";
|
|
283
|
+
if (this.input.signal?.aborted) return "aborted";
|
|
284
|
+
if (error instanceof ToolGatewayApprovalRequiredError) return "approval_required";
|
|
285
|
+
if (error instanceof ToolGatewayBlockedError) return "denied";
|
|
286
|
+
if (error instanceof HTTPException) {
|
|
287
|
+
if (error.status >= 500 || error.status === 408 || error.status === 429) return "unavailable";
|
|
288
|
+
// A conflict is a changed decision, never unavailable authority.
|
|
289
|
+
return error.status === 409 ? "approval_required" : "denied";
|
|
290
|
+
}
|
|
291
|
+
// Database, pool and deadline failures: authority could not be read.
|
|
292
|
+
return "unavailable";
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
#evaluate(full: boolean): Promise<void> {
|
|
296
|
+
const started = performance.now();
|
|
297
|
+
this.stats.evaluations++;
|
|
298
|
+
if (full) this.stats.full++;
|
|
299
|
+
const run = this.#run(full);
|
|
300
|
+
// Registered before the caller can observe the rejection, so `settle()`
|
|
301
|
+
// always sees this outcome.
|
|
302
|
+
const recorded = run.then(
|
|
303
|
+
() => undefined,
|
|
304
|
+
(error: unknown) => this.#record(error),
|
|
305
|
+
);
|
|
306
|
+
const tracked = recorded.finally(() => {
|
|
307
|
+
this.stats.durationMs += performance.now() - started;
|
|
308
|
+
this.#pending.delete(tracked);
|
|
309
|
+
});
|
|
310
|
+
this.#pending.add(tracked);
|
|
311
|
+
return run;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
#record(error: unknown) {
|
|
315
|
+
const outcome = this.#outcome(error);
|
|
316
|
+
this.stats.outcomes[outcome] = (this.stats.outcomes[outcome] ?? 0) + 1;
|
|
317
|
+
if (outcome === "denied") this.#denied ??= { error };
|
|
318
|
+
else if (outcome === "approval_required") this.#approval ??= { error };
|
|
319
|
+
else if (outcome === "unavailable") this.#unavailable = true;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
async #run(full: boolean): Promise<void> {
|
|
323
|
+
this.assertOpen();
|
|
324
|
+
if (full && this.input.targeted && !this.#route)
|
|
325
|
+
throw new HTTPException(403, { message: "tool_access_changed" });
|
|
326
|
+
// The deadline (or the request's end) answers at once and stops the work:
|
|
327
|
+
// no later part starts, and its transaction rolls back.
|
|
328
|
+
const expiry = new AbortController();
|
|
329
|
+
const timer = setTimeout(() => expiry.abort(new TargetFenceDeadlineError()), this.#deadlineMs);
|
|
330
|
+
const stop = this.input.signal
|
|
331
|
+
? AbortSignal.any([expiry.signal, this.input.signal])
|
|
332
|
+
: expiry.signal;
|
|
333
|
+
const stopped = new Promise<never>((_, reject) => {
|
|
334
|
+
if (stop.aborted) reject(stop.reason);
|
|
335
|
+
else stop.addEventListener("abort", () => reject(stop.reason), { once: true });
|
|
336
|
+
});
|
|
337
|
+
stopped.catch(() => undefined);
|
|
338
|
+
const work = this.#parts(full, stop);
|
|
339
|
+
work.catch(() => undefined);
|
|
340
|
+
try {
|
|
341
|
+
await Promise.race([work, stopped]);
|
|
342
|
+
} finally {
|
|
343
|
+
clearTimeout(timer);
|
|
344
|
+
}
|
|
345
|
+
this.assertOpen();
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
async #parts(full: boolean, stop: AbortSignal): Promise<void> {
|
|
349
|
+
// Site, route and policy first; a service caller reads its key last, so the
|
|
350
|
+
// caller fact is the freshest at dispatch.
|
|
351
|
+
const scoped = [
|
|
352
|
+
...(full ? [this.#site, this.#route, this.#policy] : []),
|
|
353
|
+
this.input.caller.scoped,
|
|
354
|
+
].filter((check): check is TargetFenceCheck => check !== undefined);
|
|
355
|
+
const results = await Promise.allSettled([
|
|
356
|
+
scoped.length > 0
|
|
357
|
+
? withDatabaseStatementTimeout(this.input.db, this.#deadlineMs, async (bounded) => {
|
|
358
|
+
// Also when the transaction starts: it may have waited for a
|
|
359
|
+
// pooled connection past the deadline.
|
|
360
|
+
stop.throwIfAborted();
|
|
361
|
+
for (const check of scoped) {
|
|
362
|
+
await check(bounded, stop);
|
|
363
|
+
stop.throwIfAborted();
|
|
364
|
+
}
|
|
365
|
+
})
|
|
366
|
+
: undefined,
|
|
367
|
+
this.input.caller.standalone?.(stop),
|
|
368
|
+
]);
|
|
369
|
+
const failures = results.flatMap((result) =>
|
|
370
|
+
result.status === "rejected" ? [result.reason as unknown] : [],
|
|
371
|
+
);
|
|
372
|
+
if (failures.length === 0) return;
|
|
373
|
+
// A denial outranks unavailable authority from the concurrent part.
|
|
374
|
+
throw (
|
|
375
|
+
failures.find((error) => this.#outcome(error) === "denied") ??
|
|
376
|
+
failures.find((error) => this.#outcome(error) === "approval_required") ??
|
|
377
|
+
failures[0]
|
|
378
|
+
);
|
|
379
|
+
}
|
|
380
|
+
}
|