@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,271 @@
|
|
|
1
|
+
import {
|
|
2
|
+
GrantSessionAdminAccessRequest,
|
|
3
|
+
OrganizationAgentAdminAccess,
|
|
4
|
+
SessionAdminAccess,
|
|
5
|
+
UpdateOrganizationAgentAdminAccessRequest,
|
|
6
|
+
type SessionAuthorizationOperation,
|
|
7
|
+
} from "@opengeni/contracts";
|
|
8
|
+
import {
|
|
9
|
+
requireAccessGrant,
|
|
10
|
+
requireSessionAuthorization,
|
|
11
|
+
SessionAuthorizationDeniedError,
|
|
12
|
+
SessionAuthorizationUnavailableError,
|
|
13
|
+
siteSessionClamp,
|
|
14
|
+
withResolvedSessionAuthorization,
|
|
15
|
+
type ApiRouteDeps,
|
|
16
|
+
} from "@opengeni/core";
|
|
17
|
+
import {
|
|
18
|
+
getManagedUserProfilesByIds,
|
|
19
|
+
getOrganizationAgentAdminAccess,
|
|
20
|
+
getSessionAdminAccessView,
|
|
21
|
+
grantSessionAdminAccess,
|
|
22
|
+
nestedPostgresSqlState,
|
|
23
|
+
revokeSessionAdminAccess,
|
|
24
|
+
SessionAdminAccessNotAllowedError,
|
|
25
|
+
SessionAdminAccessNotOwnSessionError,
|
|
26
|
+
setOrganizationAgentAdminAccess,
|
|
27
|
+
} from "@opengeni/db";
|
|
28
|
+
import type { Context, Hono } from "hono";
|
|
29
|
+
import { HTTPException } from "hono/http-exception";
|
|
30
|
+
import { z } from "zod";
|
|
31
|
+
|
|
32
|
+
import {
|
|
33
|
+
isAgentActingAsPerson,
|
|
34
|
+
isAgentWithFullAccess,
|
|
35
|
+
requireFullAccessIfAgent,
|
|
36
|
+
} from "../http/acting-person";
|
|
37
|
+
import { requireOrganizationCodexHuman, requireSameOriginBrowserMutation } from "./codex";
|
|
38
|
+
|
|
39
|
+
/* ----------------------------------------------------------------------------
|
|
40
|
+
Admin access for agent sessions.
|
|
41
|
+
|
|
42
|
+
An organization allows it (off by default). An owner or admin then gives
|
|
43
|
+
one of their own sessions admin access for an hour by default, a number of
|
|
44
|
+
hours they choose, or with no time limit: the agent there gets the
|
|
45
|
+
organization's actions and runs them as that person, with what they can
|
|
46
|
+
manage right now. It ends by itself when the time is up. Turning the
|
|
47
|
+
organization setting off ends every session's admin access. An agent with
|
|
48
|
+
the person's full access (such as one with admin access) can do all of
|
|
49
|
+
this as them; an agent with less can read the state and end access, never
|
|
50
|
+
start it.
|
|
51
|
+
-------------------------------------------------------------------------- */
|
|
52
|
+
|
|
53
|
+
const OrganizationId = z.string().uuid();
|
|
54
|
+
|
|
55
|
+
function parseOrganizationId(value: string | undefined): string {
|
|
56
|
+
const parsed = OrganizationId.safeParse(value);
|
|
57
|
+
if (!parsed.success) throw new HTTPException(404, { message: "organization not found" });
|
|
58
|
+
return parsed.data;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function administratorsOnly(error: unknown): never {
|
|
62
|
+
if (nestedPostgresSqlState(error) === "42501") {
|
|
63
|
+
throw new HTTPException(403, {
|
|
64
|
+
message: "Only organization owners and admins can manage admin access for sessions",
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
throw error;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
async function authorizeSession(
|
|
71
|
+
c: Context,
|
|
72
|
+
deps: ApiRouteDeps,
|
|
73
|
+
operation: SessionAuthorizationOperation,
|
|
74
|
+
) {
|
|
75
|
+
const workspaceId = c.req.param("workspaceId")!;
|
|
76
|
+
const sessionId = c.req.param("sessionId")!;
|
|
77
|
+
if (!z.string().uuid().safeParse(sessionId).success) {
|
|
78
|
+
throw new HTTPException(404, { message: "Session not found" });
|
|
79
|
+
}
|
|
80
|
+
const grant = await requireAccessGrant(
|
|
81
|
+
c,
|
|
82
|
+
deps,
|
|
83
|
+
workspaceId,
|
|
84
|
+
operation === "session.read" ? "sessions:read" : "sessions:control",
|
|
85
|
+
);
|
|
86
|
+
try {
|
|
87
|
+
const authorization = await requireSessionAuthorization(deps, grant, {
|
|
88
|
+
sessionId,
|
|
89
|
+
operation,
|
|
90
|
+
surface: "http",
|
|
91
|
+
});
|
|
92
|
+
return { grant, workspaceId, sessionId, authorization };
|
|
93
|
+
} catch (error) {
|
|
94
|
+
if (error instanceof SessionAuthorizationDeniedError) {
|
|
95
|
+
throw new HTTPException(404, { message: "Session not found" });
|
|
96
|
+
}
|
|
97
|
+
if (error instanceof SessionAuthorizationUnavailableError) {
|
|
98
|
+
throw new HTTPException(503, { message: "session authorization is unavailable" });
|
|
99
|
+
}
|
|
100
|
+
throw error;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
async function personName(deps: ApiRouteDeps, subjectId: string): Promise<string | null> {
|
|
105
|
+
if (!subjectId.startsWith("user:")) return null;
|
|
106
|
+
const [profile] = await getManagedUserProfilesByIds(deps.db, [subjectId.slice("user:".length)]);
|
|
107
|
+
return profile?.name?.trim() || profile?.email || null;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export function registerSessionAdminAccessRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
111
|
+
const organizationPath = "/v1/organizations/:organizationId/agent-admin-access";
|
|
112
|
+
|
|
113
|
+
app.get(organizationPath, async (c) => {
|
|
114
|
+
c.header("cache-control", "private, no-store");
|
|
115
|
+
const organizationId = parseOrganizationId(c.req.param("organizationId"));
|
|
116
|
+
await requireOrganizationCodexHuman(c, deps, organizationId);
|
|
117
|
+
return c.json(
|
|
118
|
+
OrganizationAgentAdminAccess.parse(
|
|
119
|
+
await getOrganizationAgentAdminAccess(deps.db, organizationId),
|
|
120
|
+
),
|
|
121
|
+
);
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
app.patch(organizationPath, async (c) => {
|
|
125
|
+
requireFullAccessIfAgent(c, "Allowing admin access for sessions");
|
|
126
|
+
requireSameOriginBrowserMutation(c, deps);
|
|
127
|
+
const organizationId = parseOrganizationId(c.req.param("organizationId"));
|
|
128
|
+
const human = await requireOrganizationCodexHuman(c, deps, organizationId);
|
|
129
|
+
const parsed = UpdateOrganizationAgentAdminAccessRequest.safeParse(
|
|
130
|
+
await c.req.json().catch(() => null),
|
|
131
|
+
);
|
|
132
|
+
if (!parsed.success) throw new HTTPException(422, { message: "invalid admin access setting" });
|
|
133
|
+
try {
|
|
134
|
+
return c.json(
|
|
135
|
+
OrganizationAgentAdminAccess.parse(
|
|
136
|
+
await setOrganizationAgentAdminAccess(deps.db, {
|
|
137
|
+
organizationId,
|
|
138
|
+
actorSubjectId: human.subjectId,
|
|
139
|
+
sessionAdminAccessAllowed: parsed.data.sessionAdminAccessAllowed,
|
|
140
|
+
}),
|
|
141
|
+
),
|
|
142
|
+
);
|
|
143
|
+
} catch (error) {
|
|
144
|
+
administratorsOnly(error);
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
const sessionPath = "/v1/workspaces/:workspaceId/sessions/:sessionId/admin-access";
|
|
149
|
+
|
|
150
|
+
const view = async (
|
|
151
|
+
c: Context,
|
|
152
|
+
target: Awaited<ReturnType<typeof authorizeSession>>,
|
|
153
|
+
): Promise<SessionAdminAccess> => {
|
|
154
|
+
const read = () =>
|
|
155
|
+
getSessionAdminAccessView(deps.db, {
|
|
156
|
+
accountId: target.grant.accountId,
|
|
157
|
+
workspaceId: target.workspaceId,
|
|
158
|
+
sessionId: target.sessionId,
|
|
159
|
+
viewerSubjectId: target.grant.subjectId,
|
|
160
|
+
});
|
|
161
|
+
const state = target.authorization
|
|
162
|
+
? await withResolvedSessionAuthorization(target.authorization, read)
|
|
163
|
+
: await read();
|
|
164
|
+
const asThePerson =
|
|
165
|
+
(!isAgentActingAsPerson(c) || isAgentWithFullAccess(c)) &&
|
|
166
|
+
(target.grant.principalKind === undefined || target.grant.principalKind === "human_session");
|
|
167
|
+
const grantedBy = state.grant
|
|
168
|
+
? {
|
|
169
|
+
subjectId: state.grant.grantedBySubjectId,
|
|
170
|
+
name: await personName(deps, state.grant.grantedBySubjectId),
|
|
171
|
+
}
|
|
172
|
+
: null;
|
|
173
|
+
return SessionAdminAccess.parse({
|
|
174
|
+
active: state.active,
|
|
175
|
+
grantedBy: state.active ? grantedBy : null,
|
|
176
|
+
grantedAt: state.active ? (state.grant?.grantedAt ?? null) : null,
|
|
177
|
+
expiresAt: state.active ? (state.grant?.expiresAt ?? null) : null,
|
|
178
|
+
allowed: state.allowed,
|
|
179
|
+
canGrant:
|
|
180
|
+
state.allowed && asThePerson && state.viewerIsAdministrator && state.viewerStartedSession,
|
|
181
|
+
canRevoke:
|
|
182
|
+
state.grant !== null &&
|
|
183
|
+
(state.grant.grantedBySubjectId === target.grant.subjectId || state.viewerIsAdministrator),
|
|
184
|
+
});
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
app.get(sessionPath, async (c) => {
|
|
188
|
+
c.header("cache-control", "private, no-store");
|
|
189
|
+
const target = await authorizeSession(c, deps, "session.read");
|
|
190
|
+
return c.json(await view(c, target));
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
app.put(sessionPath, async (c) => {
|
|
194
|
+
requireFullAccessIfAgent(c, "Giving a session admin access");
|
|
195
|
+
requireSameOriginBrowserMutation(c, deps);
|
|
196
|
+
const target = await authorizeSession(c, deps, "session.tool_policy.write");
|
|
197
|
+
const human = await requireOrganizationCodexHuman(c, deps, target.grant.accountId);
|
|
198
|
+
if (human.subjectId !== target.grant.subjectId) {
|
|
199
|
+
throw new HTTPException(403, { message: "Give admin access as yourself" });
|
|
200
|
+
}
|
|
201
|
+
// No body (older clients) means the default: one hour.
|
|
202
|
+
const raw = (await c.req.text().catch(() => "")).trim();
|
|
203
|
+
let input: unknown = null;
|
|
204
|
+
try {
|
|
205
|
+
input = raw ? JSON.parse(raw) : {};
|
|
206
|
+
} catch {
|
|
207
|
+
input = null;
|
|
208
|
+
}
|
|
209
|
+
const body = GrantSessionAdminAccessRequest.safeParse(input);
|
|
210
|
+
if (!body.success) {
|
|
211
|
+
throw new HTTPException(422, {
|
|
212
|
+
message:
|
|
213
|
+
"durationHours must be a whole number of hours from 1 to 720, or null for no time limit",
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
// A session a Site page started acts with that page's reach: admin
|
|
217
|
+
// access would let it act as the person across the organization.
|
|
218
|
+
const clamp = await siteSessionClamp(
|
|
219
|
+
deps.db,
|
|
220
|
+
{ accountId: target.grant.accountId, workspaceId: target.workspaceId },
|
|
221
|
+
target.sessionId,
|
|
222
|
+
null,
|
|
223
|
+
);
|
|
224
|
+
if (clamp.clamped)
|
|
225
|
+
throw new HTTPException(409, {
|
|
226
|
+
message: "A session started from a Site page cannot get admin access",
|
|
227
|
+
});
|
|
228
|
+
const grant = () =>
|
|
229
|
+
grantSessionAdminAccess(deps.db, {
|
|
230
|
+
organizationId: target.grant.accountId,
|
|
231
|
+
workspaceId: target.workspaceId,
|
|
232
|
+
sessionId: target.sessionId,
|
|
233
|
+
actorSubjectId: human.subjectId,
|
|
234
|
+
durationHours: body.data.durationHours,
|
|
235
|
+
});
|
|
236
|
+
try {
|
|
237
|
+
if (target.authorization) await withResolvedSessionAuthorization(target.authorization, grant);
|
|
238
|
+
else await grant();
|
|
239
|
+
} catch (error) {
|
|
240
|
+
if (error instanceof SessionAdminAccessNotAllowedError) {
|
|
241
|
+
throw new HTTPException(409, { message: error.message });
|
|
242
|
+
}
|
|
243
|
+
if (error instanceof SessionAdminAccessNotOwnSessionError) {
|
|
244
|
+
throw new HTTPException(403, { message: error.message });
|
|
245
|
+
}
|
|
246
|
+
administratorsOnly(error);
|
|
247
|
+
}
|
|
248
|
+
return c.json(await view(c, target));
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
app.delete(sessionPath, async (c) => {
|
|
252
|
+
const target = await authorizeSession(c, deps, "session.tool_policy.write");
|
|
253
|
+
const current = await view(c, target);
|
|
254
|
+
if (current.canRevoke) {
|
|
255
|
+
const revoke = () =>
|
|
256
|
+
revokeSessionAdminAccess(deps.db, {
|
|
257
|
+
accountId: target.grant.accountId,
|
|
258
|
+
workspaceId: target.workspaceId,
|
|
259
|
+
sessionId: target.sessionId,
|
|
260
|
+
});
|
|
261
|
+
if (target.authorization)
|
|
262
|
+
await withResolvedSessionAuthorization(target.authorization, revoke);
|
|
263
|
+
else await revoke();
|
|
264
|
+
} else if (current.active) {
|
|
265
|
+
throw new HTTPException(403, {
|
|
266
|
+
message: "Only the person who gave admin access, or an owner or admin, can end it",
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
return c.json(await view(c, target));
|
|
270
|
+
});
|
|
271
|
+
}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import {
|
|
2
|
+
fileOwnerContextForAccess,
|
|
3
|
+
requireAccessGrantAuthorization,
|
|
4
|
+
requirePermission,
|
|
5
|
+
requireSessionAuthorization,
|
|
6
|
+
SessionAuthorizationDeniedError,
|
|
7
|
+
SessionAuthorizationUnavailableError,
|
|
8
|
+
type ApiRouteDeps,
|
|
9
|
+
siteViewerForGrant,
|
|
10
|
+
} from "@opengeni/core";
|
|
11
|
+
import {
|
|
12
|
+
getGeneratedImageArtifact,
|
|
13
|
+
getGeneratedVideoArtifact,
|
|
14
|
+
getRetainedFileArtifact,
|
|
15
|
+
hasEditableArtifactSessionLink,
|
|
16
|
+
hasWorkspaceArtifactSessionLink,
|
|
17
|
+
listArtifactCatalogCandidates,
|
|
18
|
+
transactionallyAuthorizeEditableArtifactActor,
|
|
19
|
+
withRlsContext,
|
|
20
|
+
withSessionRlsActorContext,
|
|
21
|
+
} from "@opengeni/db";
|
|
22
|
+
import type { Hono } from "hono";
|
|
23
|
+
import { HTTPException } from "hono/http-exception";
|
|
24
|
+
import { z } from "zod";
|
|
25
|
+
import { withAccessGrantSessionRlsContext } from "../access-grant-rls";
|
|
26
|
+
import { editableArtifactActorForGrant } from "./editable-artifacts";
|
|
27
|
+
|
|
28
|
+
const SessionId = z.string().uuid();
|
|
29
|
+
const EditableArtifactId = z.string().regex(/^(?!0{32}$)[0-9a-f]{32}$/u);
|
|
30
|
+
|
|
31
|
+
/** Exact authorized membership proof, not a paginated artifact discovery API. */
|
|
32
|
+
export function registerSessionArtifactAssociationRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
33
|
+
app.get(
|
|
34
|
+
"/v1/workspaces/:workspaceId/sessions/:sessionId/artifact-associations/:artifactId",
|
|
35
|
+
async (context) => {
|
|
36
|
+
const workspaceId = context.req.param("workspaceId");
|
|
37
|
+
const sessionId = context.req.param("sessionId");
|
|
38
|
+
const artifactId = context.req.param("artifactId");
|
|
39
|
+
const requestedKind = context.req.query("kind");
|
|
40
|
+
// A UUID names a Site unless the caller asks for a retained artifact
|
|
41
|
+
// (generated image or video, or a published sandbox file) explicitly.
|
|
42
|
+
const kind = EditableArtifactId.safeParse(artifactId).success
|
|
43
|
+
? "editable"
|
|
44
|
+
: SessionId.safeParse(artifactId).success
|
|
45
|
+
? requestedKind === "retained"
|
|
46
|
+
? "retained"
|
|
47
|
+
: "site"
|
|
48
|
+
: null;
|
|
49
|
+
const authorization = await requireAccessGrantAuthorization(
|
|
50
|
+
context,
|
|
51
|
+
deps,
|
|
52
|
+
workspaceId,
|
|
53
|
+
kind === "retained" ? "files:read" : "artifacts:read",
|
|
54
|
+
);
|
|
55
|
+
const grant = authorization.grant;
|
|
56
|
+
requirePermission(grant, "sessions:read");
|
|
57
|
+
if (
|
|
58
|
+
!SessionId.safeParse(sessionId).success ||
|
|
59
|
+
!kind ||
|
|
60
|
+
(requestedKind !== undefined && requestedKind !== kind)
|
|
61
|
+
) {
|
|
62
|
+
throw new HTTPException(404, { message: "Artifact association not found" });
|
|
63
|
+
}
|
|
64
|
+
try {
|
|
65
|
+
return await withAccessGrantSessionRlsContext(deps, grant, async () => {
|
|
66
|
+
await requireSessionAuthorization(deps, grant, {
|
|
67
|
+
sessionId,
|
|
68
|
+
operation: "session.read",
|
|
69
|
+
surface: "http",
|
|
70
|
+
});
|
|
71
|
+
const scope = { accountId: grant.accountId, workspaceId };
|
|
72
|
+
const linked =
|
|
73
|
+
kind === "editable"
|
|
74
|
+
? await hasEditableArtifactSessionLink(deps.db, scope, sessionId, artifactId)
|
|
75
|
+
: kind === "retained"
|
|
76
|
+
? await hasRetainedArtifactSessionLink(
|
|
77
|
+
deps,
|
|
78
|
+
authorization,
|
|
79
|
+
workspaceId,
|
|
80
|
+
sessionId,
|
|
81
|
+
artifactId.toLowerCase(),
|
|
82
|
+
)
|
|
83
|
+
: await hasWorkspaceArtifactSessionLink(
|
|
84
|
+
deps.db,
|
|
85
|
+
workspaceId,
|
|
86
|
+
await siteViewerForGrant(deps.db, grant),
|
|
87
|
+
sessionId,
|
|
88
|
+
artifactId,
|
|
89
|
+
);
|
|
90
|
+
if (!linked) throw new HTTPException(404, { message: "Artifact association not found" });
|
|
91
|
+
if (kind === "editable") {
|
|
92
|
+
const decision = await withRlsContext(deps.db, scope, (tx) =>
|
|
93
|
+
transactionallyAuthorizeEditableArtifactActor(tx, {
|
|
94
|
+
scope,
|
|
95
|
+
artifactId,
|
|
96
|
+
actor: editableArtifactActorForGrant(grant, "0000000000000001"),
|
|
97
|
+
permission: "read",
|
|
98
|
+
}),
|
|
99
|
+
);
|
|
100
|
+
if (!decision.allowed) {
|
|
101
|
+
throw new HTTPException(404, { message: "Artifact association not found" });
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
context.header("cache-control", "private, no-store");
|
|
105
|
+
return context.json({ sessionId, artifactId, kind });
|
|
106
|
+
});
|
|
107
|
+
} catch (error) {
|
|
108
|
+
if (error instanceof SessionAuthorizationDeniedError) {
|
|
109
|
+
throw new HTTPException(404, { message: "Artifact association not found" });
|
|
110
|
+
}
|
|
111
|
+
if (error instanceof SessionAuthorizationUnavailableError) {
|
|
112
|
+
throw new HTTPException(503, { message: "Session authorization is unavailable" });
|
|
113
|
+
}
|
|
114
|
+
throw error;
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Whether a retained artifact originated in this exact session: a generated
|
|
122
|
+
* image or video the session produced, or a sandbox file it published. Never
|
|
123
|
+
* inferred from an artifact id appearing in a message.
|
|
124
|
+
*/
|
|
125
|
+
async function hasRetainedArtifactSessionLink(
|
|
126
|
+
deps: ApiRouteDeps,
|
|
127
|
+
authorization: Awaited<ReturnType<typeof requireAccessGrantAuthorization>>,
|
|
128
|
+
workspaceId: string,
|
|
129
|
+
sessionId: string,
|
|
130
|
+
artifactId: string,
|
|
131
|
+
): Promise<boolean> {
|
|
132
|
+
const image = await getGeneratedImageArtifact(deps.db, workspaceId, artifactId);
|
|
133
|
+
if (image) return image.sessionId === sessionId;
|
|
134
|
+
const video = await getGeneratedVideoArtifact(deps.db, workspaceId, artifactId);
|
|
135
|
+
if (video) return !video.artifact.deletedAt && video.artifact.sessionId === sessionId;
|
|
136
|
+
const file = await getRetainedFileArtifact(deps.db, workspaceId, artifactId);
|
|
137
|
+
if (!file) return false;
|
|
138
|
+
// Publication receipts are private; the bounded catalog seam filters them
|
|
139
|
+
// by source session and this file's name, then the exact id must match.
|
|
140
|
+
const grant = authorization.grant;
|
|
141
|
+
const actor = await fileOwnerContextForAccess(deps, authorization, "files:read");
|
|
142
|
+
const candidates = await withSessionRlsActorContext(actor, () =>
|
|
143
|
+
listArtifactCatalogCandidates(
|
|
144
|
+
deps.db,
|
|
145
|
+
{ accountId: grant.accountId, workspaceId },
|
|
146
|
+
{
|
|
147
|
+
query: {
|
|
148
|
+
sourceSessionId: sessionId,
|
|
149
|
+
q: file.file.filename.slice(0, 200),
|
|
150
|
+
sort: "newest",
|
|
151
|
+
status: "active",
|
|
152
|
+
limit: 100,
|
|
153
|
+
},
|
|
154
|
+
kinds: ["file", "image"],
|
|
155
|
+
siteViewer: { subjectId: null },
|
|
156
|
+
snapshotAt: new Date().toISOString(),
|
|
157
|
+
limit: 201,
|
|
158
|
+
},
|
|
159
|
+
),
|
|
160
|
+
);
|
|
161
|
+
return candidates.some(
|
|
162
|
+
(candidate) => candidate.origin === "sandbox_file" && candidate.id === artifactId,
|
|
163
|
+
);
|
|
164
|
+
}
|