@opengeni/api-router 0.30.1 → 1.0.0
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 +3 -0
- package/dist/admission-trace.d.ts +8 -0
- package/dist/api-websocket.d.ts +18 -0
- package/dist/app.d.ts +50 -2
- package/dist/app.js +12 -1
- package/dist/artifact-catalog-cursor.d.ts +27 -0
- package/dist/auth/managed-auth-attempt-context.d.ts +10 -0
- package/dist/auth/managed-auth-rate-limits.d.ts +167 -0
- package/dist/auth/managed-auth-session-adapter.d.ts +6 -0
- package/dist/auth/managed-auth.d.ts +102 -3
- package/dist/auth/managed-email.d.ts +29 -0
- package/dist/auth/managed-sign-in-notifications.d.ts +4 -0
- package/dist/auth/new-signups-gate.d.ts +23 -0
- package/dist/auth/organization-user-setup.d.ts +80 -0
- package/dist/auth/signup-funnel-metrics.d.ts +44 -0
- package/dist/browser-controller-authority.d.ts +1 -61
- package/dist/browser-ephemeral.d.ts +5 -0
- package/dist/browser-state-authority.d.ts +1 -27
- package/dist/chunk-6TZ5LG3O.js +123948 -0
- package/dist/chunk-6TZ5LG3O.js.map +1 -0
- package/dist/chunk-OGQDXVXY.js +18 -0
- package/dist/chunk-OGQDXVXY.js.map +1 -0
- package/dist/claude-subscription-account-conflicts.d.ts +1 -0
- package/dist/claude-subscription-account-usage.d.ts +39 -0
- package/dist/claude-subscription-oauth.d.ts +25 -0
- package/dist/claude-subscription-profile.d.ts +9 -0
- package/dist/claude-subscription-usage.d.ts +44 -0
- package/dist/claude-workspace-connection.d.ts +15 -0
- package/dist/codemode.d.ts +32 -1
- package/dist/company-brain-okf.d.ts +24 -0
- package/dist/connected-machine-computer-access.d.ts +11 -0
- package/dist/connection-ownership.d.ts +54 -0
- package/dist/controller-data-plane.d.ts +32 -0
- package/dist/editable-artifact-office-import.d.ts +7 -4
- package/dist/editable-artifact-source-session.d.ts +3 -0
- package/dist/editable-artifact-websocket.d.ts +10 -18
- package/dist/editable-artifact-workspace-files.d.ts +1 -1
- package/dist/fatal-process-boundary.d.ts +25 -0
- package/dist/github-access.d.ts +31 -2
- package/dist/http/acting-person.d.ts +24 -0
- package/dist/http/api-contract-compat.d.ts +19 -0
- package/dist/http/api-error.d.ts +27 -1
- package/dist/http/cors.d.ts +17 -0
- package/dist/http/deprecation.d.ts +42 -0
- package/dist/http/interaction-control-error.d.ts +13 -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/request-body.d.ts +27 -0
- package/dist/http/request-source.d.ts +52 -0
- package/dist/http/sse.d.ts +17 -6
- package/dist/http/unmatched-route.d.ts +18 -0
- package/dist/http/user-content.d.ts +36 -0
- package/dist/http/websocket-upgrade-dispatch.d.ts +18 -0
- package/dist/index.d.ts +10 -3
- package/dist/index.js +1129 -166
- package/dist/index.js.map +1 -1
- package/dist/integration-endpoint-test.d.ts +20 -0
- package/dist/integrations/api-integrations.d.ts +2 -2
- package/dist/integrations/atlassian.d.ts +29 -3
- package/dist/integrations/connect-authority.d.ts +1 -0
- package/dist/integrations/connect-callback-return.d.ts +6 -0
- package/dist/integrations/fiken.d.ts +16 -2
- package/dist/integrations/github-app-connect.d.ts +47 -0
- package/dist/integrations/github-installation-proof.d.ts +3 -0
- package/dist/integrations/github-lens-connect.d.ts +116 -0
- package/dist/integrations/github-skill-source.d.ts +1 -5
- package/dist/integrations/google-drive.d.ts +25 -0
- package/dist/integrations/integration-commit-authority.d.ts +13 -0
- package/dist/integrations/marketplace-plugin.d.ts +2691 -0
- package/dist/integrations/oauth-client.d.ts +178 -18
- package/dist/integrations/oauth-profiles.d.ts +222 -0
- package/dist/integrations/oauth-return-path.d.ts +1 -0
- package/dist/integrations/personal-github-repositories.d.ts +84 -0
- package/dist/integrations/personal-github.d.ts +42 -0
- package/dist/integrations/pr-review-provider.d.ts +22 -0
- package/dist/integrations/provider-oauth.d.ts +19 -1
- package/dist/integrations/slack-app-home.d.ts +24 -0
- package/dist/integrations/slack-bot.d.ts +367 -12
- package/dist/integrations/slack-file-upload-flow.d.ts +62 -0
- package/dist/integrations/slack-install.d.ts +20 -0
- package/dist/integrations/slack-interactions.d.ts +113 -10
- package/dist/integrations/slack-mrkdwn.d.ts +41 -0
- package/dist/integrations/slack-routing.d.ts +120 -0
- package/dist/integrations/slack-session-defaults.d.ts +58 -0
- package/dist/integrations/slack-task-file-upload.d.ts +36 -0
- package/dist/integrations/social-oauth.d.ts +7 -0
- package/dist/interaction-agent-access.d.ts +15 -0
- package/dist/interaction-frame-proxy.d.ts +68 -0
- package/dist/interaction-metrics.d.ts +2 -0
- package/dist/mcp/action-catalog-types.d.ts +9 -0
- package/dist/mcp/action-catalog.gen.d.ts +2 -0
- package/dist/mcp/capability-account-readiness.d.ts +7 -0
- package/dist/mcp/child-read-evidence.d.ts +9 -0
- package/dist/mcp/command-read.d.ts +24 -0
- package/dist/mcp/company-profile-agent-admin.d.ts +44 -0
- package/dist/mcp/contract-input.d.ts +11 -0
- package/dist/mcp/documents.d.ts +7 -5
- package/dist/mcp/files.d.ts +2 -2
- package/dist/mcp/first-party-tool-permissions.d.ts +650 -0
- package/dist/mcp/knowledge-entries.d.ts +5 -0
- package/dist/mcp/orchestration-failure-diagnostic.d.ts +43 -0
- package/dist/mcp/receipts.d.ts +9 -0
- package/dist/mcp/request-abort.d.ts +19 -0
- package/dist/mcp/scheduled-task-input.d.ts +1189 -0
- package/dist/mcp/scheduled-task-view.d.ts +22 -4
- package/dist/mcp/server.d.ts +255 -3
- package/dist/mcp/session-event-view.d.ts +94 -0
- package/dist/mcp/session-view.d.ts +66 -2
- package/dist/mcp/session-wait.d.ts +174 -0
- package/dist/mcp-oauth.d.ts +52 -0
- package/dist/model-catalog.d.ts +11 -31
- package/dist/observability.d.ts +3 -1
- package/dist/organization-mcp.d.ts +52 -0
- package/dist/organization-recovery-notifications.d.ts +41 -0
- package/dist/routes/analytics-consent.d.ts +26 -0
- package/dist/routes/api-integrations.d.ts +25 -0
- package/dist/routes/api-keys.d.ts +17 -0
- package/dist/routes/artifact-catalog.d.ts +6 -0
- package/dist/routes/automations.d.ts +19 -0
- package/dist/routes/billing.d.ts +49 -0
- package/dist/routes/browser-sessions.d.ts +71 -3
- 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 +146 -0
- package/dist/routes/codex.d.ts +76 -2
- package/dist/routes/company-brain.d.ts +3 -0
- package/dist/routes/company-profile.d.ts +2 -1
- package/dist/routes/computer-sessions.d.ts +14 -0
- package/dist/routes/connect.d.ts +5 -0
- package/dist/routes/editable-artifacts.d.ts +2 -0
- package/dist/routes/external-identity-links.d.ts +6 -0
- package/dist/routes/feedback.d.ts +3 -0
- package/dist/routes/files.d.ts +4 -0
- package/dist/routes/github-browser-pages.d.ts +12 -0
- package/dist/routes/github.d.ts +2 -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 +30 -1
- package/dist/routes/knowledge.d.ts +3 -0
- package/dist/routes/managed-auth-session-sets.d.ts +26 -0
- package/dist/routes/managed-onboarding.d.ts +29 -0
- package/dist/routes/managed-sign-in-methods.d.ts +6 -0
- package/dist/routes/model-connection-access.d.ts +3 -0
- package/dist/routes/organization-integration-policy.d.ts +3 -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-providers.d.ts +3 -0
- package/dist/routes/organization-recovery.d.ts +19 -0
- package/dist/routes/organization-service-accounts.d.ts +3 -0
- package/dist/routes/organization-sessions.d.ts +26 -0
- package/dist/routes/personal-github-git-broker.d.ts +29 -0
- package/dist/routes/personal-github.d.ts +3 -0
- package/dist/routes/pr-review-github.d.ts +3 -0
- package/dist/routes/pr-review.d.ts +3 -0
- package/dist/routes/session-artifact-associations.d.ts +4 -0
- package/dist/routes/session-history-imports.d.ts +9 -0
- package/dist/routes/sessions.d.ts +44 -6
- package/dist/routes/skill-content.d.ts +4 -0
- package/dist/routes/skill-install-authority.d.ts +6 -0
- package/dist/routes/subscription-account-pools.d.ts +34 -0
- package/dist/routes/subscription-pool-access.d.ts +16 -0
- package/dist/routes/supergrok.d.ts +6 -1
- package/dist/routes/usage-allowances.d.ts +12 -0
- package/dist/routes/user-resource-authorities.d.ts +3 -0
- package/dist/routes/workspace-artifacts.d.ts +2 -1
- package/dist/routes/workspace-capture.d.ts +10 -2
- package/dist/routes/workspace-integrations.d.ts +35 -0
- package/dist/routes/workspace-learning.d.ts +3 -0
- package/dist/routes/workspace-model-providers.d.ts +4 -0
- package/dist/routes/workspaces.d.ts +29 -0
- package/dist/sandbox/auth-callout.d.ts +8 -0
- package/dist/sandbox/channel-a.d.ts +19 -1
- package/dist/sandbox/connection-authority.d.ts +3 -0
- package/dist/sandbox/enrollment.d.ts +9 -1
- package/dist/sandbox/machines.d.ts +5 -2
- package/dist/sandbox/metrics-ingestion.d.ts +28 -20
- package/dist/sandbox/rematerialize.d.ts +2 -0
- package/dist/sandbox/session-attach-variable-sets.d.ts +30 -0
- package/dist/sandbox/viewer.d.ts +26 -1
- package/dist/sandbox-file-artifacts.d.ts +50 -0
- package/dist/scheduled-task-deletion.d.ts +13 -0
- package/dist/session-create-observability.d.ts +5 -0
- package/dist/session-event-view-MPS2OZD3.js +292 -0
- package/dist/session-event-view-MPS2OZD3.js.map +1 -0
- package/dist/site-session-origin.d.ts +13 -0
- package/dist/site-uploads.d.ts +41 -0
- package/dist/slack-reaction-files.d.ts +1 -1
- package/dist/temporal-schedule-cleanup.d.ts +1 -0
- package/dist/temporal-schedule-sync.d.ts +26 -0
- package/dist/transcription/providers/xai-subscription.d.ts +1 -0
- package/dist/transcription/service.d.ts +2 -1
- package/dist/work-discovery-observability.d.ts +33 -0
- package/dist/workspace-artifact-content.d.ts +28 -0
- package/dist/workspace-artifact-provenance.d.ts +7 -0
- package/dist/workspace-delete-observability.d.ts +10 -0
- package/dist/workspace-deletion.d.ts +6 -0
- package/dist/workspace-state-projection.d.ts +3 -5
- package/dist/workspace-tool-gateway-observability.d.ts +17 -0
- package/dist/workspace-tool-gateway.d.ts +123 -0
- package/dist/workspace-webhook-dispatch.d.ts +26 -0
- package/package.json +23 -19
- package/src/access-grant-rls.ts +75 -0
- package/src/admission-trace.ts +14 -0
- package/src/api-websocket.ts +23 -0
- package/src/app.ts +1974 -256
- package/src/artifact-catalog-cursor.ts +60 -0
- package/src/auth/managed-auth-attempt-context.ts +70 -0
- package/src/auth/managed-auth-rate-limits.ts +252 -0
- package/src/auth/managed-auth-session-adapter.ts +222 -0
- package/src/auth/managed-auth.ts +536 -60
- package/src/auth/managed-email.ts +174 -0
- 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 +307 -0
- package/src/auth/signup-funnel-metrics.ts +164 -0
- package/src/browser-controller-authority.ts +1 -186
- package/src/browser-ephemeral.ts +39 -0
- package/src/browser-state-authority.ts +1 -236
- package/src/claude-subscription-account-conflicts.ts +12 -0
- package/src/claude-subscription-account-usage.ts +48 -0
- package/src/claude-subscription-oauth.ts +362 -0
- package/src/claude-subscription-profile.ts +73 -0
- package/src/claude-subscription-usage.ts +97 -0
- package/src/claude-workspace-connection.ts +82 -0
- package/src/codemode.ts +194 -30
- package/src/codex-realtime.ts +8 -2
- package/src/company-brain-okf.ts +340 -0
- package/src/connected-machine-computer-access.ts +33 -0
- package/src/connection-ownership.ts +199 -0
- package/src/controller-data-plane.ts +81 -0
- package/src/editable-artifact-native-kernel.ts +26 -15
- package/src/editable-artifact-office-import.ts +77 -9
- package/src/editable-artifact-production.ts +23 -7
- package/src/editable-artifact-source-session.ts +123 -0
- package/src/editable-artifact-websocket.ts +27 -21
- package/src/editable-artifact-workspace-files.ts +31 -6
- package/src/fatal-process-boundary.ts +246 -0
- package/src/gateway-realtime.ts +1 -1
- package/src/github-access.ts +147 -5
- package/src/http/acting-person.ts +71 -0
- package/src/http/api-contract-compat.ts +49 -0
- package/src/http/api-error.ts +115 -1
- package/src/http/auth.ts +48 -0
- package/src/http/cors.ts +67 -0
- package/src/http/deprecation.ts +118 -0
- package/src/http/interaction-control-error.ts +164 -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/request-body.ts +127 -0
- package/src/http/request-source.ts +178 -0
- package/src/http/sse.ts +486 -132
- package/src/http/unmatched-route.ts +60 -0
- package/src/http/user-content.ts +158 -0
- package/src/http/websocket-upgrade-dispatch.ts +29 -0
- package/src/index.ts +157 -52
- package/src/integration-endpoint-test.ts +291 -0
- package/src/integrations/api-integrations.ts +98 -11
- package/src/integrations/atlassian.ts +474 -136
- package/src/integrations/connect-authority.ts +2 -0
- package/src/integrations/connect-callback-return.ts +86 -0
- package/src/integrations/fiken.ts +354 -64
- package/src/integrations/github-app-connect.ts +435 -0
- package/src/integrations/github-installation-proof.ts +60 -0
- package/src/integrations/github-lens-connect.ts +76 -0
- package/src/integrations/github-skill-source.ts +2 -142
- package/src/integrations/google-drive.ts +820 -222
- package/src/integrations/integration-commit-authority.ts +69 -0
- package/src/integrations/marketplace-plugin.ts +48 -0
- package/src/integrations/oauth-client.ts +1356 -459
- package/src/integrations/oauth-profiles.ts +537 -0
- package/src/integrations/oauth-return-path.ts +18 -0
- package/src/integrations/personal-github-repositories.ts +674 -0
- package/src/integrations/personal-github.ts +825 -0
- package/src/integrations/pr-review-provider.ts +246 -0
- package/src/integrations/provider-oauth.ts +250 -22
- package/src/integrations/slack-app-home.ts +300 -0
- package/src/integrations/slack-bot.ts +963 -239
- package/src/integrations/slack-file-upload-flow.ts +147 -0
- package/src/integrations/slack-install.ts +83 -0
- package/src/integrations/slack-interactions.ts +3170 -474
- package/src/integrations/slack-mrkdwn.ts +193 -0
- package/src/integrations/slack-routing.ts +337 -0
- package/src/integrations/slack-session-defaults.ts +224 -0
- package/src/integrations/slack-task-file-upload.ts +323 -0
- package/src/integrations/social-oauth.ts +213 -15
- package/src/interaction-agent-access.ts +48 -0
- package/src/interaction-frame-proxy.ts +409 -0
- package/src/interaction-metrics.ts +30 -0
- package/src/mcp/action-catalog-types.ts +9 -0
- package/src/mcp/action-catalog.gen.ts +6696 -0
- package/src/mcp/capability-account-readiness.ts +17 -0
- package/src/mcp/child-read-evidence.ts +19 -0
- package/src/mcp/command-read.ts +109 -0
- package/src/mcp/company-profile-agent-admin.ts +198 -0
- package/src/mcp/contract-input.ts +141 -0
- package/src/mcp/documents.ts +65 -377
- package/src/mcp/editable-artifacts.ts +12 -6
- package/src/mcp/files.ts +80 -38
- package/src/mcp/first-party-tool-permissions.ts +305 -0
- package/src/mcp/knowledge-entries.ts +322 -0
- package/src/mcp/orchestration-failure-diagnostic.ts +43 -0
- package/src/mcp/receipts.ts +34 -0
- package/src/mcp/request-abort.ts +44 -0
- package/src/mcp/scheduled-task-input.ts +76 -0
- package/src/mcp/scheduled-task-view.ts +44 -3
- package/src/mcp/server.ts +3030 -1267
- package/src/mcp/session-event-view.ts +383 -0
- package/src/mcp/session-view.ts +84 -3
- package/src/mcp/session-wait.ts +665 -0
- package/src/mcp-oauth.ts +1123 -0
- package/src/model-catalog.ts +91 -333
- package/src/observability.ts +15 -1
- package/src/organization-mcp.ts +397 -0
- package/src/organization-recovery-notifications.ts +103 -0
- package/src/routes/analytics-consent.ts +123 -0
- package/src/routes/api-integrations.ts +364 -74
- package/src/routes/api-keys.ts +336 -10
- package/src/routes/artifact-catalog.ts +279 -0
- package/src/routes/automations.ts +768 -0
- package/src/routes/billing.ts +461 -46
- package/src/routes/browser-sessions.ts +839 -131
- package/src/routes/canonical-human-identities.ts +90 -14
- package/src/routes/capabilities.ts +107 -6
- package/src/routes/channels.ts +20 -3
- package/src/routes/claude-subscription-accounts.ts +334 -0
- package/src/routes/claude-subscription-oauth.ts +142 -0
- package/src/routes/client-errors.ts +362 -0
- package/src/routes/codex.ts +833 -116
- package/src/routes/company-brain.ts +322 -0
- package/src/routes/company-profile.ts +65 -1
- package/src/routes/computer-sessions.ts +557 -106
- package/src/routes/connect.ts +1938 -0
- package/src/routes/connections.ts +1040 -349
- package/src/routes/documents.ts +488 -287
- package/src/routes/editable-artifacts.ts +79 -9
- package/src/routes/enrollments.ts +135 -39
- package/src/routes/environments.ts +154 -58
- package/src/routes/external-identity-links.ts +201 -0
- package/src/routes/feedback.ts +113 -0
- package/src/routes/files.ts +337 -39
- package/src/routes/github-browser-pages.ts +162 -0
- package/src/routes/github.ts +446 -144
- package/src/routes/insights-response-cache.ts +83 -0
- package/src/routes/insights-usage.ts +345 -0
- package/src/routes/insights.ts +153 -19
- package/src/routes/install.ts +133 -38
- package/src/routes/integration-facets.ts +107 -33
- package/src/routes/interaction-resources.ts +30 -3
- package/src/routes/knowledge.ts +488 -0
- package/src/routes/machines.ts +313 -15
- package/src/routes/managed-auth-session-sets.ts +1218 -0
- package/src/routes/managed-onboarding.ts +337 -0
- package/src/routes/managed-sign-in-methods.ts +433 -0
- package/src/routes/memory-slack-publications.ts +3 -2
- package/src/routes/model-connection-access.ts +208 -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 +178 -0
- package/src/routes/organization-memberships.ts +1019 -27
- package/src/routes/organization-model-providers.ts +293 -0
- package/src/routes/organization-recovery.ts +325 -0
- package/src/routes/organization-service-accounts.ts +128 -0
- package/src/routes/organization-sessions.ts +350 -0
- package/src/routes/personal-github-git-broker.ts +785 -0
- package/src/routes/personal-github.ts +370 -0
- package/src/routes/plugins.ts +251 -22
- package/src/routes/pr-review-github.ts +881 -0
- package/src/routes/pr-review.ts +622 -0
- package/src/routes/preference-registry.ts +12 -93
- package/src/routes/rigs.ts +167 -50
- package/src/routes/scheduled-tasks.ts +346 -41
- package/src/routes/session-artifact-associations.ts +87 -0
- package/src/routes/session-history-imports.ts +280 -0
- package/src/routes/sessions.ts +2306 -264
- package/src/routes/skill-content.ts +297 -0
- package/src/routes/skill-install-authority.ts +64 -0
- package/src/routes/skills.ts +62 -9
- package/src/routes/social.ts +46 -18
- package/src/routes/subscription-account-pools.ts +436 -0
- package/src/routes/subscription-pool-access.ts +126 -0
- package/src/routes/supergrok.ts +219 -303
- package/src/routes/transcription-recordings.ts +38 -3
- package/src/routes/transcriptions.ts +4 -0
- package/src/routes/usage-allowances.ts +378 -0
- package/src/routes/user-resource-authorities.ts +138 -0
- package/src/routes/video-generation.ts +14 -10
- package/src/routes/workspace-artifacts.ts +275 -69
- package/src/routes/workspace-capture.ts +21 -0
- package/src/routes/workspace-integrations.ts +576 -0
- package/src/routes/workspace-learning.ts +159 -0
- package/src/routes/workspace-model-providers.ts +148 -0
- package/src/routes/workspace-state.ts +38 -25
- package/src/routes/workspaces.ts +1004 -127
- package/src/sandbox/auth-callout.ts +96 -19
- package/src/sandbox/channel-a.ts +323 -24
- package/src/sandbox/connection-authority.ts +3 -0
- package/src/sandbox/enrollment.ts +81 -6
- package/src/sandbox/machines.ts +218 -76
- package/src/sandbox/metrics-ingestion.ts +411 -62
- package/src/sandbox/rematerialize.ts +121 -19
- package/src/sandbox/session-attach-variable-sets.ts +131 -0
- package/src/sandbox/viewer.ts +280 -25
- package/src/sandbox-file-artifacts.ts +413 -0
- package/src/scheduled-task-deletion.ts +138 -0
- package/src/session-create-observability.ts +46 -0
- package/src/session-realtime-context.ts +6 -3
- package/src/site-session-origin.ts +48 -0
- package/src/site-uploads.ts +224 -0
- package/src/slack-reaction-files.ts +16 -5
- package/src/temporal-schedule-cleanup.ts +13 -0
- package/src/temporal-schedule-sync.ts +74 -0
- package/src/transcription/providers/codex-subscription.ts +2 -0
- package/src/transcription/providers/openai.ts +1 -0
- package/src/transcription/providers/xai-subscription.ts +49 -3
- package/src/transcription/segmenter.ts +8 -2
- package/src/transcription/service.ts +43 -6
- package/src/work-discovery-observability.ts +121 -0
- package/src/workspace-artifact-content.ts +144 -0
- package/src/workspace-artifact-provenance.ts +104 -0
- package/src/workspace-delete-observability.ts +75 -0
- package/src/workspace-deletion.ts +73 -0
- package/src/workspace-state-projection.ts +18 -148
- package/src/workspace-tool-gateway-observability.ts +100 -0
- package/src/workspace-tool-gateway.ts +870 -0
- package/src/workspace-webhook-dispatch.ts +190 -0
- package/src/xai-subscription-auth.ts +9 -2
- package/dist/chunk-2PQMSRCB.js +0 -49759
- package/dist/chunk-2PQMSRCB.js.map +0 -1
- package/dist/routes/packs.d.ts +0 -3
- package/src/routes/packs.ts +0 -729
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import {
|
|
3
|
+
UndoGovernedLearningActivationHttpRequest,
|
|
4
|
+
WorkspaceLearningHistoryResponse,
|
|
5
|
+
WorkspaceLearningPolicyHistoryQuery,
|
|
6
|
+
} from "@opengeni/contracts";
|
|
7
|
+
import {
|
|
8
|
+
publishGovernedLearningEventToSlack,
|
|
9
|
+
requireAccessGrant,
|
|
10
|
+
requireWorkspaceSettingsGrant,
|
|
11
|
+
type ApiRouteDeps,
|
|
12
|
+
} from "@opengeni/core";
|
|
13
|
+
import {
|
|
14
|
+
GovernedLearningActivationAuthorityError,
|
|
15
|
+
GovernedLearningActivationConflictError,
|
|
16
|
+
GovernedLearningActivationInvalidOperationError,
|
|
17
|
+
GovernedLearningEvaluationAuthorityError,
|
|
18
|
+
listGovernedLearningActivationHistory,
|
|
19
|
+
listGovernedLearningDecisionReceipts,
|
|
20
|
+
listWorkspaceLearningPolicyHistory,
|
|
21
|
+
undoGovernedLearningActivation,
|
|
22
|
+
WorkspaceLearningPolicyAuthorityError,
|
|
23
|
+
WorkspaceLearningPolicyConflictError,
|
|
24
|
+
WorkspaceLearningPolicyInvalidOperationError,
|
|
25
|
+
WorkspaceLearningPolicyNotFoundError,
|
|
26
|
+
WorkspaceLearningPolicyOperationReuseError,
|
|
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
|
+
async function parseBody<S extends z.ZodType>(context: Context, schema: S): Promise<z.infer<S>> {
|
|
33
|
+
const parsed = schema.safeParse(await context.req.json().catch(() => null));
|
|
34
|
+
if (!parsed.success) {
|
|
35
|
+
throw new HTTPException(422, { message: "Invalid workspace learning request" });
|
|
36
|
+
}
|
|
37
|
+
return parsed.data;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function learningError(error: unknown): never {
|
|
41
|
+
if (
|
|
42
|
+
error instanceof WorkspaceLearningPolicyAuthorityError ||
|
|
43
|
+
error instanceof GovernedLearningEvaluationAuthorityError ||
|
|
44
|
+
error instanceof GovernedLearningActivationAuthorityError
|
|
45
|
+
) {
|
|
46
|
+
throw new HTTPException(403, { message: error.message });
|
|
47
|
+
}
|
|
48
|
+
if (error instanceof WorkspaceLearningPolicyNotFoundError) {
|
|
49
|
+
throw new HTTPException(404, { message: error.message });
|
|
50
|
+
}
|
|
51
|
+
if (
|
|
52
|
+
error instanceof WorkspaceLearningPolicyConflictError ||
|
|
53
|
+
error instanceof WorkspaceLearningPolicyOperationReuseError ||
|
|
54
|
+
error instanceof GovernedLearningActivationConflictError
|
|
55
|
+
) {
|
|
56
|
+
throw new HTTPException(409, { message: error.message });
|
|
57
|
+
}
|
|
58
|
+
if (
|
|
59
|
+
error instanceof WorkspaceLearningPolicyInvalidOperationError ||
|
|
60
|
+
error instanceof GovernedLearningActivationInvalidOperationError
|
|
61
|
+
) {
|
|
62
|
+
throw new HTTPException(422, { message: error.message });
|
|
63
|
+
}
|
|
64
|
+
throw error;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export function registerWorkspaceLearningRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
68
|
+
const base = "/v1/workspaces/:workspaceId/learning";
|
|
69
|
+
|
|
70
|
+
app.get(base, async (context) => {
|
|
71
|
+
const workspaceId = context.req.param("workspaceId");
|
|
72
|
+
const grant = await requireAccessGrant(context, deps, workspaceId, "workspace:read");
|
|
73
|
+
const query = WorkspaceLearningPolicyHistoryQuery.safeParse({
|
|
74
|
+
limit: context.req.query("limit"),
|
|
75
|
+
});
|
|
76
|
+
if (!query.success) {
|
|
77
|
+
throw new HTTPException(422, { message: "Invalid workspace learning history query" });
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
const [policy, decisions, lifecycle] = await Promise.all([
|
|
81
|
+
listWorkspaceLearningPolicyHistory(deps.db, {
|
|
82
|
+
accountId: grant.accountId,
|
|
83
|
+
workspaceId,
|
|
84
|
+
limit: query.data.limit,
|
|
85
|
+
}),
|
|
86
|
+
listGovernedLearningDecisionReceipts(deps.db, {
|
|
87
|
+
workspaceId,
|
|
88
|
+
subjectId: grant.subjectId,
|
|
89
|
+
principalKind: grant.principalKind ?? "",
|
|
90
|
+
limit: query.data.limit,
|
|
91
|
+
}),
|
|
92
|
+
listGovernedLearningActivationHistory(deps.db, {
|
|
93
|
+
workspaceId,
|
|
94
|
+
subjectId: grant.subjectId,
|
|
95
|
+
principalKind: grant.principalKind ?? "",
|
|
96
|
+
limit: query.data.limit,
|
|
97
|
+
}),
|
|
98
|
+
]);
|
|
99
|
+
return context.json(
|
|
100
|
+
WorkspaceLearningHistoryResponse.parse({
|
|
101
|
+
head: policy.head,
|
|
102
|
+
revisions: policy.revisions,
|
|
103
|
+
policyEvents: policy.events,
|
|
104
|
+
decisions: decisions.receipts,
|
|
105
|
+
activations: lifecycle.activations,
|
|
106
|
+
undos: lifecycle.undos,
|
|
107
|
+
truncated: policy.truncated || decisions.truncated || lifecycle.truncated,
|
|
108
|
+
effectiveBoundary: "next_accepted_attempt",
|
|
109
|
+
}),
|
|
110
|
+
);
|
|
111
|
+
} catch (error) {
|
|
112
|
+
learningError(error);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
for (const path of ["/revisions", "/revisions/:revisionId/activate", "/rollback"]) {
|
|
117
|
+
app.post(`${base}${path}`, async (context) => {
|
|
118
|
+
await requireWorkspaceSettingsGrant(context, deps, context.req.param("workspaceId")!);
|
|
119
|
+
return context.json(
|
|
120
|
+
{
|
|
121
|
+
error: {
|
|
122
|
+
code: "learning_settings_replaced",
|
|
123
|
+
message: "Configure Knowledge, instructions and Skills in Agent learning settings.",
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
410,
|
|
127
|
+
);
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
app.post(`${base}/activations/:activationReceiptId/undo`, async (context) => {
|
|
132
|
+
const workspaceId = context.req.param("workspaceId");
|
|
133
|
+
const activationReceiptId = z
|
|
134
|
+
.string()
|
|
135
|
+
.uuid()
|
|
136
|
+
.safeParse(context.req.param("activationReceiptId"));
|
|
137
|
+
if (!activationReceiptId.success) {
|
|
138
|
+
throw new HTTPException(422, { message: "Invalid activation receipt id" });
|
|
139
|
+
}
|
|
140
|
+
const grant = await requireWorkspaceSettingsGrant(context, deps, workspaceId);
|
|
141
|
+
const request = await parseBody(context, UndoGovernedLearningActivationHttpRequest);
|
|
142
|
+
try {
|
|
143
|
+
const undo = await undoGovernedLearningActivation(deps.db, {
|
|
144
|
+
caller: { workspaceId, subjectId: grant.subjectId },
|
|
145
|
+
request: {
|
|
146
|
+
operationId: request.operationId ?? randomUUID(),
|
|
147
|
+
activationReceiptId: activationReceiptId.data,
|
|
148
|
+
},
|
|
149
|
+
});
|
|
150
|
+
// Best-effort notification; the undo receipt is already durable.
|
|
151
|
+
await publishGovernedLearningEventToSlack(deps.db, { kind: "undone", receipt: undo }).catch(
|
|
152
|
+
() => undefined,
|
|
153
|
+
);
|
|
154
|
+
return context.json(undo);
|
|
155
|
+
} catch (error) {
|
|
156
|
+
learningError(error);
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { claudeProviderId } from "@opengeni/config";
|
|
2
|
+
import { requireSameOriginBrowserMutation } from "./codex";
|
|
3
|
+
import { createHash } from "node:crypto";
|
|
4
|
+
import {
|
|
5
|
+
CreateWorkspaceGatewayCustomModelRequest,
|
|
6
|
+
DeleteWorkspaceGatewayCustomModelRequest,
|
|
7
|
+
WorkspaceGatewayCustomModel,
|
|
8
|
+
WorkspaceGatewayCustomModelsResponse,
|
|
9
|
+
} from "@opengeni/contracts";
|
|
10
|
+
import {
|
|
11
|
+
requireAccessGrant,
|
|
12
|
+
requireWorkspaceSettingsGrant,
|
|
13
|
+
type ApiRouteDeps,
|
|
14
|
+
} from "@opengeni/core";
|
|
15
|
+
import {
|
|
16
|
+
createWorkspaceProviderCustomModel,
|
|
17
|
+
deleteWorkspaceProviderCustomModel,
|
|
18
|
+
listWorkspaceProviderCustomModels,
|
|
19
|
+
replayWorkspaceProviderCustomModelCreate,
|
|
20
|
+
nestedPostgresSqlState,
|
|
21
|
+
WorkspaceClaudeCustomModelLimitError,
|
|
22
|
+
type WorkspaceProviderCustomModel,
|
|
23
|
+
} from "@opengeni/db";
|
|
24
|
+
import type { Context, Hono } from "hono";
|
|
25
|
+
import { HTTPException } from "hono/http-exception";
|
|
26
|
+
import { z } from "zod";
|
|
27
|
+
|
|
28
|
+
const Kind = z.enum(["anthropic", "claude_subscription"]);
|
|
29
|
+
function requestHash(value: unknown): string {
|
|
30
|
+
return createHash("sha256").update(JSON.stringify(value)).digest("hex");
|
|
31
|
+
}
|
|
32
|
+
function modelJson(model: WorkspaceProviderCustomModel) {
|
|
33
|
+
return WorkspaceGatewayCustomModel.parse({
|
|
34
|
+
...model,
|
|
35
|
+
createdAt: model.createdAt.toISOString(),
|
|
36
|
+
updatedAt: model.updatedAt.toISOString(),
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** Workspace-owned Claude models use the same immutable-generation protocol as gateway models. */
|
|
41
|
+
export function registerWorkspaceModelProviderRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
42
|
+
const path = "/v1/workspaces/:workspaceId/model-providers/:providerKind/custom-models";
|
|
43
|
+
async function scope(c: Context, mutate: boolean) {
|
|
44
|
+
const parsedKind = Kind.safeParse(c.req.param("providerKind"));
|
|
45
|
+
if (!parsedKind.success) throw new HTTPException(404, { message: "Model provider not found" });
|
|
46
|
+
const providerKind = parsedKind.data;
|
|
47
|
+
if (providerKind === "claude_subscription" && !deps.settings.claudeSubscriptionEnabled)
|
|
48
|
+
throw new HTTPException(404, { message: "Claude subscriptions are not enabled" });
|
|
49
|
+
const workspaceId = c.req.param("workspaceId")!;
|
|
50
|
+
const grant = mutate
|
|
51
|
+
? await requireWorkspaceSettingsGrant(c, deps, workspaceId)
|
|
52
|
+
: await requireAccessGrant(c, deps, workspaceId, "workspace:read");
|
|
53
|
+
c.header("cache-control", "private, no-store");
|
|
54
|
+
return { accountId: grant.accountId, workspaceId, providerKind, subjectId: grant.subjectId };
|
|
55
|
+
}
|
|
56
|
+
app.get(path, async (c) => {
|
|
57
|
+
const input = await scope(c, false);
|
|
58
|
+
const models = await listWorkspaceProviderCustomModels(deps.db, input);
|
|
59
|
+
return c.json(WorkspaceGatewayCustomModelsResponse.parse({ models: models.map(modelJson) }));
|
|
60
|
+
});
|
|
61
|
+
const usagePath = "/v1/workspaces/:workspaceId/model-providers/:providerKind/usage";
|
|
62
|
+
app.get(usagePath, async (c) => {
|
|
63
|
+
const input = await scope(c, false);
|
|
64
|
+
if (input.providerKind !== "claude_subscription")
|
|
65
|
+
throw new HTTPException(404, { message: "Usage not available for this provider" });
|
|
66
|
+
throw new HTTPException(410, { message: "Check usage on the individual Claude account." });
|
|
67
|
+
});
|
|
68
|
+
app.post(`${usagePath}/refresh`, async (c) => {
|
|
69
|
+
requireSameOriginBrowserMutation(c, deps);
|
|
70
|
+
const input = await scope(c, false);
|
|
71
|
+
if (input.providerKind !== "claude_subscription")
|
|
72
|
+
throw new HTTPException(404, { message: "Usage not available for this provider" });
|
|
73
|
+
await requireAccessGrant(c, deps, input.workspaceId, "connections:write");
|
|
74
|
+
throw new HTTPException(410, { message: "Check usage on the individual Claude account." });
|
|
75
|
+
});
|
|
76
|
+
app.post(path, async (c) => {
|
|
77
|
+
const input = await scope(c, true);
|
|
78
|
+
const parsed = CreateWorkspaceGatewayCustomModelRequest.safeParse(
|
|
79
|
+
await c.req.json().catch(() => null),
|
|
80
|
+
);
|
|
81
|
+
if (!parsed.success) throw new HTTPException(422, { message: "Invalid custom model" });
|
|
82
|
+
const payload = parsed.data;
|
|
83
|
+
if (
|
|
84
|
+
`${claudeProviderId(input.providerKind, "workspace")}/${payload.upstreamModelId}`.length > 256
|
|
85
|
+
)
|
|
86
|
+
throw new HTTPException(422, { message: "Claude model ID is too long" });
|
|
87
|
+
const hash = requestHash({
|
|
88
|
+
action: "create",
|
|
89
|
+
upstreamModelId: payload.upstreamModelId,
|
|
90
|
+
label: payload.label ?? null,
|
|
91
|
+
});
|
|
92
|
+
const replay = await replayWorkspaceProviderCustomModelCreate(deps.db, {
|
|
93
|
+
...input,
|
|
94
|
+
operationId: payload.operationId,
|
|
95
|
+
requestHash: hash,
|
|
96
|
+
});
|
|
97
|
+
if (replay.outcome === "conflict")
|
|
98
|
+
throw new HTTPException(409, {
|
|
99
|
+
message: "Custom model operation conflicts with current state",
|
|
100
|
+
});
|
|
101
|
+
if (replay.outcome === "success") return c.json(modelJson(replay.model), 201);
|
|
102
|
+
try {
|
|
103
|
+
const model = await createWorkspaceProviderCustomModel(deps.db, {
|
|
104
|
+
...input,
|
|
105
|
+
...payload,
|
|
106
|
+
label: payload.label ?? null,
|
|
107
|
+
requestHash: hash,
|
|
108
|
+
createdBySubjectId: input.subjectId,
|
|
109
|
+
});
|
|
110
|
+
if (!model || model.retiredAt)
|
|
111
|
+
throw new HTTPException(409, {
|
|
112
|
+
message: "Custom model operation conflicts with current state",
|
|
113
|
+
});
|
|
114
|
+
return c.json(modelJson(model), 201);
|
|
115
|
+
} catch (error) {
|
|
116
|
+
if (error instanceof WorkspaceClaudeCustomModelLimitError)
|
|
117
|
+
throw new HTTPException(422, { message: error.message });
|
|
118
|
+
if (nestedPostgresSqlState(error) === "23505")
|
|
119
|
+
throw new HTTPException(422, { message: "Custom model already exists" });
|
|
120
|
+
throw error;
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
app.delete(`${path}/:customModelId`, async (c) => {
|
|
124
|
+
const input = await scope(c, true);
|
|
125
|
+
const id = z.string().uuid().safeParse(c.req.param("customModelId"));
|
|
126
|
+
const parsed = DeleteWorkspaceGatewayCustomModelRequest.safeParse(
|
|
127
|
+
await c.req.json().catch(() => null),
|
|
128
|
+
);
|
|
129
|
+
if (!id.success || !parsed.success)
|
|
130
|
+
throw new HTTPException(422, { message: "Invalid custom model deletion" });
|
|
131
|
+
const customModelId = id.data;
|
|
132
|
+
const removed = await deleteWorkspaceProviderCustomModel(deps.db, {
|
|
133
|
+
...input,
|
|
134
|
+
...parsed.data,
|
|
135
|
+
customModelId,
|
|
136
|
+
requestHash: requestHash({
|
|
137
|
+
action: "delete",
|
|
138
|
+
customModelId,
|
|
139
|
+
expectedVersion: parsed.data.expectedVersion,
|
|
140
|
+
}),
|
|
141
|
+
});
|
|
142
|
+
if (removed.outcome === "not_found")
|
|
143
|
+
throw new HTTPException(404, { message: "Custom model not found" });
|
|
144
|
+
if (removed.outcome === "conflict")
|
|
145
|
+
throw new HTTPException(409, { message: "Custom model changed; reload and retry" });
|
|
146
|
+
return c.body(null, 204);
|
|
147
|
+
});
|
|
148
|
+
}
|
|
@@ -1,32 +1,37 @@
|
|
|
1
|
+
import { withAccessGrantSessionRlsContext } from "../access-grant-rls";
|
|
1
2
|
import {
|
|
2
|
-
|
|
3
|
-
WORKSPACE_STATE_MAX_TOPICS,
|
|
4
|
-
WORKSPACE_STATE_TOPIC_MAX_CHARS,
|
|
3
|
+
WORKSPACE_STATE_KNOWLEDGE_SAMPLE_LIMIT,
|
|
5
4
|
WorkspaceStateQuery,
|
|
6
5
|
WorkspaceStateResponse,
|
|
7
|
-
type AccessGrant,
|
|
8
6
|
type WorkspaceStateQuery as WorkspaceStateQueryType,
|
|
9
7
|
} from "@opengeni/contracts";
|
|
10
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
hasPermission,
|
|
10
|
+
requireAccessGrantAuthorization,
|
|
11
|
+
knowledgeContextForAccess,
|
|
12
|
+
type AccessGrantAuthorization,
|
|
13
|
+
type ApiRouteDeps,
|
|
14
|
+
} from "@opengeni/core";
|
|
11
15
|
import {
|
|
12
16
|
getWorkspace,
|
|
13
17
|
getCurrentPreferenceRegistryGovernanceMetadata,
|
|
14
18
|
getWorkspaceStateAcceptedAttemptGovernance,
|
|
15
|
-
|
|
19
|
+
listKnowledgeEntries,
|
|
16
20
|
listWorkspaceInstructionPolicyRevisions,
|
|
17
21
|
} from "@opengeni/db";
|
|
18
|
-
import { getDocumentInventory } from "@opengeni/documents";
|
|
19
22
|
import type { Hono } from "hono";
|
|
20
23
|
import { HTTPException } from "hono/http-exception";
|
|
21
24
|
|
|
22
25
|
import { serializeWorkspaceStateExport } from "../workspace-state-export";
|
|
23
26
|
import { projectWorkspaceState } from "../workspace-state-projection";
|
|
27
|
+
import { USER_CONTENT_SECURITY_HEADERS } from "../http/user-content";
|
|
24
28
|
|
|
25
29
|
async function readWorkspaceState(
|
|
26
30
|
deps: ApiRouteDeps,
|
|
27
|
-
input: { workspaceId: string; query: WorkspaceStateQueryType;
|
|
31
|
+
input: { workspaceId: string; query: WorkspaceStateQueryType; access: AccessGrantAuthorization },
|
|
28
32
|
) {
|
|
29
|
-
const { workspaceId, query,
|
|
33
|
+
const { workspaceId, query, access } = input;
|
|
34
|
+
const { grant } = access;
|
|
30
35
|
const generatedAt = new Date().toISOString();
|
|
31
36
|
const canInspectKnowledge = hasPermission(grant.permissions, "documents:search");
|
|
32
37
|
|
|
@@ -34,18 +39,13 @@ async function readWorkspaceState(
|
|
|
34
39
|
getWorkspace(deps.db, workspaceId),
|
|
35
40
|
listWorkspaceInstructionPolicyRevisions(deps.db, workspaceId, { limit: 1 }),
|
|
36
41
|
canInspectKnowledge
|
|
37
|
-
? (async () =>
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
}),
|
|
45
|
-
listWorkspaceStateMemoryRecords(deps.db, workspaceId),
|
|
46
|
-
]);
|
|
47
|
-
return { documents, memories };
|
|
48
|
-
})()
|
|
42
|
+
? withAccessGrantSessionRlsContext(deps, grant, async () =>
|
|
43
|
+
listKnowledgeEntries(
|
|
44
|
+
deps.db,
|
|
45
|
+
await knowledgeContextForAccess(deps, access, "documents:search"),
|
|
46
|
+
{ limit: WORKSPACE_STATE_KNOWLEDGE_SAMPLE_LIMIT, view: "published" },
|
|
47
|
+
),
|
|
48
|
+
)
|
|
49
49
|
: Promise.resolve(null),
|
|
50
50
|
getCurrentPreferenceRegistryGovernanceMetadata(deps.db, {
|
|
51
51
|
workspaceId,
|
|
@@ -109,8 +109,13 @@ export function registerWorkspaceStateRoutes(app: Hono, deps: ApiRouteDeps): voi
|
|
|
109
109
|
app.get(base, async (context) => {
|
|
110
110
|
const workspaceId = context.req.param("workspaceId");
|
|
111
111
|
const query = WorkspaceStateQuery.parse(context.req.query());
|
|
112
|
-
const
|
|
113
|
-
|
|
112
|
+
const access = await requireAccessGrantAuthorization(
|
|
113
|
+
context,
|
|
114
|
+
deps,
|
|
115
|
+
workspaceId,
|
|
116
|
+
"workspace:read",
|
|
117
|
+
);
|
|
118
|
+
const state = await readWorkspaceState(deps, { workspaceId, query, access });
|
|
114
119
|
context.header("cache-control", "private, no-store");
|
|
115
120
|
return context.json(state);
|
|
116
121
|
});
|
|
@@ -118,14 +123,22 @@ export function registerWorkspaceStateRoutes(app: Hono, deps: ApiRouteDeps): voi
|
|
|
118
123
|
app.get(`${base}/export`, async (context) => {
|
|
119
124
|
const workspaceId = context.req.param("workspaceId");
|
|
120
125
|
const query = WorkspaceStateQuery.parse(context.req.query());
|
|
121
|
-
const
|
|
122
|
-
|
|
126
|
+
const access = await requireAccessGrantAuthorization(
|
|
127
|
+
context,
|
|
128
|
+
deps,
|
|
129
|
+
workspaceId,
|
|
130
|
+
"workspace:read",
|
|
131
|
+
);
|
|
132
|
+
const state = await readWorkspaceState(deps, { workspaceId, query, access });
|
|
123
133
|
context.header("cache-control", "private, no-store");
|
|
124
134
|
context.header("content-type", "application/json; charset=utf-8");
|
|
125
135
|
context.header(
|
|
126
136
|
"content-disposition",
|
|
127
137
|
`attachment; filename="workspace-state-${workspaceId}-sanitized.json"`,
|
|
128
138
|
);
|
|
139
|
+
for (const [name, value] of Object.entries(USER_CONTENT_SECURITY_HEADERS)) {
|
|
140
|
+
context.header(name, value);
|
|
141
|
+
}
|
|
129
142
|
return context.body(serializeWorkspaceStateExport(state));
|
|
130
143
|
});
|
|
131
144
|
}
|