@opengeni/api-router 3.0.1 → 3.0.2-canary.38894290271001
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-AJ62T5QN.js → chunk-GBUJ2DYZ.js} +80507 -39878
- package/dist/chunk-GBUJ2DYZ.js.map +1 -0
- package/dist/chunk-OGQDXVXY.js +18 -0
- package/dist/chunk-OGQDXVXY.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 +150 -49
- 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
|
@@ -23,6 +23,9 @@ import {
|
|
|
23
23
|
import type { Context, Hono } from "hono";
|
|
24
24
|
import { HTTPException } from "hono/http-exception";
|
|
25
25
|
import { z } from "zod";
|
|
26
|
+
import { admitManagedSignInMutation } from "./managed-sign-in-methods";
|
|
27
|
+
import { managedAuthSecretRequestDigest } from "@opengeni/core/managed-auth-session-sets";
|
|
28
|
+
import { deliverManagedSignInNotification } from "../auth/managed-sign-in-notifications";
|
|
26
29
|
|
|
27
30
|
const BindingId = z.string().uuid();
|
|
28
31
|
|
|
@@ -86,6 +89,7 @@ async function mutate(
|
|
|
86
89
|
operationId: string;
|
|
87
90
|
expectedIdentityRevision: number;
|
|
88
91
|
reason: string;
|
|
92
|
+
verifiedManagedRecovery?: boolean;
|
|
89
93
|
},
|
|
90
94
|
): Promise<Response> {
|
|
91
95
|
const identity = await requestIdentity(context, deps);
|
|
@@ -104,10 +108,27 @@ async function mutate(
|
|
|
104
108
|
...(input.providerId ? { providerId: input.providerId } : {}),
|
|
105
109
|
...(input.providerAccountId ? { providerAccountId: input.providerAccountId } : {}),
|
|
106
110
|
reason: input.reason,
|
|
111
|
+
...(input.verifiedManagedRecovery
|
|
112
|
+
? {
|
|
113
|
+
verifiedRecovery: {
|
|
114
|
+
authSessionId: identity.authSessionId,
|
|
115
|
+
requestDigest: managedAuthSecretRequestDigest(
|
|
116
|
+
deps.settings.betterAuthSecret!,
|
|
117
|
+
input,
|
|
118
|
+
),
|
|
119
|
+
},
|
|
120
|
+
}
|
|
121
|
+
: {}),
|
|
107
122
|
...(actorFence ? { actorFence } : {}),
|
|
108
123
|
}),
|
|
109
124
|
);
|
|
110
125
|
if (actorFence) markManagedAuthRequestActorTransitionApplied(context.req.raw);
|
|
126
|
+
if (input.verifiedManagedRecovery)
|
|
127
|
+
await deliverManagedSignInNotification(
|
|
128
|
+
deps.db,
|
|
129
|
+
deps.managedEmailTransport,
|
|
130
|
+
input.operationId,
|
|
131
|
+
);
|
|
111
132
|
return context.json(response);
|
|
112
133
|
} catch (error) {
|
|
113
134
|
return identityError(context, error);
|
|
@@ -132,6 +153,11 @@ export function registerCanonicalHumanIdentityRoutes(app: Hono, deps: ApiRouteDe
|
|
|
132
153
|
|
|
133
154
|
app.post(`${base}/login-bindings`, async (context) => {
|
|
134
155
|
const request = await parseBody(context, LinkCanonicalHumanLoginBindingRequest);
|
|
156
|
+
if (["google", "github", "credential"].includes(request.providerId.trim().toLowerCase())) {
|
|
157
|
+
throw new HTTPException(403, {
|
|
158
|
+
message: "Use personal sign-in method settings with fresh provider proof",
|
|
159
|
+
});
|
|
160
|
+
}
|
|
135
161
|
return await mutate(context, deps, {
|
|
136
162
|
operationType: "link",
|
|
137
163
|
...request,
|
|
@@ -141,6 +167,19 @@ export function registerCanonicalHumanIdentityRoutes(app: Hono, deps: ApiRouteDe
|
|
|
141
167
|
|
|
142
168
|
app.delete(`${base}/login-bindings/:bindingId`, async (context) => {
|
|
143
169
|
const request = await parseBody(context, CanonicalHumanBindingOperationRequest);
|
|
170
|
+
const actor = await requestIdentity(context, deps);
|
|
171
|
+
const projection = await getCanonicalHumanIdentityProjection(deps.db, actor.authUserId);
|
|
172
|
+
if (
|
|
173
|
+
projection.loginBindings.some(
|
|
174
|
+
(binding) =>
|
|
175
|
+
binding.id === bindingId(context) &&
|
|
176
|
+
["google", "github", "credential"].includes(binding.providerId),
|
|
177
|
+
)
|
|
178
|
+
) {
|
|
179
|
+
throw new HTTPException(403, {
|
|
180
|
+
message: "Use personal sign-in method settings with last-method protection",
|
|
181
|
+
});
|
|
182
|
+
}
|
|
144
183
|
return await mutate(context, deps, {
|
|
145
184
|
operationType: "unlink",
|
|
146
185
|
bindingId: bindingId(context),
|
|
@@ -151,6 +190,19 @@ export function registerCanonicalHumanIdentityRoutes(app: Hono, deps: ApiRouteDe
|
|
|
151
190
|
|
|
152
191
|
app.post(`${base}/login-bindings/:bindingId/recovery`, async (context) => {
|
|
153
192
|
const request = await parseBody(context, CanonicalHumanBindingOperationRequest);
|
|
193
|
+
const actor = await requestIdentity(context, deps);
|
|
194
|
+
const projection = await getCanonicalHumanIdentityProjection(deps.db, actor.authUserId);
|
|
195
|
+
if (
|
|
196
|
+
projection.loginBindings.some(
|
|
197
|
+
(binding) =>
|
|
198
|
+
binding.id === bindingId(context) &&
|
|
199
|
+
["google", "github", "credential"].includes(binding.providerId),
|
|
200
|
+
)
|
|
201
|
+
) {
|
|
202
|
+
throw new HTTPException(403, {
|
|
203
|
+
message: "Managed-provider recovery cannot be initiated through raw binding management",
|
|
204
|
+
});
|
|
205
|
+
}
|
|
154
206
|
return await mutate(context, deps, {
|
|
155
207
|
operationType: "begin_recovery",
|
|
156
208
|
bindingId: bindingId(context),
|
|
@@ -161,11 +213,20 @@ export function registerCanonicalHumanIdentityRoutes(app: Hono, deps: ApiRouteDe
|
|
|
161
213
|
|
|
162
214
|
app.post(`${base}/login-bindings/:bindingId/recovery/complete`, async (context) => {
|
|
163
215
|
const request = await parseBody(context, CanonicalHumanBindingOperationRequest);
|
|
216
|
+
const actor = await requestIdentity(context, deps);
|
|
217
|
+
const projection = await getCanonicalHumanIdentityProjection(deps.db, actor.authUserId);
|
|
218
|
+
const managed = projection.loginBindings.some(
|
|
219
|
+
(binding) =>
|
|
220
|
+
binding.id === bindingId(context) &&
|
|
221
|
+
["google", "github", "credential"].includes(binding.providerId),
|
|
222
|
+
);
|
|
223
|
+
if (managed) await admitManagedSignInMutation(context, deps);
|
|
164
224
|
return await mutate(context, deps, {
|
|
165
225
|
operationType: "recover",
|
|
166
226
|
bindingId: bindingId(context),
|
|
167
227
|
...request,
|
|
168
228
|
operationId: request.operationId ?? randomUUID(),
|
|
229
|
+
...(managed ? { verifiedManagedRecovery: true } : {}),
|
|
169
230
|
});
|
|
170
231
|
});
|
|
171
232
|
}
|
|
@@ -3,9 +3,21 @@ import {
|
|
|
3
3
|
CreateCapabilityCatalogItemRequest,
|
|
4
4
|
DiscoverMcpCapabilitiesResponse,
|
|
5
5
|
EnableCapabilityRequest,
|
|
6
|
+
ConnectorToolPermissionsResponse,
|
|
7
|
+
UpdateConnectorToolPermissionsRequest,
|
|
8
|
+
SessionMcpToolPermissionsQuery,
|
|
9
|
+
SessionMcpToolPermissionsResponse,
|
|
10
|
+
UpdateSessionMcpToolPermissionsRequest,
|
|
6
11
|
} from "@opengeni/contracts";
|
|
7
12
|
import type { Hono } from "hono";
|
|
8
|
-
import {
|
|
13
|
+
import {
|
|
14
|
+
requireAccessGrant,
|
|
15
|
+
requireAccessGrantAuthorization,
|
|
16
|
+
getConnectorToolPermissions,
|
|
17
|
+
updateConnectorToolPermissions,
|
|
18
|
+
getSessionMcpToolPermissions,
|
|
19
|
+
updateSessionMcpToolPermissions,
|
|
20
|
+
} from "@opengeni/core";
|
|
9
21
|
import type { ApiRouteDeps } from "@opengeni/core";
|
|
10
22
|
import {
|
|
11
23
|
buildCapabilityCatalog,
|
|
@@ -15,6 +27,7 @@ import {
|
|
|
15
27
|
enableCapability,
|
|
16
28
|
officialMcpRegistryUrl,
|
|
17
29
|
} from "@opengeni/core";
|
|
30
|
+
import { isPersonalConnectionOwnerPrincipal } from "../connection-ownership";
|
|
18
31
|
import { boundedLimit } from "../http/common";
|
|
19
32
|
import { z } from "zod";
|
|
20
33
|
import pluginSnapshot from "../../../../data/catalog/plugins-snapshot.json";
|
|
@@ -22,6 +35,7 @@ const discoverablePlugins = pluginSnapshot.sources
|
|
|
22
35
|
.flatMap((source) => source.entries.map((entry) => ({ ...entry, provider: source.provider })))
|
|
23
36
|
.sort((a, b) => a.displayName.localeCompare(b.displayName) || a.id.localeCompare(b.id));
|
|
24
37
|
import { inspectMcpAuthentication } from "../integrations/oauth-client";
|
|
38
|
+
import { parseRequestJson } from "../http/request-body";
|
|
25
39
|
|
|
26
40
|
export function registerCapabilityRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
27
41
|
const { db, settings } = deps;
|
|
@@ -66,7 +80,7 @@ export function registerCapabilityRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
66
80
|
});
|
|
67
81
|
app.post("/v1/workspaces/:workspaceId/capabilities/discovery/mcp-auth", async (c) => {
|
|
68
82
|
await requireAccessGrant(c, deps, c.req.param("workspaceId"), "workspace:read");
|
|
69
|
-
const { url } = z.object({ url: z.string().url().max(2048) })
|
|
83
|
+
const { url } = await parseRequestJson(c, z.object({ url: z.string().url().max(2048) }));
|
|
70
84
|
return c.json(await inspectMcpAuthentication(url, settings));
|
|
71
85
|
});
|
|
72
86
|
|
|
@@ -75,7 +89,13 @@ export function registerCapabilityRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
75
89
|
const grant = await requireAccessGrant(c, deps, workspaceId, "workspace:read");
|
|
76
90
|
return c.json(
|
|
77
91
|
CapabilityCatalogResponse.parse(
|
|
78
|
-
await buildCapabilityCatalog({
|
|
92
|
+
await buildCapabilityCatalog({
|
|
93
|
+
db,
|
|
94
|
+
workspaceId,
|
|
95
|
+
settings,
|
|
96
|
+
subjectId: grant.subjectId,
|
|
97
|
+
accountId: grant.accountId,
|
|
98
|
+
}),
|
|
79
99
|
),
|
|
80
100
|
);
|
|
81
101
|
});
|
|
@@ -83,7 +103,7 @@ export function registerCapabilityRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
83
103
|
app.post("/v1/workspaces/:workspaceId/capabilities", async (c) => {
|
|
84
104
|
const workspaceId = c.req.param("workspaceId");
|
|
85
105
|
const grant = await requireAccessGrant(c, deps, workspaceId, "capabilities:manage");
|
|
86
|
-
const payload =
|
|
106
|
+
const payload = await parseRequestJson(c, CreateCapabilityCatalogItemRequest);
|
|
87
107
|
return c.json(
|
|
88
108
|
await createCatalogItem({ db, accountId: grant.accountId, workspaceId, payload }),
|
|
89
109
|
201,
|
|
@@ -110,10 +130,97 @@ export function registerCapabilityRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
110
130
|
);
|
|
111
131
|
});
|
|
112
132
|
|
|
133
|
+
app.get("/v1/workspaces/:workspaceId/capabilities/:capabilityId/tool-permissions", async (c) => {
|
|
134
|
+
const workspaceId = c.req.param("workspaceId");
|
|
135
|
+
const access = await requireAccessGrantAuthorization(c, deps, workspaceId, "workspace:read");
|
|
136
|
+
return c.json(
|
|
137
|
+
ConnectorToolPermissionsResponse.parse(
|
|
138
|
+
await getConnectorToolPermissions({
|
|
139
|
+
db,
|
|
140
|
+
settings,
|
|
141
|
+
workspaceId,
|
|
142
|
+
grant: access.grant,
|
|
143
|
+
capabilityId: decodeURIComponent(c.req.param("capabilityId")),
|
|
144
|
+
personalOwnerVerified: isPersonalConnectionOwnerPrincipal(access),
|
|
145
|
+
...(c.req.query("connectionId") ? { connectionId: c.req.query("connectionId")! } : {}),
|
|
146
|
+
...(c.req.query("instanceKey") ? { instanceKey: c.req.query("instanceKey")! } : {}),
|
|
147
|
+
}),
|
|
148
|
+
),
|
|
149
|
+
);
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
app.patch(
|
|
153
|
+
"/v1/workspaces/:workspaceId/capabilities/:capabilityId/tool-permissions",
|
|
154
|
+
async (c) => {
|
|
155
|
+
const workspaceId = c.req.param("workspaceId");
|
|
156
|
+
const access = await requireAccessGrantAuthorization(
|
|
157
|
+
c,
|
|
158
|
+
deps,
|
|
159
|
+
workspaceId,
|
|
160
|
+
"capabilities:manage",
|
|
161
|
+
);
|
|
162
|
+
const payload = UpdateConnectorToolPermissionsRequest.safeParse(await c.req.json());
|
|
163
|
+
if (!payload.success) return c.json({ error: "Invalid connector permission target" }, 400);
|
|
164
|
+
await updateConnectorToolPermissions({
|
|
165
|
+
db,
|
|
166
|
+
settings,
|
|
167
|
+
workspaceId,
|
|
168
|
+
grant: access.grant,
|
|
169
|
+
capabilityId: decodeURIComponent(c.req.param("capabilityId")),
|
|
170
|
+
personalOwnerVerified: isPersonalConnectionOwnerPrincipal(access),
|
|
171
|
+
payload: payload.data,
|
|
172
|
+
});
|
|
173
|
+
return c.json({ saved: true });
|
|
174
|
+
},
|
|
175
|
+
);
|
|
176
|
+
|
|
177
|
+
// Host-attached session MCP servers: the host names the server id and exact
|
|
178
|
+
// URL it attaches; rules apply to that server in every workspace session.
|
|
179
|
+
app.get("/v1/workspaces/:workspaceId/session-mcp-tool-permissions", async (c) => {
|
|
180
|
+
const workspaceId = c.req.param("workspaceId");
|
|
181
|
+
const access = await requireAccessGrantAuthorization(c, deps, workspaceId, "workspace:read");
|
|
182
|
+
const query = SessionMcpToolPermissionsQuery.safeParse({
|
|
183
|
+
serverId: c.req.query("serverId"),
|
|
184
|
+
url: c.req.query("url"),
|
|
185
|
+
});
|
|
186
|
+
if (!query.success) return c.json({ error: "Invalid session MCP server" }, 400);
|
|
187
|
+
return c.json(
|
|
188
|
+
SessionMcpToolPermissionsResponse.parse(
|
|
189
|
+
await getSessionMcpToolPermissions({
|
|
190
|
+
db,
|
|
191
|
+
workspaceId,
|
|
192
|
+
grant: access.grant,
|
|
193
|
+
query: query.data,
|
|
194
|
+
}),
|
|
195
|
+
),
|
|
196
|
+
);
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
app.patch("/v1/workspaces/:workspaceId/session-mcp-tool-permissions", async (c) => {
|
|
200
|
+
const workspaceId = c.req.param("workspaceId");
|
|
201
|
+
const access = await requireAccessGrantAuthorization(
|
|
202
|
+
c,
|
|
203
|
+
deps,
|
|
204
|
+
workspaceId,
|
|
205
|
+
"capabilities:manage",
|
|
206
|
+
);
|
|
207
|
+
const payload = UpdateSessionMcpToolPermissionsRequest.safeParse(
|
|
208
|
+
await c.req.json().catch(() => null),
|
|
209
|
+
);
|
|
210
|
+
if (!payload.success) return c.json({ error: "Invalid session MCP permission target" }, 400);
|
|
211
|
+
await updateSessionMcpToolPermissions({
|
|
212
|
+
db,
|
|
213
|
+
workspaceId,
|
|
214
|
+
grant: access.grant,
|
|
215
|
+
payload: payload.data,
|
|
216
|
+
});
|
|
217
|
+
return c.json({ saved: true });
|
|
218
|
+
});
|
|
219
|
+
|
|
113
220
|
app.post("/v1/workspaces/:workspaceId/capabilities/:capabilityId/enable", async (c) => {
|
|
114
221
|
const workspaceId = c.req.param("workspaceId");
|
|
115
222
|
const grant = await requireAccessGrant(c, deps, workspaceId, "capabilities:manage");
|
|
116
|
-
const payload =
|
|
223
|
+
const payload = await parseRequestJson(c, EnableCapabilityRequest);
|
|
117
224
|
const installation = await enableCapability({
|
|
118
225
|
db,
|
|
119
226
|
grant,
|
package/src/routes/channels.ts
CHANGED
|
@@ -16,6 +16,7 @@ import type { Hono } from "hono";
|
|
|
16
16
|
import { HTTPException } from "hono/http-exception";
|
|
17
17
|
import { requireAccessGrant } from "@opengeni/core";
|
|
18
18
|
import type { ApiRouteDeps } from "@opengeni/core";
|
|
19
|
+
import { parseRequestJson } from "../http/request-body";
|
|
19
20
|
|
|
20
21
|
// Workspace-shared channels organize root sessions ("workstreams") by work
|
|
21
22
|
// type in the rail. Deliberately session-permission-gated (not workspace:admin):
|
|
@@ -42,7 +43,7 @@ export function registerChannelRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
42
43
|
app.post("/v1/workspaces/:workspaceId/channels", async (c) => {
|
|
43
44
|
const workspaceId = c.req.param("workspaceId");
|
|
44
45
|
const grant = await requireAccessGrant(c, deps, workspaceId, "sessions:create");
|
|
45
|
-
const payload =
|
|
46
|
+
const payload = await parseRequestJson(c, CreateChannelRequest);
|
|
46
47
|
try {
|
|
47
48
|
const channel = await createChannel(db, {
|
|
48
49
|
accountId: grant.accountId,
|
|
@@ -63,7 +64,7 @@ export function registerChannelRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
63
64
|
app.patch("/v1/workspaces/:workspaceId/channels/:channelId", async (c) => {
|
|
64
65
|
const workspaceId = c.req.param("workspaceId");
|
|
65
66
|
await requireAccessGrant(c, deps, workspaceId, "sessions:create");
|
|
66
|
-
const payload =
|
|
67
|
+
const payload = await parseRequestJson(c, UpdateChannelRequest);
|
|
67
68
|
try {
|
|
68
69
|
const channel = await updateChannel(
|
|
69
70
|
db,
|
|
@@ -86,7 +87,7 @@ export function registerChannelRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
86
87
|
app.put("/v1/workspaces/:workspaceId/channels/order", async (c) => {
|
|
87
88
|
const workspaceId = c.req.param("workspaceId");
|
|
88
89
|
await requireAccessGrant(c, deps, workspaceId, "sessions:create");
|
|
89
|
-
const payload =
|
|
90
|
+
const payload = await parseRequestJson(c, ReorderChannelsRequest);
|
|
90
91
|
const channels = await reorderChannels(db, workspaceId, payload.channelIds);
|
|
91
92
|
if (!channels) {
|
|
92
93
|
throw new HTTPException(409, { message: "projects changed; refresh and try again" });
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type ApiRouteDeps,
|
|
3
|
+
ModelCallError,
|
|
4
|
+
type ModelCallOutput,
|
|
5
|
+
type ModelCallService,
|
|
6
|
+
requireAccessGrant,
|
|
7
|
+
} from "@opengeni/core";
|
|
8
|
+
import type { Context, Hono } from "hono";
|
|
9
|
+
import {
|
|
10
|
+
chatCompletionChunk,
|
|
11
|
+
chatCompletionError,
|
|
12
|
+
chatCompletionResponse,
|
|
13
|
+
chatCompletionUsage,
|
|
14
|
+
chatCompletionId,
|
|
15
|
+
parseChatCompletionRequest,
|
|
16
|
+
} from "../model-calls/chat-completions";
|
|
17
|
+
import { isModelCallAbort } from "../model-calls/service";
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* OpenAI-compatible stateless model calls. A stock OpenAI SDK works with its
|
|
21
|
+
* base URL set to `/v1/workspaces/{workspaceId}` and an Opengeni API key.
|
|
22
|
+
* Running one costs what the same model call costs inside a session, and
|
|
23
|
+
* requires the same `sessions:create` authority.
|
|
24
|
+
*/
|
|
25
|
+
export function registerChatCompletionRoutes(
|
|
26
|
+
app: Hono,
|
|
27
|
+
deps: ApiRouteDeps & { modelCalls: ModelCallService | null },
|
|
28
|
+
): void {
|
|
29
|
+
/** A public error, or null for a client abort (nothing left to answer). */
|
|
30
|
+
const publicError = (error: unknown, workspaceId: string): ModelCallError | null => {
|
|
31
|
+
if (error instanceof ModelCallError) return error;
|
|
32
|
+
if (isModelCallAbort(error)) return null;
|
|
33
|
+
deps.observability?.warn("chat completion failed unexpectedly", {
|
|
34
|
+
workspaceId,
|
|
35
|
+
errorName: error instanceof Error ? error.name : typeof error,
|
|
36
|
+
});
|
|
37
|
+
return new ModelCallError({
|
|
38
|
+
status: 500,
|
|
39
|
+
type: "api_error",
|
|
40
|
+
code: "internal_error",
|
|
41
|
+
message: "The model call failed.",
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
app.get("/v1/workspaces/:workspaceId/models", async (c) => {
|
|
46
|
+
const workspaceId = c.req.param("workspaceId");
|
|
47
|
+
const grant = await requireAccessGrant(c, deps, workspaceId, "sessions:create");
|
|
48
|
+
if (!deps.modelCalls) return errorResponse(c, unavailable());
|
|
49
|
+
try {
|
|
50
|
+
const models = await deps.modelCalls.listModels({
|
|
51
|
+
grant,
|
|
52
|
+
accountId: grant.accountId,
|
|
53
|
+
workspaceId,
|
|
54
|
+
subjectId: grant.subjectId,
|
|
55
|
+
});
|
|
56
|
+
return c.json({
|
|
57
|
+
object: "list",
|
|
58
|
+
data: models.map((model) => ({
|
|
59
|
+
id: model.id,
|
|
60
|
+
object: "model",
|
|
61
|
+
created: 0,
|
|
62
|
+
owned_by: model.providerLabel,
|
|
63
|
+
name: model.label,
|
|
64
|
+
})),
|
|
65
|
+
});
|
|
66
|
+
} catch (error) {
|
|
67
|
+
return errorResponse(c, publicError(error, workspaceId));
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
app.post("/v1/workspaces/:workspaceId/chat/completions", async (c) => {
|
|
72
|
+
const workspaceId = c.req.param("workspaceId");
|
|
73
|
+
const grant = await requireAccessGrant(c, deps, workspaceId, "sessions:create");
|
|
74
|
+
const service = deps.modelCalls;
|
|
75
|
+
if (!service) return errorResponse(c, unavailable());
|
|
76
|
+
let parsed: ReturnType<typeof parseChatCompletionRequest>;
|
|
77
|
+
try {
|
|
78
|
+
parsed = parseChatCompletionRequest(await c.req.json().catch(() => undefined));
|
|
79
|
+
} catch (error) {
|
|
80
|
+
return errorResponse(c, publicError(error, workspaceId));
|
|
81
|
+
}
|
|
82
|
+
// Server-generated: a client-chosen id would let a reused settlement key
|
|
83
|
+
// make later calls free.
|
|
84
|
+
const requestId = crypto.randomUUID();
|
|
85
|
+
const created = Math.floor(Date.now() / 1000);
|
|
86
|
+
const abort = new AbortController();
|
|
87
|
+
const clientSignal = c.req.raw.signal;
|
|
88
|
+
const onClientAbort = () => abort.abort();
|
|
89
|
+
if (clientSignal.aborted) abort.abort();
|
|
90
|
+
else clientSignal.addEventListener("abort", onClientAbort, { once: true });
|
|
91
|
+
const caller = {
|
|
92
|
+
grant,
|
|
93
|
+
accountId: grant.accountId,
|
|
94
|
+
workspaceId,
|
|
95
|
+
subjectId: grant.subjectId,
|
|
96
|
+
model: parsed.model,
|
|
97
|
+
request: parsed.request,
|
|
98
|
+
requestId,
|
|
99
|
+
signal: abort.signal,
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
if (!parsed.stream) {
|
|
103
|
+
try {
|
|
104
|
+
const output = await service.call(caller);
|
|
105
|
+
return c.json(
|
|
106
|
+
chatCompletionResponse({
|
|
107
|
+
requestId,
|
|
108
|
+
created,
|
|
109
|
+
model: output.model,
|
|
110
|
+
result: output.result,
|
|
111
|
+
}),
|
|
112
|
+
);
|
|
113
|
+
} catch (error) {
|
|
114
|
+
return errorResponse(c, publicError(error, workspaceId));
|
|
115
|
+
} finally {
|
|
116
|
+
clientSignal.removeEventListener("abort", onClientAbort);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Streaming: the status is decided by the first model output. A refusal
|
|
121
|
+
// or failure before any output is an ordinary JSON error response.
|
|
122
|
+
const encoder = new TextEncoder();
|
|
123
|
+
let controller: ReadableStreamDefaultController<Uint8Array> | null = null;
|
|
124
|
+
let closed = false;
|
|
125
|
+
const body = new ReadableStream<Uint8Array>({
|
|
126
|
+
start(streamController) {
|
|
127
|
+
controller = streamController;
|
|
128
|
+
},
|
|
129
|
+
cancel() {
|
|
130
|
+
closed = true;
|
|
131
|
+
abort.abort();
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
const send = (payload: unknown) => {
|
|
135
|
+
if (closed || !controller) return;
|
|
136
|
+
const data = typeof payload === "string" ? payload : JSON.stringify(payload);
|
|
137
|
+
controller.enqueue(encoder.encode(`data: ${data}\n\n`));
|
|
138
|
+
};
|
|
139
|
+
const close = () => {
|
|
140
|
+
if (closed || !controller) return;
|
|
141
|
+
closed = true;
|
|
142
|
+
controller.close();
|
|
143
|
+
};
|
|
144
|
+
let model: string | null = null;
|
|
145
|
+
let opened = false;
|
|
146
|
+
let signalOpened!: () => void;
|
|
147
|
+
const firstOutput = new Promise<void>((resolve) => {
|
|
148
|
+
signalOpened = resolve;
|
|
149
|
+
});
|
|
150
|
+
const chunk = (
|
|
151
|
+
delta: { role?: "assistant"; content?: string },
|
|
152
|
+
finishReason: null | ModelCallOutput["result"]["finishReason"],
|
|
153
|
+
) =>
|
|
154
|
+
chatCompletionChunk({
|
|
155
|
+
requestId,
|
|
156
|
+
created,
|
|
157
|
+
model: model ?? parsed.model ?? "",
|
|
158
|
+
delta,
|
|
159
|
+
finishReason,
|
|
160
|
+
includeUsage: parsed.includeUsage,
|
|
161
|
+
});
|
|
162
|
+
const open = () => {
|
|
163
|
+
if (opened) return;
|
|
164
|
+
opened = true;
|
|
165
|
+
send(chunk({ role: "assistant", content: "" }, null));
|
|
166
|
+
signalOpened();
|
|
167
|
+
};
|
|
168
|
+
const completion = service.call({
|
|
169
|
+
...caller,
|
|
170
|
+
onTextDelta: (delta) => {
|
|
171
|
+
open();
|
|
172
|
+
send(chunk({ content: delta }, null));
|
|
173
|
+
},
|
|
174
|
+
});
|
|
175
|
+
const first = await Promise.race([
|
|
176
|
+
firstOutput.then(() => ({ kind: "output" as const })),
|
|
177
|
+
completion.then(
|
|
178
|
+
(output) => ({ kind: "done" as const, output }),
|
|
179
|
+
(error: unknown) => ({ kind: "failed" as const, error }),
|
|
180
|
+
),
|
|
181
|
+
]);
|
|
182
|
+
if (first.kind === "failed" && !opened) {
|
|
183
|
+
clientSignal.removeEventListener("abort", onClientAbort);
|
|
184
|
+
return errorResponse(c, publicError(first.error, workspaceId));
|
|
185
|
+
}
|
|
186
|
+
open();
|
|
187
|
+
void completion
|
|
188
|
+
.then((output) => {
|
|
189
|
+
model = output.model;
|
|
190
|
+
send(chunk({}, output.result.finishReason));
|
|
191
|
+
if (parsed.includeUsage) {
|
|
192
|
+
send({
|
|
193
|
+
id: chatCompletionId(requestId),
|
|
194
|
+
object: "chat.completion.chunk",
|
|
195
|
+
created,
|
|
196
|
+
model: output.model,
|
|
197
|
+
choices: [],
|
|
198
|
+
usage: chatCompletionUsage(output.result.usage),
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
send("[DONE]");
|
|
202
|
+
})
|
|
203
|
+
.catch((error: unknown) => {
|
|
204
|
+
// Headers are already sent; report the failure in-band like OpenAI.
|
|
205
|
+
const failure = publicError(error, workspaceId);
|
|
206
|
+
if (failure) send(chatCompletionError(failure));
|
|
207
|
+
})
|
|
208
|
+
.finally(() => {
|
|
209
|
+
clientSignal.removeEventListener("abort", onClientAbort);
|
|
210
|
+
close();
|
|
211
|
+
});
|
|
212
|
+
return new Response(body, {
|
|
213
|
+
status: 200,
|
|
214
|
+
headers: {
|
|
215
|
+
"content-type": "text/event-stream; charset=utf-8",
|
|
216
|
+
"cache-control": "no-cache, no-transform",
|
|
217
|
+
"x-accel-buffering": "no",
|
|
218
|
+
},
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
function unavailable(): ModelCallError {
|
|
224
|
+
return new ModelCallError({
|
|
225
|
+
status: 503,
|
|
226
|
+
type: "service_unavailable",
|
|
227
|
+
code: "unavailable",
|
|
228
|
+
message: "Model calls are unavailable on this deployment.",
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
function errorResponse(c: Context, error: ModelCallError | null): Response {
|
|
233
|
+
if (!error) return c.body(null, 499 as never);
|
|
234
|
+
return c.json(chatCompletionError(error), error.status as never);
|
|
235
|
+
}
|