@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,235 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ModelAccountSettingsOverview,
|
|
3
|
+
OrganizationModelAccountSettings,
|
|
4
|
+
UpdateOrganizationModelAccountSettingsRequest,
|
|
5
|
+
UpdateWorkspaceModelAccountSettingsRequest,
|
|
6
|
+
WorkspaceModelAccountSettings,
|
|
7
|
+
} from "@opengeni/contracts";
|
|
8
|
+
import { requireAccessGrant, type ApiRouteDeps } from "@opengeni/core";
|
|
9
|
+
import {
|
|
10
|
+
deliverSubscriptionCoreCodexWake,
|
|
11
|
+
readOrganizationSubscriptionSettings,
|
|
12
|
+
readSubscriptionSettingsOverview,
|
|
13
|
+
readWorkspaceSubscriptionSettings,
|
|
14
|
+
SubscriptionSettingsBusyError,
|
|
15
|
+
SubscriptionSettingsForbiddenError,
|
|
16
|
+
SubscriptionSettingsInvalidError,
|
|
17
|
+
SubscriptionSettingsLockedError,
|
|
18
|
+
subscriptionSettingLockRefusal,
|
|
19
|
+
SubscriptionSettingsPersonalWorkspaceError,
|
|
20
|
+
SubscriptionSettingsVersionConflictError,
|
|
21
|
+
updateOrganizationSubscriptionSettings,
|
|
22
|
+
updateWorkspaceSubscriptionSettings,
|
|
23
|
+
type SubscriptionSettingsWake,
|
|
24
|
+
} from "@opengeni/db";
|
|
25
|
+
import type { Context, Hono } from "hono";
|
|
26
|
+
import { HTTPException } from "hono/http-exception";
|
|
27
|
+
import { z } from "zod";
|
|
28
|
+
|
|
29
|
+
import { ApiHttpError } from "../http/api-error";
|
|
30
|
+
import { requireOrganizationCodexHuman, requireSameOriginBrowserMutation } from "./codex";
|
|
31
|
+
|
|
32
|
+
const Uuid = z.string().uuid();
|
|
33
|
+
|
|
34
|
+
function parseId(value: string | undefined, what: "organization" | "workspace"): string {
|
|
35
|
+
const parsed = Uuid.safeParse(value);
|
|
36
|
+
if (!parsed.success) throw new HTTPException(404, { message: `${what} not found` });
|
|
37
|
+
return parsed.data;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* 409 `setting_locked` for any write the organization's settings lock refused:
|
|
42
|
+
* these routes and every older route whose write meets the 0724 guard (for
|
|
43
|
+
* example a Codex rotation, primary or source change). Mapped centrally in
|
|
44
|
+
* the app error handler.
|
|
45
|
+
*/
|
|
46
|
+
export function subscriptionSettingsLockedHttpError(error: unknown): ApiHttpError | null {
|
|
47
|
+
const settings =
|
|
48
|
+
error instanceof SubscriptionSettingsLockedError
|
|
49
|
+
? [...error.settings]
|
|
50
|
+
: subscriptionSettingLockRefusal(error);
|
|
51
|
+
if (settings === null) return null;
|
|
52
|
+
return new ApiHttpError(409, {
|
|
53
|
+
code: "conflict",
|
|
54
|
+
message: "the organization locked this setting",
|
|
55
|
+
retryable: false,
|
|
56
|
+
outcomeUnknown: false,
|
|
57
|
+
details: { reason: "setting_locked", settings },
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** Typed refusals to HTTP: 403, 409 (locked, Personal workspace, version), 422 or 503 (busy). */
|
|
62
|
+
function refused(error: unknown): never {
|
|
63
|
+
if (error instanceof SubscriptionSettingsForbiddenError) {
|
|
64
|
+
throw new HTTPException(403, { message: error.message });
|
|
65
|
+
}
|
|
66
|
+
const locked = subscriptionSettingsLockedHttpError(error);
|
|
67
|
+
if (locked) throw locked;
|
|
68
|
+
if (error instanceof SubscriptionSettingsPersonalWorkspaceError) {
|
|
69
|
+
throw new ApiHttpError(409, {
|
|
70
|
+
code: "conflict",
|
|
71
|
+
message: error.message,
|
|
72
|
+
retryable: false,
|
|
73
|
+
outcomeUnknown: false,
|
|
74
|
+
details: { reason: "personal_workspace" },
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
if (error instanceof SubscriptionSettingsVersionConflictError) {
|
|
78
|
+
throw new ApiHttpError(409, {
|
|
79
|
+
code: "conflict",
|
|
80
|
+
message: error.message,
|
|
81
|
+
retryable: false,
|
|
82
|
+
outcomeUnknown: false,
|
|
83
|
+
details: { reason: "version_conflict", currentVersion: error.currentVersion },
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
if (error instanceof SubscriptionSettingsInvalidError) {
|
|
87
|
+
throw new HTTPException(422, { message: error.message });
|
|
88
|
+
}
|
|
89
|
+
if (error instanceof SubscriptionSettingsBusyError) {
|
|
90
|
+
// A lock change kept yielding to workspace writes; nothing was written.
|
|
91
|
+
throw new ApiHttpError(503, {
|
|
92
|
+
code: "upstream_unavailable",
|
|
93
|
+
message: error.message,
|
|
94
|
+
retryable: true,
|
|
95
|
+
outcomeUnknown: false,
|
|
96
|
+
details: { reason: "settings_busy" },
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
throw error;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
async function wake(deps: ApiRouteDeps, value: SubscriptionSettingsWake | null): Promise<void> {
|
|
103
|
+
// Capacity waiters recheck on their own bounded timer; a lost wake only delays.
|
|
104
|
+
await deliverSubscriptionCoreCodexWake(deps.db, value).catch(() => undefined);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
async function jsonBody(c: Context): Promise<unknown> {
|
|
108
|
+
return await c.req.json().catch(() => null);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Model-account settings (SUB-SET-01..05). Organization owners and admins
|
|
113
|
+
* read and change the organization's values and locks and read the overview
|
|
114
|
+
* of every shared workspace. Workspace members read their workspace's
|
|
115
|
+
* effective values; its administrators (and organization administrators)
|
|
116
|
+
* override what the organization has not locked. The database enforces
|
|
117
|
+
* every refusal; these routes only translate it.
|
|
118
|
+
*/
|
|
119
|
+
export function registerModelAccountSettingsRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
120
|
+
const organizationPath = "/v1/organizations/:organizationId/model-account-settings";
|
|
121
|
+
|
|
122
|
+
app.get(organizationPath, async (c) => {
|
|
123
|
+
c.header("cache-control", "private, no-store");
|
|
124
|
+
const organizationId = parseId(c.req.param("organizationId"), "organization");
|
|
125
|
+
const human = await requireOrganizationCodexHuman(c, deps, organizationId);
|
|
126
|
+
try {
|
|
127
|
+
return c.json(
|
|
128
|
+
OrganizationModelAccountSettings.parse(
|
|
129
|
+
await readOrganizationSubscriptionSettings(deps.db, {
|
|
130
|
+
organizationId,
|
|
131
|
+
actorSubjectId: human.subjectId,
|
|
132
|
+
}),
|
|
133
|
+
),
|
|
134
|
+
);
|
|
135
|
+
} catch (error) {
|
|
136
|
+
refused(error);
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
app.patch(organizationPath, async (c) => {
|
|
141
|
+
requireSameOriginBrowserMutation(c, deps);
|
|
142
|
+
const organizationId = parseId(c.req.param("organizationId"), "organization");
|
|
143
|
+
const human = await requireOrganizationCodexHuman(c, deps, organizationId);
|
|
144
|
+
const parsed = UpdateOrganizationModelAccountSettingsRequest.safeParse(await jsonBody(c));
|
|
145
|
+
if (!parsed.success) {
|
|
146
|
+
throw new HTTPException(422, { message: "invalid model account settings" });
|
|
147
|
+
}
|
|
148
|
+
const { expectedVersion, ...patch } = parsed.data;
|
|
149
|
+
try {
|
|
150
|
+
const result = await updateOrganizationSubscriptionSettings(deps.db, {
|
|
151
|
+
organizationId,
|
|
152
|
+
actorSubjectId: human.subjectId,
|
|
153
|
+
patch,
|
|
154
|
+
...(expectedVersion === undefined ? {} : { expectedVersion }),
|
|
155
|
+
});
|
|
156
|
+
await wake(deps, result.wake);
|
|
157
|
+
return c.json(OrganizationModelAccountSettings.parse(result.settings));
|
|
158
|
+
} catch (error) {
|
|
159
|
+
refused(error);
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
app.get(`${organizationPath}/overview`, async (c) => {
|
|
164
|
+
c.header("cache-control", "private, no-store");
|
|
165
|
+
const organizationId = parseId(c.req.param("organizationId"), "organization");
|
|
166
|
+
const human = await requireOrganizationCodexHuman(c, deps, organizationId);
|
|
167
|
+
const after = c.req.query("after");
|
|
168
|
+
if (after !== undefined && !Uuid.safeParse(after).success) {
|
|
169
|
+
throw new HTTPException(422, { message: "invalid cursor" });
|
|
170
|
+
}
|
|
171
|
+
const limitText = c.req.query("limit");
|
|
172
|
+
const limit = limitText === undefined ? undefined : Number(limitText);
|
|
173
|
+
if (limit !== undefined && (!Number.isInteger(limit) || limit < 1 || limit > 500)) {
|
|
174
|
+
throw new HTTPException(422, { message: "limit must be between 1 and 500" });
|
|
175
|
+
}
|
|
176
|
+
try {
|
|
177
|
+
return c.json(
|
|
178
|
+
ModelAccountSettingsOverview.parse(
|
|
179
|
+
await readSubscriptionSettingsOverview(deps.db, {
|
|
180
|
+
organizationId,
|
|
181
|
+
actorSubjectId: human.subjectId,
|
|
182
|
+
after: after ?? null,
|
|
183
|
+
...(limit === undefined ? {} : { limit }),
|
|
184
|
+
}),
|
|
185
|
+
),
|
|
186
|
+
);
|
|
187
|
+
} catch (error) {
|
|
188
|
+
refused(error);
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
const workspacePath = "/v1/workspaces/:workspaceId/model-account-settings";
|
|
193
|
+
|
|
194
|
+
app.get(workspacePath, async (c) => {
|
|
195
|
+
c.header("cache-control", "private, no-store");
|
|
196
|
+
const workspaceId = parseId(c.req.param("workspaceId"), "workspace");
|
|
197
|
+
const grant = await requireAccessGrant(c, deps, workspaceId, "workspace:read");
|
|
198
|
+
try {
|
|
199
|
+
return c.json(
|
|
200
|
+
WorkspaceModelAccountSettings.parse(
|
|
201
|
+
await readWorkspaceSubscriptionSettings(deps.db, {
|
|
202
|
+
accountId: grant.accountId,
|
|
203
|
+
workspaceId,
|
|
204
|
+
subjectId: grant.subjectId,
|
|
205
|
+
}),
|
|
206
|
+
),
|
|
207
|
+
);
|
|
208
|
+
} catch (error) {
|
|
209
|
+
refused(error);
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
app.patch(workspacePath, async (c) => {
|
|
214
|
+
const workspaceId = parseId(c.req.param("workspaceId"), "workspace");
|
|
215
|
+
const grant = await requireAccessGrant(c, deps, workspaceId, "workspace:admin");
|
|
216
|
+
const parsed = UpdateWorkspaceModelAccountSettingsRequest.safeParse(await jsonBody(c));
|
|
217
|
+
if (!parsed.success) {
|
|
218
|
+
throw new HTTPException(422, { message: "invalid model account settings" });
|
|
219
|
+
}
|
|
220
|
+
const { expectedVersion, ...patch } = parsed.data;
|
|
221
|
+
try {
|
|
222
|
+
const result = await updateWorkspaceSubscriptionSettings(deps.db, {
|
|
223
|
+
accountId: grant.accountId,
|
|
224
|
+
workspaceId,
|
|
225
|
+
subjectId: grant.subjectId,
|
|
226
|
+
patch,
|
|
227
|
+
...(expectedVersion === undefined ? {} : { expectedVersion }),
|
|
228
|
+
});
|
|
229
|
+
await wake(deps, result.wake);
|
|
230
|
+
return c.json(WorkspaceModelAccountSettings.parse(result.settings));
|
|
231
|
+
} catch (error) {
|
|
232
|
+
refused(error);
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import { claudeProviderId, withClaudeConnectionCatalog } from "@opengeni/config";
|
|
1
2
|
import {
|
|
2
3
|
configuredModels,
|
|
3
4
|
withCodexCatalogProvider,
|
|
4
5
|
withXaiSubscriptionCatalogProvider,
|
|
5
6
|
withOrganizationGatewayCatalogProvider,
|
|
6
7
|
withOrganizationOpenRouterCatalogProvider,
|
|
8
|
+
withOrganizationOpperCatalogProvider,
|
|
7
9
|
} from "@opengeni/config";
|
|
8
10
|
import { ModelConnectionAccessPolicy, ModelConnectionAccessResponse } from "@opengeni/contracts";
|
|
9
11
|
import {
|
|
@@ -12,87 +14,153 @@ import {
|
|
|
12
14
|
type ApiRouteDeps,
|
|
13
15
|
} from "@opengeni/core";
|
|
14
16
|
import {
|
|
17
|
+
deliverSubscriptionCoreWake,
|
|
15
18
|
getModelConnectionAccess,
|
|
19
|
+
listOrganizationAdministrationMembers,
|
|
20
|
+
nestedPostgresSqlState,
|
|
21
|
+
readSubscriptionCoreProviderModelConnectionAccess,
|
|
22
|
+
subscriptionCoreAccessChangeWake,
|
|
23
|
+
ModelConnectionAccessForbiddenError,
|
|
24
|
+
SubscriptionCoreAccessInvalidError,
|
|
25
|
+
SubscriptionCoreAccessPeopleUnlistableError,
|
|
26
|
+
SubscriptionCoreAccessPersonNotInOrganizationError,
|
|
27
|
+
ModelConnectionWorkspaceNotInOrganizationError,
|
|
16
28
|
updateModelConnectionAccess,
|
|
29
|
+
updateSubscriptionCoreProviderModelConnectionAccess,
|
|
17
30
|
getOrganizationAdministrationOverview,
|
|
18
|
-
getXaiSubscriptionAccountAuthoritySnapshot,
|
|
19
31
|
listOrganizationModelProviderCustomModels,
|
|
20
|
-
|
|
21
|
-
getWorkspaceOpenRouterConnectionMetadata,
|
|
32
|
+
getWorkspaceProviderApiKeyConnectionMetadata,
|
|
22
33
|
type ModelConnectionTarget,
|
|
23
34
|
} from "@opengeni/db";
|
|
24
35
|
import type { Context, Hono } from "hono";
|
|
25
36
|
import { HTTPException } from "hono/http-exception";
|
|
26
37
|
import { z } from "zod";
|
|
27
38
|
import { requireOrganizationCodexHuman, requireSameOriginBrowserMutation } from "./codex";
|
|
28
|
-
import {
|
|
39
|
+
import { codexRouteDisposition } from "./codex-core";
|
|
40
|
+
import { requireSubscriptionCoreRoute } from "./subscription-pool-core";
|
|
29
41
|
|
|
30
|
-
const Kind = z.enum([
|
|
42
|
+
const Kind = z.enum([
|
|
43
|
+
"codex",
|
|
44
|
+
"supergrok",
|
|
45
|
+
"vercel_gateway",
|
|
46
|
+
"openrouter",
|
|
47
|
+
"anthropic",
|
|
48
|
+
"claude_subscription",
|
|
49
|
+
"opper",
|
|
50
|
+
]);
|
|
31
51
|
function modelPrefix(target: ModelConnectionTarget) {
|
|
52
|
+
if (target.kind === "anthropic" || target.kind === "claude_subscription")
|
|
53
|
+
return (
|
|
54
|
+
claudeProviderId(target.kind, target.workspaceId === null ? "organization" : "workspace") +
|
|
55
|
+
"/"
|
|
56
|
+
);
|
|
32
57
|
if (target.kind === "codex" || target.kind === "supergrok") return `${target.kind}/`;
|
|
33
|
-
return `${target.workspaceId === null ? "organization" : "workspace"}-${target.kind === "vercel_gateway" ? "gateway" : "openrouter"}/`;
|
|
58
|
+
return `${target.workspaceId === null ? "organization" : "workspace"}-${target.kind === "vercel_gateway" ? "gateway" : target.kind === "opper" ? "opper" : "openrouter"}/`;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Codex access policies follow the organization's Codex cutover row (M3 PR
|
|
63
|
+
* 3): the legacy credential row without one; the shared core connection with
|
|
64
|
+
* an enabled one (the legacy rows are frozen after 0680); a disabled row is
|
|
65
|
+
* maintenance (typed 503 from `codexRouteDisposition`). SuperGrok's follow
|
|
66
|
+
* its provider route (design 5.3, X2b): legacy without the `xai` cutover
|
|
67
|
+
* receipt, the shared core connection with it, maintenance fails closed.
|
|
68
|
+
*/
|
|
69
|
+
async function coreAccessDisposition(
|
|
70
|
+
deps: ApiRouteDeps,
|
|
71
|
+
kind: ModelConnectionTarget["kind"],
|
|
72
|
+
accountId: string,
|
|
73
|
+
): Promise<"legacy" | "core"> {
|
|
74
|
+
if (kind === "codex") return await codexRouteDisposition(deps, accountId);
|
|
75
|
+
// SuperGrok runs only on the core: any other route fails closed.
|
|
76
|
+
if (kind === "supergrok")
|
|
77
|
+
return await requireSubscriptionCoreRoute(deps, "xai", "SuperGrok", async () => accountId);
|
|
78
|
+
if (kind === "claude_subscription")
|
|
79
|
+
return await requireSubscriptionCoreRoute(deps, "claude", "Claude", async () => accountId);
|
|
80
|
+
return "legacy";
|
|
34
81
|
}
|
|
35
82
|
|
|
36
83
|
export function registerModelConnectionAccessRoutes(app: Hono, deps: ApiRouteDeps) {
|
|
37
84
|
for (const scope of ["organizations", "workspaces"] as const) {
|
|
38
85
|
const path = `/v1/${scope}/:scopeId/model-connections/:kind/:connectionId/access`;
|
|
39
|
-
async function target(
|
|
86
|
+
async function target(
|
|
87
|
+
c: Context,
|
|
88
|
+
mutate: boolean,
|
|
89
|
+
): Promise<{ connection: ModelConnectionTarget; core: boolean }> {
|
|
40
90
|
const kind = Kind.parse(c.req.param("kind"));
|
|
91
|
+
if (kind === "claude_subscription" && !deps.settings.claudeSubscriptionEnabled)
|
|
92
|
+
throw new HTTPException(404, { message: "Claude subscriptions are not enabled" });
|
|
41
93
|
const scopeId = z.string().uuid().parse(c.req.param("scopeId"));
|
|
42
94
|
let connectionId = c.req.param("connectionId")!;
|
|
43
|
-
if (kind === "codex" || kind === "supergrok")
|
|
95
|
+
if (kind === "codex" || kind === "supergrok" || kind === "claude_subscription")
|
|
44
96
|
connectionId = z.string().uuid().parse(connectionId);
|
|
45
97
|
if (scope === "organizations") {
|
|
46
98
|
if (mutate) requireSameOriginBrowserMutation(c, deps);
|
|
47
99
|
const human = await requireOrganizationCodexHuman(c, deps, scopeId);
|
|
48
100
|
return {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
101
|
+
connection: {
|
|
102
|
+
kind,
|
|
103
|
+
connectionId,
|
|
104
|
+
accountId: scopeId,
|
|
105
|
+
workspaceId: null,
|
|
106
|
+
subjectId: human.subjectId,
|
|
107
|
+
},
|
|
108
|
+
core: (await coreAccessDisposition(deps, kind, scopeId)) === "core",
|
|
54
109
|
};
|
|
55
110
|
}
|
|
56
111
|
const grant = await requireAccessGrant(c, deps, scopeId, "workspace:read");
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
if (
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
const metadata = await (
|
|
75
|
-
kind === "vercel_gateway"
|
|
76
|
-
? getWorkspaceVercelAiGatewayConnectionMetadata
|
|
77
|
-
: getWorkspaceOpenRouterConnectionMetadata
|
|
78
|
-
)(deps.db, scopeId);
|
|
112
|
+
// On the core a SuperGrok or Claude access policy is a shared connection's, which
|
|
113
|
+
// the core editor authorizes; only the legacy pools have private rows.
|
|
114
|
+
const sharedCore =
|
|
115
|
+
(kind === "supergrok" || kind === "claude_subscription") &&
|
|
116
|
+
(await coreAccessDisposition(deps, kind, grant.accountId)) === "core";
|
|
117
|
+
if (mutate) {
|
|
118
|
+
// A core Claude change keeps the legacy same-origin browser check.
|
|
119
|
+
if (kind === "claude_subscription" && !c.req.header("authorization"))
|
|
120
|
+
requireSameOriginBrowserMutation(c, deps);
|
|
121
|
+
await requireAccessGrant(c, deps, scopeId, "workspace:admin");
|
|
122
|
+
}
|
|
123
|
+
if (
|
|
124
|
+
kind === "vercel_gateway" ||
|
|
125
|
+
kind === "openrouter" ||
|
|
126
|
+
kind === "anthropic" ||
|
|
127
|
+
kind === "opper"
|
|
128
|
+
) {
|
|
129
|
+
const metadata = await getWorkspaceProviderApiKeyConnectionMetadata(deps.db, scopeId, kind);
|
|
79
130
|
if (!metadata || (connectionId !== "current" && metadata.connectionId !== connectionId))
|
|
80
131
|
throw new HTTPException(404, { message: "Connection not found" });
|
|
81
132
|
connectionId = metadata.connectionId;
|
|
82
133
|
}
|
|
83
134
|
return {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
135
|
+
connection: {
|
|
136
|
+
kind,
|
|
137
|
+
connectionId,
|
|
138
|
+
accountId: grant.accountId,
|
|
139
|
+
workspaceId: scopeId,
|
|
140
|
+
subjectId: grant.subjectId,
|
|
141
|
+
},
|
|
142
|
+
core:
|
|
143
|
+
kind === "supergrok" || kind === "claude_subscription"
|
|
144
|
+
? sharedCore
|
|
145
|
+
: (await coreAccessDisposition(deps, kind, grant.accountId)) === "core",
|
|
89
146
|
};
|
|
90
147
|
}
|
|
91
148
|
app.get(path, async (c) => {
|
|
92
149
|
c.header("cache-control", "private, no-store");
|
|
93
|
-
const connection = await target(c, false);
|
|
94
|
-
const
|
|
150
|
+
const { connection, core } = await target(c, false);
|
|
151
|
+
const coreAccess = core
|
|
152
|
+
? await readSubscriptionCoreProviderModelConnectionAccess(deps.db, connection)
|
|
153
|
+
: null;
|
|
154
|
+
const policy = core
|
|
155
|
+
? coreAccess && {
|
|
156
|
+
...coreAccess.policy,
|
|
157
|
+
allowedPeople: coreAccess.policy.allowedPeople ?? undefined,
|
|
158
|
+
}
|
|
159
|
+
: await getModelConnectionAccess(deps.db, connection);
|
|
95
160
|
if (!policy) throw new HTTPException(404, { message: "Connection not found" });
|
|
161
|
+
// Shared core connections at organization scope can be limited to people
|
|
162
|
+
// and report the workspaces that use them as their own (design 5.4).
|
|
163
|
+
const organizationCore = coreAccess !== null && connection.workspaceId === null;
|
|
96
164
|
let settings =
|
|
97
165
|
connection.workspaceId === null
|
|
98
166
|
? (await deps.resolveCatalogSettings()).settings
|
|
@@ -112,7 +180,21 @@ export function registerModelConnectionAccessRoutes(app: Hono, deps: ApiRouteDep
|
|
|
112
180
|
workspaces = (await getOrganizationAdministrationOverview(deps.db, actor)).workspaces.map(
|
|
113
181
|
({ id, name }) => ({ id, name }),
|
|
114
182
|
);
|
|
115
|
-
if (connection.kind === "
|
|
183
|
+
if (connection.kind === "anthropic" || connection.kind === "claude_subscription") {
|
|
184
|
+
const customModels = await listOrganizationModelProviderCustomModels(deps.db, {
|
|
185
|
+
organizationId: connection.accountId,
|
|
186
|
+
actorSubjectId: connection.subjectId,
|
|
187
|
+
providerKind: connection.kind,
|
|
188
|
+
});
|
|
189
|
+
settings = withClaudeConnectionCatalog(settings, {
|
|
190
|
+
[connection.kind]: { models: customModels },
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
if (
|
|
194
|
+
connection.kind === "vercel_gateway" ||
|
|
195
|
+
connection.kind === "openrouter" ||
|
|
196
|
+
connection.kind === "opper"
|
|
197
|
+
) {
|
|
116
198
|
const models = await listOrganizationModelProviderCustomModels(deps.db, {
|
|
117
199
|
...actor,
|
|
118
200
|
providerKind: connection.kind,
|
|
@@ -120,9 +202,37 @@ export function registerModelConnectionAccessRoutes(app: Hono, deps: ApiRouteDep
|
|
|
120
202
|
settings =
|
|
121
203
|
connection.kind === "vercel_gateway"
|
|
122
204
|
? withOrganizationGatewayCatalogProvider(settings, models)
|
|
123
|
-
:
|
|
205
|
+
: connection.kind === "opper"
|
|
206
|
+
? withOrganizationOpperCatalogProvider(settings, models)
|
|
207
|
+
: withOrganizationOpenRouterCatalogProvider(settings, models);
|
|
124
208
|
}
|
|
125
209
|
}
|
|
210
|
+
// The people an administrator can choose, or null when the account
|
|
211
|
+
// can't be limited to people or the organization has more members than
|
|
212
|
+
// its member list shows (people are then not offered).
|
|
213
|
+
const people =
|
|
214
|
+
organizationCore && coreAccess?.peopleSupported
|
|
215
|
+
? await listOrganizationAdministrationMembers(deps.db, {
|
|
216
|
+
organizationId: connection.accountId,
|
|
217
|
+
actorSubjectId: connection.subjectId,
|
|
218
|
+
}).then(
|
|
219
|
+
(members) =>
|
|
220
|
+
members
|
|
221
|
+
.filter(
|
|
222
|
+
(member) =>
|
|
223
|
+
member.status === "active" &&
|
|
224
|
+
member.revokedAt === null &&
|
|
225
|
+
member.subjectId.startsWith("user:"),
|
|
226
|
+
)
|
|
227
|
+
.map(({ id, name, email }) => ({ id, name, email })),
|
|
228
|
+
(error: unknown) => {
|
|
229
|
+
// The member list refuses organizations above its bound
|
|
230
|
+
// (SQLSTATE 54000); people are then not offered.
|
|
231
|
+
if (nestedPostgresSqlState(error) === "54000") return null;
|
|
232
|
+
throw error;
|
|
233
|
+
},
|
|
234
|
+
)
|
|
235
|
+
: null;
|
|
126
236
|
return c.json(
|
|
127
237
|
ModelConnectionAccessResponse.parse({
|
|
128
238
|
policy,
|
|
@@ -132,29 +242,81 @@ export function registerModelConnectionAccessRoutes(app: Hono, deps: ApiRouteDep
|
|
|
132
242
|
.map(({ id, label }) => ({ id, label })),
|
|
133
243
|
personalWorkspacesSupported:
|
|
134
244
|
connection.workspaceId === null &&
|
|
135
|
-
(connection.kind === "codex" ||
|
|
245
|
+
(connection.kind === "codex" ||
|
|
246
|
+
connection.kind === "supergrok" ||
|
|
247
|
+
connection.kind === "claude_subscription"),
|
|
248
|
+
...(organizationCore
|
|
249
|
+
? {
|
|
250
|
+
...(people ? { peopleSupported: true, people } : { peopleSupported: false }),
|
|
251
|
+
localWorkspaceIds: coreAccess.localWorkspaceIds,
|
|
252
|
+
managedByWorkspaceId: coreAccess.managedByWorkspaceId,
|
|
253
|
+
...(coreAccess.personalSharingSupported ? { personalSharingSupported: true } : {}),
|
|
254
|
+
}
|
|
255
|
+
: {}),
|
|
136
256
|
}),
|
|
137
257
|
);
|
|
138
258
|
});
|
|
139
259
|
app.put(path, async (c) => {
|
|
140
|
-
|
|
260
|
+
// Access of a provider on the shared core lives there; the frozen legacy row is never written.
|
|
261
|
+
const { connection, core } = await target(c, true);
|
|
141
262
|
const parsed = ModelConnectionAccessPolicy.safeParse(await c.req.json().catch(() => null));
|
|
142
263
|
if (!parsed.success)
|
|
143
264
|
throw new HTTPException(422, { message: "Invalid connection access policy" });
|
|
144
265
|
const policy = parsed.data;
|
|
266
|
+
if (policy.sharePersonal && (!core || connection.workspaceId !== null))
|
|
267
|
+
throw new HTTPException(422, {
|
|
268
|
+
message: "Personal sharing requires the organization subscription route",
|
|
269
|
+
});
|
|
145
270
|
if (policy.allowedModels?.some((id) => !id.startsWith(modelPrefix(connection))))
|
|
146
271
|
throw new HTTPException(422, {
|
|
147
272
|
message: "Model belongs to a different connection provider",
|
|
148
273
|
});
|
|
149
|
-
if (
|
|
274
|
+
if (
|
|
275
|
+
connection.workspaceId !== null &&
|
|
276
|
+
(policy.allowedWorkspaces !== null || policy.allowedPeople != null)
|
|
277
|
+
)
|
|
150
278
|
throw new HTTPException(422, {
|
|
151
279
|
message: "Workspace connections cannot be assigned to other workspaces",
|
|
152
280
|
});
|
|
153
|
-
|
|
281
|
+
if (!core && policy.allowedPeople != null)
|
|
282
|
+
throw new HTTPException(422, { message: "This account cannot be limited to people" });
|
|
283
|
+
let updated;
|
|
284
|
+
try {
|
|
285
|
+
updated = core
|
|
286
|
+
? await updateSubscriptionCoreProviderModelConnectionAccess(deps.db, connection, policy)
|
|
287
|
+
: await updateModelConnectionAccess(deps.db, connection, policy);
|
|
288
|
+
} catch (error) {
|
|
289
|
+
if (error instanceof ModelConnectionWorkspaceNotInOrganizationError)
|
|
290
|
+
throw new HTTPException(422, { message: error.message });
|
|
291
|
+
if (
|
|
292
|
+
error instanceof SubscriptionCoreAccessPersonNotInOrganizationError ||
|
|
293
|
+
error instanceof SubscriptionCoreAccessPeopleUnlistableError ||
|
|
294
|
+
error instanceof SubscriptionCoreAccessInvalidError
|
|
295
|
+
)
|
|
296
|
+
throw new HTTPException(422, { message: error.message });
|
|
297
|
+
if (error instanceof ModelConnectionAccessForbiddenError)
|
|
298
|
+
throw new HTTPException(403, { message: error.message });
|
|
299
|
+
throw error;
|
|
300
|
+
}
|
|
154
301
|
if (!updated)
|
|
155
302
|
throw new HTTPException(409, {
|
|
156
303
|
message: "Connection access changed. Reload before saving.",
|
|
157
304
|
});
|
|
305
|
+
if (core) {
|
|
306
|
+
// A wider scope or model list can make waiting work placeable.
|
|
307
|
+
try {
|
|
308
|
+
const change = subscriptionCoreAccessChangeWake(connection.kind, connection.accountId);
|
|
309
|
+
if (change)
|
|
310
|
+
await deliverSubscriptionCoreWake(
|
|
311
|
+
deps.db,
|
|
312
|
+
change.provider,
|
|
313
|
+
change.wake,
|
|
314
|
+
change.displayName,
|
|
315
|
+
);
|
|
316
|
+
} catch {
|
|
317
|
+
// Every core waiter has its own bounded recheck; a lost wake only delays.
|
|
318
|
+
}
|
|
319
|
+
}
|
|
158
320
|
return c.json(updated);
|
|
159
321
|
});
|
|
160
322
|
}
|