@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
|
@@ -1,18 +1,35 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
1
2
|
import {
|
|
2
3
|
CreateScheduledTaskRequest,
|
|
4
|
+
RefreshScheduledTaskAccessRequest,
|
|
5
|
+
ScheduledTaskSlackChannelId,
|
|
6
|
+
ScheduledTaskSlackChannelListResponse,
|
|
3
7
|
TriggerScheduledTaskRequest,
|
|
4
8
|
UpdateScheduledTaskRequest,
|
|
9
|
+
type AccessGrant,
|
|
5
10
|
} from "@opengeni/contracts";
|
|
6
11
|
import {
|
|
7
|
-
|
|
12
|
+
getScheduledTaskRevisionAuthoritySubject,
|
|
8
13
|
listScheduledTaskRuns,
|
|
9
14
|
listScheduledTasks,
|
|
10
|
-
updateScheduledTask,
|
|
11
15
|
} from "@opengeni/db";
|
|
12
16
|
import type { Hono } from "hono";
|
|
17
|
+
import type { ScheduledTask } from "@opengeni/contracts";
|
|
13
18
|
import { HTTPException } from "hono/http-exception";
|
|
14
|
-
import {
|
|
15
|
-
|
|
19
|
+
import {
|
|
20
|
+
isAuthenticatedPersonAuthorization,
|
|
21
|
+
requireAccessGrant,
|
|
22
|
+
requireAccessGrantAuthorization,
|
|
23
|
+
requirePermission,
|
|
24
|
+
resolveWorkspaceCatalogSettings,
|
|
25
|
+
validateOpenGeniSlackBotConnectionSelection,
|
|
26
|
+
type ScheduledTaskSlackChannelVerifier,
|
|
27
|
+
} from "@opengeni/core";
|
|
28
|
+
import {
|
|
29
|
+
recordWorkspaceUsage,
|
|
30
|
+
requireLimit,
|
|
31
|
+
resolveScheduledTaskPreflightModel,
|
|
32
|
+
} from "@opengeni/core";
|
|
16
33
|
import type { ApiRouteDeps } from "@opengeni/core";
|
|
17
34
|
import {
|
|
18
35
|
captureScheduledTaskRestoreState,
|
|
@@ -26,20 +43,152 @@ import {
|
|
|
26
43
|
requireScheduledTaskForApi,
|
|
27
44
|
syncCreatedScheduledTask,
|
|
28
45
|
syncUpdatedScheduledTask,
|
|
46
|
+
updateScheduledTaskForApi,
|
|
47
|
+
triggerScheduledTaskForGrant,
|
|
48
|
+
validateScheduledTaskMachineTarget,
|
|
29
49
|
validateScheduledTaskTarget,
|
|
30
50
|
validatedScheduledTaskUpdate,
|
|
51
|
+
listScheduledTaskAccessAttention,
|
|
52
|
+
refreshScheduledTaskAccess,
|
|
53
|
+
scheduledTaskAccessSource,
|
|
54
|
+
withScheduledTaskPolicyDrift,
|
|
55
|
+
withScheduledTaskRunAccessFailures,
|
|
31
56
|
} from "@opengeni/core";
|
|
57
|
+
import type { AccessGrantAuthorization } from "@opengeni/core";
|
|
32
58
|
import { boundedLimit } from "../http/common";
|
|
33
|
-
import {
|
|
34
|
-
import {
|
|
59
|
+
import { permissionsRequiredByFirstPartyTools } from "../mcp/first-party-tool-permissions";
|
|
60
|
+
import {
|
|
61
|
+
createOpenGeniSlackBotInteractionClient,
|
|
62
|
+
verifyScheduledTaskSlackChannel,
|
|
63
|
+
} from "../integrations/slack-bot";
|
|
64
|
+
import { deleteScheduledTaskWithDurableCleanup } from "../scheduled-task-deletion";
|
|
65
|
+
import { parseRequestBody, readRequestJson } from "../http/request-body";
|
|
35
66
|
|
|
36
67
|
export function registerScheduledTaskRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
37
|
-
const {
|
|
68
|
+
const { db, workflowClient, objectStorage } = deps;
|
|
69
|
+
const slackChannelVerifier =
|
|
70
|
+
(grant: AccessGrant): ScheduledTaskSlackChannelVerifier =>
|
|
71
|
+
async ({ connectionId, channelId }) =>
|
|
72
|
+
await verifyScheduledTaskSlackChannel(deps, {
|
|
73
|
+
accountId: grant.accountId,
|
|
74
|
+
workspaceId: grant.workspaceId,
|
|
75
|
+
subjectId: grant.subjectId,
|
|
76
|
+
connectionId,
|
|
77
|
+
channelId,
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
// Channels a person may choose as a task's fixed Slack destination: active,
|
|
81
|
+
// non-shared channels the selected OpenGeni bot already belongs to.
|
|
82
|
+
app.get("/v1/workspaces/:workspaceId/scheduled-task-slack-channels", async (c) => {
|
|
83
|
+
const workspaceId = c.req.param("workspaceId");
|
|
84
|
+
const authorization = await requireAccessGrantAuthorization(
|
|
85
|
+
c,
|
|
86
|
+
deps,
|
|
87
|
+
workspaceId,
|
|
88
|
+
"scheduled_tasks:manage",
|
|
89
|
+
);
|
|
90
|
+
const grant = authorization.grant;
|
|
91
|
+
requirePermission(grant, "connections:write");
|
|
92
|
+
if (!isAuthenticatedPersonAuthorization(authorization)) {
|
|
93
|
+
throw new HTTPException(403, {
|
|
94
|
+
message: "Only a person can choose the Slack channel a scheduled task posts to",
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
const connectionId = c.req.query("connectionId");
|
|
98
|
+
if (!connectionId || !z.string().uuid().safeParse(connectionId).success) {
|
|
99
|
+
throw new HTTPException(400, { message: "connectionId is required" });
|
|
100
|
+
}
|
|
101
|
+
const cursor = c.req.query("cursor");
|
|
102
|
+
if (cursor !== undefined && cursor.length > 1_024) {
|
|
103
|
+
throw new HTTPException(400, { message: "invalid cursor" });
|
|
104
|
+
}
|
|
105
|
+
await validateOpenGeniSlackBotConnectionSelection(db, grant, workspaceId, connectionId);
|
|
106
|
+
const client = await createOpenGeniSlackBotInteractionClient(deps, {
|
|
107
|
+
accountId: grant.accountId,
|
|
108
|
+
workspaceId,
|
|
109
|
+
connectionId,
|
|
110
|
+
subjectId: grant.subjectId,
|
|
111
|
+
});
|
|
112
|
+
const result = await client.listChannels({ limit: 200, ...(cursor ? { cursor } : {}) });
|
|
113
|
+
c.header("cache-control", "private, no-store");
|
|
114
|
+
return c.json(
|
|
115
|
+
ScheduledTaskSlackChannelListResponse.parse({
|
|
116
|
+
channels: result.channels
|
|
117
|
+
.filter(
|
|
118
|
+
(channel) =>
|
|
119
|
+
channel.isMember &&
|
|
120
|
+
!channel.isArchived &&
|
|
121
|
+
!channel.isShared &&
|
|
122
|
+
!channel.isExternallyShared &&
|
|
123
|
+
!channel.isOrgShared &&
|
|
124
|
+
ScheduledTaskSlackChannelId.safeParse(channel.id).success,
|
|
125
|
+
)
|
|
126
|
+
.map((channel) => ({ id: channel.id, name: channel.name, isPrivate: channel.isPrivate })),
|
|
127
|
+
nextCursor: result.nextCursor || null,
|
|
128
|
+
}),
|
|
129
|
+
);
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
// Drift is advisory: it is attached for viewers who can act on a task and
|
|
133
|
+
// never fails the read it decorates.
|
|
134
|
+
async function withPolicyDrift(
|
|
135
|
+
authorization: AccessGrantAuthorization,
|
|
136
|
+
tasks: ScheduledTask[],
|
|
137
|
+
): Promise<ScheduledTask[]> {
|
|
138
|
+
if (!tasks.some((task) => scheduledTaskAccessSource(task, authorization.grant))) {
|
|
139
|
+
return tasks;
|
|
140
|
+
}
|
|
141
|
+
const catalogSettings = (
|
|
142
|
+
await resolveWorkspaceCatalogSettings(db, deps.settings, {
|
|
143
|
+
accountId: authorization.grant.accountId,
|
|
144
|
+
workspaceId: authorization.grant.workspaceId,
|
|
145
|
+
})
|
|
146
|
+
).settings;
|
|
147
|
+
return await withScheduledTaskPolicyDrift({
|
|
148
|
+
db,
|
|
149
|
+
settings: catalogSettings,
|
|
150
|
+
authorization,
|
|
151
|
+
tasks,
|
|
152
|
+
permissionsRequiredByTools: permissionsRequiredByFirstPartyTools,
|
|
153
|
+
onError: (error) => {
|
|
154
|
+
deps.observability?.warn("Scheduled task access drift could not be computed", {
|
|
155
|
+
errorClass: error instanceof Error ? error.name : "ScheduledTaskPolicyDriftError",
|
|
156
|
+
origin: "api",
|
|
157
|
+
});
|
|
158
|
+
},
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// Registered before `/:taskId` so the literal segment is never read as an id.
|
|
163
|
+
app.get("/v1/workspaces/:workspaceId/scheduled-tasks/attention", async (c) => {
|
|
164
|
+
const workspaceId = c.req.param("workspaceId");
|
|
165
|
+
const grant = await requireAccessGrant(c, deps, workspaceId, "scheduled_tasks:run");
|
|
166
|
+
// The account plan reads only the MCP registry and tool defaults, which the
|
|
167
|
+
// model catalog does not change, so the deployment settings suffice here.
|
|
168
|
+
const tasks = await listScheduledTaskAccessAttention({
|
|
169
|
+
db,
|
|
170
|
+
settings: deps.settings,
|
|
171
|
+
grant,
|
|
172
|
+
onError: (error) => {
|
|
173
|
+
deps.observability?.warn("Scheduled task account availability could not be computed", {
|
|
174
|
+
errorClass: error instanceof Error ? error.name : "ScheduledTaskAccessAttentionError",
|
|
175
|
+
origin: "api",
|
|
176
|
+
});
|
|
177
|
+
},
|
|
178
|
+
});
|
|
179
|
+
return c.json({ tasks });
|
|
180
|
+
});
|
|
38
181
|
|
|
39
182
|
app.post("/v1/workspaces/:workspaceId/scheduled-tasks", async (c) => {
|
|
40
183
|
const workspaceId = c.req.param("workspaceId");
|
|
41
|
-
const
|
|
42
|
-
|
|
184
|
+
const authorization = await requireAccessGrantAuthorization(
|
|
185
|
+
c,
|
|
186
|
+
deps,
|
|
187
|
+
workspaceId,
|
|
188
|
+
"scheduled_tasks:manage",
|
|
189
|
+
);
|
|
190
|
+
const grant = authorization.grant;
|
|
191
|
+
const rawPayload = await readRequestJson(c);
|
|
43
192
|
const parsedPayload = CreateScheduledTaskRequest.safeParse(rawPayload);
|
|
44
193
|
if (!parsedPayload.success) {
|
|
45
194
|
throw new HTTPException(400, {
|
|
@@ -47,6 +196,12 @@ export function registerScheduledTaskRoutes(app: Hono, deps: ApiRouteDeps): void
|
|
|
47
196
|
});
|
|
48
197
|
}
|
|
49
198
|
const payload = parsedPayload.data;
|
|
199
|
+
const catalogSettings = (
|
|
200
|
+
await resolveWorkspaceCatalogSettings(db, deps.settings, {
|
|
201
|
+
accountId: grant.accountId,
|
|
202
|
+
workspaceId,
|
|
203
|
+
})
|
|
204
|
+
).settings;
|
|
50
205
|
await requireLimit(deps, {
|
|
51
206
|
accountId: grant.accountId,
|
|
52
207
|
workspaceId,
|
|
@@ -54,14 +209,16 @@ export function registerScheduledTaskRoutes(app: Hono, deps: ApiRouteDeps): void
|
|
|
54
209
|
quantity: 1,
|
|
55
210
|
});
|
|
56
211
|
const task = await createValidatedScheduledTask({
|
|
57
|
-
settings,
|
|
212
|
+
settings: catalogSettings,
|
|
58
213
|
db,
|
|
59
214
|
objectStorage,
|
|
60
215
|
grant,
|
|
216
|
+
authorization,
|
|
61
217
|
payload,
|
|
62
218
|
toolsProvided: scheduledTaskToolsProvided(rawPayload),
|
|
63
219
|
sessionAuthorization: deps.sessionAuthorization,
|
|
64
220
|
authorizationSurface: "http",
|
|
221
|
+
verifySlackChannel: slackChannelVerifier(grant),
|
|
65
222
|
});
|
|
66
223
|
await syncCreatedScheduledTask({ db, workflowClient, task });
|
|
67
224
|
return c.json(scheduledTaskForGrant(task, grant), 201);
|
|
@@ -69,25 +226,104 @@ export function registerScheduledTaskRoutes(app: Hono, deps: ApiRouteDeps): void
|
|
|
69
226
|
|
|
70
227
|
app.get("/v1/workspaces/:workspaceId/scheduled-tasks", async (c) => {
|
|
71
228
|
const workspaceId = c.req.param("workspaceId");
|
|
72
|
-
const
|
|
73
|
-
|
|
74
|
-
|
|
229
|
+
const authorization = await requireAccessGrantAuthorization(
|
|
230
|
+
c,
|
|
231
|
+
deps,
|
|
232
|
+
workspaceId,
|
|
233
|
+
"scheduled_tasks:run",
|
|
234
|
+
);
|
|
235
|
+
const grant = authorization.grant;
|
|
236
|
+
const sessionId = c.req.query("sessionId");
|
|
237
|
+
const offset = Number(c.req.query("offset") ?? 0);
|
|
238
|
+
if (!Number.isSafeInteger(offset) || offset < 0) {
|
|
239
|
+
throw new HTTPException(400, { message: "invalid offset" });
|
|
240
|
+
}
|
|
241
|
+
if (sessionId !== undefined) {
|
|
242
|
+
if (!z.string().uuid().safeParse(sessionId).success) {
|
|
243
|
+
throw new HTTPException(400, { message: "invalid sessionId" });
|
|
244
|
+
}
|
|
245
|
+
await requireAccessGrant(c, deps, workspaceId, "sessions:control");
|
|
246
|
+
}
|
|
247
|
+
const tasks = await listScheduledTasks(
|
|
248
|
+
db,
|
|
249
|
+
workspaceId,
|
|
250
|
+
boundedLimit(c.req.query("limit")),
|
|
251
|
+
offset,
|
|
252
|
+
sessionId,
|
|
253
|
+
);
|
|
254
|
+
return c.json(
|
|
255
|
+
(await withPolicyDrift(authorization, tasks)).map((task) =>
|
|
256
|
+
scheduledTaskForGrant(task, grant),
|
|
257
|
+
),
|
|
258
|
+
);
|
|
75
259
|
});
|
|
76
260
|
|
|
77
261
|
app.get("/v1/workspaces/:workspaceId/scheduled-tasks/:taskId", async (c) => {
|
|
78
262
|
const workspaceId = c.req.param("workspaceId");
|
|
79
|
-
const
|
|
263
|
+
const authorization = await requireAccessGrantAuthorization(
|
|
264
|
+
c,
|
|
265
|
+
deps,
|
|
266
|
+
workspaceId,
|
|
267
|
+
"scheduled_tasks:run",
|
|
268
|
+
);
|
|
269
|
+
const grant = authorization.grant;
|
|
80
270
|
const task = await requireScheduledTaskForApi(db, workspaceId, c.req.param("taskId"));
|
|
81
|
-
|
|
271
|
+
const [withDrift] = await withPolicyDrift(authorization, [task]);
|
|
272
|
+
return c.json(scheduledTaskForGrant(withDrift ?? task, grant));
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
// The owner's explicit access refresh: re-freeze connectors, connector
|
|
276
|
+
// accounts and an agent-created task's OpenGeni tools with the calling
|
|
277
|
+
// person's current authority. It changes neither the schedule nor its
|
|
278
|
+
// status, so the Temporal schedule is untouched.
|
|
279
|
+
app.post("/v1/workspaces/:workspaceId/scheduled-tasks/:taskId/refresh-access", async (c) => {
|
|
280
|
+
const workspaceId = c.req.param("workspaceId");
|
|
281
|
+
const authorization = await requireAccessGrantAuthorization(
|
|
282
|
+
c,
|
|
283
|
+
deps,
|
|
284
|
+
workspaceId,
|
|
285
|
+
"scheduled_tasks:manage",
|
|
286
|
+
);
|
|
287
|
+
const parsed = RefreshScheduledTaskAccessRequest.safeParse(
|
|
288
|
+
await c.req.json().catch(() => null),
|
|
289
|
+
);
|
|
290
|
+
if (!parsed.success) {
|
|
291
|
+
throw new HTTPException(400, { message: "invalid scheduled task access refresh request" });
|
|
292
|
+
}
|
|
293
|
+
const catalogSettings = (
|
|
294
|
+
await resolveWorkspaceCatalogSettings(db, deps.settings, {
|
|
295
|
+
accountId: authorization.grant.accountId,
|
|
296
|
+
workspaceId,
|
|
297
|
+
})
|
|
298
|
+
).settings;
|
|
299
|
+
const task = await refreshScheduledTaskAccess({
|
|
300
|
+
settings: catalogSettings,
|
|
301
|
+
db,
|
|
302
|
+
objectStorage,
|
|
303
|
+
authorization,
|
|
304
|
+
taskId: c.req.param("taskId"),
|
|
305
|
+
request: parsed.data,
|
|
306
|
+
permissionsRequiredByTools: permissionsRequiredByFirstPartyTools,
|
|
307
|
+
sessionAuthorization: deps.sessionAuthorization,
|
|
308
|
+
authorizationSurface: "http",
|
|
309
|
+
});
|
|
310
|
+
const [withDrift] = await withPolicyDrift(authorization, [task]);
|
|
311
|
+
return c.json(scheduledTaskForGrant(withDrift ?? task, authorization.grant));
|
|
82
312
|
});
|
|
83
313
|
|
|
84
314
|
app.patch("/v1/workspaces/:workspaceId/scheduled-tasks/:taskId", async (c) => {
|
|
85
315
|
const workspaceId = c.req.param("workspaceId");
|
|
86
|
-
const
|
|
316
|
+
const authorization = await requireAccessGrantAuthorization(
|
|
317
|
+
c,
|
|
318
|
+
deps,
|
|
319
|
+
workspaceId,
|
|
320
|
+
"scheduled_tasks:manage",
|
|
321
|
+
);
|
|
322
|
+
const grant = authorization.grant;
|
|
87
323
|
const taskId = c.req.param("taskId");
|
|
88
324
|
const existing = await requireScheduledTaskForApi(db, workspaceId, taskId);
|
|
89
325
|
const previous = await captureScheduledTaskRestoreState(db, existing);
|
|
90
|
-
const rawPayload = await c
|
|
326
|
+
const rawPayload = await readRequestJson(c);
|
|
91
327
|
const parsedPayload = UpdateScheduledTaskRequest.safeParse(rawPayload);
|
|
92
328
|
if (!parsedPayload.success) {
|
|
93
329
|
throw new HTTPException(400, {
|
|
@@ -95,18 +331,34 @@ export function registerScheduledTaskRoutes(app: Hono, deps: ApiRouteDeps): void
|
|
|
95
331
|
});
|
|
96
332
|
}
|
|
97
333
|
const payload = parsedPayload.data;
|
|
334
|
+
const catalogSettings = (
|
|
335
|
+
await resolveWorkspaceCatalogSettings(db, deps.settings, {
|
|
336
|
+
accountId: grant.accountId,
|
|
337
|
+
workspaceId,
|
|
338
|
+
})
|
|
339
|
+
).settings;
|
|
98
340
|
const update = await validatedScheduledTaskUpdate({
|
|
99
|
-
settings,
|
|
341
|
+
settings: catalogSettings,
|
|
100
342
|
db,
|
|
101
343
|
objectStorage,
|
|
102
344
|
grant,
|
|
103
345
|
existing,
|
|
346
|
+
authorization,
|
|
104
347
|
payload,
|
|
105
348
|
toolsProvided: scheduledTaskToolsProvided(rawPayload),
|
|
106
349
|
sessionAuthorization: deps.sessionAuthorization,
|
|
107
350
|
authorizationSurface: "http",
|
|
351
|
+
verifySlackChannel: slackChannelVerifier(grant),
|
|
108
352
|
});
|
|
109
|
-
const task = await
|
|
353
|
+
const task = await updateScheduledTaskForApi(
|
|
354
|
+
db,
|
|
355
|
+
grant,
|
|
356
|
+
taskId,
|
|
357
|
+
update,
|
|
358
|
+
payload.agentLearning
|
|
359
|
+
? { authorization, request: payload.agentLearning, restoreState: previous }
|
|
360
|
+
: undefined,
|
|
361
|
+
);
|
|
110
362
|
await syncUpdatedScheduledTask({ db, workflowClient, previous, task });
|
|
111
363
|
return c.json(scheduledTaskForGrant(task, grant));
|
|
112
364
|
});
|
|
@@ -116,7 +368,7 @@ export function registerScheduledTaskRoutes(app: Hono, deps: ApiRouteDeps): void
|
|
|
116
368
|
const grant = await requireAccessGrant(c, deps, workspaceId, "scheduled_tasks:manage");
|
|
117
369
|
const existing = await requireScheduledTaskForApi(db, workspaceId, c.req.param("taskId"));
|
|
118
370
|
const previous = await captureScheduledTaskRestoreState(db, existing);
|
|
119
|
-
const task = await
|
|
371
|
+
const task = await updateScheduledTaskForApi(db, grant, existing.id, {
|
|
120
372
|
status: "paused",
|
|
121
373
|
});
|
|
122
374
|
await syncUpdatedScheduledTask({ db, workflowClient, previous, task });
|
|
@@ -125,12 +377,33 @@ export function registerScheduledTaskRoutes(app: Hono, deps: ApiRouteDeps): void
|
|
|
125
377
|
|
|
126
378
|
app.post("/v1/workspaces/:workspaceId/scheduled-tasks/:taskId/resume", async (c) => {
|
|
127
379
|
const workspaceId = c.req.param("workspaceId");
|
|
128
|
-
const
|
|
380
|
+
const authorization = await requireAccessGrantAuthorization(
|
|
381
|
+
c,
|
|
382
|
+
deps,
|
|
383
|
+
workspaceId,
|
|
384
|
+
"scheduled_tasks:manage",
|
|
385
|
+
);
|
|
386
|
+
const grant = authorization.grant;
|
|
129
387
|
const existing = await requireScheduledTaskForApi(db, workspaceId, c.req.param("taskId"));
|
|
130
388
|
const previous = await captureScheduledTaskRestoreState(db, existing);
|
|
131
|
-
const
|
|
132
|
-
|
|
389
|
+
const catalogSettings = (
|
|
390
|
+
await resolveWorkspaceCatalogSettings(db, deps.settings, {
|
|
391
|
+
accountId: grant.accountId,
|
|
392
|
+
workspaceId,
|
|
393
|
+
})
|
|
394
|
+
).settings;
|
|
395
|
+
const update = await validatedScheduledTaskUpdate({
|
|
396
|
+
settings: catalogSettings,
|
|
397
|
+
db,
|
|
398
|
+
objectStorage,
|
|
399
|
+
grant,
|
|
400
|
+
existing,
|
|
401
|
+
payload: { status: "active" },
|
|
402
|
+
authorization,
|
|
403
|
+
sessionAuthorization: deps.sessionAuthorization,
|
|
404
|
+
authorizationSurface: "http",
|
|
133
405
|
});
|
|
406
|
+
const task = await updateScheduledTaskForApi(db, grant, existing.id, update);
|
|
134
407
|
await syncUpdatedScheduledTask({ db, workflowClient, previous, task });
|
|
135
408
|
return c.json(scheduledTaskForGrant(task, grant));
|
|
136
409
|
});
|
|
@@ -142,6 +415,12 @@ export function registerScheduledTaskRoutes(app: Hono, deps: ApiRouteDeps): void
|
|
|
142
415
|
// recognised as codex-billed and skip the credit/cost gates at the edge.
|
|
143
416
|
const task = await requireScheduledTaskForApi(db, workspaceId, c.req.param("taskId"));
|
|
144
417
|
if (task.action.kind === "agent_turn") {
|
|
418
|
+
const catalogSettings = (
|
|
419
|
+
await resolveWorkspaceCatalogSettings(db, deps.settings, {
|
|
420
|
+
accountId: grant.accountId,
|
|
421
|
+
workspaceId,
|
|
422
|
+
})
|
|
423
|
+
).settings;
|
|
145
424
|
await validateScheduledTaskTarget({
|
|
146
425
|
db,
|
|
147
426
|
sessionAuthorization: deps.sessionAuthorization,
|
|
@@ -154,25 +433,50 @@ export function registerScheduledTaskRoutes(app: Hono, deps: ApiRouteDeps): void
|
|
|
154
433
|
agentConfig: task.agentConfig,
|
|
155
434
|
missingTargetStatus: 404,
|
|
156
435
|
});
|
|
157
|
-
await
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
436
|
+
await validateScheduledTaskMachineTarget({
|
|
437
|
+
settings: catalogSettings,
|
|
438
|
+
db,
|
|
439
|
+
grant,
|
|
440
|
+
runMode: task.runMode,
|
|
441
|
+
agentConfig: task.agentConfig,
|
|
442
|
+
requireOnline: true,
|
|
443
|
+
});
|
|
444
|
+
const taskAuthoritySubjectId = await getScheduledTaskRevisionAuthoritySubject(db, {
|
|
445
|
+
accountId: task.accountId,
|
|
446
|
+
workspaceId: task.workspaceId,
|
|
447
|
+
taskId: task.id,
|
|
448
|
+
taskAuthorityRevision: task.authorityRevision,
|
|
163
449
|
});
|
|
450
|
+
await requireLimit(
|
|
451
|
+
{ ...deps, settings: catalogSettings },
|
|
452
|
+
{
|
|
453
|
+
accountId: grant.accountId,
|
|
454
|
+
workspaceId,
|
|
455
|
+
// A manual trigger does not transfer the task's frozen human to
|
|
456
|
+
// the triggering administrator. Unavailable authority is refused
|
|
457
|
+
// visibly by worker dispatch; this edge still checks the workspace.
|
|
458
|
+
initiatingHumanSubjectId:
|
|
459
|
+
taskAuthoritySubjectId === task.ownerSubjectId ? taskAuthoritySubjectId : null,
|
|
460
|
+
action: "agent_run:create",
|
|
461
|
+
quantity: 1,
|
|
462
|
+
// A model-less task is checked against the model its occurrence
|
|
463
|
+
// will run (a connected subscription, the credits default, or the
|
|
464
|
+
// deployment default), not always the deployment default.
|
|
465
|
+
model: await resolveScheduledTaskPreflightModel(db, catalogSettings, task),
|
|
466
|
+
},
|
|
467
|
+
);
|
|
164
468
|
}
|
|
165
469
|
// Body is optional (a bare POST is still a valid trigger); only a present,
|
|
166
470
|
// non-empty body must parse against the contract.
|
|
167
471
|
const body = await c.req.json().catch(() => ({}));
|
|
168
|
-
const { triggerId } = TriggerScheduledTaskRequest
|
|
472
|
+
const { triggerId } = parseRequestBody(TriggerScheduledTaskRequest, body ?? {});
|
|
169
473
|
const triggerToken = scheduledTaskTriggerToken(triggerId);
|
|
170
474
|
const agentRunUsageIdempotencyKey =
|
|
171
475
|
task.action.kind === "agent_turn"
|
|
172
476
|
? manualScheduledTaskTriggerUsageKey(workspaceId, task.id, triggerToken)
|
|
173
477
|
: `knowledge-source-sync:manual:${workspaceId}:${task.id}:${triggerToken}`;
|
|
174
478
|
const triggerWorkflowId = manualScheduledTaskTriggerWorkflowId(task.id, triggerToken);
|
|
175
|
-
await workflowClient
|
|
479
|
+
await triggerScheduledTaskForGrant(db, grant, workflowClient, {
|
|
176
480
|
task,
|
|
177
481
|
agentRunUsageIdempotencyKey,
|
|
178
482
|
triggerWorkflowId,
|
|
@@ -197,16 +501,10 @@ export function registerScheduledTaskRoutes(app: Hono, deps: ApiRouteDeps): void
|
|
|
197
501
|
app.delete("/v1/workspaces/:workspaceId/scheduled-tasks/:taskId", async (c) => {
|
|
198
502
|
const workspaceId = c.req.param("workspaceId");
|
|
199
503
|
const grant = await requireAccessGrant(c, deps, workspaceId, "scheduled_tasks:manage");
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
} else {
|
|
204
|
-
await revokeKnowledgeSourceScheduleAuthorization(deps, { task, subjectId: grant.subjectId });
|
|
205
|
-
}
|
|
206
|
-
await workflowClient.deleteScheduledTaskSchedule({
|
|
207
|
-
temporalScheduleId: task.temporalScheduleId,
|
|
504
|
+
await deleteScheduledTaskWithDurableCleanup(deps, {
|
|
505
|
+
grant,
|
|
506
|
+
taskId: c.req.param("taskId"),
|
|
208
507
|
});
|
|
209
|
-
await deleteScheduledTask(db, workspaceId, task.id);
|
|
210
508
|
return c.json({ ok: true });
|
|
211
509
|
});
|
|
212
510
|
|
|
@@ -220,6 +518,13 @@ export function registerScheduledTaskRoutes(app: Hono, deps: ApiRouteDeps): void
|
|
|
220
518
|
task.id,
|
|
221
519
|
boundedLimit(c.req.query("limit")),
|
|
222
520
|
);
|
|
223
|
-
|
|
521
|
+
const runs = await withScheduledTaskRunAccessFailures({
|
|
522
|
+
db,
|
|
523
|
+
settings: deps.settings,
|
|
524
|
+
grant,
|
|
525
|
+
task,
|
|
526
|
+
runs: taskRuns,
|
|
527
|
+
});
|
|
528
|
+
return c.json(runs.map((run) => scheduledTaskRunForGrant(run, grant)));
|
|
224
529
|
});
|
|
225
530
|
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import {
|
|
2
|
+
requireAccessGrant,
|
|
3
|
+
requirePermission,
|
|
4
|
+
requireSessionAuthorization,
|
|
5
|
+
SessionAuthorizationDeniedError,
|
|
6
|
+
SessionAuthorizationUnavailableError,
|
|
7
|
+
type ApiRouteDeps,
|
|
8
|
+
} from "@opengeni/core";
|
|
9
|
+
import {
|
|
10
|
+
hasEditableArtifactSessionLink,
|
|
11
|
+
hasWorkspaceArtifactSessionLink,
|
|
12
|
+
transactionallyAuthorizeEditableArtifactActor,
|
|
13
|
+
withRlsContext,
|
|
14
|
+
} from "@opengeni/db";
|
|
15
|
+
import type { Hono } from "hono";
|
|
16
|
+
import { HTTPException } from "hono/http-exception";
|
|
17
|
+
import { z } from "zod";
|
|
18
|
+
import { withAccessGrantSessionRlsContext } from "../access-grant-rls";
|
|
19
|
+
import { editableArtifactActorForGrant } from "./editable-artifacts";
|
|
20
|
+
|
|
21
|
+
const SessionId = z.string().uuid();
|
|
22
|
+
const EditableArtifactId = z.string().regex(/^(?!0{32}$)[0-9a-f]{32}$/u);
|
|
23
|
+
|
|
24
|
+
/** Exact authorized membership proof, not a paginated artifact discovery API. */
|
|
25
|
+
export function registerSessionArtifactAssociationRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
26
|
+
app.get(
|
|
27
|
+
"/v1/workspaces/:workspaceId/sessions/:sessionId/artifact-associations/:artifactId",
|
|
28
|
+
async (context) => {
|
|
29
|
+
const workspaceId = context.req.param("workspaceId");
|
|
30
|
+
const grant = await requireAccessGrant(context, deps, workspaceId, "artifacts:read");
|
|
31
|
+
requirePermission(grant, "sessions:read");
|
|
32
|
+
const sessionId = context.req.param("sessionId");
|
|
33
|
+
const artifactId = context.req.param("artifactId");
|
|
34
|
+
const kind = EditableArtifactId.safeParse(artifactId).success
|
|
35
|
+
? "editable"
|
|
36
|
+
: SessionId.safeParse(artifactId).success
|
|
37
|
+
? "site"
|
|
38
|
+
: null;
|
|
39
|
+
const requestedKind = context.req.query("kind");
|
|
40
|
+
if (
|
|
41
|
+
!SessionId.safeParse(sessionId).success ||
|
|
42
|
+
!kind ||
|
|
43
|
+
(requestedKind !== undefined && requestedKind !== kind)
|
|
44
|
+
) {
|
|
45
|
+
throw new HTTPException(404, { message: "Artifact association not found" });
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
return await withAccessGrantSessionRlsContext(deps, grant, async () => {
|
|
49
|
+
await requireSessionAuthorization(deps, grant, {
|
|
50
|
+
sessionId,
|
|
51
|
+
operation: "session.read",
|
|
52
|
+
surface: "http",
|
|
53
|
+
});
|
|
54
|
+
const scope = { accountId: grant.accountId, workspaceId };
|
|
55
|
+
const linked =
|
|
56
|
+
kind === "editable"
|
|
57
|
+
? await hasEditableArtifactSessionLink(deps.db, scope, sessionId, artifactId)
|
|
58
|
+
: await hasWorkspaceArtifactSessionLink(deps.db, workspaceId, sessionId, artifactId);
|
|
59
|
+
if (!linked) throw new HTTPException(404, { message: "Artifact association not found" });
|
|
60
|
+
if (kind === "editable") {
|
|
61
|
+
const decision = await withRlsContext(deps.db, scope, (tx) =>
|
|
62
|
+
transactionallyAuthorizeEditableArtifactActor(tx, {
|
|
63
|
+
scope,
|
|
64
|
+
artifactId,
|
|
65
|
+
actor: editableArtifactActorForGrant(grant, "0000000000000001"),
|
|
66
|
+
permission: "read",
|
|
67
|
+
}),
|
|
68
|
+
);
|
|
69
|
+
if (!decision.allowed) {
|
|
70
|
+
throw new HTTPException(404, { message: "Artifact association not found" });
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
context.header("cache-control", "private, no-store");
|
|
74
|
+
return context.json({ sessionId, artifactId, kind });
|
|
75
|
+
});
|
|
76
|
+
} catch (error) {
|
|
77
|
+
if (error instanceof SessionAuthorizationDeniedError) {
|
|
78
|
+
throw new HTTPException(404, { message: "Artifact association not found" });
|
|
79
|
+
}
|
|
80
|
+
if (error instanceof SessionAuthorizationUnavailableError) {
|
|
81
|
+
throw new HTTPException(503, { message: "Session authorization is unavailable" });
|
|
82
|
+
}
|
|
83
|
+
throw error;
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
);
|
|
87
|
+
}
|