@opengeni/api-router 3.0.1 → 3.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/access-grant-rls.d.ts +8 -1
- package/dist/admission-trace.d.ts +8 -0
- package/dist/app.d.ts +50 -3
- package/dist/app.js +10 -1
- package/dist/artifact-catalog-cursor.d.ts +1 -0
- package/dist/attached-browser-viewer.d.ts +11 -0
- package/dist/auth/managed-auth-attempt-context.d.ts +2 -0
- package/dist/auth/managed-auth-rate-limits.d.ts +167 -0
- package/dist/auth/managed-auth-session-adapter.d.ts +9 -1
- package/dist/auth/managed-auth.d.ts +72 -5
- package/dist/auth/managed-sign-in-notifications.d.ts +4 -0
- package/dist/auth/new-signups-gate.d.ts +23 -0
- package/dist/auth/signup-funnel-metrics.d.ts +44 -0
- package/dist/azure-live.d.ts +28 -0
- package/dist/browser-action-fences.d.ts +13 -0
- package/dist/browser-controller-authority.d.ts +1 -61
- package/dist/browser-ephemeral.d.ts +5 -0
- package/dist/browser-lost-runtime-end.d.ts +24 -0
- package/dist/browser-state-authority.d.ts +1 -27
- package/dist/chunk-OGQDXVXY.js +18 -0
- package/dist/chunk-OGQDXVXY.js.map +1 -0
- package/dist/{chunk-AJ62T5QN.js → chunk-OT56OY4V.js} +80503 -39869
- package/dist/chunk-OT56OY4V.js.map +1 -0
- package/dist/claude-default-models.d.ts +19 -0
- package/dist/claude-subscription-core.d.ts +50 -0
- package/dist/claude-subscription-oauth.d.ts +36 -0
- package/dist/claude-subscription-profile.d.ts +9 -0
- package/dist/claude-subscription-usage.d.ts +6 -0
- package/dist/claude-workspace-connection.d.ts +15 -0
- package/dist/codemode.d.ts +40 -5
- package/dist/codex-realtime.d.ts +29 -3
- package/dist/codex-session-pointers.d.ts +19 -0
- package/dist/connection-ownership.d.ts +6 -3
- package/dist/controller-data-plane.d.ts +16 -0
- package/dist/credit-promotion-snapshot.d.ts +6 -0
- package/dist/editable-artifact-source-session.d.ts +3 -0
- package/dist/editable-artifact-websocket.d.ts +5 -3
- package/dist/fatal-process-boundary.d.ts +9 -1
- package/dist/github-access.d.ts +7 -1
- package/dist/github-browser-flow.d.ts +1 -1
- package/dist/http/acting-person.d.ts +36 -0
- package/dist/http/api-contract-compat.d.ts +19 -0
- package/dist/http/api-error.d.ts +50 -1
- package/dist/http/auth.d.ts +8 -1
- package/dist/http/cors.d.ts +12 -0
- package/dist/http/deprecation.d.ts +42 -0
- package/dist/http/keyed-admission.d.ts +12 -0
- package/dist/http/local-browser-boundary.d.ts +72 -0
- package/dist/http/metrics-listener.d.ts +22 -0
- package/dist/http/path-identifier.d.ts +17 -0
- package/dist/http/registered-route-label.d.ts +16 -0
- package/dist/http/rejection-telemetry.d.ts +34 -0
- package/dist/http/request-body.d.ts +27 -0
- package/dist/http/request-source.d.ts +41 -3
- package/dist/http/sse.d.ts +12 -1
- package/dist/http/unmatched-route.d.ts +18 -0
- package/dist/http/user-content.d.ts +36 -0
- package/dist/http/variable-sets-removed.d.ts +41 -0
- package/dist/http/websocket-upgrade-dispatch.d.ts +18 -0
- package/dist/index.js +1279 -108
- package/dist/index.js.map +1 -1
- package/dist/integration-connect-metrics.d.ts +35 -0
- package/dist/integration-endpoint-test.d.ts +20 -0
- package/dist/integrations/api-integrations.d.ts +2 -2
- package/dist/integrations/atlassian.d.ts +8 -3
- package/dist/integrations/fiken.d.ts +3 -1
- package/dist/integrations/github-lens-connect.d.ts +37 -66
- package/dist/integrations/google-drive.d.ts +2 -0
- package/dist/integrations/integration-commit-authority.d.ts +13 -0
- package/dist/integrations/marketplace-plugin.d.ts +43 -43
- package/dist/integrations/oauth-client.d.ts +171 -12
- package/dist/integrations/oauth-profiles.d.ts +42 -13
- package/dist/integrations/onepassword-vault-provider.d.ts +9 -0
- package/dist/integrations/slack-bot.d.ts +285 -7
- package/dist/integrations/slack-file-upload-flow.d.ts +62 -0
- package/dist/integrations/slack-interactions.d.ts +89 -10
- package/dist/integrations/slack-mrkdwn.d.ts +41 -0
- package/dist/integrations/slack-routing.d.ts +1 -1
- package/dist/integrations/slack-session-defaults.d.ts +58 -0
- package/dist/integrations/slack-task-file-upload.d.ts +36 -0
- package/dist/integrations/slack-tool-review.d.ts +5 -0
- package/dist/interaction-agent-access.d.ts +13 -8
- package/dist/interaction-agent-version.d.ts +21 -0
- package/dist/interaction-holder-heartbeat.d.ts +5 -0
- package/dist/interaction-metrics.d.ts +27 -2
- package/dist/interaction-route-stages.d.ts +25 -0
- package/dist/interaction-secrets-vault.d.ts +20 -0
- package/dist/interaction-secrets.d.ts +103 -0
- package/dist/mcp/action-catalog-types.d.ts +14 -0
- package/dist/mcp/action-catalog.gen.d.ts +2 -0
- package/dist/mcp/action-descriptions.d.ts +4 -0
- package/dist/mcp/action-schema-imports.gen.d.ts +1 -0
- package/dist/mcp/capability-account-readiness.d.ts +7 -0
- package/dist/mcp/child-read-evidence.d.ts +9 -0
- package/dist/mcp/company-profile-agent-admin.d.ts +12 -0
- package/dist/mcp/contract-input.d.ts +13 -0
- package/dist/mcp/documents.d.ts +2 -0
- package/dist/mcp/first-party-tool-permissions.d.ts +3 -606
- package/dist/mcp/notification-tools.d.ts +26 -0
- package/dist/mcp/orchestration-failure-diagnostic.d.ts +43 -0
- package/dist/mcp/scheduled-task-input.d.ts +1309 -0
- package/dist/mcp/scheduled-task-view.d.ts +217 -3
- package/dist/mcp/secret-tools.d.ts +14 -0
- package/dist/mcp/server.d.ts +108 -5
- package/dist/mcp/session-admin-access-tools.d.ts +33 -0
- package/dist/mcp/session-event-errors.d.ts +28 -0
- package/dist/mcp/session-event-view.d.ts +62 -0
- package/dist/mcp/session-view.d.ts +15 -0
- package/dist/mcp/session-wait.d.ts +18 -0
- package/dist/mcp/site-agent-clamp-tools.d.ts +38 -0
- package/dist/mcp/site-data-tools.d.ts +22 -0
- package/dist/mcp/site-publication-tools.d.ts +19 -0
- package/dist/mcp/site-sql-tools.d.ts +27 -0
- package/dist/mcp-oauth.d.ts +37 -4
- package/dist/model-calls/chat-completions.d.ts +87 -0
- package/dist/model-calls/pending-usage-settlements.d.ts +57 -0
- package/dist/model-calls/service.d.ts +36 -0
- package/dist/model-catalog.d.ts +9 -3
- package/dist/native-push-dispatch.d.ts +69 -0
- package/dist/observability.d.ts +3 -1
- package/dist/organization-mcp.d.ts +82 -0
- package/dist/prepared-mcp-actor.d.ts +77 -0
- package/dist/prepared-mcp-permissions.d.ts +8 -0
- package/dist/routes/analytics-consent.d.ts +26 -0
- package/dist/routes/api-integrations.d.ts +11 -0
- package/dist/routes/api-keys.d.ts +7 -7
- package/dist/routes/automations.d.ts +2 -0
- package/dist/routes/billing.d.ts +59 -0
- package/dist/routes/browser-sessions.d.ts +65 -2
- package/dist/routes/chat-completions.d.ts +11 -0
- package/dist/routes/claude-core-usage.d.ts +20 -0
- package/dist/routes/claude-subscription-accounts.d.ts +3 -0
- package/dist/routes/claude-subscription-oauth.d.ts +3 -0
- package/dist/routes/client-errors.d.ts +182 -0
- package/dist/routes/codex-core.d.ts +401 -0
- package/dist/routes/codex.d.ts +64 -2
- package/dist/routes/computer-sessions.d.ts +6 -1
- package/dist/routes/desktop-distribution.d.ts +32 -0
- package/dist/routes/github-browser-fonts.gen.d.ts +2 -0
- package/dist/routes/github-browser-pages.d.ts +27 -0
- package/dist/routes/inbox.d.ts +13 -0
- package/dist/routes/insights-response-cache.d.ts +10 -0
- package/dist/routes/insights-usage.d.ts +12 -0
- package/dist/routes/insights.d.ts +28 -0
- package/dist/routes/interaction-placement-message.d.ts +7 -0
- package/dist/routes/managed-sign-in-methods.d.ts +6 -0
- package/dist/routes/model-account-choice.d.ts +13 -0
- package/dist/routes/model-account-settings.d.ts +19 -0
- package/dist/routes/native-app-auth.d.ts +12 -0
- package/dist/routes/organization-integration-policy.d.ts +8 -0
- package/dist/routes/organization-integrations.d.ts +6 -0
- package/dist/routes/organization-mcp-connections.d.ts +3 -0
- package/dist/routes/organization-model-defaults.d.ts +9 -0
- package/dist/routes/organization-service-accounts.d.ts +3 -0
- package/dist/routes/personal-api-keys.d.ts +3 -0
- package/dist/routes/session-admin-access.d.ts +3 -0
- package/dist/routes/session-artifact-associations.d.ts +4 -0
- package/dist/routes/session-history-imports.d.ts +20 -0
- package/dist/routes/sessions.d.ts +38 -2
- package/dist/routes/site-data.d.ts +18 -0
- package/dist/routes/site-publishing.d.ts +5 -0
- package/dist/routes/site-runtime.d.ts +31 -0
- package/dist/routes/site-sql.d.ts +16 -0
- package/dist/routes/slack-bot-access.d.ts +3 -0
- package/dist/routes/subscription-account-pools.d.ts +21 -0
- package/dist/routes/subscription-core-http.d.ts +5 -0
- package/dist/routes/subscription-pool-access.d.ts +37 -0
- package/dist/routes/subscription-pool-core.d.ts +153 -0
- package/dist/routes/supergrok.d.ts +6 -6
- package/dist/routes/usage-allowances.d.ts +12 -0
- package/dist/routes/variable-sets-removed.d.ts +2 -0
- package/dist/routes/vault-providers.d.ts +34 -0
- package/dist/routes/vaults.d.ts +3 -0
- package/dist/routes/workspace-integrations.d.ts +35 -0
- package/dist/routes/workspace-model-providers.d.ts +4 -0
- package/dist/routes/workspaces.d.ts +11 -2
- package/dist/sandbox/agent-update.d.ts +64 -0
- package/dist/sandbox/auth-callout.d.ts +8 -0
- package/dist/sandbox/channel-a.d.ts +15 -1
- package/dist/sandbox/enrollment.d.ts +26 -4
- package/dist/sandbox/machine-audience.d.ts +29 -0
- package/dist/sandbox/machines.d.ts +15 -2
- package/dist/sandbox/metrics-ingestion.d.ts +6 -2
- package/dist/sandbox/screen-control.d.ts +85 -0
- package/dist/sandbox/viewer.d.ts +5 -1
- package/dist/sandbox-file-artifacts.d.ts +17 -1
- package/dist/scheduled-task-blockers.d.ts +39 -0
- package/dist/scheduled-task-deletion.d.ts +3 -4
- package/dist/scheduled-task-lifecycle.d.ts +14 -0
- package/dist/secret-answers.d.ts +40 -0
- package/dist/session-create-observability.d.ts +5 -0
- package/dist/session-event-view-36GO3IL7.js +528 -0
- package/dist/session-event-view-36GO3IL7.js.map +1 -0
- package/dist/signed-state-secret.d.ts +18 -0
- package/dist/site-agent-guard.d.ts +53 -0
- package/dist/site-data/operations.d.ts +103 -0
- package/dist/site-data/service.d.ts +203 -0
- package/dist/site-frame-guard.d.ts +32 -0
- package/dist/site-publishing/agent-data-tools.d.ts +84 -0
- package/dist/site-publishing/agent-model.d.ts +58 -0
- package/dist/site-publishing/agent-session.d.ts +16 -0
- package/dist/site-publishing/content-scanner.d.ts +31 -0
- package/dist/site-publishing/edge-sync.d.ts +48 -0
- package/dist/site-publishing/gateway-signature.d.ts +56 -0
- package/dist/site-publishing/limits.d.ts +63 -0
- package/dist/site-publishing/page-tool-authority.d.ts +30 -0
- package/dist/site-publishing/platform-usage.d.ts +113 -0
- package/dist/site-publishing/platform.d.ts +21 -0
- package/dist/site-publishing/readiness.d.ts +62 -0
- package/dist/site-publishing/runtime.d.ts +179 -0
- package/dist/site-publishing/service.d.ts +264 -0
- package/dist/site-publishing/session-events.d.ts +22 -0
- package/dist/site-publishing/session-views.d.ts +36 -0
- package/dist/site-publishing/viewer.d.ts +40 -0
- package/dist/site-session-origin.d.ts +31 -6
- package/dist/site-sql/format.d.ts +47 -0
- package/dist/site-sql/gateway.d.ts +50 -0
- package/dist/site-sql/service.d.ts +213 -0
- package/dist/temporal-schedule-sync.d.ts +26 -0
- package/dist/transcription/billing-refusal.d.ts +8 -0
- package/dist/transcription/normalize.d.ts +23 -0
- package/dist/transcription/providers/azure-mai.d.ts +12 -0
- package/dist/transcription/providers/azure-openai.d.ts +4 -0
- package/dist/transcription/providers/openai.d.ts +16 -0
- package/dist/transcription/providers/subscription-core.d.ts +39 -0
- package/dist/transcription/service.d.ts +10 -1
- package/dist/transcription/wav-duration.d.ts +8 -0
- package/dist/workspace-tool-gateway-attestations.d.ts +37 -0
- package/dist/workspace-tool-gateway-observability.d.ts +16 -0
- package/dist/workspace-tool-gateway-secrets.d.ts +27 -0
- package/dist/workspace-tool-gateway.d.ts +102 -6
- package/dist/workspace-tool-target-fence.d.ts +116 -0
- package/dist/workspace-tool-target.d.ts +225 -0
- package/dist/workspace-webhook-dispatch.d.ts +26 -0
- package/dist/xai-subscription-core.d.ts +60 -0
- package/package.json +25 -20
- package/src/access-grant-rls.ts +64 -14
- package/src/admission-trace.ts +14 -0
- package/src/app.ts +1684 -252
- package/src/artifact-catalog-cursor.ts +1 -0
- package/src/attached-browser-viewer.ts +26 -0
- package/src/auth/managed-auth-attempt-context.ts +9 -0
- package/src/auth/managed-auth-rate-limits.ts +252 -0
- package/src/auth/managed-auth-session-adapter.ts +64 -29
- package/src/auth/managed-auth.ts +303 -35
- package/src/auth/managed-email.ts +18 -1
- package/src/auth/managed-sign-in-notifications.ts +81 -0
- package/src/auth/new-signups-gate.ts +49 -0
- package/src/auth/organization-user-setup.ts +3 -3
- package/src/auth/signup-funnel-metrics.ts +164 -0
- package/src/azure-live.ts +103 -0
- package/src/browser-action-fences.ts +45 -0
- package/src/browser-controller-authority.ts +1 -186
- package/src/browser-ephemeral.ts +39 -0
- package/src/browser-lost-runtime-end.ts +71 -0
- package/src/browser-state-authority.ts +1 -236
- package/src/claude-default-models.ts +37 -0
- package/src/claude-subscription-core.ts +154 -0
- package/src/claude-subscription-oauth.ts +352 -0
- package/src/claude-subscription-profile.ts +73 -0
- package/src/claude-subscription-usage.ts +51 -0
- package/src/claude-workspace-connection.ts +82 -0
- package/src/codemode.ts +236 -39
- package/src/codex-realtime.ts +181 -53
- package/src/codex-session-pointers.ts +80 -0
- package/src/company-brain-okf.ts +1 -1
- package/src/connected-machine-computer-access.ts +2 -1
- package/src/connection-ownership.ts +19 -13
- package/src/controller-data-plane.ts +34 -0
- package/src/credit-promotion-snapshot.ts +36 -0
- package/src/editable-artifact-production.ts +10 -0
- package/src/editable-artifact-source-session.ts +123 -0
- package/src/editable-artifact-websocket.ts +16 -3
- package/src/fatal-process-boundary.ts +67 -3
- package/src/gateway-realtime.ts +12 -8
- package/src/github-access.ts +31 -5
- package/src/github-browser-flow.ts +1 -1
- package/src/http/acting-person.ts +105 -0
- package/src/http/api-contract-compat.ts +49 -0
- package/src/http/api-error.ts +210 -2
- package/src/http/auth.ts +68 -4
- package/src/http/cors.ts +37 -5
- package/src/http/deprecation.ts +118 -0
- package/src/http/keyed-admission.ts +29 -0
- package/src/http/local-browser-boundary.ts +343 -0
- package/src/http/metrics-listener.ts +57 -0
- package/src/http/path-identifier.ts +54 -0
- package/src/http/registered-route-label.ts +34 -0
- package/src/http/rejection-telemetry.ts +120 -0
- package/src/http/request-body.ts +127 -0
- package/src/http/request-source.ts +154 -13
- package/src/http/sse.ts +88 -28
- package/src/http/unmatched-route.ts +60 -0
- package/src/http/user-content.ts +158 -0
- package/src/http/variable-sets-removed.ts +122 -0
- package/src/http/websocket-upgrade-dispatch.ts +29 -0
- package/src/index.ts +107 -57
- package/src/integration-connect-metrics.ts +228 -0
- package/src/integration-endpoint-test.ts +291 -0
- package/src/integrations/api-integrations.ts +81 -7
- package/src/integrations/atlassian.ts +202 -83
- package/src/integrations/fiken.ts +66 -38
- package/src/integrations/github-app-connect.ts +64 -18
- package/src/integrations/github-lens-connect.ts +8 -29
- package/src/integrations/google-drive.ts +448 -152
- package/src/integrations/integration-commit-authority.ts +69 -0
- package/src/integrations/marketplace-plugin.ts +1 -1
- package/src/integrations/oauth-client.ts +733 -193
- package/src/integrations/oauth-profiles.ts +116 -45
- package/src/integrations/onepassword-vault-provider.ts +16 -0
- package/src/integrations/personal-github-repositories.ts +1 -1
- package/src/integrations/personal-github.ts +61 -35
- package/src/integrations/provider-oauth.ts +67 -85
- package/src/integrations/slack-app-home.ts +5 -5
- package/src/integrations/slack-bot.ts +893 -201
- package/src/integrations/slack-file-upload-flow.ts +147 -0
- package/src/integrations/slack-install.ts +7 -7
- package/src/integrations/slack-interactions.ts +1589 -299
- package/src/integrations/slack-mrkdwn.ts +193 -0
- package/src/integrations/slack-routing.ts +2 -2
- package/src/integrations/slack-session-defaults.ts +224 -0
- package/src/integrations/slack-task-file-upload.ts +323 -0
- package/src/integrations/slack-tool-review.ts +65 -0
- package/src/integrations/social-oauth.ts +90 -58
- package/src/interaction-agent-access.ts +40 -20
- package/src/interaction-agent-version.ts +85 -0
- package/src/interaction-holder-heartbeat.ts +24 -8
- package/src/interaction-metrics.ts +164 -2
- package/src/interaction-route-stages.ts +94 -0
- package/src/interaction-secrets-vault.ts +213 -0
- package/src/interaction-secrets.ts +426 -0
- package/src/mcp/action-catalog-types.ts +14 -0
- package/src/mcp/action-catalog.gen.ts +8014 -0
- package/src/mcp/action-descriptions.ts +299 -0
- package/src/mcp/action-schema-imports.gen.ts +304 -0
- package/src/mcp/capability-account-readiness.ts +17 -0
- package/src/mcp/child-read-evidence.ts +19 -0
- package/src/mcp/company-profile-agent-admin.ts +13 -0
- package/src/mcp/contract-input.ts +165 -0
- package/src/mcp/documents.ts +9 -2
- package/src/mcp/editable-artifacts.ts +29 -11
- package/src/mcp/files.ts +5 -1
- package/src/mcp/first-party-tool-permissions.ts +7 -285
- package/src/mcp/knowledge-entries.ts +108 -34
- package/src/mcp/notification-tools.ts +480 -0
- package/src/mcp/orchestration-failure-diagnostic.ts +43 -0
- package/src/mcp/scheduled-task-input.ts +89 -0
- package/src/mcp/scheduled-task-view.ts +63 -3
- package/src/mcp/secret-tools.ts +185 -0
- package/src/mcp/server.ts +2213 -1116
- package/src/mcp/session-admin-access-tools.ts +163 -0
- package/src/mcp/session-event-errors.ts +123 -0
- package/src/mcp/session-event-view.ts +395 -13
- package/src/mcp/session-view.ts +3 -0
- package/src/mcp/session-wait.ts +67 -7
- package/src/mcp/site-agent-clamp-tools.ts +140 -0
- package/src/mcp/site-data-tools.ts +339 -0
- package/src/mcp/site-publication-tools.ts +201 -0
- package/src/mcp/site-sql-tools.ts +427 -0
- package/src/mcp-oauth.ts +635 -45
- package/src/model-calls/chat-completions.ts +352 -0
- package/src/model-calls/pending-usage-settlements.ts +125 -0
- package/src/model-calls/service.ts +694 -0
- package/src/model-catalog.ts +68 -17
- package/src/native-push-dispatch.ts +457 -0
- package/src/observability.ts +15 -1
- package/src/organization-mcp.ts +485 -0
- package/src/prepared-mcp-actor.ts +154 -0
- package/src/prepared-mcp-permissions.ts +38 -0
- package/src/routes/analytics-consent.ts +123 -0
- package/src/routes/api-integrations.ts +268 -9
- package/src/routes/api-keys.ts +164 -25
- package/src/routes/artifact-catalog.ts +111 -0
- package/src/routes/automations.ts +163 -90
- package/src/routes/billing.ts +535 -59
- package/src/routes/browser-sessions.ts +966 -342
- package/src/routes/canonical-human-identities.ts +61 -0
- package/src/routes/capabilities.ts +112 -5
- package/src/routes/channels.ts +4 -3
- package/src/routes/chat-completions.ts +235 -0
- package/src/routes/claude-core-usage.ts +147 -0
- package/src/routes/claude-subscription-accounts.ts +233 -0
- package/src/routes/claude-subscription-oauth.ts +175 -0
- package/src/routes/client-errors.ts +394 -0
- package/src/routes/codex-core.ts +687 -0
- package/src/routes/codex.ts +1277 -1119
- package/src/routes/company-brain.ts +4 -0
- package/src/routes/computer-sessions.ts +319 -85
- package/src/routes/connect.ts +277 -175
- package/src/routes/connections.ts +690 -363
- package/src/routes/desktop-distribution.ts +217 -0
- package/src/routes/documents.ts +13 -7
- package/src/routes/editable-artifacts.ts +74 -4
- package/src/routes/enrollments.ts +110 -16
- package/src/routes/external-identity-links.ts +13 -12
- package/src/routes/files.ts +41 -16
- package/src/routes/github-browser-fonts.gen.ts +12 -0
- package/src/routes/github-browser-pages.ts +258 -0
- package/src/routes/github.ts +200 -75
- package/src/routes/inbox.ts +353 -0
- package/src/routes/insights-response-cache.ts +83 -0
- package/src/routes/insights-usage.ts +345 -0
- package/src/routes/insights.ts +103 -8
- package/src/routes/install.ts +51 -10
- package/src/routes/integration-facets.ts +70 -28
- package/src/routes/interaction-placement-message.ts +12 -0
- package/src/routes/knowledge.ts +136 -27
- package/src/routes/machines.ts +189 -135
- package/src/routes/managed-auth-session-sets.ts +43 -10
- package/src/routes/managed-onboarding.ts +39 -19
- package/src/routes/managed-sign-in-methods.ts +433 -0
- package/src/routes/memory-slack-publications.ts +3 -2
- package/src/routes/model-account-choice.ts +194 -0
- package/src/routes/model-account-settings.ts +235 -0
- package/src/routes/model-connection-access.ts +210 -48
- package/src/routes/native-app-auth.ts +296 -0
- package/src/routes/organization-integration-policy.ts +116 -0
- package/src/routes/organization-integrations.ts +326 -0
- package/src/routes/organization-mcp-connections.ts +183 -0
- package/src/routes/organization-memberships.ts +205 -19
- package/src/routes/organization-model-defaults.ts +110 -0
- package/src/routes/organization-model-providers.ts +74 -3
- package/src/routes/organization-service-accounts.ts +128 -0
- package/src/routes/organization-sessions.ts +21 -5
- package/src/routes/personal-api-keys.ts +184 -0
- package/src/routes/personal-github-git-broker.ts +2 -2
- package/src/routes/personal-github.ts +9 -4
- package/src/routes/plugins.ts +46 -7
- package/src/routes/pr-review-github.ts +105 -118
- package/src/routes/pr-review.ts +88 -82
- package/src/routes/preference-registry.ts +18 -0
- package/src/routes/rigs.ts +48 -13
- package/src/routes/scheduled-tasks.ts +347 -27
- package/src/routes/session-admin-access.ts +271 -0
- package/src/routes/session-artifact-associations.ts +164 -0
- package/src/routes/session-history-imports.ts +305 -0
- package/src/routes/sessions.ts +1682 -363
- package/src/routes/site-data.ts +340 -0
- package/src/routes/site-publishing.ts +584 -0
- package/src/routes/site-runtime.ts +1944 -0
- package/src/routes/site-sql.ts +263 -0
- package/src/routes/skill-content.ts +72 -7
- package/src/routes/skills.ts +5 -4
- package/src/routes/slack-bot-access.ts +108 -0
- package/src/routes/social.ts +27 -15
- package/src/routes/subscription-account-pools.ts +209 -0
- package/src/routes/subscription-core-http.ts +18 -0
- package/src/routes/subscription-pool-access.ts +180 -0
- package/src/routes/subscription-pool-core.ts +552 -0
- package/src/routes/supergrok.ts +174 -655
- package/src/routes/transcription-recordings.ts +71 -4
- package/src/routes/transcriptions.ts +26 -2
- package/src/routes/usage-allowances.ts +381 -0
- package/src/routes/variable-sets-removed.ts +19 -0
- package/src/routes/vault-providers.ts +782 -0
- package/src/routes/vaults.ts +421 -0
- package/src/routes/video-generation.ts +30 -12
- package/src/routes/workspace-artifacts.ts +165 -53
- package/src/routes/workspace-integrations.ts +576 -0
- package/src/routes/workspace-model-providers.ts +148 -0
- package/src/routes/workspace-state.ts +4 -0
- package/src/routes/workspaces.ts +625 -117
- package/src/sandbox/agent-update.ts +315 -0
- package/src/sandbox/auth-callout.ts +104 -21
- package/src/sandbox/channel-a.ts +165 -55
- package/src/sandbox/enrollment.ts +131 -22
- package/src/sandbox/machine-audience.ts +192 -0
- package/src/sandbox/machines.ts +75 -31
- package/src/sandbox/metrics-ingestion.ts +133 -2
- package/src/sandbox/rematerialize.ts +51 -21
- package/src/sandbox/screen-control.ts +289 -0
- package/src/sandbox/viewer.ts +33 -58
- package/src/sandbox-file-artifacts.ts +53 -27
- package/src/scheduled-task-blockers.ts +293 -0
- package/src/scheduled-task-deletion.ts +13 -3
- package/src/scheduled-task-lifecycle.ts +84 -0
- package/src/secret-answers.ts +119 -0
- package/src/session-create-observability.ts +46 -0
- package/src/session-realtime-context.ts +26 -4
- package/src/signed-state-secret.ts +58 -0
- package/src/site-agent-guard.ts +261 -0
- package/src/site-data/operations.ts +777 -0
- package/src/site-data/service.ts +1043 -0
- package/src/site-frame-guard.ts +107 -0
- package/src/site-publishing/agent-data-tools.ts +250 -0
- package/src/site-publishing/agent-model.ts +127 -0
- package/src/site-publishing/agent-session.ts +148 -0
- package/src/site-publishing/content-scanner.ts +93 -0
- package/src/site-publishing/edge-sync.ts +148 -0
- package/src/site-publishing/gateway-signature.ts +198 -0
- package/src/site-publishing/limits.ts +315 -0
- package/src/site-publishing/page-tool-authority.ts +111 -0
- package/src/site-publishing/platform-usage.ts +479 -0
- package/src/site-publishing/platform.ts +98 -0
- package/src/site-publishing/readiness.ts +330 -0
- package/src/site-publishing/runtime.ts +831 -0
- package/src/site-publishing/service.ts +1282 -0
- package/src/site-publishing/session-events.ts +262 -0
- package/src/site-publishing/session-views.ts +262 -0
- package/src/site-publishing/viewer.ts +75 -0
- package/src/site-session-origin.ts +91 -6
- package/src/site-sql/format.ts +134 -0
- package/src/site-sql/gateway.ts +168 -0
- package/src/site-sql/service.ts +1636 -0
- package/src/site-uploads.ts +27 -5
- package/src/temporal-schedule-sync.ts +74 -0
- package/src/transcription/billing-refusal.ts +14 -0
- package/src/transcription/normalize.ts +77 -0
- package/src/transcription/providers/azure-mai.ts +98 -0
- package/src/transcription/providers/azure-openai.ts +16 -7
- package/src/transcription/providers/codex-subscription.ts +190 -67
- package/src/transcription/providers/openai.ts +79 -5
- package/src/transcription/providers/subscription-core.ts +125 -0
- package/src/transcription/providers/xai-subscription.ts +81 -83
- package/src/transcription/segmenter.ts +7 -1
- package/src/transcription/service.ts +239 -10
- package/src/transcription/wav-duration.ts +39 -0
- package/src/workspace-deletion.ts +25 -1
- package/src/workspace-tool-gateway-attestations.ts +133 -0
- package/src/workspace-tool-gateway-observability.ts +64 -0
- package/src/workspace-tool-gateway-secrets.ts +104 -0
- package/src/workspace-tool-gateway.ts +921 -103
- package/src/workspace-tool-target-fence.ts +380 -0
- package/src/workspace-tool-target.ts +554 -0
- package/src/workspace-webhook-dispatch.ts +225 -0
- package/src/xai-realtime.ts +85 -81
- package/src/xai-subscription-core.ts +172 -0
- package/dist/browser-auth-broker.d.ts +0 -20
- package/dist/chunk-AJ62T5QN.js.map +0 -1
- package/dist/connection-authority-owner.d.ts +0 -59
- package/dist/routes/connection-authorities.d.ts +0 -3
- package/dist/routes/environments.d.ts +0 -5
- package/dist/routes/host-mcp-bindings.d.ts +0 -5
- package/dist/routes/host-mcp-resolvers.d.ts +0 -3
- package/dist/routes/packs.d.ts +0 -3
- package/dist/session-event-view-MU3HMNV3.js +0 -264
- package/dist/session-event-view-MU3HMNV3.js.map +0 -1
- package/dist/xai-subscription-auth.d.ts +0 -23
- package/src/browser-auth-broker.ts +0 -155
- package/src/connection-authority-owner.ts +0 -61
- package/src/routes/connection-authorities.ts +0 -139
- package/src/routes/environments.ts +0 -388
- package/src/routes/host-mcp-bindings.ts +0 -122
- package/src/routes/host-mcp-resolvers.ts +0 -41
- package/src/routes/packs.ts +0 -784
- package/src/xai-subscription-auth.ts +0 -139
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { environmentsEncryptionKeyBytes, type Settings } from "@opengeni/config";
|
|
3
|
+
import {
|
|
4
|
+
OPENGENI_DELIVERY_ID_HEADER,
|
|
5
|
+
OPENGENI_EVENT_ID_HEADER,
|
|
6
|
+
OPENGENI_SIGNATURE_HEADER,
|
|
7
|
+
signOpenGeniPayload,
|
|
8
|
+
} from "@opengeni/contracts";
|
|
9
|
+
import {
|
|
10
|
+
claimWorkspaceWebhookDeliveries,
|
|
11
|
+
claimOrganizationWebhookDeliveries,
|
|
12
|
+
decryptEnvironmentValue,
|
|
13
|
+
maintainSessionUsageLimits,
|
|
14
|
+
maintainWorkspaceAllowances,
|
|
15
|
+
pruneOrganizationWebhookDeliveries,
|
|
16
|
+
pruneWorkspaceWebhookDeliveries,
|
|
17
|
+
settleOrganizationWebhookDelivery,
|
|
18
|
+
settleWorkspaceWebhookDelivery,
|
|
19
|
+
type ClaimedWorkspaceWebhookDelivery,
|
|
20
|
+
type Database,
|
|
21
|
+
} from "@opengeni/db";
|
|
22
|
+
import { pinnedFetch } from "@opengeni/network";
|
|
23
|
+
import type { Observability } from "@opengeni/observability";
|
|
24
|
+
import { recordSessionUsageLimitEvent } from "@opengeni/core";
|
|
25
|
+
|
|
26
|
+
export const WORKSPACE_WEBHOOK_DISPATCH_BATCH_SIZE = 32;
|
|
27
|
+
const CLAIM_SECONDS = 60;
|
|
28
|
+
const POLL_INTERVAL_MS = 2_000;
|
|
29
|
+
const DELIVERY_TIMEOUT_MS = 10_000;
|
|
30
|
+
const PRUNE_EVERY_TICKS = 300;
|
|
31
|
+
|
|
32
|
+
export type WorkspaceWebhookDispatchDeps = {
|
|
33
|
+
db: Database;
|
|
34
|
+
settings: Settings;
|
|
35
|
+
observability?: Pick<Observability, "info" | "warn" | "error"> &
|
|
36
|
+
Partial<Pick<Observability, "incrementCounter">>;
|
|
37
|
+
fetch?: typeof pinnedFetch;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export type WorkspaceWebhookBatchResult = { claimed: number; delivered: number; failed: number };
|
|
41
|
+
|
|
42
|
+
function errorText(error: unknown): string {
|
|
43
|
+
if (error instanceof Error) {
|
|
44
|
+
if (error.name === "TimeoutError" || error.name === "AbortError") return "timeout";
|
|
45
|
+
return `${error.name}: ${error.message}`.slice(0, 500);
|
|
46
|
+
}
|
|
47
|
+
return String(error).slice(0, 500);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
async function deliverOne(
|
|
51
|
+
deps: WorkspaceWebhookDispatchDeps,
|
|
52
|
+
key: Uint8Array,
|
|
53
|
+
claimId: string,
|
|
54
|
+
delivery: ClaimedWorkspaceWebhookDelivery,
|
|
55
|
+
organization = false,
|
|
56
|
+
): Promise<"delivered" | "failed"> {
|
|
57
|
+
let status: number | null = null;
|
|
58
|
+
let error: string | null = null;
|
|
59
|
+
try {
|
|
60
|
+
const body = JSON.stringify(delivery.payload);
|
|
61
|
+
const secret = decryptEnvironmentValue(key, delivery.secretEncrypted);
|
|
62
|
+
const response = await (deps.fetch ?? pinnedFetch)(
|
|
63
|
+
delivery.url,
|
|
64
|
+
{
|
|
65
|
+
method: "POST",
|
|
66
|
+
headers: {
|
|
67
|
+
"content-type": "application/json",
|
|
68
|
+
"user-agent": "OpenGeni-Webhooks/1",
|
|
69
|
+
[OPENGENI_SIGNATURE_HEADER]: await signOpenGeniPayload(secret, body),
|
|
70
|
+
[OPENGENI_EVENT_ID_HEADER]: delivery.eventId,
|
|
71
|
+
[OPENGENI_DELIVERY_ID_HEADER]: delivery.deliveryId,
|
|
72
|
+
},
|
|
73
|
+
body,
|
|
74
|
+
signal: AbortSignal.timeout(DELIVERY_TIMEOUT_MS),
|
|
75
|
+
},
|
|
76
|
+
deps.settings,
|
|
77
|
+
{
|
|
78
|
+
label: organization ? "Organization webhook" : "Workspace webhook",
|
|
79
|
+
requireHttpsOutsideLocalTest: true,
|
|
80
|
+
},
|
|
81
|
+
);
|
|
82
|
+
status = response.status;
|
|
83
|
+
await response.body?.cancel().catch(() => undefined);
|
|
84
|
+
if (status < 200 || status >= 300) error = `HTTP ${status}`;
|
|
85
|
+
} catch (caught) {
|
|
86
|
+
error = errorText(caught);
|
|
87
|
+
}
|
|
88
|
+
await (organization ? settleOrganizationWebhookDelivery : settleWorkspaceWebhookDelivery)(
|
|
89
|
+
deps.db,
|
|
90
|
+
{
|
|
91
|
+
deliveryId: delivery.deliveryId,
|
|
92
|
+
claimId,
|
|
93
|
+
status,
|
|
94
|
+
error,
|
|
95
|
+
},
|
|
96
|
+
);
|
|
97
|
+
return error === null ? "delivered" : "failed";
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* One bounded, resumable page of the per-task usage limit legacy import.
|
|
102
|
+
* Roots created before the feature stay `preparing` (never shown or
|
|
103
|
+
* admitted as $0 for a write) until this converges them. A failure is retried
|
|
104
|
+
* on a later tick (per-root exponential backoff with its SQLSTATE kept) and
|
|
105
|
+
* never blocks webhook delivery. The same pass discloses lost single-call
|
|
106
|
+
* custody markers as unpriced so a crashed process cannot block a task forever.
|
|
107
|
+
*/
|
|
108
|
+
async function importLegacySessionUsage(deps: WorkspaceWebhookDispatchDeps): Promise<void> {
|
|
109
|
+
const sink = deps.observability?.incrementCounter ? deps.observability : null;
|
|
110
|
+
const metrics = sink as Pick<Observability, "incrementCounter"> | null;
|
|
111
|
+
try {
|
|
112
|
+
const result = await maintainSessionUsageLimits(deps.db);
|
|
113
|
+
recordSessionUsageLimitEvent(metrics, "import", "imported", result.processed);
|
|
114
|
+
recordSessionUsageLimitEvent(metrics, "import", "import_failed", result.failed);
|
|
115
|
+
recordSessionUsageLimitEvent(metrics, "single_call", "lost_resolved", result.resolvedLost);
|
|
116
|
+
if (result.failed > 0) {
|
|
117
|
+
deps.observability?.warn("Session usage limit import pages failed", {
|
|
118
|
+
failed: result.failed,
|
|
119
|
+
sqlstates: JSON.stringify(result.errors),
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
} catch (error) {
|
|
123
|
+
recordSessionUsageLimitEvent(metrics, "import", "import_failed");
|
|
124
|
+
deps.observability?.warn("Session usage limit import failed", { error: errorText(error) });
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/** Claim and deliver one globally bounded batch. At-least-once: receivers dedupe on event id. */
|
|
129
|
+
export async function drainWorkspaceWebhookDeliveries(
|
|
130
|
+
deps: WorkspaceWebhookDispatchDeps,
|
|
131
|
+
): Promise<WorkspaceWebhookBatchResult> {
|
|
132
|
+
// Usage-limit maintenance contains its own failures, so it runs first: a
|
|
133
|
+
// failing allowance pass cannot keep lost custody markers (and the tasks
|
|
134
|
+
// they park) unresolved.
|
|
135
|
+
await importLegacySessionUsage(deps);
|
|
136
|
+
// Allowance rollover/expiry does not depend on webhook secrets, usage
|
|
137
|
+
// readers, inference or having any pending delivery.
|
|
138
|
+
await maintainWorkspaceAllowances(deps.db);
|
|
139
|
+
const key = environmentsEncryptionKeyBytes(deps.settings);
|
|
140
|
+
if (!key) return { claimed: 0, delivered: 0, failed: 0 };
|
|
141
|
+
const claimId = randomUUID();
|
|
142
|
+
const claims = await claimWorkspaceWebhookDeliveries(deps.db, {
|
|
143
|
+
claimId,
|
|
144
|
+
limit: WORKSPACE_WEBHOOK_DISPATCH_BATCH_SIZE,
|
|
145
|
+
claimSeconds: CLAIM_SECONDS,
|
|
146
|
+
});
|
|
147
|
+
// Each lane is bounded; the shared pump does not starve organization queues
|
|
148
|
+
// behind a sustained workspace backlog.
|
|
149
|
+
const organizationClaims = await claimOrganizationWebhookDeliveries(deps.db, {
|
|
150
|
+
claimId,
|
|
151
|
+
limit: WORKSPACE_WEBHOOK_DISPATCH_BATCH_SIZE,
|
|
152
|
+
claimSeconds: CLAIM_SECONDS,
|
|
153
|
+
});
|
|
154
|
+
const outcomes = await Promise.all(
|
|
155
|
+
[
|
|
156
|
+
...claims.map((delivery) => ({ delivery, organization: false })),
|
|
157
|
+
...organizationClaims.map((delivery) => ({ delivery, organization: true })),
|
|
158
|
+
].map(async ({ delivery, organization }) => {
|
|
159
|
+
try {
|
|
160
|
+
return await deliverOne(deps, key, claimId, delivery, organization);
|
|
161
|
+
} catch (error) {
|
|
162
|
+
deps.observability?.warn("Workspace webhook settlement failed", {
|
|
163
|
+
deliveryId: delivery.deliveryId,
|
|
164
|
+
error: errorText(error),
|
|
165
|
+
});
|
|
166
|
+
return "failed" as const;
|
|
167
|
+
}
|
|
168
|
+
}),
|
|
169
|
+
);
|
|
170
|
+
return {
|
|
171
|
+
claimed: claims.length + organizationClaims.length,
|
|
172
|
+
delivered: outcomes.filter((outcome) => outcome === "delivered").length,
|
|
173
|
+
failed: outcomes.filter((outcome) => outcome === "failed").length,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* One non-overlapping loop per API replica. PostgreSQL claims coordinate
|
|
179
|
+
* replicas; a crash only delays a delivery until its claim expires.
|
|
180
|
+
*/
|
|
181
|
+
export function startWorkspaceWebhookDispatchPump(
|
|
182
|
+
deps: WorkspaceWebhookDispatchDeps,
|
|
183
|
+
options: {
|
|
184
|
+
intervalMs?: number;
|
|
185
|
+
drain?: (deps: WorkspaceWebhookDispatchDeps) => Promise<WorkspaceWebhookBatchResult>;
|
|
186
|
+
} = {},
|
|
187
|
+
): () => Promise<void> {
|
|
188
|
+
const intervalMs = Math.max(100, options.intervalMs ?? POLL_INTERVAL_MS);
|
|
189
|
+
const drain = options.drain ?? drainWorkspaceWebhookDeliveries;
|
|
190
|
+
let stopped = false;
|
|
191
|
+
let running: Promise<void> | undefined;
|
|
192
|
+
let ticks = 0;
|
|
193
|
+
|
|
194
|
+
const tick = (): void => {
|
|
195
|
+
if (stopped || running) return;
|
|
196
|
+
ticks += 1;
|
|
197
|
+
// A full batch means a backlog: drain it now instead of one batch per interval.
|
|
198
|
+
let backlog = false;
|
|
199
|
+
running = (async () => {
|
|
200
|
+
const result = await drain(deps);
|
|
201
|
+
backlog = result.claimed >= WORKSPACE_WEBHOOK_DISPATCH_BATCH_SIZE;
|
|
202
|
+
if (result.claimed > 0) deps.observability?.info("Workspace webhook batch settled", result);
|
|
203
|
+
if (ticks % PRUNE_EVERY_TICKS === 0) {
|
|
204
|
+
await pruneWorkspaceWebhookDeliveries(deps.db);
|
|
205
|
+
await pruneOrganizationWebhookDeliveries(deps.db);
|
|
206
|
+
}
|
|
207
|
+
})()
|
|
208
|
+
.catch((error: unknown) => {
|
|
209
|
+
deps.observability?.error("Workspace webhook dispatch failed", { error: errorText(error) });
|
|
210
|
+
})
|
|
211
|
+
.finally(() => {
|
|
212
|
+
running = undefined;
|
|
213
|
+
if (backlog && !stopped) queueMicrotask(tick);
|
|
214
|
+
});
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
const timer = setInterval(tick, intervalMs);
|
|
218
|
+
queueMicrotask(tick);
|
|
219
|
+
|
|
220
|
+
return async () => {
|
|
221
|
+
stopped = true;
|
|
222
|
+
clearInterval(timer);
|
|
223
|
+
await running;
|
|
224
|
+
};
|
|
225
|
+
}
|
package/src/xai-realtime.ts
CHANGED
|
@@ -3,21 +3,24 @@ import type { GatewayRealtimeInitialItem } from "@opengeni/contracts";
|
|
|
3
3
|
import {
|
|
4
4
|
getActiveSessionHistoryItems,
|
|
5
5
|
getSessionRealtimeContinuityEntries,
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
readSubscriptionCoreProviderRouteForWorkspace,
|
|
7
|
+
readSubscriptionCoreSessionOwner,
|
|
8
|
+
SUBSCRIPTION_CORE_XAI,
|
|
9
|
+
SUBSCRIPTION_CORE_XAI_PROVIDER,
|
|
10
|
+
subscriptionCoreOperationConnections,
|
|
11
|
+
subscriptionCoreXaiRequestAuth,
|
|
9
12
|
type Database,
|
|
13
|
+
type SubscriptionCoreFetch,
|
|
10
14
|
} from "@opengeni/db";
|
|
11
15
|
import {
|
|
12
16
|
XAI_CLIENT_MODE,
|
|
13
17
|
XAI_CLIENT_VERSION,
|
|
14
18
|
XAI_PUBLIC_API_BASE_URL,
|
|
15
|
-
type
|
|
19
|
+
type XaiProxyAuthContext,
|
|
16
20
|
} from "@opengeni/xai-subscription";
|
|
17
21
|
|
|
18
22
|
import { openGeniRealtimeInstructions } from "./codex-realtime";
|
|
19
23
|
import { projectSessionRealtimeInitialItems } from "./session-realtime-context";
|
|
20
|
-
import { buildXaiSubscriptionAuthorization } from "./xai-subscription-auth";
|
|
21
24
|
|
|
22
25
|
const UPSTREAM_MODEL_ID = "grok-voice-think-fast-2.0";
|
|
23
26
|
|
|
@@ -61,86 +64,85 @@ export async function createXaiRealtimeConnectionSecret(input: {
|
|
|
61
64
|
"The selected model is not a connected SuperGrok realtime model",
|
|
62
65
|
);
|
|
63
66
|
}
|
|
64
|
-
const
|
|
65
|
-
input.
|
|
66
|
-
{ workspaceId: input.workspaceId, subjectId: input.subjectId },
|
|
67
|
-
);
|
|
68
|
-
let pin = await getXaiSessionAccountPin(input.db, {
|
|
67
|
+
const route = await readSubscriptionCoreProviderRouteForWorkspace(input.db, {
|
|
68
|
+
accountId: input.accountId,
|
|
69
69
|
workspaceId: input.workspaceId,
|
|
70
|
-
|
|
71
|
-
sessionId: input.sessionId,
|
|
72
|
-
authoritySnapshot,
|
|
70
|
+
provider: SUBSCRIPTION_CORE_XAI_PROVIDER,
|
|
73
71
|
});
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
db: input.db,
|
|
78
|
-
settings: input.settings,
|
|
79
|
-
accountId: input.accountId,
|
|
80
|
-
workspaceId: input.workspaceId,
|
|
81
|
-
subjectId: input.subjectId,
|
|
82
|
-
shardKey: input.sessionId,
|
|
83
|
-
pinnedCredentialId: pin?.pinnedCredentialId ?? null,
|
|
84
|
-
pinSource: pin?.pinSource === "manual" || pin?.pinSource === "policy" ? pin.pinSource : null,
|
|
85
|
-
authoritySnapshot,
|
|
86
|
-
sessionId: input.sessionId,
|
|
87
|
-
...(input.fetchImpl ? { fetch: input.fetchImpl as XaiFetch } : {}),
|
|
88
|
-
});
|
|
89
|
-
if (
|
|
90
|
-
auth.rotationEnabled &&
|
|
91
|
-
pin?.pinSource !== "manual" &&
|
|
92
|
-
pin?.pinnedCredentialId !== auth.credentialId
|
|
93
|
-
) {
|
|
94
|
-
try {
|
|
95
|
-
pin = await setXaiSessionAccountPin(input.db, {
|
|
96
|
-
accountId: input.accountId,
|
|
97
|
-
workspaceId: input.workspaceId,
|
|
98
|
-
subjectId: input.subjectId,
|
|
99
|
-
sessionId: input.sessionId,
|
|
100
|
-
authoritySnapshot,
|
|
101
|
-
credentialId: auth.credentialId,
|
|
102
|
-
pinSource: "policy",
|
|
103
|
-
expectedVersion: pin?.version ?? null,
|
|
104
|
-
});
|
|
105
|
-
} catch {
|
|
106
|
-
const current = await getXaiSessionAccountPin(input.db, {
|
|
107
|
-
workspaceId: input.workspaceId,
|
|
108
|
-
subjectId: input.subjectId,
|
|
109
|
-
sessionId: input.sessionId,
|
|
110
|
-
authoritySnapshot,
|
|
111
|
-
});
|
|
112
|
-
if (current?.pinSource === "manual" && current.pinnedCredentialId !== auth.credentialId) {
|
|
113
|
-
auth = await buildXaiSubscriptionAuthorization({
|
|
114
|
-
db: input.db,
|
|
115
|
-
settings: input.settings,
|
|
116
|
-
accountId: input.accountId,
|
|
117
|
-
workspaceId: input.workspaceId,
|
|
118
|
-
subjectId: input.subjectId,
|
|
119
|
-
shardKey: input.sessionId,
|
|
120
|
-
pinnedCredentialId: current.pinnedCredentialId,
|
|
121
|
-
pinSource: "manual",
|
|
122
|
-
authoritySnapshot,
|
|
123
|
-
sessionId: input.sessionId,
|
|
124
|
-
...(input.fetchImpl ? { fetch: input.fetchImpl as XaiFetch } : {}),
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
} catch {
|
|
72
|
+
// SuperGrok realtime runs only on the shared core; any other route
|
|
73
|
+
// (maintenance, or no receipt) has no eligible account.
|
|
74
|
+
if (route !== "core") {
|
|
130
75
|
throw new XaiRealtimeBrokerError(
|
|
131
76
|
"credential_unavailable",
|
|
132
77
|
"No eligible connected SuperGrok account is available",
|
|
133
78
|
);
|
|
134
79
|
}
|
|
80
|
+
return await createCoreXaiRealtimeConnectionSecret(input);
|
|
81
|
+
}
|
|
135
82
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
83
|
+
/**
|
|
84
|
+
* SuperGrok realtime on the shared subscription core (the M3 Codex rule,
|
|
85
|
+
* EP-N05/N07/S17): the session's recorded owner (never the caller), shared
|
|
86
|
+
* organization- or workspace-scoped connections only (decision 3), a
|
|
87
|
+
* `realtime` operation lease held through the client-secret request, with
|
|
88
|
+
* refresh under the per-connection lock. The session binding is never read
|
|
89
|
+
* for placement beyond an explicit choice and never written (decision 6).
|
|
90
|
+
*/
|
|
91
|
+
async function createCoreXaiRealtimeConnectionSecret(input: {
|
|
92
|
+
db: Database;
|
|
93
|
+
settings: Settings;
|
|
94
|
+
accountId: string;
|
|
95
|
+
workspaceId: string;
|
|
96
|
+
sessionId: string;
|
|
97
|
+
fetchImpl?: typeof fetch;
|
|
98
|
+
}): Promise<XaiRealtimeConnectionSecret> {
|
|
99
|
+
const unavailable = () =>
|
|
100
|
+
new XaiRealtimeBrokerError(
|
|
101
|
+
"credential_unavailable",
|
|
102
|
+
"No eligible connected SuperGrok account is available",
|
|
103
|
+
);
|
|
104
|
+
// The deployment switch for SuperGrok subscriptions, as the Codex broker checks its own.
|
|
105
|
+
if (!input.settings.supergrokSubscriptionEnabled) throw unavailable();
|
|
106
|
+
const context = {
|
|
107
|
+
accountId: input.accountId,
|
|
108
|
+
workspaceId: input.workspaceId,
|
|
109
|
+
sessionId: input.sessionId,
|
|
110
|
+
};
|
|
111
|
+
const owner = await readSubscriptionCoreSessionOwner(input.db, context);
|
|
112
|
+
if (!owner) throw unavailable();
|
|
113
|
+
const scope = {
|
|
114
|
+
kind: "session" as const,
|
|
115
|
+
...context,
|
|
116
|
+
sessionOwnerSubjectId: owner.ownerSubjectId,
|
|
117
|
+
};
|
|
118
|
+
const connections = subscriptionCoreOperationConnections(SUBSCRIPTION_CORE_XAI);
|
|
119
|
+
const candidates = await connections.listSubscriptionCoreOperationCandidates(input.db, scope);
|
|
120
|
+
const ran = await connections.runSubscriptionCoreOperation(
|
|
121
|
+
input.db,
|
|
122
|
+
input.settings,
|
|
123
|
+
scope,
|
|
124
|
+
{
|
|
125
|
+
candidates: candidates.map((candidate) => candidate.connectionId),
|
|
126
|
+
operationKind: "realtime",
|
|
127
|
+
holderId: `realtime:${input.sessionId}`,
|
|
141
128
|
fetchImpl: input.fetchImpl ?? fetch,
|
|
142
|
-
}
|
|
143
|
-
|
|
129
|
+
},
|
|
130
|
+
async ({ resolver, fetch: requestFetch, fence }) =>
|
|
131
|
+
await Promise.all([
|
|
132
|
+
getActiveSessionHistoryItems(input.db, input.workspaceId, input.sessionId),
|
|
133
|
+
getSessionRealtimeContinuityEntries(input.db, input.workspaceId, input.sessionId),
|
|
134
|
+
mintXaiClientSecret({
|
|
135
|
+
context: subscriptionCoreXaiRequestAuth(resolver),
|
|
136
|
+
fetchImpl: async (url, init) => {
|
|
137
|
+
// Pre-dispatch fence on the exact operation lease.
|
|
138
|
+
if (!(await fence())) throw unavailable();
|
|
139
|
+
return await requestFetch(url, init);
|
|
140
|
+
},
|
|
141
|
+
}),
|
|
142
|
+
]),
|
|
143
|
+
);
|
|
144
|
+
if (ran.kind === "unavailable") throw unavailable();
|
|
145
|
+
const [history, continuity, minted] = ran.value;
|
|
144
146
|
return {
|
|
145
147
|
...minted,
|
|
146
148
|
upstreamModelId: UPSTREAM_MODEL_ID,
|
|
@@ -150,8 +152,8 @@ export async function createXaiRealtimeConnectionSecret(input: {
|
|
|
150
152
|
}
|
|
151
153
|
|
|
152
154
|
async function mintXaiClientSecret(input: {
|
|
153
|
-
|
|
154
|
-
fetchImpl:
|
|
155
|
+
context: Pick<XaiProxyAuthContext, "getToken" | "refresh">;
|
|
156
|
+
fetchImpl: SubscriptionCoreFetch;
|
|
155
157
|
}): Promise<{ token: string; url: string; expiresAt: number | null }> {
|
|
156
158
|
const request = async (accessToken: string) =>
|
|
157
159
|
await input.fetchImpl(`${XAI_PUBLIC_API_BASE_URL}/realtime/client_secrets`, {
|
|
@@ -168,14 +170,16 @@ async function mintXaiClientSecret(input: {
|
|
|
168
170
|
});
|
|
169
171
|
let response: Response;
|
|
170
172
|
try {
|
|
171
|
-
let token = await input.
|
|
173
|
+
let token = await input.context.getToken();
|
|
172
174
|
response = await request(token.accessToken);
|
|
173
175
|
if (response.status === 401) {
|
|
174
176
|
await response.body?.cancel().catch(() => undefined);
|
|
175
|
-
token = await input.
|
|
177
|
+
token = await input.context.refresh();
|
|
176
178
|
response = await request(token.accessToken);
|
|
177
179
|
}
|
|
178
|
-
} catch {
|
|
180
|
+
} catch (error) {
|
|
181
|
+
// A core pre-dispatch fence refusal is already typed (legacy never raises one).
|
|
182
|
+
if (error instanceof XaiRealtimeBrokerError) throw error;
|
|
179
183
|
throw new XaiRealtimeBrokerError("provider_error", "xAI realtime token request failed");
|
|
180
184
|
}
|
|
181
185
|
if (!response.ok) {
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import type { Settings } from "@opengeni/config";
|
|
2
|
+
import {
|
|
3
|
+
deliverSubscriptionCoreProviderWake,
|
|
4
|
+
readSubscriptionCoreProviderRouteForWorkspace,
|
|
5
|
+
SUBSCRIPTION_CORE_XAI,
|
|
6
|
+
SUBSCRIPTION_CORE_XAI_PROVIDER,
|
|
7
|
+
subscriptionCoreAdministeredConnections,
|
|
8
|
+
subscriptionCoreOperationConnections,
|
|
9
|
+
subscriptionCorePersonalConnections,
|
|
10
|
+
type Database,
|
|
11
|
+
} from "@opengeni/db";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Whether SuperGrok can serve a workspace-level operation (video funding,
|
|
15
|
+
* realtime catalog, transcription): "a shared xAI candidate exists for
|
|
16
|
+
* this workspace" on the shared core, organization- or workspace-scoped
|
|
17
|
+
* shared connections only, never the viewer's personal accounts (design 5.3,
|
|
18
|
+
* EP-N11). Any route other than `core` (maintenance, or no receipt, which
|
|
19
|
+
* this binary's readiness check refuses) serves nothing.
|
|
20
|
+
*/
|
|
21
|
+
export async function workspaceXaiOperationAvailable(
|
|
22
|
+
db: Database,
|
|
23
|
+
settings: Settings,
|
|
24
|
+
input: { accountId: string; workspaceId: string; subjectId: string },
|
|
25
|
+
): Promise<boolean> {
|
|
26
|
+
const route = await readSubscriptionCoreProviderRouteForWorkspace(db, {
|
|
27
|
+
accountId: input.accountId,
|
|
28
|
+
workspaceId: input.workspaceId,
|
|
29
|
+
provider: SUBSCRIPTION_CORE_XAI_PROVIDER,
|
|
30
|
+
});
|
|
31
|
+
if (route !== "core" || !settings.supergrokSubscriptionEnabled) return false;
|
|
32
|
+
const candidates = await subscriptionCoreOperationConnections(
|
|
33
|
+
SUBSCRIPTION_CORE_XAI,
|
|
34
|
+
).listSubscriptionCoreOperationCandidates(db, { kind: "workspace", ...input });
|
|
35
|
+
return candidates.length > 0;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** The SuperGrok status payload. */
|
|
39
|
+
export type XaiStatusPayload<Model> = {
|
|
40
|
+
connected: boolean;
|
|
41
|
+
valid: boolean;
|
|
42
|
+
accountCount: number;
|
|
43
|
+
models?: Model[];
|
|
44
|
+
activeAccount?: {
|
|
45
|
+
id: string;
|
|
46
|
+
label: string | null;
|
|
47
|
+
subject: string | null;
|
|
48
|
+
scope: "workspace" | "organization" | "user";
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* The SuperGrok status after the cutover receipt (design 5.3, status
|
|
54
|
+
* probe): the workspace's shared pool and its effective primary, validated
|
|
55
|
+
* by one live model read through the adapter on that connection. Any route
|
|
56
|
+
* other than the shared core reports nothing usable.
|
|
57
|
+
*
|
|
58
|
+
* The viewer's own personal connections count as connected wherever the
|
|
59
|
+
* owner-only reader shows them. Only in the viewer's own Personal workspace,
|
|
60
|
+
* only without a shared primary, and only for a caller who passes the
|
|
61
|
+
* owner check of a private account (`ownerVerified`: the verified owning
|
|
62
|
+
* person with `connections:write`, by browser sign-in, a verified
|
|
63
|
+
* external-identity assertion linked to them, or an agent acting with their
|
|
64
|
+
* full access; never a read-only agent, a plain bearer or the person's own
|
|
65
|
+
* API keys), is a personal connection the effective account (legacy scope
|
|
66
|
+
* `user`),
|
|
67
|
+
* validated by one live usage read as its owner there; that read also
|
|
68
|
+
* applies the organization's personal-connections rule (0735). Any other
|
|
69
|
+
* caller gets the stored count only, with no live read and no wake.
|
|
70
|
+
* Another person's personal connections are never listed.
|
|
71
|
+
*/
|
|
72
|
+
export async function readXaiCoreStatus<Model>(
|
|
73
|
+
deps: { db: Database; settings: Settings },
|
|
74
|
+
input: {
|
|
75
|
+
accountId: string;
|
|
76
|
+
workspaceId: string;
|
|
77
|
+
subjectId: string;
|
|
78
|
+
models: () => Promise<Model[]>;
|
|
79
|
+
/** Asked only before a live personal read; false refuses it. */
|
|
80
|
+
ownerVerified: () => Promise<boolean>;
|
|
81
|
+
fetch?: unknown;
|
|
82
|
+
},
|
|
83
|
+
): Promise<XaiStatusPayload<Model>> {
|
|
84
|
+
const scope = {
|
|
85
|
+
kind: "workspace" as const,
|
|
86
|
+
accountId: input.accountId,
|
|
87
|
+
workspaceId: input.workspaceId,
|
|
88
|
+
subjectId: input.subjectId,
|
|
89
|
+
};
|
|
90
|
+
const route = await readSubscriptionCoreProviderRouteForWorkspace(deps.db, {
|
|
91
|
+
...scope,
|
|
92
|
+
provider: SUBSCRIPTION_CORE_XAI_PROVIDER,
|
|
93
|
+
});
|
|
94
|
+
if (route !== "core") return { connected: false, valid: false, accountCount: 0 };
|
|
95
|
+
const connections = subscriptionCoreOperationConnections(SUBSCRIPTION_CORE_XAI);
|
|
96
|
+
const [pool, personal] = await Promise.all([
|
|
97
|
+
connections.readSubscriptionCoreWorkspaceConnections(deps.db, scope),
|
|
98
|
+
subscriptionCorePersonalConnections(
|
|
99
|
+
SUBSCRIPTION_CORE_XAI,
|
|
100
|
+
).readSubscriptionCorePersonalConnections(deps.db, scope),
|
|
101
|
+
]);
|
|
102
|
+
const accountCount = pool.connections.length + personal.connections.length;
|
|
103
|
+
const fetchDeps = input.fetch ? { fetchImpl: input.fetch as typeof fetch } : {};
|
|
104
|
+
const active = pool.connections.find(
|
|
105
|
+
(connection) => connection.connectionId === pool.primaryConnectionId,
|
|
106
|
+
);
|
|
107
|
+
const ownActive = personal.ownPersonalWorkspace
|
|
108
|
+
? personal.connections.find((connection) => connection.status === "active")
|
|
109
|
+
: undefined;
|
|
110
|
+
if (!active && ownActive && (await input.ownerVerified())) {
|
|
111
|
+
const probe = await subscriptionCoreAdministeredConnections(
|
|
112
|
+
SUBSCRIPTION_CORE_XAI,
|
|
113
|
+
).probeSubscriptionCoreAdministeredConnectionUsage(
|
|
114
|
+
deps.db,
|
|
115
|
+
deps.settings,
|
|
116
|
+
{
|
|
117
|
+
kind: "personal_owner",
|
|
118
|
+
accountId: input.accountId,
|
|
119
|
+
workspaceId: input.workspaceId,
|
|
120
|
+
subjectId: input.subjectId,
|
|
121
|
+
},
|
|
122
|
+
ownActive.connectionId,
|
|
123
|
+
fetchDeps,
|
|
124
|
+
);
|
|
125
|
+
const valid = probe.kind === "read";
|
|
126
|
+
if (probe.kind === "read" && probe.recovered) {
|
|
127
|
+
// The reading is stored and may have ended an exhaustion: wake the
|
|
128
|
+
// organization's SuperGrok core waiters. The reading already
|
|
129
|
+
// committed, so a failed wake hint never fails the status (every core
|
|
130
|
+
// waiter has its own recheck).
|
|
131
|
+
await deliverSubscriptionCoreProviderWake(deps.db, SUBSCRIPTION_CORE_XAI_PROVIDER, {
|
|
132
|
+
accountId: input.accountId,
|
|
133
|
+
reason: "usage_recovered",
|
|
134
|
+
}).catch(() => undefined);
|
|
135
|
+
}
|
|
136
|
+
return {
|
|
137
|
+
connected: true,
|
|
138
|
+
valid,
|
|
139
|
+
accountCount,
|
|
140
|
+
models: valid ? await input.models() : [],
|
|
141
|
+
activeAccount: {
|
|
142
|
+
id: ownActive.connectionId,
|
|
143
|
+
label: ownActive.label,
|
|
144
|
+
subject: ownActive.providerAccountId,
|
|
145
|
+
scope: "user",
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
if (!active) {
|
|
150
|
+
return { connected: accountCount > 0, valid: false, accountCount };
|
|
151
|
+
}
|
|
152
|
+
const probe = await connections.probeSubscriptionCoreConnectionLiveModels(
|
|
153
|
+
deps.db,
|
|
154
|
+
deps.settings,
|
|
155
|
+
scope,
|
|
156
|
+
active.connectionId,
|
|
157
|
+
fetchDeps,
|
|
158
|
+
);
|
|
159
|
+
const valid = probe.kind === "read";
|
|
160
|
+
return {
|
|
161
|
+
connected: true,
|
|
162
|
+
valid,
|
|
163
|
+
accountCount,
|
|
164
|
+
models: valid ? await input.models() : [],
|
|
165
|
+
activeAccount: {
|
|
166
|
+
id: active.connectionId,
|
|
167
|
+
label: active.label,
|
|
168
|
+
subject: active.providerAccountId,
|
|
169
|
+
scope: active.source,
|
|
170
|
+
},
|
|
171
|
+
};
|
|
172
|
+
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import type { BrowserProtectedAuthFieldValue, ProtectedAuthField, SiteAuthAuthority } from "@opengeni/contracts";
|
|
2
|
-
type ConnectionFieldsAuthority = Extract<SiteAuthAuthority, {
|
|
3
|
-
kind: "connection_fields";
|
|
4
|
-
}>;
|
|
5
|
-
export declare class BrowserAuthCredentialError extends Error {
|
|
6
|
-
readonly name = "BrowserAuthCredentialError";
|
|
7
|
-
}
|
|
8
|
-
export declare function resolveProtectedAuthFieldValues(input: {
|
|
9
|
-
authority: ConnectionFieldsAuthority;
|
|
10
|
-
requestedFields: readonly ProtectedAuthField[];
|
|
11
|
-
credential: Readonly<Record<string, unknown>>;
|
|
12
|
-
nowMs?: number;
|
|
13
|
-
}): BrowserProtectedAuthFieldValue[];
|
|
14
|
-
export declare function totpCode(secretValue: string, options?: {
|
|
15
|
-
digits?: number;
|
|
16
|
-
periodSeconds?: number;
|
|
17
|
-
algorithm?: "sha1" | "sha256" | "sha512";
|
|
18
|
-
nowMs?: number;
|
|
19
|
-
}): string;
|
|
20
|
-
export {};
|