@opengeni/api-router 3.0.1 → 3.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/access-grant-rls.d.ts +8 -1
- package/dist/admission-trace.d.ts +8 -0
- package/dist/app.d.ts +50 -3
- package/dist/app.js +10 -1
- package/dist/artifact-catalog-cursor.d.ts +1 -0
- package/dist/attached-browser-viewer.d.ts +11 -0
- package/dist/auth/managed-auth-attempt-context.d.ts +2 -0
- package/dist/auth/managed-auth-rate-limits.d.ts +167 -0
- package/dist/auth/managed-auth-session-adapter.d.ts +9 -1
- package/dist/auth/managed-auth.d.ts +72 -5
- package/dist/auth/managed-sign-in-notifications.d.ts +4 -0
- package/dist/auth/new-signups-gate.d.ts +23 -0
- package/dist/auth/signup-funnel-metrics.d.ts +44 -0
- package/dist/azure-live.d.ts +28 -0
- package/dist/browser-action-fences.d.ts +13 -0
- package/dist/browser-controller-authority.d.ts +1 -61
- package/dist/browser-ephemeral.d.ts +5 -0
- package/dist/browser-lost-runtime-end.d.ts +24 -0
- package/dist/browser-state-authority.d.ts +1 -27
- package/dist/chunk-OGQDXVXY.js +18 -0
- package/dist/chunk-OGQDXVXY.js.map +1 -0
- package/dist/{chunk-AJ62T5QN.js → chunk-OT56OY4V.js} +80503 -39869
- package/dist/chunk-OT56OY4V.js.map +1 -0
- package/dist/claude-default-models.d.ts +19 -0
- package/dist/claude-subscription-core.d.ts +50 -0
- package/dist/claude-subscription-oauth.d.ts +36 -0
- package/dist/claude-subscription-profile.d.ts +9 -0
- package/dist/claude-subscription-usage.d.ts +6 -0
- package/dist/claude-workspace-connection.d.ts +15 -0
- package/dist/codemode.d.ts +40 -5
- package/dist/codex-realtime.d.ts +29 -3
- package/dist/codex-session-pointers.d.ts +19 -0
- package/dist/connection-ownership.d.ts +6 -3
- package/dist/controller-data-plane.d.ts +16 -0
- package/dist/credit-promotion-snapshot.d.ts +6 -0
- package/dist/editable-artifact-source-session.d.ts +3 -0
- package/dist/editable-artifact-websocket.d.ts +5 -3
- package/dist/fatal-process-boundary.d.ts +9 -1
- package/dist/github-access.d.ts +7 -1
- package/dist/github-browser-flow.d.ts +1 -1
- package/dist/http/acting-person.d.ts +36 -0
- package/dist/http/api-contract-compat.d.ts +19 -0
- package/dist/http/api-error.d.ts +50 -1
- package/dist/http/auth.d.ts +8 -1
- package/dist/http/cors.d.ts +12 -0
- package/dist/http/deprecation.d.ts +42 -0
- package/dist/http/keyed-admission.d.ts +12 -0
- package/dist/http/local-browser-boundary.d.ts +72 -0
- package/dist/http/metrics-listener.d.ts +22 -0
- package/dist/http/path-identifier.d.ts +17 -0
- package/dist/http/registered-route-label.d.ts +16 -0
- package/dist/http/rejection-telemetry.d.ts +34 -0
- package/dist/http/request-body.d.ts +27 -0
- package/dist/http/request-source.d.ts +41 -3
- package/dist/http/sse.d.ts +12 -1
- package/dist/http/unmatched-route.d.ts +18 -0
- package/dist/http/user-content.d.ts +36 -0
- package/dist/http/variable-sets-removed.d.ts +41 -0
- package/dist/http/websocket-upgrade-dispatch.d.ts +18 -0
- package/dist/index.js +1279 -108
- package/dist/index.js.map +1 -1
- package/dist/integration-connect-metrics.d.ts +35 -0
- package/dist/integration-endpoint-test.d.ts +20 -0
- package/dist/integrations/api-integrations.d.ts +2 -2
- package/dist/integrations/atlassian.d.ts +8 -3
- package/dist/integrations/fiken.d.ts +3 -1
- package/dist/integrations/github-lens-connect.d.ts +37 -66
- package/dist/integrations/google-drive.d.ts +2 -0
- package/dist/integrations/integration-commit-authority.d.ts +13 -0
- package/dist/integrations/marketplace-plugin.d.ts +43 -43
- package/dist/integrations/oauth-client.d.ts +171 -12
- package/dist/integrations/oauth-profiles.d.ts +42 -13
- package/dist/integrations/onepassword-vault-provider.d.ts +9 -0
- package/dist/integrations/slack-bot.d.ts +285 -7
- package/dist/integrations/slack-file-upload-flow.d.ts +62 -0
- package/dist/integrations/slack-interactions.d.ts +89 -10
- package/dist/integrations/slack-mrkdwn.d.ts +41 -0
- package/dist/integrations/slack-routing.d.ts +1 -1
- package/dist/integrations/slack-session-defaults.d.ts +58 -0
- package/dist/integrations/slack-task-file-upload.d.ts +36 -0
- package/dist/integrations/slack-tool-review.d.ts +5 -0
- package/dist/interaction-agent-access.d.ts +13 -8
- package/dist/interaction-agent-version.d.ts +21 -0
- package/dist/interaction-holder-heartbeat.d.ts +5 -0
- package/dist/interaction-metrics.d.ts +27 -2
- package/dist/interaction-route-stages.d.ts +25 -0
- package/dist/interaction-secrets-vault.d.ts +20 -0
- package/dist/interaction-secrets.d.ts +103 -0
- package/dist/mcp/action-catalog-types.d.ts +14 -0
- package/dist/mcp/action-catalog.gen.d.ts +2 -0
- package/dist/mcp/action-descriptions.d.ts +4 -0
- package/dist/mcp/action-schema-imports.gen.d.ts +1 -0
- package/dist/mcp/capability-account-readiness.d.ts +7 -0
- package/dist/mcp/child-read-evidence.d.ts +9 -0
- package/dist/mcp/company-profile-agent-admin.d.ts +12 -0
- package/dist/mcp/contract-input.d.ts +13 -0
- package/dist/mcp/documents.d.ts +2 -0
- package/dist/mcp/first-party-tool-permissions.d.ts +3 -606
- package/dist/mcp/notification-tools.d.ts +26 -0
- package/dist/mcp/orchestration-failure-diagnostic.d.ts +43 -0
- package/dist/mcp/scheduled-task-input.d.ts +1309 -0
- package/dist/mcp/scheduled-task-view.d.ts +217 -3
- package/dist/mcp/secret-tools.d.ts +14 -0
- package/dist/mcp/server.d.ts +108 -5
- package/dist/mcp/session-admin-access-tools.d.ts +33 -0
- package/dist/mcp/session-event-errors.d.ts +28 -0
- package/dist/mcp/session-event-view.d.ts +62 -0
- package/dist/mcp/session-view.d.ts +15 -0
- package/dist/mcp/session-wait.d.ts +18 -0
- package/dist/mcp/site-agent-clamp-tools.d.ts +38 -0
- package/dist/mcp/site-data-tools.d.ts +22 -0
- package/dist/mcp/site-publication-tools.d.ts +19 -0
- package/dist/mcp/site-sql-tools.d.ts +27 -0
- package/dist/mcp-oauth.d.ts +37 -4
- package/dist/model-calls/chat-completions.d.ts +87 -0
- package/dist/model-calls/pending-usage-settlements.d.ts +57 -0
- package/dist/model-calls/service.d.ts +36 -0
- package/dist/model-catalog.d.ts +9 -3
- package/dist/native-push-dispatch.d.ts +69 -0
- package/dist/observability.d.ts +3 -1
- package/dist/organization-mcp.d.ts +82 -0
- package/dist/prepared-mcp-actor.d.ts +77 -0
- package/dist/prepared-mcp-permissions.d.ts +8 -0
- package/dist/routes/analytics-consent.d.ts +26 -0
- package/dist/routes/api-integrations.d.ts +11 -0
- package/dist/routes/api-keys.d.ts +7 -7
- package/dist/routes/automations.d.ts +2 -0
- package/dist/routes/billing.d.ts +59 -0
- package/dist/routes/browser-sessions.d.ts +65 -2
- package/dist/routes/chat-completions.d.ts +11 -0
- package/dist/routes/claude-core-usage.d.ts +20 -0
- package/dist/routes/claude-subscription-accounts.d.ts +3 -0
- package/dist/routes/claude-subscription-oauth.d.ts +3 -0
- package/dist/routes/client-errors.d.ts +182 -0
- package/dist/routes/codex-core.d.ts +401 -0
- package/dist/routes/codex.d.ts +64 -2
- package/dist/routes/computer-sessions.d.ts +6 -1
- package/dist/routes/desktop-distribution.d.ts +32 -0
- package/dist/routes/github-browser-fonts.gen.d.ts +2 -0
- package/dist/routes/github-browser-pages.d.ts +27 -0
- package/dist/routes/inbox.d.ts +13 -0
- package/dist/routes/insights-response-cache.d.ts +10 -0
- package/dist/routes/insights-usage.d.ts +12 -0
- package/dist/routes/insights.d.ts +28 -0
- package/dist/routes/interaction-placement-message.d.ts +7 -0
- package/dist/routes/managed-sign-in-methods.d.ts +6 -0
- package/dist/routes/model-account-choice.d.ts +13 -0
- package/dist/routes/model-account-settings.d.ts +19 -0
- package/dist/routes/native-app-auth.d.ts +12 -0
- package/dist/routes/organization-integration-policy.d.ts +8 -0
- package/dist/routes/organization-integrations.d.ts +6 -0
- package/dist/routes/organization-mcp-connections.d.ts +3 -0
- package/dist/routes/organization-model-defaults.d.ts +9 -0
- package/dist/routes/organization-service-accounts.d.ts +3 -0
- package/dist/routes/personal-api-keys.d.ts +3 -0
- package/dist/routes/session-admin-access.d.ts +3 -0
- package/dist/routes/session-artifact-associations.d.ts +4 -0
- package/dist/routes/session-history-imports.d.ts +20 -0
- package/dist/routes/sessions.d.ts +38 -2
- package/dist/routes/site-data.d.ts +18 -0
- package/dist/routes/site-publishing.d.ts +5 -0
- package/dist/routes/site-runtime.d.ts +31 -0
- package/dist/routes/site-sql.d.ts +16 -0
- package/dist/routes/slack-bot-access.d.ts +3 -0
- package/dist/routes/subscription-account-pools.d.ts +21 -0
- package/dist/routes/subscription-core-http.d.ts +5 -0
- package/dist/routes/subscription-pool-access.d.ts +37 -0
- package/dist/routes/subscription-pool-core.d.ts +153 -0
- package/dist/routes/supergrok.d.ts +6 -6
- package/dist/routes/usage-allowances.d.ts +12 -0
- package/dist/routes/variable-sets-removed.d.ts +2 -0
- package/dist/routes/vault-providers.d.ts +34 -0
- package/dist/routes/vaults.d.ts +3 -0
- package/dist/routes/workspace-integrations.d.ts +35 -0
- package/dist/routes/workspace-model-providers.d.ts +4 -0
- package/dist/routes/workspaces.d.ts +11 -2
- package/dist/sandbox/agent-update.d.ts +64 -0
- package/dist/sandbox/auth-callout.d.ts +8 -0
- package/dist/sandbox/channel-a.d.ts +15 -1
- package/dist/sandbox/enrollment.d.ts +26 -4
- package/dist/sandbox/machine-audience.d.ts +29 -0
- package/dist/sandbox/machines.d.ts +15 -2
- package/dist/sandbox/metrics-ingestion.d.ts +6 -2
- package/dist/sandbox/screen-control.d.ts +85 -0
- package/dist/sandbox/viewer.d.ts +5 -1
- package/dist/sandbox-file-artifacts.d.ts +17 -1
- package/dist/scheduled-task-blockers.d.ts +39 -0
- package/dist/scheduled-task-deletion.d.ts +3 -4
- package/dist/scheduled-task-lifecycle.d.ts +14 -0
- package/dist/secret-answers.d.ts +40 -0
- package/dist/session-create-observability.d.ts +5 -0
- package/dist/session-event-view-36GO3IL7.js +528 -0
- package/dist/session-event-view-36GO3IL7.js.map +1 -0
- package/dist/signed-state-secret.d.ts +18 -0
- package/dist/site-agent-guard.d.ts +53 -0
- package/dist/site-data/operations.d.ts +103 -0
- package/dist/site-data/service.d.ts +203 -0
- package/dist/site-frame-guard.d.ts +32 -0
- package/dist/site-publishing/agent-data-tools.d.ts +84 -0
- package/dist/site-publishing/agent-model.d.ts +58 -0
- package/dist/site-publishing/agent-session.d.ts +16 -0
- package/dist/site-publishing/content-scanner.d.ts +31 -0
- package/dist/site-publishing/edge-sync.d.ts +48 -0
- package/dist/site-publishing/gateway-signature.d.ts +56 -0
- package/dist/site-publishing/limits.d.ts +63 -0
- package/dist/site-publishing/page-tool-authority.d.ts +30 -0
- package/dist/site-publishing/platform-usage.d.ts +113 -0
- package/dist/site-publishing/platform.d.ts +21 -0
- package/dist/site-publishing/readiness.d.ts +62 -0
- package/dist/site-publishing/runtime.d.ts +179 -0
- package/dist/site-publishing/service.d.ts +264 -0
- package/dist/site-publishing/session-events.d.ts +22 -0
- package/dist/site-publishing/session-views.d.ts +36 -0
- package/dist/site-publishing/viewer.d.ts +40 -0
- package/dist/site-session-origin.d.ts +31 -6
- package/dist/site-sql/format.d.ts +47 -0
- package/dist/site-sql/gateway.d.ts +50 -0
- package/dist/site-sql/service.d.ts +213 -0
- package/dist/temporal-schedule-sync.d.ts +26 -0
- package/dist/transcription/billing-refusal.d.ts +8 -0
- package/dist/transcription/normalize.d.ts +23 -0
- package/dist/transcription/providers/azure-mai.d.ts +12 -0
- package/dist/transcription/providers/azure-openai.d.ts +4 -0
- package/dist/transcription/providers/openai.d.ts +16 -0
- package/dist/transcription/providers/subscription-core.d.ts +39 -0
- package/dist/transcription/service.d.ts +10 -1
- package/dist/transcription/wav-duration.d.ts +8 -0
- package/dist/workspace-tool-gateway-attestations.d.ts +37 -0
- package/dist/workspace-tool-gateway-observability.d.ts +16 -0
- package/dist/workspace-tool-gateway-secrets.d.ts +27 -0
- package/dist/workspace-tool-gateway.d.ts +102 -6
- package/dist/workspace-tool-target-fence.d.ts +116 -0
- package/dist/workspace-tool-target.d.ts +225 -0
- package/dist/workspace-webhook-dispatch.d.ts +26 -0
- package/dist/xai-subscription-core.d.ts +60 -0
- package/package.json +25 -20
- package/src/access-grant-rls.ts +64 -14
- package/src/admission-trace.ts +14 -0
- package/src/app.ts +1684 -252
- package/src/artifact-catalog-cursor.ts +1 -0
- package/src/attached-browser-viewer.ts +26 -0
- package/src/auth/managed-auth-attempt-context.ts +9 -0
- package/src/auth/managed-auth-rate-limits.ts +252 -0
- package/src/auth/managed-auth-session-adapter.ts +64 -29
- package/src/auth/managed-auth.ts +303 -35
- package/src/auth/managed-email.ts +18 -1
- package/src/auth/managed-sign-in-notifications.ts +81 -0
- package/src/auth/new-signups-gate.ts +49 -0
- package/src/auth/organization-user-setup.ts +3 -3
- package/src/auth/signup-funnel-metrics.ts +164 -0
- package/src/azure-live.ts +103 -0
- package/src/browser-action-fences.ts +45 -0
- package/src/browser-controller-authority.ts +1 -186
- package/src/browser-ephemeral.ts +39 -0
- package/src/browser-lost-runtime-end.ts +71 -0
- package/src/browser-state-authority.ts +1 -236
- package/src/claude-default-models.ts +37 -0
- package/src/claude-subscription-core.ts +154 -0
- package/src/claude-subscription-oauth.ts +352 -0
- package/src/claude-subscription-profile.ts +73 -0
- package/src/claude-subscription-usage.ts +51 -0
- package/src/claude-workspace-connection.ts +82 -0
- package/src/codemode.ts +236 -39
- package/src/codex-realtime.ts +181 -53
- package/src/codex-session-pointers.ts +80 -0
- package/src/company-brain-okf.ts +1 -1
- package/src/connected-machine-computer-access.ts +2 -1
- package/src/connection-ownership.ts +19 -13
- package/src/controller-data-plane.ts +34 -0
- package/src/credit-promotion-snapshot.ts +36 -0
- package/src/editable-artifact-production.ts +10 -0
- package/src/editable-artifact-source-session.ts +123 -0
- package/src/editable-artifact-websocket.ts +16 -3
- package/src/fatal-process-boundary.ts +67 -3
- package/src/gateway-realtime.ts +12 -8
- package/src/github-access.ts +31 -5
- package/src/github-browser-flow.ts +1 -1
- package/src/http/acting-person.ts +105 -0
- package/src/http/api-contract-compat.ts +49 -0
- package/src/http/api-error.ts +210 -2
- package/src/http/auth.ts +68 -4
- package/src/http/cors.ts +37 -5
- package/src/http/deprecation.ts +118 -0
- package/src/http/keyed-admission.ts +29 -0
- package/src/http/local-browser-boundary.ts +343 -0
- package/src/http/metrics-listener.ts +57 -0
- package/src/http/path-identifier.ts +54 -0
- package/src/http/registered-route-label.ts +34 -0
- package/src/http/rejection-telemetry.ts +120 -0
- package/src/http/request-body.ts +127 -0
- package/src/http/request-source.ts +154 -13
- package/src/http/sse.ts +88 -28
- package/src/http/unmatched-route.ts +60 -0
- package/src/http/user-content.ts +158 -0
- package/src/http/variable-sets-removed.ts +122 -0
- package/src/http/websocket-upgrade-dispatch.ts +29 -0
- package/src/index.ts +107 -57
- package/src/integration-connect-metrics.ts +228 -0
- package/src/integration-endpoint-test.ts +291 -0
- package/src/integrations/api-integrations.ts +81 -7
- package/src/integrations/atlassian.ts +202 -83
- package/src/integrations/fiken.ts +66 -38
- package/src/integrations/github-app-connect.ts +64 -18
- package/src/integrations/github-lens-connect.ts +8 -29
- package/src/integrations/google-drive.ts +448 -152
- package/src/integrations/integration-commit-authority.ts +69 -0
- package/src/integrations/marketplace-plugin.ts +1 -1
- package/src/integrations/oauth-client.ts +733 -193
- package/src/integrations/oauth-profiles.ts +116 -45
- package/src/integrations/onepassword-vault-provider.ts +16 -0
- package/src/integrations/personal-github-repositories.ts +1 -1
- package/src/integrations/personal-github.ts +61 -35
- package/src/integrations/provider-oauth.ts +67 -85
- package/src/integrations/slack-app-home.ts +5 -5
- package/src/integrations/slack-bot.ts +893 -201
- package/src/integrations/slack-file-upload-flow.ts +147 -0
- package/src/integrations/slack-install.ts +7 -7
- package/src/integrations/slack-interactions.ts +1589 -299
- package/src/integrations/slack-mrkdwn.ts +193 -0
- package/src/integrations/slack-routing.ts +2 -2
- package/src/integrations/slack-session-defaults.ts +224 -0
- package/src/integrations/slack-task-file-upload.ts +323 -0
- package/src/integrations/slack-tool-review.ts +65 -0
- package/src/integrations/social-oauth.ts +90 -58
- package/src/interaction-agent-access.ts +40 -20
- package/src/interaction-agent-version.ts +85 -0
- package/src/interaction-holder-heartbeat.ts +24 -8
- package/src/interaction-metrics.ts +164 -2
- package/src/interaction-route-stages.ts +94 -0
- package/src/interaction-secrets-vault.ts +213 -0
- package/src/interaction-secrets.ts +426 -0
- package/src/mcp/action-catalog-types.ts +14 -0
- package/src/mcp/action-catalog.gen.ts +8014 -0
- package/src/mcp/action-descriptions.ts +299 -0
- package/src/mcp/action-schema-imports.gen.ts +304 -0
- package/src/mcp/capability-account-readiness.ts +17 -0
- package/src/mcp/child-read-evidence.ts +19 -0
- package/src/mcp/company-profile-agent-admin.ts +13 -0
- package/src/mcp/contract-input.ts +165 -0
- package/src/mcp/documents.ts +9 -2
- package/src/mcp/editable-artifacts.ts +29 -11
- package/src/mcp/files.ts +5 -1
- package/src/mcp/first-party-tool-permissions.ts +7 -285
- package/src/mcp/knowledge-entries.ts +108 -34
- package/src/mcp/notification-tools.ts +480 -0
- package/src/mcp/orchestration-failure-diagnostic.ts +43 -0
- package/src/mcp/scheduled-task-input.ts +89 -0
- package/src/mcp/scheduled-task-view.ts +63 -3
- package/src/mcp/secret-tools.ts +185 -0
- package/src/mcp/server.ts +2213 -1116
- package/src/mcp/session-admin-access-tools.ts +163 -0
- package/src/mcp/session-event-errors.ts +123 -0
- package/src/mcp/session-event-view.ts +395 -13
- package/src/mcp/session-view.ts +3 -0
- package/src/mcp/session-wait.ts +67 -7
- package/src/mcp/site-agent-clamp-tools.ts +140 -0
- package/src/mcp/site-data-tools.ts +339 -0
- package/src/mcp/site-publication-tools.ts +201 -0
- package/src/mcp/site-sql-tools.ts +427 -0
- package/src/mcp-oauth.ts +635 -45
- package/src/model-calls/chat-completions.ts +352 -0
- package/src/model-calls/pending-usage-settlements.ts +125 -0
- package/src/model-calls/service.ts +694 -0
- package/src/model-catalog.ts +68 -17
- package/src/native-push-dispatch.ts +457 -0
- package/src/observability.ts +15 -1
- package/src/organization-mcp.ts +485 -0
- package/src/prepared-mcp-actor.ts +154 -0
- package/src/prepared-mcp-permissions.ts +38 -0
- package/src/routes/analytics-consent.ts +123 -0
- package/src/routes/api-integrations.ts +268 -9
- package/src/routes/api-keys.ts +164 -25
- package/src/routes/artifact-catalog.ts +111 -0
- package/src/routes/automations.ts +163 -90
- package/src/routes/billing.ts +535 -59
- package/src/routes/browser-sessions.ts +966 -342
- package/src/routes/canonical-human-identities.ts +61 -0
- package/src/routes/capabilities.ts +112 -5
- package/src/routes/channels.ts +4 -3
- package/src/routes/chat-completions.ts +235 -0
- package/src/routes/claude-core-usage.ts +147 -0
- package/src/routes/claude-subscription-accounts.ts +233 -0
- package/src/routes/claude-subscription-oauth.ts +175 -0
- package/src/routes/client-errors.ts +394 -0
- package/src/routes/codex-core.ts +687 -0
- package/src/routes/codex.ts +1277 -1119
- package/src/routes/company-brain.ts +4 -0
- package/src/routes/computer-sessions.ts +319 -85
- package/src/routes/connect.ts +277 -175
- package/src/routes/connections.ts +690 -363
- package/src/routes/desktop-distribution.ts +217 -0
- package/src/routes/documents.ts +13 -7
- package/src/routes/editable-artifacts.ts +74 -4
- package/src/routes/enrollments.ts +110 -16
- package/src/routes/external-identity-links.ts +13 -12
- package/src/routes/files.ts +41 -16
- package/src/routes/github-browser-fonts.gen.ts +12 -0
- package/src/routes/github-browser-pages.ts +258 -0
- package/src/routes/github.ts +200 -75
- package/src/routes/inbox.ts +353 -0
- package/src/routes/insights-response-cache.ts +83 -0
- package/src/routes/insights-usage.ts +345 -0
- package/src/routes/insights.ts +103 -8
- package/src/routes/install.ts +51 -10
- package/src/routes/integration-facets.ts +70 -28
- package/src/routes/interaction-placement-message.ts +12 -0
- package/src/routes/knowledge.ts +136 -27
- package/src/routes/machines.ts +189 -135
- package/src/routes/managed-auth-session-sets.ts +43 -10
- package/src/routes/managed-onboarding.ts +39 -19
- package/src/routes/managed-sign-in-methods.ts +433 -0
- package/src/routes/memory-slack-publications.ts +3 -2
- package/src/routes/model-account-choice.ts +194 -0
- package/src/routes/model-account-settings.ts +235 -0
- package/src/routes/model-connection-access.ts +210 -48
- package/src/routes/native-app-auth.ts +296 -0
- package/src/routes/organization-integration-policy.ts +116 -0
- package/src/routes/organization-integrations.ts +326 -0
- package/src/routes/organization-mcp-connections.ts +183 -0
- package/src/routes/organization-memberships.ts +205 -19
- package/src/routes/organization-model-defaults.ts +110 -0
- package/src/routes/organization-model-providers.ts +74 -3
- package/src/routes/organization-service-accounts.ts +128 -0
- package/src/routes/organization-sessions.ts +21 -5
- package/src/routes/personal-api-keys.ts +184 -0
- package/src/routes/personal-github-git-broker.ts +2 -2
- package/src/routes/personal-github.ts +9 -4
- package/src/routes/plugins.ts +46 -7
- package/src/routes/pr-review-github.ts +105 -118
- package/src/routes/pr-review.ts +88 -82
- package/src/routes/preference-registry.ts +18 -0
- package/src/routes/rigs.ts +48 -13
- package/src/routes/scheduled-tasks.ts +347 -27
- package/src/routes/session-admin-access.ts +271 -0
- package/src/routes/session-artifact-associations.ts +164 -0
- package/src/routes/session-history-imports.ts +305 -0
- package/src/routes/sessions.ts +1682 -363
- package/src/routes/site-data.ts +340 -0
- package/src/routes/site-publishing.ts +584 -0
- package/src/routes/site-runtime.ts +1944 -0
- package/src/routes/site-sql.ts +263 -0
- package/src/routes/skill-content.ts +72 -7
- package/src/routes/skills.ts +5 -4
- package/src/routes/slack-bot-access.ts +108 -0
- package/src/routes/social.ts +27 -15
- package/src/routes/subscription-account-pools.ts +209 -0
- package/src/routes/subscription-core-http.ts +18 -0
- package/src/routes/subscription-pool-access.ts +180 -0
- package/src/routes/subscription-pool-core.ts +552 -0
- package/src/routes/supergrok.ts +174 -655
- package/src/routes/transcription-recordings.ts +71 -4
- package/src/routes/transcriptions.ts +26 -2
- package/src/routes/usage-allowances.ts +381 -0
- package/src/routes/variable-sets-removed.ts +19 -0
- package/src/routes/vault-providers.ts +782 -0
- package/src/routes/vaults.ts +421 -0
- package/src/routes/video-generation.ts +30 -12
- package/src/routes/workspace-artifacts.ts +165 -53
- package/src/routes/workspace-integrations.ts +576 -0
- package/src/routes/workspace-model-providers.ts +148 -0
- package/src/routes/workspace-state.ts +4 -0
- package/src/routes/workspaces.ts +625 -117
- package/src/sandbox/agent-update.ts +315 -0
- package/src/sandbox/auth-callout.ts +104 -21
- package/src/sandbox/channel-a.ts +165 -55
- package/src/sandbox/enrollment.ts +131 -22
- package/src/sandbox/machine-audience.ts +192 -0
- package/src/sandbox/machines.ts +75 -31
- package/src/sandbox/metrics-ingestion.ts +133 -2
- package/src/sandbox/rematerialize.ts +51 -21
- package/src/sandbox/screen-control.ts +289 -0
- package/src/sandbox/viewer.ts +33 -58
- package/src/sandbox-file-artifacts.ts +53 -27
- package/src/scheduled-task-blockers.ts +293 -0
- package/src/scheduled-task-deletion.ts +13 -3
- package/src/scheduled-task-lifecycle.ts +84 -0
- package/src/secret-answers.ts +119 -0
- package/src/session-create-observability.ts +46 -0
- package/src/session-realtime-context.ts +26 -4
- package/src/signed-state-secret.ts +58 -0
- package/src/site-agent-guard.ts +261 -0
- package/src/site-data/operations.ts +777 -0
- package/src/site-data/service.ts +1043 -0
- package/src/site-frame-guard.ts +107 -0
- package/src/site-publishing/agent-data-tools.ts +250 -0
- package/src/site-publishing/agent-model.ts +127 -0
- package/src/site-publishing/agent-session.ts +148 -0
- package/src/site-publishing/content-scanner.ts +93 -0
- package/src/site-publishing/edge-sync.ts +148 -0
- package/src/site-publishing/gateway-signature.ts +198 -0
- package/src/site-publishing/limits.ts +315 -0
- package/src/site-publishing/page-tool-authority.ts +111 -0
- package/src/site-publishing/platform-usage.ts +479 -0
- package/src/site-publishing/platform.ts +98 -0
- package/src/site-publishing/readiness.ts +330 -0
- package/src/site-publishing/runtime.ts +831 -0
- package/src/site-publishing/service.ts +1282 -0
- package/src/site-publishing/session-events.ts +262 -0
- package/src/site-publishing/session-views.ts +262 -0
- package/src/site-publishing/viewer.ts +75 -0
- package/src/site-session-origin.ts +91 -6
- package/src/site-sql/format.ts +134 -0
- package/src/site-sql/gateway.ts +168 -0
- package/src/site-sql/service.ts +1636 -0
- package/src/site-uploads.ts +27 -5
- package/src/temporal-schedule-sync.ts +74 -0
- package/src/transcription/billing-refusal.ts +14 -0
- package/src/transcription/normalize.ts +77 -0
- package/src/transcription/providers/azure-mai.ts +98 -0
- package/src/transcription/providers/azure-openai.ts +16 -7
- package/src/transcription/providers/codex-subscription.ts +190 -67
- package/src/transcription/providers/openai.ts +79 -5
- package/src/transcription/providers/subscription-core.ts +125 -0
- package/src/transcription/providers/xai-subscription.ts +81 -83
- package/src/transcription/segmenter.ts +7 -1
- package/src/transcription/service.ts +239 -10
- package/src/transcription/wav-duration.ts +39 -0
- package/src/workspace-deletion.ts +25 -1
- package/src/workspace-tool-gateway-attestations.ts +133 -0
- package/src/workspace-tool-gateway-observability.ts +64 -0
- package/src/workspace-tool-gateway-secrets.ts +104 -0
- package/src/workspace-tool-gateway.ts +921 -103
- package/src/workspace-tool-target-fence.ts +380 -0
- package/src/workspace-tool-target.ts +554 -0
- package/src/workspace-webhook-dispatch.ts +225 -0
- package/src/xai-realtime.ts +85 -81
- package/src/xai-subscription-core.ts +172 -0
- package/dist/browser-auth-broker.d.ts +0 -20
- package/dist/chunk-AJ62T5QN.js.map +0 -1
- package/dist/connection-authority-owner.d.ts +0 -59
- package/dist/routes/connection-authorities.d.ts +0 -3
- package/dist/routes/environments.d.ts +0 -5
- package/dist/routes/host-mcp-bindings.d.ts +0 -5
- package/dist/routes/host-mcp-resolvers.d.ts +0 -3
- package/dist/routes/packs.d.ts +0 -3
- package/dist/session-event-view-MU3HMNV3.js +0 -264
- package/dist/session-event-view-MU3HMNV3.js.map +0 -1
- package/dist/xai-subscription-auth.d.ts +0 -23
- package/src/browser-auth-broker.ts +0 -155
- package/src/connection-authority-owner.ts +0 -61
- package/src/routes/connection-authorities.ts +0 -139
- package/src/routes/environments.ts +0 -388
- package/src/routes/host-mcp-bindings.ts +0 -122
- package/src/routes/host-mcp-resolvers.ts +0 -41
- package/src/routes/packs.ts +0 -784
- package/src/xai-subscription-auth.ts +0 -139
package/src/index.ts
CHANGED
|
@@ -16,6 +16,7 @@ import type {
|
|
|
16
16
|
} from "@opengeni/contracts";
|
|
17
17
|
import {
|
|
18
18
|
assertRuntimeDatabasePosture,
|
|
19
|
+
isRetryableRuntimeDatabaseStartupError,
|
|
19
20
|
createDb,
|
|
20
21
|
markSessionWorkflowWakeDelivered,
|
|
21
22
|
runtimeDatabaseReadyCheck,
|
|
@@ -28,11 +29,12 @@ import {
|
|
|
28
29
|
type Observability,
|
|
29
30
|
} from "@opengeni/observability";
|
|
30
31
|
import { createObjectStorage } from "@opengeni/storage";
|
|
31
|
-
import { createNativeRemoteMcpCredentialsPort } from "@opengeni/core/remote-mcp-credentials";
|
|
32
32
|
import { isArtifactRuntimeConfigured } from "@opengeni/artifact-tool/runtime/development";
|
|
33
33
|
import {
|
|
34
34
|
resolveCatalogSettings,
|
|
35
|
-
|
|
35
|
+
SESSION_WORKFLOW_WAKE_DISPATCH_REQUESTED_SIGNAL,
|
|
36
|
+
SESSION_WORKFLOW_WAKE_DISPATCHER_WORKFLOW_ID,
|
|
37
|
+
SESSION_WORKFLOW_WAKE_DISPATCHER_WORKFLOW_TYPE,
|
|
36
38
|
} from "@opengeni/core";
|
|
37
39
|
import {
|
|
38
40
|
Connection,
|
|
@@ -43,20 +45,29 @@ import {
|
|
|
43
45
|
} from "@temporalio/client";
|
|
44
46
|
import type { ScheduleOptions, ScheduleSpec, ScheduleUpdateOptions } from "@temporalio/client";
|
|
45
47
|
import { createAppComposition, type DocumentIndexClient, type SessionWorkflowClient } from "./app";
|
|
46
|
-
import {
|
|
48
|
+
import { observabilityEventBusOptions } from "./observability";
|
|
47
49
|
import { startAuthCalloutResponder } from "./sandbox/auth-callout";
|
|
48
50
|
import { startHelloIngestion, startMetricsIngestion } from "./sandbox/metrics-ingestion";
|
|
51
|
+
import { createAutomaticAgentUpdater } from "./sandbox/agent-update";
|
|
49
52
|
import { startSlackInteractionPump } from "./integrations/slack-interactions";
|
|
50
53
|
import { startMemorySlackPublicationPump } from "./memory-slack-delivery";
|
|
51
54
|
import { startTemporalScheduleCleanupPump } from "./temporal-schedule-cleanup";
|
|
55
|
+
import { startScheduledTaskLifecyclePump } from "./scheduled-task-lifecycle";
|
|
56
|
+
import { createTemporalScheduleSynchronizer } from "./temporal-schedule-sync";
|
|
57
|
+
import { startNativePushDispatchPump } from "./native-push-dispatch";
|
|
58
|
+
import { startWorkspaceWebhookDispatchPump } from "./workspace-webhook-dispatch";
|
|
52
59
|
import { cleanupScheduledTaskConnectorAuthorization } from "./scheduled-task-deletion";
|
|
53
60
|
import {
|
|
54
61
|
EDITABLE_ARTIFACT_LIVE_WEBSOCKET_MAX_MESSAGE_BYTES,
|
|
55
62
|
EditableArtifactWebSocketTransport,
|
|
56
63
|
} from "./editable-artifact-websocket";
|
|
64
|
+
import { editableArtifactSourceSessionAuthorizer } from "./editable-artifact-source-session";
|
|
57
65
|
import type { ApiWebSocketConnection } from "./api-websocket";
|
|
58
66
|
import { InteractionFrameProxyTransport } from "./interaction-frame-proxy";
|
|
59
67
|
import { apiRequestBindingsForTransportPeer } from "./http/request-source";
|
|
68
|
+
import { startApiMetricsListener } from "./http/metrics-listener";
|
|
69
|
+
import { createLocalBrowserBoundary } from "./http/local-browser-boundary";
|
|
70
|
+
import { dispatchApiWebSocketUpgrade } from "./http/websocket-upgrade-dispatch";
|
|
60
71
|
import {
|
|
61
72
|
createStandaloneEditableArtifactApplication,
|
|
62
73
|
type StandaloneEditableArtifactApplication,
|
|
@@ -101,6 +112,28 @@ export async function createTemporalWorkflowClient(
|
|
|
101
112
|
connection,
|
|
102
113
|
namespace: settings.temporalNamespace,
|
|
103
114
|
});
|
|
115
|
+
const scheduledTasks = createTemporalScheduleSynchronizer({
|
|
116
|
+
db,
|
|
117
|
+
withDeadline: (deadline, work) => temporal.withDeadline(deadline, work),
|
|
118
|
+
upsert: async (task) => {
|
|
119
|
+
const options = temporalScheduleOptions(task, settings.temporalTaskQueue);
|
|
120
|
+
try {
|
|
121
|
+
await temporal.schedule
|
|
122
|
+
.getHandle(task.temporalScheduleId)
|
|
123
|
+
.update(() => temporalScheduleUpdateOptions(options));
|
|
124
|
+
} catch (error) {
|
|
125
|
+
if (!shouldCreateScheduleAfterUpdateError(error)) throw error;
|
|
126
|
+
await temporal.schedule.create(options);
|
|
127
|
+
}
|
|
128
|
+
},
|
|
129
|
+
remove: async (temporalScheduleId) => {
|
|
130
|
+
try {
|
|
131
|
+
await temporal.schedule.getHandle(temporalScheduleId).delete();
|
|
132
|
+
} catch (error) {
|
|
133
|
+
if (!(error instanceof ScheduleNotFoundError)) throw error;
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
});
|
|
104
137
|
const client: SessionWorkflowClient = {
|
|
105
138
|
triggerAutomationRun: async ({ accountId, workspaceId, runId }) => {
|
|
106
139
|
try {
|
|
@@ -144,9 +177,13 @@ export async function createTemporalWorkflowClient(
|
|
|
144
177
|
});
|
|
145
178
|
},
|
|
146
179
|
requestSessionWorkflowWakeDispatch: async () => {
|
|
147
|
-
await temporal.
|
|
148
|
-
.
|
|
149
|
-
|
|
180
|
+
await temporal.workflow.signalWithStart(SESSION_WORKFLOW_WAKE_DISPATCHER_WORKFLOW_TYPE, {
|
|
181
|
+
taskQueue: settings.temporalTaskQueue,
|
|
182
|
+
workflowId: SESSION_WORKFLOW_WAKE_DISPATCHER_WORKFLOW_ID,
|
|
183
|
+
workflowIdReusePolicy: "ALLOW_DUPLICATE",
|
|
184
|
+
args: [],
|
|
185
|
+
signal: SESSION_WORKFLOW_WAKE_DISPATCH_REQUESTED_SIGNAL,
|
|
186
|
+
});
|
|
150
187
|
},
|
|
151
188
|
signalCodexCapacity: async ({
|
|
152
189
|
accountId,
|
|
@@ -196,41 +233,15 @@ export async function createTemporalWorkflowClient(
|
|
|
196
233
|
wakeRevision: workflowWakeRevision,
|
|
197
234
|
});
|
|
198
235
|
},
|
|
199
|
-
syncScheduledTask: async ({ task }) =>
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
try {
|
|
203
|
-
await schedule.delete();
|
|
204
|
-
} catch (error) {
|
|
205
|
-
if (!(error instanceof ScheduleNotFoundError)) throw error;
|
|
206
|
-
}
|
|
207
|
-
return;
|
|
208
|
-
}
|
|
209
|
-
const options = temporalScheduleOptions(task, settings.temporalTaskQueue);
|
|
210
|
-
try {
|
|
211
|
-
await schedule.update(() => temporalScheduleUpdateOptions(options));
|
|
212
|
-
} catch (error) {
|
|
213
|
-
if (!shouldCreateScheduleAfterUpdateError(error)) {
|
|
214
|
-
throw error;
|
|
215
|
-
}
|
|
216
|
-
await temporal.schedule.create(options);
|
|
217
|
-
}
|
|
218
|
-
},
|
|
219
|
-
deleteScheduledTaskSchedule: async ({ temporalScheduleId }) => {
|
|
220
|
-
try {
|
|
221
|
-
await temporal.withDeadline(Date.now() + 5_000, async () => {
|
|
222
|
-
await temporal.schedule.getHandle(temporalScheduleId).delete();
|
|
223
|
-
});
|
|
224
|
-
} catch (error) {
|
|
225
|
-
if (error instanceof ScheduleNotFoundError) return;
|
|
226
|
-
throw error;
|
|
227
|
-
}
|
|
228
|
-
},
|
|
236
|
+
syncScheduledTask: async ({ task, onFailure }) => scheduledTasks.sync(task, onFailure),
|
|
237
|
+
deleteScheduledTaskSchedule: async ({ temporalScheduleId }) =>
|
|
238
|
+
scheduledTasks.remove(temporalScheduleId),
|
|
229
239
|
triggerScheduledTask: async ({
|
|
230
240
|
task,
|
|
231
241
|
agentRunUsageIdempotencyKey,
|
|
232
242
|
triggerWorkflowId,
|
|
233
243
|
initiator,
|
|
244
|
+
credentialRestriction,
|
|
234
245
|
triggerType = "manual",
|
|
235
246
|
}) => {
|
|
236
247
|
// Deterministic workflowId (derived from the trigger token by the
|
|
@@ -251,6 +262,7 @@ export async function createTemporalWorkflowClient(
|
|
|
251
262
|
triggerType,
|
|
252
263
|
agentRunUsageIdempotencyKey,
|
|
253
264
|
initiator,
|
|
265
|
+
...(credentialRestriction ? { credentialRestriction } : {}),
|
|
254
266
|
},
|
|
255
267
|
],
|
|
256
268
|
});
|
|
@@ -266,7 +278,7 @@ export async function createTemporalWorkflowClient(
|
|
|
266
278
|
startRigVerification: async ({ workspaceId, changeId, versionId, workflowId }) => {
|
|
267
279
|
const targetId = changeId ?? versionId;
|
|
268
280
|
if (!targetId) {
|
|
269
|
-
throw new Error("
|
|
281
|
+
throw new Error("sandbox environment verification requires changeId or versionId");
|
|
270
282
|
}
|
|
271
283
|
try {
|
|
272
284
|
await temporal.workflow.start("rigVerificationWorkflow", {
|
|
@@ -326,7 +338,7 @@ export async function startApi(
|
|
|
326
338
|
// strategy.
|
|
327
339
|
const searchPath = dbSearchPath(settings);
|
|
328
340
|
const dbClient = createDb(settings.databaseUrl, {
|
|
329
|
-
max:
|
|
341
|
+
max: settings.apiDatabasePoolMax,
|
|
330
342
|
...(searchPath ? { searchPath } : {}),
|
|
331
343
|
rlsStrategy: settings.rlsStrategy,
|
|
332
344
|
});
|
|
@@ -339,8 +351,6 @@ export async function startApi(
|
|
|
339
351
|
rlsStrategy: settings.rlsStrategy,
|
|
340
352
|
expectedRole: settings.runtimeDatabaseRole,
|
|
341
353
|
targetSchema: settings.dbSchema.trim() || "public",
|
|
342
|
-
organizationTenancyCanonicalActivationEnabled:
|
|
343
|
-
settings.organizationTenancyCanonicalActivationEnabled,
|
|
344
354
|
} as const;
|
|
345
355
|
// The PRIVILEGED control-plane NATS login (M-AUTH): when the server runs with
|
|
346
356
|
// auth_callout, api/worker authenticate as a static account user permitted to
|
|
@@ -363,14 +373,14 @@ export async function startApi(
|
|
|
363
373
|
await retryStartupDependency(
|
|
364
374
|
"PostgreSQL runtime posture",
|
|
365
375
|
() => assertRuntimeDatabasePosture(dbClient.db, databasePosture),
|
|
366
|
-
{ ...retryOptions, onRetry },
|
|
376
|
+
{ ...retryOptions, onRetry, shouldRetry: isRetryableRuntimeDatabaseStartupError },
|
|
367
377
|
);
|
|
368
378
|
const resolvedCatalog = await retryStartupDependency(
|
|
369
379
|
"model catalog",
|
|
370
380
|
() => resolveCatalogSettings(dbClient.db, settings),
|
|
371
381
|
{ ...retryOptions, onRetry },
|
|
372
382
|
);
|
|
373
|
-
observability.info("
|
|
383
|
+
observability.info("Opengeni model catalog resolved", {
|
|
374
384
|
catalogSource: resolvedCatalog.source,
|
|
375
385
|
catalogVersion: resolvedCatalog.version,
|
|
376
386
|
});
|
|
@@ -382,7 +392,7 @@ export async function startApi(
|
|
|
382
392
|
controlPlaneAuth
|
|
383
393
|
? { user: controlPlaneAuth.user, pass: controlPlaneAuth.password }
|
|
384
394
|
: undefined,
|
|
385
|
-
|
|
395
|
+
observabilityEventBusOptions(observability),
|
|
386
396
|
),
|
|
387
397
|
{
|
|
388
398
|
...retryOptions,
|
|
@@ -403,7 +413,7 @@ export async function startApi(
|
|
|
403
413
|
}
|
|
404
414
|
if (!bus || !workflowClient) {
|
|
405
415
|
await dbClient.close();
|
|
406
|
-
throw new Error("
|
|
416
|
+
throw new Error("Opengeni API startup dependencies were not initialized");
|
|
407
417
|
}
|
|
408
418
|
const objectStorage = createObjectStorage(settings);
|
|
409
419
|
let editableArtifactComposition: StandaloneEditableArtifactApplication | undefined;
|
|
@@ -421,7 +431,6 @@ export async function startApi(
|
|
|
421
431
|
}
|
|
422
432
|
const { app, routeDeps } = createAppComposition({
|
|
423
433
|
settings,
|
|
424
|
-
connectionCredentials: createNativeRemoteMcpCredentialsPort(settings, dbClient.db),
|
|
425
434
|
db: dbClient.db,
|
|
426
435
|
bus,
|
|
427
436
|
workflowClient: workflowClient.client,
|
|
@@ -446,21 +455,32 @@ export async function startApi(
|
|
|
446
455
|
behavior: "http_and_websocket_fail_closed",
|
|
447
456
|
});
|
|
448
457
|
}
|
|
449
|
-
const artifactWebSockets = new EditableArtifactWebSocketTransport(
|
|
458
|
+
const artifactWebSockets = new EditableArtifactWebSocketTransport(
|
|
459
|
+
routeDeps.editableArtifacts,
|
|
460
|
+
editableArtifactSourceSessionAuthorizer(routeDeps),
|
|
461
|
+
);
|
|
450
462
|
const interactionFrameProxies = new InteractionFrameProxyTransport(
|
|
451
463
|
resolveFirstPartyDelegationSecret(settings),
|
|
452
464
|
);
|
|
465
|
+
// WebSocket upgrades bypass the Hono app, so the local-mode browser boundary
|
|
466
|
+
// (http/local-browser-boundary.ts) is applied to them in the dispatcher;
|
|
467
|
+
// every other request meets it in the Hono middleware.
|
|
468
|
+
const localBrowserBoundary = createLocalBrowserBoundary(settings, {
|
|
469
|
+
warn: (message, attributes) => observability.warn(message, attributes),
|
|
470
|
+
});
|
|
471
|
+
const webSocketUpgrades = [interactionFrameProxies, artifactWebSockets];
|
|
453
472
|
const server = Bun.serve<ApiWebSocketConnection>({
|
|
454
473
|
hostname: settings.apiHost,
|
|
455
474
|
port: settings.apiPort,
|
|
456
475
|
idleTimeout: 255,
|
|
457
476
|
fetch: (request, bunServer) => {
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
477
|
+
const upgrade = dispatchApiWebSocketUpgrade(
|
|
478
|
+
request,
|
|
479
|
+
bunServer,
|
|
480
|
+
webSocketUpgrades,
|
|
481
|
+
localBrowserBoundary,
|
|
482
|
+
);
|
|
483
|
+
if (upgrade.handled) return upgrade.response;
|
|
464
484
|
return app.fetch(
|
|
465
485
|
request,
|
|
466
486
|
apiRequestBindingsForTransportPeer(bunServer.requestIP(request)?.address),
|
|
@@ -475,10 +495,21 @@ export async function startApi(
|
|
|
475
495
|
close: (socket) => socket.data.transportClosed(),
|
|
476
496
|
},
|
|
477
497
|
});
|
|
498
|
+
const metricsServer = startApiMetricsListener(settings, observability);
|
|
478
499
|
const stopSlackInteractionPump = settings.slackSigningSecret
|
|
479
500
|
? startSlackInteractionPump(routeDeps)
|
|
480
501
|
: undefined;
|
|
481
502
|
const stopMemorySlackPublicationPump = startMemorySlackPublicationPump(routeDeps);
|
|
503
|
+
const stopWorkspaceWebhookDispatchPump = startWorkspaceWebhookDispatchPump({
|
|
504
|
+
db: dbClient.db,
|
|
505
|
+
settings,
|
|
506
|
+
observability,
|
|
507
|
+
});
|
|
508
|
+
const stopNativePushDispatchPump = startNativePushDispatchPump({
|
|
509
|
+
db: dbClient.db,
|
|
510
|
+
settings,
|
|
511
|
+
observability,
|
|
512
|
+
});
|
|
482
513
|
const stopTemporalScheduleCleanupPump = startTemporalScheduleCleanupPump({
|
|
483
514
|
db: dbClient.db,
|
|
484
515
|
cleanupConnectorAuthorization: async (claim) =>
|
|
@@ -488,6 +519,12 @@ export async function startApi(
|
|
|
488
519
|
},
|
|
489
520
|
observability,
|
|
490
521
|
});
|
|
522
|
+
const stopScheduledTaskLifecyclePump = startScheduledTaskLifecyclePump({
|
|
523
|
+
db: dbClient.db,
|
|
524
|
+
sync: (task) => workflowClient.client.syncScheduledTask({ task }),
|
|
525
|
+
bus,
|
|
526
|
+
observability,
|
|
527
|
+
});
|
|
491
528
|
// M10 — start the metrics-ingestion consumer (agent heartbeats → DB last-sample
|
|
492
529
|
// + downsampled series), gated on the selfhosted flag. A no-op when disabled.
|
|
493
530
|
let stopMetricsIngestion: (() => void) | undefined;
|
|
@@ -507,13 +544,19 @@ export async function startApi(
|
|
|
507
544
|
db: dbClient.db,
|
|
508
545
|
bus,
|
|
509
546
|
observability,
|
|
547
|
+
agentUpdates: createAutomaticAgentUpdater({
|
|
548
|
+
db: dbClient.db,
|
|
549
|
+
bus,
|
|
550
|
+
settings,
|
|
551
|
+
observability,
|
|
552
|
+
}),
|
|
510
553
|
});
|
|
511
554
|
stopHelloIngestion = startHelloIngestion({
|
|
512
555
|
db: dbClient.db,
|
|
513
556
|
bus,
|
|
514
557
|
observability,
|
|
515
558
|
});
|
|
516
|
-
observability.info("
|
|
559
|
+
observability.info("Opengeni machine-metrics + hello ingestion consumers started", {});
|
|
517
560
|
|
|
518
561
|
const callout = resolveNatsCalloutConfig(settings);
|
|
519
562
|
if (callout) {
|
|
@@ -525,7 +568,7 @@ export async function startApi(
|
|
|
525
568
|
} catch {
|
|
526
569
|
// A responder start failure must not crash the API (other planes work); log
|
|
527
570
|
// loudly — selfhosted agents will fail to connect until it is up.
|
|
528
|
-
observability.error("
|
|
571
|
+
observability.error("Opengeni NATS auth-callout responder failed to start", {
|
|
529
572
|
errorClass: "NatsAuthCalloutOperationError",
|
|
530
573
|
errorCode: "nats_auth_callout_start_failed",
|
|
531
574
|
origin: "api",
|
|
@@ -533,24 +576,31 @@ export async function startApi(
|
|
|
533
576
|
}
|
|
534
577
|
} else {
|
|
535
578
|
observability.warn(
|
|
536
|
-
"
|
|
579
|
+
"Opengeni selfhosted enabled but the NATS auth-callout plane is not configured; selfhosted agents cannot connect",
|
|
537
580
|
{},
|
|
538
581
|
);
|
|
539
582
|
}
|
|
540
583
|
}
|
|
541
|
-
observability.info("
|
|
584
|
+
observability.info("Opengeni API listening", {
|
|
542
585
|
host: settings.apiHost,
|
|
543
586
|
port: settings.apiPort,
|
|
587
|
+
...(metricsServer ? { metricsPort: settings.apiMetricsPort } : {}),
|
|
544
588
|
});
|
|
545
589
|
return {
|
|
546
590
|
server,
|
|
547
591
|
close: async () => {
|
|
548
592
|
server.stop(true);
|
|
593
|
+
metricsServer?.stop(true);
|
|
549
594
|
stopSlackInteractionPump?.();
|
|
550
595
|
await stopMemorySlackPublicationPump();
|
|
551
596
|
stopMetricsIngestion?.();
|
|
552
597
|
stopHelloIngestion?.();
|
|
553
598
|
await stopTemporalScheduleCleanupPump();
|
|
599
|
+
await stopScheduledTaskLifecyclePump();
|
|
600
|
+
await stopWorkspaceWebhookDispatchPump();
|
|
601
|
+
await stopNativePushDispatchPump();
|
|
602
|
+
// Write queued presence before the database pool closes.
|
|
603
|
+
await routeDeps.userPresence?.close().catch(() => undefined);
|
|
554
604
|
await Promise.allSettled([
|
|
555
605
|
Promise.resolve(editableArtifactComposition?.close()),
|
|
556
606
|
authCalloutResponder?.close(),
|
|
@@ -640,7 +690,7 @@ function temporalIntervalSpec(
|
|
|
640
690
|
// Temporal interval schedules match Epoch + (n * every) + offset. Its
|
|
641
691
|
// top-level startAt only filters matching times before that boundary, so it
|
|
642
692
|
// does not itself anchor the cadence. Derive the phase from startAt to make
|
|
643
|
-
// the stored
|
|
693
|
+
// the stored Opengeni timestamp the first interval boundary rather than the
|
|
644
694
|
// next epoch-aligned match.
|
|
645
695
|
const everyMilliseconds = BigInt(schedule.everySeconds) * 1_000n;
|
|
646
696
|
const startMilliseconds = BigInt(new Date(schedule.startAt).getTime());
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { CORE_INTEGRATION_DEFINITIONS } from "@opengeni/capabilities";
|
|
2
|
+
import type { ConnectAttemptTransition } from "@opengeni/db";
|
|
3
|
+
import type { Observability } from "@opengeni/observability";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Low-cardinality product telemetry for connecting capabilities, integrations,
|
|
7
|
+
* and MCP servers. Labels are closed sets: a caller-chosen provider id, MCP
|
|
8
|
+
* URL, provider domain, workspace, or user never becomes a label value.
|
|
9
|
+
*
|
|
10
|
+
* Three signals cover the whole connect surface:
|
|
11
|
+
* - `opengeni_connect_attempts_total` — every unified Connect attempt (the
|
|
12
|
+
* popup flow behind every provider card), counted on each committed state
|
|
13
|
+
* transition, so `started` minus terminal states is abandonment.
|
|
14
|
+
* - `opengeni_integration_oauth_callbacks_total` — every provider redirect back
|
|
15
|
+
* to Opengeni, including the legacy settings-page flows whose failure is only
|
|
16
|
+
* visible in a `?<flow>=error&reason=` redirect, never in an HTTP status.
|
|
17
|
+
* - `opengeni_integration_oauth_starts_total` — MCP OAuth discovery/registration
|
|
18
|
+
* at the start of a connection, where remote servers most often fail.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
const FIXED_CONNECT_PROVIDERS = [
|
|
22
|
+
"x",
|
|
23
|
+
"reddit",
|
|
24
|
+
"mcp-install",
|
|
25
|
+
"openapi",
|
|
26
|
+
"graphql",
|
|
27
|
+
"slack-bot",
|
|
28
|
+
"gmail",
|
|
29
|
+
"slack-personal",
|
|
30
|
+
"github-personal",
|
|
31
|
+
"github-app",
|
|
32
|
+
"github-lens",
|
|
33
|
+
"google-drive-knowledge",
|
|
34
|
+
"google-drive-publish",
|
|
35
|
+
"fiken-token",
|
|
36
|
+
"fiken-oauth",
|
|
37
|
+
"mcp-oauth",
|
|
38
|
+
"mcp-headers",
|
|
39
|
+
"mcp-bearer",
|
|
40
|
+
] as const;
|
|
41
|
+
|
|
42
|
+
const CONNECT_PROVIDERS: ReadonlySet<string> = new Set([
|
|
43
|
+
...FIXED_CONNECT_PROVIDERS,
|
|
44
|
+
...CORE_INTEGRATION_DEFINITIONS.map((definition) => definition.id),
|
|
45
|
+
]);
|
|
46
|
+
|
|
47
|
+
const CONNECT_STATES: ReadonlySet<string> = new Set([
|
|
48
|
+
"requires_user_action",
|
|
49
|
+
"credential_input",
|
|
50
|
+
"provider_wait",
|
|
51
|
+
"account_selection",
|
|
52
|
+
"resource_selection",
|
|
53
|
+
"preview",
|
|
54
|
+
"installing",
|
|
55
|
+
"connected_but_incomplete",
|
|
56
|
+
"complete",
|
|
57
|
+
"cancelled",
|
|
58
|
+
"expired",
|
|
59
|
+
"failed",
|
|
60
|
+
"uncertain",
|
|
61
|
+
]);
|
|
62
|
+
|
|
63
|
+
const BOUNDED_CODE = /^[a-z][a-z0-9_]{0,47}$/;
|
|
64
|
+
|
|
65
|
+
export function connectMetricProvider(providerId: string): string {
|
|
66
|
+
return CONNECT_PROVIDERS.has(providerId) ? providerId : "other";
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** `http_404`/`upstream_http_502` collapse to a status class; other codes keep a closed grammar. */
|
|
70
|
+
export function boundedConnectReason(value: string | null | undefined): string {
|
|
71
|
+
if (!value) return "none";
|
|
72
|
+
const http = /^(upstream_)?http_([1-5])\d\d$/.exec(value);
|
|
73
|
+
if (http) return `${http[1] ?? ""}http_${http[2]}xx`;
|
|
74
|
+
return BOUNDED_CODE.test(value) ? value : "other";
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export function observeConnectAttemptTransition(
|
|
78
|
+
observability: Observability | null | undefined,
|
|
79
|
+
transition: ConnectAttemptTransition,
|
|
80
|
+
): void {
|
|
81
|
+
if (!observability) return;
|
|
82
|
+
try {
|
|
83
|
+
observability.incrementCounter({
|
|
84
|
+
name: "opengeni_connect_attempts_total",
|
|
85
|
+
help: "Connect (capability/integration/MCP setup) attempt transitions by bounded provider, resulting state, and error code. state=started counts new attempts.",
|
|
86
|
+
labels: {
|
|
87
|
+
provider: connectMetricProvider(transition.providerId),
|
|
88
|
+
state:
|
|
89
|
+
transition.previousState === null
|
|
90
|
+
? "started"
|
|
91
|
+
: CONNECT_STATES.has(transition.state)
|
|
92
|
+
? transition.state
|
|
93
|
+
: "other",
|
|
94
|
+
error: boundedConnectReason(transition.errorCode),
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
} catch {
|
|
98
|
+
// Telemetry never changes a committed setup outcome.
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/** Provider redirect routes, keyed by route label, with the flow they complete. */
|
|
103
|
+
const OAUTH_CALLBACK_FLOWS = new Map<string, string>([
|
|
104
|
+
["/v1/integrations/oauth/callback", "mcp_oauth"],
|
|
105
|
+
["/v1/integrations/provider-oauth/callback", "provider_oauth"],
|
|
106
|
+
["/v1/integrations/slack/callback", "slack_bot"],
|
|
107
|
+
["/v1/integrations/fiken/callback", "fiken"],
|
|
108
|
+
["/v1/integrations/atlassian/callback", "atlassian"],
|
|
109
|
+
["/v1/integrations/google-drive/callback", "google_drive"],
|
|
110
|
+
["/v1/integrations/github-personal/oauth/callback", "github_personal"],
|
|
111
|
+
["/v1/social/oauth/callback", "social"],
|
|
112
|
+
["/v1/github/setup", "github_app"],
|
|
113
|
+
["/v1/github/install/callback", "github_app"],
|
|
114
|
+
["/v1/github/oauth/callback", "github_app"],
|
|
115
|
+
["/v1/github/app-manifest/callback", "github_app"],
|
|
116
|
+
["/v1/pr-review/github/install/callback", "github_lens"],
|
|
117
|
+
["/v1/pr-review/github/oauth/callback", "github_lens"],
|
|
118
|
+
]);
|
|
119
|
+
|
|
120
|
+
/** Redirect query markers written by each flow's `callbackReturnPath`. */
|
|
121
|
+
const OAUTH_RESULT_MARKERS = [
|
|
122
|
+
"integration_oauth",
|
|
123
|
+
"slack",
|
|
124
|
+
"google_drive",
|
|
125
|
+
"fiken",
|
|
126
|
+
"atlassian",
|
|
127
|
+
"github_personal_oauth",
|
|
128
|
+
"social_oauth",
|
|
129
|
+
"github",
|
|
130
|
+
] as const;
|
|
131
|
+
const SUCCESS_MARKER_VALUES = new Set(["success", "connected", "complete"]);
|
|
132
|
+
|
|
133
|
+
export function isOAuthCallbackRoute(route: string): boolean {
|
|
134
|
+
return OAUTH_CALLBACK_FLOWS.has(route);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Classify one provider callback response from its status and redirect only.
|
|
139
|
+
* A popup (Connect attempt) callback returns to its exact opener URL without
|
|
140
|
+
* a result marker; its outcome is counted by `opengeni_connect_attempts_total`
|
|
141
|
+
* and here as `handoff`.
|
|
142
|
+
*/
|
|
143
|
+
export function classifyOAuthCallback(input: {
|
|
144
|
+
route: string;
|
|
145
|
+
status: number;
|
|
146
|
+
location: string | null;
|
|
147
|
+
}): { flow: string; provider: string; outcome: string; stage: string; reason: string } | null {
|
|
148
|
+
const flow = OAUTH_CALLBACK_FLOWS.get(input.route);
|
|
149
|
+
if (!flow) return null;
|
|
150
|
+
if (input.status >= 400) {
|
|
151
|
+
return {
|
|
152
|
+
flow,
|
|
153
|
+
provider: flow,
|
|
154
|
+
outcome: "failure",
|
|
155
|
+
stage: "none",
|
|
156
|
+
reason: `http_${String(input.status)[0]}xx`,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
let params: URLSearchParams | null = null;
|
|
160
|
+
if (input.location) {
|
|
161
|
+
try {
|
|
162
|
+
params = new URL(input.location, "https://opengeni.invalid").searchParams;
|
|
163
|
+
} catch {
|
|
164
|
+
params = null;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
const marker = params
|
|
168
|
+
? OAUTH_RESULT_MARKERS.map((name) => params!.get(name)).find((value) => value !== null)
|
|
169
|
+
: undefined;
|
|
170
|
+
const definitionId = params?.get("definitionId") ?? null;
|
|
171
|
+
const provider =
|
|
172
|
+
flow === "provider_oauth" && definitionId && CONNECT_PROVIDERS.has(definitionId)
|
|
173
|
+
? definitionId
|
|
174
|
+
: flow;
|
|
175
|
+
if (marker === undefined || marker === null) {
|
|
176
|
+
return { flow, provider, outcome: "handoff", stage: "none", reason: "none" };
|
|
177
|
+
}
|
|
178
|
+
if (SUCCESS_MARKER_VALUES.has(marker)) {
|
|
179
|
+
return { flow, provider, outcome: "success", stage: "none", reason: "none" };
|
|
180
|
+
}
|
|
181
|
+
const reason = boundedConnectReason(params?.get("reason"));
|
|
182
|
+
return {
|
|
183
|
+
flow,
|
|
184
|
+
provider,
|
|
185
|
+
outcome: reason === "access_denied" || reason === "cancelled" ? "cancelled" : "failure",
|
|
186
|
+
stage: boundedConnectReason(params?.get("stage")),
|
|
187
|
+
reason,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export function observeOAuthCallback(
|
|
192
|
+
observability: Observability | null | undefined,
|
|
193
|
+
input: { route: string; status: number; location: string | null },
|
|
194
|
+
): void {
|
|
195
|
+
if (!observability) return;
|
|
196
|
+
const classified = classifyOAuthCallback(input);
|
|
197
|
+
if (!classified) return;
|
|
198
|
+
try {
|
|
199
|
+
observability.incrementCounter({
|
|
200
|
+
name: "opengeni_integration_oauth_callbacks_total",
|
|
201
|
+
help: "Provider OAuth/install callbacks by bounded flow, provider, outcome, stage, and reason.",
|
|
202
|
+
labels: classified,
|
|
203
|
+
});
|
|
204
|
+
} catch {
|
|
205
|
+
// Telemetry never changes the callback redirect.
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
export function observeOAuthStart(
|
|
210
|
+
observability: Observability | null | undefined,
|
|
211
|
+
input: { flow: string; outcome: "success" | "failure"; stage?: string; reason?: string },
|
|
212
|
+
): void {
|
|
213
|
+
if (!observability) return;
|
|
214
|
+
try {
|
|
215
|
+
observability.incrementCounter({
|
|
216
|
+
name: "opengeni_integration_oauth_starts_total",
|
|
217
|
+
help: "Integration OAuth starts (discovery, registration, state) by bounded flow, outcome, stage, and reason.",
|
|
218
|
+
labels: {
|
|
219
|
+
flow: BOUNDED_CODE.test(input.flow) ? input.flow : "other",
|
|
220
|
+
outcome: input.outcome,
|
|
221
|
+
stage: boundedConnectReason(input.stage),
|
|
222
|
+
reason: boundedConnectReason(input.reason),
|
|
223
|
+
},
|
|
224
|
+
});
|
|
225
|
+
} catch {
|
|
226
|
+
// Telemetry never changes the start response.
|
|
227
|
+
}
|
|
228
|
+
}
|