@opengeni/api-router 3.0.1 → 3.0.2-canary.38894290271001
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-AJ62T5QN.js → chunk-GBUJ2DYZ.js} +80507 -39878
- package/dist/chunk-GBUJ2DYZ.js.map +1 -0
- package/dist/chunk-OGQDXVXY.js +18 -0
- package/dist/chunk-OGQDXVXY.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 +150 -49
- 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,394 @@
|
|
|
1
|
+
// First-party web-client error beacon.
|
|
2
|
+
//
|
|
3
|
+
// The browser reports a closed error kind, the matched route PATTERN (never a
|
|
4
|
+
// concrete URL), its bundle revision, and optional error diagnostics: the
|
|
5
|
+
// error's name, message and stack, and React's component stack for a render
|
|
6
|
+
// failure. The diagnostics are error text, which can occasionally quote user
|
|
7
|
+
// content; the route re-applies the shared scrubbing and per-field bounds of
|
|
8
|
+
// @opengeni/contracts/client-error-report to whatever it receives, so obvious
|
|
9
|
+
// credentials and URL query strings never reach the log. The route admits
|
|
10
|
+
// anonymous callers so a failure before sign-in is still counted. Each
|
|
11
|
+
// accepted report increments one closed-label counter and writes one bounded
|
|
12
|
+
// structured log line. This is an operational lower bound, not exhaustive
|
|
13
|
+
// exception capture: blocked requests, closed tabs, and the per-process
|
|
14
|
+
// admission bound all drop reports. Because the route is anonymous, any HTTP
|
|
15
|
+
// client that omits or forges `Origin` can still send reports up to the
|
|
16
|
+
// admission ceiling, so alert on rates and ratios, not on absolute counts, and
|
|
17
|
+
// treat the diagnostic text as untrusted.
|
|
18
|
+
//
|
|
19
|
+
// The same route admits closed operational signals discriminated by a
|
|
20
|
+
// `signal` field: key requests that failed before any HTTP response
|
|
21
|
+
// (`opengeni_client_request_failures_total{action,reason}`), live-stream health
|
|
22
|
+
// (`opengeni_client_stream_events_total{stream,event}`), and web vitals
|
|
23
|
+
// (`opengeni_client_web_vital{metric,page}`). They carry the same closed-value
|
|
24
|
+
// guarantees and have their own per-key admission buckets, so a burst of one
|
|
25
|
+
// signal never spends the error kinds' budget.
|
|
26
|
+
import type { Settings } from "@opengeni/config";
|
|
27
|
+
import {
|
|
28
|
+
CLIENT_ERROR_KINDS,
|
|
29
|
+
CLIENT_ERROR_REPORT_MAX_BYTES,
|
|
30
|
+
CLIENT_ERROR_REVISION_PATTERN,
|
|
31
|
+
CLIENT_ERROR_ROUTE_PATTERN,
|
|
32
|
+
CLIENT_ERRORS_PATH,
|
|
33
|
+
CLIENT_PAGES,
|
|
34
|
+
CLIENT_REQUEST_ACTIONS,
|
|
35
|
+
CLIENT_REQUEST_FAILURE_REASONS,
|
|
36
|
+
CLIENT_SIGNALS,
|
|
37
|
+
CLIENT_STREAM_EVENTS,
|
|
38
|
+
CLIENT_STREAMS,
|
|
39
|
+
CLIENT_WEB_VITAL_MAX_VALUE,
|
|
40
|
+
CLIENT_WEB_VITAL_METRICS,
|
|
41
|
+
projectClientErrorDetail,
|
|
42
|
+
type ClientErrorDetail,
|
|
43
|
+
type ClientErrorKind,
|
|
44
|
+
type ClientSignal,
|
|
45
|
+
} from "@opengeni/contracts/client-error-report";
|
|
46
|
+
import type { Observability } from "@opengeni/observability";
|
|
47
|
+
import type { Context, Hono } from "hono";
|
|
48
|
+
import { bodyLimit } from "hono/body-limit";
|
|
49
|
+
import { z } from "zod";
|
|
50
|
+
|
|
51
|
+
import { isAllowedBrowserOrigin } from "../http/cors";
|
|
52
|
+
import { createKeyedAdmission, type KeyedAdmission } from "../http/keyed-admission";
|
|
53
|
+
|
|
54
|
+
export {
|
|
55
|
+
CLIENT_ERROR_KINDS,
|
|
56
|
+
CLIENT_ERROR_REPORT_MAX_BYTES,
|
|
57
|
+
CLIENT_ERRORS_PATH,
|
|
58
|
+
type ClientErrorKind,
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
const CLIENT_ERROR_REJECTION_REASONS = ["invalid", "too_large", "origin", "rate_limited"] as const;
|
|
62
|
+
type ClientErrorRejectionReason = (typeof CLIENT_ERROR_REJECTION_REASONS)[number];
|
|
63
|
+
|
|
64
|
+
// Field lengths are bounded by the body limit; the projection below scrubs and
|
|
65
|
+
// cuts each one to its own bound.
|
|
66
|
+
const ClientErrorDetailInput = z
|
|
67
|
+
.object({
|
|
68
|
+
name: z.string().optional(),
|
|
69
|
+
message: z.string().optional(),
|
|
70
|
+
stack: z.string().optional(),
|
|
71
|
+
componentStack: z.string().optional(),
|
|
72
|
+
})
|
|
73
|
+
.strict();
|
|
74
|
+
|
|
75
|
+
export const ClientErrorReport = z
|
|
76
|
+
.object({
|
|
77
|
+
kind: z.enum(CLIENT_ERROR_KINDS),
|
|
78
|
+
route: z.string().regex(CLIENT_ERROR_ROUTE_PATTERN),
|
|
79
|
+
revision: z.string().regex(CLIENT_ERROR_REVISION_PATTERN),
|
|
80
|
+
error: ClientErrorDetailInput.optional(),
|
|
81
|
+
})
|
|
82
|
+
.strict()
|
|
83
|
+
.transform(({ error, ...report }) => {
|
|
84
|
+
const detail = projectClientErrorDetail(error);
|
|
85
|
+
return detail ? { ...report, error: detail } : report;
|
|
86
|
+
});
|
|
87
|
+
export type ClientErrorReport = {
|
|
88
|
+
kind: ClientErrorKind;
|
|
89
|
+
route: string;
|
|
90
|
+
revision: string;
|
|
91
|
+
error?: ClientErrorDetail;
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
const route = z.string().regex(CLIENT_ERROR_ROUTE_PATTERN);
|
|
95
|
+
const revision = z.string().regex(CLIENT_ERROR_REVISION_PATTERN);
|
|
96
|
+
|
|
97
|
+
export const ClientSignalReport = z.discriminatedUnion("signal", [
|
|
98
|
+
z
|
|
99
|
+
.object({
|
|
100
|
+
signal: z.literal("request_failure"),
|
|
101
|
+
action: z.enum(CLIENT_REQUEST_ACTIONS),
|
|
102
|
+
reason: z.enum(CLIENT_REQUEST_FAILURE_REASONS),
|
|
103
|
+
route,
|
|
104
|
+
revision,
|
|
105
|
+
})
|
|
106
|
+
.strict(),
|
|
107
|
+
z
|
|
108
|
+
.object({
|
|
109
|
+
signal: z.literal("stream"),
|
|
110
|
+
stream: z.enum(CLIENT_STREAMS),
|
|
111
|
+
event: z.enum(CLIENT_STREAM_EVENTS),
|
|
112
|
+
route,
|
|
113
|
+
revision,
|
|
114
|
+
})
|
|
115
|
+
.strict(),
|
|
116
|
+
z
|
|
117
|
+
.object({
|
|
118
|
+
signal: z.literal("web_vital"),
|
|
119
|
+
metric: z.enum(CLIENT_WEB_VITAL_METRICS),
|
|
120
|
+
page: z.enum(CLIENT_PAGES),
|
|
121
|
+
value: z.number().finite().nonnegative(),
|
|
122
|
+
revision,
|
|
123
|
+
})
|
|
124
|
+
.strict()
|
|
125
|
+
.refine((report) => report.value <= CLIENT_WEB_VITAL_MAX_VALUE[report.metric]),
|
|
126
|
+
]);
|
|
127
|
+
export type ClientSignalReport = z.infer<typeof ClientSignalReport>;
|
|
128
|
+
export type ClientBeaconReport = ClientErrorReport | ClientSignalReport;
|
|
129
|
+
|
|
130
|
+
const CLIENT_ERRORS_METRIC = {
|
|
131
|
+
name: "opengeni_client_errors_total",
|
|
132
|
+
help: "Web client errors reported by browsers, by closed kind. Admission is bounded per API process, so this is a lower bound.",
|
|
133
|
+
} as const;
|
|
134
|
+
const CLIENT_ERROR_REJECTIONS_METRIC = {
|
|
135
|
+
name: "opengeni_client_error_reports_rejected_total",
|
|
136
|
+
help: 'Web client error reports the API refused, by closed reason and kind ("unknown" when the body was not read or not valid).',
|
|
137
|
+
} as const;
|
|
138
|
+
|
|
139
|
+
const CLIENT_REQUEST_FAILURES_METRIC = {
|
|
140
|
+
name: "opengeni_client_request_failures_total",
|
|
141
|
+
help: "Key web client requests that failed before any HTTP response, by closed action and reason (network, timeout, offline). Admission is bounded per API process, so this is a lower bound.",
|
|
142
|
+
} as const;
|
|
143
|
+
const CLIENT_STREAM_EVENTS_METRIC = {
|
|
144
|
+
name: "opengeni_client_stream_events_total",
|
|
145
|
+
help: "Web client live-stream health events, by stream (session, workspace) and closed event (reconnect, reconnect_exhausted, long_disconnect). Admission is bounded per API process, so this is a lower bound.",
|
|
146
|
+
} as const;
|
|
147
|
+
const CLIENT_WEB_VITAL_METRIC = {
|
|
148
|
+
name: "opengeni_client_web_vital",
|
|
149
|
+
help: "Web vitals reported by browsers, by metric and closed page label. lcp, inp and ttfb are seconds; cls is the unitless layout-shift score.",
|
|
150
|
+
} as const;
|
|
151
|
+
/**
|
|
152
|
+
* Bucket bounds cover the published good/poor thresholds of every metric:
|
|
153
|
+
* CLS 0.1/0.25, INP 0.2/0.5 s, TTFB 0.8/1.8 s, LCP 2.5/4 s.
|
|
154
|
+
*/
|
|
155
|
+
export const CLIENT_WEB_VITAL_BUCKETS = [
|
|
156
|
+
0.01, 0.025, 0.05, 0.1, 0.2, 0.25, 0.5, 0.8, 1, 1.8, 2.5, 4, 6, 10, 20, 60,
|
|
157
|
+
];
|
|
158
|
+
|
|
159
|
+
export type ClientErrorAdmission = KeyedAdmission<ClientErrorKind>;
|
|
160
|
+
/** Keyed by `<signal>:<closed dimension>`, a finite set of buckets. */
|
|
161
|
+
export type ClientSignalAdmission = KeyedAdmission<string>;
|
|
162
|
+
|
|
163
|
+
/** Same bounds as the error kinds: one bucket per closed signal key. */
|
|
164
|
+
export function createClientSignalAdmission(
|
|
165
|
+
options: { capacity?: number; refillPerSecond?: number; now?: () => number } = {},
|
|
166
|
+
): ClientSignalAdmission {
|
|
167
|
+
return createKeyedAdmission<string>(options);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Web vitals arrive from every page load rather than only on failure, so they
|
|
172
|
+
* get a much larger dedicated bucket per metric (burst 1,200, then 20 a
|
|
173
|
+
* second per process). The browser samples vitals before sending.
|
|
174
|
+
*/
|
|
175
|
+
export function createClientWebVitalAdmission(
|
|
176
|
+
options: { capacity?: number; refillPerSecond?: number; now?: () => number } = {},
|
|
177
|
+
): ClientSignalAdmission {
|
|
178
|
+
return createKeyedAdmission<string>({ capacity: 1_200, refillPerSecond: 20, ...options });
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
function signalAdmissionKey(report: ClientSignalReport): string {
|
|
182
|
+
switch (report.signal) {
|
|
183
|
+
case "request_failure":
|
|
184
|
+
return `request_failure:${report.action}`;
|
|
185
|
+
case "stream":
|
|
186
|
+
return `stream:${report.stream}:${report.event}`;
|
|
187
|
+
case "web_vital":
|
|
188
|
+
return `web_vital:${report.metric}`;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* One token bucket per closed kind bounds counter inflation and log volume
|
|
194
|
+
* from any caller, including an anonymous one, without per-client state.
|
|
195
|
+
*/
|
|
196
|
+
export function createClientErrorAdmission(
|
|
197
|
+
options: { capacity?: number; refillPerSecond?: number; now?: () => number } = {},
|
|
198
|
+
): ClientErrorAdmission {
|
|
199
|
+
return createKeyedAdmission<ClientErrorKind>(options);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
export function parseClientErrorReport(body: string | null): ClientErrorReport | null {
|
|
203
|
+
const report = parseClientBeaconReport(body);
|
|
204
|
+
return report && !isClientSignalReport(report) ? report : null;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/** Parse any accepted beacon body: an error report or a closed signal report. */
|
|
208
|
+
export function parseClientBeaconReport(body: string | null): ClientBeaconReport | null {
|
|
209
|
+
if (body === null || new TextEncoder().encode(body).byteLength > CLIENT_ERROR_REPORT_MAX_BYTES) {
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
212
|
+
let value: unknown;
|
|
213
|
+
try {
|
|
214
|
+
value = JSON.parse(body);
|
|
215
|
+
} catch {
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
const error = ClientErrorReport.safeParse(value);
|
|
219
|
+
if (error.success) return error.data;
|
|
220
|
+
const signal = ClientSignalReport.safeParse(value);
|
|
221
|
+
return signal.success ? signal.data : null;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
export function isClientSignalReport(report: ClientBeaconReport): report is ClientSignalReport {
|
|
225
|
+
return "signal" in report;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* The exact beacon request. The app-wide request-body limit skips it because
|
|
230
|
+
* the route enforces its own small limit on the streamed body; the generic
|
|
231
|
+
* ceiling would otherwise buffer a chunked body of many megabytes on an
|
|
232
|
+
* anonymous route before this one could refuse it.
|
|
233
|
+
*/
|
|
234
|
+
export function isClientErrorReportRequest(method: string, pathname: string): boolean {
|
|
235
|
+
return method === "POST" && pathname === CLIENT_ERRORS_PATH;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
export function registerClientErrorRoutes(
|
|
239
|
+
app: Hono,
|
|
240
|
+
deps: {
|
|
241
|
+
observability: Observability;
|
|
242
|
+
settings: Pick<Settings, "corsAllowOriginRegex" | "publicBaseUrl" | "webBaseUrl">;
|
|
243
|
+
admission?: ClientErrorAdmission;
|
|
244
|
+
signalAdmission?: ClientSignalAdmission;
|
|
245
|
+
webVitalAdmission?: ClientSignalAdmission;
|
|
246
|
+
},
|
|
247
|
+
): void {
|
|
248
|
+
const { observability, settings } = deps;
|
|
249
|
+
const admission = deps.admission ?? createClientErrorAdmission();
|
|
250
|
+
const signalAdmission = deps.signalAdmission ?? createClientSignalAdmission();
|
|
251
|
+
const webVitalAdmission = deps.webVitalAdmission ?? createClientWebVitalAdmission();
|
|
252
|
+
// Publish the finite series at zero so the first failure after a deploy is
|
|
253
|
+
// an increase from a baseline rather than a series appearing from nothing.
|
|
254
|
+
for (const kind of CLIENT_ERROR_KINDS) {
|
|
255
|
+
observability.incrementCounter({ ...CLIENT_ERRORS_METRIC, labels: { kind }, amount: 0 });
|
|
256
|
+
observability.incrementCounter({
|
|
257
|
+
...CLIENT_ERROR_REJECTIONS_METRIC,
|
|
258
|
+
labels: { reason: "rate_limited", kind },
|
|
259
|
+
amount: 0,
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
for (const action of CLIENT_REQUEST_ACTIONS) {
|
|
263
|
+
for (const reason of CLIENT_REQUEST_FAILURE_REASONS) {
|
|
264
|
+
observability.incrementCounter({
|
|
265
|
+
...CLIENT_REQUEST_FAILURES_METRIC,
|
|
266
|
+
labels: { action, reason },
|
|
267
|
+
amount: 0,
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
for (const stream of CLIENT_STREAMS) {
|
|
272
|
+
for (const event of CLIENT_STREAM_EVENTS) {
|
|
273
|
+
observability.incrementCounter({
|
|
274
|
+
...CLIENT_STREAM_EVENTS_METRIC,
|
|
275
|
+
labels: { stream, event },
|
|
276
|
+
amount: 0,
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
// A rate-limited signal report is counted under its signal name as `kind`.
|
|
281
|
+
for (const signal of CLIENT_SIGNALS) {
|
|
282
|
+
observability.incrementCounter({
|
|
283
|
+
...CLIENT_ERROR_REJECTIONS_METRIC,
|
|
284
|
+
labels: { reason: "rate_limited", kind: signal },
|
|
285
|
+
amount: 0,
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
for (const reason of CLIENT_ERROR_REJECTION_REASONS) {
|
|
289
|
+
if (reason === "rate_limited") continue;
|
|
290
|
+
observability.incrementCounter({
|
|
291
|
+
...CLIENT_ERROR_REJECTIONS_METRIC,
|
|
292
|
+
labels: { reason, kind: "unknown" },
|
|
293
|
+
amount: 0,
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
// A rate-limited refusal keeps its kind, so accepted plus rejected is the
|
|
297
|
+
// true per-kind arrival rate even while a bucket is empty.
|
|
298
|
+
const reject = (
|
|
299
|
+
c: Context,
|
|
300
|
+
reason: ClientErrorRejectionReason,
|
|
301
|
+
status: 400 | 403 | 413 | 429,
|
|
302
|
+
kind: ClientErrorKind | ClientSignal | "unknown" = "unknown",
|
|
303
|
+
) => {
|
|
304
|
+
observability.incrementCounter({ ...CLIENT_ERROR_REJECTIONS_METRIC, labels: { reason, kind } });
|
|
305
|
+
c.header("cache-control", "no-store");
|
|
306
|
+
return c.body(null, status);
|
|
307
|
+
};
|
|
308
|
+
|
|
309
|
+
app.post(
|
|
310
|
+
CLIENT_ERRORS_PATH,
|
|
311
|
+
// Enforced on the streamed body, so a chunked request without a
|
|
312
|
+
// Content-Length is refused at the limit rather than buffered.
|
|
313
|
+
bodyLimit({
|
|
314
|
+
maxSize: CLIENT_ERROR_REPORT_MAX_BYTES,
|
|
315
|
+
onError: (c) => reject(c, "too_large", 413),
|
|
316
|
+
}),
|
|
317
|
+
async (c) => {
|
|
318
|
+
c.header("cache-control", "no-store");
|
|
319
|
+
// Browsers always send Origin on this cross- or same-origin POST. A
|
|
320
|
+
// foreign page therefore cannot spend the admission budget or inflate
|
|
321
|
+
// the counter through its visitors' browsers.
|
|
322
|
+
const origin = c.req.header("origin");
|
|
323
|
+
if (origin !== undefined && !isAllowedBrowserOrigin(origin, settings)) {
|
|
324
|
+
return reject(c, "origin", 403);
|
|
325
|
+
}
|
|
326
|
+
const report = parseClientBeaconReport(await c.req.text().catch(() => null));
|
|
327
|
+
if (!report) return reject(c, "invalid", 400);
|
|
328
|
+
if (isClientSignalReport(report)) {
|
|
329
|
+
const bucket = report.signal === "web_vital" ? webVitalAdmission : signalAdmission;
|
|
330
|
+
if (!bucket.admit(signalAdmissionKey(report))) {
|
|
331
|
+
return reject(c, "rate_limited", 429, report.signal);
|
|
332
|
+
}
|
|
333
|
+
recordClientSignal(observability, report);
|
|
334
|
+
return c.body(null, 204);
|
|
335
|
+
}
|
|
336
|
+
if (!admission.admit(report.kind)) return reject(c, "rate_limited", 429, report.kind);
|
|
337
|
+
observability.incrementCounter({ ...CLIENT_ERRORS_METRIC, labels: { kind: report.kind } });
|
|
338
|
+
observability.warn("Web client error reported", {
|
|
339
|
+
surface: "web",
|
|
340
|
+
reason: report.kind,
|
|
341
|
+
clientRoute: report.route,
|
|
342
|
+
clientRevision: report.revision,
|
|
343
|
+
clientErrorName: report.error?.name,
|
|
344
|
+
clientErrorMessage: report.error?.message,
|
|
345
|
+
clientErrorStack: report.error?.stack,
|
|
346
|
+
clientComponentStack: report.error?.componentStack,
|
|
347
|
+
});
|
|
348
|
+
return c.body(null, 204);
|
|
349
|
+
},
|
|
350
|
+
);
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
function recordClientSignal(observability: Observability, report: ClientSignalReport): void {
|
|
354
|
+
switch (report.signal) {
|
|
355
|
+
case "request_failure":
|
|
356
|
+
observability.incrementCounter({
|
|
357
|
+
...CLIENT_REQUEST_FAILURES_METRIC,
|
|
358
|
+
labels: { action: report.action, reason: report.reason },
|
|
359
|
+
});
|
|
360
|
+
observability.warn("Web client request failed before a response", {
|
|
361
|
+
surface: "web",
|
|
362
|
+
op: report.action,
|
|
363
|
+
reason: report.reason,
|
|
364
|
+
clientRoute: report.route,
|
|
365
|
+
clientRevision: report.revision,
|
|
366
|
+
});
|
|
367
|
+
return;
|
|
368
|
+
case "stream":
|
|
369
|
+
observability.incrementCounter({
|
|
370
|
+
...CLIENT_STREAM_EVENTS_METRIC,
|
|
371
|
+
labels: { stream: report.stream, event: report.event },
|
|
372
|
+
});
|
|
373
|
+
// An ordinary reconnect is routine; only a stream that gave up or stayed
|
|
374
|
+
// down is worth a log line.
|
|
375
|
+
if (report.event !== "reconnect") {
|
|
376
|
+
observability.warn("Web client live stream degraded", {
|
|
377
|
+
surface: "web",
|
|
378
|
+
op: report.stream,
|
|
379
|
+
reason: report.event,
|
|
380
|
+
clientRoute: report.route,
|
|
381
|
+
clientRevision: report.revision,
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
return;
|
|
385
|
+
case "web_vital":
|
|
386
|
+
observability.observeHistogram({
|
|
387
|
+
...CLIENT_WEB_VITAL_METRIC,
|
|
388
|
+
labels: { metric: report.metric, page: report.page },
|
|
389
|
+
value: report.value,
|
|
390
|
+
buckets: CLIENT_WEB_VITAL_BUCKETS,
|
|
391
|
+
});
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
}
|