@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
package/src/routes/api-keys.ts
CHANGED
|
@@ -2,6 +2,10 @@ import {
|
|
|
2
2
|
CreateApiKeyRequest,
|
|
3
3
|
CreateApiKeyResponse,
|
|
4
4
|
CreateOrganizationApiKeyRequest,
|
|
5
|
+
UpdateOrganizationApiKeyRequest,
|
|
6
|
+
normalizeOrganizationAccessPolicy,
|
|
7
|
+
type OrganizationAccessPolicy,
|
|
8
|
+
DEVELOPER_SETUP_API_KEY_PRESET,
|
|
5
9
|
Permission,
|
|
6
10
|
type AccessContext,
|
|
7
11
|
type ApiKey,
|
|
@@ -12,7 +16,12 @@ import {
|
|
|
12
16
|
createOrganizationApiKey as createOrganizationApiKeyRecord,
|
|
13
17
|
listApiKeys,
|
|
14
18
|
listOrganizationApiKeys,
|
|
19
|
+
getOrganizationApiKey,
|
|
20
|
+
updateOrganizationApiKey,
|
|
21
|
+
OrganizationApiKeyWorkspaceScopeError,
|
|
15
22
|
OrganizationApiKeyLimitExceededError,
|
|
23
|
+
OrganizationServiceAccountNotFoundError,
|
|
24
|
+
OrganizationServiceAccountRoleError,
|
|
16
25
|
revokeApiKey,
|
|
17
26
|
revokeOrganizationApiKey,
|
|
18
27
|
} from "@opengeni/db";
|
|
@@ -23,13 +32,19 @@ import { HTTPException } from "hono/http-exception";
|
|
|
23
32
|
import type { ApiRouteDeps } from "@opengeni/core";
|
|
24
33
|
import {
|
|
25
34
|
accountScopedApiKeyWorkspaceAuthority,
|
|
35
|
+
organizationApiKeyAccess,
|
|
36
|
+
hasPermission,
|
|
37
|
+
organizationWorkspaceInScope,
|
|
26
38
|
requireAccessContext,
|
|
27
|
-
requireAccessGrant,
|
|
28
39
|
requireAccessGrantAuthorization,
|
|
40
|
+
requireApiKeyManagementContext,
|
|
41
|
+
requireExplicitPermissionDelegation,
|
|
29
42
|
type AccessGrantAuthorization,
|
|
30
43
|
} from "@opengeni/core";
|
|
31
44
|
import { requireLimit } from "@opengeni/core";
|
|
32
45
|
|
|
46
|
+
export { organizationApiKeyAccess } from "@opengeni/core";
|
|
47
|
+
|
|
33
48
|
/** Permissions minted onto a `full` organization API key. */
|
|
34
49
|
export const organizationApiKeyPermissions: Permission[] = [
|
|
35
50
|
"account:read",
|
|
@@ -55,28 +70,43 @@ export const organizationReadApiKeyPermissions: Permission[] = [
|
|
|
55
70
|
export function organizationApiKeyPermissionsForAccess(
|
|
56
71
|
access: OrganizationApiKeyAccess,
|
|
57
72
|
): Permission[] {
|
|
58
|
-
return access === "
|
|
59
|
-
? [...
|
|
60
|
-
:
|
|
73
|
+
return access === "developer_setup"
|
|
74
|
+
? [...DEVELOPER_SETUP_API_KEY_PRESET.permissions]
|
|
75
|
+
: access === "read"
|
|
76
|
+
? [...organizationReadApiKeyPermissions]
|
|
77
|
+
: [...organizationApiKeyPermissions];
|
|
61
78
|
}
|
|
62
79
|
|
|
63
|
-
/**
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
80
|
+
/** Existing callers retain their expiry; setup keys default to one day. */
|
|
81
|
+
export function organizationApiKeyExpiryDate(
|
|
82
|
+
request: Pick<CreateOrganizationApiKeyRequest, "preset" | "expiresAt"> &
|
|
83
|
+
Partial<Pick<CreateOrganizationApiKeyRequest, "access">>,
|
|
84
|
+
now: Date = new Date(),
|
|
85
|
+
): Date | null {
|
|
86
|
+
if (request.expiresAt !== undefined) return new Date(request.expiresAt);
|
|
87
|
+
return request.preset === "developer_setup" || request.access === "developer_setup"
|
|
88
|
+
? new Date(now.getTime() + DEVELOPER_SETUP_API_KEY_PRESET.defaultExpiryHours * 60 * 60 * 1000)
|
|
89
|
+
: null;
|
|
70
90
|
}
|
|
71
91
|
|
|
72
92
|
function withOrganizationApiKeyAccess(apiKey: ApiKey): ApiKey {
|
|
73
|
-
|
|
93
|
+
const workspaceScope = apiKey.workspaceScope ?? { kind: "all" as const };
|
|
94
|
+
return {
|
|
95
|
+
...apiKey,
|
|
96
|
+
access: organizationApiKeyAccess(apiKey.permissions),
|
|
97
|
+
workspaceScope,
|
|
98
|
+
policy: normalizeOrganizationAccessPolicy({
|
|
99
|
+
preset: "custom",
|
|
100
|
+
permissions: apiKey.permissions,
|
|
101
|
+
workspaceScope,
|
|
102
|
+
}),
|
|
103
|
+
};
|
|
74
104
|
}
|
|
75
105
|
|
|
76
106
|
export function registerApiKeyRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
77
107
|
app.get("/v1/workspaces/:workspaceId/api-keys", async (c) => {
|
|
78
108
|
const workspaceId = c.req.param("workspaceId");
|
|
79
|
-
await
|
|
109
|
+
await requireWorkspaceApiKeyControl(c, deps, workspaceId);
|
|
80
110
|
return c.json({ apiKeys: await listApiKeys(deps.db, workspaceId) });
|
|
81
111
|
});
|
|
82
112
|
|
|
@@ -85,12 +115,7 @@ export function registerApiKeyRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
85
115
|
zValidator("json", CreateApiKeyRequest.omit({ workspaceId: true })),
|
|
86
116
|
async (c) => {
|
|
87
117
|
const workspaceId = c.req.param("workspaceId");
|
|
88
|
-
const authorization = await
|
|
89
|
-
c,
|
|
90
|
-
deps,
|
|
91
|
-
workspaceId,
|
|
92
|
-
"api_keys:manage",
|
|
93
|
-
);
|
|
118
|
+
const authorization = await requireWorkspaceApiKeyControl(c, deps, workspaceId);
|
|
94
119
|
const grant = authorization.grant;
|
|
95
120
|
const body = c.req.valid("json");
|
|
96
121
|
const permissions: Permission[] =
|
|
@@ -120,7 +145,7 @@ export function registerApiKeyRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
120
145
|
|
|
121
146
|
app.delete("/v1/workspaces/:workspaceId/api-keys/:apiKeyId", async (c) => {
|
|
122
147
|
const workspaceId = c.req.param("workspaceId");
|
|
123
|
-
await
|
|
148
|
+
await requireWorkspaceApiKeyControl(c, deps, workspaceId);
|
|
124
149
|
return c.json(await revokeApiKey(deps.db, workspaceId, c.req.param("apiKeyId")));
|
|
125
150
|
});
|
|
126
151
|
|
|
@@ -143,7 +168,26 @@ export function registerApiKeyRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
143
168
|
const context = await requireAccessContext(c, deps);
|
|
144
169
|
requireOrganizationApiKeyControlPermission(context, organizationId);
|
|
145
170
|
const body = c.req.valid("json");
|
|
171
|
+
const rawBody: Record<string, unknown> = await c.req.json();
|
|
172
|
+
if (body.policy && (rawBody.access !== undefined || rawBody.preset !== undefined))
|
|
173
|
+
throw new HTTPException(400, {
|
|
174
|
+
message: "Choose either a policy or a legacy access tier/preset",
|
|
175
|
+
});
|
|
146
176
|
const token = generateApiKeyToken();
|
|
177
|
+
const permissions =
|
|
178
|
+
body.policy?.permissions ??
|
|
179
|
+
(body.preset === "developer_setup"
|
|
180
|
+
? [...DEVELOPER_SETUP_API_KEY_PRESET.permissions]
|
|
181
|
+
: organizationApiKeyPermissionsForAccess(body.access));
|
|
182
|
+
ensureOrganizationPolicyDelegable(
|
|
183
|
+
context,
|
|
184
|
+
body.policy ?? {
|
|
185
|
+
preset: "custom",
|
|
186
|
+
permissions,
|
|
187
|
+
workspaceScope: { kind: "all" },
|
|
188
|
+
},
|
|
189
|
+
!body.policy,
|
|
190
|
+
);
|
|
147
191
|
try {
|
|
148
192
|
const apiKey = await createOrganizationApiKeyRecord(deps.db, {
|
|
149
193
|
accountId: organizationId,
|
|
@@ -151,10 +195,13 @@ export function registerApiKeyRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
151
195
|
description: body.description ?? null,
|
|
152
196
|
prefix: token.slice(0, 14),
|
|
153
197
|
keyHash: await sha256Hex(token),
|
|
154
|
-
permissions
|
|
155
|
-
|
|
198
|
+
permissions,
|
|
199
|
+
...(body.policy ? { policy: body.policy } : {}),
|
|
200
|
+
expiresAt: organizationApiKeyExpiryDate(body),
|
|
156
201
|
maxActiveKeys: organizationApiKeyLimit(deps),
|
|
157
202
|
rotationSourceApiKeyId: authenticatedApiKeyId(context),
|
|
203
|
+
serviceAccountId: body.serviceAccountId ?? null,
|
|
204
|
+
createdBySubjectId: context.subjectId,
|
|
158
205
|
});
|
|
159
206
|
return c.json(
|
|
160
207
|
CreateApiKeyResponse.parse({ apiKey: withOrganizationApiKeyAccess(apiKey), token }),
|
|
@@ -164,6 +211,44 @@ export function registerApiKeyRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
164
211
|
if (error instanceof OrganizationApiKeyLimitExceededError) {
|
|
165
212
|
throw new HTTPException(429, { message: error.message });
|
|
166
213
|
}
|
|
214
|
+
if (error instanceof OrganizationApiKeyWorkspaceScopeError)
|
|
215
|
+
throw new HTTPException(400, { message: error.message });
|
|
216
|
+
throwServiceAccountError(error);
|
|
217
|
+
throw error;
|
|
218
|
+
}
|
|
219
|
+
},
|
|
220
|
+
);
|
|
221
|
+
|
|
222
|
+
app.get("/v1/organizations/:organizationId/api-keys/:apiKeyId", async (c) => {
|
|
223
|
+
const organizationId = c.req.param("organizationId");
|
|
224
|
+
requireOrganizationApiKeyControlPermission(await requireAccessContext(c, deps), organizationId);
|
|
225
|
+
const apiKey = await getOrganizationApiKey(deps.db, organizationId, c.req.param("apiKeyId"));
|
|
226
|
+
if (!apiKey) throw new HTTPException(404, { message: "API key not found" });
|
|
227
|
+
return c.json(withOrganizationApiKeyAccess(apiKey));
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
app.patch(
|
|
231
|
+
"/v1/organizations/:organizationId/api-keys/:apiKeyId",
|
|
232
|
+
zValidator("json", UpdateOrganizationApiKeyRequest),
|
|
233
|
+
async (c) => {
|
|
234
|
+
const organizationId = c.req.param("organizationId");
|
|
235
|
+
const context = await requireAccessContext(c, deps);
|
|
236
|
+
requireOrganizationApiKeyControlPermission(context, organizationId);
|
|
237
|
+
const body = c.req.valid("json");
|
|
238
|
+
if (body.policy) ensureOrganizationPolicyDelegable(context, body.policy);
|
|
239
|
+
try {
|
|
240
|
+
const apiKey = await updateOrganizationApiKey(
|
|
241
|
+
deps.db,
|
|
242
|
+
organizationId,
|
|
243
|
+
c.req.param("apiKeyId"),
|
|
244
|
+
body,
|
|
245
|
+
);
|
|
246
|
+
if (!apiKey) throw new HTTPException(404, { message: "API key not found" });
|
|
247
|
+
return c.json(withOrganizationApiKeyAccess(apiKey));
|
|
248
|
+
} catch (error) {
|
|
249
|
+
if (error instanceof OrganizationApiKeyWorkspaceScopeError)
|
|
250
|
+
throw new HTTPException(400, { message: error.message });
|
|
251
|
+
throwServiceAccountError(error);
|
|
167
252
|
throw error;
|
|
168
253
|
}
|
|
169
254
|
},
|
|
@@ -181,6 +266,14 @@ export function registerApiKeyRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
181
266
|
});
|
|
182
267
|
}
|
|
183
268
|
|
|
269
|
+
/** Service account problems read as the person would expect. */
|
|
270
|
+
export function throwServiceAccountError(error: unknown): void {
|
|
271
|
+
if (error instanceof OrganizationServiceAccountNotFoundError)
|
|
272
|
+
throw new HTTPException(404, { message: error.message });
|
|
273
|
+
if (error instanceof OrganizationServiceAccountRoleError)
|
|
274
|
+
throw new HTTPException(400, { message: error.message });
|
|
275
|
+
}
|
|
276
|
+
|
|
184
277
|
function requireAccountPermission(
|
|
185
278
|
context: AccessContext,
|
|
186
279
|
accountId: string,
|
|
@@ -199,8 +292,12 @@ function ensureDelegablePermissions(
|
|
|
199
292
|
authorization: AccessGrantAuthorization,
|
|
200
293
|
requested: Permission[],
|
|
201
294
|
): void {
|
|
295
|
+
requireExplicitPermissionDelegation(authorization.grant, requested);
|
|
202
296
|
const grantPermissions = authorization.grant.permissions;
|
|
203
|
-
if (
|
|
297
|
+
if (
|
|
298
|
+
grantPermissions.includes("workspace:admin") &&
|
|
299
|
+
authorization.grant.permissionMode !== "explicit"
|
|
300
|
+
) {
|
|
204
301
|
const accountLiteralPermissions = new Set<Permission>([
|
|
205
302
|
"account:read",
|
|
206
303
|
"account:admin",
|
|
@@ -228,22 +325,64 @@ function ensureDelegablePermissions(
|
|
|
228
325
|
}
|
|
229
326
|
}
|
|
230
327
|
|
|
231
|
-
|
|
328
|
+
/** Key management is not a way for a policy credential to amplify itself. */
|
|
329
|
+
function ensureOrganizationPolicyDelegable(
|
|
330
|
+
context: AccessContext,
|
|
331
|
+
policy: OrganizationAccessPolicy,
|
|
332
|
+
legacy = false,
|
|
333
|
+
): void {
|
|
334
|
+
const authority = accountScopedApiKeyWorkspaceAuthority(context);
|
|
335
|
+
const source = context.credential?.policy;
|
|
336
|
+
if (!authority || authority.permissionMode !== "explicit" || !source) return;
|
|
337
|
+
const requested = legacy
|
|
338
|
+
? Permission.options.filter((permission) => hasPermission(policy.permissions, permission))
|
|
339
|
+
: policy.permissions;
|
|
340
|
+
if (requested.some((permission) => !source.permissions.includes(permission)))
|
|
341
|
+
throw new HTTPException(403, {
|
|
342
|
+
message: "cannot delegate permissions beyond organization key policy",
|
|
343
|
+
});
|
|
344
|
+
if (
|
|
345
|
+
source.workspaceScope.kind === "selected" &&
|
|
346
|
+
(policy.workspaceScope.kind === "all" ||
|
|
347
|
+
policy.workspaceScope.workspaceIds.some(
|
|
348
|
+
(id) => !organizationWorkspaceInScope(source.workspaceScope, id),
|
|
349
|
+
))
|
|
350
|
+
)
|
|
351
|
+
throw new HTTPException(403, {
|
|
352
|
+
message: "cannot delegate workspaces beyond organization key scope",
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
export function requireOrganizationApiKeyControlPermission(
|
|
232
357
|
context: AccessContext,
|
|
233
358
|
organizationId: string,
|
|
234
359
|
): void {
|
|
360
|
+
requireApiKeyManagementContext(context);
|
|
235
361
|
requireAccountPermission(context, organizationId, "api_keys:manage");
|
|
236
362
|
if (!context.subjectId.startsWith("api_key:")) return;
|
|
237
363
|
const authority = accountScopedApiKeyWorkspaceAuthority(context);
|
|
238
364
|
if (
|
|
239
365
|
!authority ||
|
|
240
366
|
authority.accountId !== organizationId ||
|
|
241
|
-
!authority.permissions.includes("api_keys:manage")
|
|
367
|
+
(!authority.permissions.includes("api_keys:manage") &&
|
|
368
|
+
!context.accountGrants.some(
|
|
369
|
+
(grant) =>
|
|
370
|
+
grant.accountId === organizationId && grant.permissions.includes("account:admin"),
|
|
371
|
+
))
|
|
242
372
|
) {
|
|
243
373
|
throw new HTTPException(403, { message: "organization API key authority required" });
|
|
244
374
|
}
|
|
245
375
|
}
|
|
246
376
|
|
|
377
|
+
async function requireWorkspaceApiKeyControl(
|
|
378
|
+
c: Parameters<typeof requireAccessContext>[0],
|
|
379
|
+
deps: ApiRouteDeps,
|
|
380
|
+
workspaceId: string,
|
|
381
|
+
): Promise<AccessGrantAuthorization> {
|
|
382
|
+
requireApiKeyManagementContext(await requireAccessContext(c, deps));
|
|
383
|
+
return await requireAccessGrantAuthorization(c, deps, workspaceId, "api_keys:manage");
|
|
384
|
+
}
|
|
385
|
+
|
|
247
386
|
function authenticatedApiKeyId(context: AccessContext): string | null {
|
|
248
387
|
return context.subjectId.startsWith("api_key:")
|
|
249
388
|
? context.subjectId.slice("api_key:".length)
|
|
@@ -4,6 +4,8 @@ import {
|
|
|
4
4
|
ArtifactCatalogKind,
|
|
5
5
|
ArtifactCatalogListQuery,
|
|
6
6
|
ArtifactCatalogListResponse,
|
|
7
|
+
ArtifactPinResponse,
|
|
8
|
+
UpdateArtifactPinRequest,
|
|
7
9
|
retainedArtifactReferenceFromFile,
|
|
8
10
|
retainedGeneratedImageReferenceFromFile,
|
|
9
11
|
type AccessGrant,
|
|
@@ -19,13 +21,17 @@ import {
|
|
|
19
21
|
requireSessionAuthorization,
|
|
20
22
|
SessionAuthorizationDeniedError,
|
|
21
23
|
SessionAuthorizationUnavailableError,
|
|
24
|
+
siteViewerForGrant,
|
|
22
25
|
type ApiRouteDeps,
|
|
23
26
|
} from "@opengeni/core";
|
|
24
27
|
import {
|
|
25
28
|
getFilesForSubject,
|
|
26
29
|
getGeneratedImageArtifact,
|
|
27
30
|
getSessionAuthorityProjection,
|
|
31
|
+
isWorkspaceArtifactVisible,
|
|
28
32
|
listArtifactCatalogCandidates,
|
|
33
|
+
nestedPostgresSqlState,
|
|
34
|
+
updateArtifactPin,
|
|
29
35
|
withSessionRlsActorContext,
|
|
30
36
|
type ArtifactCatalogCandidate,
|
|
31
37
|
type ArtifactCatalogPosition,
|
|
@@ -33,6 +39,7 @@ import {
|
|
|
33
39
|
} from "@opengeni/db";
|
|
34
40
|
import type { Hono } from "hono";
|
|
35
41
|
import { HTTPException } from "hono/http-exception";
|
|
42
|
+
import { z } from "zod";
|
|
36
43
|
import { artifactCatalogCursorCodec } from "../artifact-catalog-cursor";
|
|
37
44
|
import {
|
|
38
45
|
editableArtifactActorForGrant,
|
|
@@ -51,9 +58,106 @@ const position = (row: ArtifactCatalogCandidate): ArtifactCatalogPosition => ({
|
|
|
51
58
|
key: row.sort_key,
|
|
52
59
|
kind: row.kind,
|
|
53
60
|
id: row.id,
|
|
61
|
+
pinned: row.pinned ?? false,
|
|
54
62
|
});
|
|
55
63
|
|
|
56
64
|
export function registerArtifactCatalogRoutes(app: Hono, deps: Dependencies): void {
|
|
65
|
+
app.put("/v1/workspaces/:workspaceId/artifact-catalog/:kind/:artifactId/pin", async (context) => {
|
|
66
|
+
const workspaceId = context.req.param("workspaceId");
|
|
67
|
+
const authorization = await requireAccessGrantAuthorization(
|
|
68
|
+
context,
|
|
69
|
+
deps,
|
|
70
|
+
workspaceId,
|
|
71
|
+
"artifacts:publish",
|
|
72
|
+
);
|
|
73
|
+
const grant = authorization.grant;
|
|
74
|
+
if (!hasPermission(grant.permissions, "artifacts:publish"))
|
|
75
|
+
throw new HTTPException(403, { message: "Artifact publish access required" });
|
|
76
|
+
const kind = ArtifactCatalogKind.safeParse(context.req.param("kind"));
|
|
77
|
+
const body = UpdateArtifactPinRequest.safeParse(await context.req.json().catch(() => null));
|
|
78
|
+
const requestedId = context.req.param("artifactId");
|
|
79
|
+
if (
|
|
80
|
+
!kind.success ||
|
|
81
|
+
!body.success ||
|
|
82
|
+
!(editableKinds.has(kind.data)
|
|
83
|
+
? /^[0-9a-f]{32}$/.test(requestedId)
|
|
84
|
+
: z.string().uuid().safeParse(requestedId).success)
|
|
85
|
+
)
|
|
86
|
+
throw new HTTPException(422, { message: "Invalid artifact pin request" });
|
|
87
|
+
const artifactId = editableKinds.has(kind.data) ? requestedId : requestedId.toLowerCase();
|
|
88
|
+
const fileKind = kind.data === "file" || kind.data === "image";
|
|
89
|
+
if (!hasPermission(grant.permissions, fileKind ? "files:read" : "artifacts:read"))
|
|
90
|
+
throw new HTTPException(403, { message: "Artifact read access required" });
|
|
91
|
+
const actor = fileKind
|
|
92
|
+
? await fileOwnerContextForAccess(deps, authorization, "files:read")
|
|
93
|
+
: { subjectId: grant.subjectId, privateFileOwnerSubjectId: null };
|
|
94
|
+
context.header("cache-control", "private, no-store");
|
|
95
|
+
return withSessionRlsActorContext(actor, async () => {
|
|
96
|
+
if (editableKinds.has(kind.data)) {
|
|
97
|
+
if (!deps.editableArtifacts)
|
|
98
|
+
throw new HTTPException(503, { message: "Editable artifacts are unavailable" });
|
|
99
|
+
try {
|
|
100
|
+
const scope = editableArtifactScope({ accountId: grant.accountId, workspaceId });
|
|
101
|
+
const artifact = await deps.editableArtifacts.readArtifact({
|
|
102
|
+
scope,
|
|
103
|
+
actor: editableArtifactActorForGrant(grant, "0000000000000001"),
|
|
104
|
+
artifactId: editableArtifactId(artifactId),
|
|
105
|
+
});
|
|
106
|
+
if (
|
|
107
|
+
artifact.scope.accountId !== scope.accountId ||
|
|
108
|
+
artifact.scope.workspaceId !== scope.workspaceId ||
|
|
109
|
+
artifact.id !== artifactId ||
|
|
110
|
+
artifact.modality !== kind.data
|
|
111
|
+
)
|
|
112
|
+
throw new HTTPException(404, { message: "Artifact not found" });
|
|
113
|
+
} catch (error) {
|
|
114
|
+
if (isInvisibleListCandidate(error))
|
|
115
|
+
throw new HTTPException(404, { message: "Artifact not found" });
|
|
116
|
+
throw editableArtifactHttpError(error);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// An Only me Site someone else owns answers exactly like a missing one.
|
|
120
|
+
if (
|
|
121
|
+
kind.data === "site" &&
|
|
122
|
+
!(await isWorkspaceArtifactVisible(
|
|
123
|
+
deps.db,
|
|
124
|
+
workspaceId,
|
|
125
|
+
await siteViewerForGrant(deps.db, grant),
|
|
126
|
+
artifactId,
|
|
127
|
+
))
|
|
128
|
+
)
|
|
129
|
+
throw new HTTPException(404, { message: "Artifact not found" });
|
|
130
|
+
if (fileKind) {
|
|
131
|
+
const subjectId = await fileAuthoritySubjectIdForGrant(deps, grant);
|
|
132
|
+
const [file] = await getFilesForSubject(deps.db, {
|
|
133
|
+
accountId: grant.accountId,
|
|
134
|
+
workspaceId,
|
|
135
|
+
subjectId,
|
|
136
|
+
fileIds: [artifactId],
|
|
137
|
+
});
|
|
138
|
+
if (!file || file.status !== "ready")
|
|
139
|
+
throw new HTTPException(404, { message: "Artifact not found" });
|
|
140
|
+
}
|
|
141
|
+
try {
|
|
142
|
+
await updateArtifactPin(
|
|
143
|
+
deps.db,
|
|
144
|
+
{ accountId: grant.accountId, workspaceId },
|
|
145
|
+
{
|
|
146
|
+
kind: kind.data,
|
|
147
|
+
artifactId,
|
|
148
|
+
pinned: body.data.pinned,
|
|
149
|
+
},
|
|
150
|
+
);
|
|
151
|
+
} catch (error) {
|
|
152
|
+
if (nestedPostgresSqlState(error) === "42501")
|
|
153
|
+
throw new HTTPException(404, { message: "Artifact not found" });
|
|
154
|
+
throw error;
|
|
155
|
+
}
|
|
156
|
+
return context.json(
|
|
157
|
+
ArtifactPinResponse.parse({ kind: kind.data, artifactId, pinned: body.data.pinned }),
|
|
158
|
+
);
|
|
159
|
+
});
|
|
160
|
+
});
|
|
57
161
|
app.get("/v1/workspaces/:workspaceId/artifact-catalog", async (context) => {
|
|
58
162
|
const workspaceId = context.req.param("workspaceId");
|
|
59
163
|
const authorization = await requireAccessGrantAuthorization(context, deps, workspaceId);
|
|
@@ -156,6 +260,9 @@ export function registerArtifactCatalogRoutes(app: Hono, deps: Dependencies): vo
|
|
|
156
260
|
let lastReturned: ArtifactCatalogPosition | undefined;
|
|
157
261
|
let nextCursor: string | null = null;
|
|
158
262
|
const fileSubject = includesFiles ? await fileAuthoritySubjectIdForGrant(deps, grant) : null;
|
|
263
|
+
const siteViewer = kinds.includes("site")
|
|
264
|
+
? await siteViewerForGrant(deps.db, grant)
|
|
265
|
+
: { subjectId: null };
|
|
159
266
|
for (let batch = 0; batch < MAX_BATCHES; batch++) {
|
|
160
267
|
const candidates = await listArtifactCatalogCandidates(
|
|
161
268
|
deps.db,
|
|
@@ -163,6 +270,7 @@ export function registerArtifactCatalogRoutes(app: Hono, deps: Dependencies): vo
|
|
|
163
270
|
{
|
|
164
271
|
query,
|
|
165
272
|
kinds,
|
|
273
|
+
siteViewer,
|
|
166
274
|
snapshotAt,
|
|
167
275
|
...(after ? { after } : {}),
|
|
168
276
|
limit: CANDIDATE_BATCH,
|
|
@@ -210,8 +318,11 @@ async function projectCandidate(
|
|
|
210
318
|
status: row.status,
|
|
211
319
|
createdAt: iso(row.created_at),
|
|
212
320
|
updatedAt: iso(row.updated_at),
|
|
321
|
+
...(row.pinned !== undefined ? { pinned: row.pinned } : {}),
|
|
213
322
|
};
|
|
214
323
|
if (row.version_id) item.versionId = row.version_id;
|
|
324
|
+
if (row.kind === "site")
|
|
325
|
+
item.visibility = row.site_visibility === "user_private" ? "private" : "workspace";
|
|
215
326
|
if (editableKinds.has(row.kind)) {
|
|
216
327
|
const scope = editableArtifactScope({
|
|
217
328
|
accountId: grant.accountId,
|