@opengeni/api-router 3.0.1 → 3.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/access-grant-rls.d.ts +8 -1
- package/dist/admission-trace.d.ts +8 -0
- package/dist/app.d.ts +50 -3
- package/dist/app.js +10 -1
- package/dist/artifact-catalog-cursor.d.ts +1 -0
- package/dist/attached-browser-viewer.d.ts +11 -0
- package/dist/auth/managed-auth-attempt-context.d.ts +2 -0
- package/dist/auth/managed-auth-rate-limits.d.ts +167 -0
- package/dist/auth/managed-auth-session-adapter.d.ts +9 -1
- package/dist/auth/managed-auth.d.ts +72 -5
- package/dist/auth/managed-sign-in-notifications.d.ts +4 -0
- package/dist/auth/new-signups-gate.d.ts +23 -0
- package/dist/auth/signup-funnel-metrics.d.ts +44 -0
- package/dist/azure-live.d.ts +28 -0
- package/dist/browser-action-fences.d.ts +13 -0
- package/dist/browser-controller-authority.d.ts +1 -61
- package/dist/browser-ephemeral.d.ts +5 -0
- package/dist/browser-lost-runtime-end.d.ts +24 -0
- package/dist/browser-state-authority.d.ts +1 -27
- package/dist/chunk-OGQDXVXY.js +18 -0
- package/dist/chunk-OGQDXVXY.js.map +1 -0
- package/dist/{chunk-AJ62T5QN.js → chunk-OT56OY4V.js} +80503 -39869
- package/dist/chunk-OT56OY4V.js.map +1 -0
- package/dist/claude-default-models.d.ts +19 -0
- package/dist/claude-subscription-core.d.ts +50 -0
- package/dist/claude-subscription-oauth.d.ts +36 -0
- package/dist/claude-subscription-profile.d.ts +9 -0
- package/dist/claude-subscription-usage.d.ts +6 -0
- package/dist/claude-workspace-connection.d.ts +15 -0
- package/dist/codemode.d.ts +40 -5
- package/dist/codex-realtime.d.ts +29 -3
- package/dist/codex-session-pointers.d.ts +19 -0
- package/dist/connection-ownership.d.ts +6 -3
- package/dist/controller-data-plane.d.ts +16 -0
- package/dist/credit-promotion-snapshot.d.ts +6 -0
- package/dist/editable-artifact-source-session.d.ts +3 -0
- package/dist/editable-artifact-websocket.d.ts +5 -3
- package/dist/fatal-process-boundary.d.ts +9 -1
- package/dist/github-access.d.ts +7 -1
- package/dist/github-browser-flow.d.ts +1 -1
- package/dist/http/acting-person.d.ts +36 -0
- package/dist/http/api-contract-compat.d.ts +19 -0
- package/dist/http/api-error.d.ts +50 -1
- package/dist/http/auth.d.ts +8 -1
- package/dist/http/cors.d.ts +12 -0
- package/dist/http/deprecation.d.ts +42 -0
- package/dist/http/keyed-admission.d.ts +12 -0
- package/dist/http/local-browser-boundary.d.ts +72 -0
- package/dist/http/metrics-listener.d.ts +22 -0
- package/dist/http/path-identifier.d.ts +17 -0
- package/dist/http/registered-route-label.d.ts +16 -0
- package/dist/http/rejection-telemetry.d.ts +34 -0
- package/dist/http/request-body.d.ts +27 -0
- package/dist/http/request-source.d.ts +41 -3
- package/dist/http/sse.d.ts +12 -1
- package/dist/http/unmatched-route.d.ts +18 -0
- package/dist/http/user-content.d.ts +36 -0
- package/dist/http/variable-sets-removed.d.ts +41 -0
- package/dist/http/websocket-upgrade-dispatch.d.ts +18 -0
- package/dist/index.js +1279 -108
- package/dist/index.js.map +1 -1
- package/dist/integration-connect-metrics.d.ts +35 -0
- package/dist/integration-endpoint-test.d.ts +20 -0
- package/dist/integrations/api-integrations.d.ts +2 -2
- package/dist/integrations/atlassian.d.ts +8 -3
- package/dist/integrations/fiken.d.ts +3 -1
- package/dist/integrations/github-lens-connect.d.ts +37 -66
- package/dist/integrations/google-drive.d.ts +2 -0
- package/dist/integrations/integration-commit-authority.d.ts +13 -0
- package/dist/integrations/marketplace-plugin.d.ts +43 -43
- package/dist/integrations/oauth-client.d.ts +171 -12
- package/dist/integrations/oauth-profiles.d.ts +42 -13
- package/dist/integrations/onepassword-vault-provider.d.ts +9 -0
- package/dist/integrations/slack-bot.d.ts +285 -7
- package/dist/integrations/slack-file-upload-flow.d.ts +62 -0
- package/dist/integrations/slack-interactions.d.ts +89 -10
- package/dist/integrations/slack-mrkdwn.d.ts +41 -0
- package/dist/integrations/slack-routing.d.ts +1 -1
- package/dist/integrations/slack-session-defaults.d.ts +58 -0
- package/dist/integrations/slack-task-file-upload.d.ts +36 -0
- package/dist/integrations/slack-tool-review.d.ts +5 -0
- package/dist/interaction-agent-access.d.ts +13 -8
- package/dist/interaction-agent-version.d.ts +21 -0
- package/dist/interaction-holder-heartbeat.d.ts +5 -0
- package/dist/interaction-metrics.d.ts +27 -2
- package/dist/interaction-route-stages.d.ts +25 -0
- package/dist/interaction-secrets-vault.d.ts +20 -0
- package/dist/interaction-secrets.d.ts +103 -0
- package/dist/mcp/action-catalog-types.d.ts +14 -0
- package/dist/mcp/action-catalog.gen.d.ts +2 -0
- package/dist/mcp/action-descriptions.d.ts +4 -0
- package/dist/mcp/action-schema-imports.gen.d.ts +1 -0
- package/dist/mcp/capability-account-readiness.d.ts +7 -0
- package/dist/mcp/child-read-evidence.d.ts +9 -0
- package/dist/mcp/company-profile-agent-admin.d.ts +12 -0
- package/dist/mcp/contract-input.d.ts +13 -0
- package/dist/mcp/documents.d.ts +2 -0
- package/dist/mcp/first-party-tool-permissions.d.ts +3 -606
- package/dist/mcp/notification-tools.d.ts +26 -0
- package/dist/mcp/orchestration-failure-diagnostic.d.ts +43 -0
- package/dist/mcp/scheduled-task-input.d.ts +1309 -0
- package/dist/mcp/scheduled-task-view.d.ts +217 -3
- package/dist/mcp/secret-tools.d.ts +14 -0
- package/dist/mcp/server.d.ts +108 -5
- package/dist/mcp/session-admin-access-tools.d.ts +33 -0
- package/dist/mcp/session-event-errors.d.ts +28 -0
- package/dist/mcp/session-event-view.d.ts +62 -0
- package/dist/mcp/session-view.d.ts +15 -0
- package/dist/mcp/session-wait.d.ts +18 -0
- package/dist/mcp/site-agent-clamp-tools.d.ts +38 -0
- package/dist/mcp/site-data-tools.d.ts +22 -0
- package/dist/mcp/site-publication-tools.d.ts +19 -0
- package/dist/mcp/site-sql-tools.d.ts +27 -0
- package/dist/mcp-oauth.d.ts +37 -4
- package/dist/model-calls/chat-completions.d.ts +87 -0
- package/dist/model-calls/pending-usage-settlements.d.ts +57 -0
- package/dist/model-calls/service.d.ts +36 -0
- package/dist/model-catalog.d.ts +9 -3
- package/dist/native-push-dispatch.d.ts +69 -0
- package/dist/observability.d.ts +3 -1
- package/dist/organization-mcp.d.ts +82 -0
- package/dist/prepared-mcp-actor.d.ts +77 -0
- package/dist/prepared-mcp-permissions.d.ts +8 -0
- package/dist/routes/analytics-consent.d.ts +26 -0
- package/dist/routes/api-integrations.d.ts +11 -0
- package/dist/routes/api-keys.d.ts +7 -7
- package/dist/routes/automations.d.ts +2 -0
- package/dist/routes/billing.d.ts +59 -0
- package/dist/routes/browser-sessions.d.ts +65 -2
- package/dist/routes/chat-completions.d.ts +11 -0
- package/dist/routes/claude-core-usage.d.ts +20 -0
- package/dist/routes/claude-subscription-accounts.d.ts +3 -0
- package/dist/routes/claude-subscription-oauth.d.ts +3 -0
- package/dist/routes/client-errors.d.ts +182 -0
- package/dist/routes/codex-core.d.ts +401 -0
- package/dist/routes/codex.d.ts +64 -2
- package/dist/routes/computer-sessions.d.ts +6 -1
- package/dist/routes/desktop-distribution.d.ts +32 -0
- package/dist/routes/github-browser-fonts.gen.d.ts +2 -0
- package/dist/routes/github-browser-pages.d.ts +27 -0
- package/dist/routes/inbox.d.ts +13 -0
- package/dist/routes/insights-response-cache.d.ts +10 -0
- package/dist/routes/insights-usage.d.ts +12 -0
- package/dist/routes/insights.d.ts +28 -0
- package/dist/routes/interaction-placement-message.d.ts +7 -0
- package/dist/routes/managed-sign-in-methods.d.ts +6 -0
- package/dist/routes/model-account-choice.d.ts +13 -0
- package/dist/routes/model-account-settings.d.ts +19 -0
- package/dist/routes/native-app-auth.d.ts +12 -0
- package/dist/routes/organization-integration-policy.d.ts +8 -0
- package/dist/routes/organization-integrations.d.ts +6 -0
- package/dist/routes/organization-mcp-connections.d.ts +3 -0
- package/dist/routes/organization-model-defaults.d.ts +9 -0
- package/dist/routes/organization-service-accounts.d.ts +3 -0
- package/dist/routes/personal-api-keys.d.ts +3 -0
- package/dist/routes/session-admin-access.d.ts +3 -0
- package/dist/routes/session-artifact-associations.d.ts +4 -0
- package/dist/routes/session-history-imports.d.ts +20 -0
- package/dist/routes/sessions.d.ts +38 -2
- package/dist/routes/site-data.d.ts +18 -0
- package/dist/routes/site-publishing.d.ts +5 -0
- package/dist/routes/site-runtime.d.ts +31 -0
- package/dist/routes/site-sql.d.ts +16 -0
- package/dist/routes/slack-bot-access.d.ts +3 -0
- package/dist/routes/subscription-account-pools.d.ts +21 -0
- package/dist/routes/subscription-core-http.d.ts +5 -0
- package/dist/routes/subscription-pool-access.d.ts +37 -0
- package/dist/routes/subscription-pool-core.d.ts +153 -0
- package/dist/routes/supergrok.d.ts +6 -6
- package/dist/routes/usage-allowances.d.ts +12 -0
- package/dist/routes/variable-sets-removed.d.ts +2 -0
- package/dist/routes/vault-providers.d.ts +34 -0
- package/dist/routes/vaults.d.ts +3 -0
- package/dist/routes/workspace-integrations.d.ts +35 -0
- package/dist/routes/workspace-model-providers.d.ts +4 -0
- package/dist/routes/workspaces.d.ts +11 -2
- package/dist/sandbox/agent-update.d.ts +64 -0
- package/dist/sandbox/auth-callout.d.ts +8 -0
- package/dist/sandbox/channel-a.d.ts +15 -1
- package/dist/sandbox/enrollment.d.ts +26 -4
- package/dist/sandbox/machine-audience.d.ts +29 -0
- package/dist/sandbox/machines.d.ts +15 -2
- package/dist/sandbox/metrics-ingestion.d.ts +6 -2
- package/dist/sandbox/screen-control.d.ts +85 -0
- package/dist/sandbox/viewer.d.ts +5 -1
- package/dist/sandbox-file-artifacts.d.ts +17 -1
- package/dist/scheduled-task-blockers.d.ts +39 -0
- package/dist/scheduled-task-deletion.d.ts +3 -4
- package/dist/scheduled-task-lifecycle.d.ts +14 -0
- package/dist/secret-answers.d.ts +40 -0
- package/dist/session-create-observability.d.ts +5 -0
- package/dist/session-event-view-36GO3IL7.js +528 -0
- package/dist/session-event-view-36GO3IL7.js.map +1 -0
- package/dist/signed-state-secret.d.ts +18 -0
- package/dist/site-agent-guard.d.ts +53 -0
- package/dist/site-data/operations.d.ts +103 -0
- package/dist/site-data/service.d.ts +203 -0
- package/dist/site-frame-guard.d.ts +32 -0
- package/dist/site-publishing/agent-data-tools.d.ts +84 -0
- package/dist/site-publishing/agent-model.d.ts +58 -0
- package/dist/site-publishing/agent-session.d.ts +16 -0
- package/dist/site-publishing/content-scanner.d.ts +31 -0
- package/dist/site-publishing/edge-sync.d.ts +48 -0
- package/dist/site-publishing/gateway-signature.d.ts +56 -0
- package/dist/site-publishing/limits.d.ts +63 -0
- package/dist/site-publishing/page-tool-authority.d.ts +30 -0
- package/dist/site-publishing/platform-usage.d.ts +113 -0
- package/dist/site-publishing/platform.d.ts +21 -0
- package/dist/site-publishing/readiness.d.ts +62 -0
- package/dist/site-publishing/runtime.d.ts +179 -0
- package/dist/site-publishing/service.d.ts +264 -0
- package/dist/site-publishing/session-events.d.ts +22 -0
- package/dist/site-publishing/session-views.d.ts +36 -0
- package/dist/site-publishing/viewer.d.ts +40 -0
- package/dist/site-session-origin.d.ts +31 -6
- package/dist/site-sql/format.d.ts +47 -0
- package/dist/site-sql/gateway.d.ts +50 -0
- package/dist/site-sql/service.d.ts +213 -0
- package/dist/temporal-schedule-sync.d.ts +26 -0
- package/dist/transcription/billing-refusal.d.ts +8 -0
- package/dist/transcription/normalize.d.ts +23 -0
- package/dist/transcription/providers/azure-mai.d.ts +12 -0
- package/dist/transcription/providers/azure-openai.d.ts +4 -0
- package/dist/transcription/providers/openai.d.ts +16 -0
- package/dist/transcription/providers/subscription-core.d.ts +39 -0
- package/dist/transcription/service.d.ts +10 -1
- package/dist/transcription/wav-duration.d.ts +8 -0
- package/dist/workspace-tool-gateway-attestations.d.ts +37 -0
- package/dist/workspace-tool-gateway-observability.d.ts +16 -0
- package/dist/workspace-tool-gateway-secrets.d.ts +27 -0
- package/dist/workspace-tool-gateway.d.ts +102 -6
- package/dist/workspace-tool-target-fence.d.ts +116 -0
- package/dist/workspace-tool-target.d.ts +225 -0
- package/dist/workspace-webhook-dispatch.d.ts +26 -0
- package/dist/xai-subscription-core.d.ts +60 -0
- package/package.json +25 -20
- package/src/access-grant-rls.ts +64 -14
- package/src/admission-trace.ts +14 -0
- package/src/app.ts +1684 -252
- package/src/artifact-catalog-cursor.ts +1 -0
- package/src/attached-browser-viewer.ts +26 -0
- package/src/auth/managed-auth-attempt-context.ts +9 -0
- package/src/auth/managed-auth-rate-limits.ts +252 -0
- package/src/auth/managed-auth-session-adapter.ts +64 -29
- package/src/auth/managed-auth.ts +303 -35
- package/src/auth/managed-email.ts +18 -1
- package/src/auth/managed-sign-in-notifications.ts +81 -0
- package/src/auth/new-signups-gate.ts +49 -0
- package/src/auth/organization-user-setup.ts +3 -3
- package/src/auth/signup-funnel-metrics.ts +164 -0
- package/src/azure-live.ts +103 -0
- package/src/browser-action-fences.ts +45 -0
- package/src/browser-controller-authority.ts +1 -186
- package/src/browser-ephemeral.ts +39 -0
- package/src/browser-lost-runtime-end.ts +71 -0
- package/src/browser-state-authority.ts +1 -236
- package/src/claude-default-models.ts +37 -0
- package/src/claude-subscription-core.ts +154 -0
- package/src/claude-subscription-oauth.ts +352 -0
- package/src/claude-subscription-profile.ts +73 -0
- package/src/claude-subscription-usage.ts +51 -0
- package/src/claude-workspace-connection.ts +82 -0
- package/src/codemode.ts +236 -39
- package/src/codex-realtime.ts +181 -53
- package/src/codex-session-pointers.ts +80 -0
- package/src/company-brain-okf.ts +1 -1
- package/src/connected-machine-computer-access.ts +2 -1
- package/src/connection-ownership.ts +19 -13
- package/src/controller-data-plane.ts +34 -0
- package/src/credit-promotion-snapshot.ts +36 -0
- package/src/editable-artifact-production.ts +10 -0
- package/src/editable-artifact-source-session.ts +123 -0
- package/src/editable-artifact-websocket.ts +16 -3
- package/src/fatal-process-boundary.ts +67 -3
- package/src/gateway-realtime.ts +12 -8
- package/src/github-access.ts +31 -5
- package/src/github-browser-flow.ts +1 -1
- package/src/http/acting-person.ts +105 -0
- package/src/http/api-contract-compat.ts +49 -0
- package/src/http/api-error.ts +210 -2
- package/src/http/auth.ts +68 -4
- package/src/http/cors.ts +37 -5
- package/src/http/deprecation.ts +118 -0
- package/src/http/keyed-admission.ts +29 -0
- package/src/http/local-browser-boundary.ts +343 -0
- package/src/http/metrics-listener.ts +57 -0
- package/src/http/path-identifier.ts +54 -0
- package/src/http/registered-route-label.ts +34 -0
- package/src/http/rejection-telemetry.ts +120 -0
- package/src/http/request-body.ts +127 -0
- package/src/http/request-source.ts +154 -13
- package/src/http/sse.ts +88 -28
- package/src/http/unmatched-route.ts +60 -0
- package/src/http/user-content.ts +158 -0
- package/src/http/variable-sets-removed.ts +122 -0
- package/src/http/websocket-upgrade-dispatch.ts +29 -0
- package/src/index.ts +107 -57
- package/src/integration-connect-metrics.ts +228 -0
- package/src/integration-endpoint-test.ts +291 -0
- package/src/integrations/api-integrations.ts +81 -7
- package/src/integrations/atlassian.ts +202 -83
- package/src/integrations/fiken.ts +66 -38
- package/src/integrations/github-app-connect.ts +64 -18
- package/src/integrations/github-lens-connect.ts +8 -29
- package/src/integrations/google-drive.ts +448 -152
- package/src/integrations/integration-commit-authority.ts +69 -0
- package/src/integrations/marketplace-plugin.ts +1 -1
- package/src/integrations/oauth-client.ts +733 -193
- package/src/integrations/oauth-profiles.ts +116 -45
- package/src/integrations/onepassword-vault-provider.ts +16 -0
- package/src/integrations/personal-github-repositories.ts +1 -1
- package/src/integrations/personal-github.ts +61 -35
- package/src/integrations/provider-oauth.ts +67 -85
- package/src/integrations/slack-app-home.ts +5 -5
- package/src/integrations/slack-bot.ts +893 -201
- package/src/integrations/slack-file-upload-flow.ts +147 -0
- package/src/integrations/slack-install.ts +7 -7
- package/src/integrations/slack-interactions.ts +1589 -299
- package/src/integrations/slack-mrkdwn.ts +193 -0
- package/src/integrations/slack-routing.ts +2 -2
- package/src/integrations/slack-session-defaults.ts +224 -0
- package/src/integrations/slack-task-file-upload.ts +323 -0
- package/src/integrations/slack-tool-review.ts +65 -0
- package/src/integrations/social-oauth.ts +90 -58
- package/src/interaction-agent-access.ts +40 -20
- package/src/interaction-agent-version.ts +85 -0
- package/src/interaction-holder-heartbeat.ts +24 -8
- package/src/interaction-metrics.ts +164 -2
- package/src/interaction-route-stages.ts +94 -0
- package/src/interaction-secrets-vault.ts +213 -0
- package/src/interaction-secrets.ts +426 -0
- package/src/mcp/action-catalog-types.ts +14 -0
- package/src/mcp/action-catalog.gen.ts +8014 -0
- package/src/mcp/action-descriptions.ts +299 -0
- package/src/mcp/action-schema-imports.gen.ts +304 -0
- package/src/mcp/capability-account-readiness.ts +17 -0
- package/src/mcp/child-read-evidence.ts +19 -0
- package/src/mcp/company-profile-agent-admin.ts +13 -0
- package/src/mcp/contract-input.ts +165 -0
- package/src/mcp/documents.ts +9 -2
- package/src/mcp/editable-artifacts.ts +29 -11
- package/src/mcp/files.ts +5 -1
- package/src/mcp/first-party-tool-permissions.ts +7 -285
- package/src/mcp/knowledge-entries.ts +108 -34
- package/src/mcp/notification-tools.ts +480 -0
- package/src/mcp/orchestration-failure-diagnostic.ts +43 -0
- package/src/mcp/scheduled-task-input.ts +89 -0
- package/src/mcp/scheduled-task-view.ts +63 -3
- package/src/mcp/secret-tools.ts +185 -0
- package/src/mcp/server.ts +2213 -1116
- package/src/mcp/session-admin-access-tools.ts +163 -0
- package/src/mcp/session-event-errors.ts +123 -0
- package/src/mcp/session-event-view.ts +395 -13
- package/src/mcp/session-view.ts +3 -0
- package/src/mcp/session-wait.ts +67 -7
- package/src/mcp/site-agent-clamp-tools.ts +140 -0
- package/src/mcp/site-data-tools.ts +339 -0
- package/src/mcp/site-publication-tools.ts +201 -0
- package/src/mcp/site-sql-tools.ts +427 -0
- package/src/mcp-oauth.ts +635 -45
- package/src/model-calls/chat-completions.ts +352 -0
- package/src/model-calls/pending-usage-settlements.ts +125 -0
- package/src/model-calls/service.ts +694 -0
- package/src/model-catalog.ts +68 -17
- package/src/native-push-dispatch.ts +457 -0
- package/src/observability.ts +15 -1
- package/src/organization-mcp.ts +485 -0
- package/src/prepared-mcp-actor.ts +154 -0
- package/src/prepared-mcp-permissions.ts +38 -0
- package/src/routes/analytics-consent.ts +123 -0
- package/src/routes/api-integrations.ts +268 -9
- package/src/routes/api-keys.ts +164 -25
- package/src/routes/artifact-catalog.ts +111 -0
- package/src/routes/automations.ts +163 -90
- package/src/routes/billing.ts +535 -59
- package/src/routes/browser-sessions.ts +966 -342
- package/src/routes/canonical-human-identities.ts +61 -0
- package/src/routes/capabilities.ts +112 -5
- package/src/routes/channels.ts +4 -3
- package/src/routes/chat-completions.ts +235 -0
- package/src/routes/claude-core-usage.ts +147 -0
- package/src/routes/claude-subscription-accounts.ts +233 -0
- package/src/routes/claude-subscription-oauth.ts +175 -0
- package/src/routes/client-errors.ts +394 -0
- package/src/routes/codex-core.ts +687 -0
- package/src/routes/codex.ts +1277 -1119
- package/src/routes/company-brain.ts +4 -0
- package/src/routes/computer-sessions.ts +319 -85
- package/src/routes/connect.ts +277 -175
- package/src/routes/connections.ts +690 -363
- package/src/routes/desktop-distribution.ts +217 -0
- package/src/routes/documents.ts +13 -7
- package/src/routes/editable-artifacts.ts +74 -4
- package/src/routes/enrollments.ts +110 -16
- package/src/routes/external-identity-links.ts +13 -12
- package/src/routes/files.ts +41 -16
- package/src/routes/github-browser-fonts.gen.ts +12 -0
- package/src/routes/github-browser-pages.ts +258 -0
- package/src/routes/github.ts +200 -75
- package/src/routes/inbox.ts +353 -0
- package/src/routes/insights-response-cache.ts +83 -0
- package/src/routes/insights-usage.ts +345 -0
- package/src/routes/insights.ts +103 -8
- package/src/routes/install.ts +51 -10
- package/src/routes/integration-facets.ts +70 -28
- package/src/routes/interaction-placement-message.ts +12 -0
- package/src/routes/knowledge.ts +136 -27
- package/src/routes/machines.ts +189 -135
- package/src/routes/managed-auth-session-sets.ts +43 -10
- package/src/routes/managed-onboarding.ts +39 -19
- package/src/routes/managed-sign-in-methods.ts +433 -0
- package/src/routes/memory-slack-publications.ts +3 -2
- package/src/routes/model-account-choice.ts +194 -0
- package/src/routes/model-account-settings.ts +235 -0
- package/src/routes/model-connection-access.ts +210 -48
- package/src/routes/native-app-auth.ts +296 -0
- package/src/routes/organization-integration-policy.ts +116 -0
- package/src/routes/organization-integrations.ts +326 -0
- package/src/routes/organization-mcp-connections.ts +183 -0
- package/src/routes/organization-memberships.ts +205 -19
- package/src/routes/organization-model-defaults.ts +110 -0
- package/src/routes/organization-model-providers.ts +74 -3
- package/src/routes/organization-service-accounts.ts +128 -0
- package/src/routes/organization-sessions.ts +21 -5
- package/src/routes/personal-api-keys.ts +184 -0
- package/src/routes/personal-github-git-broker.ts +2 -2
- package/src/routes/personal-github.ts +9 -4
- package/src/routes/plugins.ts +46 -7
- package/src/routes/pr-review-github.ts +105 -118
- package/src/routes/pr-review.ts +88 -82
- package/src/routes/preference-registry.ts +18 -0
- package/src/routes/rigs.ts +48 -13
- package/src/routes/scheduled-tasks.ts +347 -27
- package/src/routes/session-admin-access.ts +271 -0
- package/src/routes/session-artifact-associations.ts +164 -0
- package/src/routes/session-history-imports.ts +305 -0
- package/src/routes/sessions.ts +1682 -363
- package/src/routes/site-data.ts +340 -0
- package/src/routes/site-publishing.ts +584 -0
- package/src/routes/site-runtime.ts +1944 -0
- package/src/routes/site-sql.ts +263 -0
- package/src/routes/skill-content.ts +72 -7
- package/src/routes/skills.ts +5 -4
- package/src/routes/slack-bot-access.ts +108 -0
- package/src/routes/social.ts +27 -15
- package/src/routes/subscription-account-pools.ts +209 -0
- package/src/routes/subscription-core-http.ts +18 -0
- package/src/routes/subscription-pool-access.ts +180 -0
- package/src/routes/subscription-pool-core.ts +552 -0
- package/src/routes/supergrok.ts +174 -655
- package/src/routes/transcription-recordings.ts +71 -4
- package/src/routes/transcriptions.ts +26 -2
- package/src/routes/usage-allowances.ts +381 -0
- package/src/routes/variable-sets-removed.ts +19 -0
- package/src/routes/vault-providers.ts +782 -0
- package/src/routes/vaults.ts +421 -0
- package/src/routes/video-generation.ts +30 -12
- package/src/routes/workspace-artifacts.ts +165 -53
- package/src/routes/workspace-integrations.ts +576 -0
- package/src/routes/workspace-model-providers.ts +148 -0
- package/src/routes/workspace-state.ts +4 -0
- package/src/routes/workspaces.ts +625 -117
- package/src/sandbox/agent-update.ts +315 -0
- package/src/sandbox/auth-callout.ts +104 -21
- package/src/sandbox/channel-a.ts +165 -55
- package/src/sandbox/enrollment.ts +131 -22
- package/src/sandbox/machine-audience.ts +192 -0
- package/src/sandbox/machines.ts +75 -31
- package/src/sandbox/metrics-ingestion.ts +133 -2
- package/src/sandbox/rematerialize.ts +51 -21
- package/src/sandbox/screen-control.ts +289 -0
- package/src/sandbox/viewer.ts +33 -58
- package/src/sandbox-file-artifacts.ts +53 -27
- package/src/scheduled-task-blockers.ts +293 -0
- package/src/scheduled-task-deletion.ts +13 -3
- package/src/scheduled-task-lifecycle.ts +84 -0
- package/src/secret-answers.ts +119 -0
- package/src/session-create-observability.ts +46 -0
- package/src/session-realtime-context.ts +26 -4
- package/src/signed-state-secret.ts +58 -0
- package/src/site-agent-guard.ts +261 -0
- package/src/site-data/operations.ts +777 -0
- package/src/site-data/service.ts +1043 -0
- package/src/site-frame-guard.ts +107 -0
- package/src/site-publishing/agent-data-tools.ts +250 -0
- package/src/site-publishing/agent-model.ts +127 -0
- package/src/site-publishing/agent-session.ts +148 -0
- package/src/site-publishing/content-scanner.ts +93 -0
- package/src/site-publishing/edge-sync.ts +148 -0
- package/src/site-publishing/gateway-signature.ts +198 -0
- package/src/site-publishing/limits.ts +315 -0
- package/src/site-publishing/page-tool-authority.ts +111 -0
- package/src/site-publishing/platform-usage.ts +479 -0
- package/src/site-publishing/platform.ts +98 -0
- package/src/site-publishing/readiness.ts +330 -0
- package/src/site-publishing/runtime.ts +831 -0
- package/src/site-publishing/service.ts +1282 -0
- package/src/site-publishing/session-events.ts +262 -0
- package/src/site-publishing/session-views.ts +262 -0
- package/src/site-publishing/viewer.ts +75 -0
- package/src/site-session-origin.ts +91 -6
- package/src/site-sql/format.ts +134 -0
- package/src/site-sql/gateway.ts +168 -0
- package/src/site-sql/service.ts +1636 -0
- package/src/site-uploads.ts +27 -5
- package/src/temporal-schedule-sync.ts +74 -0
- package/src/transcription/billing-refusal.ts +14 -0
- package/src/transcription/normalize.ts +77 -0
- package/src/transcription/providers/azure-mai.ts +98 -0
- package/src/transcription/providers/azure-openai.ts +16 -7
- package/src/transcription/providers/codex-subscription.ts +190 -67
- package/src/transcription/providers/openai.ts +79 -5
- package/src/transcription/providers/subscription-core.ts +125 -0
- package/src/transcription/providers/xai-subscription.ts +81 -83
- package/src/transcription/segmenter.ts +7 -1
- package/src/transcription/service.ts +239 -10
- package/src/transcription/wav-duration.ts +39 -0
- package/src/workspace-deletion.ts +25 -1
- package/src/workspace-tool-gateway-attestations.ts +133 -0
- package/src/workspace-tool-gateway-observability.ts +64 -0
- package/src/workspace-tool-gateway-secrets.ts +104 -0
- package/src/workspace-tool-gateway.ts +921 -103
- package/src/workspace-tool-target-fence.ts +380 -0
- package/src/workspace-tool-target.ts +554 -0
- package/src/workspace-webhook-dispatch.ts +225 -0
- package/src/xai-realtime.ts +85 -81
- package/src/xai-subscription-core.ts +172 -0
- package/dist/browser-auth-broker.d.ts +0 -20
- package/dist/chunk-AJ62T5QN.js.map +0 -1
- package/dist/connection-authority-owner.d.ts +0 -59
- package/dist/routes/connection-authorities.d.ts +0 -3
- package/dist/routes/environments.d.ts +0 -5
- package/dist/routes/host-mcp-bindings.d.ts +0 -5
- package/dist/routes/host-mcp-resolvers.d.ts +0 -3
- package/dist/routes/packs.d.ts +0 -3
- package/dist/session-event-view-MU3HMNV3.js +0 -264
- package/dist/session-event-view-MU3HMNV3.js.map +0 -1
- package/dist/xai-subscription-auth.d.ts +0 -23
- package/src/browser-auth-broker.ts +0 -155
- package/src/connection-authority-owner.ts +0 -61
- package/src/routes/connection-authorities.ts +0 -139
- package/src/routes/environments.ts +0 -388
- package/src/routes/host-mcp-bindings.ts +0 -122
- package/src/routes/host-mcp-resolvers.ts +0 -41
- package/src/routes/packs.ts +0 -784
- package/src/xai-subscription-auth.ts +0 -139
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import { SITE_FRAME_HEADER } from "@opengeni/contracts/site-session-http";
|
|
2
|
+
import {
|
|
3
|
+
SITE_SQL_ERROR_STATUS,
|
|
4
|
+
SITE_SQL_EXPORT_NEXT_CURSOR_HEADER,
|
|
5
|
+
SiteSqlExportFormat,
|
|
6
|
+
SiteSqlImportRequest,
|
|
7
|
+
SiteSqlMigrationRequest,
|
|
8
|
+
SiteSqlResetRequest,
|
|
9
|
+
SiteSqlStatementRequest,
|
|
10
|
+
SiteSqlQueryDefinitionRequest,
|
|
11
|
+
SiteSqlRunRequest,
|
|
12
|
+
SiteSqlSettingsRequest,
|
|
13
|
+
type ErrorCode,
|
|
14
|
+
type SiteSqlErrorCode,
|
|
15
|
+
} from "@opengeni/contracts";
|
|
16
|
+
import { requireAccessGrant, type ApiRouteDeps } from "@opengeni/core";
|
|
17
|
+
import type { Context, Hono } from "hono";
|
|
18
|
+
import { z } from "zod";
|
|
19
|
+
import { ApiHttpError } from "../http/api-error";
|
|
20
|
+
import { USER_CONTENT_SECURITY_HEADERS } from "../http/user-content";
|
|
21
|
+
import type { SiteDataSurface } from "../site-data/service";
|
|
22
|
+
import {
|
|
23
|
+
defineSiteSqlQuery,
|
|
24
|
+
describeSiteSql,
|
|
25
|
+
exportSiteSql,
|
|
26
|
+
importSiteSql,
|
|
27
|
+
inspectSiteSql,
|
|
28
|
+
migrateSiteSql,
|
|
29
|
+
resetSiteSql,
|
|
30
|
+
runSiteSqlQuery,
|
|
31
|
+
runSiteSqlStatement,
|
|
32
|
+
setSiteSqlSettings,
|
|
33
|
+
SiteSqlError,
|
|
34
|
+
} from "../site-sql/service";
|
|
35
|
+
|
|
36
|
+
const SiteId = z.string().uuid();
|
|
37
|
+
|
|
38
|
+
const PUBLIC_CODE: Record<SiteSqlErrorCode, ErrorCode> = {
|
|
39
|
+
validation: "validation_failed",
|
|
40
|
+
sql_error: "validation_failed",
|
|
41
|
+
conflict: "conflict",
|
|
42
|
+
disabled: "conflict",
|
|
43
|
+
not_found: "not_found",
|
|
44
|
+
forbidden: "forbidden",
|
|
45
|
+
quota_exceeded: "limit_exceeded",
|
|
46
|
+
rate_limited: "limit_exceeded",
|
|
47
|
+
unavailable: "upstream_unavailable",
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
/** Typed Site SQL errors in the public envelope; `details.code` is the Site SQL code. */
|
|
51
|
+
export function siteSqlHttpError(error: SiteSqlError): ApiHttpError {
|
|
52
|
+
return new ApiHttpError(SITE_SQL_ERROR_STATUS[error.code], {
|
|
53
|
+
code: PUBLIC_CODE[error.code],
|
|
54
|
+
message: error.message,
|
|
55
|
+
retryable: error.code === "rate_limited" || error.details.retryable === true,
|
|
56
|
+
outcomeUnknown: error.details.outcomeUnknown === true,
|
|
57
|
+
details: { ...error.details, code: error.code },
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export async function runSiteSqlRoute<T>(fn: () => Promise<T>): Promise<T> {
|
|
62
|
+
try {
|
|
63
|
+
return await fn();
|
|
64
|
+
} catch (error) {
|
|
65
|
+
if (error instanceof SiteSqlError) throw siteSqlHttpError(error);
|
|
66
|
+
throw error;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export async function siteSqlBody<S extends z.ZodType>(
|
|
71
|
+
context: Context,
|
|
72
|
+
schema: S,
|
|
73
|
+
): Promise<z.infer<S>> {
|
|
74
|
+
const parsed = schema.safeParse(await context.req.json().catch(() => null));
|
|
75
|
+
if (!parsed.success)
|
|
76
|
+
throw siteSqlHttpError(
|
|
77
|
+
new SiteSqlError(
|
|
78
|
+
"validation",
|
|
79
|
+
parsed.error.issues
|
|
80
|
+
.slice(0, 3)
|
|
81
|
+
.map((issue) => `${issue.path.join(".") || "request"}: ${issue.message}`)
|
|
82
|
+
.join("; "),
|
|
83
|
+
),
|
|
84
|
+
);
|
|
85
|
+
return parsed.data;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function siteId(context: Context): string {
|
|
89
|
+
const parsed = SiteId.safeParse(context.req.param("artifactId"));
|
|
90
|
+
if (!parsed.success) throw siteSqlHttpError(new SiteSqlError("not_found", "Site not found"));
|
|
91
|
+
return parsed.data;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** Like Site Data: the frame marker or pinned Site id makes a request framed. */
|
|
95
|
+
function surface(context: Context): SiteDataSurface {
|
|
96
|
+
const frame = context.req.header("x-opengeni-site-id");
|
|
97
|
+
const marked = context.req.header(SITE_FRAME_HEADER) !== undefined;
|
|
98
|
+
if (!frame && !marked) return {};
|
|
99
|
+
return { frameSiteId: frame ?? "" };
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function refuseFramed(context: Context, what: string): void {
|
|
103
|
+
if (surface(context).frameSiteId !== undefined)
|
|
104
|
+
throw siteSqlHttpError(new SiteSqlError("forbidden", `A Site cannot ${what}`));
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Site SQL routes. Running a named query needs Site access (`artifacts:read`
|
|
109
|
+
* and the viewer's audience); the query's audience decides the rest. Everything
|
|
110
|
+
* else is management: a manager of the Site outside any Site frame, with
|
|
111
|
+
* `artifacts:read` to look and `artifacts:publish` to change.
|
|
112
|
+
*/
|
|
113
|
+
export function registerSiteSqlRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
114
|
+
const base = "/v1/workspaces/:workspaceId/published-artifacts/:artifactId/sql";
|
|
115
|
+
const grantFor = (context: Context, permission: "artifacts:read" | "artifacts:publish") =>
|
|
116
|
+
requireAccessGrant(context, deps, context.req.param("workspaceId")!, permission);
|
|
117
|
+
|
|
118
|
+
app.get(base, async (context) => {
|
|
119
|
+
const grant = await grantFor(context, "artifacts:read");
|
|
120
|
+
refuseFramed(context, "manage its database");
|
|
121
|
+
return context.json(await runSiteSqlRoute(() => describeSiteSql(deps, grant, siteId(context))));
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
app.put(`${base}/settings`, async (context) => {
|
|
125
|
+
const grant = await grantFor(context, "artifacts:publish");
|
|
126
|
+
const request = await siteSqlBody(context, SiteSqlSettingsRequest);
|
|
127
|
+
refuseFramed(context, "manage its database");
|
|
128
|
+
return context.json(
|
|
129
|
+
await runSiteSqlRoute(() => setSiteSqlSettings(deps, grant, siteId(context), request)),
|
|
130
|
+
);
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
app.post(`${base}/queries/:name`, async (context) => {
|
|
134
|
+
const grant = await grantFor(context, "artifacts:read");
|
|
135
|
+
const request = await siteSqlBody(context, SiteSqlRunRequest);
|
|
136
|
+
return context.json(
|
|
137
|
+
await runSiteSqlRoute(() =>
|
|
138
|
+
runSiteSqlQuery(
|
|
139
|
+
deps,
|
|
140
|
+
grant,
|
|
141
|
+
siteId(context),
|
|
142
|
+
context.req.param("name")!,
|
|
143
|
+
request.params ?? {},
|
|
144
|
+
surface(context),
|
|
145
|
+
),
|
|
146
|
+
),
|
|
147
|
+
);
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
app.put(`${base}/queries/:name`, async (context) => {
|
|
151
|
+
const grant = await grantFor(context, "artifacts:publish");
|
|
152
|
+
const request = await siteSqlBody(context, SiteSqlQueryDefinitionRequest);
|
|
153
|
+
refuseFramed(context, "define queries");
|
|
154
|
+
const result = await runSiteSqlRoute(() =>
|
|
155
|
+
defineSiteSqlQuery(deps, grant, siteId(context), context.req.param("name")!, request),
|
|
156
|
+
);
|
|
157
|
+
return context.json(result.query, result.created ? 201 : 200);
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
app.delete(`${base}/queries/:name`, async (context) => {
|
|
161
|
+
const grant = await grantFor(context, "artifacts:publish");
|
|
162
|
+
refuseFramed(context, "delete queries");
|
|
163
|
+
await runSiteSqlRoute(() =>
|
|
164
|
+
defineSiteSqlQuery(deps, grant, siteId(context), context.req.param("name")!, null),
|
|
165
|
+
);
|
|
166
|
+
return context.json({ deleted: true });
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
app.post(`${base}/migrations`, async (context) => {
|
|
170
|
+
const grant = await grantFor(context, "artifacts:publish");
|
|
171
|
+
const request = await siteSqlBody(context, SiteSqlMigrationRequest);
|
|
172
|
+
refuseFramed(context, "change its database schema");
|
|
173
|
+
return context.json(
|
|
174
|
+
await runSiteSqlRoute(() => migrateSiteSql(deps, grant, siteId(context), request)),
|
|
175
|
+
201,
|
|
176
|
+
);
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
app.post(`${base}/query`, async (context) => {
|
|
180
|
+
const grant = await grantFor(context, "artifacts:read");
|
|
181
|
+
const request = await siteSqlBody(context, SiteSqlStatementRequest);
|
|
182
|
+
refuseFramed(context, "run ad hoc SQL");
|
|
183
|
+
return context.json(
|
|
184
|
+
await runSiteSqlRoute(() =>
|
|
185
|
+
runSiteSqlStatement(deps, grant, siteId(context), request, "read"),
|
|
186
|
+
),
|
|
187
|
+
);
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
app.post(`${base}/execute`, async (context) => {
|
|
191
|
+
const grant = await grantFor(context, "artifacts:publish");
|
|
192
|
+
const request = await siteSqlBody(context, SiteSqlStatementRequest);
|
|
193
|
+
refuseFramed(context, "run ad hoc SQL");
|
|
194
|
+
return context.json(
|
|
195
|
+
await runSiteSqlRoute(() =>
|
|
196
|
+
runSiteSqlStatement(deps, grant, siteId(context), request, "write"),
|
|
197
|
+
),
|
|
198
|
+
);
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
app.get(`${base}/inspect`, async (context) => {
|
|
202
|
+
const grant = await grantFor(context, "artifacts:read");
|
|
203
|
+
refuseFramed(context, "inspect its database");
|
|
204
|
+
return context.json(await runSiteSqlRoute(() => inspectSiteSql(deps, grant, siteId(context))));
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
app.get(`${base}/export`, async (context) => {
|
|
208
|
+
const grant = await grantFor(context, "artifacts:read");
|
|
209
|
+
refuseFramed(context, "export its database");
|
|
210
|
+
const format = SiteSqlExportFormat.safeParse(context.req.query("format") ?? "sql");
|
|
211
|
+
if (!format.success)
|
|
212
|
+
throw siteSqlHttpError(new SiteSqlError("validation", "format is sql, csv or json"));
|
|
213
|
+
const table = context.req.query("table");
|
|
214
|
+
const cursor = context.req.query("cursor");
|
|
215
|
+
if (cursor !== undefined && (cursor.length === 0 || cursor.length > 4096))
|
|
216
|
+
throw siteSqlHttpError(
|
|
217
|
+
new SiteSqlError("validation", "cursor is a nextCursor from an export"),
|
|
218
|
+
);
|
|
219
|
+
const maxBytesText = context.req.query("maxBytes");
|
|
220
|
+
const maxBytes = maxBytesText === undefined ? undefined : Number(maxBytesText);
|
|
221
|
+
if (maxBytes !== undefined && (!Number.isSafeInteger(maxBytes) || maxBytes < 1024))
|
|
222
|
+
throw siteSqlHttpError(
|
|
223
|
+
new SiteSqlError("validation", "maxBytes is a whole number of bytes, at least 1024"),
|
|
224
|
+
);
|
|
225
|
+
const exported = await runSiteSqlRoute(() =>
|
|
226
|
+
exportSiteSql(deps, grant, siteId(context), {
|
|
227
|
+
format: format.data,
|
|
228
|
+
...(table ? { table } : {}),
|
|
229
|
+
...(cursor ? { cursor } : {}),
|
|
230
|
+
...(maxBytes !== undefined ? { maxBytes } : {}),
|
|
231
|
+
}),
|
|
232
|
+
);
|
|
233
|
+
return new Response(exported.content, {
|
|
234
|
+
headers: {
|
|
235
|
+
"Content-Type": exported.contentType,
|
|
236
|
+
"Content-Disposition": `attachment; filename="${exported.filename}"`,
|
|
237
|
+
...USER_CONTENT_SECURITY_HEADERS,
|
|
238
|
+
"X-OpenGeni-Export-Truncated": exported.truncated ? "true" : "false",
|
|
239
|
+
...(exported.nextCursor
|
|
240
|
+
? { [SITE_SQL_EXPORT_NEXT_CURSOR_HEADER]: exported.nextCursor }
|
|
241
|
+
: {}),
|
|
242
|
+
},
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
app.post(`${base}/import`, async (context) => {
|
|
247
|
+
const grant = await grantFor(context, "artifacts:publish");
|
|
248
|
+
const request = await siteSqlBody(context, SiteSqlImportRequest);
|
|
249
|
+
refuseFramed(context, "import data");
|
|
250
|
+
return context.json(
|
|
251
|
+
await runSiteSqlRoute(() => importSiteSql(deps, grant, siteId(context), request)),
|
|
252
|
+
);
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
app.post(`${base}/reset`, async (context) => {
|
|
256
|
+
const grant = await grantFor(context, "artifacts:publish");
|
|
257
|
+
const request = await siteSqlBody(context, SiteSqlResetRequest);
|
|
258
|
+
refuseFramed(context, "reset its database");
|
|
259
|
+
return context.json(
|
|
260
|
+
await runSiteSqlRoute(() => resetSiteSql(deps, grant, siteId(context), request)),
|
|
261
|
+
);
|
|
262
|
+
});
|
|
263
|
+
}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import type { Context, Hono } from "hono";
|
|
3
3
|
import { HTTPException } from "hono/http-exception";
|
|
4
|
-
import { SkillFile, type SkillWriteReceipt } from "@opengeni/contracts";
|
|
4
|
+
import { SkillFile, SKILL_MAX_FILES, type SkillWriteReceipt } from "@opengeni/contracts";
|
|
5
|
+
import { getSessionForSubject, readSkillRemovalScope } from "@opengeni/db";
|
|
5
6
|
import {
|
|
6
7
|
approveSkill,
|
|
7
8
|
rejectSkill,
|
|
9
|
+
removeSkill,
|
|
8
10
|
listSkills,
|
|
9
11
|
readSkill,
|
|
10
12
|
requireAccessGrant,
|
|
@@ -26,13 +28,14 @@ const saveRequest = z
|
|
|
26
28
|
expectedScopeVersion: z.number().int().nonnegative(),
|
|
27
29
|
scope: scopeSchema.default("workspace"),
|
|
28
30
|
stableKey: z.string().min(1).max(96),
|
|
29
|
-
files: z.array(SkillFile).max(
|
|
30
|
-
deletions: z.array(z.string().min(1).max(512)).max(
|
|
31
|
+
files: z.array(SkillFile).max(SKILL_MAX_FILES),
|
|
32
|
+
deletions: z.array(z.string().min(1).max(512)).max(SKILL_MAX_FILES).default([]),
|
|
31
33
|
reason: z.string().min(1).max(2000),
|
|
32
34
|
})
|
|
33
35
|
.strict();
|
|
34
36
|
const revisionRequest = z
|
|
35
37
|
.object({
|
|
38
|
+
removalOperationId: z.uuid().optional(),
|
|
36
39
|
operationId: z.uuid(),
|
|
37
40
|
revisionId: z.uuid(),
|
|
38
41
|
expectedRevisionId: z.uuid().nullable(),
|
|
@@ -41,6 +44,8 @@ const revisionRequest = z
|
|
|
41
44
|
})
|
|
42
45
|
.strict();
|
|
43
46
|
|
|
47
|
+
const removeRequest = revisionRequest.omit({ revisionId: true, removalOperationId: true });
|
|
48
|
+
|
|
44
49
|
async function parseSkillRequest<S extends z.ZodType>(c: Context, schema: S): Promise<z.infer<S>> {
|
|
45
50
|
const parsed = schema.safeParse(await c.req.json().catch(() => null));
|
|
46
51
|
if (!parsed.success) throw new HTTPException(422, { message: "Invalid Skill request" });
|
|
@@ -64,9 +69,20 @@ export function registerSkillContentRoutes(app: Hono, deps: ApiRouteDeps): void
|
|
|
64
69
|
.object({
|
|
65
70
|
limit: z.coerce.number().int().min(1).max(250).default(100),
|
|
66
71
|
cursor: z.string().max(2048).optional(),
|
|
72
|
+
sessionId: z.uuid().optional(),
|
|
67
73
|
})
|
|
68
74
|
.safeParse(c.req.query());
|
|
69
75
|
if (!query.success) throw new HTTPException(422, { message: "Invalid Skill list query" });
|
|
76
|
+
if (query.data.sessionId) {
|
|
77
|
+
await requireAccessGrant(c, deps, workspaceId, "sessions:read");
|
|
78
|
+
const session = await getSessionForSubject(
|
|
79
|
+
deps.db,
|
|
80
|
+
workspaceId,
|
|
81
|
+
query.data.sessionId,
|
|
82
|
+
grant.subjectId,
|
|
83
|
+
);
|
|
84
|
+
if (!session) throw new HTTPException(404, { message: "Session not found" });
|
|
85
|
+
}
|
|
70
86
|
let after: { stableKey: string; id: string } | undefined;
|
|
71
87
|
if (query.data.cursor !== undefined) {
|
|
72
88
|
try {
|
|
@@ -81,7 +97,12 @@ export function registerSkillContentRoutes(app: Hono, deps: ApiRouteDeps): void
|
|
|
81
97
|
const rows = await listSkills(
|
|
82
98
|
deps.db,
|
|
83
99
|
{ accountId: grant.accountId, workspaceId, subjectId: grant.subjectId },
|
|
84
|
-
{
|
|
100
|
+
{
|
|
101
|
+
limit: query.data.limit + 1,
|
|
102
|
+
metadataOnly: true,
|
|
103
|
+
...(after ? { after } : {}),
|
|
104
|
+
...(query.data.sessionId ? { sessionId: query.data.sessionId } : {}),
|
|
105
|
+
},
|
|
85
106
|
);
|
|
86
107
|
const page = rows.slice(0, query.data.limit);
|
|
87
108
|
const last = page.at(-1);
|
|
@@ -169,6 +190,36 @@ export function registerSkillContentRoutes(app: Hono, deps: ApiRouteDeps): void
|
|
|
169
190
|
);
|
|
170
191
|
return c.json(receipt);
|
|
171
192
|
});
|
|
193
|
+
app.post(`${base}/:skillId/remove`, async (c) => {
|
|
194
|
+
const workspaceId = c.req.param("workspaceId");
|
|
195
|
+
const access = await requireAccessGrantAuthorization(c, deps, workspaceId, "workspace:read");
|
|
196
|
+
const skillId = skillIdentifier(c.req.param("skillId"));
|
|
197
|
+
const request = await parseSkillRequest(c, removeRequest);
|
|
198
|
+
const context = {
|
|
199
|
+
accountId: access.grant.accountId,
|
|
200
|
+
workspaceId,
|
|
201
|
+
subjectId: access.grant.subjectId,
|
|
202
|
+
};
|
|
203
|
+
const current = await readSkill(deps.db, context, skillId);
|
|
204
|
+
const scope =
|
|
205
|
+
current?.scope ??
|
|
206
|
+
(await readSkillRemovalScope(deps.db, context, skillId, request.operationId));
|
|
207
|
+
if (!scope) throw new HTTPException(404, { message: "Skill not found" });
|
|
208
|
+
authorizePreferenceRegistryScopeMutation(access, scope);
|
|
209
|
+
if (scope === "organization")
|
|
210
|
+
throw new HTTPException(403, { message: "Organization skills cannot be removed here." });
|
|
211
|
+
return c.json(
|
|
212
|
+
await skillMutation(() =>
|
|
213
|
+
removeSkill(deps.db, {
|
|
214
|
+
...request,
|
|
215
|
+
skillId,
|
|
216
|
+
accountId: context.accountId,
|
|
217
|
+
workspaceId,
|
|
218
|
+
actor: { kind: "human", principalKind: "human_session", subjectId: context.subjectId },
|
|
219
|
+
}),
|
|
220
|
+
),
|
|
221
|
+
);
|
|
222
|
+
});
|
|
172
223
|
for (const operation of ["approve", "reject", "restore"] as const) {
|
|
173
224
|
app.post(`${base}/:skillId/${operation}`, async (c) => {
|
|
174
225
|
const workspaceId = c.req.param("workspaceId");
|
|
@@ -180,8 +231,22 @@ export function registerSkillContentRoutes(app: Hono, deps: ApiRouteDeps): void
|
|
|
180
231
|
{ accountId: access.grant.accountId, workspaceId, subjectId: access.grant.subjectId },
|
|
181
232
|
skillId,
|
|
182
233
|
);
|
|
183
|
-
|
|
184
|
-
|
|
234
|
+
const scope =
|
|
235
|
+
current?.scope ??
|
|
236
|
+
(operation === "approve" && request.removalOperationId
|
|
237
|
+
? await readSkillRemovalScope(
|
|
238
|
+
deps.db,
|
|
239
|
+
{
|
|
240
|
+
accountId: access.grant.accountId,
|
|
241
|
+
workspaceId,
|
|
242
|
+
subjectId: access.grant.subjectId,
|
|
243
|
+
},
|
|
244
|
+
skillId,
|
|
245
|
+
request.operationId,
|
|
246
|
+
)
|
|
247
|
+
: null);
|
|
248
|
+
if (!scope) throw new HTTPException(404, { message: "Skill not found" });
|
|
249
|
+
authorizePreferenceRegistryScopeMutation(access, scope);
|
|
185
250
|
const apply =
|
|
186
251
|
operation === "approve"
|
|
187
252
|
? approveSkill
|
|
@@ -214,7 +279,7 @@ async function skillMutation(run: () => Promise<SkillWriteReceipt>): Promise<Ski
|
|
|
214
279
|
let current: unknown = error;
|
|
215
280
|
for (let depth = 0; depth < 4 && current && typeof current === "object"; depth++) {
|
|
216
281
|
const candidate = current as { code?: unknown; cause?: unknown };
|
|
217
|
-
if (candidate.code === "23505" || candidate.code === "40001")
|
|
282
|
+
if (candidate.code === "23505" || candidate.code === "40001" || candidate.code === "55P03")
|
|
218
283
|
throw new HTTPException(409, {
|
|
219
284
|
message:
|
|
220
285
|
"Skill changed or this operation key was reused. Reload and reconcile the change.",
|
package/src/routes/skills.ts
CHANGED
|
@@ -38,6 +38,7 @@ import type { Hono } from "hono";
|
|
|
38
38
|
import { createGitHubSkillSourceClient } from "../integrations/github-skill-source";
|
|
39
39
|
import { registerSkillContentRoutes } from "./skill-content";
|
|
40
40
|
import { skillInstallerActor, skillRemovalActor } from "./skill-install-authority";
|
|
41
|
+
import { parseRequestJson } from "../http/request-body";
|
|
41
42
|
|
|
42
43
|
export type SkillRouteOverrides = Readonly<{
|
|
43
44
|
github?: GitHubSkillSourceClient;
|
|
@@ -88,7 +89,7 @@ export function registerSkillRoutes(
|
|
|
88
89
|
const { grant } = access;
|
|
89
90
|
const skillActor = skillInstallerActor(access);
|
|
90
91
|
const libraryId = decodeURIComponent(c.req.param("libraryId"));
|
|
91
|
-
const payload =
|
|
92
|
+
const payload = await parseRequestJson(c, InstallLibrarySkillRequest);
|
|
92
93
|
let loaded: ReturnType<typeof loadSkillLibrarySkill>;
|
|
93
94
|
try {
|
|
94
95
|
loaded = loadSkillLibrarySkill(libraryId, payload.expectedVersion);
|
|
@@ -150,7 +151,7 @@ export function registerSkillRoutes(
|
|
|
150
151
|
app.post("/v1/workspaces/:workspaceId/skills/preview", async (c) => {
|
|
151
152
|
const workspaceId = c.req.param("workspaceId");
|
|
152
153
|
await requireAccessGrant(c, deps, workspaceId, "workspace:read");
|
|
153
|
-
const payload =
|
|
154
|
+
const payload = await parseRequestJson(c, PreviewSkillImportRequest);
|
|
154
155
|
const resolved = await resolveForRoute(payload.url, github);
|
|
155
156
|
const installed = await getPortableSkillUninstallPreview(
|
|
156
157
|
deps.db,
|
|
@@ -176,7 +177,7 @@ export function registerSkillRoutes(
|
|
|
176
177
|
);
|
|
177
178
|
const { grant } = access;
|
|
178
179
|
const skillActor = skillInstallerActor(access);
|
|
179
|
-
const payload =
|
|
180
|
+
const payload = await parseRequestJson(c, InstallSkillRequest);
|
|
180
181
|
const resolved = await resolveForRoute(payload.url, github);
|
|
181
182
|
if (
|
|
182
183
|
resolved.preview.sourceCommit !== payload.expectedSourceCommit ||
|
|
@@ -252,7 +253,7 @@ export function registerSkillRoutes(
|
|
|
252
253
|
const { grant } = access;
|
|
253
254
|
const skillActor = skillRemovalActor(access);
|
|
254
255
|
const capabilityId = decodeURIComponent(c.req.param("capabilityId"));
|
|
255
|
-
const payload =
|
|
256
|
+
const payload = await parseRequestJson(c, UninstallSkillRequest);
|
|
256
257
|
try {
|
|
257
258
|
return c.json(
|
|
258
259
|
UninstallSkillResult.parse(
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AvailableOpenGeniSlackBots,
|
|
3
|
+
OpenGeniSlackBotOrganizationAccess,
|
|
4
|
+
UpdateOpenGeniSlackBotOrganizationAccess,
|
|
5
|
+
} from "@opengeni/contracts";
|
|
6
|
+
import {
|
|
7
|
+
isOpenGeniSlackBotConnection,
|
|
8
|
+
requireAccessGrant,
|
|
9
|
+
type ApiRouteDeps,
|
|
10
|
+
} from "@opengeni/core";
|
|
11
|
+
import {
|
|
12
|
+
availableSlackBotConnectionMetadata,
|
|
13
|
+
nestedPostgresSqlState,
|
|
14
|
+
readOrganizationSlackBotAccess,
|
|
15
|
+
setOrganizationSlackBotAccess,
|
|
16
|
+
sharedOrganizationSlackBots,
|
|
17
|
+
} from "@opengeni/db";
|
|
18
|
+
import type { Hono } from "hono";
|
|
19
|
+
import { HTTPException } from "hono/http-exception";
|
|
20
|
+
import { z } from "zod";
|
|
21
|
+
import { authorizeOrganizationIntegrationAdministration } from "./organization-integration-policy";
|
|
22
|
+
|
|
23
|
+
export function registerSlackBotAccessRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
24
|
+
const base = "/v1/workspaces/:workspaceId/connections";
|
|
25
|
+
app.get(`${base}/:connectionId/slack-bot/organization-access`, async (context) => {
|
|
26
|
+
const grant = await requireAccessGrant(
|
|
27
|
+
context,
|
|
28
|
+
deps,
|
|
29
|
+
context.req.param("workspaceId"),
|
|
30
|
+
"connections:read",
|
|
31
|
+
);
|
|
32
|
+
const connectionId = z.string().uuid().safeParse(context.req.param("connectionId"));
|
|
33
|
+
if (!connectionId.success) throw new HTTPException(422, { message: "Invalid bot connection" });
|
|
34
|
+
context.header("cache-control", "private, no-store");
|
|
35
|
+
try {
|
|
36
|
+
return context.json(
|
|
37
|
+
OpenGeniSlackBotOrganizationAccess.parse(
|
|
38
|
+
await readOrganizationSlackBotAccess(deps.db, {
|
|
39
|
+
accountId: grant.accountId,
|
|
40
|
+
workspaceId: grant.workspaceId,
|
|
41
|
+
connectionId: connectionId.data,
|
|
42
|
+
}),
|
|
43
|
+
),
|
|
44
|
+
);
|
|
45
|
+
} catch (error) {
|
|
46
|
+
if (nestedPostgresSqlState(error) === "42501")
|
|
47
|
+
throw new HTTPException(404, { message: "Local bot installation unavailable" });
|
|
48
|
+
throw error;
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
app.get(`${base}/slack-bot/available`, async (context) => {
|
|
52
|
+
const grant = await requireAccessGrant(
|
|
53
|
+
context,
|
|
54
|
+
deps,
|
|
55
|
+
context.req.param("workspaceId"),
|
|
56
|
+
"connections:read",
|
|
57
|
+
);
|
|
58
|
+
context.header("cache-control", "private, no-store");
|
|
59
|
+
const [connections, shares] = await Promise.all([
|
|
60
|
+
availableSlackBotConnectionMetadata(deps.db, grant),
|
|
61
|
+
sharedOrganizationSlackBots(deps.db, grant),
|
|
62
|
+
]);
|
|
63
|
+
return context.json(
|
|
64
|
+
AvailableOpenGeniSlackBots.parse({
|
|
65
|
+
connections: connections.filter(
|
|
66
|
+
(connection) =>
|
|
67
|
+
connection.status === "active" && isOpenGeniSlackBotConnection(connection),
|
|
68
|
+
),
|
|
69
|
+
organizationSharedConnectionIds: shares.map((share) => share.connectionId),
|
|
70
|
+
}),
|
|
71
|
+
);
|
|
72
|
+
});
|
|
73
|
+
app.put(`${base}/:connectionId/slack-bot/organization-access`, async (context) => {
|
|
74
|
+
const grant = await requireAccessGrant(
|
|
75
|
+
context,
|
|
76
|
+
deps,
|
|
77
|
+
context.req.param("workspaceId"),
|
|
78
|
+
"connections:write",
|
|
79
|
+
);
|
|
80
|
+
const connectionId = z.string().uuid().safeParse(context.req.param("connectionId"));
|
|
81
|
+
const request = UpdateOpenGeniSlackBotOrganizationAccess.safeParse(
|
|
82
|
+
await context.req.json().catch(() => null),
|
|
83
|
+
);
|
|
84
|
+
if (!connectionId.success || !request.success)
|
|
85
|
+
throw new HTTPException(422, { message: "Invalid bot access setting" });
|
|
86
|
+
context.header("cache-control", "private, no-store");
|
|
87
|
+
try {
|
|
88
|
+
const result = await setOrganizationSlackBotAccess(
|
|
89
|
+
deps.db,
|
|
90
|
+
{
|
|
91
|
+
accountId: grant.accountId,
|
|
92
|
+
workspaceId: grant.workspaceId,
|
|
93
|
+
connectionId: connectionId.data,
|
|
94
|
+
enabled: request.data.enabled,
|
|
95
|
+
},
|
|
96
|
+
() => authorizeOrganizationIntegrationAdministration(context, deps, grant.accountId, true),
|
|
97
|
+
);
|
|
98
|
+
return context.json(OpenGeniSlackBotOrganizationAccess.parse(result));
|
|
99
|
+
} catch (error) {
|
|
100
|
+
if (error instanceof HTTPException) throw error;
|
|
101
|
+
if (nestedPostgresSqlState(error) === "42501")
|
|
102
|
+
throw new HTTPException(403, {
|
|
103
|
+
message: "Organization administrator and a verified local bot installation required",
|
|
104
|
+
});
|
|
105
|
+
throw error;
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
}
|
package/src/routes/social.ts
CHANGED
|
@@ -2,8 +2,10 @@ import {
|
|
|
2
2
|
CreateSocialConnectionRequest,
|
|
3
3
|
CreateSocialPostRequest,
|
|
4
4
|
OAuthStartResponse,
|
|
5
|
+
OrganizationIntegrationDeniedError,
|
|
5
6
|
SocialOAuthStartRequest,
|
|
6
7
|
} from "@opengeni/contracts";
|
|
8
|
+
import { withOrganizationIntegrationAcquisition } from "@opengeni/db/organization-integration-policy";
|
|
7
9
|
import {
|
|
8
10
|
createSocialConnection,
|
|
9
11
|
createSocialPost,
|
|
@@ -24,6 +26,7 @@ import {
|
|
|
24
26
|
import type { ApiRouteDeps } from "@opengeni/core";
|
|
25
27
|
import { boundedLimit } from "../http/common";
|
|
26
28
|
import { completeSocialOAuthCallback, startSocialOAuth } from "../integrations/social-oauth";
|
|
29
|
+
import { parseRequestJson } from "../http/request-body";
|
|
27
30
|
|
|
28
31
|
export function registerSocialRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
29
32
|
const { db, settings, observability } = deps;
|
|
@@ -44,22 +47,28 @@ export function registerSocialRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
44
47
|
app.post("/v1/workspaces/:workspaceId/social/connections", async (c) => {
|
|
45
48
|
const workspaceId = c.req.param("workspaceId");
|
|
46
49
|
const grant = await requireAccessGrant(c, deps, workspaceId, "workspace:admin");
|
|
47
|
-
const payload =
|
|
50
|
+
const payload = await parseRequestJson(c, CreateSocialConnectionRequest);
|
|
48
51
|
try {
|
|
49
52
|
return c.json(
|
|
50
|
-
await
|
|
51
|
-
|
|
52
|
-
workspaceId,
|
|
53
|
-
provider
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
53
|
+
await withOrganizationIntegrationAcquisition(
|
|
54
|
+
db,
|
|
55
|
+
{ accountId: grant.accountId, workspaceId },
|
|
56
|
+
[payload.provider === "x" || payload.provider === "reddit" ? payload.provider : null],
|
|
57
|
+
(tx) =>
|
|
58
|
+
createSocialConnection(tx, {
|
|
59
|
+
accountId: grant.accountId,
|
|
60
|
+
workspaceId,
|
|
61
|
+
provider: payload.provider,
|
|
62
|
+
accountHandle: payload.accountHandle,
|
|
63
|
+
accountName: payload.accountName ?? null,
|
|
64
|
+
externalAccountId: payload.externalAccountId ?? null,
|
|
65
|
+
status: payload.status,
|
|
66
|
+
scopes: payload.scopes,
|
|
67
|
+
credentialRef: payload.credentialRef ?? null,
|
|
68
|
+
tokenMetadata: payload.tokenMetadata,
|
|
69
|
+
metadata: payload.metadata,
|
|
70
|
+
}),
|
|
71
|
+
),
|
|
63
72
|
201,
|
|
64
73
|
);
|
|
65
74
|
} catch (error) {
|
|
@@ -168,7 +177,7 @@ export function registerSocialRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
168
177
|
app.post("/v1/workspaces/:workspaceId/social/posts", async (c) => {
|
|
169
178
|
const workspaceId = c.req.param("workspaceId");
|
|
170
179
|
const grant = await requireAccessGrant(c, deps, workspaceId, "workspace:admin");
|
|
171
|
-
const payload =
|
|
180
|
+
const payload = await parseRequestJson(c, CreateSocialPostRequest);
|
|
172
181
|
try {
|
|
173
182
|
return c.json(
|
|
174
183
|
await createSocialPost(db, {
|
|
@@ -222,6 +231,9 @@ function parseConnectionIds(raw: string | undefined): string[] | undefined {
|
|
|
222
231
|
}
|
|
223
232
|
|
|
224
233
|
function socialHttpException(error: unknown): HTTPException {
|
|
234
|
+
if (error instanceof OrganizationIntegrationDeniedError) {
|
|
235
|
+
return new HTTPException(403, { message: error.message });
|
|
236
|
+
}
|
|
225
237
|
const message = error instanceof Error ? error.message : String(error);
|
|
226
238
|
if (message.includes("not found")) {
|
|
227
239
|
return new HTTPException(404, { message });
|