@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,128 @@
|
|
|
1
|
+
import { zValidator } from "@hono/zod-validator";
|
|
2
|
+
import {
|
|
3
|
+
CreateOrganizationServiceAccountRequest,
|
|
4
|
+
ListOrganizationServiceAccountsResponse,
|
|
5
|
+
OrganizationServiceAccount,
|
|
6
|
+
UpdateOrganizationServiceAccountRequest,
|
|
7
|
+
type AccessContext,
|
|
8
|
+
} from "@opengeni/contracts";
|
|
9
|
+
import { requireAccessContext, type ApiRouteDeps } from "@opengeni/core";
|
|
10
|
+
import {
|
|
11
|
+
createOrganizationServiceAccount,
|
|
12
|
+
deleteOrganizationServiceAccount,
|
|
13
|
+
getOrganizationServiceAccount,
|
|
14
|
+
listOrganizationServiceAccounts,
|
|
15
|
+
updateOrganizationServiceAccount,
|
|
16
|
+
} from "@opengeni/db";
|
|
17
|
+
import type { Context, Hono } from "hono";
|
|
18
|
+
import { HTTPException } from "hono/http-exception";
|
|
19
|
+
import { z } from "zod";
|
|
20
|
+
|
|
21
|
+
import { requireOrganizationApiKeyControlPermission, throwServiceAccountError } from "./api-keys";
|
|
22
|
+
|
|
23
|
+
/* ----------------------------------------------------------------------------
|
|
24
|
+
Service accounts: organization identities with no person behind them. They
|
|
25
|
+
hold organization API keys. Whoever may manage the organization's keys may
|
|
26
|
+
manage service accounts; only an organization administrator can make one an
|
|
27
|
+
admin. Deleting one revokes its keys at once.
|
|
28
|
+
-------------------------------------------------------------------------- */
|
|
29
|
+
|
|
30
|
+
const Id = z.string().uuid();
|
|
31
|
+
|
|
32
|
+
export function registerOrganizationServiceAccountRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
33
|
+
const path = "/v1/organizations/:organizationId/service-accounts";
|
|
34
|
+
|
|
35
|
+
app.get(path, async (c) => {
|
|
36
|
+
const { organizationId } = await requireControl(c, deps);
|
|
37
|
+
c.header("cache-control", "no-store");
|
|
38
|
+
return c.json(
|
|
39
|
+
ListOrganizationServiceAccountsResponse.parse({
|
|
40
|
+
serviceAccounts: await listOrganizationServiceAccounts(deps.db, organizationId),
|
|
41
|
+
}),
|
|
42
|
+
);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
app.post(path, zValidator("json", CreateOrganizationServiceAccountRequest), async (c) => {
|
|
46
|
+
const { organizationId, context } = await requireControl(c, deps);
|
|
47
|
+
const body = c.req.valid("json");
|
|
48
|
+
if (body.role === "admin") requireOrganizationAdmin(context, organizationId);
|
|
49
|
+
const created = await createOrganizationServiceAccount(deps.db, {
|
|
50
|
+
accountId: organizationId,
|
|
51
|
+
name: body.name,
|
|
52
|
+
description: body.description ?? null,
|
|
53
|
+
role: body.role,
|
|
54
|
+
createdBySubjectId: context.subjectId,
|
|
55
|
+
});
|
|
56
|
+
return c.json(OrganizationServiceAccount.parse(created), 201);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
app.get(`${path}/:serviceAccountId`, async (c) => {
|
|
60
|
+
const { organizationId } = await requireControl(c, deps);
|
|
61
|
+
const found = await getOrganizationServiceAccount(deps.db, organizationId, serviceAccountId(c));
|
|
62
|
+
if (!found) throw new HTTPException(404, { message: "Service account not found" });
|
|
63
|
+
return c.json(OrganizationServiceAccount.parse(found));
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
app.patch(
|
|
67
|
+
`${path}/:serviceAccountId`,
|
|
68
|
+
zValidator("json", UpdateOrganizationServiceAccountRequest),
|
|
69
|
+
async (c) => {
|
|
70
|
+
const { organizationId, context } = await requireControl(c, deps);
|
|
71
|
+
const body = c.req.valid("json");
|
|
72
|
+
if (body.role === "admin") requireOrganizationAdmin(context, organizationId);
|
|
73
|
+
try {
|
|
74
|
+
return c.json(
|
|
75
|
+
OrganizationServiceAccount.parse(
|
|
76
|
+
await updateOrganizationServiceAccount(
|
|
77
|
+
deps.db,
|
|
78
|
+
organizationId,
|
|
79
|
+
serviceAccountId(c),
|
|
80
|
+
body,
|
|
81
|
+
),
|
|
82
|
+
),
|
|
83
|
+
);
|
|
84
|
+
} catch (error) {
|
|
85
|
+
throwServiceAccountError(error);
|
|
86
|
+
throw error;
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
app.delete(`${path}/:serviceAccountId`, async (c) => {
|
|
92
|
+
const { organizationId } = await requireControl(c, deps);
|
|
93
|
+
try {
|
|
94
|
+
await deleteOrganizationServiceAccount(deps.db, organizationId, serviceAccountId(c));
|
|
95
|
+
} catch (error) {
|
|
96
|
+
throwServiceAccountError(error);
|
|
97
|
+
throw error;
|
|
98
|
+
}
|
|
99
|
+
return c.body(null, 204);
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
async function requireControl(
|
|
104
|
+
c: Context,
|
|
105
|
+
deps: ApiRouteDeps,
|
|
106
|
+
): Promise<{ organizationId: string; context: AccessContext }> {
|
|
107
|
+
const parsed = Id.safeParse(c.req.param("organizationId"));
|
|
108
|
+
if (!parsed.success) throw new HTTPException(404, { message: "organization not found" });
|
|
109
|
+
const organizationId = parsed.data.toLowerCase();
|
|
110
|
+
const context = await requireAccessContext(c, deps);
|
|
111
|
+
requireOrganizationApiKeyControlPermission(context, organizationId);
|
|
112
|
+
return { organizationId, context };
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function serviceAccountId(c: Context): string {
|
|
116
|
+
const parsed = Id.safeParse(c.req.param("serviceAccountId"));
|
|
117
|
+
if (!parsed.success) throw new HTTPException(404, { message: "Service account not found" });
|
|
118
|
+
return parsed.data.toLowerCase();
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/** Only an organization administrator can make a service account an admin. */
|
|
122
|
+
function requireOrganizationAdmin(context: AccessContext, organizationId: string): void {
|
|
123
|
+
const grant = context.accountGrants.find((candidate) => candidate.accountId === organizationId);
|
|
124
|
+
if (!grant?.permissions.includes("account:admin"))
|
|
125
|
+
throw new HTTPException(403, {
|
|
126
|
+
message: "Only an organization administrator can make a service account an admin.",
|
|
127
|
+
});
|
|
128
|
+
}
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
} from "@opengeni/contracts";
|
|
8
8
|
import {
|
|
9
9
|
accountScopedApiKeyWorkspaceAuthority,
|
|
10
|
+
organizationWorkspaceInScope,
|
|
10
11
|
hasPermission,
|
|
11
12
|
requireAccessContext,
|
|
12
13
|
requireAccessGrantAuthorization,
|
|
@@ -14,6 +15,7 @@ import {
|
|
|
14
15
|
SessionAuthorizationDeniedError,
|
|
15
16
|
SessionAuthorizationUnavailableError,
|
|
16
17
|
type ApiRouteDeps,
|
|
18
|
+
isVerifiedDelegatedHumanAuthorization,
|
|
17
19
|
} from "@opengeni/core";
|
|
18
20
|
import {
|
|
19
21
|
decodeSessionListCursor,
|
|
@@ -26,6 +28,7 @@ import {
|
|
|
26
28
|
import type { Context, Hono } from "hono";
|
|
27
29
|
import { HTTPException } from "hono/http-exception";
|
|
28
30
|
import { z } from "zod";
|
|
31
|
+
import { loadCodexSessionPointerProjection } from "../codex-session-pointers";
|
|
29
32
|
|
|
30
33
|
/**
|
|
31
34
|
* Upper bound on the workspace page reads one request performs. The
|
|
@@ -161,9 +164,13 @@ export function registerOrganizationSessionRoutes(app: Hono, deps: ApiRouteDeps)
|
|
|
161
164
|
// Personal workspaces are excluded by the inventory itself; the stable id
|
|
162
165
|
// order is what makes the `{ workspaceId, cursor }` continuation resumable
|
|
163
166
|
// even when a workspace is created or deleted between pages.
|
|
164
|
-
const
|
|
165
|
-
|
|
166
|
-
|
|
167
|
+
const authority = accountScopedApiKeyWorkspaceAuthority(context);
|
|
168
|
+
const workspaces = (await listSharedWorkspacesForAccount(deps.db, organizationId))
|
|
169
|
+
.filter(
|
|
170
|
+
(workspace) =>
|
|
171
|
+
!authority || organizationWorkspaceInScope(authority.workspaceScope, workspace.id),
|
|
172
|
+
)
|
|
173
|
+
.sort(compareWorkspaceIds);
|
|
167
174
|
let index = 0;
|
|
168
175
|
let innerCursor: string | null = null;
|
|
169
176
|
let pinnedOffset = 0;
|
|
@@ -201,7 +208,14 @@ export function registerOrganizationSessionRoutes(app: Hono, deps: ApiRouteDeps)
|
|
|
201
208
|
pinnedOffset = 0;
|
|
202
209
|
continue;
|
|
203
210
|
}
|
|
204
|
-
|
|
211
|
+
// The Codex pointers by the organization's cutover disposition, exactly
|
|
212
|
+
// as the workspace session routes show them.
|
|
213
|
+
const codexPointers = await loadCodexSessionPointerProjection(
|
|
214
|
+
deps.db,
|
|
215
|
+
workspace.id,
|
|
216
|
+
page.sessions,
|
|
217
|
+
);
|
|
218
|
+
sessions.push(...page.sessions.map(codexPointers));
|
|
205
219
|
if (page.nextPinnedOffset !== null) {
|
|
206
220
|
// The page ended inside this workspace's pinned prefix.
|
|
207
221
|
innerCursor = null;
|
|
@@ -298,7 +312,9 @@ async function listWorkspaceSessionPage(
|
|
|
298
312
|
? { scopeSubjectId: input.query.scopeSubjectId }
|
|
299
313
|
: {}),
|
|
300
314
|
...(authorizationScope ? { authorizationScope } : {}),
|
|
301
|
-
personalWorkspaceOwnerException:
|
|
315
|
+
personalWorkspaceOwnerException:
|
|
316
|
+
authorization.canonicalManagedHumanSession ||
|
|
317
|
+
isVerifiedDelegatedHumanAuthorization(authorization),
|
|
302
318
|
});
|
|
303
319
|
const withStatus = (rows: Session[]) =>
|
|
304
320
|
input.query.status ? rows.filter((session) => session.status === input.query.status) : rows;
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CreatePersonalApiKeyRequest,
|
|
3
|
+
CreatePersonalApiKeyResponse,
|
|
4
|
+
ListPersonalApiKeysResponse,
|
|
5
|
+
PersonalApiKey,
|
|
6
|
+
type AccessContext,
|
|
7
|
+
} from "@opengeni/contracts";
|
|
8
|
+
import {
|
|
9
|
+
createPersonalApiKey,
|
|
10
|
+
getManagedUserProfilesByIds,
|
|
11
|
+
listPersonalApiKeys,
|
|
12
|
+
PersonalApiKeyLimitExceededError,
|
|
13
|
+
PersonalApiKeyWorkspaceScopeError,
|
|
14
|
+
revokePersonalApiKey,
|
|
15
|
+
type PersonalApiKeyRecord,
|
|
16
|
+
} from "@opengeni/db";
|
|
17
|
+
import {
|
|
18
|
+
hasPermission,
|
|
19
|
+
PERSONAL_API_KEY_TOKEN_PREFIX,
|
|
20
|
+
requireAccessContext,
|
|
21
|
+
type ApiRouteDeps,
|
|
22
|
+
} from "@opengeni/core";
|
|
23
|
+
import type { Context, Hono } from "hono";
|
|
24
|
+
import { HTTPException } from "hono/http-exception";
|
|
25
|
+
import { z } from "zod";
|
|
26
|
+
|
|
27
|
+
import { isAgentActingAsPerson, requireFullAccessIfAgent } from "../http/acting-person";
|
|
28
|
+
import { requireSameOriginBrowserMutation } from "./codex";
|
|
29
|
+
|
|
30
|
+
/* ----------------------------------------------------------------------------
|
|
31
|
+
Personal API keys: keys that act as the person who created them. A script
|
|
32
|
+
or agent holding one does what that person can do in this organization,
|
|
33
|
+
capped by the key's access setting, and shows up as them. Every request
|
|
34
|
+
rechecks the person's live access, so a removed or narrowed role applies at
|
|
35
|
+
once; leaving the organization revokes the keys.
|
|
36
|
+
|
|
37
|
+
Everyone manages their own; owners and admins also see everyone's and can
|
|
38
|
+
revoke them. An agent acting as the person can do this only with their full
|
|
39
|
+
access, so a limited agent or key can never mint a broader one.
|
|
40
|
+
-------------------------------------------------------------------------- */
|
|
41
|
+
|
|
42
|
+
export function registerPersonalApiKeyRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
43
|
+
app.get("/v1/organizations/:organizationId/personal-api-keys", async (c) => {
|
|
44
|
+
const { context, organizationId, admin } = await requireOrganizationPerson(c, deps, false);
|
|
45
|
+
const keys = await listPersonalApiKeys(deps.db, {
|
|
46
|
+
accountId: organizationId,
|
|
47
|
+
...(admin ? {} : { ownerSubjectId: context.subjectId }),
|
|
48
|
+
});
|
|
49
|
+
c.header("cache-control", "no-store");
|
|
50
|
+
return c.json(
|
|
51
|
+
ListPersonalApiKeysResponse.parse({
|
|
52
|
+
apiKeys: await projectKeys(deps, keys),
|
|
53
|
+
canManageAll: admin,
|
|
54
|
+
}),
|
|
55
|
+
);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
app.post("/v1/organizations/:organizationId/personal-api-keys", async (c) => {
|
|
59
|
+
requireSameOriginBrowserMutation(c, deps);
|
|
60
|
+
const { context, organizationId } = await requireOrganizationPerson(c, deps, true);
|
|
61
|
+
const parsed = CreatePersonalApiKeyRequest.safeParse(await c.req.json().catch(() => null));
|
|
62
|
+
if (!parsed.success) {
|
|
63
|
+
throw new HTTPException(400, {
|
|
64
|
+
message: parsed.error.issues[0]?.message ?? "invalid personal API key",
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
const body = parsed.data;
|
|
68
|
+
const expiresAt = body.expiresAt ? new Date(body.expiresAt) : null;
|
|
69
|
+
if (expiresAt && expiresAt.getTime() <= Date.now()) {
|
|
70
|
+
throw new HTTPException(400, { message: "Choose an expiry date in the future." });
|
|
71
|
+
}
|
|
72
|
+
const token = generatePersonalApiKeyToken();
|
|
73
|
+
try {
|
|
74
|
+
const apiKey = await createPersonalApiKey(deps.db, {
|
|
75
|
+
accountId: organizationId,
|
|
76
|
+
ownerSubjectId: context.subjectId,
|
|
77
|
+
name: body.name,
|
|
78
|
+
description: body.description ?? null,
|
|
79
|
+
prefix: token.slice(0, 14),
|
|
80
|
+
keyHash: await sha256Hex(token),
|
|
81
|
+
access: body.access,
|
|
82
|
+
expiresAt,
|
|
83
|
+
});
|
|
84
|
+
const [projected] = await projectKeys(deps, [apiKey]);
|
|
85
|
+
c.header("cache-control", "no-store");
|
|
86
|
+
return c.json(CreatePersonalApiKeyResponse.parse({ apiKey: projected, token }), 201);
|
|
87
|
+
} catch (error) {
|
|
88
|
+
if (error instanceof PersonalApiKeyWorkspaceScopeError)
|
|
89
|
+
throw new HTTPException(400, { message: error.message });
|
|
90
|
+
if (error instanceof PersonalApiKeyLimitExceededError)
|
|
91
|
+
throw new HTTPException(429, { message: error.message });
|
|
92
|
+
throw error;
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
app.delete("/v1/organizations/:organizationId/personal-api-keys/:apiKeyId", async (c) => {
|
|
97
|
+
requireSameOriginBrowserMutation(c, deps);
|
|
98
|
+
const { context, organizationId, admin } = await requireOrganizationPerson(c, deps, true);
|
|
99
|
+
const apiKeyId = c.req.param("apiKeyId");
|
|
100
|
+
if (!z.string().uuid().safeParse(apiKeyId).success) {
|
|
101
|
+
throw new HTTPException(404, { message: "API key not found" });
|
|
102
|
+
}
|
|
103
|
+
const [existing] = await listPersonalApiKeys(deps.db, { accountId: organizationId, apiKeyId });
|
|
104
|
+
if (!existing || (existing.ownerSubjectId !== context.subjectId && !admin)) {
|
|
105
|
+
throw new HTTPException(404, { message: "API key not found" });
|
|
106
|
+
}
|
|
107
|
+
await revokePersonalApiKey(deps.db, { accountId: organizationId, apiKeyId });
|
|
108
|
+
return c.body(null, 204);
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* A member of the organization signed in in this browser, or an agent (or
|
|
114
|
+
* personal key) acting as them. Changes need the person's full access.
|
|
115
|
+
*/
|
|
116
|
+
async function requireOrganizationPerson(
|
|
117
|
+
c: Context,
|
|
118
|
+
deps: ApiRouteDeps,
|
|
119
|
+
mutation: boolean,
|
|
120
|
+
): Promise<{ context: AccessContext; organizationId: string; admin: boolean }> {
|
|
121
|
+
if (deps.settings.productAccessMode !== "managed") {
|
|
122
|
+
throw new HTTPException(404, { message: "Personal API keys need Opengeni sign-in." });
|
|
123
|
+
}
|
|
124
|
+
if (isAgentActingAsPerson(c)) {
|
|
125
|
+
if (mutation) requireFullAccessIfAgent(c, "Managing personal API keys");
|
|
126
|
+
} else if (!c.req.header("cookie") || c.req.header("authorization")) {
|
|
127
|
+
throw new HTTPException(403, {
|
|
128
|
+
message: "Manage personal API keys in the Opengeni app in your browser.",
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
const context = await requireAccessContext(c, deps);
|
|
132
|
+
const organizationId = c.req.param("organizationId") ?? "";
|
|
133
|
+
const grant = context.accountGrants.find((each) => each.accountId === organizationId);
|
|
134
|
+
if (context.mode !== "managed" || !context.subjectId.startsWith("user:") || !grant) {
|
|
135
|
+
throw new HTTPException(404, { message: "organization not found" });
|
|
136
|
+
}
|
|
137
|
+
return { context, organizationId, admin: hasPermission(grant.permissions, "account:admin") };
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
async function projectKeys(
|
|
141
|
+
deps: ApiRouteDeps,
|
|
142
|
+
keys: PersonalApiKeyRecord[],
|
|
143
|
+
): Promise<PersonalApiKey[]> {
|
|
144
|
+
const userIds = [...new Set(keys.map((key) => key.ownerSubjectId.slice("user:".length)))];
|
|
145
|
+
const profiles = new Map(
|
|
146
|
+
(await getManagedUserProfilesByIds(deps.db, userIds)).map((profile) => [
|
|
147
|
+
`user:${profile.id}`,
|
|
148
|
+
profile,
|
|
149
|
+
]),
|
|
150
|
+
);
|
|
151
|
+
return keys.map((key) => {
|
|
152
|
+
const profile = profiles.get(key.ownerSubjectId);
|
|
153
|
+
return PersonalApiKey.parse({
|
|
154
|
+
id: key.id,
|
|
155
|
+
organizationId: key.accountId,
|
|
156
|
+
name: key.name,
|
|
157
|
+
description: key.description,
|
|
158
|
+
prefix: key.prefix,
|
|
159
|
+
access: key.access,
|
|
160
|
+
owner: {
|
|
161
|
+
subjectId: key.ownerSubjectId,
|
|
162
|
+
name: profile?.name?.trim() || profile?.email || "Someone",
|
|
163
|
+
},
|
|
164
|
+
expiresAt: key.expiresAt?.toISOString() ?? null,
|
|
165
|
+
lastUsedAt: key.lastUsedAt?.toISOString() ?? null,
|
|
166
|
+
createdAt: key.createdAt.toISOString(),
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
function generatePersonalApiKeyToken(): string {
|
|
172
|
+
const bytes = new Uint8Array(32);
|
|
173
|
+
crypto.getRandomValues(bytes);
|
|
174
|
+
return `${PERSONAL_API_KEY_TOKEN_PREFIX}${Array.from(bytes)
|
|
175
|
+
.map((byte) => byte.toString(16).padStart(2, "0"))
|
|
176
|
+
.join("")}`;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
async function sha256Hex(value: string): Promise<string> {
|
|
180
|
+
const digest = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(value));
|
|
181
|
+
return Array.from(new Uint8Array(digest))
|
|
182
|
+
.map((byte) => byte.toString(16).padStart(2, "0"))
|
|
183
|
+
.join("");
|
|
184
|
+
}
|
|
@@ -549,7 +549,7 @@ async function fetchLiveGitHubJson(
|
|
|
549
549
|
headers: {
|
|
550
550
|
accept: "application/vnd.github+json",
|
|
551
551
|
authorization,
|
|
552
|
-
"user-agent": "
|
|
552
|
+
"user-agent": "Opengeni",
|
|
553
553
|
"x-github-api-version": GITHUB_API_VERSION,
|
|
554
554
|
},
|
|
555
555
|
signal: AbortSignal.timeout(10_000),
|
|
@@ -776,7 +776,7 @@ function brokerError(status: 401 | 403 | 404 | 502, message: string): Response {
|
|
|
776
776
|
"x-content-type-options": "nosniff",
|
|
777
777
|
});
|
|
778
778
|
if (status === 401) {
|
|
779
|
-
headers.set("www-authenticate", 'Basic realm="
|
|
779
|
+
headers.set("www-authenticate", 'Basic realm="Opengeni Git broker", charset="UTF-8"');
|
|
780
780
|
}
|
|
781
781
|
return new Response(`${message}\n`, {
|
|
782
782
|
status,
|
|
@@ -46,6 +46,7 @@ import {
|
|
|
46
46
|
requirePersonalGitHubRepositoryConnection,
|
|
47
47
|
verifyLivePersonalGitHubRepositories,
|
|
48
48
|
} from "../integrations/personal-github-repositories";
|
|
49
|
+
import { parseRequestBody, parseRequestJson } from "../http/request-body";
|
|
49
50
|
|
|
50
51
|
export function registerPersonalGitHubRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
51
52
|
app.get("/v1/workspaces/:workspaceId/connections/github", async (c) => {
|
|
@@ -69,7 +70,10 @@ export function registerPersonalGitHubRoutes(app: Hono, deps: ApiRouteDeps): voi
|
|
|
69
70
|
const access = await requireAccessGrantAuthorization(c, deps, workspaceId, "connections:write");
|
|
70
71
|
requireLegacyOAuthActor(access);
|
|
71
72
|
assertPersonalConnectionOwnerPrincipal(access, "My GitHub account");
|
|
72
|
-
const payload =
|
|
73
|
+
const payload = parseRequestBody(
|
|
74
|
+
PersonalGitHubOAuthStartRequest,
|
|
75
|
+
await c.req.json().catch(() => ({})),
|
|
76
|
+
);
|
|
73
77
|
return c.json(
|
|
74
78
|
await startPersonalGitHubOAuth(deps, {
|
|
75
79
|
access,
|
|
@@ -85,7 +89,8 @@ export function registerPersonalGitHubRoutes(app: Hono, deps: ApiRouteDeps): voi
|
|
|
85
89
|
const access = await requireAccessGrantAuthorization(c, deps, workspaceId, "connections:write");
|
|
86
90
|
requireLegacyOAuthActor(access);
|
|
87
91
|
assertPersonalConnectionOwnerPrincipal(access, "My GitHub account");
|
|
88
|
-
const payload =
|
|
92
|
+
const payload = parseRequestBody(
|
|
93
|
+
PersonalGitHubOAuthStartRequest.omit({ connectionId: true }),
|
|
89
94
|
await c.req.json().catch(() => ({})),
|
|
90
95
|
);
|
|
91
96
|
return c.json(
|
|
@@ -168,7 +173,7 @@ export function registerPersonalGitHubRoutes(app: Hono, deps: ApiRouteDeps): voi
|
|
|
168
173
|
subjectId: access.grant.subjectId,
|
|
169
174
|
connectionId,
|
|
170
175
|
});
|
|
171
|
-
const request =
|
|
176
|
+
const request = await parseRequestJson(c, ReplacePersonalGitHubRepositorySelectionsRequest);
|
|
172
177
|
try {
|
|
173
178
|
const current = await loadRepositorySelectionState(deps, access.grant, connection);
|
|
174
179
|
assertRepositoryConnectionAuthorityFence(current, request);
|
|
@@ -249,7 +254,7 @@ export function registerPersonalGitHubRoutes(app: Hono, deps: ApiRouteDeps): voi
|
|
|
249
254
|
subjectId: access.grant.subjectId,
|
|
250
255
|
connectionId,
|
|
251
256
|
});
|
|
252
|
-
const request =
|
|
257
|
+
const request = await parseRequestJson(c, VerifyPersonalGitHubRepositorySelectionsRequest);
|
|
253
258
|
try {
|
|
254
259
|
const current = await loadRepositorySelectionState(deps, access.grant, connection);
|
|
255
260
|
assertRepositoryConnectionAuthorityFence(current, request);
|
package/src/routes/plugins.ts
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import pluginSnapshot from "../../../../data/catalog/plugins-snapshot.json";
|
|
2
2
|
import { marketplacePlugin } from "../integrations/marketplace-plugin";
|
|
3
3
|
import { mcpEndpointIdentity } from "@opengeni/contracts";
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
buildCapabilityCatalog,
|
|
6
|
+
createCatalogItem,
|
|
7
|
+
integrationSourceForOrganizationPolicy,
|
|
8
|
+
} from "@opengeni/core";
|
|
9
|
+
import { withOrganizationIntegrationPolicyFence } from "@opengeni/db/organization-integration-policy";
|
|
5
10
|
import { createHash } from "node:crypto";
|
|
6
11
|
|
|
7
12
|
import {
|
|
@@ -43,6 +48,7 @@ import {
|
|
|
43
48
|
getConnectionMetadata,
|
|
44
49
|
getInstalledPluginPackage,
|
|
45
50
|
getPluginPackageUninstallPreview,
|
|
51
|
+
PluginUninstallPreviewChangedError,
|
|
46
52
|
integrationBindingKey,
|
|
47
53
|
installApiIntegration,
|
|
48
54
|
installPluginMcpReference,
|
|
@@ -66,6 +72,7 @@ import {
|
|
|
66
72
|
type ResolvedApiIntegrationPreview,
|
|
67
73
|
} from "../integrations/api-integrations";
|
|
68
74
|
import { createGitHubSkillSourceClient } from "../integrations/github-skill-source";
|
|
75
|
+
import { parseRequestJson } from "../http/request-body";
|
|
69
76
|
|
|
70
77
|
const MAX_PLUGIN_MANIFEST_BYTES = 1024 * 1024;
|
|
71
78
|
|
|
@@ -182,7 +189,7 @@ export function registerPluginRoutes(
|
|
|
182
189
|
app.post("/v1/workspaces/:workspaceId/plugins/preview", async (c) => {
|
|
183
190
|
const workspaceId = c.req.param("workspaceId");
|
|
184
191
|
const grant = await requireAccessGrant(c, deps, workspaceId, "workspace:read");
|
|
185
|
-
const payload =
|
|
192
|
+
const payload = await parseRequestJson(c, PreviewPluginRequest);
|
|
186
193
|
const resolved = await resolvePluginPackage({
|
|
187
194
|
deps,
|
|
188
195
|
github,
|
|
@@ -205,7 +212,7 @@ export function registerPluginRoutes(
|
|
|
205
212
|
"capabilities:manage",
|
|
206
213
|
);
|
|
207
214
|
const { grant } = access;
|
|
208
|
-
const payload =
|
|
215
|
+
const payload = await parseRequestJson(c, InstallPluginRequest);
|
|
209
216
|
const resolved = await resolvePluginPackage({
|
|
210
217
|
skillActor: () => skillInstallerActor(access),
|
|
211
218
|
deps,
|
|
@@ -344,9 +351,14 @@ export function registerPluginRoutes(
|
|
|
344
351
|
|
|
345
352
|
app.get("/v1/workspaces/:workspaceId/plugins/:pluginKey/uninstall-preview", async (c) => {
|
|
346
353
|
const workspaceId = c.req.param("workspaceId");
|
|
347
|
-
await requireAccessGrant(c, deps, workspaceId, "workspace:read");
|
|
354
|
+
const grant = await requireAccessGrant(c, deps, workspaceId, "workspace:read");
|
|
348
355
|
const pluginKey = decodeURIComponent(c.req.param("pluginKey"));
|
|
349
|
-
const preview = await getPluginPackageUninstallPreview(
|
|
356
|
+
const preview = await getPluginPackageUninstallPreview(
|
|
357
|
+
deps.db,
|
|
358
|
+
workspaceId,
|
|
359
|
+
pluginKey,
|
|
360
|
+
grant.subjectId,
|
|
361
|
+
);
|
|
350
362
|
return c.json(PluginUninstallPreview.parse({ pluginKey, ...preview }));
|
|
351
363
|
});
|
|
352
364
|
|
|
@@ -361,7 +373,7 @@ export function registerPluginRoutes(
|
|
|
361
373
|
const { grant } = access;
|
|
362
374
|
const skillActor = skillRemovalActor(access);
|
|
363
375
|
const pluginKey = decodeURIComponent(c.req.param("pluginKey"));
|
|
364
|
-
const payload =
|
|
376
|
+
const payload = await parseRequestJson(c, UninstallPluginRequest);
|
|
365
377
|
try {
|
|
366
378
|
return c.json(
|
|
367
379
|
UninstallPluginResult.parse({
|
|
@@ -373,11 +385,33 @@ export function registerPluginRoutes(
|
|
|
373
385
|
subjectId: grant.subjectId,
|
|
374
386
|
pluginKey,
|
|
375
387
|
expectedInstallationVersion: payload.expectedInstallationVersion,
|
|
388
|
+
...(payload.expectedPreviewToken
|
|
389
|
+
? { expectedPreviewToken: payload.expectedPreviewToken }
|
|
390
|
+
: {}),
|
|
376
391
|
idempotencyKey: payload.idempotencyKey,
|
|
377
392
|
})),
|
|
378
393
|
}),
|
|
379
394
|
);
|
|
380
395
|
} catch (error) {
|
|
396
|
+
if (error instanceof PluginUninstallPreviewChangedError) {
|
|
397
|
+
const preview = error.preview ?? {
|
|
398
|
+
pluginKey,
|
|
399
|
+
...(await getPluginPackageUninstallPreview(
|
|
400
|
+
deps.db,
|
|
401
|
+
workspaceId,
|
|
402
|
+
pluginKey,
|
|
403
|
+
grant.subjectId,
|
|
404
|
+
)),
|
|
405
|
+
};
|
|
406
|
+
return c.json(
|
|
407
|
+
{
|
|
408
|
+
code: error.code,
|
|
409
|
+
message: error.message,
|
|
410
|
+
preview: PluginUninstallPreview.parse(preview),
|
|
411
|
+
},
|
|
412
|
+
409,
|
|
413
|
+
);
|
|
414
|
+
}
|
|
381
415
|
throw pluginMutationHttpError(error);
|
|
382
416
|
}
|
|
383
417
|
});
|
|
@@ -499,6 +533,11 @@ async function resolvePluginPackage(input: {
|
|
|
499
533
|
continue;
|
|
500
534
|
}
|
|
501
535
|
if (component.kind === "integration") {
|
|
536
|
+
const source = await withOrganizationIntegrationPolicyFence(
|
|
537
|
+
input.deps.db,
|
|
538
|
+
input,
|
|
539
|
+
async (_tx, policy) => integrationSourceForOrganizationPolicy(policy, component.source),
|
|
540
|
+
);
|
|
502
541
|
const requestedBinding = input.bindings[component.key];
|
|
503
542
|
const connection = await optionalConnection(
|
|
504
543
|
input.deps,
|
|
@@ -507,7 +546,7 @@ async function resolvePluginPackage(input: {
|
|
|
507
546
|
requestedBinding?.connectionId,
|
|
508
547
|
);
|
|
509
548
|
const resolved = await resolveApiIntegrationPreview({
|
|
510
|
-
source
|
|
549
|
+
source,
|
|
511
550
|
connection: connectionDescriptor(connection),
|
|
512
551
|
transport: input.transport,
|
|
513
552
|
authority: {
|