@opengeni/api-router 3.0.1 → 3.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/access-grant-rls.d.ts +8 -1
- package/dist/admission-trace.d.ts +8 -0
- package/dist/app.d.ts +50 -3
- package/dist/app.js +10 -1
- package/dist/artifact-catalog-cursor.d.ts +1 -0
- package/dist/attached-browser-viewer.d.ts +11 -0
- package/dist/auth/managed-auth-attempt-context.d.ts +2 -0
- package/dist/auth/managed-auth-rate-limits.d.ts +167 -0
- package/dist/auth/managed-auth-session-adapter.d.ts +9 -1
- package/dist/auth/managed-auth.d.ts +72 -5
- package/dist/auth/managed-sign-in-notifications.d.ts +4 -0
- package/dist/auth/new-signups-gate.d.ts +23 -0
- package/dist/auth/signup-funnel-metrics.d.ts +44 -0
- package/dist/azure-live.d.ts +28 -0
- package/dist/browser-action-fences.d.ts +13 -0
- package/dist/browser-controller-authority.d.ts +1 -61
- package/dist/browser-ephemeral.d.ts +5 -0
- package/dist/browser-lost-runtime-end.d.ts +24 -0
- package/dist/browser-state-authority.d.ts +1 -27
- package/dist/chunk-OGQDXVXY.js +18 -0
- package/dist/chunk-OGQDXVXY.js.map +1 -0
- package/dist/{chunk-AJ62T5QN.js → chunk-OT56OY4V.js} +80503 -39869
- package/dist/chunk-OT56OY4V.js.map +1 -0
- package/dist/claude-default-models.d.ts +19 -0
- package/dist/claude-subscription-core.d.ts +50 -0
- package/dist/claude-subscription-oauth.d.ts +36 -0
- package/dist/claude-subscription-profile.d.ts +9 -0
- package/dist/claude-subscription-usage.d.ts +6 -0
- package/dist/claude-workspace-connection.d.ts +15 -0
- package/dist/codemode.d.ts +40 -5
- package/dist/codex-realtime.d.ts +29 -3
- package/dist/codex-session-pointers.d.ts +19 -0
- package/dist/connection-ownership.d.ts +6 -3
- package/dist/controller-data-plane.d.ts +16 -0
- package/dist/credit-promotion-snapshot.d.ts +6 -0
- package/dist/editable-artifact-source-session.d.ts +3 -0
- package/dist/editable-artifact-websocket.d.ts +5 -3
- package/dist/fatal-process-boundary.d.ts +9 -1
- package/dist/github-access.d.ts +7 -1
- package/dist/github-browser-flow.d.ts +1 -1
- package/dist/http/acting-person.d.ts +36 -0
- package/dist/http/api-contract-compat.d.ts +19 -0
- package/dist/http/api-error.d.ts +50 -1
- package/dist/http/auth.d.ts +8 -1
- package/dist/http/cors.d.ts +12 -0
- package/dist/http/deprecation.d.ts +42 -0
- package/dist/http/keyed-admission.d.ts +12 -0
- package/dist/http/local-browser-boundary.d.ts +72 -0
- package/dist/http/metrics-listener.d.ts +22 -0
- package/dist/http/path-identifier.d.ts +17 -0
- package/dist/http/registered-route-label.d.ts +16 -0
- package/dist/http/rejection-telemetry.d.ts +34 -0
- package/dist/http/request-body.d.ts +27 -0
- package/dist/http/request-source.d.ts +41 -3
- package/dist/http/sse.d.ts +12 -1
- package/dist/http/unmatched-route.d.ts +18 -0
- package/dist/http/user-content.d.ts +36 -0
- package/dist/http/variable-sets-removed.d.ts +41 -0
- package/dist/http/websocket-upgrade-dispatch.d.ts +18 -0
- package/dist/index.js +1279 -108
- package/dist/index.js.map +1 -1
- package/dist/integration-connect-metrics.d.ts +35 -0
- package/dist/integration-endpoint-test.d.ts +20 -0
- package/dist/integrations/api-integrations.d.ts +2 -2
- package/dist/integrations/atlassian.d.ts +8 -3
- package/dist/integrations/fiken.d.ts +3 -1
- package/dist/integrations/github-lens-connect.d.ts +37 -66
- package/dist/integrations/google-drive.d.ts +2 -0
- package/dist/integrations/integration-commit-authority.d.ts +13 -0
- package/dist/integrations/marketplace-plugin.d.ts +43 -43
- package/dist/integrations/oauth-client.d.ts +171 -12
- package/dist/integrations/oauth-profiles.d.ts +42 -13
- package/dist/integrations/onepassword-vault-provider.d.ts +9 -0
- package/dist/integrations/slack-bot.d.ts +285 -7
- package/dist/integrations/slack-file-upload-flow.d.ts +62 -0
- package/dist/integrations/slack-interactions.d.ts +89 -10
- package/dist/integrations/slack-mrkdwn.d.ts +41 -0
- package/dist/integrations/slack-routing.d.ts +1 -1
- package/dist/integrations/slack-session-defaults.d.ts +58 -0
- package/dist/integrations/slack-task-file-upload.d.ts +36 -0
- package/dist/integrations/slack-tool-review.d.ts +5 -0
- package/dist/interaction-agent-access.d.ts +13 -8
- package/dist/interaction-agent-version.d.ts +21 -0
- package/dist/interaction-holder-heartbeat.d.ts +5 -0
- package/dist/interaction-metrics.d.ts +27 -2
- package/dist/interaction-route-stages.d.ts +25 -0
- package/dist/interaction-secrets-vault.d.ts +20 -0
- package/dist/interaction-secrets.d.ts +103 -0
- package/dist/mcp/action-catalog-types.d.ts +14 -0
- package/dist/mcp/action-catalog.gen.d.ts +2 -0
- package/dist/mcp/action-descriptions.d.ts +4 -0
- package/dist/mcp/action-schema-imports.gen.d.ts +1 -0
- package/dist/mcp/capability-account-readiness.d.ts +7 -0
- package/dist/mcp/child-read-evidence.d.ts +9 -0
- package/dist/mcp/company-profile-agent-admin.d.ts +12 -0
- package/dist/mcp/contract-input.d.ts +13 -0
- package/dist/mcp/documents.d.ts +2 -0
- package/dist/mcp/first-party-tool-permissions.d.ts +3 -606
- package/dist/mcp/notification-tools.d.ts +26 -0
- package/dist/mcp/orchestration-failure-diagnostic.d.ts +43 -0
- package/dist/mcp/scheduled-task-input.d.ts +1309 -0
- package/dist/mcp/scheduled-task-view.d.ts +217 -3
- package/dist/mcp/secret-tools.d.ts +14 -0
- package/dist/mcp/server.d.ts +108 -5
- package/dist/mcp/session-admin-access-tools.d.ts +33 -0
- package/dist/mcp/session-event-errors.d.ts +28 -0
- package/dist/mcp/session-event-view.d.ts +62 -0
- package/dist/mcp/session-view.d.ts +15 -0
- package/dist/mcp/session-wait.d.ts +18 -0
- package/dist/mcp/site-agent-clamp-tools.d.ts +38 -0
- package/dist/mcp/site-data-tools.d.ts +22 -0
- package/dist/mcp/site-publication-tools.d.ts +19 -0
- package/dist/mcp/site-sql-tools.d.ts +27 -0
- package/dist/mcp-oauth.d.ts +37 -4
- package/dist/model-calls/chat-completions.d.ts +87 -0
- package/dist/model-calls/pending-usage-settlements.d.ts +57 -0
- package/dist/model-calls/service.d.ts +36 -0
- package/dist/model-catalog.d.ts +9 -3
- package/dist/native-push-dispatch.d.ts +69 -0
- package/dist/observability.d.ts +3 -1
- package/dist/organization-mcp.d.ts +82 -0
- package/dist/prepared-mcp-actor.d.ts +77 -0
- package/dist/prepared-mcp-permissions.d.ts +8 -0
- package/dist/routes/analytics-consent.d.ts +26 -0
- package/dist/routes/api-integrations.d.ts +11 -0
- package/dist/routes/api-keys.d.ts +7 -7
- package/dist/routes/automations.d.ts +2 -0
- package/dist/routes/billing.d.ts +59 -0
- package/dist/routes/browser-sessions.d.ts +65 -2
- package/dist/routes/chat-completions.d.ts +11 -0
- package/dist/routes/claude-core-usage.d.ts +20 -0
- package/dist/routes/claude-subscription-accounts.d.ts +3 -0
- package/dist/routes/claude-subscription-oauth.d.ts +3 -0
- package/dist/routes/client-errors.d.ts +182 -0
- package/dist/routes/codex-core.d.ts +401 -0
- package/dist/routes/codex.d.ts +64 -2
- package/dist/routes/computer-sessions.d.ts +6 -1
- package/dist/routes/desktop-distribution.d.ts +32 -0
- package/dist/routes/github-browser-fonts.gen.d.ts +2 -0
- package/dist/routes/github-browser-pages.d.ts +27 -0
- package/dist/routes/inbox.d.ts +13 -0
- package/dist/routes/insights-response-cache.d.ts +10 -0
- package/dist/routes/insights-usage.d.ts +12 -0
- package/dist/routes/insights.d.ts +28 -0
- package/dist/routes/interaction-placement-message.d.ts +7 -0
- package/dist/routes/managed-sign-in-methods.d.ts +6 -0
- package/dist/routes/model-account-choice.d.ts +13 -0
- package/dist/routes/model-account-settings.d.ts +19 -0
- package/dist/routes/native-app-auth.d.ts +12 -0
- package/dist/routes/organization-integration-policy.d.ts +8 -0
- package/dist/routes/organization-integrations.d.ts +6 -0
- package/dist/routes/organization-mcp-connections.d.ts +3 -0
- package/dist/routes/organization-model-defaults.d.ts +9 -0
- package/dist/routes/organization-service-accounts.d.ts +3 -0
- package/dist/routes/personal-api-keys.d.ts +3 -0
- package/dist/routes/session-admin-access.d.ts +3 -0
- package/dist/routes/session-artifact-associations.d.ts +4 -0
- package/dist/routes/session-history-imports.d.ts +20 -0
- package/dist/routes/sessions.d.ts +38 -2
- package/dist/routes/site-data.d.ts +18 -0
- package/dist/routes/site-publishing.d.ts +5 -0
- package/dist/routes/site-runtime.d.ts +31 -0
- package/dist/routes/site-sql.d.ts +16 -0
- package/dist/routes/slack-bot-access.d.ts +3 -0
- package/dist/routes/subscription-account-pools.d.ts +21 -0
- package/dist/routes/subscription-core-http.d.ts +5 -0
- package/dist/routes/subscription-pool-access.d.ts +37 -0
- package/dist/routes/subscription-pool-core.d.ts +153 -0
- package/dist/routes/supergrok.d.ts +6 -6
- package/dist/routes/usage-allowances.d.ts +12 -0
- package/dist/routes/variable-sets-removed.d.ts +2 -0
- package/dist/routes/vault-providers.d.ts +34 -0
- package/dist/routes/vaults.d.ts +3 -0
- package/dist/routes/workspace-integrations.d.ts +35 -0
- package/dist/routes/workspace-model-providers.d.ts +4 -0
- package/dist/routes/workspaces.d.ts +11 -2
- package/dist/sandbox/agent-update.d.ts +64 -0
- package/dist/sandbox/auth-callout.d.ts +8 -0
- package/dist/sandbox/channel-a.d.ts +15 -1
- package/dist/sandbox/enrollment.d.ts +26 -4
- package/dist/sandbox/machine-audience.d.ts +29 -0
- package/dist/sandbox/machines.d.ts +15 -2
- package/dist/sandbox/metrics-ingestion.d.ts +6 -2
- package/dist/sandbox/screen-control.d.ts +85 -0
- package/dist/sandbox/viewer.d.ts +5 -1
- package/dist/sandbox-file-artifacts.d.ts +17 -1
- package/dist/scheduled-task-blockers.d.ts +39 -0
- package/dist/scheduled-task-deletion.d.ts +3 -4
- package/dist/scheduled-task-lifecycle.d.ts +14 -0
- package/dist/secret-answers.d.ts +40 -0
- package/dist/session-create-observability.d.ts +5 -0
- package/dist/session-event-view-36GO3IL7.js +528 -0
- package/dist/session-event-view-36GO3IL7.js.map +1 -0
- package/dist/signed-state-secret.d.ts +18 -0
- package/dist/site-agent-guard.d.ts +53 -0
- package/dist/site-data/operations.d.ts +103 -0
- package/dist/site-data/service.d.ts +203 -0
- package/dist/site-frame-guard.d.ts +32 -0
- package/dist/site-publishing/agent-data-tools.d.ts +84 -0
- package/dist/site-publishing/agent-model.d.ts +58 -0
- package/dist/site-publishing/agent-session.d.ts +16 -0
- package/dist/site-publishing/content-scanner.d.ts +31 -0
- package/dist/site-publishing/edge-sync.d.ts +48 -0
- package/dist/site-publishing/gateway-signature.d.ts +56 -0
- package/dist/site-publishing/limits.d.ts +63 -0
- package/dist/site-publishing/page-tool-authority.d.ts +30 -0
- package/dist/site-publishing/platform-usage.d.ts +113 -0
- package/dist/site-publishing/platform.d.ts +21 -0
- package/dist/site-publishing/readiness.d.ts +62 -0
- package/dist/site-publishing/runtime.d.ts +179 -0
- package/dist/site-publishing/service.d.ts +264 -0
- package/dist/site-publishing/session-events.d.ts +22 -0
- package/dist/site-publishing/session-views.d.ts +36 -0
- package/dist/site-publishing/viewer.d.ts +40 -0
- package/dist/site-session-origin.d.ts +31 -6
- package/dist/site-sql/format.d.ts +47 -0
- package/dist/site-sql/gateway.d.ts +50 -0
- package/dist/site-sql/service.d.ts +213 -0
- package/dist/temporal-schedule-sync.d.ts +26 -0
- package/dist/transcription/billing-refusal.d.ts +8 -0
- package/dist/transcription/normalize.d.ts +23 -0
- package/dist/transcription/providers/azure-mai.d.ts +12 -0
- package/dist/transcription/providers/azure-openai.d.ts +4 -0
- package/dist/transcription/providers/openai.d.ts +16 -0
- package/dist/transcription/providers/subscription-core.d.ts +39 -0
- package/dist/transcription/service.d.ts +10 -1
- package/dist/transcription/wav-duration.d.ts +8 -0
- package/dist/workspace-tool-gateway-attestations.d.ts +37 -0
- package/dist/workspace-tool-gateway-observability.d.ts +16 -0
- package/dist/workspace-tool-gateway-secrets.d.ts +27 -0
- package/dist/workspace-tool-gateway.d.ts +102 -6
- package/dist/workspace-tool-target-fence.d.ts +116 -0
- package/dist/workspace-tool-target.d.ts +225 -0
- package/dist/workspace-webhook-dispatch.d.ts +26 -0
- package/dist/xai-subscription-core.d.ts +60 -0
- package/package.json +25 -20
- package/src/access-grant-rls.ts +64 -14
- package/src/admission-trace.ts +14 -0
- package/src/app.ts +1684 -252
- package/src/artifact-catalog-cursor.ts +1 -0
- package/src/attached-browser-viewer.ts +26 -0
- package/src/auth/managed-auth-attempt-context.ts +9 -0
- package/src/auth/managed-auth-rate-limits.ts +252 -0
- package/src/auth/managed-auth-session-adapter.ts +64 -29
- package/src/auth/managed-auth.ts +303 -35
- package/src/auth/managed-email.ts +18 -1
- package/src/auth/managed-sign-in-notifications.ts +81 -0
- package/src/auth/new-signups-gate.ts +49 -0
- package/src/auth/organization-user-setup.ts +3 -3
- package/src/auth/signup-funnel-metrics.ts +164 -0
- package/src/azure-live.ts +103 -0
- package/src/browser-action-fences.ts +45 -0
- package/src/browser-controller-authority.ts +1 -186
- package/src/browser-ephemeral.ts +39 -0
- package/src/browser-lost-runtime-end.ts +71 -0
- package/src/browser-state-authority.ts +1 -236
- package/src/claude-default-models.ts +37 -0
- package/src/claude-subscription-core.ts +154 -0
- package/src/claude-subscription-oauth.ts +352 -0
- package/src/claude-subscription-profile.ts +73 -0
- package/src/claude-subscription-usage.ts +51 -0
- package/src/claude-workspace-connection.ts +82 -0
- package/src/codemode.ts +236 -39
- package/src/codex-realtime.ts +181 -53
- package/src/codex-session-pointers.ts +80 -0
- package/src/company-brain-okf.ts +1 -1
- package/src/connected-machine-computer-access.ts +2 -1
- package/src/connection-ownership.ts +19 -13
- package/src/controller-data-plane.ts +34 -0
- package/src/credit-promotion-snapshot.ts +36 -0
- package/src/editable-artifact-production.ts +10 -0
- package/src/editable-artifact-source-session.ts +123 -0
- package/src/editable-artifact-websocket.ts +16 -3
- package/src/fatal-process-boundary.ts +67 -3
- package/src/gateway-realtime.ts +12 -8
- package/src/github-access.ts +31 -5
- package/src/github-browser-flow.ts +1 -1
- package/src/http/acting-person.ts +105 -0
- package/src/http/api-contract-compat.ts +49 -0
- package/src/http/api-error.ts +210 -2
- package/src/http/auth.ts +68 -4
- package/src/http/cors.ts +37 -5
- package/src/http/deprecation.ts +118 -0
- package/src/http/keyed-admission.ts +29 -0
- package/src/http/local-browser-boundary.ts +343 -0
- package/src/http/metrics-listener.ts +57 -0
- package/src/http/path-identifier.ts +54 -0
- package/src/http/registered-route-label.ts +34 -0
- package/src/http/rejection-telemetry.ts +120 -0
- package/src/http/request-body.ts +127 -0
- package/src/http/request-source.ts +154 -13
- package/src/http/sse.ts +88 -28
- package/src/http/unmatched-route.ts +60 -0
- package/src/http/user-content.ts +158 -0
- package/src/http/variable-sets-removed.ts +122 -0
- package/src/http/websocket-upgrade-dispatch.ts +29 -0
- package/src/index.ts +107 -57
- package/src/integration-connect-metrics.ts +228 -0
- package/src/integration-endpoint-test.ts +291 -0
- package/src/integrations/api-integrations.ts +81 -7
- package/src/integrations/atlassian.ts +202 -83
- package/src/integrations/fiken.ts +66 -38
- package/src/integrations/github-app-connect.ts +64 -18
- package/src/integrations/github-lens-connect.ts +8 -29
- package/src/integrations/google-drive.ts +448 -152
- package/src/integrations/integration-commit-authority.ts +69 -0
- package/src/integrations/marketplace-plugin.ts +1 -1
- package/src/integrations/oauth-client.ts +733 -193
- package/src/integrations/oauth-profiles.ts +116 -45
- package/src/integrations/onepassword-vault-provider.ts +16 -0
- package/src/integrations/personal-github-repositories.ts +1 -1
- package/src/integrations/personal-github.ts +61 -35
- package/src/integrations/provider-oauth.ts +67 -85
- package/src/integrations/slack-app-home.ts +5 -5
- package/src/integrations/slack-bot.ts +893 -201
- package/src/integrations/slack-file-upload-flow.ts +147 -0
- package/src/integrations/slack-install.ts +7 -7
- package/src/integrations/slack-interactions.ts +1589 -299
- package/src/integrations/slack-mrkdwn.ts +193 -0
- package/src/integrations/slack-routing.ts +2 -2
- package/src/integrations/slack-session-defaults.ts +224 -0
- package/src/integrations/slack-task-file-upload.ts +323 -0
- package/src/integrations/slack-tool-review.ts +65 -0
- package/src/integrations/social-oauth.ts +90 -58
- package/src/interaction-agent-access.ts +40 -20
- package/src/interaction-agent-version.ts +85 -0
- package/src/interaction-holder-heartbeat.ts +24 -8
- package/src/interaction-metrics.ts +164 -2
- package/src/interaction-route-stages.ts +94 -0
- package/src/interaction-secrets-vault.ts +213 -0
- package/src/interaction-secrets.ts +426 -0
- package/src/mcp/action-catalog-types.ts +14 -0
- package/src/mcp/action-catalog.gen.ts +8014 -0
- package/src/mcp/action-descriptions.ts +299 -0
- package/src/mcp/action-schema-imports.gen.ts +304 -0
- package/src/mcp/capability-account-readiness.ts +17 -0
- package/src/mcp/child-read-evidence.ts +19 -0
- package/src/mcp/company-profile-agent-admin.ts +13 -0
- package/src/mcp/contract-input.ts +165 -0
- package/src/mcp/documents.ts +9 -2
- package/src/mcp/editable-artifacts.ts +29 -11
- package/src/mcp/files.ts +5 -1
- package/src/mcp/first-party-tool-permissions.ts +7 -285
- package/src/mcp/knowledge-entries.ts +108 -34
- package/src/mcp/notification-tools.ts +480 -0
- package/src/mcp/orchestration-failure-diagnostic.ts +43 -0
- package/src/mcp/scheduled-task-input.ts +89 -0
- package/src/mcp/scheduled-task-view.ts +63 -3
- package/src/mcp/secret-tools.ts +185 -0
- package/src/mcp/server.ts +2213 -1116
- package/src/mcp/session-admin-access-tools.ts +163 -0
- package/src/mcp/session-event-errors.ts +123 -0
- package/src/mcp/session-event-view.ts +395 -13
- package/src/mcp/session-view.ts +3 -0
- package/src/mcp/session-wait.ts +67 -7
- package/src/mcp/site-agent-clamp-tools.ts +140 -0
- package/src/mcp/site-data-tools.ts +339 -0
- package/src/mcp/site-publication-tools.ts +201 -0
- package/src/mcp/site-sql-tools.ts +427 -0
- package/src/mcp-oauth.ts +635 -45
- package/src/model-calls/chat-completions.ts +352 -0
- package/src/model-calls/pending-usage-settlements.ts +125 -0
- package/src/model-calls/service.ts +694 -0
- package/src/model-catalog.ts +68 -17
- package/src/native-push-dispatch.ts +457 -0
- package/src/observability.ts +15 -1
- package/src/organization-mcp.ts +485 -0
- package/src/prepared-mcp-actor.ts +154 -0
- package/src/prepared-mcp-permissions.ts +38 -0
- package/src/routes/analytics-consent.ts +123 -0
- package/src/routes/api-integrations.ts +268 -9
- package/src/routes/api-keys.ts +164 -25
- package/src/routes/artifact-catalog.ts +111 -0
- package/src/routes/automations.ts +163 -90
- package/src/routes/billing.ts +535 -59
- package/src/routes/browser-sessions.ts +966 -342
- package/src/routes/canonical-human-identities.ts +61 -0
- package/src/routes/capabilities.ts +112 -5
- package/src/routes/channels.ts +4 -3
- package/src/routes/chat-completions.ts +235 -0
- package/src/routes/claude-core-usage.ts +147 -0
- package/src/routes/claude-subscription-accounts.ts +233 -0
- package/src/routes/claude-subscription-oauth.ts +175 -0
- package/src/routes/client-errors.ts +394 -0
- package/src/routes/codex-core.ts +687 -0
- package/src/routes/codex.ts +1277 -1119
- package/src/routes/company-brain.ts +4 -0
- package/src/routes/computer-sessions.ts +319 -85
- package/src/routes/connect.ts +277 -175
- package/src/routes/connections.ts +690 -363
- package/src/routes/desktop-distribution.ts +217 -0
- package/src/routes/documents.ts +13 -7
- package/src/routes/editable-artifacts.ts +74 -4
- package/src/routes/enrollments.ts +110 -16
- package/src/routes/external-identity-links.ts +13 -12
- package/src/routes/files.ts +41 -16
- package/src/routes/github-browser-fonts.gen.ts +12 -0
- package/src/routes/github-browser-pages.ts +258 -0
- package/src/routes/github.ts +200 -75
- package/src/routes/inbox.ts +353 -0
- package/src/routes/insights-response-cache.ts +83 -0
- package/src/routes/insights-usage.ts +345 -0
- package/src/routes/insights.ts +103 -8
- package/src/routes/install.ts +51 -10
- package/src/routes/integration-facets.ts +70 -28
- package/src/routes/interaction-placement-message.ts +12 -0
- package/src/routes/knowledge.ts +136 -27
- package/src/routes/machines.ts +189 -135
- package/src/routes/managed-auth-session-sets.ts +43 -10
- package/src/routes/managed-onboarding.ts +39 -19
- package/src/routes/managed-sign-in-methods.ts +433 -0
- package/src/routes/memory-slack-publications.ts +3 -2
- package/src/routes/model-account-choice.ts +194 -0
- package/src/routes/model-account-settings.ts +235 -0
- package/src/routes/model-connection-access.ts +210 -48
- package/src/routes/native-app-auth.ts +296 -0
- package/src/routes/organization-integration-policy.ts +116 -0
- package/src/routes/organization-integrations.ts +326 -0
- package/src/routes/organization-mcp-connections.ts +183 -0
- package/src/routes/organization-memberships.ts +205 -19
- package/src/routes/organization-model-defaults.ts +110 -0
- package/src/routes/organization-model-providers.ts +74 -3
- package/src/routes/organization-service-accounts.ts +128 -0
- package/src/routes/organization-sessions.ts +21 -5
- package/src/routes/personal-api-keys.ts +184 -0
- package/src/routes/personal-github-git-broker.ts +2 -2
- package/src/routes/personal-github.ts +9 -4
- package/src/routes/plugins.ts +46 -7
- package/src/routes/pr-review-github.ts +105 -118
- package/src/routes/pr-review.ts +88 -82
- package/src/routes/preference-registry.ts +18 -0
- package/src/routes/rigs.ts +48 -13
- package/src/routes/scheduled-tasks.ts +347 -27
- package/src/routes/session-admin-access.ts +271 -0
- package/src/routes/session-artifact-associations.ts +164 -0
- package/src/routes/session-history-imports.ts +305 -0
- package/src/routes/sessions.ts +1682 -363
- package/src/routes/site-data.ts +340 -0
- package/src/routes/site-publishing.ts +584 -0
- package/src/routes/site-runtime.ts +1944 -0
- package/src/routes/site-sql.ts +263 -0
- package/src/routes/skill-content.ts +72 -7
- package/src/routes/skills.ts +5 -4
- package/src/routes/slack-bot-access.ts +108 -0
- package/src/routes/social.ts +27 -15
- package/src/routes/subscription-account-pools.ts +209 -0
- package/src/routes/subscription-core-http.ts +18 -0
- package/src/routes/subscription-pool-access.ts +180 -0
- package/src/routes/subscription-pool-core.ts +552 -0
- package/src/routes/supergrok.ts +174 -655
- package/src/routes/transcription-recordings.ts +71 -4
- package/src/routes/transcriptions.ts +26 -2
- package/src/routes/usage-allowances.ts +381 -0
- package/src/routes/variable-sets-removed.ts +19 -0
- package/src/routes/vault-providers.ts +782 -0
- package/src/routes/vaults.ts +421 -0
- package/src/routes/video-generation.ts +30 -12
- package/src/routes/workspace-artifacts.ts +165 -53
- package/src/routes/workspace-integrations.ts +576 -0
- package/src/routes/workspace-model-providers.ts +148 -0
- package/src/routes/workspace-state.ts +4 -0
- package/src/routes/workspaces.ts +625 -117
- package/src/sandbox/agent-update.ts +315 -0
- package/src/sandbox/auth-callout.ts +104 -21
- package/src/sandbox/channel-a.ts +165 -55
- package/src/sandbox/enrollment.ts +131 -22
- package/src/sandbox/machine-audience.ts +192 -0
- package/src/sandbox/machines.ts +75 -31
- package/src/sandbox/metrics-ingestion.ts +133 -2
- package/src/sandbox/rematerialize.ts +51 -21
- package/src/sandbox/screen-control.ts +289 -0
- package/src/sandbox/viewer.ts +33 -58
- package/src/sandbox-file-artifacts.ts +53 -27
- package/src/scheduled-task-blockers.ts +293 -0
- package/src/scheduled-task-deletion.ts +13 -3
- package/src/scheduled-task-lifecycle.ts +84 -0
- package/src/secret-answers.ts +119 -0
- package/src/session-create-observability.ts +46 -0
- package/src/session-realtime-context.ts +26 -4
- package/src/signed-state-secret.ts +58 -0
- package/src/site-agent-guard.ts +261 -0
- package/src/site-data/operations.ts +777 -0
- package/src/site-data/service.ts +1043 -0
- package/src/site-frame-guard.ts +107 -0
- package/src/site-publishing/agent-data-tools.ts +250 -0
- package/src/site-publishing/agent-model.ts +127 -0
- package/src/site-publishing/agent-session.ts +148 -0
- package/src/site-publishing/content-scanner.ts +93 -0
- package/src/site-publishing/edge-sync.ts +148 -0
- package/src/site-publishing/gateway-signature.ts +198 -0
- package/src/site-publishing/limits.ts +315 -0
- package/src/site-publishing/page-tool-authority.ts +111 -0
- package/src/site-publishing/platform-usage.ts +479 -0
- package/src/site-publishing/platform.ts +98 -0
- package/src/site-publishing/readiness.ts +330 -0
- package/src/site-publishing/runtime.ts +831 -0
- package/src/site-publishing/service.ts +1282 -0
- package/src/site-publishing/session-events.ts +262 -0
- package/src/site-publishing/session-views.ts +262 -0
- package/src/site-publishing/viewer.ts +75 -0
- package/src/site-session-origin.ts +91 -6
- package/src/site-sql/format.ts +134 -0
- package/src/site-sql/gateway.ts +168 -0
- package/src/site-sql/service.ts +1636 -0
- package/src/site-uploads.ts +27 -5
- package/src/temporal-schedule-sync.ts +74 -0
- package/src/transcription/billing-refusal.ts +14 -0
- package/src/transcription/normalize.ts +77 -0
- package/src/transcription/providers/azure-mai.ts +98 -0
- package/src/transcription/providers/azure-openai.ts +16 -7
- package/src/transcription/providers/codex-subscription.ts +190 -67
- package/src/transcription/providers/openai.ts +79 -5
- package/src/transcription/providers/subscription-core.ts +125 -0
- package/src/transcription/providers/xai-subscription.ts +81 -83
- package/src/transcription/segmenter.ts +7 -1
- package/src/transcription/service.ts +239 -10
- package/src/transcription/wav-duration.ts +39 -0
- package/src/workspace-deletion.ts +25 -1
- package/src/workspace-tool-gateway-attestations.ts +133 -0
- package/src/workspace-tool-gateway-observability.ts +64 -0
- package/src/workspace-tool-gateway-secrets.ts +104 -0
- package/src/workspace-tool-gateway.ts +921 -103
- package/src/workspace-tool-target-fence.ts +380 -0
- package/src/workspace-tool-target.ts +554 -0
- package/src/workspace-webhook-dispatch.ts +225 -0
- package/src/xai-realtime.ts +85 -81
- package/src/xai-subscription-core.ts +172 -0
- package/dist/browser-auth-broker.d.ts +0 -20
- package/dist/chunk-AJ62T5QN.js.map +0 -1
- package/dist/connection-authority-owner.d.ts +0 -59
- package/dist/routes/connection-authorities.d.ts +0 -3
- package/dist/routes/environments.d.ts +0 -5
- package/dist/routes/host-mcp-bindings.d.ts +0 -5
- package/dist/routes/host-mcp-resolvers.d.ts +0 -3
- package/dist/routes/packs.d.ts +0 -3
- package/dist/session-event-view-MU3HMNV3.js +0 -264
- package/dist/session-event-view-MU3HMNV3.js.map +0 -1
- package/dist/xai-subscription-auth.d.ts +0 -23
- package/src/browser-auth-broker.ts +0 -155
- package/src/connection-authority-owner.ts +0 -61
- package/src/routes/connection-authorities.ts +0 -139
- package/src/routes/environments.ts +0 -388
- package/src/routes/host-mcp-bindings.ts +0 -122
- package/src/routes/host-mcp-resolvers.ts +0 -41
- package/src/routes/packs.ts +0 -784
- package/src/xai-subscription-auth.ts +0 -139
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { environmentsEncryptionKeyBytes } from "@opengeni/config";
|
|
2
|
+
import { withOrganizationIntegrationAcquisition } from "@opengeni/db/organization-integration-policy";
|
|
2
3
|
import {
|
|
3
4
|
AUTOMATION_WEBHOOK_MAX_BYTES,
|
|
4
|
-
OPENGENI_PR_REVIEW_PACK_ID,
|
|
5
5
|
PrReviewManagedGitHubSetup,
|
|
6
6
|
type AccessGrant,
|
|
7
7
|
type GitHubInstallationBindingCandidate,
|
|
@@ -9,22 +9,19 @@ import {
|
|
|
9
9
|
} from "@opengeni/contracts";
|
|
10
10
|
import {
|
|
11
11
|
automationRequestDigest,
|
|
12
|
-
getCapabilityPack,
|
|
13
12
|
hasPermission,
|
|
14
|
-
PR_REVIEW_AUTOMATION_TEMPLATE_ID,
|
|
15
|
-
prReviewPackConnectorId,
|
|
16
13
|
requireAutomationAdapter,
|
|
17
14
|
requireAccessGrantAuthorization,
|
|
18
15
|
externalActorContinuationForAuthorization,
|
|
19
16
|
requirePermission,
|
|
20
17
|
verifyPrReviewWebhook,
|
|
21
18
|
type ApiRouteDeps,
|
|
19
|
+
PR_REVIEW_AUTOMATION_SETUP,
|
|
22
20
|
} from "@opengeni/core";
|
|
23
21
|
import {
|
|
24
22
|
AutomationDeliveryConflictError,
|
|
25
23
|
encryptVariableSetValue,
|
|
26
24
|
getAutomationSourceSecret,
|
|
27
|
-
getPackInstallation,
|
|
28
25
|
listPrReviewAppRegistrations,
|
|
29
26
|
listPrReviewRepositoryBindings,
|
|
30
27
|
nestedPostgresSqlState,
|
|
@@ -49,9 +46,18 @@ import {
|
|
|
49
46
|
} from "@opengeni/github";
|
|
50
47
|
import type { Context, Hono } from "hono";
|
|
51
48
|
import { requireLegacyOAuthActor } from "../connection-ownership";
|
|
49
|
+
import {
|
|
50
|
+
integrationCommitGrant,
|
|
51
|
+
type IntegrationCommitGrant,
|
|
52
|
+
} from "../integrations/integration-commit-authority";
|
|
52
53
|
import { deleteCookie, setCookie } from "hono/cookie";
|
|
53
54
|
import { HTTPException } from "hono/http-exception";
|
|
54
55
|
import { githubBrowserBaseUrl } from "../github-browser-flow";
|
|
56
|
+
import {
|
|
57
|
+
prReviewInstallationChooserHtml,
|
|
58
|
+
prReviewSetupPendingHtml,
|
|
59
|
+
prReviewSetupSuccessHtml,
|
|
60
|
+
} from "./github-browser-pages";
|
|
55
61
|
import { acceptAutomationEvent, readAutomationWebhookBody } from "./automations";
|
|
56
62
|
import {
|
|
57
63
|
completeGitHubAppConnect,
|
|
@@ -60,13 +66,13 @@ import {
|
|
|
60
66
|
|
|
61
67
|
const stateCookie = "opengeni_pr_review_github_state";
|
|
62
68
|
const bindingStateMaxAgeSeconds = 10 * 60;
|
|
63
|
-
const appName = "
|
|
69
|
+
const appName = "Opengeni Lens" as const;
|
|
64
70
|
|
|
65
71
|
export function registerPrReviewGitHubRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
66
72
|
app.post("/v1/webhooks/pr-review/github", async (c) => {
|
|
67
73
|
const secret = deps.settings.prReviewGithubWebhookSecret?.trim();
|
|
68
74
|
if (!secret) {
|
|
69
|
-
throw new HTTPException(503, { message: "
|
|
75
|
+
throw new HTTPException(503, { message: "Opengeni Lens webhook is unavailable" });
|
|
70
76
|
}
|
|
71
77
|
const rawBody = await readAutomationWebhookBody(c.req.raw, AUTOMATION_WEBHOOK_MAX_BYTES);
|
|
72
78
|
if (
|
|
@@ -78,13 +84,13 @@ export function registerPrReviewGitHubRoutes(app: Hono, deps: ApiRouteDeps): voi
|
|
|
78
84
|
webhookUsername: null,
|
|
79
85
|
})
|
|
80
86
|
) {
|
|
81
|
-
throw new HTTPException(401, { message: "
|
|
87
|
+
throw new HTTPException(401, { message: "Opengeni Lens signature is invalid" });
|
|
82
88
|
}
|
|
83
89
|
let payload: unknown;
|
|
84
90
|
try {
|
|
85
91
|
payload = JSON.parse(new TextDecoder().decode(rawBody));
|
|
86
92
|
} catch {
|
|
87
|
-
throw new HTTPException(400, { message: "
|
|
93
|
+
throw new HTTPException(400, { message: "Opengeni Lens payload is invalid JSON" });
|
|
88
94
|
}
|
|
89
95
|
const record = asRecord(payload);
|
|
90
96
|
const installationId = positiveInteger(asRecord(record?.installation)?.id);
|
|
@@ -131,7 +137,7 @@ export function registerPrReviewGitHubRoutes(app: Hono, deps: ApiRouteDeps): voi
|
|
|
131
137
|
const workspaceId = c.req.param("workspaceId");
|
|
132
138
|
const access = await requireAccessGrantAuthorization(c, deps, workspaceId, "workspace:read");
|
|
133
139
|
const grant = access.grant;
|
|
134
|
-
|
|
140
|
+
|
|
135
141
|
const missing = prReviewGitHubAppMissingSettings(deps.settings);
|
|
136
142
|
const configured = missing.length === 0;
|
|
137
143
|
const registrations = (
|
|
@@ -200,10 +206,10 @@ export function registerPrReviewGitHubRoutes(app: Hono, deps: ApiRouteDeps): voi
|
|
|
200
206
|
|
|
201
207
|
app.get("/v1/workspaces/:workspaceId/pr-review/github/connect", async (c) => {
|
|
202
208
|
const workspaceId = c.req.param("workspaceId");
|
|
203
|
-
const state = requireStateQuery(c, "missing
|
|
209
|
+
const state = requireStateQuery(c, "missing Opengeni Lens installation state");
|
|
204
210
|
const payload = requireFreshState(state, deps, "pr_review_github_authority", workspaceId);
|
|
205
211
|
await requirePrReviewManageGrant(c, deps, workspaceId, payload);
|
|
206
|
-
|
|
212
|
+
|
|
207
213
|
assertManagedCompute(deps);
|
|
208
214
|
requireConfiguredApp(deps);
|
|
209
215
|
const discoveryState = createSignedState(deps.githubStateSecret, {
|
|
@@ -227,13 +233,13 @@ export function registerPrReviewGitHubRoutes(app: Hono, deps: ApiRouteDeps): voi
|
|
|
227
233
|
async (c) => {
|
|
228
234
|
const workspaceId = c.req.param("workspaceId");
|
|
229
235
|
const installationId = positiveInteger(c.req.param("installationId"));
|
|
230
|
-
const state = requireStateQuery(c, "missing
|
|
236
|
+
const state = requireStateQuery(c, "missing Opengeni Lens configuration state");
|
|
231
237
|
const payload = requireFreshState(state, deps, "pr_review_github_install", workspaceId);
|
|
232
238
|
if (installationId === null || payload.expectedInstallationId !== installationId) {
|
|
233
|
-
throw new HTTPException(400, { message: "invalid
|
|
239
|
+
throw new HTTPException(400, { message: "invalid Opengeni Lens installation" });
|
|
234
240
|
}
|
|
235
241
|
await requirePrReviewManageGrant(c, deps, workspaceId, payload);
|
|
236
|
-
|
|
242
|
+
|
|
237
243
|
assertManagedCompute(deps);
|
|
238
244
|
const registrations = await listPrReviewAppRegistrations(
|
|
239
245
|
deps.db,
|
|
@@ -246,7 +252,7 @@ export function registerPrReviewGitHubRoutes(app: Hono, deps: ApiRouteDeps): voi
|
|
|
246
252
|
candidate.installationId === String(installationId),
|
|
247
253
|
);
|
|
248
254
|
if (!registration) {
|
|
249
|
-
throw new HTTPException(404, { message: "
|
|
255
|
+
throw new HTTPException(404, { message: "Opengeni Lens installation is not connected" });
|
|
250
256
|
}
|
|
251
257
|
setStateCookie(c, deps, state);
|
|
252
258
|
const configureUrl = githubInstallationSettingsUrl(
|
|
@@ -275,14 +281,14 @@ export function registerPrReviewGitHubRoutes(app: Hono, deps: ApiRouteDeps): voi
|
|
|
275
281
|
const payload = readSignedState(candidate, deps.githubStateSecret);
|
|
276
282
|
return payload?.intent === "pr_review_github_install" && isFreshState(payload);
|
|
277
283
|
});
|
|
278
|
-
if (!state) throw new HTTPException(400, { message: "missing
|
|
284
|
+
if (!state) throw new HTTPException(400, { message: "missing Opengeni Lens state" });
|
|
279
285
|
const payload = requireFreshState(state, deps, "pr_review_github_install");
|
|
280
286
|
requireStateCookie(c, state);
|
|
281
287
|
await requirePrReviewManageGrant(c, deps, payload.workspaceId!, payload);
|
|
282
|
-
|
|
288
|
+
|
|
283
289
|
assertManagedCompute(deps);
|
|
284
290
|
const setupAction = c.req.query("setup_action");
|
|
285
|
-
if (setupAction === "request") return c.html(
|
|
291
|
+
if (setupAction === "request") return c.html(prReviewSetupPendingHtml());
|
|
286
292
|
if (setupAction !== "install" && setupAction !== "update") {
|
|
287
293
|
throw new HTTPException(400, { message: "unsupported GitHub setup action" });
|
|
288
294
|
}
|
|
@@ -295,7 +301,7 @@ export function registerPrReviewGitHubRoutes(app: Hono, deps: ApiRouteDeps): voi
|
|
|
295
301
|
payload.expectedInstallationId !== installationId
|
|
296
302
|
) {
|
|
297
303
|
throw new HTTPException(409, {
|
|
298
|
-
message: "GitHub returned a different
|
|
304
|
+
message: "GitHub returned a different Opengeni Lens installation",
|
|
299
305
|
});
|
|
300
306
|
}
|
|
301
307
|
requireConfiguredApp(deps);
|
|
@@ -331,15 +337,16 @@ export function registerPrReviewGitHubRoutes(app: Hono, deps: ApiRouteDeps): voi
|
|
|
331
337
|
const code = c.req.query("code");
|
|
332
338
|
const state = c.req.query("state");
|
|
333
339
|
if (!code || !state) {
|
|
334
|
-
throw new HTTPException(400, { message: "missing
|
|
340
|
+
throw new HTTPException(400, { message: "missing Opengeni Lens OAuth code or state" });
|
|
335
341
|
}
|
|
336
342
|
const payload = requireFreshState(state, deps);
|
|
337
343
|
requireStateCookie(c, state);
|
|
338
344
|
const grant = await requirePrReviewManageGrant(c, deps, payload.workspaceId!, payload);
|
|
339
|
-
|
|
345
|
+
|
|
340
346
|
assertManagedCompute(deps);
|
|
341
347
|
requireConfiguredApp(deps);
|
|
342
348
|
|
|
349
|
+
await withOrganizationIntegrationAcquisition(deps.db, grant, ["github-lens"], async () => {});
|
|
343
350
|
if (payload.intent === "pr_review_github_discovery") {
|
|
344
351
|
let candidates: GitHubInstallationBindingCandidate[] | null;
|
|
345
352
|
try {
|
|
@@ -356,7 +363,7 @@ export function registerPrReviewGitHubRoutes(app: Hono, deps: ApiRouteDeps): voi
|
|
|
356
363
|
}
|
|
357
364
|
if (!candidates || !consistentCandidates(candidates)) {
|
|
358
365
|
throw new HTTPException(409, {
|
|
359
|
-
message: "
|
|
366
|
+
message: "Opengeni Lens could not prove owner-authorized installations",
|
|
360
367
|
});
|
|
361
368
|
}
|
|
362
369
|
const selectionState = createSignedState(deps.githubStateSecret, {
|
|
@@ -377,16 +384,20 @@ export function registerPrReviewGitHubRoutes(app: Hono, deps: ApiRouteDeps): voi
|
|
|
377
384
|
}
|
|
378
385
|
setStateCookie(c, deps, selectionState);
|
|
379
386
|
return c.html(
|
|
380
|
-
|
|
387
|
+
prReviewInstallationChooserHtml(
|
|
388
|
+
candidates,
|
|
389
|
+
selectionState,
|
|
390
|
+
`${openGeniBaseUrl(deps, c)}/v1/workspaces/${grant.workspaceId}/pr-review/github/installations/select`,
|
|
391
|
+
),
|
|
381
392
|
);
|
|
382
393
|
}
|
|
383
394
|
|
|
384
395
|
if (payload.intent !== "pr_review_github_oauth") {
|
|
385
|
-
throw new HTTPException(400, { message: "invalid or expired
|
|
396
|
+
throw new HTTPException(400, { message: "invalid or expired Opengeni Lens OAuth state" });
|
|
386
397
|
}
|
|
387
398
|
const installationId = positiveInteger(payload.installationId);
|
|
388
399
|
if (installationId === null) {
|
|
389
|
-
throw new HTTPException(400, { message: "invalid
|
|
400
|
+
throw new HTTPException(400, { message: "invalid Opengeni Lens installation id" });
|
|
390
401
|
}
|
|
391
402
|
let proof: GitHubInstallationBindingProof | null;
|
|
392
403
|
try {
|
|
@@ -403,53 +414,55 @@ export function registerPrReviewGitHubRoutes(app: Hono, deps: ApiRouteDeps): voi
|
|
|
403
414
|
}
|
|
404
415
|
if (!proof || !consistentProof(proof, installationId)) {
|
|
405
416
|
throw new HTTPException(409, {
|
|
406
|
-
message: "
|
|
417
|
+
message: "Opengeni Lens installation proof is stale or invalid",
|
|
407
418
|
});
|
|
408
419
|
}
|
|
409
420
|
const repositoryIds = new Set(proof.repositories.map((repository) => repository.id));
|
|
410
421
|
if (repositoryIds.size !== proof.repositories.length) {
|
|
411
422
|
throw new HTTPException(409, { message: "GitHub returned duplicate repository identities" });
|
|
412
423
|
}
|
|
413
|
-
const template =
|
|
414
|
-
|
|
415
|
-
);
|
|
416
|
-
if (!template) {
|
|
417
|
-
throw new HTTPException(503, { message: "PR Review automation template is unavailable" });
|
|
418
|
-
}
|
|
424
|
+
const template = PR_REVIEW_AUTOMATION_SETUP;
|
|
425
|
+
|
|
419
426
|
const encryptionKey = environmentsEncryptionKeyBytes(deps.settings);
|
|
420
427
|
if (!encryptionKey) {
|
|
421
428
|
throw new HTTPException(503, {
|
|
422
|
-
message: "
|
|
429
|
+
message: "Opengeni Lens requires configured secret encryption",
|
|
423
430
|
});
|
|
424
431
|
}
|
|
425
432
|
let synchronized;
|
|
426
433
|
try {
|
|
427
|
-
synchronized = await
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
434
|
+
synchronized = await withOrganizationIntegrationAcquisition(
|
|
435
|
+
deps.db,
|
|
436
|
+
grant,
|
|
437
|
+
["github-lens"],
|
|
438
|
+
async (tx) => {
|
|
439
|
+
await grant.authorizeCommit(tx);
|
|
440
|
+
return syncManagedGitHubPrReviewInstallation(tx, {
|
|
441
|
+
accountId: grant.accountId,
|
|
442
|
+
workspaceId: grant.workspaceId,
|
|
443
|
+
installationId,
|
|
444
|
+
providerAccountLogin: proof.installation.accountLogin,
|
|
445
|
+
providerAccountType: proof.installation.accountType as "User" | "Organization",
|
|
446
|
+
githubActorId: proof.actorId,
|
|
447
|
+
authorityKind: proof.authorityKind,
|
|
448
|
+
authorityCheckedAt: new Date(),
|
|
449
|
+
authorityExpiresAt: new Date((payload.iat + bindingStateMaxAgeSeconds) * 1_000),
|
|
450
|
+
authorityNonce: payload.nonce,
|
|
451
|
+
appId: deps.settings.prReviewGithubAppId!,
|
|
452
|
+
webhookSecretEncrypted: encryptVariableSetValue(
|
|
453
|
+
encryptionKey,
|
|
454
|
+
deps.settings.prReviewGithubWebhookSecret!,
|
|
455
|
+
),
|
|
456
|
+
repositories: proof.repositories,
|
|
457
|
+
createdBySubjectId: grant.subjectId,
|
|
458
|
+
|
|
459
|
+
adapterId: template.adapterId,
|
|
460
|
+
eventTypes: template.eventTypes,
|
|
461
|
+
configuration: template.configuration,
|
|
462
|
+
sessionTemplate: template.sessionTemplate,
|
|
463
|
+
});
|
|
464
|
+
},
|
|
465
|
+
);
|
|
453
466
|
} catch (error) {
|
|
454
467
|
if (error instanceof PrReviewDispatchAuthorityError) {
|
|
455
468
|
throw new HTTPException(409, { message: error.message });
|
|
@@ -457,7 +470,7 @@ export function registerPrReviewGitHubRoutes(app: Hono, deps: ApiRouteDeps): voi
|
|
|
457
470
|
if (nestedPostgresSqlState(error) === "23505") {
|
|
458
471
|
throw new HTTPException(409, {
|
|
459
472
|
message:
|
|
460
|
-
"One of these repositories is already connected to
|
|
473
|
+
"One of these repositories is already connected to Opengeni Lens in another workspace",
|
|
461
474
|
});
|
|
462
475
|
}
|
|
463
476
|
throw error;
|
|
@@ -479,7 +492,7 @@ export function registerPrReviewGitHubRoutes(app: Hono, deps: ApiRouteDeps): voi
|
|
|
479
492
|
});
|
|
480
493
|
deleteCookie(c, stateCookie, { path: "/v1" });
|
|
481
494
|
return c.html(
|
|
482
|
-
|
|
495
|
+
prReviewSetupSuccessHtml(
|
|
483
496
|
proof.installation.accountLogin ?? `installation ${installationId}`,
|
|
484
497
|
`${openGeniBaseUrl(deps, c)}/workspaces/${grant.workspaceId}/capabilities`,
|
|
485
498
|
),
|
|
@@ -488,11 +501,11 @@ export function registerPrReviewGitHubRoutes(app: Hono, deps: ApiRouteDeps): voi
|
|
|
488
501
|
|
|
489
502
|
app.get("/v1/workspaces/:workspaceId/pr-review/github/installations/select", async (c) => {
|
|
490
503
|
const workspaceId = c.req.param("workspaceId");
|
|
491
|
-
const state = requireStateQuery(c, "missing
|
|
504
|
+
const state = requireStateQuery(c, "missing Opengeni Lens selection state");
|
|
492
505
|
const payload = requireFreshState(state, deps, "pr_review_github_selection", workspaceId);
|
|
493
506
|
requireStateCookie(c, state);
|
|
494
507
|
await requirePrReviewManageGrant(c, deps, workspaceId, payload);
|
|
495
|
-
|
|
508
|
+
|
|
496
509
|
const selected = c.req.query("installation_id");
|
|
497
510
|
if (selected === "new") return redirectToInstallation(c, deps, state);
|
|
498
511
|
const installationId = positiveInteger(selected);
|
|
@@ -513,24 +526,14 @@ function requireConfiguredApp(deps: ApiRouteDeps): void {
|
|
|
513
526
|
const missing = prReviewGitHubAppMissingSettings(deps.settings);
|
|
514
527
|
if (missing.length > 0) {
|
|
515
528
|
throw new HTTPException(409, {
|
|
516
|
-
message: JSON.stringify({ message: "
|
|
529
|
+
message: JSON.stringify({ message: "Opengeni Lens is not configured", missing }),
|
|
517
530
|
});
|
|
518
531
|
}
|
|
519
532
|
}
|
|
520
533
|
|
|
521
|
-
async function requireActivePack(deps: ApiRouteDeps, workspaceId: string) {
|
|
522
|
-
const installation = await getPackInstallation(deps.db, workspaceId, OPENGENI_PR_REVIEW_PACK_ID);
|
|
523
|
-
if (installation?.status !== "active") {
|
|
524
|
-
throw new HTTPException(409, {
|
|
525
|
-
message: "Install and enable the OpenGeni Review Bot Pack first",
|
|
526
|
-
});
|
|
527
|
-
}
|
|
528
|
-
return installation;
|
|
529
|
-
}
|
|
530
|
-
|
|
531
534
|
function assertManagedCompute(deps: ApiRouteDeps): void {
|
|
532
535
|
if (deps.settings.sandboxBackend === "selfhosted") {
|
|
533
|
-
throw new HTTPException(409, { message: "
|
|
536
|
+
throw new HTTPException(409, { message: "Opengeni Lens requires managed compute" });
|
|
534
537
|
}
|
|
535
538
|
}
|
|
536
539
|
|
|
@@ -539,21 +542,37 @@ async function requirePrReviewManageGrant(
|
|
|
539
542
|
deps: ApiRouteDeps,
|
|
540
543
|
workspaceId: string,
|
|
541
544
|
state: GitHubSignedStatePayload,
|
|
542
|
-
): Promise<
|
|
543
|
-
let grant:
|
|
545
|
+
): Promise<IntegrationCommitGrant> {
|
|
546
|
+
let grant: IntegrationCommitGrant;
|
|
544
547
|
try {
|
|
545
548
|
const access = await requireAccessGrantAuthorization(c, deps, workspaceId, "workspace:admin");
|
|
546
549
|
requireLegacyOAuthActor(access);
|
|
547
|
-
grant = access
|
|
550
|
+
grant = await integrationCommitGrant(access, ["workspace:admin", "secrets:write"], {
|
|
551
|
+
settings: deps.settings,
|
|
552
|
+
authorizationHeader: c.req.header("authorization"),
|
|
553
|
+
});
|
|
548
554
|
} catch (error) {
|
|
549
555
|
if (!(error instanceof HTTPException) || error.status !== 401) throw error;
|
|
550
556
|
const handedOff = prReviewBrowserGrantFromState(deps, state, workspaceId);
|
|
551
557
|
if (!handedOff) throw error;
|
|
552
|
-
grant =
|
|
558
|
+
grant = {
|
|
559
|
+
...handedOff,
|
|
560
|
+
authorizeCommit: async () => {
|
|
561
|
+
const current = prReviewBrowserGrantFromState(deps, state, workspaceId);
|
|
562
|
+
if (
|
|
563
|
+
!current ||
|
|
564
|
+
current.accountId !== handedOff.accountId ||
|
|
565
|
+
current.subjectId !== handedOff.subjectId
|
|
566
|
+
)
|
|
567
|
+
throw new HTTPException(403, {
|
|
568
|
+
message: "Opengeni Lens browser handoff expired or changed",
|
|
569
|
+
});
|
|
570
|
+
},
|
|
571
|
+
};
|
|
553
572
|
}
|
|
554
573
|
requirePermission(grant, "secrets:write");
|
|
555
574
|
if (grant.accountId !== state.accountId) {
|
|
556
|
-
throw new HTTPException(403, { message: "
|
|
575
|
+
throw new HTTPException(403, { message: "Opengeni Lens state does not match this workspace" });
|
|
557
576
|
}
|
|
558
577
|
return grant;
|
|
559
578
|
}
|
|
@@ -615,7 +634,7 @@ function redirectToInstallation(c: Context, deps: ApiRouteDeps, sourceState: str
|
|
|
615
634
|
const payload = readSignedState(sourceState, deps.githubStateSecret);
|
|
616
635
|
const slug = deps.settings.prReviewGithubAppSlug?.trim();
|
|
617
636
|
if (!payload?.accountId || !payload.workspaceId || !slug) {
|
|
618
|
-
throw new HTTPException(409, { message: "
|
|
637
|
+
throw new HTTPException(409, { message: "Opengeni Lens installation is unavailable" });
|
|
619
638
|
}
|
|
620
639
|
const installState = createSignedState(deps.githubStateSecret, {
|
|
621
640
|
accountId: payload.accountId,
|
|
@@ -638,7 +657,7 @@ function redirectToExactAuthorization(
|
|
|
638
657
|
const payload = readSignedState(sourceState, deps.githubStateSecret);
|
|
639
658
|
const clientId = deps.settings.prReviewGithubClientId?.trim();
|
|
640
659
|
if (!payload?.accountId || !payload.workspaceId || !clientId) {
|
|
641
|
-
throw new HTTPException(409, { message: "
|
|
660
|
+
throw new HTTPException(409, { message: "Opengeni Lens authorization is unavailable" });
|
|
642
661
|
}
|
|
643
662
|
const oauthState = createSignedState(deps.githubStateSecret, {
|
|
644
663
|
accountId: payload.accountId,
|
|
@@ -672,7 +691,7 @@ function requireFreshState(
|
|
|
672
691
|
(intent !== undefined && payload.intent !== intent) ||
|
|
673
692
|
(workspaceId !== undefined && payload.workspaceId !== workspaceId)
|
|
674
693
|
) {
|
|
675
|
-
throw new HTTPException(400, { message: "invalid or expired
|
|
694
|
+
throw new HTTPException(400, { message: "invalid or expired Opengeni Lens state" });
|
|
676
695
|
}
|
|
677
696
|
return payload;
|
|
678
697
|
}
|
|
@@ -703,7 +722,7 @@ function setStateCookie(c: Context, deps: ApiRouteDeps, state: string): void {
|
|
|
703
722
|
|
|
704
723
|
function requireStateCookie(c: Context, state: string): void {
|
|
705
724
|
if (!allCookieValues(c, stateCookie).includes(state)) {
|
|
706
|
-
throw new HTTPException(400, { message: "invalid
|
|
725
|
+
throw new HTTPException(400, { message: "invalid Opengeni Lens browser state" });
|
|
707
726
|
}
|
|
708
727
|
}
|
|
709
728
|
|
|
@@ -794,7 +813,7 @@ function authorityHttpError(error: unknown): HTTPException {
|
|
|
794
813
|
if (error instanceof GitHubAppApiError) {
|
|
795
814
|
return new HTTPException(502, { message: error.message });
|
|
796
815
|
}
|
|
797
|
-
return new HTTPException(502, { message: "
|
|
816
|
+
return new HTTPException(502, { message: "Opengeni Lens authority verification failed" });
|
|
798
817
|
}
|
|
799
818
|
|
|
800
819
|
function positiveInteger(value: unknown): number | null {
|
|
@@ -837,35 +856,3 @@ function githubInstallationSettingsUrl(
|
|
|
837
856
|
function openGeniBaseUrl(deps: ApiRouteDeps, c: Context): string {
|
|
838
857
|
return githubBrowserBaseUrl(deps.settings, new URL(c.req.url).origin);
|
|
839
858
|
}
|
|
840
|
-
|
|
841
|
-
function escapeHtml(value: string): string {
|
|
842
|
-
return value.replace(
|
|
843
|
-
/[&<>"']/g,
|
|
844
|
-
(char) => ({ "&": "&", "<": "<", ">": ">", '"': """, "'": "'" })[char]!,
|
|
845
|
-
);
|
|
846
|
-
}
|
|
847
|
-
|
|
848
|
-
function installationChooserHtml(
|
|
849
|
-
candidates: GitHubInstallationBindingCandidate[],
|
|
850
|
-
state: string,
|
|
851
|
-
workspaceId: string,
|
|
852
|
-
deps: ApiRouteDeps,
|
|
853
|
-
c: Context,
|
|
854
|
-
): string {
|
|
855
|
-
const action = `${openGeniBaseUrl(deps, c)}/v1/workspaces/${workspaceId}/pr-review/github/installations/select`;
|
|
856
|
-
const options = candidates
|
|
857
|
-
.map(
|
|
858
|
-
({ installation, authorityKind }) =>
|
|
859
|
-
`<label class="option"><input type="radio" name="installation_id" value="${installation.installationId}" required><span><strong>${escapeHtml(installation.accountLogin!)}</strong><small>${authorityKind === "personal_owner" ? "Personal account" : "Organization owner"}</small></span></label>`,
|
|
860
|
-
)
|
|
861
|
-
.join("");
|
|
862
|
-
return `<!doctype html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Choose GitHub account</title><style>body{font-family:system-ui,sans-serif;margin:0;min-height:100vh;display:grid;place-items:center;background:#0b0b0d;color:#f4f4f5}main{width:min(640px,calc(100vw - 32px));border:1px solid #27272a;border-radius:12px;padding:28px;background:#111114}h1{margin:0 0 10px;font-size:24px}p{color:#d4d4d8}.options{display:grid;gap:8px;margin-bottom:18px}.option{display:flex;gap:12px;border:1px solid #3f3f46;border-radius:8px;padding:12px}.option span{display:grid}.option small{color:#a1a1aa}button{min-height:38px;border-radius:7px;border:1px solid #3f3f46;padding:0 14px;font-weight:600}.secondary{margin-left:8px;background:transparent;color:#f4f4f5}</style></head><body><main><h1>Connect OpenGeni Lens</h1><p>Choose an account where GitHub proved you are the owner.</p><form method="get" action="${escapeHtml(action)}"><input type="hidden" name="state" value="${escapeHtml(state)}"><div class="options">${options}</div><button type="submit">Connect selected</button><button class="secondary" type="submit" name="installation_id" value="new" formnovalidate>Install on another account</button></form></main></body></html>`;
|
|
863
|
-
}
|
|
864
|
-
|
|
865
|
-
function setupSuccessHtml(account: string, returnUrl: string): string {
|
|
866
|
-
return `<!doctype html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>OpenGeni Lens Connected</title><style>body{font-family:system-ui,sans-serif;margin:0;min-height:100vh;display:grid;place-items:center;background:#0b0b0d;color:#f4f4f5}main{width:min(640px,calc(100vw - 32px));border:1px solid #27272a;border-radius:8px;padding:28px;background:#111114}p{color:#d4d4d8}.button{display:inline-flex;min-height:36px;align-items:center;border-radius:6px;padding:0 12px;background:#f4f4f5;color:#09090b;font-weight:600;text-decoration:none}</style></head><body><main><h1>OpenGeni Lens connected</h1><p>${escapeHtml(account)} and its selected repositories are ready for pull-request review.</p><a class="button" href="${escapeHtml(returnUrl)}">Back to OpenGeni</a></main></body></html>`;
|
|
867
|
-
}
|
|
868
|
-
|
|
869
|
-
function setupPendingHtml(): string {
|
|
870
|
-
return `<!doctype html><html><head><meta charset="utf-8"><title>OpenGeni Lens Requested</title></head><body><main><h1>Installation requested</h1><p>A GitHub organization owner must approve OpenGeni Lens. No repository was connected yet.</p></main></body></html>`;
|
|
871
|
-
}
|