@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,26 @@
|
|
|
1
|
+
import type { AccessGrant } from "@opengeni/contracts";
|
|
2
|
+
import { requireLiveAgentAttemptAuthorization, type ApiRouteDeps } from "@opengeni/core";
|
|
3
|
+
import type { AttachedBrowserViewer } from "@opengeni/db";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The person whose machine access decides which attached browsers a caller
|
|
7
|
+
* may see and control. Personal (Only me) machines belong to one person, so a
|
|
8
|
+
* human sees and controls their own; an agent acts for the person who started
|
|
9
|
+
* its turn (never merely for the workspace). Other callers (keys, services)
|
|
10
|
+
* reach only machines that are not personal.
|
|
11
|
+
*/
|
|
12
|
+
export async function attachedBrowserViewer(
|
|
13
|
+
deps: Pick<ApiRouteDeps, "db">,
|
|
14
|
+
grant: AccessGrant,
|
|
15
|
+
workspaceId: string,
|
|
16
|
+
): Promise<AttachedBrowserViewer> {
|
|
17
|
+
let subjectId = grant.subjectId;
|
|
18
|
+
if (grant.principalKind === "agent_attempt") {
|
|
19
|
+
const callerSessionId = grant.metadata?.["sessionId"];
|
|
20
|
+
if (typeof callerSessionId === "string") {
|
|
21
|
+
const actor = await requireLiveAgentAttemptAuthorization(deps.db, grant, callerSessionId);
|
|
22
|
+
subjectId = actor.initiatingHumanSubjectId ?? grant.subjectId;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return { accountId: grant.accountId, workspaceId, subjectId };
|
|
26
|
+
}
|
|
@@ -11,6 +11,15 @@ type ManagedAuthAttemptContext =
|
|
|
11
11
|
| { kind: "discard_provider_session" };
|
|
12
12
|
|
|
13
13
|
const managedAuthAttemptStorage = new AsyncLocalStorage<ManagedAuthAttemptContext>();
|
|
14
|
+
const managedLinkIntentStorage = new AsyncLocalStorage<string>();
|
|
15
|
+
|
|
16
|
+
export function runManagedSignInConnect<T>(intentId: string, action: () => T): T {
|
|
17
|
+
return managedLinkIntentStorage.run(intentId, action);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function currentManagedSignInConnectIntent(): string | undefined {
|
|
21
|
+
return managedLinkIntentStorage.getStore();
|
|
22
|
+
}
|
|
14
23
|
|
|
15
24
|
export function runManagedAuthAttempt<T>(
|
|
16
25
|
transactionId: string,
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import { createHmac } from "node:crypto";
|
|
2
|
+
import { isIP } from "node:net";
|
|
3
|
+
import type { Database } from "@opengeni/db";
|
|
4
|
+
import { APIError, createAuthMiddleware } from "better-auth/api";
|
|
5
|
+
import { sql } from "drizzle-orm";
|
|
6
|
+
|
|
7
|
+
import {
|
|
8
|
+
requestSourceRateLimitKey,
|
|
9
|
+
TRUSTED_CLIENT_ADDRESS_HEADER,
|
|
10
|
+
UNKNOWN_REQUEST_SOURCE_ADDRESS,
|
|
11
|
+
} from "../http/request-source";
|
|
12
|
+
|
|
13
|
+
export type ManagedAuthClientRateLimitRule = { window: number; max: number };
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Better Auth's per-client-address limits, keyed by endpoint path relative to
|
|
17
|
+
* `/v1/auth`. The client address is the trusted source address stamped by the
|
|
18
|
+
* API (see `TRUSTED_CLIENT_ADDRESS_HEADER`), never a caller-supplied header.
|
|
19
|
+
*
|
|
20
|
+
* Better Auth keys each counter on `(client address, path)` and resets it only
|
|
21
|
+
* after `window` seconds pass without an admitted request. Its database store
|
|
22
|
+
* prunes rows idle for longer than 60 s, so no window here exceeds 60 s; a
|
|
23
|
+
* longer window would silently shrink to that pruning horizon. The limits are
|
|
24
|
+
* sized for launch traffic that shares one address (office and carrier NAT)
|
|
25
|
+
* while bounding scripted credential guessing and mail sending from one
|
|
26
|
+
* source. Per-email throttles below cap the same abuse across many addresses.
|
|
27
|
+
*
|
|
28
|
+
* Email sign-in and sign-up allow 20 per minute, at least Better Auth's
|
|
29
|
+
* previous default (3 per 10 s, about 18 per minute). Until the edge forwards
|
|
30
|
+
* real client addresses (for example ingress-nginx behind a cloud load
|
|
31
|
+
* balancer with `externalTrafficPolicy: Cluster`), every user shares a few
|
|
32
|
+
* node addresses, and these two limits then bound the whole deployment's
|
|
33
|
+
* email sign-in and sign-up rate; they must not fall below that default.
|
|
34
|
+
*/
|
|
35
|
+
export const MANAGED_AUTH_CLIENT_RATE_LIMIT_RULES = {
|
|
36
|
+
"/sign-in/email": { window: 60, max: 20 },
|
|
37
|
+
"/sign-up/email": { window: 60, max: 20 },
|
|
38
|
+
"/sign-in/social": { window: 60, max: 20 },
|
|
39
|
+
"/callback/*": { window: 60, max: 30 },
|
|
40
|
+
"/request-password-reset": { window: 60, max: 5 },
|
|
41
|
+
"/send-verification-email": { window: 60, max: 5 },
|
|
42
|
+
"/verify-email": { window: 60, max: 20 },
|
|
43
|
+
"/reset-password": { window: 60, max: 10 },
|
|
44
|
+
"/reset-password/*": { window: 60, max: 20 },
|
|
45
|
+
} as const satisfies Record<string, ManagedAuthClientRateLimitRule>;
|
|
46
|
+
|
|
47
|
+
export type ManagedAuthEmailThrottle = {
|
|
48
|
+
purpose: "sign_in" | "sign_up" | "password_reset" | "verification_email";
|
|
49
|
+
windowSeconds: number;
|
|
50
|
+
/** Attempts one client address (an IPv6 /64) may make against one email. */
|
|
51
|
+
perSourceMax: number;
|
|
52
|
+
/** Attempts all client addresses together may make against one email. */
|
|
53
|
+
perEmailMax: number;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Per-email throttles for the endpoints that verify a password or send mail
|
|
58
|
+
* to an address. They bound password guessing against one account and mail
|
|
59
|
+
* bombing of one inbox regardless of how many client addresses an attacker
|
|
60
|
+
* rotates through. Every attempt counts, including successful sign-ins.
|
|
61
|
+
*
|
|
62
|
+
* Each email has two fixed windows. The tight one is per (email, client
|
|
63
|
+
* address); an attempt it refuses never reaches the looser per-email window.
|
|
64
|
+
* One source can therefore spend only its own share of an email's budget:
|
|
65
|
+
* locking a person out of email/password sign-in, sign-up, password reset, or
|
|
66
|
+
* verification mail takes at least `perEmailMax / perSourceMax` (5) distinct
|
|
67
|
+
* client addresses (IPv6: /64 blocks) inside the window, while one address
|
|
68
|
+
* can exhaust that email's budget only for requests from the same address.
|
|
69
|
+
* Social sign-in is never throttled per email. The accepted cost is that a
|
|
70
|
+
* distributed attacker may make up to `perEmailMax` attempts per window
|
|
71
|
+
* against one email, and can deny that email's password sign-in for the rest
|
|
72
|
+
* of the window once it spends them.
|
|
73
|
+
*/
|
|
74
|
+
export const MANAGED_AUTH_EMAIL_THROTTLES = {
|
|
75
|
+
"/sign-in/email": {
|
|
76
|
+
purpose: "sign_in",
|
|
77
|
+
windowSeconds: 15 * 60,
|
|
78
|
+
perSourceMax: 10,
|
|
79
|
+
perEmailMax: 50,
|
|
80
|
+
},
|
|
81
|
+
"/sign-up/email": {
|
|
82
|
+
purpose: "sign_up",
|
|
83
|
+
windowSeconds: 60 * 60,
|
|
84
|
+
perSourceMax: 5,
|
|
85
|
+
perEmailMax: 25,
|
|
86
|
+
},
|
|
87
|
+
"/request-password-reset": {
|
|
88
|
+
purpose: "password_reset",
|
|
89
|
+
windowSeconds: 60 * 60,
|
|
90
|
+
perSourceMax: 5,
|
|
91
|
+
perEmailMax: 25,
|
|
92
|
+
},
|
|
93
|
+
"/send-verification-email": {
|
|
94
|
+
purpose: "verification_email",
|
|
95
|
+
windowSeconds: 60 * 60,
|
|
96
|
+
perSourceMax: 5,
|
|
97
|
+
perEmailMax: 25,
|
|
98
|
+
},
|
|
99
|
+
} as const satisfies Record<string, ManagedAuthEmailThrottle>;
|
|
100
|
+
|
|
101
|
+
export const MANAGED_AUTH_EMAIL_THROTTLE_KEY_PREFIX = "opengeni:email-throttle:v1:";
|
|
102
|
+
|
|
103
|
+
/** A per-email throttle refusal; an ordinary Better Auth 429 on the wire. */
|
|
104
|
+
export class ManagedAuthEmailThrottleError extends APIError {
|
|
105
|
+
readonly retryAfterSeconds: number;
|
|
106
|
+
|
|
107
|
+
constructor(retryAfterSeconds: number) {
|
|
108
|
+
super(
|
|
109
|
+
"TOO_MANY_REQUESTS",
|
|
110
|
+
{ code: "TOO_MANY_REQUESTS", message: "Too many requests. Please try again later." },
|
|
111
|
+
{ "X-Retry-After": String(retryAfterSeconds) },
|
|
112
|
+
);
|
|
113
|
+
this.retryAfterSeconds = retryAfterSeconds;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export function managedAuthEmailThrottleFor(path: string): ManagedAuthEmailThrottle | null {
|
|
118
|
+
return Object.hasOwn(MANAGED_AUTH_EMAIL_THROTTLES, path)
|
|
119
|
+
? MANAGED_AUTH_EMAIL_THROTTLES[path as keyof typeof MANAGED_AUTH_EMAIL_THROTTLES]
|
|
120
|
+
: null;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Content-free counter key for one email. The address is normalized the way
|
|
125
|
+
* Better Auth stores it and keyed-hashed so the rate-limit table never holds
|
|
126
|
+
* an email.
|
|
127
|
+
*/
|
|
128
|
+
export function managedAuthEmailThrottleKey(
|
|
129
|
+
secret: string,
|
|
130
|
+
purpose: ManagedAuthEmailThrottle["purpose"],
|
|
131
|
+
email: string,
|
|
132
|
+
): string {
|
|
133
|
+
const digest = createHmac("sha256", secret)
|
|
134
|
+
.update(`opengeni:managed-auth:email-throttle:v1\n${purpose}\n${normalizedEmail(email)}`)
|
|
135
|
+
.digest("hex");
|
|
136
|
+
return `${MANAGED_AUTH_EMAIL_THROTTLE_KEY_PREFIX}${purpose}:${digest}`;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Content-free counter key for one (email, client address) pair; `source` is
|
|
141
|
+
* a {@link requestSourceRateLimitKey}. Neither value is stored.
|
|
142
|
+
*/
|
|
143
|
+
export function managedAuthEmailSourceThrottleKey(
|
|
144
|
+
secret: string,
|
|
145
|
+
purpose: ManagedAuthEmailThrottle["purpose"],
|
|
146
|
+
email: string,
|
|
147
|
+
source: string,
|
|
148
|
+
): string {
|
|
149
|
+
const digest = createHmac("sha256", secret)
|
|
150
|
+
.update(
|
|
151
|
+
`opengeni:managed-auth:email-source-throttle:v1\n${purpose}\n${normalizedEmail(email)}\n${source}`,
|
|
152
|
+
)
|
|
153
|
+
.digest("hex");
|
|
154
|
+
return `${MANAGED_AUTH_EMAIL_THROTTLE_KEY_PREFIX}${purpose}:source:${digest}`;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* The limiter source for a Better Auth request: the trusted address the API
|
|
159
|
+
* stamped on it, as a rate-limit key. The API strips caller-supplied copies,
|
|
160
|
+
* so a request without one (an in-process call without a transport peer)
|
|
161
|
+
* shares the unknown-source bucket.
|
|
162
|
+
*/
|
|
163
|
+
export function managedAuthThrottleSource(headers: Headers | null | undefined): string {
|
|
164
|
+
const stamped = headers?.get(TRUSTED_CLIENT_ADDRESS_HEADER)?.trim();
|
|
165
|
+
return stamped && isIP(stamped) !== 0
|
|
166
|
+
? requestSourceRateLimitKey(stamped.toLowerCase())
|
|
167
|
+
: UNKNOWN_REQUEST_SOURCE_ADDRESS;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
function normalizedEmail(email: string): string {
|
|
171
|
+
return email.trim().toLowerCase();
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Atomically count one attempt in a fixed window shared by every API replica.
|
|
176
|
+
*
|
|
177
|
+
* Rows live in Better Auth's `auth_rate_limits` table. For these keys
|
|
178
|
+
* `last_request` holds the window deadline (epoch milliseconds) rather than
|
|
179
|
+
* the last request time: Better Auth prunes rows whose `last_request` is more
|
|
180
|
+
* than 60 s in the past, so storing the deadline keeps an active window alive
|
|
181
|
+
* and lets pruning reclaim it 60 s after it expires. Database time is the only
|
|
182
|
+
* clock, so replicas with skewed clocks agree.
|
|
183
|
+
*/
|
|
184
|
+
export async function consumeManagedAuthEmailThrottle(
|
|
185
|
+
db: Pick<Database, "execute">,
|
|
186
|
+
input: { key: string; windowSeconds: number; max: number },
|
|
187
|
+
): Promise<{ allowed: boolean; retryAfterSeconds: number }> {
|
|
188
|
+
const windowMs = input.windowSeconds * 1_000;
|
|
189
|
+
const result = await db.execute(sql`
|
|
190
|
+
insert into auth_rate_limits as bucket (id, key, count, last_request)
|
|
191
|
+
values (
|
|
192
|
+
${input.key},
|
|
193
|
+
${input.key},
|
|
194
|
+
1,
|
|
195
|
+
floor(extract(epoch from clock_timestamp()) * 1000)::bigint + ${windowMs}::bigint
|
|
196
|
+
)
|
|
197
|
+
on conflict (key) do update set
|
|
198
|
+
count = case
|
|
199
|
+
when bucket.last_request <= excluded.last_request - ${windowMs}::bigint then 1
|
|
200
|
+
else least(bucket.count + 1, ${input.max + 1}::integer)
|
|
201
|
+
end,
|
|
202
|
+
last_request = case
|
|
203
|
+
when bucket.last_request <= excluded.last_request - ${windowMs}::bigint
|
|
204
|
+
then excluded.last_request
|
|
205
|
+
else bucket.last_request
|
|
206
|
+
end
|
|
207
|
+
returning
|
|
208
|
+
bucket.count as count,
|
|
209
|
+
greatest(
|
|
210
|
+
1,
|
|
211
|
+
ceil((bucket.last_request - extract(epoch from clock_timestamp()) * 1000) / 1000.0)
|
|
212
|
+
)::integer as retry_after_seconds
|
|
213
|
+
`);
|
|
214
|
+
const rows = (Array.isArray(result) ? result : (result as { rows?: unknown[] }).rows) as
|
|
215
|
+
| Array<{ count: number | string; retry_after_seconds: number | string }>
|
|
216
|
+
| undefined;
|
|
217
|
+
const row = rows?.[0];
|
|
218
|
+
if (!row) throw new Error("managed auth email throttle returned no row");
|
|
219
|
+
return {
|
|
220
|
+
allowed: Number(row.count) <= input.max,
|
|
221
|
+
retryAfterSeconds: Number(row.retry_after_seconds),
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Better Auth `hooks.before` middleware. It runs after Better Auth's own
|
|
227
|
+
* per-client-address limiter and for both HTTP requests and server-side
|
|
228
|
+
* `auth.api.*` calls, so the product session-set sign-in is covered too. The
|
|
229
|
+
* per-(email, address) window is consumed first; only an attempt it admits
|
|
230
|
+
* counts toward the email's shared window.
|
|
231
|
+
*/
|
|
232
|
+
export function createManagedAuthEmailThrottleHook(db: Pick<Database, "execute">, secret: string) {
|
|
233
|
+
return createAuthMiddleware(async (ctx) => {
|
|
234
|
+
const throttle = managedAuthEmailThrottleFor(ctx.path);
|
|
235
|
+
if (!throttle) return;
|
|
236
|
+
const email = (ctx.body as { email?: unknown } | undefined)?.email;
|
|
237
|
+
if (typeof email !== "string" || !email.trim()) return;
|
|
238
|
+
const source = managedAuthThrottleSource(ctx.headers);
|
|
239
|
+
const perSource = await consumeManagedAuthEmailThrottle(db, {
|
|
240
|
+
key: managedAuthEmailSourceThrottleKey(secret, throttle.purpose, email, source),
|
|
241
|
+
windowSeconds: throttle.windowSeconds,
|
|
242
|
+
max: throttle.perSourceMax,
|
|
243
|
+
});
|
|
244
|
+
if (!perSource.allowed) throw new ManagedAuthEmailThrottleError(perSource.retryAfterSeconds);
|
|
245
|
+
const perEmail = await consumeManagedAuthEmailThrottle(db, {
|
|
246
|
+
key: managedAuthEmailThrottleKey(secret, throttle.purpose, email),
|
|
247
|
+
windowSeconds: throttle.windowSeconds,
|
|
248
|
+
max: throttle.perEmailMax,
|
|
249
|
+
});
|
|
250
|
+
if (!perEmail.allowed) throw new ManagedAuthEmailThrottleError(perEmail.retryAfterSeconds);
|
|
251
|
+
});
|
|
252
|
+
}
|
|
@@ -4,10 +4,25 @@ import type {
|
|
|
4
4
|
} from "@opengeni/core/managed-auth-session-sets";
|
|
5
5
|
import { sql } from "drizzle-orm";
|
|
6
6
|
import type { Database } from "@opengeni/db";
|
|
7
|
-
import
|
|
7
|
+
import {
|
|
8
|
+
assertManagedUserAdmission,
|
|
9
|
+
withManagedAuthSessionLookup,
|
|
10
|
+
type ManagedAuth,
|
|
11
|
+
} from "@opengeni/core";
|
|
8
12
|
import { createHmac, timingSafeEqual } from "node:crypto";
|
|
9
13
|
import { runManagedAuthAttempt } from "./managed-auth-attempt-context";
|
|
10
14
|
|
|
15
|
+
/** Server-only proof for a product-owned endpoint; never returned to a browser. */
|
|
16
|
+
export async function managedAuthSelectedProofHeaders(
|
|
17
|
+
auth: ManagedAuth,
|
|
18
|
+
token: string,
|
|
19
|
+
): Promise<Headers> {
|
|
20
|
+
const context = await auth.$context;
|
|
21
|
+
return new Headers({
|
|
22
|
+
cookie: `${context.authCookies.sessionToken.name}=${signedCookieValue(token, context.secret)}`,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
|
|
11
26
|
export function createBetterAuthSessionAdapter(
|
|
12
27
|
auth: ManagedAuth,
|
|
13
28
|
db: Database,
|
|
@@ -44,7 +59,9 @@ export function createBetterAuthSessionAdapter(
|
|
|
44
59
|
|
|
45
60
|
async resolveSelectedSession(input): Promise<ManagedAuthResolvedSession | null> {
|
|
46
61
|
const resolved = await (await auth.$context).internalAdapter.findSession(input.token);
|
|
47
|
-
|
|
62
|
+
const session = liveResolvedSession(resolved);
|
|
63
|
+
assertManagedUserAdmission(auth, session?.user);
|
|
64
|
+
return session;
|
|
48
65
|
},
|
|
49
66
|
|
|
50
67
|
async resolveAmbientSession(headers): Promise<ManagedAuthResolvedSession | null> {
|
|
@@ -53,7 +70,9 @@ export function createBetterAuthSessionAdapter(
|
|
|
53
70
|
const token = signed ? verifiedSignedCookieValue(signed, context.secret) : null;
|
|
54
71
|
if (!token) return null;
|
|
55
72
|
const resolved = await context.internalAdapter.findSession(token);
|
|
56
|
-
|
|
73
|
+
const session = liveResolvedSession(resolved);
|
|
74
|
+
assertManagedUserAdmission(auth, session?.user);
|
|
75
|
+
return session;
|
|
57
76
|
},
|
|
58
77
|
|
|
59
78
|
async refreshSelectedSession(input): Promise<ManagedAuthResolvedSession | null> {
|
|
@@ -62,8 +81,11 @@ export function createBetterAuthSessionAdapter(
|
|
|
62
81
|
const headers = new Headers({
|
|
63
82
|
cookie: `${cookie.name}=${signedCookieValue(input.token, context.secret)}`,
|
|
64
83
|
});
|
|
65
|
-
const resolved = await
|
|
84
|
+
const resolved = await withManagedAuthSessionLookup(() =>
|
|
85
|
+
auth.api.getSession({ headers, returnHeaders: true }),
|
|
86
|
+
);
|
|
66
87
|
if (!resolved.response) return null;
|
|
88
|
+
assertManagedUserAdmission(auth, resolved.response.user);
|
|
67
89
|
// The provider may renew its durable expiry and emit token/cache cookies;
|
|
68
90
|
// this server-side selected-slot resolution intentionally discards them.
|
|
69
91
|
return resolved.response as ManagedAuthResolvedSession;
|
|
@@ -74,31 +96,7 @@ export function createBetterAuthSessionAdapter(
|
|
|
74
96
|
},
|
|
75
97
|
|
|
76
98
|
async createLegacySelectedSessionCookies(input, currentCookieHeader) {
|
|
77
|
-
|
|
78
|
-
const cookie = context.authCookies.sessionToken;
|
|
79
|
-
const value = input ? signedCookieValue(input.token, context.secret) : "";
|
|
80
|
-
const headers = [
|
|
81
|
-
serializeCookieHeader(cookie.name, value, {
|
|
82
|
-
...cookie.attributes,
|
|
83
|
-
...(input ? {} : { maxAge: 0, expires: new Date(0) }),
|
|
84
|
-
}),
|
|
85
|
-
];
|
|
86
|
-
for (const cacheCookie of [
|
|
87
|
-
context.authCookies.sessionData,
|
|
88
|
-
context.authCookies.accountData,
|
|
89
|
-
context.authCookies.dontRememberToken,
|
|
90
|
-
]) {
|
|
91
|
-
for (const name of cacheCookieNames(cacheCookie.name, currentCookieHeader)) {
|
|
92
|
-
headers.push(
|
|
93
|
-
serializeCookieHeader(name, "", {
|
|
94
|
-
...cacheCookie.attributes,
|
|
95
|
-
maxAge: 0,
|
|
96
|
-
expires: new Date(0),
|
|
97
|
-
}),
|
|
98
|
-
);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
return headers;
|
|
99
|
+
return await managedAuthSessionCookieHeaders(auth, input?.token ?? null, currentCookieHeader);
|
|
102
100
|
},
|
|
103
101
|
};
|
|
104
102
|
}
|
|
@@ -117,6 +115,43 @@ function liveResolvedSession(value: unknown): ManagedAuthResolvedSession | null
|
|
|
117
115
|
return value as ManagedAuthResolvedSession;
|
|
118
116
|
}
|
|
119
117
|
|
|
118
|
+
/**
|
|
119
|
+
* The provider's own session cookie for an exact session token (or its
|
|
120
|
+
* expiry when `token` is null), plus invalidation of stale provider cache
|
|
121
|
+
* cookies, exactly as a browser sign-in would set them.
|
|
122
|
+
*/
|
|
123
|
+
export async function managedAuthSessionCookieHeaders(
|
|
124
|
+
auth: ManagedAuth,
|
|
125
|
+
token: string | null,
|
|
126
|
+
currentCookieHeader?: string | null,
|
|
127
|
+
): Promise<string[]> {
|
|
128
|
+
const context = await auth.$context;
|
|
129
|
+
const cookie = context.authCookies.sessionToken;
|
|
130
|
+
const value = token ? signedCookieValue(token, context.secret) : "";
|
|
131
|
+
const headers = [
|
|
132
|
+
serializeCookieHeader(cookie.name, value, {
|
|
133
|
+
...cookie.attributes,
|
|
134
|
+
...(token ? {} : { maxAge: 0, expires: new Date(0) }),
|
|
135
|
+
}),
|
|
136
|
+
];
|
|
137
|
+
for (const cacheCookie of [
|
|
138
|
+
context.authCookies.sessionData,
|
|
139
|
+
context.authCookies.accountData,
|
|
140
|
+
context.authCookies.dontRememberToken,
|
|
141
|
+
]) {
|
|
142
|
+
for (const name of cacheCookieNames(cacheCookie.name, currentCookieHeader)) {
|
|
143
|
+
headers.push(
|
|
144
|
+
serializeCookieHeader(name, "", {
|
|
145
|
+
...cacheCookie.attributes,
|
|
146
|
+
maxAge: 0,
|
|
147
|
+
expires: new Date(0),
|
|
148
|
+
}),
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return headers;
|
|
153
|
+
}
|
|
154
|
+
|
|
120
155
|
function cookieValue(header: string | null, name: string): string | null {
|
|
121
156
|
if (!header) return null;
|
|
122
157
|
for (const part of header.split(";")) {
|