@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,21 @@
|
|
|
1
|
+
type AtlassianRequestAuthority = {
|
|
2
|
+
connectionUseContext?: Omit<AcceptedConnectionUseContext, "physicalRequestId" | "usePhase">;
|
|
3
|
+
};
|
|
4
|
+
|
|
5
|
+
import type { AcceptedConnectionUseContext } from "@opengeni/db";
|
|
6
|
+
import {
|
|
7
|
+
withOrganizationIntegrationAcquisition,
|
|
8
|
+
withOrganizationIntegrationPolicyFence,
|
|
9
|
+
} from "@opengeni/db/organization-integration-policy";
|
|
10
|
+
import {
|
|
11
|
+
claimOAuthAcquisition,
|
|
12
|
+
integrationSourceSelectionRequiresAcquisition,
|
|
13
|
+
} from "./oauth-client";
|
|
1
14
|
import {
|
|
2
15
|
scheduledTaskKnowledgeSource,
|
|
3
16
|
requireScheduledTaskKnowledgeSource,
|
|
4
17
|
knowledgeSourceAgentConfig,
|
|
18
|
+
assertOrganizationIntegrationAllowed,
|
|
5
19
|
} from "@opengeni/contracts";
|
|
6
20
|
import type { Settings } from "@opengeni/config";
|
|
7
21
|
import { createHash } from "node:crypto";
|
|
@@ -44,7 +58,6 @@ import {
|
|
|
44
58
|
ConnectionDisconnectGenerationError,
|
|
45
59
|
ConnectionDisconnectIdempotencyError,
|
|
46
60
|
consumeIntegrationOAuthStateNonce,
|
|
47
|
-
claimConnectOperation,
|
|
48
61
|
finishConnectOperation,
|
|
49
62
|
getConnectAttempt,
|
|
50
63
|
decryptEnvironmentValue,
|
|
@@ -70,6 +83,10 @@ import { atlassianKnowledgeSourceIdentity } from "@opengeni/documents/atlassian"
|
|
|
70
83
|
import { createSignedState, readSignedState } from "@opengeni/github";
|
|
71
84
|
import { readResponseJsonBounded, type FetchLike } from "@opengeni/network";
|
|
72
85
|
import { HTTPException } from "hono/http-exception";
|
|
86
|
+
import {
|
|
87
|
+
ATLASSIAN_NATIVE_RETIRED_MESSAGE,
|
|
88
|
+
ATLASSIAN_NATIVE_RETIRED_REASON,
|
|
89
|
+
} from "@opengeni/contracts/atlassian-native-retirement";
|
|
73
90
|
import {
|
|
74
91
|
personalOnlyConnectionPrincipalMessage,
|
|
75
92
|
personalOwnerStateAccepted,
|
|
@@ -78,6 +95,7 @@ import {
|
|
|
78
95
|
} from "../connection-ownership";
|
|
79
96
|
import {
|
|
80
97
|
integrationBaseUrl,
|
|
98
|
+
oauthStateFailureReturn,
|
|
81
99
|
oauthStateTtlMs,
|
|
82
100
|
requireIntegrationsStateSecret,
|
|
83
101
|
} from "./oauth-client";
|
|
@@ -132,6 +150,8 @@ export async function startAtlassianOAuth(
|
|
|
132
150
|
externalContinuation?: ExternalActorContinuation;
|
|
133
151
|
},
|
|
134
152
|
): Promise<AtlassianOAuthStartResponse> {
|
|
153
|
+
assertNativeAtlassianAvailable();
|
|
154
|
+
await withOrganizationIntegrationAcquisition(deps.db, input, ["atlassian"], async () => {});
|
|
135
155
|
const oauth = requireAtlassianSettings(deps.settings);
|
|
136
156
|
const existing = input.payload.connectionId
|
|
137
157
|
? await getConnectionMetadata(
|
|
@@ -208,12 +228,19 @@ export async function completeAtlassianOAuthCallback(
|
|
|
208
228
|
operationId: `oauth:${state.nonce}`,
|
|
209
229
|
inputDigest: createHash("sha256").update(input.state!).digest("hex"),
|
|
210
230
|
};
|
|
211
|
-
const claim = await
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
231
|
+
const claim = await claimOAuthAcquisition(
|
|
232
|
+
deps.db,
|
|
233
|
+
state,
|
|
234
|
+
{
|
|
235
|
+
...operation,
|
|
236
|
+
expectedRevision: stored.attempt.revision,
|
|
237
|
+
authorize: (tx, _attempt, origin) =>
|
|
238
|
+
requireConnectOwnerAuthority(tx, state!, "connections:write", origin),
|
|
239
|
+
},
|
|
240
|
+
"atlassian",
|
|
241
|
+
// Retirement only settles this attempt; it acquires no integration.
|
|
242
|
+
false,
|
|
243
|
+
);
|
|
217
244
|
if (claim.status === "replayed") return { redirectTo: exactReturnUrl, exactReturn: true };
|
|
218
245
|
}
|
|
219
246
|
await requireCallbackGrant(deps, state);
|
|
@@ -225,7 +252,7 @@ export async function completeAtlassianOAuthCallback(
|
|
|
225
252
|
expiresAt: new Date(state.iat * 1000 + oauthStateTtlMs),
|
|
226
253
|
now: new Date(),
|
|
227
254
|
});
|
|
228
|
-
if (!consumed) throw new AtlassianCallbackError("
|
|
255
|
+
if (!consumed) throw new AtlassianCallbackError("state_replayed");
|
|
229
256
|
if (operation && (input.error || !input.code)) {
|
|
230
257
|
await finishConnectOperation(deps.db, state, {
|
|
231
258
|
...operation,
|
|
@@ -247,6 +274,30 @@ export async function completeAtlassianOAuthCallback(
|
|
|
247
274
|
}
|
|
248
275
|
if (input.error) throw new AtlassianCallbackError("provider_denied");
|
|
249
276
|
if (!input.code) throw new AtlassianCallbackError("missing_code");
|
|
277
|
+
// An authorization started on an older release must not exchange or save
|
|
278
|
+
// a native grant after retirement. Preserve exact Connect navigation and
|
|
279
|
+
// settle the pending attempt so it does not remain stuck authorizing.
|
|
280
|
+
if (operation) {
|
|
281
|
+
await finishConnectOperation(deps.db, state, {
|
|
282
|
+
...operation,
|
|
283
|
+
authorize: (tx, _attempt, origin) =>
|
|
284
|
+
requireConnectOwnerAuthority(tx, state!, "connections:write", origin),
|
|
285
|
+
commit: async (_tx, current) => ({
|
|
286
|
+
...current,
|
|
287
|
+
revision: current.revision + 1,
|
|
288
|
+
state: "failed",
|
|
289
|
+
nextAction: { type: "none" },
|
|
290
|
+
error: {
|
|
291
|
+
code: ATLASSIAN_NATIVE_RETIRED_REASON,
|
|
292
|
+
message: ATLASSIAN_NATIVE_RETIRED_MESSAGE,
|
|
293
|
+
retryable: false,
|
|
294
|
+
},
|
|
295
|
+
}),
|
|
296
|
+
});
|
|
297
|
+
return { redirectTo: exactReturnUrl!, exactReturn: true };
|
|
298
|
+
}
|
|
299
|
+
assertNativeAtlassianAvailable();
|
|
300
|
+
await withOrganizationIntegrationAcquisition(deps.db, state, ["atlassian"], async () => {});
|
|
250
301
|
|
|
251
302
|
const oauth = requireAtlassianSettings(deps.settings);
|
|
252
303
|
const redirectUri = `${baseUrl}/v1/integrations/atlassian/callback`;
|
|
@@ -359,49 +410,30 @@ export async function completeAtlassianOAuthCallback(
|
|
|
359
410
|
createdBySubjectId: state.subjectId,
|
|
360
411
|
});
|
|
361
412
|
};
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
...current,
|
|
372
|
-
revision: current.revision + 1,
|
|
373
|
-
state: "complete",
|
|
374
|
-
credentialsCommitted: true,
|
|
375
|
-
nextAction: { type: "none" },
|
|
376
|
-
account: {
|
|
377
|
-
id: connection.id,
|
|
378
|
-
version: connection.version,
|
|
379
|
-
providerId: "atlassian",
|
|
380
|
-
label: profile.displayName ?? "Atlassian",
|
|
381
|
-
ownership: "personal",
|
|
382
|
-
status: "connected",
|
|
383
|
-
},
|
|
384
|
-
};
|
|
385
|
-
},
|
|
386
|
-
});
|
|
387
|
-
return { redirectTo: exactReturnUrl!, exactReturn: true };
|
|
388
|
-
}
|
|
389
|
-
const connection = await deps.db.transaction(async (tx) => {
|
|
390
|
-
await requireCallbackGrant({ ...deps, db: tx }, acceptedState);
|
|
391
|
-
return persist(tx);
|
|
392
|
-
});
|
|
413
|
+
const connection = await withOrganizationIntegrationAcquisition(
|
|
414
|
+
deps.db,
|
|
415
|
+
acceptedState,
|
|
416
|
+
["atlassian"],
|
|
417
|
+
async (tx) => {
|
|
418
|
+
await requireCallbackGrant({ ...deps, db: tx }, acceptedState);
|
|
419
|
+
return persist(tx);
|
|
420
|
+
},
|
|
421
|
+
);
|
|
393
422
|
if (!connection) throw new AtlassianCallbackError("connection_conflict");
|
|
394
423
|
return {
|
|
395
424
|
redirectTo: returnUrl(returnBaseUrl, state.returnPath, "connected", connection.id),
|
|
396
425
|
};
|
|
397
426
|
} catch (error) {
|
|
398
427
|
if (exactReturnUrl) return { redirectTo: exactReturnUrl, exactReturn: true };
|
|
428
|
+
// Reading the state is the first step, so no state means the link itself
|
|
429
|
+
// was unusable: say whether it expired rather than blame configuration.
|
|
430
|
+
const failure = state ? null : oauthStateFailureReturn(deps.settings, input.state);
|
|
399
431
|
return {
|
|
400
432
|
redirectTo: returnUrl(
|
|
401
433
|
returnBaseUrl,
|
|
402
|
-
state?.returnPath ??
|
|
434
|
+
state?.returnPath ?? failure!.returnPath,
|
|
403
435
|
"error",
|
|
404
|
-
errorReason(error),
|
|
436
|
+
failure?.reason ?? errorReason(error),
|
|
405
437
|
),
|
|
406
438
|
};
|
|
407
439
|
}
|
|
@@ -409,8 +441,13 @@ export async function completeAtlassianOAuthCallback(
|
|
|
409
441
|
|
|
410
442
|
export async function browseAtlassianSources(
|
|
411
443
|
deps: ApiRouteDeps,
|
|
412
|
-
input:
|
|
444
|
+
input: AtlassianRequestAuthority & {
|
|
445
|
+
workspaceId: string;
|
|
446
|
+
subjectId: string;
|
|
447
|
+
connectionId: string;
|
|
448
|
+
},
|
|
413
449
|
) {
|
|
450
|
+
assertNativeAtlassianAvailable();
|
|
414
451
|
const connection = await getConnectionMetadata(
|
|
415
452
|
deps.db,
|
|
416
453
|
input.workspaceId,
|
|
@@ -450,7 +487,7 @@ export async function browseAtlassianSources(
|
|
|
450
487
|
|
|
451
488
|
export async function searchAtlassianLive(
|
|
452
489
|
deps: ApiRouteDeps,
|
|
453
|
-
input: {
|
|
490
|
+
input: AtlassianRequestAuthority & {
|
|
454
491
|
workspaceId: string;
|
|
455
492
|
subjectId: string;
|
|
456
493
|
connectionId: string;
|
|
@@ -459,6 +496,7 @@ export async function searchAtlassianLive(
|
|
|
459
496
|
limit: number;
|
|
460
497
|
},
|
|
461
498
|
) {
|
|
499
|
+
assertNativeAtlassianAvailable();
|
|
462
500
|
const connection = await getConnectionMetadata(
|
|
463
501
|
deps.db,
|
|
464
502
|
input.workspaceId,
|
|
@@ -553,7 +591,7 @@ export async function searchAtlassianLive(
|
|
|
553
591
|
|
|
554
592
|
export async function getAtlassianLiveItem(
|
|
555
593
|
deps: ApiRouteDeps,
|
|
556
|
-
input: {
|
|
594
|
+
input: AtlassianRequestAuthority & {
|
|
557
595
|
workspaceId: string;
|
|
558
596
|
subjectId: string;
|
|
559
597
|
connectionId: string;
|
|
@@ -561,6 +599,7 @@ export async function getAtlassianLiveItem(
|
|
|
561
599
|
id: string;
|
|
562
600
|
},
|
|
563
601
|
) {
|
|
602
|
+
assertNativeAtlassianAvailable();
|
|
564
603
|
const connection = await getConnectionMetadata(
|
|
565
604
|
deps.db,
|
|
566
605
|
input.workspaceId,
|
|
@@ -674,6 +713,7 @@ export async function saveAtlassianSources(
|
|
|
674
713
|
canManagePersonalDestination: boolean;
|
|
675
714
|
},
|
|
676
715
|
) {
|
|
716
|
+
assertNativeAtlassianAvailable();
|
|
677
717
|
const parsed = SaveAtlassianSourcesRequest.safeParse(input.payload);
|
|
678
718
|
if (!parsed.success) {
|
|
679
719
|
throw new HTTPException(400, { message: "invalid Atlassian source selection" });
|
|
@@ -705,9 +745,28 @@ export async function saveAtlassianSources(
|
|
|
705
745
|
initiatingSubjectId: input.subjectId,
|
|
706
746
|
});
|
|
707
747
|
|
|
708
|
-
const
|
|
748
|
+
const requestedSelection = parsed.data.sources.map((source) => ({
|
|
749
|
+
...source,
|
|
750
|
+
destination,
|
|
751
|
+
syncCadence: parsed.data.syncCadence,
|
|
752
|
+
syncEnabled: parsed.data.syncEnabled,
|
|
753
|
+
readPolicy: parsed.data.readPolicy,
|
|
754
|
+
}));
|
|
755
|
+
const acquiring = integrationSourceSelectionRequiresAcquisition(
|
|
756
|
+
metadata.selectedSources,
|
|
757
|
+
requestedSelection,
|
|
758
|
+
);
|
|
759
|
+
if (acquiring) {
|
|
760
|
+
await withOrganizationIntegrationAcquisition(deps.db, input, ["atlassian"], async () => {});
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
const available =
|
|
764
|
+
acquiring && parsed.data.sources.length
|
|
765
|
+
? (await browseAtlassianSources(deps, input)).items
|
|
766
|
+
: [];
|
|
709
767
|
const availableById = new Map(available.map((source) => [source.id, source]));
|
|
710
768
|
const verified = parsed.data.sources.map((source) => {
|
|
769
|
+
if (!acquiring) return source;
|
|
711
770
|
const current = availableById.get(source.id);
|
|
712
771
|
if (
|
|
713
772
|
!current ||
|
|
@@ -724,28 +783,39 @@ export async function saveAtlassianSources(
|
|
|
724
783
|
return current;
|
|
725
784
|
});
|
|
726
785
|
const previousSources = metadata.selectedSources;
|
|
727
|
-
const updated = await
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
786
|
+
const updated = await withOrganizationIntegrationPolicyFence(
|
|
787
|
+
deps.db,
|
|
788
|
+
input,
|
|
789
|
+
async (tx, policy) => {
|
|
790
|
+
// The exact generation checked by transitionConnectionState binds this
|
|
791
|
+
// comparison to the row being changed. Provider verification already ended.
|
|
792
|
+
if (integrationSourceSelectionRequiresAcquisition(previousSources, requestedSelection)) {
|
|
793
|
+
assertOrganizationIntegrationAllowed(policy, "atlassian");
|
|
794
|
+
}
|
|
795
|
+
return transitionConnectionState(tx, {
|
|
796
|
+
workspaceId: input.workspaceId,
|
|
797
|
+
connectionId: existing.id,
|
|
798
|
+
visibleToSubjectId: input.subjectId,
|
|
799
|
+
expectedVersion: existing.version,
|
|
800
|
+
metadata: AtlassianConnectionMetadata.parse({
|
|
801
|
+
...metadata,
|
|
802
|
+
documentDestination: destination,
|
|
803
|
+
selectedSources: verified.map((source) => ({
|
|
804
|
+
...source,
|
|
805
|
+
destination,
|
|
806
|
+
syncCadence: parsed.data.syncCadence,
|
|
807
|
+
syncEnabled: parsed.data.syncEnabled,
|
|
808
|
+
configGeneration:
|
|
809
|
+
(previousSources.find((previous) => previous.id === source.id)?.configGeneration ??
|
|
810
|
+
0) + 1,
|
|
811
|
+
readPolicy: parsed.data.readPolicy,
|
|
812
|
+
selectedAt: new Date().toISOString(),
|
|
813
|
+
})),
|
|
814
|
+
}),
|
|
815
|
+
updatedBySubjectId: input.subjectId,
|
|
816
|
+
});
|
|
817
|
+
},
|
|
818
|
+
);
|
|
749
819
|
if (!updated) throw new HTTPException(409, { message: "Atlassian connection changed" });
|
|
750
820
|
await materializeSchedules(deps, {
|
|
751
821
|
...input,
|
|
@@ -765,6 +835,7 @@ export async function transitionAtlassianLifecycle(
|
|
|
765
835
|
payload: AtlassianLifecycleActionRequest;
|
|
766
836
|
},
|
|
767
837
|
) {
|
|
838
|
+
if (input.payload.action === "resume") assertNativeAtlassianAvailable();
|
|
768
839
|
const connection = await getConnectionMetadata(
|
|
769
840
|
deps.db,
|
|
770
841
|
input.workspaceId,
|
|
@@ -783,14 +854,27 @@ export async function transitionAtlassianLifecycle(
|
|
|
783
854
|
if (target === "paused") {
|
|
784
855
|
await deauthorizeConnectionSources(deps, connection, input.subjectId, "connection_paused");
|
|
785
856
|
}
|
|
786
|
-
const
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
857
|
+
const persist = (tx: Database) =>
|
|
858
|
+
transitionConnectionState(tx, {
|
|
859
|
+
workspaceId: input.workspaceId,
|
|
860
|
+
connectionId: input.connectionId,
|
|
861
|
+
visibleToSubjectId: input.subjectId,
|
|
862
|
+
expectedVersion: connection.version,
|
|
863
|
+
metadata: AtlassianConnectionMetadata.parse({ ...metadata, lifecycle: lifecycle(target) }),
|
|
864
|
+
updatedBySubjectId: input.subjectId,
|
|
865
|
+
});
|
|
866
|
+
const updated =
|
|
867
|
+
target === "active"
|
|
868
|
+
? await withOrganizationIntegrationPolicyFence(
|
|
869
|
+
deps.db,
|
|
870
|
+
{ accountId: connection.accountId, workspaceId: input.workspaceId },
|
|
871
|
+
(tx, policy) => {
|
|
872
|
+
if ((metadata.lifecycle?.state ?? "active") !== "active")
|
|
873
|
+
assertOrganizationIntegrationAllowed(policy, "atlassian");
|
|
874
|
+
return persist(tx);
|
|
875
|
+
},
|
|
876
|
+
)
|
|
877
|
+
: await persist(deps.db);
|
|
794
878
|
if (!updated) throw new HTTPException(409, { message: "Atlassian connection changed" });
|
|
795
879
|
await setSchedulePause(deps, input.workspaceId, input.connectionId, target === "paused");
|
|
796
880
|
return updated;
|
|
@@ -1164,7 +1248,6 @@ async function materializeSchedules(
|
|
|
1164
1248
|
action: { kind: "agent_turn" },
|
|
1165
1249
|
runMode: "new_session_per_run",
|
|
1166
1250
|
targetSessionId: null,
|
|
1167
|
-
connectionAuthorities: [],
|
|
1168
1251
|
agentConfig: knowledgeSourceAgentConfig(action),
|
|
1169
1252
|
variableSetId: null,
|
|
1170
1253
|
environmentId: null,
|
|
@@ -1229,7 +1312,11 @@ async function materializeSchedules(
|
|
|
1229
1312
|
|
|
1230
1313
|
async function browseJiraProjects(
|
|
1231
1314
|
deps: ApiRouteDeps,
|
|
1232
|
-
input:
|
|
1315
|
+
input: AtlassianRequestAuthority & {
|
|
1316
|
+
workspaceId: string;
|
|
1317
|
+
subjectId: string;
|
|
1318
|
+
connectionId: string;
|
|
1319
|
+
},
|
|
1233
1320
|
site: AtlassianSite,
|
|
1234
1321
|
): Promise<AtlassianBrowseItem[]> {
|
|
1235
1322
|
const items: AtlassianBrowseItem[] = [];
|
|
@@ -1275,7 +1362,11 @@ async function browseJiraProjects(
|
|
|
1275
1362
|
|
|
1276
1363
|
async function browseConfluenceSpaces(
|
|
1277
1364
|
deps: ApiRouteDeps,
|
|
1278
|
-
input:
|
|
1365
|
+
input: AtlassianRequestAuthority & {
|
|
1366
|
+
workspaceId: string;
|
|
1367
|
+
subjectId: string;
|
|
1368
|
+
connectionId: string;
|
|
1369
|
+
},
|
|
1279
1370
|
site: AtlassianSite,
|
|
1280
1371
|
): Promise<AtlassianBrowseItem[]> {
|
|
1281
1372
|
const items: AtlassianBrowseItem[] = [];
|
|
@@ -1333,7 +1424,7 @@ export function confluenceNextUrl(cloudId: string, next: string): URL {
|
|
|
1333
1424
|
|
|
1334
1425
|
async function atlassianApiRequest(
|
|
1335
1426
|
deps: ApiRouteDeps,
|
|
1336
|
-
input: {
|
|
1427
|
+
input: AtlassianRequestAuthority & {
|
|
1337
1428
|
workspaceId: string;
|
|
1338
1429
|
subjectId: string;
|
|
1339
1430
|
connectionId: string;
|
|
@@ -1341,6 +1432,7 @@ async function atlassianApiRequest(
|
|
|
1341
1432
|
label: string;
|
|
1342
1433
|
},
|
|
1343
1434
|
): Promise<unknown> {
|
|
1435
|
+
assertNativeAtlassianAvailable();
|
|
1344
1436
|
const current = await getConnectionMetadata(
|
|
1345
1437
|
deps.db,
|
|
1346
1438
|
input.workspaceId,
|
|
@@ -1354,9 +1446,20 @@ async function atlassianApiRequest(
|
|
|
1354
1446
|
});
|
|
1355
1447
|
const resolve = async (forceRefresh: boolean) =>
|
|
1356
1448
|
await resolver({
|
|
1357
|
-
workspaceId: input.workspaceId,
|
|
1449
|
+
workspaceId: input.connectionUseContext?.workspaceId ?? input.workspaceId,
|
|
1450
|
+
...(input.connectionUseContext
|
|
1451
|
+
? {
|
|
1452
|
+
connectionUseContext: {
|
|
1453
|
+
...input.connectionUseContext,
|
|
1454
|
+
physicalRequestId: crypto.randomUUID(),
|
|
1455
|
+
usePhase: "credential_resolution" as const,
|
|
1456
|
+
},
|
|
1457
|
+
}
|
|
1458
|
+
: {}),
|
|
1358
1459
|
subjectId: input.subjectId,
|
|
1359
|
-
serverId:
|
|
1460
|
+
serverId: input.connectionUseContext
|
|
1461
|
+
? `atlassian:${input.connectionId}`
|
|
1462
|
+
: "atlassian-source-browser",
|
|
1360
1463
|
toolName: input.label,
|
|
1361
1464
|
connectionRef: {
|
|
1362
1465
|
providerDomain: ATLASSIAN_PROVIDER_DOMAIN,
|
|
@@ -1707,11 +1810,17 @@ function returnUrl(base: string, path: string, status: "connected" | "error", va
|
|
|
1707
1810
|
}
|
|
1708
1811
|
|
|
1709
1812
|
function errorReason(error: unknown): string {
|
|
1813
|
+
if (error instanceof HTTPException && error.status === 410)
|
|
1814
|
+
return ATLASSIAN_NATIVE_RETIRED_REASON;
|
|
1710
1815
|
if (error instanceof AtlassianCallbackError) return error.reason;
|
|
1711
1816
|
if (error instanceof HTTPException) return `http_${error.status}`;
|
|
1712
1817
|
return "connection_failed";
|
|
1713
1818
|
}
|
|
1714
1819
|
|
|
1820
|
+
function assertNativeAtlassianAvailable(): void {
|
|
1821
|
+
throw new HTTPException(410, { message: ATLASSIAN_NATIVE_RETIRED_MESSAGE });
|
|
1822
|
+
}
|
|
1823
|
+
|
|
1715
1824
|
class AtlassianCallbackError extends Error {
|
|
1716
1825
|
constructor(readonly reason: string) {
|
|
1717
1826
|
super(reason);
|
|
@@ -1763,7 +1872,12 @@ function cqlString(value: string): string {
|
|
|
1763
1872
|
|
|
1764
1873
|
async function readJiraLiveComments(
|
|
1765
1874
|
deps: ApiRouteDeps,
|
|
1766
|
-
input:
|
|
1875
|
+
input: AtlassianRequestAuthority & {
|
|
1876
|
+
workspaceId: string;
|
|
1877
|
+
subjectId: string;
|
|
1878
|
+
connectionId: string;
|
|
1879
|
+
id: string;
|
|
1880
|
+
},
|
|
1767
1881
|
cloudId: string,
|
|
1768
1882
|
) {
|
|
1769
1883
|
const comments: Array<{ author: string | null; createdAt: string | null; body: string }> = [];
|
|
@@ -1796,7 +1910,12 @@ async function readJiraLiveComments(
|
|
|
1796
1910
|
|
|
1797
1911
|
async function readConfluenceLiveComments(
|
|
1798
1912
|
deps: ApiRouteDeps,
|
|
1799
|
-
input:
|
|
1913
|
+
input: AtlassianRequestAuthority & {
|
|
1914
|
+
workspaceId: string;
|
|
1915
|
+
subjectId: string;
|
|
1916
|
+
connectionId: string;
|
|
1917
|
+
id: string;
|
|
1918
|
+
},
|
|
1800
1919
|
cloudId: string,
|
|
1801
1920
|
) {
|
|
1802
1921
|
const comments: Array<{ createdAt: string | null; content: string }> = [];
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { withOrganizationIntegrationAcquisition } from "@opengeni/db/organization-integration-policy";
|
|
2
|
+
import { claimOAuthAcquisition, finishOAuthAcquisition } from "./oauth-client";
|
|
1
3
|
import { safeReturnPath } from "./oauth-return-path";
|
|
2
4
|
import type { ApiRouteDeps } from "@opengeni/core";
|
|
3
5
|
import type { Settings } from "@opengeni/config";
|
|
@@ -30,7 +32,6 @@ import {
|
|
|
30
32
|
encryptEnvironmentValue,
|
|
31
33
|
decryptEnvironmentValue,
|
|
32
34
|
getConnectAttempt,
|
|
33
|
-
claimConnectOperation,
|
|
34
35
|
finishConnectOperation,
|
|
35
36
|
getConnectionMetadata,
|
|
36
37
|
listConnectionsMetadata,
|
|
@@ -45,8 +46,10 @@ import { readResponseJsonBounded, type FetchLike } from "@opengeni/network";
|
|
|
45
46
|
import { HTTPException } from "hono/http-exception";
|
|
46
47
|
import {
|
|
47
48
|
integrationBaseUrl,
|
|
49
|
+
oauthStateFailureReturn,
|
|
48
50
|
oauthStateTtlMs,
|
|
49
51
|
requireIntegrationsStateSecret,
|
|
52
|
+
workspaceIntegrationsPath,
|
|
50
53
|
} from "./oauth-client";
|
|
51
54
|
|
|
52
55
|
const FIKEN_API_BASE = "https://api.fiken.no/api/v2";
|
|
@@ -63,7 +66,9 @@ const MAX_DRAFT_LINES = 100;
|
|
|
63
66
|
const COMPANY_SLUG_PATTERN = /^[a-z0-9][a-z0-9-]{0,127}$/;
|
|
64
67
|
|
|
65
68
|
/** Shared native/embedded token adapter. Provider verification happens before
|
|
66
|
-
* persistence; the caller reauthorizes inside its durable commit transaction.
|
|
69
|
+
* persistence; the caller reauthorizes inside its durable commit transaction.
|
|
70
|
+
* That caller must acquire the organization policy fence for `fiken` BEFORE
|
|
71
|
+
* owner/tenancy locks and invoke the returned writer with that exact tx. */
|
|
67
72
|
export async function prepareFikenTokenInstall(
|
|
68
73
|
deps: ApiRouteDeps,
|
|
69
74
|
grant: Pick<AccessGrant, "accountId" | "workspaceId" | "subjectId">,
|
|
@@ -71,6 +76,7 @@ export async function prepareFikenTokenInstall(
|
|
|
71
76
|
expectedVersion?: number,
|
|
72
77
|
): Promise<(tx: Database) => Promise<ConnectionMetadata>> {
|
|
73
78
|
const payload = FikenInstallRequest.parse(raw);
|
|
79
|
+
await withOrganizationIntegrationAcquisition(deps.db, grant, ["fiken"], async () => {});
|
|
74
80
|
const key = requireEnvironmentEncryption(deps.settings);
|
|
75
81
|
const existing = payload.connectionId
|
|
76
82
|
? await getConnectionMetadata(deps.db, grant.workspaceId, payload.connectionId, null)
|
|
@@ -1102,6 +1108,7 @@ export async function startFikenOAuth(
|
|
|
1102
1108
|
connectAttemptId?: string;
|
|
1103
1109
|
},
|
|
1104
1110
|
): Promise<FikenOAuthStartResponse> {
|
|
1111
|
+
await withOrganizationIntegrationAcquisition(deps.db, input, ["fiken"], async () => {});
|
|
1105
1112
|
const fiken = requireFikenOAuthSettings(deps.settings);
|
|
1106
1113
|
const existing = input.payload.connectionId
|
|
1107
1114
|
? await getConnectionMetadata(deps.db, input.workspaceId, input.payload.connectionId, null)
|
|
@@ -1118,7 +1125,7 @@ export async function startFikenOAuth(
|
|
|
1118
1125
|
workspaceId: input.workspaceId,
|
|
1119
1126
|
subjectId: input.subjectId,
|
|
1120
1127
|
returnPath: safeReturnPath(
|
|
1121
|
-
input.payload.returnPath ??
|
|
1128
|
+
input.payload.returnPath ?? workspaceIntegrationsPath(input.workspaceId),
|
|
1122
1129
|
),
|
|
1123
1130
|
...(input.connectAttemptId ? { connectAttemptId: input.connectAttemptId } : {}),
|
|
1124
1131
|
...(input.externalContinuation
|
|
@@ -1168,12 +1175,18 @@ export async function completeFikenOAuthCallback(
|
|
|
1168
1175
|
operationId: `oauth:${state.nonce}`,
|
|
1169
1176
|
inputDigest: createHash("sha256").update(input.state!).digest("hex"),
|
|
1170
1177
|
};
|
|
1171
|
-
const claim = await
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1178
|
+
const claim = await claimOAuthAcquisition(
|
|
1179
|
+
deps.db,
|
|
1180
|
+
state,
|
|
1181
|
+
{
|
|
1182
|
+
...operation,
|
|
1183
|
+
expectedRevision: stored.attempt.revision,
|
|
1184
|
+
authorize: (tx, _attempt, origin) =>
|
|
1185
|
+
requireConnectOwnerAuthority(tx, state!, "connections:write", origin),
|
|
1186
|
+
},
|
|
1187
|
+
"fiken",
|
|
1188
|
+
Boolean(input.code && !input.error),
|
|
1189
|
+
);
|
|
1177
1190
|
if (claim.status === "replayed") return { redirectTo: exactReturnUrl, exactReturn: true };
|
|
1178
1191
|
}
|
|
1179
1192
|
await requireFikenCallbackGrant(deps.db, state);
|
|
@@ -1217,6 +1230,7 @@ export async function completeFikenOAuthCallback(
|
|
|
1217
1230
|
if (!input.code) {
|
|
1218
1231
|
throw new FikenOAuthCallbackError("missing_code");
|
|
1219
1232
|
}
|
|
1233
|
+
await withOrganizationIntegrationAcquisition(deps.db, state, ["fiken"], async () => {});
|
|
1220
1234
|
const fiken = requireFikenOAuthSettings(deps.settings);
|
|
1221
1235
|
const key = requireEnvironmentEncryption(deps.settings);
|
|
1222
1236
|
const fetchImpl = deps.fikenFetch ?? fetch;
|
|
@@ -1303,36 +1317,46 @@ export async function completeFikenOAuthCallback(
|
|
|
1303
1317
|
createdBySubjectId: state!.subjectId,
|
|
1304
1318
|
});
|
|
1305
1319
|
if (operation) {
|
|
1306
|
-
await
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1320
|
+
await finishOAuthAcquisition(
|
|
1321
|
+
deps.db,
|
|
1322
|
+
state,
|
|
1323
|
+
{
|
|
1324
|
+
...operation,
|
|
1325
|
+
authorize: (tx, _attempt, origin) =>
|
|
1326
|
+
requireConnectOwnerAuthority(tx, state!, "connections:write", origin),
|
|
1327
|
+
commit: async (tx, current) => {
|
|
1328
|
+
const connection = await persist(tx);
|
|
1329
|
+
if (!connection) throw new FikenOAuthCallbackError("connection_conflict");
|
|
1330
|
+
return {
|
|
1331
|
+
...current,
|
|
1332
|
+
revision: current.revision + 1,
|
|
1333
|
+
state: "complete",
|
|
1334
|
+
credentialsCommitted: true,
|
|
1335
|
+
nextAction: { type: "none" },
|
|
1336
|
+
account: {
|
|
1337
|
+
id: connection.id,
|
|
1338
|
+
version: connection.version,
|
|
1339
|
+
providerId: "fiken-oauth",
|
|
1340
|
+
label: "Fiken",
|
|
1341
|
+
ownership: "workspace",
|
|
1342
|
+
status: "connected",
|
|
1343
|
+
},
|
|
1344
|
+
};
|
|
1345
|
+
},
|
|
1328
1346
|
},
|
|
1329
|
-
|
|
1347
|
+
"fiken",
|
|
1348
|
+
);
|
|
1330
1349
|
return { redirectTo: exactReturnUrl!, exactReturn: true };
|
|
1331
1350
|
}
|
|
1332
|
-
const connection = await
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1351
|
+
const connection = await withOrganizationIntegrationAcquisition(
|
|
1352
|
+
deps.db,
|
|
1353
|
+
state,
|
|
1354
|
+
["fiken"],
|
|
1355
|
+
async (tx) => {
|
|
1356
|
+
await requireFikenCallbackGrant(tx, state!);
|
|
1357
|
+
return persist(tx);
|
|
1358
|
+
},
|
|
1359
|
+
);
|
|
1336
1360
|
if (!connection) {
|
|
1337
1361
|
throw new FikenOAuthCallbackError("connection_conflict");
|
|
1338
1362
|
}
|
|
@@ -1341,12 +1365,16 @@ export async function completeFikenOAuthCallback(
|
|
|
1341
1365
|
};
|
|
1342
1366
|
} catch (error) {
|
|
1343
1367
|
if (exactReturnUrl) return { redirectTo: exactReturnUrl, exactReturn: true };
|
|
1368
|
+
// Reading the state is the first step, so no state means the link itself
|
|
1369
|
+
// was unusable: say whether it expired instead of suggesting a token.
|
|
1370
|
+
const failure = state ? null : oauthStateFailureReturn(deps.settings, input.state);
|
|
1344
1371
|
return {
|
|
1345
1372
|
redirectTo: fikenReturnUrl(
|
|
1346
1373
|
returnBaseUrl,
|
|
1347
|
-
state?.returnPath ??
|
|
1374
|
+
state?.returnPath ?? failure!.returnPath,
|
|
1348
1375
|
"error",
|
|
1349
|
-
|
|
1376
|
+
failure?.reason ??
|
|
1377
|
+
(error instanceof FikenOAuthCallbackError ? error.reason : "callback_failed"),
|
|
1350
1378
|
),
|
|
1351
1379
|
};
|
|
1352
1380
|
}
|