@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,60 @@
|
|
|
1
|
+
import type { Context, Hono } from "hono";
|
|
2
|
+
import { matchedRoutes } from "hono/route";
|
|
3
|
+
|
|
4
|
+
type RegisteredRoute = { method: string; path: string; handler: unknown };
|
|
5
|
+
|
|
6
|
+
const PROBED_METHODS = ["GET", "POST", "PUT", "PATCH", "DELETE"] as const;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Whether a matched Hono route is a terminal handler rather than middleware.
|
|
10
|
+
*
|
|
11
|
+
* Method-specific registrations (`app.get`, `app.put`, `app.on([...])`) always
|
|
12
|
+
* belong to a real route. `app.use` and `app.all` both register the `ALL`
|
|
13
|
+
* method; Hono itself tells them apart by arity - middleware takes
|
|
14
|
+
* `(context, next)` - so the same rule is applied here.
|
|
15
|
+
*/
|
|
16
|
+
function isTerminalRoute(route: RegisteredRoute): boolean {
|
|
17
|
+
if (route.method.toUpperCase() !== "ALL") return true;
|
|
18
|
+
return typeof route.handler === "function" && route.handler.length < 2;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function routesFor(app: Hono, method: string, path: string): RegisteredRoute[] {
|
|
22
|
+
// Every Hono router returns `[[ [handler, route], params ][], stash?]`.
|
|
23
|
+
const result = app.router.match(method, path) as unknown as [
|
|
24
|
+
Array<[[unknown, RegisteredRoute], unknown]>,
|
|
25
|
+
...unknown[],
|
|
26
|
+
];
|
|
27
|
+
return result[0].map(([[, route]]) => route);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export type UnmatchedRoute = { status: 404 } | { status: 405; allow: string[] };
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Classify a request no registered handler can answer, BEFORE authentication
|
|
34
|
+
* or authorization middleware runs. Those layers otherwise turn a request for a
|
|
35
|
+
* route that does not exist into an authorization-shaped failure (for example
|
|
36
|
+
* the fail-closed session operation classifier answering a retryable 503), so
|
|
37
|
+
* a client probing an unknown method or path would be told to retry forever.
|
|
38
|
+
*
|
|
39
|
+
* Returns null when the request has a handler, or when classification itself
|
|
40
|
+
* fails (fail open: the request keeps its previous routing behavior).
|
|
41
|
+
*/
|
|
42
|
+
export function unmatchedRoute(app: Hono, c: Context): UnmatchedRoute | null {
|
|
43
|
+
const method = c.req.method.toUpperCase();
|
|
44
|
+
// CORS preflights are answered by middleware and have no route handlers.
|
|
45
|
+
if (method === "OPTIONS") return null;
|
|
46
|
+
try {
|
|
47
|
+
if (matchedRoutes(c).some((route) => isTerminalRoute(route as RegisteredRoute))) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
const effectiveMethod = method === "HEAD" ? "GET" : method;
|
|
51
|
+
const allow = PROBED_METHODS.filter(
|
|
52
|
+
(candidate) =>
|
|
53
|
+
candidate !== effectiveMethod &&
|
|
54
|
+
routesFor(app, candidate, c.req.path).some(isTerminalRoute),
|
|
55
|
+
);
|
|
56
|
+
return allow.length > 0 ? { status: 405, allow } : { status: 404 };
|
|
57
|
+
} catch {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Response headers for user-controlled bytes served from the API origin.
|
|
3
|
+
*
|
|
4
|
+
* Retained files, screenshots, exports, and live frames carry bytes and, for
|
|
5
|
+
* uploads, a content type chosen by a user or agent. The API shares its origin
|
|
6
|
+
* with the web console in the default deployment, so a stored `text/html` file
|
|
7
|
+
* opened by top-level navigation would otherwise run as that origin.
|
|
8
|
+
*
|
|
9
|
+
* Every such response therefore:
|
|
10
|
+
* - is a sandboxed document with no script, form, popup, plugin, or network
|
|
11
|
+
* capability (`sandbox` plus `default-src 'none'`). Raster images and text
|
|
12
|
+
* still render when a URL is opened directly;
|
|
13
|
+
* - cannot be embedded by another site as a no-cors subresource (CORP);
|
|
14
|
+
* - is never re-sniffed into a different type (`nosniff`).
|
|
15
|
+
*
|
|
16
|
+
* Audio and video keep their real origin (`sandbox allow-same-origin`, still
|
|
17
|
+
* without `allow-scripts`): the browser's synthesized media document re-fetches
|
|
18
|
+
* its own URL, and from an opaque origin that same-origin-only request would be
|
|
19
|
+
* refused. With scripts disabled and `nosniff`, such a response can only ever
|
|
20
|
+
* be a media player, never attacker markup.
|
|
21
|
+
*
|
|
22
|
+
* Markup types that a browser would render as an active document (HTML, XML,
|
|
23
|
+
* SVG, multipart) are additionally served as attachments, so a direct
|
|
24
|
+
* navigation downloads the bytes instead of showing attacker-authored markup on
|
|
25
|
+
* the app origin. The console never navigates to these routes: it reads bytes
|
|
26
|
+
* through the SDK and renders them in app-owned elements, so neither header
|
|
27
|
+
* changes an in-app preview. Signed object-storage GET URLs for active markup
|
|
28
|
+
* carry the same attachment as a signed response override
|
|
29
|
+
* (`userContentSignedGetUrlOptions`), because the storage endpoint is not
|
|
30
|
+
* always a separate site.
|
|
31
|
+
*/
|
|
32
|
+
const USER_CONTENT_FETCH_DIRECTIVES =
|
|
33
|
+
"default-src 'none'; img-src 'self' data: blob:; media-src 'self' data: blob:; style-src 'unsafe-inline'";
|
|
34
|
+
|
|
35
|
+
export const USER_CONTENT_SECURITY_POLICY = `${USER_CONTENT_FETCH_DIRECTIVES}; sandbox`;
|
|
36
|
+
|
|
37
|
+
/** Media players only; scripts stay disabled (see the module comment). */
|
|
38
|
+
export const USER_MEDIA_CONTENT_SECURITY_POLICY = `${USER_CONTENT_FETCH_DIRECTIVES}; sandbox allow-same-origin`;
|
|
39
|
+
|
|
40
|
+
export const USER_CONTENT_SECURITY_HEADERS = Object.freeze({
|
|
41
|
+
"Content-Security-Policy": USER_CONTENT_SECURITY_POLICY,
|
|
42
|
+
"Cross-Origin-Resource-Policy": "same-origin",
|
|
43
|
+
"X-Content-Type-Options": "nosniff",
|
|
44
|
+
} as const);
|
|
45
|
+
|
|
46
|
+
const ACTIVE_DOCUMENT_TYPES = new Set(["text/html", "text/xml", "text/xsl", "application/xml"]);
|
|
47
|
+
|
|
48
|
+
/** Media type essence (no parameters), lowercased. */
|
|
49
|
+
function mediaTypeEssence(contentType: string): string {
|
|
50
|
+
return (contentType.split(";", 1)[0] ?? "").trim().toLowerCase();
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* True when a browser would render this type as an active document (HTML,
|
|
55
|
+
* XHTML, SVG, any XML dialect, or multipart replacement streams). Anything that
|
|
56
|
+
* is not a clean `type/subtype` token is treated as active too.
|
|
57
|
+
*/
|
|
58
|
+
export function isActiveUserContentType(contentType: string): boolean {
|
|
59
|
+
const essence = mediaTypeEssence(contentType);
|
|
60
|
+
if (!/^[a-z0-9][a-z0-9!#$&^_.+-]*\/[a-z0-9][a-z0-9!#$&^_.+-]*$/.test(essence)) return true;
|
|
61
|
+
return (
|
|
62
|
+
ACTIVE_DOCUMENT_TYPES.has(essence) ||
|
|
63
|
+
essence.endsWith("+xml") ||
|
|
64
|
+
essence.startsWith("multipart/")
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const DISPOSITION_FILENAME_MAX_CHARS = 200;
|
|
69
|
+
|
|
70
|
+
/** RFC 8187 `attr-char` percent-encoding (stricter than `encodeURIComponent`). */
|
|
71
|
+
function encodeExtendedParameterValue(value: string): string {
|
|
72
|
+
return encodeURIComponent(value).replace(
|
|
73
|
+
/['()*]/g,
|
|
74
|
+
(character) => `%${character.charCodeAt(0).toString(16).toUpperCase()}`,
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* RFC 6266 filename parameters: an ASCII-only quoted `filename` that cannot
|
|
80
|
+
* break out of the header, plus an RFC 8187 `filename*` carrying the original
|
|
81
|
+
* name (for example non-Latin names) whenever the ASCII form had to change it.
|
|
82
|
+
*/
|
|
83
|
+
function dispositionFilenameParameters(filename: string): string {
|
|
84
|
+
const cleaned = Array.from(
|
|
85
|
+
filename
|
|
86
|
+
.replace(/[\u0000-\u001f\u007f/\\]+/g, "_")
|
|
87
|
+
// Lone surrogates cannot be percent-encoded as UTF-8.
|
|
88
|
+
.replace(/[\ud800-\udbff](?![\udc00-\udfff])|(?<![\ud800-\udbff])[\udc00-\udfff]/g, "_")
|
|
89
|
+
.trim(),
|
|
90
|
+
)
|
|
91
|
+
.slice(0, DISPOSITION_FILENAME_MAX_CHARS)
|
|
92
|
+
.join("");
|
|
93
|
+
const ascii =
|
|
94
|
+
cleaned
|
|
95
|
+
.replace(/[^A-Za-z0-9._ -]+/g, "_")
|
|
96
|
+
.replace(/\s+/g, " ")
|
|
97
|
+
.trim()
|
|
98
|
+
.slice(0, DISPOSITION_FILENAME_MAX_CHARS) || "download";
|
|
99
|
+
if (!cleaned || ascii === cleaned) return `filename="${ascii}"`;
|
|
100
|
+
return `filename="${ascii}"; filename*=UTF-8''${encodeExtendedParameterValue(cleaned)}`;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** `Content-Disposition: attachment` for active markup; inline types are unchanged. */
|
|
104
|
+
export function userContentDispositionHeaders(
|
|
105
|
+
contentType: string,
|
|
106
|
+
filename?: string | null,
|
|
107
|
+
): { "Content-Disposition": string } | Record<string, never> {
|
|
108
|
+
if (!isActiveUserContentType(contentType)) return {};
|
|
109
|
+
return {
|
|
110
|
+
"Content-Disposition": filename
|
|
111
|
+
? `attachment; ${dispositionFilenameParameters(filename)}`
|
|
112
|
+
: "attachment",
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Signed object-storage GET options for one stored object: active markup gets
|
|
118
|
+
* a signed `attachment` response override, so a browser that opens the URL
|
|
119
|
+
* downloads the bytes instead of rendering them with their stored type. The
|
|
120
|
+
* storage endpoint is not always a separate site (local development serves it
|
|
121
|
+
* from loopback, and a preview may route the bucket path on the app origin),
|
|
122
|
+
* so a signed URL follows the same rule as the API routes. Spread into
|
|
123
|
+
* `createGetUrl`; inline types add nothing.
|
|
124
|
+
*/
|
|
125
|
+
export function userContentSignedGetUrlOptions(
|
|
126
|
+
contentType: string,
|
|
127
|
+
filename?: string | null,
|
|
128
|
+
): { responseContentDisposition: string } | Record<string, never> {
|
|
129
|
+
const headers = userContentDispositionHeaders(contentType, filename);
|
|
130
|
+
return "Content-Disposition" in headers
|
|
131
|
+
? { responseContentDisposition: headers["Content-Disposition"] }
|
|
132
|
+
: {};
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/** True for audio and video types the browser plays in a synthesized media document. */
|
|
136
|
+
export function isPlayableMediaUserContentType(contentType: string): boolean {
|
|
137
|
+
const essence = mediaTypeEssence(contentType);
|
|
138
|
+
return !isActiveUserContentType(essence) && /^(audio|video)\//.test(essence);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/** Sandbox policy for one response; only playable media keeps its origin. */
|
|
142
|
+
export function userContentSecurityPolicy(contentType: string): string {
|
|
143
|
+
return isPlayableMediaUserContentType(contentType)
|
|
144
|
+
? USER_MEDIA_CONTENT_SECURITY_POLICY
|
|
145
|
+
: USER_CONTENT_SECURITY_POLICY;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/** Full header set for one user-content response with the given content type. */
|
|
149
|
+
export function userContentResponseHeaders(
|
|
150
|
+
contentType: string,
|
|
151
|
+
filename?: string | null,
|
|
152
|
+
): Record<string, string> {
|
|
153
|
+
return {
|
|
154
|
+
...USER_CONTENT_SECURITY_HEADERS,
|
|
155
|
+
"Content-Security-Policy": userContentSecurityPolicy(contentType),
|
|
156
|
+
...userContentDispositionHeaders(contentType, filename),
|
|
157
|
+
};
|
|
158
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import type { VaultApiError } from "@opengeni/contracts";
|
|
2
|
+
import type { Context } from "hono";
|
|
3
|
+
import { HTTPException } from "hono/http-exception";
|
|
4
|
+
|
|
5
|
+
const VARIABLE_SETS_REMOVED_MESSAGE =
|
|
6
|
+
"Variable Sets were replaced by vaults. Save secrets with /v1/workspaces/{workspaceId}/vaults and choose a session's vaults with PUT /sessions/{sessionId}/vault-policy.";
|
|
7
|
+
|
|
8
|
+
/** The RM-1 answer for legacy Variable Set routes (410) and fields (422). */
|
|
9
|
+
export function variableSetsRemovedResponse(
|
|
10
|
+
c: Context,
|
|
11
|
+
status: 410 | 422,
|
|
12
|
+
fields?: readonly string[],
|
|
13
|
+
): Response {
|
|
14
|
+
const body: VaultApiError = {
|
|
15
|
+
error: "variable_sets_removed",
|
|
16
|
+
message: VARIABLE_SETS_REMOVED_MESSAGE,
|
|
17
|
+
details: { vaultsPath: "/vaults", ...(fields?.length ? { fields: [...fields] } : {}) },
|
|
18
|
+
};
|
|
19
|
+
return c.json(body, status);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** Thrown where a route cannot return directly; `app.onError` renders it. */
|
|
23
|
+
export class VariableSetsRemovedError extends Error {
|
|
24
|
+
override readonly name = "VariableSetsRemovedError";
|
|
25
|
+
constructor(readonly fields: readonly string[]) {
|
|
26
|
+
super(`variable_sets_removed: ${fields.join(", ")}`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const CORE_VARIABLE_SETS_REMOVED = /^variable_sets_removed: (\S+) /;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* The RM-1 body for a removed-field error from a route or from core's
|
|
34
|
+
* `variableSetsRemovedError`, or null for any other error.
|
|
35
|
+
*/
|
|
36
|
+
export function variableSetsRemovedErrorResponse(c: Context, error: unknown): Response | null {
|
|
37
|
+
if (error instanceof VariableSetsRemovedError) {
|
|
38
|
+
return variableSetsRemovedResponse(c, 422, error.fields);
|
|
39
|
+
}
|
|
40
|
+
if (error instanceof HTTPException && error.status === 422) {
|
|
41
|
+
const field = CORE_VARIABLE_SETS_REMOVED.exec(error.message)?.[1];
|
|
42
|
+
if (field) return variableSetsRemovedResponse(c, 422, [field]);
|
|
43
|
+
}
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Legacy selection fields that still carry a choice. Empty arrays and null
|
|
49
|
+
* mean "no Variable Sets" and stay accepted so old clients keep working.
|
|
50
|
+
*/
|
|
51
|
+
export function legacyVariableSetFields(payload: unknown): string[] {
|
|
52
|
+
if (!payload || typeof payload !== "object" || Array.isArray(payload)) return [];
|
|
53
|
+
const record = payload as Record<string, unknown>;
|
|
54
|
+
const fields: string[] = [];
|
|
55
|
+
for (const field of ["variableSetIds", "defaultVariableSetIds"] as const) {
|
|
56
|
+
const ids = record[field];
|
|
57
|
+
if (ids !== undefined && ids !== null && !(Array.isArray(ids) && ids.length === 0)) {
|
|
58
|
+
fields.push(field);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
for (const field of ["variableSetId", "environmentId"] as const) {
|
|
62
|
+
if (record[field] !== undefined && record[field] !== null) fields.push(field);
|
|
63
|
+
}
|
|
64
|
+
return fields;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** True when the body explicitly clears a legacy selection (`null` or `[]`). */
|
|
68
|
+
export function clearsLegacyVariableSet(payload: unknown): boolean {
|
|
69
|
+
if (!payload || typeof payload !== "object" || Array.isArray(payload)) return false;
|
|
70
|
+
const record = payload as Record<string, unknown>;
|
|
71
|
+
return (
|
|
72
|
+
(Object.hasOwn(record, "variableSetId") && record.variableSetId === null) ||
|
|
73
|
+
(Object.hasOwn(record, "environmentId") && record.environmentId === null) ||
|
|
74
|
+
(Array.isArray(record.variableSetIds) && record.variableSetIds.length === 0)
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const LEGACY_VARIABLE_SET_FIELDS = [
|
|
79
|
+
"variableSetIds",
|
|
80
|
+
"variableSetId",
|
|
81
|
+
"environmentId",
|
|
82
|
+
"defaultVariableSetIds",
|
|
83
|
+
] as const;
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Drops every (empty) legacy Variable Set field so nothing downstream can act
|
|
87
|
+
* on one. Call after {@link legacyVariableSetFields} found none set.
|
|
88
|
+
*/
|
|
89
|
+
export function withoutLegacyVariableSetFields(payload: unknown): unknown {
|
|
90
|
+
if (!payload || typeof payload !== "object" || Array.isArray(payload)) return payload;
|
|
91
|
+
const rest: Record<string, unknown> = { ...(payload as Record<string, unknown>) };
|
|
92
|
+
for (const field of LEGACY_VARIABLE_SET_FIELDS) delete rest[field];
|
|
93
|
+
return rest;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* The RM-1 boundary for one JSON body: a 422 `variable_sets_removed` response
|
|
98
|
+
* when a legacy field still carries a choice, otherwise the body without them.
|
|
99
|
+
*/
|
|
100
|
+
export function rejectLegacyVariableSetFields(
|
|
101
|
+
c: Context,
|
|
102
|
+
payload: unknown,
|
|
103
|
+
): { response: Response } | { payload: unknown } {
|
|
104
|
+
const fields = legacyVariableSetFields(payload);
|
|
105
|
+
if (fields.length > 0) return { response: variableSetsRemovedResponse(c, 422, fields) };
|
|
106
|
+
return { payload: withoutLegacyVariableSetFields(payload) };
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Old clients send `variableSetId: null` / `environmentId: null` to mean "no
|
|
111
|
+
* Variable Sets". The create schema only takes the array form, so translate the
|
|
112
|
+
* accepted empty legacy fields to it. Call after {@link legacyVariableSetFields}.
|
|
113
|
+
*/
|
|
114
|
+
export function withoutEmptyLegacyVariableSetFields(payload: unknown): unknown {
|
|
115
|
+
if (!payload || typeof payload !== "object" || Array.isArray(payload)) return payload;
|
|
116
|
+
const record = payload as Record<string, unknown>;
|
|
117
|
+
if (!Object.hasOwn(record, "variableSetId") && !Object.hasOwn(record, "environmentId")) {
|
|
118
|
+
return payload;
|
|
119
|
+
}
|
|
120
|
+
const { variableSetId: _variableSetId, environmentId: _environmentId, ...rest } = record;
|
|
121
|
+
return { ...rest, variableSetIds: rest.variableSetIds ?? [] };
|
|
122
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { localBrowserBoundaryResponse, type LocalBrowserBoundary } from "./local-browser-boundary";
|
|
2
|
+
|
|
3
|
+
export type ApiWebSocketUpgradeRoute<Server> = {
|
|
4
|
+
handles(request: Request): boolean;
|
|
5
|
+
upgrade(request: Request, server: Server): Response | undefined;
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export type ApiWebSocketUpgradeDispatch =
|
|
9
|
+
| { handled: false }
|
|
10
|
+
| { handled: true; response: Response | undefined };
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* WebSocket upgrades bypass the Hono app, so the local-mode browser boundary
|
|
14
|
+
* (./local-browser-boundary.ts) is applied here before a transport upgrades.
|
|
15
|
+
* Returns `{ handled: false }` when no transport claims the request, so the
|
|
16
|
+
* caller dispatches it to the app, where the boundary runs as middleware.
|
|
17
|
+
*/
|
|
18
|
+
export function dispatchApiWebSocketUpgrade<Server>(
|
|
19
|
+
request: Request,
|
|
20
|
+
server: Server,
|
|
21
|
+
routes: ReadonlyArray<ApiWebSocketUpgradeRoute<Server>>,
|
|
22
|
+
localBrowserBoundary: LocalBrowserBoundary | null,
|
|
23
|
+
): ApiWebSocketUpgradeDispatch {
|
|
24
|
+
const route = routes.find((candidate) => candidate.handles(request));
|
|
25
|
+
if (!route) return { handled: false };
|
|
26
|
+
const rejection = localBrowserBoundary?.rejection(request);
|
|
27
|
+
if (rejection) return { handled: true, response: localBrowserBoundaryResponse(rejection) };
|
|
28
|
+
return { handled: true, response: route.upgrade(request, server) };
|
|
29
|
+
}
|