@opengeni/api-router 3.0.1 → 3.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/access-grant-rls.d.ts +8 -1
- package/dist/admission-trace.d.ts +8 -0
- package/dist/app.d.ts +50 -3
- package/dist/app.js +10 -1
- package/dist/artifact-catalog-cursor.d.ts +1 -0
- package/dist/attached-browser-viewer.d.ts +11 -0
- package/dist/auth/managed-auth-attempt-context.d.ts +2 -0
- package/dist/auth/managed-auth-rate-limits.d.ts +167 -0
- package/dist/auth/managed-auth-session-adapter.d.ts +9 -1
- package/dist/auth/managed-auth.d.ts +72 -5
- package/dist/auth/managed-sign-in-notifications.d.ts +4 -0
- package/dist/auth/new-signups-gate.d.ts +23 -0
- package/dist/auth/signup-funnel-metrics.d.ts +44 -0
- package/dist/azure-live.d.ts +28 -0
- package/dist/browser-action-fences.d.ts +13 -0
- package/dist/browser-controller-authority.d.ts +1 -61
- package/dist/browser-ephemeral.d.ts +5 -0
- package/dist/browser-lost-runtime-end.d.ts +24 -0
- package/dist/browser-state-authority.d.ts +1 -27
- package/dist/chunk-OGQDXVXY.js +18 -0
- package/dist/chunk-OGQDXVXY.js.map +1 -0
- package/dist/{chunk-AJ62T5QN.js → chunk-OT56OY4V.js} +80503 -39869
- package/dist/chunk-OT56OY4V.js.map +1 -0
- package/dist/claude-default-models.d.ts +19 -0
- package/dist/claude-subscription-core.d.ts +50 -0
- package/dist/claude-subscription-oauth.d.ts +36 -0
- package/dist/claude-subscription-profile.d.ts +9 -0
- package/dist/claude-subscription-usage.d.ts +6 -0
- package/dist/claude-workspace-connection.d.ts +15 -0
- package/dist/codemode.d.ts +40 -5
- package/dist/codex-realtime.d.ts +29 -3
- package/dist/codex-session-pointers.d.ts +19 -0
- package/dist/connection-ownership.d.ts +6 -3
- package/dist/controller-data-plane.d.ts +16 -0
- package/dist/credit-promotion-snapshot.d.ts +6 -0
- package/dist/editable-artifact-source-session.d.ts +3 -0
- package/dist/editable-artifact-websocket.d.ts +5 -3
- package/dist/fatal-process-boundary.d.ts +9 -1
- package/dist/github-access.d.ts +7 -1
- package/dist/github-browser-flow.d.ts +1 -1
- package/dist/http/acting-person.d.ts +36 -0
- package/dist/http/api-contract-compat.d.ts +19 -0
- package/dist/http/api-error.d.ts +50 -1
- package/dist/http/auth.d.ts +8 -1
- package/dist/http/cors.d.ts +12 -0
- package/dist/http/deprecation.d.ts +42 -0
- package/dist/http/keyed-admission.d.ts +12 -0
- package/dist/http/local-browser-boundary.d.ts +72 -0
- package/dist/http/metrics-listener.d.ts +22 -0
- package/dist/http/path-identifier.d.ts +17 -0
- package/dist/http/registered-route-label.d.ts +16 -0
- package/dist/http/rejection-telemetry.d.ts +34 -0
- package/dist/http/request-body.d.ts +27 -0
- package/dist/http/request-source.d.ts +41 -3
- package/dist/http/sse.d.ts +12 -1
- package/dist/http/unmatched-route.d.ts +18 -0
- package/dist/http/user-content.d.ts +36 -0
- package/dist/http/variable-sets-removed.d.ts +41 -0
- package/dist/http/websocket-upgrade-dispatch.d.ts +18 -0
- package/dist/index.js +1279 -108
- package/dist/index.js.map +1 -1
- package/dist/integration-connect-metrics.d.ts +35 -0
- package/dist/integration-endpoint-test.d.ts +20 -0
- package/dist/integrations/api-integrations.d.ts +2 -2
- package/dist/integrations/atlassian.d.ts +8 -3
- package/dist/integrations/fiken.d.ts +3 -1
- package/dist/integrations/github-lens-connect.d.ts +37 -66
- package/dist/integrations/google-drive.d.ts +2 -0
- package/dist/integrations/integration-commit-authority.d.ts +13 -0
- package/dist/integrations/marketplace-plugin.d.ts +43 -43
- package/dist/integrations/oauth-client.d.ts +171 -12
- package/dist/integrations/oauth-profiles.d.ts +42 -13
- package/dist/integrations/onepassword-vault-provider.d.ts +9 -0
- package/dist/integrations/slack-bot.d.ts +285 -7
- package/dist/integrations/slack-file-upload-flow.d.ts +62 -0
- package/dist/integrations/slack-interactions.d.ts +89 -10
- package/dist/integrations/slack-mrkdwn.d.ts +41 -0
- package/dist/integrations/slack-routing.d.ts +1 -1
- package/dist/integrations/slack-session-defaults.d.ts +58 -0
- package/dist/integrations/slack-task-file-upload.d.ts +36 -0
- package/dist/integrations/slack-tool-review.d.ts +5 -0
- package/dist/interaction-agent-access.d.ts +13 -8
- package/dist/interaction-agent-version.d.ts +21 -0
- package/dist/interaction-holder-heartbeat.d.ts +5 -0
- package/dist/interaction-metrics.d.ts +27 -2
- package/dist/interaction-route-stages.d.ts +25 -0
- package/dist/interaction-secrets-vault.d.ts +20 -0
- package/dist/interaction-secrets.d.ts +103 -0
- package/dist/mcp/action-catalog-types.d.ts +14 -0
- package/dist/mcp/action-catalog.gen.d.ts +2 -0
- package/dist/mcp/action-descriptions.d.ts +4 -0
- package/dist/mcp/action-schema-imports.gen.d.ts +1 -0
- package/dist/mcp/capability-account-readiness.d.ts +7 -0
- package/dist/mcp/child-read-evidence.d.ts +9 -0
- package/dist/mcp/company-profile-agent-admin.d.ts +12 -0
- package/dist/mcp/contract-input.d.ts +13 -0
- package/dist/mcp/documents.d.ts +2 -0
- package/dist/mcp/first-party-tool-permissions.d.ts +3 -606
- package/dist/mcp/notification-tools.d.ts +26 -0
- package/dist/mcp/orchestration-failure-diagnostic.d.ts +43 -0
- package/dist/mcp/scheduled-task-input.d.ts +1309 -0
- package/dist/mcp/scheduled-task-view.d.ts +217 -3
- package/dist/mcp/secret-tools.d.ts +14 -0
- package/dist/mcp/server.d.ts +108 -5
- package/dist/mcp/session-admin-access-tools.d.ts +33 -0
- package/dist/mcp/session-event-errors.d.ts +28 -0
- package/dist/mcp/session-event-view.d.ts +62 -0
- package/dist/mcp/session-view.d.ts +15 -0
- package/dist/mcp/session-wait.d.ts +18 -0
- package/dist/mcp/site-agent-clamp-tools.d.ts +38 -0
- package/dist/mcp/site-data-tools.d.ts +22 -0
- package/dist/mcp/site-publication-tools.d.ts +19 -0
- package/dist/mcp/site-sql-tools.d.ts +27 -0
- package/dist/mcp-oauth.d.ts +37 -4
- package/dist/model-calls/chat-completions.d.ts +87 -0
- package/dist/model-calls/pending-usage-settlements.d.ts +57 -0
- package/dist/model-calls/service.d.ts +36 -0
- package/dist/model-catalog.d.ts +9 -3
- package/dist/native-push-dispatch.d.ts +69 -0
- package/dist/observability.d.ts +3 -1
- package/dist/organization-mcp.d.ts +82 -0
- package/dist/prepared-mcp-actor.d.ts +77 -0
- package/dist/prepared-mcp-permissions.d.ts +8 -0
- package/dist/routes/analytics-consent.d.ts +26 -0
- package/dist/routes/api-integrations.d.ts +11 -0
- package/dist/routes/api-keys.d.ts +7 -7
- package/dist/routes/automations.d.ts +2 -0
- package/dist/routes/billing.d.ts +59 -0
- package/dist/routes/browser-sessions.d.ts +65 -2
- package/dist/routes/chat-completions.d.ts +11 -0
- package/dist/routes/claude-core-usage.d.ts +20 -0
- package/dist/routes/claude-subscription-accounts.d.ts +3 -0
- package/dist/routes/claude-subscription-oauth.d.ts +3 -0
- package/dist/routes/client-errors.d.ts +182 -0
- package/dist/routes/codex-core.d.ts +401 -0
- package/dist/routes/codex.d.ts +64 -2
- package/dist/routes/computer-sessions.d.ts +6 -1
- package/dist/routes/desktop-distribution.d.ts +32 -0
- package/dist/routes/github-browser-fonts.gen.d.ts +2 -0
- package/dist/routes/github-browser-pages.d.ts +27 -0
- package/dist/routes/inbox.d.ts +13 -0
- package/dist/routes/insights-response-cache.d.ts +10 -0
- package/dist/routes/insights-usage.d.ts +12 -0
- package/dist/routes/insights.d.ts +28 -0
- package/dist/routes/interaction-placement-message.d.ts +7 -0
- package/dist/routes/managed-sign-in-methods.d.ts +6 -0
- package/dist/routes/model-account-choice.d.ts +13 -0
- package/dist/routes/model-account-settings.d.ts +19 -0
- package/dist/routes/native-app-auth.d.ts +12 -0
- package/dist/routes/organization-integration-policy.d.ts +8 -0
- package/dist/routes/organization-integrations.d.ts +6 -0
- package/dist/routes/organization-mcp-connections.d.ts +3 -0
- package/dist/routes/organization-model-defaults.d.ts +9 -0
- package/dist/routes/organization-service-accounts.d.ts +3 -0
- package/dist/routes/personal-api-keys.d.ts +3 -0
- package/dist/routes/session-admin-access.d.ts +3 -0
- package/dist/routes/session-artifact-associations.d.ts +4 -0
- package/dist/routes/session-history-imports.d.ts +20 -0
- package/dist/routes/sessions.d.ts +38 -2
- package/dist/routes/site-data.d.ts +18 -0
- package/dist/routes/site-publishing.d.ts +5 -0
- package/dist/routes/site-runtime.d.ts +31 -0
- package/dist/routes/site-sql.d.ts +16 -0
- package/dist/routes/slack-bot-access.d.ts +3 -0
- package/dist/routes/subscription-account-pools.d.ts +21 -0
- package/dist/routes/subscription-core-http.d.ts +5 -0
- package/dist/routes/subscription-pool-access.d.ts +37 -0
- package/dist/routes/subscription-pool-core.d.ts +153 -0
- package/dist/routes/supergrok.d.ts +6 -6
- package/dist/routes/usage-allowances.d.ts +12 -0
- package/dist/routes/variable-sets-removed.d.ts +2 -0
- package/dist/routes/vault-providers.d.ts +34 -0
- package/dist/routes/vaults.d.ts +3 -0
- package/dist/routes/workspace-integrations.d.ts +35 -0
- package/dist/routes/workspace-model-providers.d.ts +4 -0
- package/dist/routes/workspaces.d.ts +11 -2
- package/dist/sandbox/agent-update.d.ts +64 -0
- package/dist/sandbox/auth-callout.d.ts +8 -0
- package/dist/sandbox/channel-a.d.ts +15 -1
- package/dist/sandbox/enrollment.d.ts +26 -4
- package/dist/sandbox/machine-audience.d.ts +29 -0
- package/dist/sandbox/machines.d.ts +15 -2
- package/dist/sandbox/metrics-ingestion.d.ts +6 -2
- package/dist/sandbox/screen-control.d.ts +85 -0
- package/dist/sandbox/viewer.d.ts +5 -1
- package/dist/sandbox-file-artifacts.d.ts +17 -1
- package/dist/scheduled-task-blockers.d.ts +39 -0
- package/dist/scheduled-task-deletion.d.ts +3 -4
- package/dist/scheduled-task-lifecycle.d.ts +14 -0
- package/dist/secret-answers.d.ts +40 -0
- package/dist/session-create-observability.d.ts +5 -0
- package/dist/session-event-view-36GO3IL7.js +528 -0
- package/dist/session-event-view-36GO3IL7.js.map +1 -0
- package/dist/signed-state-secret.d.ts +18 -0
- package/dist/site-agent-guard.d.ts +53 -0
- package/dist/site-data/operations.d.ts +103 -0
- package/dist/site-data/service.d.ts +203 -0
- package/dist/site-frame-guard.d.ts +32 -0
- package/dist/site-publishing/agent-data-tools.d.ts +84 -0
- package/dist/site-publishing/agent-model.d.ts +58 -0
- package/dist/site-publishing/agent-session.d.ts +16 -0
- package/dist/site-publishing/content-scanner.d.ts +31 -0
- package/dist/site-publishing/edge-sync.d.ts +48 -0
- package/dist/site-publishing/gateway-signature.d.ts +56 -0
- package/dist/site-publishing/limits.d.ts +63 -0
- package/dist/site-publishing/page-tool-authority.d.ts +30 -0
- package/dist/site-publishing/platform-usage.d.ts +113 -0
- package/dist/site-publishing/platform.d.ts +21 -0
- package/dist/site-publishing/readiness.d.ts +62 -0
- package/dist/site-publishing/runtime.d.ts +179 -0
- package/dist/site-publishing/service.d.ts +264 -0
- package/dist/site-publishing/session-events.d.ts +22 -0
- package/dist/site-publishing/session-views.d.ts +36 -0
- package/dist/site-publishing/viewer.d.ts +40 -0
- package/dist/site-session-origin.d.ts +31 -6
- package/dist/site-sql/format.d.ts +47 -0
- package/dist/site-sql/gateway.d.ts +50 -0
- package/dist/site-sql/service.d.ts +213 -0
- package/dist/temporal-schedule-sync.d.ts +26 -0
- package/dist/transcription/billing-refusal.d.ts +8 -0
- package/dist/transcription/normalize.d.ts +23 -0
- package/dist/transcription/providers/azure-mai.d.ts +12 -0
- package/dist/transcription/providers/azure-openai.d.ts +4 -0
- package/dist/transcription/providers/openai.d.ts +16 -0
- package/dist/transcription/providers/subscription-core.d.ts +39 -0
- package/dist/transcription/service.d.ts +10 -1
- package/dist/transcription/wav-duration.d.ts +8 -0
- package/dist/workspace-tool-gateway-attestations.d.ts +37 -0
- package/dist/workspace-tool-gateway-observability.d.ts +16 -0
- package/dist/workspace-tool-gateway-secrets.d.ts +27 -0
- package/dist/workspace-tool-gateway.d.ts +102 -6
- package/dist/workspace-tool-target-fence.d.ts +116 -0
- package/dist/workspace-tool-target.d.ts +225 -0
- package/dist/workspace-webhook-dispatch.d.ts +26 -0
- package/dist/xai-subscription-core.d.ts +60 -0
- package/package.json +25 -20
- package/src/access-grant-rls.ts +64 -14
- package/src/admission-trace.ts +14 -0
- package/src/app.ts +1684 -252
- package/src/artifact-catalog-cursor.ts +1 -0
- package/src/attached-browser-viewer.ts +26 -0
- package/src/auth/managed-auth-attempt-context.ts +9 -0
- package/src/auth/managed-auth-rate-limits.ts +252 -0
- package/src/auth/managed-auth-session-adapter.ts +64 -29
- package/src/auth/managed-auth.ts +303 -35
- package/src/auth/managed-email.ts +18 -1
- package/src/auth/managed-sign-in-notifications.ts +81 -0
- package/src/auth/new-signups-gate.ts +49 -0
- package/src/auth/organization-user-setup.ts +3 -3
- package/src/auth/signup-funnel-metrics.ts +164 -0
- package/src/azure-live.ts +103 -0
- package/src/browser-action-fences.ts +45 -0
- package/src/browser-controller-authority.ts +1 -186
- package/src/browser-ephemeral.ts +39 -0
- package/src/browser-lost-runtime-end.ts +71 -0
- package/src/browser-state-authority.ts +1 -236
- package/src/claude-default-models.ts +37 -0
- package/src/claude-subscription-core.ts +154 -0
- package/src/claude-subscription-oauth.ts +352 -0
- package/src/claude-subscription-profile.ts +73 -0
- package/src/claude-subscription-usage.ts +51 -0
- package/src/claude-workspace-connection.ts +82 -0
- package/src/codemode.ts +236 -39
- package/src/codex-realtime.ts +181 -53
- package/src/codex-session-pointers.ts +80 -0
- package/src/company-brain-okf.ts +1 -1
- package/src/connected-machine-computer-access.ts +2 -1
- package/src/connection-ownership.ts +19 -13
- package/src/controller-data-plane.ts +34 -0
- package/src/credit-promotion-snapshot.ts +36 -0
- package/src/editable-artifact-production.ts +10 -0
- package/src/editable-artifact-source-session.ts +123 -0
- package/src/editable-artifact-websocket.ts +16 -3
- package/src/fatal-process-boundary.ts +67 -3
- package/src/gateway-realtime.ts +12 -8
- package/src/github-access.ts +31 -5
- package/src/github-browser-flow.ts +1 -1
- package/src/http/acting-person.ts +105 -0
- package/src/http/api-contract-compat.ts +49 -0
- package/src/http/api-error.ts +210 -2
- package/src/http/auth.ts +68 -4
- package/src/http/cors.ts +37 -5
- package/src/http/deprecation.ts +118 -0
- package/src/http/keyed-admission.ts +29 -0
- package/src/http/local-browser-boundary.ts +343 -0
- package/src/http/metrics-listener.ts +57 -0
- package/src/http/path-identifier.ts +54 -0
- package/src/http/registered-route-label.ts +34 -0
- package/src/http/rejection-telemetry.ts +120 -0
- package/src/http/request-body.ts +127 -0
- package/src/http/request-source.ts +154 -13
- package/src/http/sse.ts +88 -28
- package/src/http/unmatched-route.ts +60 -0
- package/src/http/user-content.ts +158 -0
- package/src/http/variable-sets-removed.ts +122 -0
- package/src/http/websocket-upgrade-dispatch.ts +29 -0
- package/src/index.ts +107 -57
- package/src/integration-connect-metrics.ts +228 -0
- package/src/integration-endpoint-test.ts +291 -0
- package/src/integrations/api-integrations.ts +81 -7
- package/src/integrations/atlassian.ts +202 -83
- package/src/integrations/fiken.ts +66 -38
- package/src/integrations/github-app-connect.ts +64 -18
- package/src/integrations/github-lens-connect.ts +8 -29
- package/src/integrations/google-drive.ts +448 -152
- package/src/integrations/integration-commit-authority.ts +69 -0
- package/src/integrations/marketplace-plugin.ts +1 -1
- package/src/integrations/oauth-client.ts +733 -193
- package/src/integrations/oauth-profiles.ts +116 -45
- package/src/integrations/onepassword-vault-provider.ts +16 -0
- package/src/integrations/personal-github-repositories.ts +1 -1
- package/src/integrations/personal-github.ts +61 -35
- package/src/integrations/provider-oauth.ts +67 -85
- package/src/integrations/slack-app-home.ts +5 -5
- package/src/integrations/slack-bot.ts +893 -201
- package/src/integrations/slack-file-upload-flow.ts +147 -0
- package/src/integrations/slack-install.ts +7 -7
- package/src/integrations/slack-interactions.ts +1589 -299
- package/src/integrations/slack-mrkdwn.ts +193 -0
- package/src/integrations/slack-routing.ts +2 -2
- package/src/integrations/slack-session-defaults.ts +224 -0
- package/src/integrations/slack-task-file-upload.ts +323 -0
- package/src/integrations/slack-tool-review.ts +65 -0
- package/src/integrations/social-oauth.ts +90 -58
- package/src/interaction-agent-access.ts +40 -20
- package/src/interaction-agent-version.ts +85 -0
- package/src/interaction-holder-heartbeat.ts +24 -8
- package/src/interaction-metrics.ts +164 -2
- package/src/interaction-route-stages.ts +94 -0
- package/src/interaction-secrets-vault.ts +213 -0
- package/src/interaction-secrets.ts +426 -0
- package/src/mcp/action-catalog-types.ts +14 -0
- package/src/mcp/action-catalog.gen.ts +8014 -0
- package/src/mcp/action-descriptions.ts +299 -0
- package/src/mcp/action-schema-imports.gen.ts +304 -0
- package/src/mcp/capability-account-readiness.ts +17 -0
- package/src/mcp/child-read-evidence.ts +19 -0
- package/src/mcp/company-profile-agent-admin.ts +13 -0
- package/src/mcp/contract-input.ts +165 -0
- package/src/mcp/documents.ts +9 -2
- package/src/mcp/editable-artifacts.ts +29 -11
- package/src/mcp/files.ts +5 -1
- package/src/mcp/first-party-tool-permissions.ts +7 -285
- package/src/mcp/knowledge-entries.ts +108 -34
- package/src/mcp/notification-tools.ts +480 -0
- package/src/mcp/orchestration-failure-diagnostic.ts +43 -0
- package/src/mcp/scheduled-task-input.ts +89 -0
- package/src/mcp/scheduled-task-view.ts +63 -3
- package/src/mcp/secret-tools.ts +185 -0
- package/src/mcp/server.ts +2213 -1116
- package/src/mcp/session-admin-access-tools.ts +163 -0
- package/src/mcp/session-event-errors.ts +123 -0
- package/src/mcp/session-event-view.ts +395 -13
- package/src/mcp/session-view.ts +3 -0
- package/src/mcp/session-wait.ts +67 -7
- package/src/mcp/site-agent-clamp-tools.ts +140 -0
- package/src/mcp/site-data-tools.ts +339 -0
- package/src/mcp/site-publication-tools.ts +201 -0
- package/src/mcp/site-sql-tools.ts +427 -0
- package/src/mcp-oauth.ts +635 -45
- package/src/model-calls/chat-completions.ts +352 -0
- package/src/model-calls/pending-usage-settlements.ts +125 -0
- package/src/model-calls/service.ts +694 -0
- package/src/model-catalog.ts +68 -17
- package/src/native-push-dispatch.ts +457 -0
- package/src/observability.ts +15 -1
- package/src/organization-mcp.ts +485 -0
- package/src/prepared-mcp-actor.ts +154 -0
- package/src/prepared-mcp-permissions.ts +38 -0
- package/src/routes/analytics-consent.ts +123 -0
- package/src/routes/api-integrations.ts +268 -9
- package/src/routes/api-keys.ts +164 -25
- package/src/routes/artifact-catalog.ts +111 -0
- package/src/routes/automations.ts +163 -90
- package/src/routes/billing.ts +535 -59
- package/src/routes/browser-sessions.ts +966 -342
- package/src/routes/canonical-human-identities.ts +61 -0
- package/src/routes/capabilities.ts +112 -5
- package/src/routes/channels.ts +4 -3
- package/src/routes/chat-completions.ts +235 -0
- package/src/routes/claude-core-usage.ts +147 -0
- package/src/routes/claude-subscription-accounts.ts +233 -0
- package/src/routes/claude-subscription-oauth.ts +175 -0
- package/src/routes/client-errors.ts +394 -0
- package/src/routes/codex-core.ts +687 -0
- package/src/routes/codex.ts +1277 -1119
- package/src/routes/company-brain.ts +4 -0
- package/src/routes/computer-sessions.ts +319 -85
- package/src/routes/connect.ts +277 -175
- package/src/routes/connections.ts +690 -363
- package/src/routes/desktop-distribution.ts +217 -0
- package/src/routes/documents.ts +13 -7
- package/src/routes/editable-artifacts.ts +74 -4
- package/src/routes/enrollments.ts +110 -16
- package/src/routes/external-identity-links.ts +13 -12
- package/src/routes/files.ts +41 -16
- package/src/routes/github-browser-fonts.gen.ts +12 -0
- package/src/routes/github-browser-pages.ts +258 -0
- package/src/routes/github.ts +200 -75
- package/src/routes/inbox.ts +353 -0
- package/src/routes/insights-response-cache.ts +83 -0
- package/src/routes/insights-usage.ts +345 -0
- package/src/routes/insights.ts +103 -8
- package/src/routes/install.ts +51 -10
- package/src/routes/integration-facets.ts +70 -28
- package/src/routes/interaction-placement-message.ts +12 -0
- package/src/routes/knowledge.ts +136 -27
- package/src/routes/machines.ts +189 -135
- package/src/routes/managed-auth-session-sets.ts +43 -10
- package/src/routes/managed-onboarding.ts +39 -19
- package/src/routes/managed-sign-in-methods.ts +433 -0
- package/src/routes/memory-slack-publications.ts +3 -2
- package/src/routes/model-account-choice.ts +194 -0
- package/src/routes/model-account-settings.ts +235 -0
- package/src/routes/model-connection-access.ts +210 -48
- package/src/routes/native-app-auth.ts +296 -0
- package/src/routes/organization-integration-policy.ts +116 -0
- package/src/routes/organization-integrations.ts +326 -0
- package/src/routes/organization-mcp-connections.ts +183 -0
- package/src/routes/organization-memberships.ts +205 -19
- package/src/routes/organization-model-defaults.ts +110 -0
- package/src/routes/organization-model-providers.ts +74 -3
- package/src/routes/organization-service-accounts.ts +128 -0
- package/src/routes/organization-sessions.ts +21 -5
- package/src/routes/personal-api-keys.ts +184 -0
- package/src/routes/personal-github-git-broker.ts +2 -2
- package/src/routes/personal-github.ts +9 -4
- package/src/routes/plugins.ts +46 -7
- package/src/routes/pr-review-github.ts +105 -118
- package/src/routes/pr-review.ts +88 -82
- package/src/routes/preference-registry.ts +18 -0
- package/src/routes/rigs.ts +48 -13
- package/src/routes/scheduled-tasks.ts +347 -27
- package/src/routes/session-admin-access.ts +271 -0
- package/src/routes/session-artifact-associations.ts +164 -0
- package/src/routes/session-history-imports.ts +305 -0
- package/src/routes/sessions.ts +1682 -363
- package/src/routes/site-data.ts +340 -0
- package/src/routes/site-publishing.ts +584 -0
- package/src/routes/site-runtime.ts +1944 -0
- package/src/routes/site-sql.ts +263 -0
- package/src/routes/skill-content.ts +72 -7
- package/src/routes/skills.ts +5 -4
- package/src/routes/slack-bot-access.ts +108 -0
- package/src/routes/social.ts +27 -15
- package/src/routes/subscription-account-pools.ts +209 -0
- package/src/routes/subscription-core-http.ts +18 -0
- package/src/routes/subscription-pool-access.ts +180 -0
- package/src/routes/subscription-pool-core.ts +552 -0
- package/src/routes/supergrok.ts +174 -655
- package/src/routes/transcription-recordings.ts +71 -4
- package/src/routes/transcriptions.ts +26 -2
- package/src/routes/usage-allowances.ts +381 -0
- package/src/routes/variable-sets-removed.ts +19 -0
- package/src/routes/vault-providers.ts +782 -0
- package/src/routes/vaults.ts +421 -0
- package/src/routes/video-generation.ts +30 -12
- package/src/routes/workspace-artifacts.ts +165 -53
- package/src/routes/workspace-integrations.ts +576 -0
- package/src/routes/workspace-model-providers.ts +148 -0
- package/src/routes/workspace-state.ts +4 -0
- package/src/routes/workspaces.ts +625 -117
- package/src/sandbox/agent-update.ts +315 -0
- package/src/sandbox/auth-callout.ts +104 -21
- package/src/sandbox/channel-a.ts +165 -55
- package/src/sandbox/enrollment.ts +131 -22
- package/src/sandbox/machine-audience.ts +192 -0
- package/src/sandbox/machines.ts +75 -31
- package/src/sandbox/metrics-ingestion.ts +133 -2
- package/src/sandbox/rematerialize.ts +51 -21
- package/src/sandbox/screen-control.ts +289 -0
- package/src/sandbox/viewer.ts +33 -58
- package/src/sandbox-file-artifacts.ts +53 -27
- package/src/scheduled-task-blockers.ts +293 -0
- package/src/scheduled-task-deletion.ts +13 -3
- package/src/scheduled-task-lifecycle.ts +84 -0
- package/src/secret-answers.ts +119 -0
- package/src/session-create-observability.ts +46 -0
- package/src/session-realtime-context.ts +26 -4
- package/src/signed-state-secret.ts +58 -0
- package/src/site-agent-guard.ts +261 -0
- package/src/site-data/operations.ts +777 -0
- package/src/site-data/service.ts +1043 -0
- package/src/site-frame-guard.ts +107 -0
- package/src/site-publishing/agent-data-tools.ts +250 -0
- package/src/site-publishing/agent-model.ts +127 -0
- package/src/site-publishing/agent-session.ts +148 -0
- package/src/site-publishing/content-scanner.ts +93 -0
- package/src/site-publishing/edge-sync.ts +148 -0
- package/src/site-publishing/gateway-signature.ts +198 -0
- package/src/site-publishing/limits.ts +315 -0
- package/src/site-publishing/page-tool-authority.ts +111 -0
- package/src/site-publishing/platform-usage.ts +479 -0
- package/src/site-publishing/platform.ts +98 -0
- package/src/site-publishing/readiness.ts +330 -0
- package/src/site-publishing/runtime.ts +831 -0
- package/src/site-publishing/service.ts +1282 -0
- package/src/site-publishing/session-events.ts +262 -0
- package/src/site-publishing/session-views.ts +262 -0
- package/src/site-publishing/viewer.ts +75 -0
- package/src/site-session-origin.ts +91 -6
- package/src/site-sql/format.ts +134 -0
- package/src/site-sql/gateway.ts +168 -0
- package/src/site-sql/service.ts +1636 -0
- package/src/site-uploads.ts +27 -5
- package/src/temporal-schedule-sync.ts +74 -0
- package/src/transcription/billing-refusal.ts +14 -0
- package/src/transcription/normalize.ts +77 -0
- package/src/transcription/providers/azure-mai.ts +98 -0
- package/src/transcription/providers/azure-openai.ts +16 -7
- package/src/transcription/providers/codex-subscription.ts +190 -67
- package/src/transcription/providers/openai.ts +79 -5
- package/src/transcription/providers/subscription-core.ts +125 -0
- package/src/transcription/providers/xai-subscription.ts +81 -83
- package/src/transcription/segmenter.ts +7 -1
- package/src/transcription/service.ts +239 -10
- package/src/transcription/wav-duration.ts +39 -0
- package/src/workspace-deletion.ts +25 -1
- package/src/workspace-tool-gateway-attestations.ts +133 -0
- package/src/workspace-tool-gateway-observability.ts +64 -0
- package/src/workspace-tool-gateway-secrets.ts +104 -0
- package/src/workspace-tool-gateway.ts +921 -103
- package/src/workspace-tool-target-fence.ts +380 -0
- package/src/workspace-tool-target.ts +554 -0
- package/src/workspace-webhook-dispatch.ts +225 -0
- package/src/xai-realtime.ts +85 -81
- package/src/xai-subscription-core.ts +172 -0
- package/dist/browser-auth-broker.d.ts +0 -20
- package/dist/chunk-AJ62T5QN.js.map +0 -1
- package/dist/connection-authority-owner.d.ts +0 -59
- package/dist/routes/connection-authorities.d.ts +0 -3
- package/dist/routes/environments.d.ts +0 -5
- package/dist/routes/host-mcp-bindings.d.ts +0 -5
- package/dist/routes/host-mcp-resolvers.d.ts +0 -3
- package/dist/routes/packs.d.ts +0 -3
- package/dist/session-event-view-MU3HMNV3.js +0 -264
- package/dist/session-event-view-MU3HMNV3.js.map +0 -1
- package/dist/xai-subscription-auth.d.ts +0 -23
- package/src/browser-auth-broker.ts +0 -155
- package/src/connection-authority-owner.ts +0 -61
- package/src/routes/connection-authorities.ts +0 -139
- package/src/routes/environments.ts +0 -388
- package/src/routes/host-mcp-bindings.ts +0 -122
- package/src/routes/host-mcp-resolvers.ts +0 -41
- package/src/routes/packs.ts +0 -784
- package/src/xai-subscription-auth.ts +0 -139
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown to Slack mrkdwn for model-authored text Opengeni posts to Slack.
|
|
3
|
+
*
|
|
4
|
+
* Agents write ordinary Markdown because the same reply renders as Markdown in
|
|
5
|
+
* the Opengeni console. Slack message text does not render Markdown headings,
|
|
6
|
+
* `**bold**`, or `[label](url)` links, so a reply that reads well in the
|
|
7
|
+
* console arrives in Slack full of literal syntax. This rewrites only that
|
|
8
|
+
* syntax, only for the bytes handed to Slack: stored session events, model
|
|
9
|
+
* history, and every other surface keep the model's exact text. It is
|
|
10
|
+
* formatting at a third-party sink, not content classification or redaction.
|
|
11
|
+
*
|
|
12
|
+
* Code is never rewritten: fenced code blocks keep every line between their
|
|
13
|
+
* fences, and inline code spans are copied as they are.
|
|
14
|
+
*
|
|
15
|
+
* The output is part of the Slack post and update ledgers' request digest, so a
|
|
16
|
+
* change to it changes the bytes an in-flight operation is bound to. Delivery
|
|
17
|
+
* (`deliverSlackModelText` in `slack-interactions.ts`) falls back only to the
|
|
18
|
+
* unformatted text; a later output change must keep the previous rendering
|
|
19
|
+
* reachable the same way, or operations started before the deploy conflict on
|
|
20
|
+
* every retry.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* A private provider citation handle: U+E200 `cite`, one or more U+E202
|
|
25
|
+
* separated references, then U+E201. Codex web search can emit these without
|
|
26
|
+
* the annotation table that would make them resolvable, so they carry nothing a
|
|
27
|
+
* Slack reader can use. The Opengeni timeline hides the same handles
|
|
28
|
+
* (`stripOpaqueCitationTokens` in `packages/react/src/timeline/projection.ts`).
|
|
29
|
+
*/
|
|
30
|
+
const PROVIDER_CITATION_TOKEN =
|
|
31
|
+
/[ \t]*\u{E200}(?:cite|filecite)(?:\u{E202}[^\u{E200}-\u{E202}]*)*\u{E201}/gu;
|
|
32
|
+
/** Stray citation delimiters, for example from a token cut short upstream. */
|
|
33
|
+
const PROVIDER_CITATION_DELIMITER = /[\u{E200}-\u{E202}]/gu;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* A fence at any indentation. Agents nest code under list items (a `10.` item
|
|
37
|
+
* or a nested bullet puts the fence four or more spaces in), and Slack has no
|
|
38
|
+
* indented code block, so a fence line is a fence wherever it starts.
|
|
39
|
+
*/
|
|
40
|
+
const FENCE_OPEN = /^[ \t]*(`{3,}|~{3,})(.*)$/u;
|
|
41
|
+
const ATX_HEADING = /^ {0,3}#{1,6}[ \t]+(.*?)(?:[ \t]+#+)?[ \t]*$/u;
|
|
42
|
+
const BULLET = /^([ \t]*)[-*+][ \t]+(?=\S)/u;
|
|
43
|
+
const THEMATIC_BREAK = /^ {0,3}([-*_])(?:[ \t]*\1){2,}[ \t]*$/u;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Spans that must reach Slack exactly as written and are set aside before any
|
|
47
|
+
* link is read: inline code, and Slack's own `<...>` tokens (mentions, channel
|
|
48
|
+
* links, and links already in Slack form).
|
|
49
|
+
*/
|
|
50
|
+
const CODE_SPAN_OR_SLACK_TOKEN =
|
|
51
|
+
/(`+)(?!`)[^\n]*?(?<!`)\1(?!`)|<(?:[@#!]|https?:|mailto:)[^<>\n]*>/gu;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* A Markdown link or image whose target is a web or mail address. Other
|
|
55
|
+
* targets, such as Opengeni's own `artifact:` and `sandbox:` links, mean
|
|
56
|
+
* nothing in Slack and are left as written rather than turned into dead links.
|
|
57
|
+
* One level of balanced parentheses is allowed in the URL (as in Wikipedia
|
|
58
|
+
* links), and an optional link title is dropped.
|
|
59
|
+
*/
|
|
60
|
+
const MARKDOWN_LINK =
|
|
61
|
+
/!?\[((?:[^[\]\n]|\[[^[\]\n]*\])+)\]\(\s*((?:https?:\/\/|mailto:)(?:[^\s()<>|]|\([^\s()<>|]*\))+)(?:\s+(?:"[^"\n]*"|'[^'\n]*'|\([^()\n]*\)))?\s*\)/gu;
|
|
62
|
+
|
|
63
|
+
/** Bare URLs are set aside after links: they may legitimately contain `__` or `**`. */
|
|
64
|
+
const BARE_URL = /\bhttps?:\/\/[^\s<>]+/gu;
|
|
65
|
+
|
|
66
|
+
const BOLD_ITALIC_ASTERISK = /\*\*\*(?=[^\s*])((?:[^*\n]|\*(?!\*))+?)(?<=[^\s*])\*\*\*/gu;
|
|
67
|
+
const BOLD_ASTERISK = /\*\*(?=[^\s*])((?:[^*\n]|\*(?!\*))+?)(?<=[^\s*])\*\*/gu;
|
|
68
|
+
const BOLD_UNDERSCORE =
|
|
69
|
+
/(?<![\p{L}\p{N}_])__(?=[^\s_])((?:[^_\n]|_(?!_))+?)(?<=[^\s_])__(?![\p{L}\p{N}_])/gu;
|
|
70
|
+
const STRIKETHROUGH = /~~(?=[^\s~])((?:[^~\n]|~(?!~))+?)(?<=[^\s~])~~/gu;
|
|
71
|
+
const PLACEHOLDER = /\u0000(\d+)\u0000/gu;
|
|
72
|
+
|
|
73
|
+
/** Remove provider citation handles and any stray citation delimiters. */
|
|
74
|
+
export function stripProviderCitationMarkers(text: string): string {
|
|
75
|
+
return text.replace(PROVIDER_CITATION_TOKEN, "").replace(PROVIDER_CITATION_DELIMITER, "");
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Rewrite common Markdown as Slack mrkdwn.
|
|
80
|
+
*
|
|
81
|
+
* - `# Heading` (any level) becomes a bold line.
|
|
82
|
+
* - `**bold**` and `__bold__` become `*bold*`, `***both***` becomes `*_both_*`,
|
|
83
|
+
* and `~~struck~~` becomes `~struck~`.
|
|
84
|
+
* - `[label](https://...)` becomes `<https://...|label>`.
|
|
85
|
+
* - `-`, `*`, and `+` bullets become Slack's `•` bullet, keeping indentation;
|
|
86
|
+
* numbered lists and block quotes are already Slack syntax and stay as they are.
|
|
87
|
+
* - Fenced code blocks, at any indentation, keep their contents byte for byte.
|
|
88
|
+
* The opening fence loses its language tag, which Slack would otherwise print
|
|
89
|
+
* as the first code line, and an unclosed block is closed so Slack still
|
|
90
|
+
* renders it as code.
|
|
91
|
+
* - Provider citation handles are removed.
|
|
92
|
+
*
|
|
93
|
+
* Text that uses none of this syntax comes back unchanged.
|
|
94
|
+
*/
|
|
95
|
+
export function slackMrkdwnFromMarkdown(markdown: string): string {
|
|
96
|
+
const lines = stripProviderCitationMarkers(markdown).split("\n");
|
|
97
|
+
const output: string[] = [];
|
|
98
|
+
let fence: { character: string; length: number } | null = null;
|
|
99
|
+
for (const line of lines) {
|
|
100
|
+
if (fence) {
|
|
101
|
+
if (closesFence(line, fence)) {
|
|
102
|
+
output.push("```");
|
|
103
|
+
fence = null;
|
|
104
|
+
} else {
|
|
105
|
+
output.push(line);
|
|
106
|
+
}
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
const opening = FENCE_OPEN.exec(line);
|
|
110
|
+
// A backtick fence's info string cannot contain a backtick; such a line is
|
|
111
|
+
// inline code, not a fence.
|
|
112
|
+
if (opening && !(opening[1]!.startsWith("`") && opening[2]!.includes("`"))) {
|
|
113
|
+
fence = { character: opening[1]![0]!, length: opening[1]!.length };
|
|
114
|
+
output.push("```");
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
output.push(slackLine(line));
|
|
118
|
+
}
|
|
119
|
+
if (fence) output.push("```");
|
|
120
|
+
return output.join("\n");
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function closesFence(line: string, fence: { character: string; length: number }): boolean {
|
|
124
|
+
const trimmed = line.trim();
|
|
125
|
+
return (
|
|
126
|
+
trimmed.length >= fence.length &&
|
|
127
|
+
[...trimmed].every((character) => character === fence.character)
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function slackLine(line: string): string {
|
|
132
|
+
if (THEMATIC_BREAK.test(line)) return line;
|
|
133
|
+
const heading = ATX_HEADING.exec(line);
|
|
134
|
+
if (heading) {
|
|
135
|
+
const content = slackInline(heading[1]!, { heading: true }).trim();
|
|
136
|
+
return content ? `*${content}*` : line;
|
|
137
|
+
}
|
|
138
|
+
const bullet = BULLET.exec(line);
|
|
139
|
+
if (bullet) {
|
|
140
|
+
return `${bullet[1]}• ${slackInline(line.slice(bullet[0].length), { heading: false })}`;
|
|
141
|
+
}
|
|
142
|
+
return slackInline(line, { heading: false });
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function slackInline(text: string, options: { heading: boolean }): string {
|
|
146
|
+
const kept: string[] = [];
|
|
147
|
+
const keep = (value: string) => {
|
|
148
|
+
kept.push(value);
|
|
149
|
+
return `\u0000${kept.length - 1}\u0000`;
|
|
150
|
+
};
|
|
151
|
+
// The placeholders are NUL-delimited, so a NUL in the model text itself
|
|
152
|
+
// could collide with one. Slack does not render NUL; drop it.
|
|
153
|
+
let working = text.replace(/\u0000/gu, "");
|
|
154
|
+
working = working.replace(CODE_SPAN_OR_SLACK_TOKEN, keep);
|
|
155
|
+
working = working.replace(MARKDOWN_LINK, (_match, label: string, url: string) =>
|
|
156
|
+
keep(slackLink(restore(label, kept), url)),
|
|
157
|
+
);
|
|
158
|
+
working = working.replace(BARE_URL, keep);
|
|
159
|
+
if (options.heading) {
|
|
160
|
+
// The whole heading becomes one bold span, so emphasis inside it would
|
|
161
|
+
// nest and break Slack's parser. Drop the emphasis markers instead.
|
|
162
|
+
working = working
|
|
163
|
+
.replace(BOLD_ASTERISK, "$1")
|
|
164
|
+
.replace(BOLD_UNDERSCORE, "$1")
|
|
165
|
+
.replace(/\*/gu, "");
|
|
166
|
+
} else {
|
|
167
|
+
working = working
|
|
168
|
+
.replace(BOLD_ITALIC_ASTERISK, "*_$1_*")
|
|
169
|
+
.replace(BOLD_ASTERISK, "*$1*")
|
|
170
|
+
.replace(BOLD_UNDERSCORE, "*$1*");
|
|
171
|
+
}
|
|
172
|
+
working = working.replace(STRIKETHROUGH, "~$1~");
|
|
173
|
+
return restore(working, kept);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function restore(text: string, kept: readonly string[]): string {
|
|
177
|
+
return text.replace(PLACEHOLDER, (_match, index: string) => kept[Number(index)] ?? "");
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function slackLink(label: string, url: string): string {
|
|
181
|
+
const text = label
|
|
182
|
+
.replace(BOLD_ASTERISK, "$1")
|
|
183
|
+
.replace(BOLD_UNDERSCORE, "$1")
|
|
184
|
+
.replace(/`/gu, "")
|
|
185
|
+
.trim();
|
|
186
|
+
if (!text || text === url) return `<${url}>`;
|
|
187
|
+
return `<${url}|${escapeSlackLinkLabel(text)}>`;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/** Slack reads `&`, `<`, and `>` as control characters inside a link. */
|
|
191
|
+
function escapeSlackLinkLabel(label: string): string {
|
|
192
|
+
return label.replace(/&/gu, "&").replace(/</gu, "<").replace(/>/gu, ">");
|
|
193
|
+
}
|
|
@@ -78,7 +78,7 @@ const AUTHORED_BY_INVOKER: ReadonlySet<string> = new Set([
|
|
|
78
78
|
* Split a leading bot mention off the message text.
|
|
79
79
|
*
|
|
80
80
|
* Slack delivers an `app_mention` with the mention still in the text
|
|
81
|
-
* (`<@U123> do the thing`), and
|
|
81
|
+
* (`<@U123> do the thing`), and Opengeni stores it verbatim. The workspace
|
|
82
82
|
* prefix is only an override when it is the first thing the person typed, so it
|
|
83
83
|
* is parsed after the mention rather than at byte 0 of the raw text. Everything
|
|
84
84
|
* split off here is put back, so the message the model sees is unchanged apart
|
|
@@ -229,7 +229,7 @@ export function resolveSlackWorkspaceRoute(input: SlackRouteInputs): SlackRouteR
|
|
|
229
229
|
//
|
|
230
230
|
// Only text the invoking human actually typed can address anything. A
|
|
231
231
|
// message shortcut and a reaction both carry SOMEONE ELSE'S message, so a
|
|
232
|
-
// prefix found there was never an instruction to
|
|
232
|
+
// prefix found there was never an instruction to Opengeni.
|
|
233
233
|
const prefix = AUTHORED_BY_INVOKER.has(input.entry.triggerKind)
|
|
234
234
|
? parseSlackWorkspacePrefix(splitSlackLeadingMention(input.entry.text, input.botUserId).rest)
|
|
235
235
|
: null;
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import {
|
|
2
|
+
resourceMountPath,
|
|
3
|
+
resourceMountPathCollisionKey,
|
|
4
|
+
type AccessGrant,
|
|
5
|
+
type GitHubRepository,
|
|
6
|
+
type RepositoryResourceRef,
|
|
7
|
+
} from "@opengeni/contracts";
|
|
8
|
+
import { listRecentSessionRepositoryResources } from "@opengeni/db";
|
|
9
|
+
import { hasPermission, type ApiRouteDeps } from "@opengeni/core";
|
|
10
|
+
import { githubRepositoryResourceRef, listWorkspaceGitHubRepositories } from "../github-access";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* A Slack task starts with at most this many repositories. Each one is a
|
|
14
|
+
* shallow, blob-filtered fetch before the first command, so the set stays
|
|
15
|
+
* small: the person's own most recently used repositories, not a catalog.
|
|
16
|
+
*/
|
|
17
|
+
export const SLACK_SESSION_RECENT_REPOSITORY_LIMIT = 5;
|
|
18
|
+
|
|
19
|
+
/** How far back the person's own sessions count as recent use. */
|
|
20
|
+
export const SLACK_SESSION_RECENT_REPOSITORY_WINDOW_MS = 30 * 24 * 60 * 60 * 1000;
|
|
21
|
+
|
|
22
|
+
function githubUriKey(uri: string): string | null {
|
|
23
|
+
try {
|
|
24
|
+
const url = new URL(uri);
|
|
25
|
+
const path = url.pathname
|
|
26
|
+
.replace(/^\/+|\/+$/gu, "")
|
|
27
|
+
.replace(/\.git$/iu, "")
|
|
28
|
+
.toLowerCase();
|
|
29
|
+
return path ? `${url.host.toLowerCase()}/${path}` : null;
|
|
30
|
+
} catch {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function positiveRepositoryId(value: unknown): number | null {
|
|
36
|
+
if (typeof value === "number" && Number.isSafeInteger(value) && value > 0) return value;
|
|
37
|
+
if (typeof value === "string" && /^[1-9]\d{0,15}$/u.test(value)) {
|
|
38
|
+
const parsed = Number(value);
|
|
39
|
+
return Number.isSafeInteger(parsed) ? parsed : null;
|
|
40
|
+
}
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Pick a Slack task's repositories: the person's recently used repositories,
|
|
46
|
+
* in recency order, that the workspace GitHub App catalog still offers them.
|
|
47
|
+
*
|
|
48
|
+
* `recent` is a usage signal only, and only repositories the person attached
|
|
49
|
+
* themselves count: an automatically attached (`optional`) one never does. A
|
|
50
|
+
* repository reaches the task only through its current catalog entry (the
|
|
51
|
+
* same catalog and `github:use` permission as the website picker), on its
|
|
52
|
+
* default branch, so a Slack task never reaches a repository the person could
|
|
53
|
+
* not attach on the website today. Archived and
|
|
54
|
+
* empty repositories are skipped when GitHub reported that, because a clone of
|
|
55
|
+
* an empty repository has nothing to check out. Every returned resource is
|
|
56
|
+
* best effort (`optional`): one failed clone warns instead of failing setup.
|
|
57
|
+
*/
|
|
58
|
+
export function selectRecentRepositoryResources(
|
|
59
|
+
recent: readonly RepositoryResourceRef[],
|
|
60
|
+
catalog: readonly GitHubRepository[],
|
|
61
|
+
limit = SLACK_SESSION_RECENT_REPOSITORY_LIMIT,
|
|
62
|
+
): RepositoryResourceRef[] {
|
|
63
|
+
const byId = new Map<number, GitHubRepository[]>();
|
|
64
|
+
const byUri = new Map<string, GitHubRepository>();
|
|
65
|
+
const ordered = [...catalog].sort(
|
|
66
|
+
(left, right) => left.installationId - right.installationId || left.id - right.id,
|
|
67
|
+
);
|
|
68
|
+
for (const repository of ordered) {
|
|
69
|
+
byId.set(repository.id, [...(byId.get(repository.id) ?? []), repository]);
|
|
70
|
+
const key = githubUriKey(repository.cloneUrl);
|
|
71
|
+
if (key && !byUri.has(key)) byUri.set(key, repository);
|
|
72
|
+
}
|
|
73
|
+
const chosen = new Set<string>();
|
|
74
|
+
const mountKeys = new Set<string>();
|
|
75
|
+
const resources: RepositoryResourceRef[] = [];
|
|
76
|
+
for (const used of recent) {
|
|
77
|
+
if (resources.length >= limit) break;
|
|
78
|
+
// A repository Opengeni attached automatically is not a choice the person
|
|
79
|
+
// made; counting it would keep re-attaching it to every later Slack task.
|
|
80
|
+
if (used.optional === true) continue;
|
|
81
|
+
const repositoryId = positiveRepositoryId(
|
|
82
|
+
used.githubRepositoryId ?? (used.provider === "github" ? used.repositoryId : undefined),
|
|
83
|
+
);
|
|
84
|
+
const installationId = positiveRepositoryId(
|
|
85
|
+
used.githubInstallationId ?? (used.provider === "github" ? used.installationId : undefined),
|
|
86
|
+
);
|
|
87
|
+
const candidates = repositoryId !== null ? (byId.get(repositoryId) ?? []) : [];
|
|
88
|
+
const uriKey = githubUriKey(used.uri);
|
|
89
|
+
const match =
|
|
90
|
+
candidates.find((candidate) => candidate.installationId === installationId) ??
|
|
91
|
+
candidates[0] ??
|
|
92
|
+
(uriKey ? byUri.get(uriKey) : undefined);
|
|
93
|
+
if (!match) continue;
|
|
94
|
+
const identity = `${match.installationId}:${match.id}`;
|
|
95
|
+
if (chosen.has(identity)) continue;
|
|
96
|
+
chosen.add(identity);
|
|
97
|
+
if (match.archived === true || match.sizeKb === 0) continue;
|
|
98
|
+
let resource: RepositoryResourceRef;
|
|
99
|
+
try {
|
|
100
|
+
resource = { ...githubRepositoryResourceRef(match), optional: true };
|
|
101
|
+
} catch {
|
|
102
|
+
// A malformed provider URL is one unusable repository, not a failed task.
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
const mountKey = resourceMountPathCollisionKey(resourceMountPath(resource));
|
|
106
|
+
if (mountKeys.has(mountKey)) continue;
|
|
107
|
+
mountKeys.add(mountKey);
|
|
108
|
+
resources.push(resource);
|
|
109
|
+
}
|
|
110
|
+
return resources;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* The repositories a new Slack task starts with: the person's own recently
|
|
115
|
+
* used repositories in this workspace (their own top-level sessions active in
|
|
116
|
+
* the last 30 days, most recent first, at most five), limited to what the
|
|
117
|
+
* workspace GitHub App catalog offers them now. None when they have none; the
|
|
118
|
+
* agent can still find and clone repositories through its GitHub tools.
|
|
119
|
+
*
|
|
120
|
+
* GitHub is asked only when there is something to look up. A GitHub outage or
|
|
121
|
+
* an unconfigured App starts the task without repositories instead of failing
|
|
122
|
+
* it, with a log line for diagnosis.
|
|
123
|
+
*/
|
|
124
|
+
export async function slackRecentRepositoryResources(
|
|
125
|
+
deps: ApiRouteDeps,
|
|
126
|
+
grant: Pick<AccessGrant, "permissions" | "subjectId">,
|
|
127
|
+
workspaceId: string,
|
|
128
|
+
now: Date = new Date(),
|
|
129
|
+
): Promise<RepositoryResourceRef[]> {
|
|
130
|
+
if (!hasPermission(grant.permissions, "github:use")) return [];
|
|
131
|
+
const recent = await listRecentSessionRepositoryResources(deps.db, {
|
|
132
|
+
workspaceId,
|
|
133
|
+
subjectId: grant.subjectId,
|
|
134
|
+
since: new Date(now.getTime() - SLACK_SESSION_RECENT_REPOSITORY_WINDOW_MS),
|
|
135
|
+
});
|
|
136
|
+
if (!recent.some((resource) => resource.optional !== true)) return [];
|
|
137
|
+
let catalog: GitHubRepository[];
|
|
138
|
+
try {
|
|
139
|
+
catalog = await listWorkspaceGitHubRepositories(deps, workspaceId);
|
|
140
|
+
} catch (error) {
|
|
141
|
+
console.error("[slack-interactions] workspace repositories unavailable", {
|
|
142
|
+
workspaceId,
|
|
143
|
+
errorCode: (error instanceof Error ? error.name : "unknown")
|
|
144
|
+
.toLowerCase()
|
|
145
|
+
.replace(/[^a-z0-9_-]/gu, "_")
|
|
146
|
+
.slice(0, 128),
|
|
147
|
+
});
|
|
148
|
+
return [];
|
|
149
|
+
}
|
|
150
|
+
return selectRecentRepositoryResources(recent, catalog);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
const OPEN_GENI_LINK_PATTERN =
|
|
154
|
+
/https?:\/\/([^\s/<>|?#]+)(\/workspaces\/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}(?:\/sessions\/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})?)/giu;
|
|
155
|
+
|
|
156
|
+
const MAX_OTHER_DEPLOYMENT_LINKS = 5;
|
|
157
|
+
|
|
158
|
+
export type OtherDeploymentLink = { url: string; host: string };
|
|
159
|
+
|
|
160
|
+
function siteOf(hostname: string): string | null {
|
|
161
|
+
if (/^[\d.]+$/u.test(hostname) || hostname.includes(":")) return null;
|
|
162
|
+
const labels = hostname.split(".").filter(Boolean);
|
|
163
|
+
return labels.length >= 2 ? labels.slice(-2).join(".") : null;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Opengeni workspace or session links in `text` that point at a sibling
|
|
168
|
+
* deployment of this one (for example staging versus production).
|
|
169
|
+
*
|
|
170
|
+
* A sibling is a different host under the same parent domain as this
|
|
171
|
+
* deployment's web origin, carrying Opengeni's own route shape. Anything else
|
|
172
|
+
* is left alone: an unrelated product's URL must never be described as
|
|
173
|
+
* another Opengeni.
|
|
174
|
+
*/
|
|
175
|
+
export function otherDeploymentLinks(
|
|
176
|
+
text: string,
|
|
177
|
+
webBaseUrl: string | null | undefined,
|
|
178
|
+
): OtherDeploymentLink[] {
|
|
179
|
+
if (!webBaseUrl) return [];
|
|
180
|
+
let own: URL;
|
|
181
|
+
try {
|
|
182
|
+
own = new URL(webBaseUrl);
|
|
183
|
+
} catch {
|
|
184
|
+
return [];
|
|
185
|
+
}
|
|
186
|
+
const ownSite = siteOf(own.hostname.toLowerCase());
|
|
187
|
+
if (!ownSite) return [];
|
|
188
|
+
const found = new Map<string, OtherDeploymentLink>();
|
|
189
|
+
for (const match of text.matchAll(OPEN_GENI_LINK_PATTERN)) {
|
|
190
|
+
let url: URL;
|
|
191
|
+
try {
|
|
192
|
+
url = new URL(`https://${match[1]}${match[2]}`);
|
|
193
|
+
} catch {
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
const host = url.host.toLowerCase();
|
|
197
|
+
if (host === own.host.toLowerCase()) continue;
|
|
198
|
+
if (siteOf(url.hostname.toLowerCase()) !== ownSite) continue;
|
|
199
|
+
const canonical = `${match[0].split("://", 1)[0]!.toLowerCase()}://${host}${match[2]!.toLowerCase()}`;
|
|
200
|
+
if (!found.has(canonical)) found.set(canonical, { url: canonical, host });
|
|
201
|
+
if (found.size >= MAX_OTHER_DEPLOYMENT_LINKS) break;
|
|
202
|
+
}
|
|
203
|
+
return [...found.values()];
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Model context for links to another Opengeni deployment. A session id from
|
|
208
|
+
* one deployment does not exist in another, so without this the agent reports
|
|
209
|
+
* "Session not found or access denied" and asks for access that no grant in
|
|
210
|
+
* this deployment can give.
|
|
211
|
+
*/
|
|
212
|
+
export function otherDeploymentLinkContext(
|
|
213
|
+
text: string,
|
|
214
|
+
webBaseUrl: string | null | undefined,
|
|
215
|
+
): string | null {
|
|
216
|
+
const links = otherDeploymentLinks(text, webBaseUrl);
|
|
217
|
+
if (links.length === 0 || !webBaseUrl) return null;
|
|
218
|
+
const ownHost = new URL(webBaseUrl).host.toLowerCase();
|
|
219
|
+
return [
|
|
220
|
+
`Links to a different Opengeni deployment (this one is ${ownHost}):`,
|
|
221
|
+
...links.map((link) => `- ${link.url} is on ${link.host}.`),
|
|
222
|
+
`Workspaces, sessions and files from another deployment do not exist here, so looking up their ids in this deployment always fails as not found. Tell the user the link is for ${[...new Set(links.map((link) => link.host))].join(" and ")}, not ${ownHost}, instead of reporting the session as missing or asking for access to it.`,
|
|
223
|
+
].join("\n");
|
|
224
|
+
}
|