@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
|
@@ -1,19 +1,46 @@
|
|
|
1
|
+
import {
|
|
2
|
+
clearsLegacyVariableSet,
|
|
3
|
+
rejectLegacyVariableSetFields,
|
|
4
|
+
} from "../http/variable-sets-removed";
|
|
1
5
|
import { z } from "zod";
|
|
2
6
|
import {
|
|
3
7
|
CreateScheduledTaskRequest,
|
|
8
|
+
ListPrivateScheduledTaskSummariesResponse,
|
|
9
|
+
PrivateScheduledTaskSummary,
|
|
10
|
+
RefreshScheduledTaskAccessRequest,
|
|
11
|
+
ScheduledTaskSlackChannelId,
|
|
12
|
+
ScheduledTaskSlackChannelListResponse,
|
|
4
13
|
TriggerScheduledTaskRequest,
|
|
5
14
|
UpdateScheduledTaskRequest,
|
|
15
|
+
type AccessGrant,
|
|
6
16
|
} from "@opengeni/contracts";
|
|
7
|
-
import {
|
|
17
|
+
import {
|
|
18
|
+
getScheduledTaskBlockers,
|
|
19
|
+
getScheduledTaskIncludingDeleted,
|
|
20
|
+
getScheduledTaskRevisionAuthoritySubject,
|
|
21
|
+
listPrivateScheduledTaskSummaries,
|
|
22
|
+
listScheduledTaskRuns,
|
|
23
|
+
listScheduledTasks,
|
|
24
|
+
} from "@opengeni/db";
|
|
8
25
|
import type { Hono } from "hono";
|
|
26
|
+
import type { ScheduledTask } from "@opengeni/contracts";
|
|
9
27
|
import { HTTPException } from "hono/http-exception";
|
|
10
28
|
import {
|
|
29
|
+
isAuthenticatedPersonAuthorization,
|
|
11
30
|
requireAccessGrant,
|
|
12
31
|
requireAccessGrantAuthorization,
|
|
32
|
+
requirePermission,
|
|
13
33
|
resolveWorkspaceCatalogSettings,
|
|
34
|
+
validateOpenGeniSlackBotConnectionSelection,
|
|
35
|
+
type ScheduledTaskSlackChannelVerifier,
|
|
36
|
+
} from "@opengeni/core";
|
|
37
|
+
import {
|
|
38
|
+
recordWorkspaceUsage,
|
|
39
|
+
requireLimit,
|
|
40
|
+
resolveScheduledTaskPreflightModel,
|
|
14
41
|
} from "@opengeni/core";
|
|
15
|
-
import { recordWorkspaceUsage, requireLimit } from "@opengeni/core";
|
|
16
42
|
import type { ApiRouteDeps } from "@opengeni/core";
|
|
43
|
+
import { assertNotSiteClampedAgent } from "@opengeni/core";
|
|
17
44
|
import {
|
|
18
45
|
captureScheduledTaskRestoreState,
|
|
19
46
|
createValidatedScheduledTask,
|
|
@@ -23,19 +50,173 @@ import {
|
|
|
23
50
|
scheduledTaskForGrant,
|
|
24
51
|
scheduledTaskRunForGrant,
|
|
25
52
|
scheduledTaskTriggerToken,
|
|
26
|
-
|
|
53
|
+
pauseScheduledTaskAsAdmin,
|
|
54
|
+
pausePrivateScheduledTaskAsAdmin,
|
|
55
|
+
requirePausableScheduledTask,
|
|
56
|
+
requireVisibleScheduledTask,
|
|
57
|
+
scheduledTaskAccess,
|
|
58
|
+
scheduledTaskViewerForGrant,
|
|
27
59
|
syncCreatedScheduledTask,
|
|
28
60
|
syncUpdatedScheduledTask,
|
|
29
61
|
updateScheduledTaskForApi,
|
|
62
|
+
triggerScheduledTaskForGrant,
|
|
30
63
|
validateScheduledTaskMachineTarget,
|
|
31
64
|
validateScheduledTaskTarget,
|
|
32
65
|
validatedScheduledTaskUpdate,
|
|
66
|
+
listScheduledTaskAccessAttention,
|
|
67
|
+
refreshScheduledTaskAccess,
|
|
68
|
+
scheduledTaskAccessSource,
|
|
69
|
+
withScheduledTaskPolicyDrift,
|
|
70
|
+
withScheduledTaskRunAccessFailures,
|
|
33
71
|
} from "@opengeni/core";
|
|
72
|
+
import type { AccessGrantAuthorization } from "@opengeni/core";
|
|
34
73
|
import { boundedLimit } from "../http/common";
|
|
74
|
+
import { permissionsRequiredByFirstPartyTools } from "../mcp/first-party-tool-permissions";
|
|
75
|
+
import {
|
|
76
|
+
createOpenGeniSlackBotInteractionClient,
|
|
77
|
+
verifyScheduledTaskSlackChannel,
|
|
78
|
+
} from "../integrations/slack-bot";
|
|
35
79
|
import { deleteScheduledTaskWithDurableCleanup } from "../scheduled-task-deletion";
|
|
80
|
+
import { parseRequestBody, readRequestJson } from "../http/request-body";
|
|
36
81
|
|
|
37
82
|
export function registerScheduledTaskRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
38
83
|
const { db, workflowClient, objectStorage } = deps;
|
|
84
|
+
const slackChannelVerifier =
|
|
85
|
+
(grant: AccessGrant): ScheduledTaskSlackChannelVerifier =>
|
|
86
|
+
async ({ connectionId, channelId }) =>
|
|
87
|
+
await verifyScheduledTaskSlackChannel(deps, {
|
|
88
|
+
accountId: grant.accountId,
|
|
89
|
+
workspaceId: grant.workspaceId,
|
|
90
|
+
subjectId: grant.subjectId,
|
|
91
|
+
connectionId,
|
|
92
|
+
channelId,
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
// Channels a person may choose as a task's fixed Slack destination: active,
|
|
96
|
+
// non-shared channels the selected Opengeni bot already belongs to.
|
|
97
|
+
app.get("/v1/workspaces/:workspaceId/scheduled-task-slack-channels", async (c) => {
|
|
98
|
+
const workspaceId = c.req.param("workspaceId");
|
|
99
|
+
const authorization = await requireAccessGrantAuthorization(
|
|
100
|
+
c,
|
|
101
|
+
deps,
|
|
102
|
+
workspaceId,
|
|
103
|
+
"scheduled_tasks:manage",
|
|
104
|
+
);
|
|
105
|
+
const grant = authorization.grant;
|
|
106
|
+
requirePermission(grant, "connections:write");
|
|
107
|
+
if (!isAuthenticatedPersonAuthorization(authorization)) {
|
|
108
|
+
throw new HTTPException(403, {
|
|
109
|
+
message: "Only a person can choose the Slack channel a scheduled task posts to",
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
const connectionId = c.req.query("connectionId");
|
|
113
|
+
if (!connectionId || !z.string().uuid().safeParse(connectionId).success) {
|
|
114
|
+
throw new HTTPException(400, { message: "connectionId is required" });
|
|
115
|
+
}
|
|
116
|
+
const cursor = c.req.query("cursor");
|
|
117
|
+
if (cursor !== undefined && cursor.length > 1_024) {
|
|
118
|
+
throw new HTTPException(400, { message: "invalid cursor" });
|
|
119
|
+
}
|
|
120
|
+
await validateOpenGeniSlackBotConnectionSelection(db, grant, workspaceId, connectionId);
|
|
121
|
+
const client = await createOpenGeniSlackBotInteractionClient(deps, {
|
|
122
|
+
accountId: grant.accountId,
|
|
123
|
+
workspaceId,
|
|
124
|
+
connectionId,
|
|
125
|
+
subjectId: grant.subjectId,
|
|
126
|
+
});
|
|
127
|
+
const result = await client.listChannels({ limit: 200, ...(cursor ? { cursor } : {}) });
|
|
128
|
+
c.header("cache-control", "private, no-store");
|
|
129
|
+
return c.json(
|
|
130
|
+
ScheduledTaskSlackChannelListResponse.parse({
|
|
131
|
+
channels: result.channels
|
|
132
|
+
.filter(
|
|
133
|
+
(channel) =>
|
|
134
|
+
channel.isMember &&
|
|
135
|
+
!channel.isArchived &&
|
|
136
|
+
!channel.isShared &&
|
|
137
|
+
!channel.isExternallyShared &&
|
|
138
|
+
!channel.isOrgShared &&
|
|
139
|
+
ScheduledTaskSlackChannelId.safeParse(channel.id).success,
|
|
140
|
+
)
|
|
141
|
+
.map((channel) => ({ id: channel.id, name: channel.name, isPrivate: channel.isPrivate })),
|
|
142
|
+
nextCursor: result.nextCursor || null,
|
|
143
|
+
}),
|
|
144
|
+
);
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
// Drift is advisory: it is attached for viewers who can act on a task and
|
|
148
|
+
// never fails the read it decorates.
|
|
149
|
+
async function withPolicyDrift(
|
|
150
|
+
authorization: AccessGrantAuthorization,
|
|
151
|
+
tasks: ScheduledTask[],
|
|
152
|
+
): Promise<ScheduledTask[]> {
|
|
153
|
+
if (!tasks.some((task) => scheduledTaskAccessSource(task, authorization.grant))) {
|
|
154
|
+
return tasks;
|
|
155
|
+
}
|
|
156
|
+
const catalogSettings = (
|
|
157
|
+
await resolveWorkspaceCatalogSettings(db, deps.settings, {
|
|
158
|
+
accountId: authorization.grant.accountId,
|
|
159
|
+
workspaceId: authorization.grant.workspaceId,
|
|
160
|
+
})
|
|
161
|
+
).settings;
|
|
162
|
+
return await withScheduledTaskPolicyDrift({
|
|
163
|
+
db,
|
|
164
|
+
settings: catalogSettings,
|
|
165
|
+
authorization,
|
|
166
|
+
tasks,
|
|
167
|
+
permissionsRequiredByTools: permissionsRequiredByFirstPartyTools,
|
|
168
|
+
onError: (error) => {
|
|
169
|
+
deps.observability?.warn("Scheduled task access drift could not be computed", {
|
|
170
|
+
errorClass: error instanceof Error ? error.name : "ScheduledTaskPolicyDriftError",
|
|
171
|
+
origin: "api",
|
|
172
|
+
});
|
|
173
|
+
},
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Why a schedule paused itself or why its owner was told about it. Like
|
|
178
|
+
// drift, this decorates a read and never fails it.
|
|
179
|
+
async function withBlockers(tasks: ScheduledTask[]): Promise<ScheduledTask[]> {
|
|
180
|
+
const workspaceId = tasks[0]?.workspaceId;
|
|
181
|
+
if (!workspaceId) return tasks;
|
|
182
|
+
try {
|
|
183
|
+
const blockers = await getScheduledTaskBlockers(
|
|
184
|
+
db,
|
|
185
|
+
workspaceId,
|
|
186
|
+
tasks.map((task) => task.id),
|
|
187
|
+
);
|
|
188
|
+
return tasks.map((task) => {
|
|
189
|
+
const blocker = blockers.get(task.id);
|
|
190
|
+
return blocker ? { ...task, blocker } : task;
|
|
191
|
+
});
|
|
192
|
+
} catch (error) {
|
|
193
|
+
deps.observability?.warn("Scheduled task blockers could not be read", {
|
|
194
|
+
errorClass: error instanceof Error ? error.name : "ScheduledTaskBlockerReadError",
|
|
195
|
+
origin: "api",
|
|
196
|
+
});
|
|
197
|
+
return tasks;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// Registered before `/:taskId` so the literal segment is never read as an id.
|
|
202
|
+
app.get("/v1/workspaces/:workspaceId/scheduled-tasks/attention", async (c) => {
|
|
203
|
+
const workspaceId = c.req.param("workspaceId");
|
|
204
|
+
const grant = await requireAccessGrant(c, deps, workspaceId, "scheduled_tasks:run");
|
|
205
|
+
// The account plan reads only the MCP registry and tool defaults, which the
|
|
206
|
+
// model catalog does not change, so the deployment settings suffice here.
|
|
207
|
+
const tasks = await listScheduledTaskAccessAttention({
|
|
208
|
+
db,
|
|
209
|
+
settings: deps.settings,
|
|
210
|
+
grant,
|
|
211
|
+
onError: (error) => {
|
|
212
|
+
deps.observability?.warn("Scheduled task account availability could not be computed", {
|
|
213
|
+
errorClass: error instanceof Error ? error.name : "ScheduledTaskAccessAttentionError",
|
|
214
|
+
origin: "api",
|
|
215
|
+
});
|
|
216
|
+
},
|
|
217
|
+
});
|
|
218
|
+
return c.json({ tasks });
|
|
219
|
+
});
|
|
39
220
|
|
|
40
221
|
app.post("/v1/workspaces/:workspaceId/scheduled-tasks", async (c) => {
|
|
41
222
|
const workspaceId = c.req.param("workspaceId");
|
|
@@ -46,7 +227,9 @@ export function registerScheduledTaskRoutes(app: Hono, deps: ApiRouteDeps): void
|
|
|
46
227
|
"scheduled_tasks:manage",
|
|
47
228
|
);
|
|
48
229
|
const grant = authorization.grant;
|
|
49
|
-
const
|
|
230
|
+
const legacy = rejectLegacyVariableSetFields(c, await readRequestJson(c));
|
|
231
|
+
if ("response" in legacy) return legacy.response;
|
|
232
|
+
const rawPayload = legacy.payload;
|
|
50
233
|
const parsedPayload = CreateScheduledTaskRequest.safeParse(rawPayload);
|
|
51
234
|
if (!parsedPayload.success) {
|
|
52
235
|
throw new HTTPException(400, {
|
|
@@ -76,6 +259,7 @@ export function registerScheduledTaskRoutes(app: Hono, deps: ApiRouteDeps): void
|
|
|
76
259
|
toolsProvided: scheduledTaskToolsProvided(rawPayload),
|
|
77
260
|
sessionAuthorization: deps.sessionAuthorization,
|
|
78
261
|
authorizationSurface: "http",
|
|
262
|
+
verifySlackChannel: slackChannelVerifier(grant),
|
|
79
263
|
});
|
|
80
264
|
await syncCreatedScheduledTask({ db, workflowClient, task });
|
|
81
265
|
return c.json(scheduledTaskForGrant(task, grant), 201);
|
|
@@ -83,7 +267,13 @@ export function registerScheduledTaskRoutes(app: Hono, deps: ApiRouteDeps): void
|
|
|
83
267
|
|
|
84
268
|
app.get("/v1/workspaces/:workspaceId/scheduled-tasks", async (c) => {
|
|
85
269
|
const workspaceId = c.req.param("workspaceId");
|
|
86
|
-
const
|
|
270
|
+
const authorization = await requireAccessGrantAuthorization(
|
|
271
|
+
c,
|
|
272
|
+
deps,
|
|
273
|
+
workspaceId,
|
|
274
|
+
"scheduled_tasks:run",
|
|
275
|
+
);
|
|
276
|
+
const grant = authorization.grant;
|
|
87
277
|
const sessionId = c.req.query("sessionId");
|
|
88
278
|
const offset = Number(c.req.query("offset") ?? 0);
|
|
89
279
|
if (!Number.isSafeInteger(offset) || offset < 0) {
|
|
@@ -95,21 +285,109 @@ export function registerScheduledTaskRoutes(app: Hono, deps: ApiRouteDeps): void
|
|
|
95
285
|
}
|
|
96
286
|
await requireAccessGrant(c, deps, workspaceId, "sessions:control");
|
|
97
287
|
}
|
|
288
|
+
const viewer = await scheduledTaskViewerForGrant(db, grant, deps.settings);
|
|
98
289
|
const tasks = await listScheduledTasks(
|
|
99
290
|
db,
|
|
100
291
|
workspaceId,
|
|
101
292
|
boundedLimit(c.req.query("limit")),
|
|
102
293
|
offset,
|
|
103
294
|
sessionId,
|
|
295
|
+
viewer.subjectId,
|
|
296
|
+
);
|
|
297
|
+
return c.json(
|
|
298
|
+
(await withBlockers(await withPolicyDrift(authorization, tasks))).map((task) =>
|
|
299
|
+
scheduledTaskForGrant(task, grant),
|
|
300
|
+
),
|
|
104
301
|
);
|
|
105
|
-
return c.json(tasks.map((task) => scheduledTaskForGrant(task, grant)));
|
|
106
302
|
});
|
|
107
303
|
|
|
304
|
+
// Registered before `/:taskId`. Admins see that other people's Only me
|
|
305
|
+
// schedules exist: owner, how often, last run and cost. Never their name,
|
|
306
|
+
// prompt, settings or runs.
|
|
307
|
+
app.get("/v1/workspaces/:workspaceId/scheduled-tasks/private-summaries", async (c) => {
|
|
308
|
+
const workspaceId = c.req.param("workspaceId");
|
|
309
|
+
const grant = await requireAccessGrant(c, deps, workspaceId, "workspace:admin");
|
|
310
|
+
const viewer = await scheduledTaskViewerForGrant(db, grant, deps.settings);
|
|
311
|
+
// The organization can choose that admins don't see these at all.
|
|
312
|
+
const schedules = viewer.seesPrivateSummaries
|
|
313
|
+
? await listPrivateScheduledTaskSummaries(db, {
|
|
314
|
+
workspaceId,
|
|
315
|
+
excludeOwnerSubjectId: viewer.subjectId,
|
|
316
|
+
})
|
|
317
|
+
: [];
|
|
318
|
+
return c.json(ListPrivateScheduledTaskSummariesResponse.parse({ schedules }));
|
|
319
|
+
});
|
|
320
|
+
|
|
321
|
+
// An admin pauses someone else's Only me schedule from its summary. Only its
|
|
322
|
+
// owner can change, run or resume it.
|
|
323
|
+
app.post(
|
|
324
|
+
"/v1/workspaces/:workspaceId/scheduled-tasks/private-summaries/:taskId/pause",
|
|
325
|
+
async (c) => {
|
|
326
|
+
const workspaceId = c.req.param("workspaceId");
|
|
327
|
+
const grant = await requireAccessGrant(c, deps, workspaceId, "workspace:admin");
|
|
328
|
+
const viewer = await scheduledTaskViewerForGrant(db, grant, deps.settings);
|
|
329
|
+
const pausable = await requirePausableScheduledTask(db, grant, c.req.param("taskId"), viewer);
|
|
330
|
+
if (pausable.access !== "summary")
|
|
331
|
+
throw new HTTPException(404, { message: "scheduled task not found" });
|
|
332
|
+
const summary =
|
|
333
|
+
pausable.summary.status === "paused"
|
|
334
|
+
? pausable.summary
|
|
335
|
+
: await pausePrivateScheduledTaskAsAdmin(db, grant, pausable.summary.id, viewer);
|
|
336
|
+
return c.json(PrivateScheduledTaskSummary.parse(summary));
|
|
337
|
+
},
|
|
338
|
+
);
|
|
339
|
+
|
|
108
340
|
app.get("/v1/workspaces/:workspaceId/scheduled-tasks/:taskId", async (c) => {
|
|
109
341
|
const workspaceId = c.req.param("workspaceId");
|
|
110
|
-
const
|
|
111
|
-
|
|
112
|
-
|
|
342
|
+
const authorization = await requireAccessGrantAuthorization(
|
|
343
|
+
c,
|
|
344
|
+
deps,
|
|
345
|
+
workspaceId,
|
|
346
|
+
"scheduled_tasks:run",
|
|
347
|
+
);
|
|
348
|
+
const grant = authorization.grant;
|
|
349
|
+
const task = await requireVisibleScheduledTask(db, grant, c.req.param("taskId"));
|
|
350
|
+
const [decorated] = await withBlockers(await withPolicyDrift(authorization, [task]));
|
|
351
|
+
return c.json(scheduledTaskForGrant(decorated ?? task, grant));
|
|
352
|
+
});
|
|
353
|
+
|
|
354
|
+
// The owner's explicit access refresh: re-freeze connectors, connector
|
|
355
|
+
// accounts and an agent-created task's Opengeni tools with the calling
|
|
356
|
+
// person's current authority. It changes neither the schedule nor its
|
|
357
|
+
// status, so the Temporal schedule is untouched.
|
|
358
|
+
app.post("/v1/workspaces/:workspaceId/scheduled-tasks/:taskId/refresh-access", async (c) => {
|
|
359
|
+
const workspaceId = c.req.param("workspaceId");
|
|
360
|
+
const authorization = await requireAccessGrantAuthorization(
|
|
361
|
+
c,
|
|
362
|
+
deps,
|
|
363
|
+
workspaceId,
|
|
364
|
+
"scheduled_tasks:manage",
|
|
365
|
+
);
|
|
366
|
+
const parsed = RefreshScheduledTaskAccessRequest.safeParse(
|
|
367
|
+
await c.req.json().catch(() => null),
|
|
368
|
+
);
|
|
369
|
+
if (!parsed.success) {
|
|
370
|
+
throw new HTTPException(400, { message: "invalid scheduled task access refresh request" });
|
|
371
|
+
}
|
|
372
|
+
const catalogSettings = (
|
|
373
|
+
await resolveWorkspaceCatalogSettings(db, deps.settings, {
|
|
374
|
+
accountId: authorization.grant.accountId,
|
|
375
|
+
workspaceId,
|
|
376
|
+
})
|
|
377
|
+
).settings;
|
|
378
|
+
const task = await refreshScheduledTaskAccess({
|
|
379
|
+
settings: catalogSettings,
|
|
380
|
+
db,
|
|
381
|
+
objectStorage,
|
|
382
|
+
authorization,
|
|
383
|
+
taskId: c.req.param("taskId"),
|
|
384
|
+
request: parsed.data,
|
|
385
|
+
permissionsRequiredByTools: permissionsRequiredByFirstPartyTools,
|
|
386
|
+
sessionAuthorization: deps.sessionAuthorization,
|
|
387
|
+
authorizationSurface: "http",
|
|
388
|
+
});
|
|
389
|
+
const [withDrift] = await withPolicyDrift(authorization, [task]);
|
|
390
|
+
return c.json(scheduledTaskForGrant(withDrift ?? task, authorization.grant));
|
|
113
391
|
});
|
|
114
392
|
|
|
115
393
|
app.patch("/v1/workspaces/:workspaceId/scheduled-tasks/:taskId", async (c) => {
|
|
@@ -122,16 +400,23 @@ export function registerScheduledTaskRoutes(app: Hono, deps: ApiRouteDeps): void
|
|
|
122
400
|
);
|
|
123
401
|
const grant = authorization.grant;
|
|
124
402
|
const taskId = c.req.param("taskId");
|
|
125
|
-
const existing = await
|
|
403
|
+
const existing = await requireVisibleScheduledTask(db, grant, taskId);
|
|
126
404
|
const previous = await captureScheduledTaskRestoreState(db, existing);
|
|
127
|
-
const
|
|
405
|
+
const body = await readRequestJson(c);
|
|
406
|
+
const legacy = rejectLegacyVariableSetFields(c, body);
|
|
407
|
+
if ("response" in legacy) return legacy.response;
|
|
408
|
+
const rawPayload = legacy.payload;
|
|
128
409
|
const parsedPayload = UpdateScheduledTaskRequest.safeParse(rawPayload);
|
|
129
410
|
if (!parsedPayload.success) {
|
|
130
411
|
throw new HTTPException(400, {
|
|
131
412
|
message: "invalid scheduled task update request",
|
|
132
413
|
});
|
|
133
414
|
}
|
|
134
|
-
|
|
415
|
+
// `variableSetId: null` / `variableSetIds: []` still clear an old link, so a
|
|
416
|
+
// task tied to a set that is gone can be fixed without recreating it.
|
|
417
|
+
const payload = clearsLegacyVariableSet(body)
|
|
418
|
+
? { ...parsedPayload.data, variableSetId: null }
|
|
419
|
+
: parsedPayload.data;
|
|
135
420
|
const catalogSettings = (
|
|
136
421
|
await resolveWorkspaceCatalogSettings(db, deps.settings, {
|
|
137
422
|
accountId: grant.accountId,
|
|
@@ -149,10 +434,11 @@ export function registerScheduledTaskRoutes(app: Hono, deps: ApiRouteDeps): void
|
|
|
149
434
|
toolsProvided: scheduledTaskToolsProvided(rawPayload),
|
|
150
435
|
sessionAuthorization: deps.sessionAuthorization,
|
|
151
436
|
authorizationSurface: "http",
|
|
437
|
+
verifySlackChannel: slackChannelVerifier(grant),
|
|
152
438
|
});
|
|
153
439
|
const task = await updateScheduledTaskForApi(
|
|
154
440
|
db,
|
|
155
|
-
|
|
441
|
+
grant,
|
|
156
442
|
taskId,
|
|
157
443
|
update,
|
|
158
444
|
payload.agentLearning
|
|
@@ -166,11 +452,15 @@ export function registerScheduledTaskRoutes(app: Hono, deps: ApiRouteDeps): void
|
|
|
166
452
|
app.post("/v1/workspaces/:workspaceId/scheduled-tasks/:taskId/pause", async (c) => {
|
|
167
453
|
const workspaceId = c.req.param("workspaceId");
|
|
168
454
|
const grant = await requireAccessGrant(c, deps, workspaceId, "scheduled_tasks:manage");
|
|
169
|
-
const
|
|
455
|
+
const viewer = await scheduledTaskViewerForGrant(db, grant, deps.settings);
|
|
456
|
+
const existing = await requireVisibleScheduledTask(db, grant, c.req.param("taskId"), viewer);
|
|
170
457
|
const previous = await captureScheduledTaskRestoreState(db, existing);
|
|
171
|
-
const
|
|
172
|
-
|
|
173
|
-
|
|
458
|
+
const ownerPause = viewer.subjectId !== null && existing.ownerSubjectId === viewer.subjectId;
|
|
459
|
+
const adminPause = viewer.admin && !ownerPause;
|
|
460
|
+
if (adminPause) await assertNotSiteClampedAgent(db, grant, "schedules");
|
|
461
|
+
const task = adminPause
|
|
462
|
+
? await pauseScheduledTaskAsAdmin(db, workspaceId, existing.id)
|
|
463
|
+
: await updateScheduledTaskForApi(db, grant, existing.id, { status: "paused" });
|
|
174
464
|
await syncUpdatedScheduledTask({ db, workflowClient, previous, task });
|
|
175
465
|
return c.json(scheduledTaskForGrant(task, grant));
|
|
176
466
|
});
|
|
@@ -184,7 +474,7 @@ export function registerScheduledTaskRoutes(app: Hono, deps: ApiRouteDeps): void
|
|
|
184
474
|
"scheduled_tasks:manage",
|
|
185
475
|
);
|
|
186
476
|
const grant = authorization.grant;
|
|
187
|
-
const existing = await
|
|
477
|
+
const existing = await requireVisibleScheduledTask(db, grant, c.req.param("taskId"));
|
|
188
478
|
const previous = await captureScheduledTaskRestoreState(db, existing);
|
|
189
479
|
const catalogSettings = (
|
|
190
480
|
await resolveWorkspaceCatalogSettings(db, deps.settings, {
|
|
@@ -203,7 +493,7 @@ export function registerScheduledTaskRoutes(app: Hono, deps: ApiRouteDeps): void
|
|
|
203
493
|
sessionAuthorization: deps.sessionAuthorization,
|
|
204
494
|
authorizationSurface: "http",
|
|
205
495
|
});
|
|
206
|
-
const task = await updateScheduledTaskForApi(db,
|
|
496
|
+
const task = await updateScheduledTaskForApi(db, grant, existing.id, update);
|
|
207
497
|
await syncUpdatedScheduledTask({ db, workflowClient, previous, task });
|
|
208
498
|
return c.json(scheduledTaskForGrant(task, grant));
|
|
209
499
|
});
|
|
@@ -213,7 +503,7 @@ export function registerScheduledTaskRoutes(app: Hono, deps: ApiRouteDeps): void
|
|
|
213
503
|
const grant = await requireAccessGrant(c, deps, workspaceId, "scheduled_tasks:run");
|
|
214
504
|
// Load the task before the gate so a codex-model scheduled task can be
|
|
215
505
|
// recognised as codex-billed and skip the credit/cost gates at the edge.
|
|
216
|
-
const task = await
|
|
506
|
+
const task = await requireVisibleScheduledTask(db, grant, c.req.param("taskId"));
|
|
217
507
|
if (task.action.kind === "agent_turn") {
|
|
218
508
|
const catalogSettings = (
|
|
219
509
|
await resolveWorkspaceCatalogSettings(db, deps.settings, {
|
|
@@ -239,30 +529,45 @@ export function registerScheduledTaskRoutes(app: Hono, deps: ApiRouteDeps): void
|
|
|
239
529
|
grant,
|
|
240
530
|
runMode: task.runMode,
|
|
241
531
|
agentConfig: task.agentConfig,
|
|
532
|
+
audience: task.visibility === "private" ? "user_private" : "workspace_shared",
|
|
242
533
|
requireOnline: true,
|
|
243
534
|
});
|
|
535
|
+
const taskAuthoritySubjectId = await getScheduledTaskRevisionAuthoritySubject(db, {
|
|
536
|
+
accountId: task.accountId,
|
|
537
|
+
workspaceId: task.workspaceId,
|
|
538
|
+
taskId: task.id,
|
|
539
|
+
taskAuthorityRevision: task.authorityRevision,
|
|
540
|
+
});
|
|
244
541
|
await requireLimit(
|
|
245
542
|
{ ...deps, settings: catalogSettings },
|
|
246
543
|
{
|
|
247
544
|
accountId: grant.accountId,
|
|
248
545
|
workspaceId,
|
|
546
|
+
// A manual trigger does not transfer the task's frozen human to
|
|
547
|
+
// the triggering administrator. Unavailable authority is refused
|
|
548
|
+
// visibly by worker dispatch; this edge still checks the workspace.
|
|
549
|
+
initiatingHumanSubjectId:
|
|
550
|
+
taskAuthoritySubjectId === task.ownerSubjectId ? taskAuthoritySubjectId : null,
|
|
249
551
|
action: "agent_run:create",
|
|
250
552
|
quantity: 1,
|
|
251
|
-
model
|
|
553
|
+
// A model-less task is checked against the model its occurrence
|
|
554
|
+
// will run (a connected subscription, the credits default, or the
|
|
555
|
+
// deployment default), not always the deployment default.
|
|
556
|
+
model: await resolveScheduledTaskPreflightModel(db, catalogSettings, task),
|
|
252
557
|
},
|
|
253
558
|
);
|
|
254
559
|
}
|
|
255
560
|
// Body is optional (a bare POST is still a valid trigger); only a present,
|
|
256
561
|
// non-empty body must parse against the contract.
|
|
257
562
|
const body = await c.req.json().catch(() => ({}));
|
|
258
|
-
const { triggerId } = TriggerScheduledTaskRequest
|
|
563
|
+
const { triggerId } = parseRequestBody(TriggerScheduledTaskRequest, body ?? {});
|
|
259
564
|
const triggerToken = scheduledTaskTriggerToken(triggerId);
|
|
260
565
|
const agentRunUsageIdempotencyKey =
|
|
261
566
|
task.action.kind === "agent_turn"
|
|
262
567
|
? manualScheduledTaskTriggerUsageKey(workspaceId, task.id, triggerToken)
|
|
263
568
|
: `knowledge-source-sync:manual:${workspaceId}:${task.id}:${triggerToken}`;
|
|
264
569
|
const triggerWorkflowId = manualScheduledTaskTriggerWorkflowId(task.id, triggerToken);
|
|
265
|
-
await workflowClient
|
|
570
|
+
await triggerScheduledTaskForGrant(db, grant, workflowClient, {
|
|
266
571
|
task,
|
|
267
572
|
agentRunUsageIdempotencyKey,
|
|
268
573
|
triggerWorkflowId,
|
|
@@ -287,10 +592,18 @@ export function registerScheduledTaskRoutes(app: Hono, deps: ApiRouteDeps): void
|
|
|
287
592
|
app.delete("/v1/workspaces/:workspaceId/scheduled-tasks/:taskId", async (c) => {
|
|
288
593
|
const workspaceId = c.req.param("workspaceId");
|
|
289
594
|
const grant = await requireAccessGrant(c, deps, workspaceId, "scheduled_tasks:manage");
|
|
595
|
+
// Deleting stays idempotent, but someone else's Only me schedule is
|
|
596
|
+
// indistinguishable from a missing one.
|
|
597
|
+
const target = await getScheduledTaskIncludingDeleted(db, workspaceId, c.req.param("taskId"));
|
|
598
|
+
if (
|
|
599
|
+
target &&
|
|
600
|
+
scheduledTaskAccess(await scheduledTaskViewerForGrant(db, grant, deps.settings), target) !==
|
|
601
|
+
"full"
|
|
602
|
+
)
|
|
603
|
+
throw new HTTPException(404, { message: "scheduled task not found" });
|
|
290
604
|
await deleteScheduledTaskWithDurableCleanup(deps, {
|
|
291
|
-
|
|
605
|
+
grant,
|
|
292
606
|
taskId: c.req.param("taskId"),
|
|
293
|
-
subjectId: grant.subjectId,
|
|
294
607
|
});
|
|
295
608
|
return c.json({ ok: true });
|
|
296
609
|
});
|
|
@@ -298,13 +611,20 @@ export function registerScheduledTaskRoutes(app: Hono, deps: ApiRouteDeps): void
|
|
|
298
611
|
app.get("/v1/workspaces/:workspaceId/scheduled-tasks/:taskId/runs", async (c) => {
|
|
299
612
|
const workspaceId = c.req.param("workspaceId");
|
|
300
613
|
const grant = await requireAccessGrant(c, deps, workspaceId, "scheduled_tasks:run");
|
|
301
|
-
const task = await
|
|
614
|
+
const task = await requireVisibleScheduledTask(db, grant, c.req.param("taskId"));
|
|
302
615
|
const taskRuns = await listScheduledTaskRuns(
|
|
303
616
|
db,
|
|
304
617
|
workspaceId,
|
|
305
618
|
task.id,
|
|
306
619
|
boundedLimit(c.req.query("limit")),
|
|
307
620
|
);
|
|
308
|
-
|
|
621
|
+
const runs = await withScheduledTaskRunAccessFailures({
|
|
622
|
+
db,
|
|
623
|
+
settings: deps.settings,
|
|
624
|
+
grant,
|
|
625
|
+
task,
|
|
626
|
+
runs: taskRuns,
|
|
627
|
+
});
|
|
628
|
+
return c.json(runs.map((run) => scheduledTaskRunForGrant(run, grant)));
|
|
309
629
|
});
|
|
310
630
|
}
|