@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,262 @@
|
|
|
1
|
+
import { siteRuntimeForwardedResponse } from "./runtime";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The Site-safe view of a published-Site conversation's events, shared by
|
|
5
|
+
* the event pages and the event stream so both deliver the same thing.
|
|
6
|
+
*
|
|
7
|
+
* A viewer sees the conversation, not the workspace behind it:
|
|
8
|
+
* - Only the event types a chat needs are delivered: messages (with their
|
|
9
|
+
* live text deltas), tool-call receipts, turn and session lifecycle, the
|
|
10
|
+
* queue and usage notices. Their payloads keep allowlisted fields only:
|
|
11
|
+
* message text, a tool's call id and name and whether it failed (never its
|
|
12
|
+
* arguments or output), and short status codes (never error text).
|
|
13
|
+
* - Every other event (reasoning, sandbox and terminal output, model and
|
|
14
|
+
* provider-account telemetry, setup, goals, memory, policy and late or
|
|
15
|
+
* duplicate deliveries) becomes a `session.event.envelope_omitted`
|
|
16
|
+
* placeholder with an empty payload. The placeholder keeps the sequence
|
|
17
|
+
* contiguous, so a client's gap detection and resume still work, and says
|
|
18
|
+
* nothing about what was there.
|
|
19
|
+
* - The envelope keeps the event id, session id, sequence, coverage,
|
|
20
|
+
* occurrence time and turn id. It drops the workspace id, attempt ids and
|
|
21
|
+
* generations, duplicate diagnostics, codec and read-bound markers.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
const OMITTED_TYPE = "session.event.envelope_omitted";
|
|
25
|
+
|
|
26
|
+
type FieldRule = "text" | "code" | "ref" | "count" | "flag";
|
|
27
|
+
|
|
28
|
+
/** Event types a Site viewer receives, with the payload fields each keeps. */
|
|
29
|
+
const SITE_EVENT_PAYLOAD_FIELDS: ReadonlyMap<string, Readonly<Record<string, FieldRule>>> = new Map<
|
|
30
|
+
string,
|
|
31
|
+
Readonly<Record<string, FieldRule>>
|
|
32
|
+
>([
|
|
33
|
+
["session.created", {}],
|
|
34
|
+
["session.status.changed", { status: "code", previousStatus: "code", code: "code" }],
|
|
35
|
+
["session.title_set", { title: "text" }],
|
|
36
|
+
["session.requiresAction", {}],
|
|
37
|
+
["session.humanInput.requested", {}],
|
|
38
|
+
["session.queue.changed", { operation: "code", queueVersion: "count" }],
|
|
39
|
+
["session.queue.prompt.cancelled", {}],
|
|
40
|
+
["session.control.paused", {}],
|
|
41
|
+
["session.control.resumed", {}],
|
|
42
|
+
["session.control.steer_requested", {}],
|
|
43
|
+
[OMITTED_TYPE, {}],
|
|
44
|
+
["user.message", { text: "text", delivery: "code", routing: "code" }],
|
|
45
|
+
["user.pause", {}],
|
|
46
|
+
["turn.queued", {}],
|
|
47
|
+
["turn.started", {}],
|
|
48
|
+
["turn.completed", { segmentLimit: "code", maintenance: "code" }],
|
|
49
|
+
["turn.failed", { code: "code", failureCode: "code", retryable: "flag" }],
|
|
50
|
+
["turn.cancelled", { reason: "code" }],
|
|
51
|
+
["turn.superseded", { reason: "code" }],
|
|
52
|
+
[
|
|
53
|
+
"agent.message.delta",
|
|
54
|
+
{ text: "text", messageId: "ref", phase: "code", coalescedUntil: "count" },
|
|
55
|
+
],
|
|
56
|
+
["agent.message.completed", { text: "text", messageId: "ref", phase: "code" }],
|
|
57
|
+
["agent.toolCall.created", { id: "ref", name: "ref" }],
|
|
58
|
+
["agent.toolCall.output", { id: "ref", name: "ref", error: "flag" }],
|
|
59
|
+
["usage.threshold_reached", {}],
|
|
60
|
+
["usage.exhausted", {}],
|
|
61
|
+
]);
|
|
62
|
+
|
|
63
|
+
/** The event types a Site viewer can receive with their content. */
|
|
64
|
+
export const SITE_VISIBLE_SESSION_EVENT_TYPES: ReadonlySet<string> = new Set(
|
|
65
|
+
SITE_EVENT_PAYLOAD_FIELDS.keys(),
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
const CODE = /^[A-Za-z0-9][A-Za-z0-9_.:-]{0,63}$/u;
|
|
69
|
+
const REF = /^[A-Za-z0-9][A-Za-z0-9_.:/-]{0,255}$/u;
|
|
70
|
+
|
|
71
|
+
function record(value: unknown): Record<string, unknown> | null {
|
|
72
|
+
return value && typeof value === "object" && !Array.isArray(value)
|
|
73
|
+
? (value as Record<string, unknown>)
|
|
74
|
+
: null;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function allowedField(rule: FieldRule, value: unknown): boolean {
|
|
78
|
+
switch (rule) {
|
|
79
|
+
case "text":
|
|
80
|
+
return typeof value === "string";
|
|
81
|
+
case "code":
|
|
82
|
+
return typeof value === "string" && CODE.test(value);
|
|
83
|
+
case "ref":
|
|
84
|
+
return typeof value === "string" && REF.test(value);
|
|
85
|
+
case "count":
|
|
86
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value >= 0;
|
|
87
|
+
case "flag":
|
|
88
|
+
return typeof value === "boolean";
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export type SiteSessionEventPayloadMode = "summary" | "none";
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Project one event for a Site viewer, or null when it is not an event at all.
|
|
96
|
+
* Hidden events become an omitted placeholder at the same sequence.
|
|
97
|
+
*/
|
|
98
|
+
export function siteSessionEventProjection(
|
|
99
|
+
event: unknown,
|
|
100
|
+
options: { payload?: SiteSessionEventPayloadMode } = {},
|
|
101
|
+
): Record<string, unknown> | null {
|
|
102
|
+
const source = record(event);
|
|
103
|
+
if (!source) return null;
|
|
104
|
+
const { id, sequence } = source;
|
|
105
|
+
if (typeof id !== "string" || typeof sequence !== "number" || !Number.isSafeInteger(sequence))
|
|
106
|
+
return null;
|
|
107
|
+
const projected: Record<string, unknown> = {
|
|
108
|
+
id,
|
|
109
|
+
sessionId: typeof source.sessionId === "string" ? source.sessionId : null,
|
|
110
|
+
sequence,
|
|
111
|
+
};
|
|
112
|
+
const covered = source.coveredThrough;
|
|
113
|
+
if (typeof covered === "number" && Number.isSafeInteger(covered) && covered >= sequence)
|
|
114
|
+
projected.coveredThrough = covered;
|
|
115
|
+
projected.occurredAt = typeof source.occurredAt === "string" ? source.occurredAt : null;
|
|
116
|
+
const current =
|
|
117
|
+
(source.turnAssociation === undefined ||
|
|
118
|
+
source.turnAssociation === null ||
|
|
119
|
+
source.turnAssociation === "current") &&
|
|
120
|
+
(source.duplicateOfEventId === undefined || source.duplicateOfEventId === null);
|
|
121
|
+
const type = typeof source.type === "string" ? source.type : "";
|
|
122
|
+
const fields = current ? SITE_EVENT_PAYLOAD_FIELDS.get(type) : undefined;
|
|
123
|
+
if (!fields) return { ...projected, type: OMITTED_TYPE, turnId: null, payload: {} };
|
|
124
|
+
projected.type = type;
|
|
125
|
+
projected.turnId = typeof source.turnId === "string" ? source.turnId : null;
|
|
126
|
+
if (
|
|
127
|
+
type === "user.message" &&
|
|
128
|
+
typeof source.clientEventId === "string" &&
|
|
129
|
+
source.clientEventId.length <= 256
|
|
130
|
+
)
|
|
131
|
+
projected.clientEventId = source.clientEventId;
|
|
132
|
+
const payload: Record<string, unknown> = {};
|
|
133
|
+
const body = options.payload === "none" ? null : record(source.payload);
|
|
134
|
+
if (body) {
|
|
135
|
+
for (const [name, rule] of Object.entries(fields))
|
|
136
|
+
if (Object.hasOwn(body, name) && allowedField(rule, body[name])) payload[name] = body[name];
|
|
137
|
+
// A failed tool says so without its output (an MCP error result).
|
|
138
|
+
if (type === "agent.toolCall.output" && record(body.output)?.isError === true)
|
|
139
|
+
payload.error = true;
|
|
140
|
+
}
|
|
141
|
+
projected.payload = payload;
|
|
142
|
+
return projected;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/** Upstream SSE frames never come close to this; a stream that does is broken. */
|
|
146
|
+
const SSE_BUFFER_MAX_CHARS = 8 * 1024 * 1024;
|
|
147
|
+
|
|
148
|
+
function projectSseFrame(frame: string): string | null {
|
|
149
|
+
const lines = frame.split("\n");
|
|
150
|
+
// Comments (`: connected`, `: heartbeat`) keep the connection alive.
|
|
151
|
+
if (lines.every((line) => line.startsWith(":"))) return `${frame}\n\n`;
|
|
152
|
+
let id: string | null = null;
|
|
153
|
+
const data: string[] = [];
|
|
154
|
+
for (const line of lines) {
|
|
155
|
+
if (line.startsWith("id:")) id = line.slice(3).trim();
|
|
156
|
+
else if (line.startsWith("data:")) data.push(line.slice(5).replace(/^ /u, ""));
|
|
157
|
+
}
|
|
158
|
+
if (data.length === 0) return null;
|
|
159
|
+
let parsed: unknown;
|
|
160
|
+
try {
|
|
161
|
+
parsed = JSON.parse(data.join("\n"));
|
|
162
|
+
} catch {
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
const projected = siteSessionEventProjection(parsed);
|
|
166
|
+
if (!projected) return null;
|
|
167
|
+
const sequence = projected.sequence as number;
|
|
168
|
+
// The frame id is the sequence this frame covers (coalesced deltas cover a
|
|
169
|
+
// run); keep it so a reconnect resumes after everything it covered.
|
|
170
|
+
const covered = id !== null && /^\d{1,15}$/u.test(id) && Number(id) >= sequence ? id : sequence;
|
|
171
|
+
return `id: ${covered}\nevent: ${projected.type as string}\ndata: ${JSON.stringify(projected)}\n\n`;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/** Rewrites a session event stream (SSE or a finite SSE batch) frame by frame. */
|
|
175
|
+
export function siteSessionEventSseTransform(): TransformStream<Uint8Array, Uint8Array> {
|
|
176
|
+
const decoder = new TextDecoder();
|
|
177
|
+
const encoder = new TextEncoder();
|
|
178
|
+
let buffer = "";
|
|
179
|
+
const drain = (controller: TransformStreamDefaultController<Uint8Array>) => {
|
|
180
|
+
let start = 0;
|
|
181
|
+
let output = "";
|
|
182
|
+
for (let end = buffer.indexOf("\n\n", start); end >= 0; end = buffer.indexOf("\n\n", start)) {
|
|
183
|
+
const frame = projectSseFrame(buffer.slice(start, end));
|
|
184
|
+
if (frame !== null) output += frame;
|
|
185
|
+
start = end + 2;
|
|
186
|
+
}
|
|
187
|
+
buffer = buffer.slice(start);
|
|
188
|
+
if (output) controller.enqueue(encoder.encode(output));
|
|
189
|
+
if (buffer.length > SSE_BUFFER_MAX_CHARS)
|
|
190
|
+
throw new Error("Session event stream frame exceeds the Site projection buffer");
|
|
191
|
+
};
|
|
192
|
+
return new TransformStream<Uint8Array, Uint8Array>({
|
|
193
|
+
transform(chunk, controller) {
|
|
194
|
+
buffer += decoder.decode(chunk, { stream: true });
|
|
195
|
+
drain(controller);
|
|
196
|
+
},
|
|
197
|
+
flush(controller) {
|
|
198
|
+
buffer += decoder.decode();
|
|
199
|
+
drain(controller);
|
|
200
|
+
},
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/** A forwarded event stream, answered with the Site-safe projection. */
|
|
205
|
+
export function siteSessionEventStreamResponse(response: Response): Response {
|
|
206
|
+
const forwarded = siteRuntimeForwardedResponse(response);
|
|
207
|
+
if (!forwarded.ok || !forwarded.body) return forwarded;
|
|
208
|
+
const headers = new Headers(forwarded.headers);
|
|
209
|
+
headers.delete("content-length");
|
|
210
|
+
return new Response(forwarded.body.pipeThrough(siteSessionEventSseTransform()), {
|
|
211
|
+
status: forwarded.status,
|
|
212
|
+
headers,
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/** Cursor and paging facts of an event page that stay meaningful after projection. */
|
|
217
|
+
const PAGE_HEADERS = [
|
|
218
|
+
"x-opengeni-event-direction",
|
|
219
|
+
"x-opengeni-page-max-bytes",
|
|
220
|
+
"x-opengeni-page-truncated",
|
|
221
|
+
"x-opengeni-has-more",
|
|
222
|
+
"x-opengeni-truncated-by",
|
|
223
|
+
"x-opengeni-covered-first",
|
|
224
|
+
"x-opengeni-covered-last",
|
|
225
|
+
"x-opengeni-next-after",
|
|
226
|
+
"x-opengeni-next-before",
|
|
227
|
+
] as const;
|
|
228
|
+
|
|
229
|
+
/** A forwarded event page, answered with the Site-safe projection. */
|
|
230
|
+
export async function siteSessionEventPageResponse(
|
|
231
|
+
response: Response,
|
|
232
|
+
options: { payload?: SiteSessionEventPayloadMode } = {},
|
|
233
|
+
): Promise<Response> {
|
|
234
|
+
if (!response.ok) return siteRuntimeForwardedResponse(response);
|
|
235
|
+
const body: unknown = await response.json().catch(() => null);
|
|
236
|
+
const events = (Array.isArray(body) ? body : [])
|
|
237
|
+
.map((event) => siteSessionEventProjection(event, options))
|
|
238
|
+
.filter((event): event is Record<string, unknown> => event !== null);
|
|
239
|
+
return siteSessionEventPage(events, options, response.headers);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/** A page of already projected events with monitoring-read headers. */
|
|
243
|
+
export function siteSessionEventPage(
|
|
244
|
+
events: readonly Record<string, unknown>[],
|
|
245
|
+
options: { payload?: SiteSessionEventPayloadMode } = {},
|
|
246
|
+
upstream?: Headers,
|
|
247
|
+
): Response {
|
|
248
|
+
const text = JSON.stringify(events);
|
|
249
|
+
const headers = new Headers({
|
|
250
|
+
"content-type": "application/json; charset=UTF-8",
|
|
251
|
+
"cache-control": "no-store",
|
|
252
|
+
"x-opengeni-event-mode": "monitoring",
|
|
253
|
+
"x-opengeni-payload-mode": options.payload === "none" ? "none" : "summary",
|
|
254
|
+
"x-opengeni-forensic-exact": "false",
|
|
255
|
+
"x-opengeni-page-bytes": String(new TextEncoder().encode(text).byteLength),
|
|
256
|
+
});
|
|
257
|
+
for (const name of PAGE_HEADERS) {
|
|
258
|
+
const value = upstream?.get(name);
|
|
259
|
+
if (value !== null && value !== undefined) headers.set(name, value);
|
|
260
|
+
}
|
|
261
|
+
return new Response(text, { status: 200, headers });
|
|
262
|
+
}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import { siteSessionEventProjection } from "./session-events";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Site-safe views of the session reads and command results a published
|
|
5
|
+
* Site's viewer gets back: the conversation's own text, states and versions,
|
|
6
|
+
* never the workspace behind it (account and workspace ids, workflow and
|
|
7
|
+
* attempt ids, tools, sandboxes, metadata, lineage, initiators, people's
|
|
8
|
+
* subject ids, pause reasons, credentials or human-input answers). Each view
|
|
9
|
+
* keeps the field shapes the SDK expects, with empty lists and objects where
|
|
10
|
+
* a field is withheld. Event pages and streams use the event projection in
|
|
11
|
+
* `session-events.ts`; sessions use `siteSessionProjection`.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
type Fields = Record<string, unknown>;
|
|
15
|
+
|
|
16
|
+
function fields(value: unknown): Fields | null {
|
|
17
|
+
return value !== null && typeof value === "object" && !Array.isArray(value)
|
|
18
|
+
? (value as Fields)
|
|
19
|
+
: null;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function list(value: unknown): unknown[] {
|
|
23
|
+
return Array.isArray(value) ? value : [];
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function pick(value: Fields, keys: readonly string[]): Fields {
|
|
27
|
+
const out: Fields = {};
|
|
28
|
+
for (const key of keys) if (Object.hasOwn(value, key)) out[key] = value[key];
|
|
29
|
+
return out;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function present<T>(value: T | null): value is T {
|
|
33
|
+
return value !== null;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const CONTROL_FIELDS = [
|
|
37
|
+
"state",
|
|
38
|
+
"controlVersion",
|
|
39
|
+
"controlEtag",
|
|
40
|
+
"directState",
|
|
41
|
+
"additionalBlockerCount",
|
|
42
|
+
"settlement",
|
|
43
|
+
"backgroundCommandSettlement",
|
|
44
|
+
] as const;
|
|
45
|
+
|
|
46
|
+
/** What holds a conversation, without who did it, why, or which other sessions. */
|
|
47
|
+
function siteControlBlocker(value: unknown): Fields | null {
|
|
48
|
+
const blocker = fields(value);
|
|
49
|
+
if (!blocker) return null;
|
|
50
|
+
const workspace = blocker.kind === "workspace";
|
|
51
|
+
return {
|
|
52
|
+
kind: workspace ? "workspace" : "session",
|
|
53
|
+
displayName: workspace ? "Workspace" : "Conversation",
|
|
54
|
+
actor: null,
|
|
55
|
+
reason: null,
|
|
56
|
+
changedAt: typeof blocker.changedAt === "string" ? blocker.changedAt : null,
|
|
57
|
+
revision: typeof blocker.revision === "number" ? blocker.revision : 0,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** A conversation's effective control: its state and versions, and a resume of itself only. */
|
|
62
|
+
export function siteControlView(value: unknown): Fields | null {
|
|
63
|
+
const control = fields(value);
|
|
64
|
+
if (!control) return null;
|
|
65
|
+
const resumeOptions = list(control.resumeOptions)
|
|
66
|
+
.map(fields)
|
|
67
|
+
.filter(present)
|
|
68
|
+
.filter((option) => option.scope === "session")
|
|
69
|
+
.map((option) => ({
|
|
70
|
+
scope: "session",
|
|
71
|
+
selectedStateAfter: option.selectedStateAfter,
|
|
72
|
+
impactCopy: "Resume this conversation.",
|
|
73
|
+
}));
|
|
74
|
+
return {
|
|
75
|
+
...pick(control, CONTROL_FIELDS),
|
|
76
|
+
primaryBlocker: siteControlBlocker(control.primaryBlocker),
|
|
77
|
+
blockers: list(control.blockers).map(siteControlBlocker).filter(present),
|
|
78
|
+
resumeOptions,
|
|
79
|
+
override: null,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const TURN_FIELDS = [
|
|
84
|
+
"id",
|
|
85
|
+
"sessionId",
|
|
86
|
+
"status",
|
|
87
|
+
"source",
|
|
88
|
+
"position",
|
|
89
|
+
"prompt",
|
|
90
|
+
"model",
|
|
91
|
+
"reasoningEffort",
|
|
92
|
+
"latencyMode",
|
|
93
|
+
"version",
|
|
94
|
+
"startedAt",
|
|
95
|
+
"finishedAt",
|
|
96
|
+
"createdAt",
|
|
97
|
+
"updatedAt",
|
|
98
|
+
] as const;
|
|
99
|
+
|
|
100
|
+
/** A turn: its message text, model, place and state. */
|
|
101
|
+
export function siteTurnView(value: unknown): Fields | null {
|
|
102
|
+
const turn = fields(value);
|
|
103
|
+
if (!turn) return null;
|
|
104
|
+
return {
|
|
105
|
+
...pick(turn, TURN_FIELDS),
|
|
106
|
+
annotations: [],
|
|
107
|
+
resources: [],
|
|
108
|
+
tools: [],
|
|
109
|
+
metadata: {},
|
|
110
|
+
lineage: {},
|
|
111
|
+
personalConnections: [],
|
|
112
|
+
personalResources: null,
|
|
113
|
+
cancelledBy: null,
|
|
114
|
+
cancelReason: null,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/** The conversation's queue: its own turns, without machine inputs. */
|
|
119
|
+
export function siteQueueView(value: unknown): Fields | null {
|
|
120
|
+
const queue = fields(value);
|
|
121
|
+
if (!queue) return null;
|
|
122
|
+
return {
|
|
123
|
+
version: queue.version,
|
|
124
|
+
effectiveControl: siteControlView(queue.effectiveControl),
|
|
125
|
+
activePersonalConnections: [],
|
|
126
|
+
stoppingPreviousAttempt: queue.stoppingPreviousAttempt === true,
|
|
127
|
+
items: list(queue.items).map(siteTurnView).filter(present),
|
|
128
|
+
pendingInputs: [],
|
|
129
|
+
pendingInputAttachment: null,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const DRAFT_FIELDS = [
|
|
134
|
+
"revision",
|
|
135
|
+
"text",
|
|
136
|
+
"model",
|
|
137
|
+
"reasoningEffort",
|
|
138
|
+
"latencyMode",
|
|
139
|
+
"sourceTurnId",
|
|
140
|
+
"sourceTurnVersion",
|
|
141
|
+
"updatedAt",
|
|
142
|
+
] as const;
|
|
143
|
+
|
|
144
|
+
/** A composer draft: text and model only (Site drafts carry nothing else). */
|
|
145
|
+
export function siteDraftView(value: unknown): Fields | null {
|
|
146
|
+
const draft = fields(value);
|
|
147
|
+
if (!draft) return null;
|
|
148
|
+
return { ...pick(draft, DRAFT_FIELDS), annotations: [], resources: [] };
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const RECEIPT_FIELDS = [
|
|
152
|
+
"id",
|
|
153
|
+
"action",
|
|
154
|
+
"operationKey",
|
|
155
|
+
"targetSessionId",
|
|
156
|
+
"targetTurnId",
|
|
157
|
+
"appliedControlRevision",
|
|
158
|
+
"appliedQueueVersion",
|
|
159
|
+
"appliedTurnVersion",
|
|
160
|
+
"appliedDraftRevision",
|
|
161
|
+
"createdAt",
|
|
162
|
+
] as const;
|
|
163
|
+
|
|
164
|
+
function siteReceiptView(value: unknown): Fields | null {
|
|
165
|
+
const receipt = fields(value);
|
|
166
|
+
return receipt ? pick(receipt, RECEIPT_FIELDS) : null;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
const QUESTION_FIELDS = [
|
|
170
|
+
"id",
|
|
171
|
+
"kind",
|
|
172
|
+
"prompt",
|
|
173
|
+
"label",
|
|
174
|
+
"helpText",
|
|
175
|
+
"options",
|
|
176
|
+
"required",
|
|
177
|
+
"allowOther",
|
|
178
|
+
"validation",
|
|
179
|
+
] as const;
|
|
180
|
+
|
|
181
|
+
const HUMAN_INPUT_FIELDS = [
|
|
182
|
+
"id",
|
|
183
|
+
"sessionId",
|
|
184
|
+
"turnId",
|
|
185
|
+
"status",
|
|
186
|
+
"allowSkip",
|
|
187
|
+
"respondedAt",
|
|
188
|
+
"expiresAt",
|
|
189
|
+
"createdAt",
|
|
190
|
+
"updatedAt",
|
|
191
|
+
] as const;
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* A human-input request: its questions without secret specs or review
|
|
195
|
+
* references, and never the answers or who gave them (a Site does not
|
|
196
|
+
* answer; answers belong to whoever did, in the console).
|
|
197
|
+
*/
|
|
198
|
+
export function siteHumanInputRequestView(value: unknown): Fields | null {
|
|
199
|
+
const request = fields(value);
|
|
200
|
+
if (!request) return null;
|
|
201
|
+
return {
|
|
202
|
+
...pick(request, HUMAN_INPUT_FIELDS),
|
|
203
|
+
questions: list(request.questions)
|
|
204
|
+
.map(fields)
|
|
205
|
+
.filter(present)
|
|
206
|
+
.map((question) => pick(question, QUESTION_FIELDS)),
|
|
207
|
+
response: null,
|
|
208
|
+
respondedBy: null,
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/** `{ requests }` from the human-input list. */
|
|
213
|
+
export function siteHumanInputListView(value: unknown): Fields {
|
|
214
|
+
return {
|
|
215
|
+
requests: list(fields(value)?.requests).map(siteHumanInputRequestView).filter(present),
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/** A queue command result (move, edit, delete, steer). */
|
|
220
|
+
export function siteQueueMutationView(value: unknown): Fields | null {
|
|
221
|
+
const result = fields(value);
|
|
222
|
+
if (!result) return null;
|
|
223
|
+
return {
|
|
224
|
+
receipt: siteReceiptView(result.receipt),
|
|
225
|
+
snapshot: siteQueueView(result.snapshot),
|
|
226
|
+
...(result.draft === undefined ? {} : { draft: siteDraftView(result.draft) }),
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/** An accepted message (composer submit, steer): the event, turn and routing. */
|
|
231
|
+
export function siteAcceptedMessageView(value: unknown): Fields | null {
|
|
232
|
+
const result = fields(value);
|
|
233
|
+
if (!result) return null;
|
|
234
|
+
return {
|
|
235
|
+
accepted: siteSessionEventProjection(result.accepted),
|
|
236
|
+
turn: siteTurnView(result.turn),
|
|
237
|
+
...(result.draft === undefined ? {} : { draft: siteDraftView(result.draft) }),
|
|
238
|
+
receipt: siteReceiptView(result.receipt),
|
|
239
|
+
...pick(result, ["routing", "interruptionCount", "replay"]),
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/** A control result: the receipt and the conversation's control. */
|
|
244
|
+
export function siteControlResultView(value: unknown): Fields | null {
|
|
245
|
+
const result = fields(value);
|
|
246
|
+
if (!result) return null;
|
|
247
|
+
return {
|
|
248
|
+
receipt: siteReceiptView(result.receipt),
|
|
249
|
+
effectiveControl: siteControlView(result.effectiveControl),
|
|
250
|
+
...pick(result, [
|
|
251
|
+
"interruptionCount",
|
|
252
|
+
"wakeCount",
|
|
253
|
+
"cancelledSessionCount",
|
|
254
|
+
"cancelledTurnCount",
|
|
255
|
+
]),
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/** An accepted event (`POST /events`): the Site event projection. */
|
|
260
|
+
export function siteAcceptedEventView(value: unknown): Fields | null {
|
|
261
|
+
return siteSessionEventProjection(value);
|
|
262
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { SiteAccessMode, SiteViewer } from "@opengeni/contracts";
|
|
2
|
+
import type { Settings } from "@opengeni/config";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Who may open a published Site. The API decides this on sign-in and again
|
|
6
|
+
* on every site-runtime call; the gateway's own checks are only a convenience.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export type SiteViewerAccessSettings = Pick<Settings, "sitesPublicEnabled" | "sitesLoginOnly">;
|
|
10
|
+
|
|
11
|
+
/** Public access needs the deployment switch; without it a public Site is members-only. */
|
|
12
|
+
export function effectiveSiteAccess(
|
|
13
|
+
access: SiteAccessMode,
|
|
14
|
+
settings: SiteViewerAccessSettings,
|
|
15
|
+
): SiteAccessMode {
|
|
16
|
+
return access === "public" && !settings.sitesPublicEnabled ? "members" : access;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* The kind of a signed-in viewer, or null when the Site does not admit them:
|
|
21
|
+
* workspace members always; invited email addresses (verified) for invited
|
|
22
|
+
* and public Sites; anyone signed in for public Sites.
|
|
23
|
+
*/
|
|
24
|
+
export function signedInSiteViewerKind(input: {
|
|
25
|
+
access: SiteAccessMode;
|
|
26
|
+
member: boolean;
|
|
27
|
+
email: string | null;
|
|
28
|
+
invitedEmails: readonly string[];
|
|
29
|
+
}): "member" | "invited" | "user" | null {
|
|
30
|
+
if (input.member) return "member";
|
|
31
|
+
if (
|
|
32
|
+
input.access !== "members" &&
|
|
33
|
+
input.email !== null &&
|
|
34
|
+
input.invitedEmails.includes(input.email.trim().toLowerCase())
|
|
35
|
+
)
|
|
36
|
+
return "invited";
|
|
37
|
+
return input.access === "public" ? "user" : null;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** Anonymous guests reach only public Sites, and never on a login-only deployment. */
|
|
41
|
+
export function siteGuestsAllowed(
|
|
42
|
+
access: SiteAccessMode,
|
|
43
|
+
settings: SiteViewerAccessSettings,
|
|
44
|
+
): boolean {
|
|
45
|
+
return effectiveSiteAccess(access, settings) === "public" && !settings.sitesLoginOnly;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** Gateway-minted visitor ids: opaque, URL-safe, bounded. */
|
|
49
|
+
export const SITE_VISITOR_ID = /^[A-Za-z0-9_-]{16,128}$/u;
|
|
50
|
+
|
|
51
|
+
export type SiteRuntimeViewer = {
|
|
52
|
+
kind: SiteViewer["kind"];
|
|
53
|
+
/** `user:<subject>` or `guest:<visitor>`: the Site Data owner and conversation owner. */
|
|
54
|
+
principal: string;
|
|
55
|
+
subjectId: string | null;
|
|
56
|
+
name: string | null;
|
|
57
|
+
email: string | null;
|
|
58
|
+
/** The site-session row when signed in. */
|
|
59
|
+
sessionId: string | null;
|
|
60
|
+
/**
|
|
61
|
+
* Set while a workspace member previews the Site as another role ("View
|
|
62
|
+
* as visitor"): the viewer is then exactly that role, never more.
|
|
63
|
+
*/
|
|
64
|
+
viewAs?: "invited" | "public" | null;
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
export function publicSiteViewer(viewer: SiteRuntimeViewer): SiteViewer {
|
|
68
|
+
return {
|
|
69
|
+
kind: viewer.kind,
|
|
70
|
+
id: viewer.principal,
|
|
71
|
+
name: viewer.kind === "guest" ? null : viewer.name,
|
|
72
|
+
email: viewer.kind === "guest" ? null : viewer.email,
|
|
73
|
+
signedIn: viewer.kind !== "guest",
|
|
74
|
+
};
|
|
75
|
+
}
|