@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,107 @@
|
|
|
1
|
+
import {
|
|
2
|
+
SITE_NO_ORIGIN_ID,
|
|
3
|
+
siteFrameBodyRefusal,
|
|
4
|
+
siteFrameFromHeaders,
|
|
5
|
+
siteFrameOperation,
|
|
6
|
+
} from "@opengeni/contracts/site-session-http";
|
|
7
|
+
import {
|
|
8
|
+
requireAccessGrant,
|
|
9
|
+
siteOriginsMatch,
|
|
10
|
+
siteSessionOriginFromMetadata,
|
|
11
|
+
withSiteSessionOrigin,
|
|
12
|
+
type ApiRouteDeps,
|
|
13
|
+
} from "@opengeni/core";
|
|
14
|
+
import { getSession } from "@opengeni/db";
|
|
15
|
+
import type { Context, Next } from "hono";
|
|
16
|
+
import { HTTPException } from "hono/http-exception";
|
|
17
|
+
import { ApiHttpError } from "./http/api-error";
|
|
18
|
+
import { resolveSiteRequestOrigin } from "./site-session-origin";
|
|
19
|
+
|
|
20
|
+
/** The agent's own Codemode SDK proxy checks the proxied path itself. */
|
|
21
|
+
const CODEMODE_SDK_PROXY = /^\/v1\/workspaces\/[^/]+\/codemode\/sdk(?:\/|$)/u;
|
|
22
|
+
/** Site Data and files under a published Site: `/published-artifacts/<id>/data|files`. */
|
|
23
|
+
const SITE_DATA = /^\/v1\/workspaces\/[^/]+\/published-artifacts\/([^/]+)\/(?:data|files)(?:\/|$)/u;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Server-side boundary for requests a host forwarded from a Site frame (the
|
|
27
|
+
* console bridge, a Codemode preview). Hosts already hold Site code to the
|
|
28
|
+
* `SITE_OPERATIONS` allowlist; the API enforces it again for any request that
|
|
29
|
+
* carries the host's frame headers:
|
|
30
|
+
*
|
|
31
|
+
* - only allowlisted operations reach a handler;
|
|
32
|
+
* - Site Data only for the frame's own published Site (403, as the Site Data
|
|
33
|
+
* service's own frame clamp answers);
|
|
34
|
+
* - a session list names only the frame's own Site;
|
|
35
|
+
* - a per-session operation reaches only a session the same Site (or, for a
|
|
36
|
+
* frame without a published Site, the same mounted frame) started; anything
|
|
37
|
+
* else is the same 404 as a missing session;
|
|
38
|
+
* - a message, draft, queue or control body carries only the fields Site
|
|
39
|
+
* code may set (`siteFrameBodyRefusal`): text and how the model answers it.
|
|
40
|
+
* Approval decisions, answers to questions, resources, personal resource
|
|
41
|
+
* attachments, MCP credential updates, connection accounts and model
|
|
42
|
+
* context are refused with 403 `site_frame_field_forbidden`; the person
|
|
43
|
+
* gives those in the console. Session creates get the same treatment in
|
|
44
|
+
* the create route, which also applies the minimal Site profile;
|
|
45
|
+
* - a session operation runs inside its validated Site origin, so every
|
|
46
|
+
* session or turn it starts records which Site it came from.
|
|
47
|
+
*
|
|
48
|
+
* Ordinary handlers still authorize every allowed operation with the
|
|
49
|
+
* viewer's own authority.
|
|
50
|
+
*/
|
|
51
|
+
export function siteFrameGuard(deps: ApiRouteDeps) {
|
|
52
|
+
return async (c: Context, next: Next) => {
|
|
53
|
+
const frame = siteFrameFromHeaders((name) => c.req.header(name));
|
|
54
|
+
const pathname = new URL(c.req.url).pathname;
|
|
55
|
+
if (!frame || c.req.method === "OPTIONS" || CODEMODE_SDK_PROXY.test(pathname)) {
|
|
56
|
+
await next();
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const data = SITE_DATA.exec(pathname);
|
|
60
|
+
if (data && !frame.siteId)
|
|
61
|
+
throw new HTTPException(403, { message: "This Site host does not provide Site Data" });
|
|
62
|
+
if (data && data[1] !== frame.siteId)
|
|
63
|
+
throw new HTTPException(403, { message: "A Site can only use its own data" });
|
|
64
|
+
const workspaceId = c.req.param("workspaceId") ?? "";
|
|
65
|
+
const match = siteFrameOperation(c.req.method, pathname, workspaceId, frame.siteId);
|
|
66
|
+
if (!match) throw new HTTPException(404, { message: "Unsupported Site session API path" });
|
|
67
|
+
// Workspace, model and config reads and Site Data (whose service clamps
|
|
68
|
+
// frames itself) start or reach no session.
|
|
69
|
+
if (!match.operation.id.startsWith("sessions.")) {
|
|
70
|
+
await next();
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const grant = await requireAccessGrant(c, deps, workspaceId);
|
|
74
|
+
const origin = await resolveSiteRequestOrigin(deps.db, grant, frame);
|
|
75
|
+
if (match.operation.id === "sessions.list") {
|
|
76
|
+
const origins = new URL(c.req.url).searchParams.getAll("originSiteId");
|
|
77
|
+
if (origins.length !== 1 || origins[0] !== (origin.siteId ?? SITE_NO_ORIGIN_ID))
|
|
78
|
+
throw new HTTPException(404, { message: "Unsupported Site session API path" });
|
|
79
|
+
}
|
|
80
|
+
if (match.sessionId !== null) {
|
|
81
|
+
const session = await getSession(deps.db, grant.workspaceId, match.sessionId).catch(
|
|
82
|
+
() => null,
|
|
83
|
+
);
|
|
84
|
+
if (!session || !siteOriginsMatch(origin, siteSessionOriginFromMetadata(session.metadata)))
|
|
85
|
+
throw new HTTPException(404, { message: "session not found" });
|
|
86
|
+
}
|
|
87
|
+
if (c.req.method !== "GET" && match.operation.id !== "sessions.create") {
|
|
88
|
+
// Hono caches the parsed body, so the route reads the same JSON.
|
|
89
|
+
const body: unknown = await c.req.json().catch(() => undefined);
|
|
90
|
+
const refused = siteFrameBodyRefusal(match.operation.id, match.suffix, body);
|
|
91
|
+
if (refused) throw siteFrameFieldForbidden(refused);
|
|
92
|
+
}
|
|
93
|
+
await withSiteSessionOrigin(origin, () => next());
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/** 403 for a body field Site code may not send; names the field, never its value. */
|
|
98
|
+
export function siteFrameFieldForbidden(field: string): ApiHttpError {
|
|
99
|
+
return new ApiHttpError(403, {
|
|
100
|
+
code: "forbidden",
|
|
101
|
+
message:
|
|
102
|
+
"A Site page can send message text only. Approvals, answers, resources, credentials and connection choices happen in the console.",
|
|
103
|
+
retryable: false,
|
|
104
|
+
outcomeUnknown: false,
|
|
105
|
+
details: { code: "site_frame_field_forbidden", field },
|
|
106
|
+
});
|
|
107
|
+
}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import {
|
|
2
|
+
siteHostname,
|
|
3
|
+
type FirstPartyMcpToolName,
|
|
4
|
+
type SiteLimitProfileKind,
|
|
5
|
+
} from "@opengeni/contracts";
|
|
6
|
+
import { resolveFirstPartyMcpToolPolicy } from "@opengeni/config";
|
|
7
|
+
import type { ApiRouteDeps } from "@opengeni/core";
|
|
8
|
+
import {
|
|
9
|
+
consumeSiteRuntimeRate,
|
|
10
|
+
findSiteRuntimeAgentConversation,
|
|
11
|
+
getPublishedSite,
|
|
12
|
+
getSitePublication,
|
|
13
|
+
getSiteSqlDatabase,
|
|
14
|
+
isSiteWorkspaceMember,
|
|
15
|
+
siteRuntimeConversationViewerEmail,
|
|
16
|
+
type SiteRuntimeConversationViewerKind,
|
|
17
|
+
} from "@opengeni/db";
|
|
18
|
+
import type { PublishedSiteDataViewer } from "../site-data/service";
|
|
19
|
+
import { siteSqlOffered } from "../site-sql/gateway";
|
|
20
|
+
import { siteRuntimeLimitProfile, type SiteRuntimeHost } from "./runtime";
|
|
21
|
+
import { siteServable } from "./service";
|
|
22
|
+
import { effectiveSiteAccess, signedInSiteViewerKind, siteGuestsAllowed } from "./viewer";
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* A published Site's own data tools for its agent. Every Site agent
|
|
26
|
+
* conversation (members, invited people and public visitors) gets them,
|
|
27
|
+
* pinned on the server to that Site and acting as the conversation's viewer:
|
|
28
|
+
* the same audience checks and row binding as the Site's page (per-viewer
|
|
29
|
+
* collections, owner binding, `:viewer` and query audiences such as
|
|
30
|
+
* `signed_in` or `managers`). Site management tools (publication, migrate,
|
|
31
|
+
* define, reset, import, export, enable, files and so on) are never given.
|
|
32
|
+
*
|
|
33
|
+
* - `site_data_query`, `site_data_write`: the Site's collections under the
|
|
34
|
+
* viewer's access rules (guests only what each collection's guest rule allows).
|
|
35
|
+
* - `site_sql_run`: the Site's named queries, when Site SQL is on.
|
|
36
|
+
* - `site_sql_query`: read-only statements, for workspace members only, when
|
|
37
|
+
* Site SQL is on.
|
|
38
|
+
*/
|
|
39
|
+
export const SITE_AGENT_DATA_TOOLS = Object.freeze([
|
|
40
|
+
"site_data_query",
|
|
41
|
+
"site_data_write",
|
|
42
|
+
] as const satisfies readonly FirstPartyMcpToolName[]);
|
|
43
|
+
export const SITE_AGENT_SQL_TOOLS = Object.freeze([
|
|
44
|
+
"site_sql_run",
|
|
45
|
+
] as const satisfies readonly FirstPartyMcpToolName[]);
|
|
46
|
+
export const SITE_AGENT_MEMBER_SQL_TOOLS = Object.freeze([
|
|
47
|
+
"site_sql_query",
|
|
48
|
+
] as const satisfies readonly FirstPartyMcpToolName[]);
|
|
49
|
+
|
|
50
|
+
/** The first-party permissions those tools need (Site Data writes need publish). */
|
|
51
|
+
export const SITE_AGENT_DATA_TOOL_PERMISSIONS = Object.freeze([
|
|
52
|
+
"artifacts:read",
|
|
53
|
+
"artifacts:publish",
|
|
54
|
+
] as const);
|
|
55
|
+
|
|
56
|
+
export const SITE_AGENT_OTHER_SITE_MESSAGE = "This Site's assistant can only use this Site's data";
|
|
57
|
+
export const SITE_AGENT_MANAGEMENT_MESSAGE =
|
|
58
|
+
"This Site's assistant can use the Site's data, not manage the Site";
|
|
59
|
+
|
|
60
|
+
/** The data tools one viewer's Site agent conversation gets, within the deployment's tools. */
|
|
61
|
+
export function siteAgentDataToolNames(input: {
|
|
62
|
+
viewerKind: SiteRuntimeConversationViewerKind;
|
|
63
|
+
/** Site SQL is offered here and turned on for this Site. */
|
|
64
|
+
siteSql: boolean;
|
|
65
|
+
/** The deployment's first-party tool allowlist. */
|
|
66
|
+
allowed: readonly string[];
|
|
67
|
+
}): FirstPartyMcpToolName[] {
|
|
68
|
+
const names: FirstPartyMcpToolName[] = [
|
|
69
|
+
...SITE_AGENT_DATA_TOOLS,
|
|
70
|
+
...(input.siteSql ? SITE_AGENT_SQL_TOOLS : []),
|
|
71
|
+
...(input.siteSql && input.viewerKind === "member" ? SITE_AGENT_MEMBER_SQL_TOOLS : []),
|
|
72
|
+
];
|
|
73
|
+
return names.filter((name) => input.allowed.includes(name));
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** Whether Site SQL is offered on this deployment and turned on for the Site. */
|
|
77
|
+
export async function siteAgentSiteSqlOn(
|
|
78
|
+
deps: Pick<ApiRouteDeps, "db" | "settings">,
|
|
79
|
+
scope: { accountId: string; workspaceId: string },
|
|
80
|
+
siteId: string,
|
|
81
|
+
): Promise<boolean> {
|
|
82
|
+
if (!siteSqlOffered(deps.settings)) return false;
|
|
83
|
+
const database = await getSiteSqlDatabase(deps.db, { ...scope, siteId }).catch(() => null);
|
|
84
|
+
return database?.enabled === true;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/** The data tools for a new conversation of this viewer on this Site. */
|
|
88
|
+
export async function siteAgentDataToolsForStart(
|
|
89
|
+
deps: Pick<ApiRouteDeps, "db" | "settings">,
|
|
90
|
+
scope: { accountId: string; workspaceId: string },
|
|
91
|
+
siteId: string,
|
|
92
|
+
viewerKind: SiteRuntimeConversationViewerKind,
|
|
93
|
+
): Promise<FirstPartyMcpToolName[]> {
|
|
94
|
+
return siteAgentDataToolNames({
|
|
95
|
+
viewerKind,
|
|
96
|
+
siteSql: await siteAgentSiteSqlOn(deps, scope, siteId),
|
|
97
|
+
allowed: resolveFirstPartyMcpToolPolicy(deps.settings).allowed,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** This Site's viewer (`user:<subject>` or `guest:<visitor>`) as Site Data and Site SQL see it. */
|
|
102
|
+
export function sitePublishedDataViewer(
|
|
103
|
+
host: Pick<SiteRuntimeHost, "scope" | "site">,
|
|
104
|
+
principal: string,
|
|
105
|
+
guest: boolean,
|
|
106
|
+
): PublishedSiteDataViewer {
|
|
107
|
+
return {
|
|
108
|
+
kind: "published_viewer",
|
|
109
|
+
accountId: host.scope.accountId,
|
|
110
|
+
workspaceId: host.scope.workspaceId,
|
|
111
|
+
site: {
|
|
112
|
+
id: host.site.id,
|
|
113
|
+
title: host.site.title,
|
|
114
|
+
status: host.site.status,
|
|
115
|
+
visibility: host.site.visibility,
|
|
116
|
+
ownerSubjectId: host.site.ownerSubjectId,
|
|
117
|
+
createdBySubjectId: host.site.createdBySubjectId,
|
|
118
|
+
},
|
|
119
|
+
principal,
|
|
120
|
+
guest,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const VIEWER_WORDS: Record<SiteRuntimeConversationViewerKind, string> = {
|
|
125
|
+
member: "a member of the workspace that owns this Site",
|
|
126
|
+
invited: "a person invited to this Site from outside the workspace",
|
|
127
|
+
user: "a signed-in visitor from outside the workspace",
|
|
128
|
+
guest: "an anonymous visitor",
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* The Site agent's instructions: which Site and viewer it serves and what its
|
|
133
|
+
* data tools may do, then the owner's own instructions for the Site.
|
|
134
|
+
*/
|
|
135
|
+
export function siteAgentInstructions(
|
|
136
|
+
host: Pick<SiteRuntimeHost, "site">,
|
|
137
|
+
viewer: { kind: SiteRuntimeConversationViewerKind },
|
|
138
|
+
dataTools: readonly string[],
|
|
139
|
+
ownerInstructions: string | null | undefined,
|
|
140
|
+
): string {
|
|
141
|
+
const lines = [
|
|
142
|
+
`You are the assistant on the published Site "${host.site.title}" (Site id ${host.site.id}). You are talking with ${VIEWER_WORDS[viewer.kind]}.`,
|
|
143
|
+
dataTools.length > 0
|
|
144
|
+
? `Your tools (${dataTools.join(", ")}) work only on this Site: always pass siteId ${host.site.id}. They act as this person, so they see and change only what this person may on the page. When a tool refuses (for example sign_in_required or not_available_for_viewer), tell the person plainly what can't be done here and why.`
|
|
145
|
+
: "You have no tools: answer from the conversation.",
|
|
146
|
+
viewer.kind === "member"
|
|
147
|
+
? "As a workspace member, this person may also have workspace tools the Site gives its assistant."
|
|
148
|
+
: "This person is outside the workspace: you can only use this Site's own data for them, never workspace tools or files. If they ask for something else, say plainly that you can't do it here.",
|
|
149
|
+
"You cannot change the Site, its settings, or how its data is defined, and you have no shell or workspace files.",
|
|
150
|
+
];
|
|
151
|
+
const own = ownerInstructions?.trim();
|
|
152
|
+
return own ? `${lines.join("\n")}\n\n${own}` : lines.join("\n");
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/** A Site agent conversation's data context: the pinned Site and the viewer it acts as. */
|
|
156
|
+
export type SiteAgentDataContext = {
|
|
157
|
+
kind: "site";
|
|
158
|
+
siteId: string;
|
|
159
|
+
viewerKind: SiteRuntimeConversationViewerKind;
|
|
160
|
+
viewer: PublishedSiteDataViewer;
|
|
161
|
+
/** The limit profile kind in force (Site SQL limits follow it). */
|
|
162
|
+
profileKind: SiteLimitProfileKind;
|
|
163
|
+
/**
|
|
164
|
+
* Count one write against the guest write limit (anonymous guests only);
|
|
165
|
+
* null when allowed, else the seconds to wait.
|
|
166
|
+
*/
|
|
167
|
+
guestWrite: () => Promise<number | null>;
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
export type SiteAgentDataResolution =
|
|
171
|
+
| { kind: "ordinary" }
|
|
172
|
+
| { kind: "refused"; message: string }
|
|
173
|
+
| SiteAgentDataContext;
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Whether an agent session is a published Site's agent and, if so, the Site
|
|
177
|
+
* and viewer its data tools act for. Ordinary sessions resolve `ordinary`.
|
|
178
|
+
* A Site agent whose conversation, Site or publication cannot be confirmed,
|
|
179
|
+
* or whose member viewer has left the workspace, is refused (fail closed).
|
|
180
|
+
*/
|
|
181
|
+
export async function resolveSiteAgentDataContext(
|
|
182
|
+
deps: Pick<ApiRouteDeps, "db" | "settings" | "objectStorage">,
|
|
183
|
+
scope: { accountId: string; workspaceId: string },
|
|
184
|
+
sessionId: string,
|
|
185
|
+
): Promise<SiteAgentDataResolution> {
|
|
186
|
+
const found = await findSiteRuntimeAgentConversation(deps.db, scope, sessionId);
|
|
187
|
+
if (!found.siteAgent) return { kind: "ordinary" };
|
|
188
|
+
const refused = (message: string): SiteAgentDataResolution => ({ kind: "refused", message });
|
|
189
|
+
const conversation = found.conversation;
|
|
190
|
+
if (!conversation) return refused("This Site's assistant could not confirm its conversation");
|
|
191
|
+
const [publication, site] = await Promise.all([
|
|
192
|
+
getSitePublication(deps.db, scope, conversation.siteId),
|
|
193
|
+
getPublishedSite(deps.db, scope, conversation.siteId),
|
|
194
|
+
]);
|
|
195
|
+
if (!publication || !site || publication.status !== "active" || !siteServable(site))
|
|
196
|
+
return refused("This Site is not available");
|
|
197
|
+
const subjectId = conversation.viewerPrincipal.startsWith("user:")
|
|
198
|
+
? conversation.viewerPrincipal.slice("user:".length)
|
|
199
|
+
: null;
|
|
200
|
+
if (
|
|
201
|
+
conversation.viewerKind === "member" &&
|
|
202
|
+
(!subjectId || !(await isSiteWorkspaceMember(deps.db, scope, subjectId)))
|
|
203
|
+
)
|
|
204
|
+
return refused("This conversation's viewer is no longer a workspace member");
|
|
205
|
+
// Cancellation is only a convenience. Recheck the current audience for every
|
|
206
|
+
// tool call, using the verified identity retained on the server at start.
|
|
207
|
+
if (conversation.viewerKind === "guest") {
|
|
208
|
+
if (!siteGuestsAllowed(publication.access, deps.settings))
|
|
209
|
+
return refused("This conversation's viewer no longer has access to this Site");
|
|
210
|
+
} else if (conversation.viewerKind !== "member") {
|
|
211
|
+
const kind =
|
|
212
|
+
subjectId &&
|
|
213
|
+
signedInSiteViewerKind({
|
|
214
|
+
access: effectiveSiteAccess(publication.access, deps.settings),
|
|
215
|
+
member: false,
|
|
216
|
+
email: await siteRuntimeConversationViewerEmail(deps.db, scope, conversation.sessionId),
|
|
217
|
+
invitedEmails: publication.invitedEmails,
|
|
218
|
+
});
|
|
219
|
+
if (!kind) return refused("This conversation's viewer no longer has access to this Site");
|
|
220
|
+
}
|
|
221
|
+
const domain = deps.settings.sitesDomain ?? "";
|
|
222
|
+
const host: SiteRuntimeHost = {
|
|
223
|
+
domain,
|
|
224
|
+
label: publication.label,
|
|
225
|
+
hostname: domain ? siteHostname(publication.label, domain) : publication.label,
|
|
226
|
+
scope,
|
|
227
|
+
publication,
|
|
228
|
+
site,
|
|
229
|
+
};
|
|
230
|
+
const guest = conversation.viewerKind === "guest";
|
|
231
|
+
const profile = await siteRuntimeLimitProfile(deps, host, { kind: conversation.viewerKind });
|
|
232
|
+
return {
|
|
233
|
+
kind: "site",
|
|
234
|
+
siteId: conversation.siteId,
|
|
235
|
+
viewerKind: conversation.viewerKind,
|
|
236
|
+
viewer: sitePublishedDataViewer(host, conversation.viewerPrincipal, guest),
|
|
237
|
+
profileKind: profile.kind,
|
|
238
|
+
guestWrite: async () => {
|
|
239
|
+
const limit = profile.limits.guestWritesPerMinute;
|
|
240
|
+
if (!guest || limit === null) return null;
|
|
241
|
+
const rate = await consumeSiteRuntimeRate(deps.db, scope, {
|
|
242
|
+
siteId: conversation.siteId,
|
|
243
|
+
principal: conversation.viewerPrincipal,
|
|
244
|
+
bucket: "guest_writes",
|
|
245
|
+
limit,
|
|
246
|
+
});
|
|
247
|
+
return rate.allowed ? null : Math.max(1, rate.retryAfterSeconds);
|
|
248
|
+
},
|
|
249
|
+
};
|
|
250
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import type { Settings } from "@opengeni/config";
|
|
2
|
+
import {
|
|
3
|
+
resolveWorkspaceSessionDefaults,
|
|
4
|
+
type OrganizationModelDefaults,
|
|
5
|
+
type WorkspaceSessionDefaults,
|
|
6
|
+
} from "@opengeni/contracts";
|
|
7
|
+
import {
|
|
8
|
+
admissibleWorkspaceModel,
|
|
9
|
+
loadWorkspaceModelSelectionInput,
|
|
10
|
+
resolveWorkspaceModelSelection,
|
|
11
|
+
selectDefaultSessionModel,
|
|
12
|
+
type WorkspaceModelSelection,
|
|
13
|
+
} from "@opengeni/core";
|
|
14
|
+
import { getOrganizationModelDefaults, getWorkspace, type Database } from "@opengeni/db";
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* The model of a Site agent conversation by who the viewer is.
|
|
18
|
+
*
|
|
19
|
+
* People outside the workspace (invited people and public visitors) never
|
|
20
|
+
* use a subscription-billed model (a connected Codex, Claude or other
|
|
21
|
+
* subscription): Site limits measure real money, and visitors must not use
|
|
22
|
+
* up a subscription's rate limits or terms. When the Site agent's model is a
|
|
23
|
+
* subscription model (or the workspace default it falls back to is one),
|
|
24
|
+
* they get the workspace's default credit-billed model instead, chosen the
|
|
25
|
+
* same way as the workspace's ordinary default over the credit-billed models
|
|
26
|
+
* only. When the workspace has none, they are refused. Workspace members use
|
|
27
|
+
* the Site agent's model, subscriptions included.
|
|
28
|
+
*/
|
|
29
|
+
export type SiteOutsideModelChoice =
|
|
30
|
+
/** The Site agent's model (or the workspace default it resolves to), not a subscription. */
|
|
31
|
+
{ kind: "same"; model: string } | { kind: "fallback"; model: string } | { kind: "unavailable" };
|
|
32
|
+
|
|
33
|
+
/** Whether a model is billed through a subscription rather than credits. */
|
|
34
|
+
export function isSubscriptionBilledModel(
|
|
35
|
+
selections: readonly WorkspaceModelSelection[],
|
|
36
|
+
model: string,
|
|
37
|
+
): boolean {
|
|
38
|
+
const selection = selections.find((candidate) => candidate.model.id === model);
|
|
39
|
+
if (selection) return selection.model.cost === "subscription";
|
|
40
|
+
return (
|
|
41
|
+
model.startsWith("codex/") ||
|
|
42
|
+
model.startsWith("supergrok/") ||
|
|
43
|
+
/(^|-)(claude-)?subscription\//u.test(model)
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** The decision for people outside the workspace, from already-loaded selections. */
|
|
48
|
+
export function siteOutsideModelChoice(input: {
|
|
49
|
+
settings: Settings;
|
|
50
|
+
selections: readonly WorkspaceModelSelection[];
|
|
51
|
+
/** The Site agent's model; null uses the workspace default. */
|
|
52
|
+
agentModel: string | null;
|
|
53
|
+
workspaceDefaults: WorkspaceSessionDefaults | null;
|
|
54
|
+
organizationDefaults: OrganizationModelDefaults["sessionDefaults"] | null;
|
|
55
|
+
}): SiteOutsideModelChoice {
|
|
56
|
+
const base = {
|
|
57
|
+
settings: input.settings,
|
|
58
|
+
workspaceDefaults: input.workspaceDefaults,
|
|
59
|
+
organizationDefaults: input.organizationDefaults,
|
|
60
|
+
};
|
|
61
|
+
const chosen =
|
|
62
|
+
input.agentModel ??
|
|
63
|
+
selectDefaultSessionModel({ ...base, selections: input.selections, creditsAvailable: true })
|
|
64
|
+
.model;
|
|
65
|
+
// Always the concrete model: a session created without one would take the
|
|
66
|
+
// workspace's ordinary default, which may be a subscription.
|
|
67
|
+
// The fallback is paid with credits, as the publish dialog says.
|
|
68
|
+
const credited = input.selections.filter((selection) => selection.model.cost === "credits");
|
|
69
|
+
if (
|
|
70
|
+
admissibleWorkspaceModel(credited, chosen) &&
|
|
71
|
+
!isSubscriptionBilledModel(input.selections, chosen)
|
|
72
|
+
)
|
|
73
|
+
return { kind: "same", model: chosen };
|
|
74
|
+
const fallback = selectDefaultSessionModel({
|
|
75
|
+
...base,
|
|
76
|
+
selections: credited,
|
|
77
|
+
creditsAvailable: true,
|
|
78
|
+
}).model;
|
|
79
|
+
return admissibleWorkspaceModel(credited, fallback) &&
|
|
80
|
+
!isSubscriptionBilledModel(input.selections, fallback)
|
|
81
|
+
? { kind: "fallback", model: fallback }
|
|
82
|
+
: { kind: "unavailable" };
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** Actual catalog billing, not just provider-name heuristics, fences every admission. */
|
|
86
|
+
export async function siteCreditModelIds(
|
|
87
|
+
deps: { db: Database; settings: Settings },
|
|
88
|
+
scope: { accountId: string; workspaceId: string },
|
|
89
|
+
siteId: string,
|
|
90
|
+
): Promise<string[]> {
|
|
91
|
+
const input = await loadWorkspaceModelSelectionInput(deps.db, deps.settings, {
|
|
92
|
+
...scope,
|
|
93
|
+
subjectId: `site:${siteId}`,
|
|
94
|
+
});
|
|
95
|
+
return resolveWorkspaceModelSelection(input)
|
|
96
|
+
.filter(
|
|
97
|
+
(selection) =>
|
|
98
|
+
selection.model.cost === "credits" &&
|
|
99
|
+
admissibleWorkspaceModel([selection], selection.model.id),
|
|
100
|
+
)
|
|
101
|
+
.map((selection) => selection.model.id);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/** Load the workspace's model selection and decide for people outside the workspace. */
|
|
105
|
+
export async function resolveSiteOutsideModel(
|
|
106
|
+
deps: { db: Database; settings: Settings },
|
|
107
|
+
scope: { accountId: string; workspaceId: string },
|
|
108
|
+
input: { siteId: string; agentModel: string | null },
|
|
109
|
+
): Promise<SiteOutsideModelChoice> {
|
|
110
|
+
const [selectionInput, workspace, organization] = await Promise.all([
|
|
111
|
+
loadWorkspaceModelSelectionInput(deps.db, deps.settings, {
|
|
112
|
+
accountId: scope.accountId,
|
|
113
|
+
workspaceId: scope.workspaceId,
|
|
114
|
+
// The Site's own principal: it holds no personal subscription authority.
|
|
115
|
+
subjectId: `site:${input.siteId}`,
|
|
116
|
+
}),
|
|
117
|
+
getWorkspace(deps.db, scope.workspaceId),
|
|
118
|
+
getOrganizationModelDefaults(deps.db, scope.accountId),
|
|
119
|
+
]);
|
|
120
|
+
return siteOutsideModelChoice({
|
|
121
|
+
settings: deps.settings,
|
|
122
|
+
selections: resolveWorkspaceModelSelection(selectionInput),
|
|
123
|
+
agentModel: input.agentModel,
|
|
124
|
+
workspaceDefaults: resolveWorkspaceSessionDefaults(workspace?.settings ?? {}),
|
|
125
|
+
organizationDefaults: organization.sessionDefaults ?? null,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { resolveAgentConfig, type SessionToolPolicy, type ToolRef } from "@opengeni/contracts";
|
|
2
|
+
import { agentConfigDeploymentPolicy, resolveFirstPartyMcpToolPolicy } from "@opengeni/config";
|
|
3
|
+
import { siteSessionOriginFromMetadata, type ApiRouteDeps } from "@opengeni/core";
|
|
4
|
+
import { appendSessionEventsWithLockedSessionUpdate, getSiteSqlDatabase } from "@opengeni/db";
|
|
5
|
+
import { publishDurableSessionEvents } from "@opengeni/events";
|
|
6
|
+
import {
|
|
7
|
+
resolveSiteAgentDataContext,
|
|
8
|
+
SITE_AGENT_DATA_TOOL_PERMISSIONS,
|
|
9
|
+
siteAgentDataToolNames,
|
|
10
|
+
siteAgentInstructions,
|
|
11
|
+
} from "./agent-data-tools";
|
|
12
|
+
import type { SiteRuntimeHost } from "./runtime";
|
|
13
|
+
import type { SiteRuntimeViewer } from "./viewer";
|
|
14
|
+
import { sitePublishingError } from "./service";
|
|
15
|
+
import { siteSqlOffered } from "../site-sql/gateway";
|
|
16
|
+
|
|
17
|
+
export const SITE_AGENT_DEFAULTS_VERSION = 1;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Before admitting more work, converge pre-redesign published-host sessions to
|
|
21
|
+
* the same Site-local tools as a new conversation. This is a trusted host
|
|
22
|
+
* upgrade, not a caller-controlled tool-policy edit. The route has already
|
|
23
|
+
* checked ownership, current audience, models and the retained connector set;
|
|
24
|
+
* each data-tool execution still resolves the live viewer independently.
|
|
25
|
+
*
|
|
26
|
+
* The session writer lock makes the config, permissions, sandbox, instructions,
|
|
27
|
+
* audit event and completion marker atomic. Failed writes remain retryable.
|
|
28
|
+
* Existing attempts keep their accepted execution policy; no turn is rewritten.
|
|
29
|
+
*/
|
|
30
|
+
export async function normalizeSiteAgentSession(
|
|
31
|
+
deps: Pick<ApiRouteDeps, "db" | "settings" | "bus" | "objectStorage">,
|
|
32
|
+
host: SiteRuntimeHost,
|
|
33
|
+
viewer: SiteRuntimeViewer,
|
|
34
|
+
sessionId: string,
|
|
35
|
+
retainedToolIds: readonly string[],
|
|
36
|
+
): Promise<void> {
|
|
37
|
+
const data = await resolveSiteAgentDataContext(deps, host.scope, sessionId);
|
|
38
|
+
if (
|
|
39
|
+
data.kind !== "site" ||
|
|
40
|
+
data.siteId !== host.site.id ||
|
|
41
|
+
data.viewer.principal !== viewer.principal
|
|
42
|
+
)
|
|
43
|
+
throw sitePublishingError(
|
|
44
|
+
403,
|
|
45
|
+
"forbidden",
|
|
46
|
+
"site_conversation_unavailable",
|
|
47
|
+
"This conversation is not available",
|
|
48
|
+
);
|
|
49
|
+
// Do not turn a transient SQL-metadata read failure into a permanently
|
|
50
|
+
// completed upgrade missing SQL tools. No marker commits on a failed read.
|
|
51
|
+
const sqlEnabled = siteSqlOffered(deps.settings)
|
|
52
|
+
? (await getSiteSqlDatabase(deps.db, { ...host.scope, siteId: host.site.id }))?.enabled === true
|
|
53
|
+
: false;
|
|
54
|
+
const dataTools = siteAgentDataToolNames({
|
|
55
|
+
viewerKind: viewer.kind,
|
|
56
|
+
siteSql: sqlEnabled,
|
|
57
|
+
allowed: resolveFirstPartyMcpToolPolicy(deps.settings).allowed,
|
|
58
|
+
});
|
|
59
|
+
const config = resolveAgentConfig({
|
|
60
|
+
creator: "api",
|
|
61
|
+
request: {
|
|
62
|
+
capabilities: {
|
|
63
|
+
from: "none",
|
|
64
|
+
humanInput: false,
|
|
65
|
+
skills: false,
|
|
66
|
+
...(dataTools.length ? { artifacts: true } : {}),
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
workspace: { defaults: null, humanInputEnabled: false },
|
|
70
|
+
deployment: agentConfigDeploymentPolicy(deps.settings),
|
|
71
|
+
goal: false,
|
|
72
|
+
}).config;
|
|
73
|
+
const instructions = siteAgentInstructions(
|
|
74
|
+
host,
|
|
75
|
+
viewer,
|
|
76
|
+
dataTools,
|
|
77
|
+
host.publication.agent.instructions,
|
|
78
|
+
);
|
|
79
|
+
const events = await appendSessionEventsWithLockedSessionUpdate(
|
|
80
|
+
deps.db,
|
|
81
|
+
host.scope.workspaceId,
|
|
82
|
+
sessionId,
|
|
83
|
+
(session) => {
|
|
84
|
+
if (
|
|
85
|
+
session.parentSessionId ||
|
|
86
|
+
session.createdBy.subjectId !== `site:${host.site.id}` ||
|
|
87
|
+
siteSessionOriginFromMetadata(session.metadata)?.siteId !== host.site.id
|
|
88
|
+
)
|
|
89
|
+
throw sitePublishingError(
|
|
90
|
+
403,
|
|
91
|
+
"forbidden",
|
|
92
|
+
"site_conversation_unavailable",
|
|
93
|
+
"This conversation is not available",
|
|
94
|
+
);
|
|
95
|
+
const raw = session.metadata.opengeniPublishedSite;
|
|
96
|
+
const stamp =
|
|
97
|
+
raw && typeof raw === "object" && !Array.isArray(raw)
|
|
98
|
+
? (raw as Record<string, unknown>)
|
|
99
|
+
: {};
|
|
100
|
+
if (stamp.agentDefaultsVersion === SITE_AGENT_DEFAULTS_VERSION) return { events: [] };
|
|
101
|
+
// Never restore workspace defaults or add a newly declared connector to
|
|
102
|
+
// an old conversation. Preserve only its still-authorized exact refs.
|
|
103
|
+
const allowed = new Set(["opengeni", ...retainedToolIds]);
|
|
104
|
+
const tools: ToolRef[] = session.tools.filter((tool) => allowed.has(tool.id));
|
|
105
|
+
const toolPolicy: SessionToolPolicy = {
|
|
106
|
+
mode: "explicit",
|
|
107
|
+
firstPartyMode: "explicit",
|
|
108
|
+
inheritedFromSessionId: null,
|
|
109
|
+
};
|
|
110
|
+
const version = session.toolPolicyVersion + 1;
|
|
111
|
+
return {
|
|
112
|
+
events: [
|
|
113
|
+
{
|
|
114
|
+
type: "session.agent.updated",
|
|
115
|
+
payload: {
|
|
116
|
+
before: session.agent,
|
|
117
|
+
after: config,
|
|
118
|
+
instructionsChanged: session.instructions !== instructions,
|
|
119
|
+
version,
|
|
120
|
+
effectiveFrom: "next_attempt",
|
|
121
|
+
reason: "site_agent_defaults",
|
|
122
|
+
firstPartyMcpTools: dataTools,
|
|
123
|
+
sandboxBackend: "none",
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
],
|
|
127
|
+
update: {
|
|
128
|
+
firstPartyMcpTools: dataTools,
|
|
129
|
+
firstPartyMcpPermissions: [...SITE_AGENT_DATA_TOOL_PERMISSIONS],
|
|
130
|
+
agentConfig: config,
|
|
131
|
+
instructions,
|
|
132
|
+
tools,
|
|
133
|
+
toolPolicy,
|
|
134
|
+
sandboxBackend: "none",
|
|
135
|
+
toolPolicyVersion: version,
|
|
136
|
+
expectedToolPolicyVersion: session.toolPolicyVersion,
|
|
137
|
+
metadata: {
|
|
138
|
+
...session.metadata,
|
|
139
|
+
opengeniPublishedSite: { ...stamp, agentDefaultsVersion: SITE_AGENT_DEFAULTS_VERSION },
|
|
140
|
+
},
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
},
|
|
144
|
+
{ activity: "semantic" },
|
|
145
|
+
);
|
|
146
|
+
if (events.length)
|
|
147
|
+
await publishDurableSessionEvents(deps.bus, host.scope.workspaceId, sessionId, events);
|
|
148
|
+
}
|