@opengeni/api-router 3.0.1 → 3.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/access-grant-rls.d.ts +8 -1
- package/dist/admission-trace.d.ts +8 -0
- package/dist/app.d.ts +50 -3
- package/dist/app.js +10 -1
- package/dist/artifact-catalog-cursor.d.ts +1 -0
- package/dist/attached-browser-viewer.d.ts +11 -0
- package/dist/auth/managed-auth-attempt-context.d.ts +2 -0
- package/dist/auth/managed-auth-rate-limits.d.ts +167 -0
- package/dist/auth/managed-auth-session-adapter.d.ts +9 -1
- package/dist/auth/managed-auth.d.ts +72 -5
- package/dist/auth/managed-sign-in-notifications.d.ts +4 -0
- package/dist/auth/new-signups-gate.d.ts +23 -0
- package/dist/auth/signup-funnel-metrics.d.ts +44 -0
- package/dist/azure-live.d.ts +28 -0
- package/dist/browser-action-fences.d.ts +13 -0
- package/dist/browser-controller-authority.d.ts +1 -61
- package/dist/browser-ephemeral.d.ts +5 -0
- package/dist/browser-lost-runtime-end.d.ts +24 -0
- package/dist/browser-state-authority.d.ts +1 -27
- package/dist/chunk-OGQDXVXY.js +18 -0
- package/dist/chunk-OGQDXVXY.js.map +1 -0
- package/dist/{chunk-AJ62T5QN.js → chunk-OT56OY4V.js} +80503 -39869
- package/dist/chunk-OT56OY4V.js.map +1 -0
- package/dist/claude-default-models.d.ts +19 -0
- package/dist/claude-subscription-core.d.ts +50 -0
- package/dist/claude-subscription-oauth.d.ts +36 -0
- package/dist/claude-subscription-profile.d.ts +9 -0
- package/dist/claude-subscription-usage.d.ts +6 -0
- package/dist/claude-workspace-connection.d.ts +15 -0
- package/dist/codemode.d.ts +40 -5
- package/dist/codex-realtime.d.ts +29 -3
- package/dist/codex-session-pointers.d.ts +19 -0
- package/dist/connection-ownership.d.ts +6 -3
- package/dist/controller-data-plane.d.ts +16 -0
- package/dist/credit-promotion-snapshot.d.ts +6 -0
- package/dist/editable-artifact-source-session.d.ts +3 -0
- package/dist/editable-artifact-websocket.d.ts +5 -3
- package/dist/fatal-process-boundary.d.ts +9 -1
- package/dist/github-access.d.ts +7 -1
- package/dist/github-browser-flow.d.ts +1 -1
- package/dist/http/acting-person.d.ts +36 -0
- package/dist/http/api-contract-compat.d.ts +19 -0
- package/dist/http/api-error.d.ts +50 -1
- package/dist/http/auth.d.ts +8 -1
- package/dist/http/cors.d.ts +12 -0
- package/dist/http/deprecation.d.ts +42 -0
- package/dist/http/keyed-admission.d.ts +12 -0
- package/dist/http/local-browser-boundary.d.ts +72 -0
- package/dist/http/metrics-listener.d.ts +22 -0
- package/dist/http/path-identifier.d.ts +17 -0
- package/dist/http/registered-route-label.d.ts +16 -0
- package/dist/http/rejection-telemetry.d.ts +34 -0
- package/dist/http/request-body.d.ts +27 -0
- package/dist/http/request-source.d.ts +41 -3
- package/dist/http/sse.d.ts +12 -1
- package/dist/http/unmatched-route.d.ts +18 -0
- package/dist/http/user-content.d.ts +36 -0
- package/dist/http/variable-sets-removed.d.ts +41 -0
- package/dist/http/websocket-upgrade-dispatch.d.ts +18 -0
- package/dist/index.js +1279 -108
- package/dist/index.js.map +1 -1
- package/dist/integration-connect-metrics.d.ts +35 -0
- package/dist/integration-endpoint-test.d.ts +20 -0
- package/dist/integrations/api-integrations.d.ts +2 -2
- package/dist/integrations/atlassian.d.ts +8 -3
- package/dist/integrations/fiken.d.ts +3 -1
- package/dist/integrations/github-lens-connect.d.ts +37 -66
- package/dist/integrations/google-drive.d.ts +2 -0
- package/dist/integrations/integration-commit-authority.d.ts +13 -0
- package/dist/integrations/marketplace-plugin.d.ts +43 -43
- package/dist/integrations/oauth-client.d.ts +171 -12
- package/dist/integrations/oauth-profiles.d.ts +42 -13
- package/dist/integrations/onepassword-vault-provider.d.ts +9 -0
- package/dist/integrations/slack-bot.d.ts +285 -7
- package/dist/integrations/slack-file-upload-flow.d.ts +62 -0
- package/dist/integrations/slack-interactions.d.ts +89 -10
- package/dist/integrations/slack-mrkdwn.d.ts +41 -0
- package/dist/integrations/slack-routing.d.ts +1 -1
- package/dist/integrations/slack-session-defaults.d.ts +58 -0
- package/dist/integrations/slack-task-file-upload.d.ts +36 -0
- package/dist/integrations/slack-tool-review.d.ts +5 -0
- package/dist/interaction-agent-access.d.ts +13 -8
- package/dist/interaction-agent-version.d.ts +21 -0
- package/dist/interaction-holder-heartbeat.d.ts +5 -0
- package/dist/interaction-metrics.d.ts +27 -2
- package/dist/interaction-route-stages.d.ts +25 -0
- package/dist/interaction-secrets-vault.d.ts +20 -0
- package/dist/interaction-secrets.d.ts +103 -0
- package/dist/mcp/action-catalog-types.d.ts +14 -0
- package/dist/mcp/action-catalog.gen.d.ts +2 -0
- package/dist/mcp/action-descriptions.d.ts +4 -0
- package/dist/mcp/action-schema-imports.gen.d.ts +1 -0
- package/dist/mcp/capability-account-readiness.d.ts +7 -0
- package/dist/mcp/child-read-evidence.d.ts +9 -0
- package/dist/mcp/company-profile-agent-admin.d.ts +12 -0
- package/dist/mcp/contract-input.d.ts +13 -0
- package/dist/mcp/documents.d.ts +2 -0
- package/dist/mcp/first-party-tool-permissions.d.ts +3 -606
- package/dist/mcp/notification-tools.d.ts +26 -0
- package/dist/mcp/orchestration-failure-diagnostic.d.ts +43 -0
- package/dist/mcp/scheduled-task-input.d.ts +1309 -0
- package/dist/mcp/scheduled-task-view.d.ts +217 -3
- package/dist/mcp/secret-tools.d.ts +14 -0
- package/dist/mcp/server.d.ts +108 -5
- package/dist/mcp/session-admin-access-tools.d.ts +33 -0
- package/dist/mcp/session-event-errors.d.ts +28 -0
- package/dist/mcp/session-event-view.d.ts +62 -0
- package/dist/mcp/session-view.d.ts +15 -0
- package/dist/mcp/session-wait.d.ts +18 -0
- package/dist/mcp/site-agent-clamp-tools.d.ts +38 -0
- package/dist/mcp/site-data-tools.d.ts +22 -0
- package/dist/mcp/site-publication-tools.d.ts +19 -0
- package/dist/mcp/site-sql-tools.d.ts +27 -0
- package/dist/mcp-oauth.d.ts +37 -4
- package/dist/model-calls/chat-completions.d.ts +87 -0
- package/dist/model-calls/pending-usage-settlements.d.ts +57 -0
- package/dist/model-calls/service.d.ts +36 -0
- package/dist/model-catalog.d.ts +9 -3
- package/dist/native-push-dispatch.d.ts +69 -0
- package/dist/observability.d.ts +3 -1
- package/dist/organization-mcp.d.ts +82 -0
- package/dist/prepared-mcp-actor.d.ts +77 -0
- package/dist/prepared-mcp-permissions.d.ts +8 -0
- package/dist/routes/analytics-consent.d.ts +26 -0
- package/dist/routes/api-integrations.d.ts +11 -0
- package/dist/routes/api-keys.d.ts +7 -7
- package/dist/routes/automations.d.ts +2 -0
- package/dist/routes/billing.d.ts +59 -0
- package/dist/routes/browser-sessions.d.ts +65 -2
- package/dist/routes/chat-completions.d.ts +11 -0
- package/dist/routes/claude-core-usage.d.ts +20 -0
- package/dist/routes/claude-subscription-accounts.d.ts +3 -0
- package/dist/routes/claude-subscription-oauth.d.ts +3 -0
- package/dist/routes/client-errors.d.ts +182 -0
- package/dist/routes/codex-core.d.ts +401 -0
- package/dist/routes/codex.d.ts +64 -2
- package/dist/routes/computer-sessions.d.ts +6 -1
- package/dist/routes/desktop-distribution.d.ts +32 -0
- package/dist/routes/github-browser-fonts.gen.d.ts +2 -0
- package/dist/routes/github-browser-pages.d.ts +27 -0
- package/dist/routes/inbox.d.ts +13 -0
- package/dist/routes/insights-response-cache.d.ts +10 -0
- package/dist/routes/insights-usage.d.ts +12 -0
- package/dist/routes/insights.d.ts +28 -0
- package/dist/routes/interaction-placement-message.d.ts +7 -0
- package/dist/routes/managed-sign-in-methods.d.ts +6 -0
- package/dist/routes/model-account-choice.d.ts +13 -0
- package/dist/routes/model-account-settings.d.ts +19 -0
- package/dist/routes/native-app-auth.d.ts +12 -0
- package/dist/routes/organization-integration-policy.d.ts +8 -0
- package/dist/routes/organization-integrations.d.ts +6 -0
- package/dist/routes/organization-mcp-connections.d.ts +3 -0
- package/dist/routes/organization-model-defaults.d.ts +9 -0
- package/dist/routes/organization-service-accounts.d.ts +3 -0
- package/dist/routes/personal-api-keys.d.ts +3 -0
- package/dist/routes/session-admin-access.d.ts +3 -0
- package/dist/routes/session-artifact-associations.d.ts +4 -0
- package/dist/routes/session-history-imports.d.ts +20 -0
- package/dist/routes/sessions.d.ts +38 -2
- package/dist/routes/site-data.d.ts +18 -0
- package/dist/routes/site-publishing.d.ts +5 -0
- package/dist/routes/site-runtime.d.ts +31 -0
- package/dist/routes/site-sql.d.ts +16 -0
- package/dist/routes/slack-bot-access.d.ts +3 -0
- package/dist/routes/subscription-account-pools.d.ts +21 -0
- package/dist/routes/subscription-core-http.d.ts +5 -0
- package/dist/routes/subscription-pool-access.d.ts +37 -0
- package/dist/routes/subscription-pool-core.d.ts +153 -0
- package/dist/routes/supergrok.d.ts +6 -6
- package/dist/routes/usage-allowances.d.ts +12 -0
- package/dist/routes/variable-sets-removed.d.ts +2 -0
- package/dist/routes/vault-providers.d.ts +34 -0
- package/dist/routes/vaults.d.ts +3 -0
- package/dist/routes/workspace-integrations.d.ts +35 -0
- package/dist/routes/workspace-model-providers.d.ts +4 -0
- package/dist/routes/workspaces.d.ts +11 -2
- package/dist/sandbox/agent-update.d.ts +64 -0
- package/dist/sandbox/auth-callout.d.ts +8 -0
- package/dist/sandbox/channel-a.d.ts +15 -1
- package/dist/sandbox/enrollment.d.ts +26 -4
- package/dist/sandbox/machine-audience.d.ts +29 -0
- package/dist/sandbox/machines.d.ts +15 -2
- package/dist/sandbox/metrics-ingestion.d.ts +6 -2
- package/dist/sandbox/screen-control.d.ts +85 -0
- package/dist/sandbox/viewer.d.ts +5 -1
- package/dist/sandbox-file-artifacts.d.ts +17 -1
- package/dist/scheduled-task-blockers.d.ts +39 -0
- package/dist/scheduled-task-deletion.d.ts +3 -4
- package/dist/scheduled-task-lifecycle.d.ts +14 -0
- package/dist/secret-answers.d.ts +40 -0
- package/dist/session-create-observability.d.ts +5 -0
- package/dist/session-event-view-36GO3IL7.js +528 -0
- package/dist/session-event-view-36GO3IL7.js.map +1 -0
- package/dist/signed-state-secret.d.ts +18 -0
- package/dist/site-agent-guard.d.ts +53 -0
- package/dist/site-data/operations.d.ts +103 -0
- package/dist/site-data/service.d.ts +203 -0
- package/dist/site-frame-guard.d.ts +32 -0
- package/dist/site-publishing/agent-data-tools.d.ts +84 -0
- package/dist/site-publishing/agent-model.d.ts +58 -0
- package/dist/site-publishing/agent-session.d.ts +16 -0
- package/dist/site-publishing/content-scanner.d.ts +31 -0
- package/dist/site-publishing/edge-sync.d.ts +48 -0
- package/dist/site-publishing/gateway-signature.d.ts +56 -0
- package/dist/site-publishing/limits.d.ts +63 -0
- package/dist/site-publishing/page-tool-authority.d.ts +30 -0
- package/dist/site-publishing/platform-usage.d.ts +113 -0
- package/dist/site-publishing/platform.d.ts +21 -0
- package/dist/site-publishing/readiness.d.ts +62 -0
- package/dist/site-publishing/runtime.d.ts +179 -0
- package/dist/site-publishing/service.d.ts +264 -0
- package/dist/site-publishing/session-events.d.ts +22 -0
- package/dist/site-publishing/session-views.d.ts +36 -0
- package/dist/site-publishing/viewer.d.ts +40 -0
- package/dist/site-session-origin.d.ts +31 -6
- package/dist/site-sql/format.d.ts +47 -0
- package/dist/site-sql/gateway.d.ts +50 -0
- package/dist/site-sql/service.d.ts +213 -0
- package/dist/temporal-schedule-sync.d.ts +26 -0
- package/dist/transcription/billing-refusal.d.ts +8 -0
- package/dist/transcription/normalize.d.ts +23 -0
- package/dist/transcription/providers/azure-mai.d.ts +12 -0
- package/dist/transcription/providers/azure-openai.d.ts +4 -0
- package/dist/transcription/providers/openai.d.ts +16 -0
- package/dist/transcription/providers/subscription-core.d.ts +39 -0
- package/dist/transcription/service.d.ts +10 -1
- package/dist/transcription/wav-duration.d.ts +8 -0
- package/dist/workspace-tool-gateway-attestations.d.ts +37 -0
- package/dist/workspace-tool-gateway-observability.d.ts +16 -0
- package/dist/workspace-tool-gateway-secrets.d.ts +27 -0
- package/dist/workspace-tool-gateway.d.ts +102 -6
- package/dist/workspace-tool-target-fence.d.ts +116 -0
- package/dist/workspace-tool-target.d.ts +225 -0
- package/dist/workspace-webhook-dispatch.d.ts +26 -0
- package/dist/xai-subscription-core.d.ts +60 -0
- package/package.json +25 -20
- package/src/access-grant-rls.ts +64 -14
- package/src/admission-trace.ts +14 -0
- package/src/app.ts +1684 -252
- package/src/artifact-catalog-cursor.ts +1 -0
- package/src/attached-browser-viewer.ts +26 -0
- package/src/auth/managed-auth-attempt-context.ts +9 -0
- package/src/auth/managed-auth-rate-limits.ts +252 -0
- package/src/auth/managed-auth-session-adapter.ts +64 -29
- package/src/auth/managed-auth.ts +303 -35
- package/src/auth/managed-email.ts +18 -1
- package/src/auth/managed-sign-in-notifications.ts +81 -0
- package/src/auth/new-signups-gate.ts +49 -0
- package/src/auth/organization-user-setup.ts +3 -3
- package/src/auth/signup-funnel-metrics.ts +164 -0
- package/src/azure-live.ts +103 -0
- package/src/browser-action-fences.ts +45 -0
- package/src/browser-controller-authority.ts +1 -186
- package/src/browser-ephemeral.ts +39 -0
- package/src/browser-lost-runtime-end.ts +71 -0
- package/src/browser-state-authority.ts +1 -236
- package/src/claude-default-models.ts +37 -0
- package/src/claude-subscription-core.ts +154 -0
- package/src/claude-subscription-oauth.ts +352 -0
- package/src/claude-subscription-profile.ts +73 -0
- package/src/claude-subscription-usage.ts +51 -0
- package/src/claude-workspace-connection.ts +82 -0
- package/src/codemode.ts +236 -39
- package/src/codex-realtime.ts +181 -53
- package/src/codex-session-pointers.ts +80 -0
- package/src/company-brain-okf.ts +1 -1
- package/src/connected-machine-computer-access.ts +2 -1
- package/src/connection-ownership.ts +19 -13
- package/src/controller-data-plane.ts +34 -0
- package/src/credit-promotion-snapshot.ts +36 -0
- package/src/editable-artifact-production.ts +10 -0
- package/src/editable-artifact-source-session.ts +123 -0
- package/src/editable-artifact-websocket.ts +16 -3
- package/src/fatal-process-boundary.ts +67 -3
- package/src/gateway-realtime.ts +12 -8
- package/src/github-access.ts +31 -5
- package/src/github-browser-flow.ts +1 -1
- package/src/http/acting-person.ts +105 -0
- package/src/http/api-contract-compat.ts +49 -0
- package/src/http/api-error.ts +210 -2
- package/src/http/auth.ts +68 -4
- package/src/http/cors.ts +37 -5
- package/src/http/deprecation.ts +118 -0
- package/src/http/keyed-admission.ts +29 -0
- package/src/http/local-browser-boundary.ts +343 -0
- package/src/http/metrics-listener.ts +57 -0
- package/src/http/path-identifier.ts +54 -0
- package/src/http/registered-route-label.ts +34 -0
- package/src/http/rejection-telemetry.ts +120 -0
- package/src/http/request-body.ts +127 -0
- package/src/http/request-source.ts +154 -13
- package/src/http/sse.ts +88 -28
- package/src/http/unmatched-route.ts +60 -0
- package/src/http/user-content.ts +158 -0
- package/src/http/variable-sets-removed.ts +122 -0
- package/src/http/websocket-upgrade-dispatch.ts +29 -0
- package/src/index.ts +107 -57
- package/src/integration-connect-metrics.ts +228 -0
- package/src/integration-endpoint-test.ts +291 -0
- package/src/integrations/api-integrations.ts +81 -7
- package/src/integrations/atlassian.ts +202 -83
- package/src/integrations/fiken.ts +66 -38
- package/src/integrations/github-app-connect.ts +64 -18
- package/src/integrations/github-lens-connect.ts +8 -29
- package/src/integrations/google-drive.ts +448 -152
- package/src/integrations/integration-commit-authority.ts +69 -0
- package/src/integrations/marketplace-plugin.ts +1 -1
- package/src/integrations/oauth-client.ts +733 -193
- package/src/integrations/oauth-profiles.ts +116 -45
- package/src/integrations/onepassword-vault-provider.ts +16 -0
- package/src/integrations/personal-github-repositories.ts +1 -1
- package/src/integrations/personal-github.ts +61 -35
- package/src/integrations/provider-oauth.ts +67 -85
- package/src/integrations/slack-app-home.ts +5 -5
- package/src/integrations/slack-bot.ts +893 -201
- package/src/integrations/slack-file-upload-flow.ts +147 -0
- package/src/integrations/slack-install.ts +7 -7
- package/src/integrations/slack-interactions.ts +1589 -299
- package/src/integrations/slack-mrkdwn.ts +193 -0
- package/src/integrations/slack-routing.ts +2 -2
- package/src/integrations/slack-session-defaults.ts +224 -0
- package/src/integrations/slack-task-file-upload.ts +323 -0
- package/src/integrations/slack-tool-review.ts +65 -0
- package/src/integrations/social-oauth.ts +90 -58
- package/src/interaction-agent-access.ts +40 -20
- package/src/interaction-agent-version.ts +85 -0
- package/src/interaction-holder-heartbeat.ts +24 -8
- package/src/interaction-metrics.ts +164 -2
- package/src/interaction-route-stages.ts +94 -0
- package/src/interaction-secrets-vault.ts +213 -0
- package/src/interaction-secrets.ts +426 -0
- package/src/mcp/action-catalog-types.ts +14 -0
- package/src/mcp/action-catalog.gen.ts +8014 -0
- package/src/mcp/action-descriptions.ts +299 -0
- package/src/mcp/action-schema-imports.gen.ts +304 -0
- package/src/mcp/capability-account-readiness.ts +17 -0
- package/src/mcp/child-read-evidence.ts +19 -0
- package/src/mcp/company-profile-agent-admin.ts +13 -0
- package/src/mcp/contract-input.ts +165 -0
- package/src/mcp/documents.ts +9 -2
- package/src/mcp/editable-artifacts.ts +29 -11
- package/src/mcp/files.ts +5 -1
- package/src/mcp/first-party-tool-permissions.ts +7 -285
- package/src/mcp/knowledge-entries.ts +108 -34
- package/src/mcp/notification-tools.ts +480 -0
- package/src/mcp/orchestration-failure-diagnostic.ts +43 -0
- package/src/mcp/scheduled-task-input.ts +89 -0
- package/src/mcp/scheduled-task-view.ts +63 -3
- package/src/mcp/secret-tools.ts +185 -0
- package/src/mcp/server.ts +2213 -1116
- package/src/mcp/session-admin-access-tools.ts +163 -0
- package/src/mcp/session-event-errors.ts +123 -0
- package/src/mcp/session-event-view.ts +395 -13
- package/src/mcp/session-view.ts +3 -0
- package/src/mcp/session-wait.ts +67 -7
- package/src/mcp/site-agent-clamp-tools.ts +140 -0
- package/src/mcp/site-data-tools.ts +339 -0
- package/src/mcp/site-publication-tools.ts +201 -0
- package/src/mcp/site-sql-tools.ts +427 -0
- package/src/mcp-oauth.ts +635 -45
- package/src/model-calls/chat-completions.ts +352 -0
- package/src/model-calls/pending-usage-settlements.ts +125 -0
- package/src/model-calls/service.ts +694 -0
- package/src/model-catalog.ts +68 -17
- package/src/native-push-dispatch.ts +457 -0
- package/src/observability.ts +15 -1
- package/src/organization-mcp.ts +485 -0
- package/src/prepared-mcp-actor.ts +154 -0
- package/src/prepared-mcp-permissions.ts +38 -0
- package/src/routes/analytics-consent.ts +123 -0
- package/src/routes/api-integrations.ts +268 -9
- package/src/routes/api-keys.ts +164 -25
- package/src/routes/artifact-catalog.ts +111 -0
- package/src/routes/automations.ts +163 -90
- package/src/routes/billing.ts +535 -59
- package/src/routes/browser-sessions.ts +966 -342
- package/src/routes/canonical-human-identities.ts +61 -0
- package/src/routes/capabilities.ts +112 -5
- package/src/routes/channels.ts +4 -3
- package/src/routes/chat-completions.ts +235 -0
- package/src/routes/claude-core-usage.ts +147 -0
- package/src/routes/claude-subscription-accounts.ts +233 -0
- package/src/routes/claude-subscription-oauth.ts +175 -0
- package/src/routes/client-errors.ts +394 -0
- package/src/routes/codex-core.ts +687 -0
- package/src/routes/codex.ts +1277 -1119
- package/src/routes/company-brain.ts +4 -0
- package/src/routes/computer-sessions.ts +319 -85
- package/src/routes/connect.ts +277 -175
- package/src/routes/connections.ts +690 -363
- package/src/routes/desktop-distribution.ts +217 -0
- package/src/routes/documents.ts +13 -7
- package/src/routes/editable-artifacts.ts +74 -4
- package/src/routes/enrollments.ts +110 -16
- package/src/routes/external-identity-links.ts +13 -12
- package/src/routes/files.ts +41 -16
- package/src/routes/github-browser-fonts.gen.ts +12 -0
- package/src/routes/github-browser-pages.ts +258 -0
- package/src/routes/github.ts +200 -75
- package/src/routes/inbox.ts +353 -0
- package/src/routes/insights-response-cache.ts +83 -0
- package/src/routes/insights-usage.ts +345 -0
- package/src/routes/insights.ts +103 -8
- package/src/routes/install.ts +51 -10
- package/src/routes/integration-facets.ts +70 -28
- package/src/routes/interaction-placement-message.ts +12 -0
- package/src/routes/knowledge.ts +136 -27
- package/src/routes/machines.ts +189 -135
- package/src/routes/managed-auth-session-sets.ts +43 -10
- package/src/routes/managed-onboarding.ts +39 -19
- package/src/routes/managed-sign-in-methods.ts +433 -0
- package/src/routes/memory-slack-publications.ts +3 -2
- package/src/routes/model-account-choice.ts +194 -0
- package/src/routes/model-account-settings.ts +235 -0
- package/src/routes/model-connection-access.ts +210 -48
- package/src/routes/native-app-auth.ts +296 -0
- package/src/routes/organization-integration-policy.ts +116 -0
- package/src/routes/organization-integrations.ts +326 -0
- package/src/routes/organization-mcp-connections.ts +183 -0
- package/src/routes/organization-memberships.ts +205 -19
- package/src/routes/organization-model-defaults.ts +110 -0
- package/src/routes/organization-model-providers.ts +74 -3
- package/src/routes/organization-service-accounts.ts +128 -0
- package/src/routes/organization-sessions.ts +21 -5
- package/src/routes/personal-api-keys.ts +184 -0
- package/src/routes/personal-github-git-broker.ts +2 -2
- package/src/routes/personal-github.ts +9 -4
- package/src/routes/plugins.ts +46 -7
- package/src/routes/pr-review-github.ts +105 -118
- package/src/routes/pr-review.ts +88 -82
- package/src/routes/preference-registry.ts +18 -0
- package/src/routes/rigs.ts +48 -13
- package/src/routes/scheduled-tasks.ts +347 -27
- package/src/routes/session-admin-access.ts +271 -0
- package/src/routes/session-artifact-associations.ts +164 -0
- package/src/routes/session-history-imports.ts +305 -0
- package/src/routes/sessions.ts +1682 -363
- package/src/routes/site-data.ts +340 -0
- package/src/routes/site-publishing.ts +584 -0
- package/src/routes/site-runtime.ts +1944 -0
- package/src/routes/site-sql.ts +263 -0
- package/src/routes/skill-content.ts +72 -7
- package/src/routes/skills.ts +5 -4
- package/src/routes/slack-bot-access.ts +108 -0
- package/src/routes/social.ts +27 -15
- package/src/routes/subscription-account-pools.ts +209 -0
- package/src/routes/subscription-core-http.ts +18 -0
- package/src/routes/subscription-pool-access.ts +180 -0
- package/src/routes/subscription-pool-core.ts +552 -0
- package/src/routes/supergrok.ts +174 -655
- package/src/routes/transcription-recordings.ts +71 -4
- package/src/routes/transcriptions.ts +26 -2
- package/src/routes/usage-allowances.ts +381 -0
- package/src/routes/variable-sets-removed.ts +19 -0
- package/src/routes/vault-providers.ts +782 -0
- package/src/routes/vaults.ts +421 -0
- package/src/routes/video-generation.ts +30 -12
- package/src/routes/workspace-artifacts.ts +165 -53
- package/src/routes/workspace-integrations.ts +576 -0
- package/src/routes/workspace-model-providers.ts +148 -0
- package/src/routes/workspace-state.ts +4 -0
- package/src/routes/workspaces.ts +625 -117
- package/src/sandbox/agent-update.ts +315 -0
- package/src/sandbox/auth-callout.ts +104 -21
- package/src/sandbox/channel-a.ts +165 -55
- package/src/sandbox/enrollment.ts +131 -22
- package/src/sandbox/machine-audience.ts +192 -0
- package/src/sandbox/machines.ts +75 -31
- package/src/sandbox/metrics-ingestion.ts +133 -2
- package/src/sandbox/rematerialize.ts +51 -21
- package/src/sandbox/screen-control.ts +289 -0
- package/src/sandbox/viewer.ts +33 -58
- package/src/sandbox-file-artifacts.ts +53 -27
- package/src/scheduled-task-blockers.ts +293 -0
- package/src/scheduled-task-deletion.ts +13 -3
- package/src/scheduled-task-lifecycle.ts +84 -0
- package/src/secret-answers.ts +119 -0
- package/src/session-create-observability.ts +46 -0
- package/src/session-realtime-context.ts +26 -4
- package/src/signed-state-secret.ts +58 -0
- package/src/site-agent-guard.ts +261 -0
- package/src/site-data/operations.ts +777 -0
- package/src/site-data/service.ts +1043 -0
- package/src/site-frame-guard.ts +107 -0
- package/src/site-publishing/agent-data-tools.ts +250 -0
- package/src/site-publishing/agent-model.ts +127 -0
- package/src/site-publishing/agent-session.ts +148 -0
- package/src/site-publishing/content-scanner.ts +93 -0
- package/src/site-publishing/edge-sync.ts +148 -0
- package/src/site-publishing/gateway-signature.ts +198 -0
- package/src/site-publishing/limits.ts +315 -0
- package/src/site-publishing/page-tool-authority.ts +111 -0
- package/src/site-publishing/platform-usage.ts +479 -0
- package/src/site-publishing/platform.ts +98 -0
- package/src/site-publishing/readiness.ts +330 -0
- package/src/site-publishing/runtime.ts +831 -0
- package/src/site-publishing/service.ts +1282 -0
- package/src/site-publishing/session-events.ts +262 -0
- package/src/site-publishing/session-views.ts +262 -0
- package/src/site-publishing/viewer.ts +75 -0
- package/src/site-session-origin.ts +91 -6
- package/src/site-sql/format.ts +134 -0
- package/src/site-sql/gateway.ts +168 -0
- package/src/site-sql/service.ts +1636 -0
- package/src/site-uploads.ts +27 -5
- package/src/temporal-schedule-sync.ts +74 -0
- package/src/transcription/billing-refusal.ts +14 -0
- package/src/transcription/normalize.ts +77 -0
- package/src/transcription/providers/azure-mai.ts +98 -0
- package/src/transcription/providers/azure-openai.ts +16 -7
- package/src/transcription/providers/codex-subscription.ts +190 -67
- package/src/transcription/providers/openai.ts +79 -5
- package/src/transcription/providers/subscription-core.ts +125 -0
- package/src/transcription/providers/xai-subscription.ts +81 -83
- package/src/transcription/segmenter.ts +7 -1
- package/src/transcription/service.ts +239 -10
- package/src/transcription/wav-duration.ts +39 -0
- package/src/workspace-deletion.ts +25 -1
- package/src/workspace-tool-gateway-attestations.ts +133 -0
- package/src/workspace-tool-gateway-observability.ts +64 -0
- package/src/workspace-tool-gateway-secrets.ts +104 -0
- package/src/workspace-tool-gateway.ts +921 -103
- package/src/workspace-tool-target-fence.ts +380 -0
- package/src/workspace-tool-target.ts +554 -0
- package/src/workspace-webhook-dispatch.ts +225 -0
- package/src/xai-realtime.ts +85 -81
- package/src/xai-subscription-core.ts +172 -0
- package/dist/browser-auth-broker.d.ts +0 -20
- package/dist/chunk-AJ62T5QN.js.map +0 -1
- package/dist/connection-authority-owner.d.ts +0 -59
- package/dist/routes/connection-authorities.d.ts +0 -3
- package/dist/routes/environments.d.ts +0 -5
- package/dist/routes/host-mcp-bindings.d.ts +0 -5
- package/dist/routes/host-mcp-resolvers.d.ts +0 -3
- package/dist/routes/packs.d.ts +0 -3
- package/dist/session-event-view-MU3HMNV3.js +0 -264
- package/dist/session-event-view-MU3HMNV3.js.map +0 -1
- package/dist/xai-subscription-auth.d.ts +0 -23
- package/src/browser-auth-broker.ts +0 -155
- package/src/connection-authority-owner.ts +0 -61
- package/src/routes/connection-authorities.ts +0 -139
- package/src/routes/environments.ts +0 -388
- package/src/routes/host-mcp-bindings.ts +0 -122
- package/src/routes/host-mcp-resolvers.ts +0 -41
- package/src/routes/packs.ts +0 -784
- package/src/xai-subscription-auth.ts +0 -139
|
@@ -1,8 +1,15 @@
|
|
|
1
|
+
import { signupCreditModelIds } from "@opengeni/config";
|
|
1
2
|
import {
|
|
2
3
|
lookupExternalIdentityForRequest,
|
|
3
4
|
cancelExternalWorkspaceMemberGrantForRequest,
|
|
5
|
+
updateExternalWorkspaceMemberForRequest,
|
|
6
|
+
getOrganizationPrivacySettings,
|
|
7
|
+
OrganizationPrivacyLockedError,
|
|
8
|
+
privacyDeploymentLimits,
|
|
9
|
+
updateOrganizationPrivacySettings,
|
|
4
10
|
} from "@opengeni/core";
|
|
5
11
|
import {
|
|
12
|
+
type Permission,
|
|
6
13
|
AcceptOrganizationInvitationRequest,
|
|
7
14
|
CreateAdditionalOrganizationRequest,
|
|
8
15
|
CreateAdditionalOrganizationResponse,
|
|
@@ -18,6 +25,7 @@ import {
|
|
|
18
25
|
OrganizationInvitation,
|
|
19
26
|
OrganizationUserSetupDelivery,
|
|
20
27
|
OrganizationMember,
|
|
28
|
+
OrganizationPrivacySettings,
|
|
21
29
|
OrganizationPrivateSessionSettings,
|
|
22
30
|
OrganizationRetentionPolicy,
|
|
23
31
|
OrganizationSummary,
|
|
@@ -30,6 +38,7 @@ import {
|
|
|
30
38
|
RevokeOrganizationWorkspaceMemberResponse,
|
|
31
39
|
UpdateOrganizationMemberRequest,
|
|
32
40
|
UpdateOrganizationNameRequest,
|
|
41
|
+
UpdateOrganizationPrivacySettingsRequest,
|
|
33
42
|
UpdateOrganizationPrivateSessionSettingsRequest,
|
|
34
43
|
UpdateOrganizationRetentionPolicyRequest,
|
|
35
44
|
UpdateOrganizationWorkspaceRequest,
|
|
@@ -38,6 +47,10 @@ import {
|
|
|
38
47
|
} from "@opengeni/contracts";
|
|
39
48
|
import {
|
|
40
49
|
getManagedSession,
|
|
50
|
+
accountScopedApiKeyWorkspaceAuthority,
|
|
51
|
+
organizationWorkspaceInScope,
|
|
52
|
+
hasPermission,
|
|
53
|
+
requireAccessContext,
|
|
41
54
|
organizationMembershipHttpStatus,
|
|
42
55
|
requireCanonicalLocalAccountAdministrator,
|
|
43
56
|
updateExternalIdentityMembershipForRequest,
|
|
@@ -57,6 +70,7 @@ import {
|
|
|
57
70
|
getOrganizationPrivateSessionSettings,
|
|
58
71
|
getSelfOrganizationInvitation,
|
|
59
72
|
getOrganizationRetentionPolicy,
|
|
73
|
+
requireWorkspace,
|
|
60
74
|
listOrganizationAdministrationMembers,
|
|
61
75
|
listOrganizationInvitations,
|
|
62
76
|
listSelfOrganizationInvitations,
|
|
@@ -77,17 +91,82 @@ import type { Context, Hono } from "hono";
|
|
|
77
91
|
import { HTTPException } from "hono/http-exception";
|
|
78
92
|
import { z } from "zod";
|
|
79
93
|
import { deleteWorkspaceForRequest } from "../workspace-deletion";
|
|
94
|
+
import { agentActingAsPerson, organizationSettingsPermission } from "../http/acting-person";
|
|
80
95
|
|
|
81
96
|
import {
|
|
82
97
|
assertOrganizationUserSetupDeliveryConfigured,
|
|
83
98
|
resolveOrganizationUserSetupDeliveryEmail,
|
|
84
99
|
} from "../auth/organization-user-setup";
|
|
100
|
+
import { readRequestJson } from "../http/request-body";
|
|
85
101
|
|
|
86
102
|
const OrganizationId = z.string().uuid();
|
|
87
103
|
const WorkspaceId = z.string().uuid();
|
|
88
104
|
const MembershipId = z.string().uuid();
|
|
89
105
|
const InvitationId = z.string().uuid();
|
|
90
106
|
|
|
107
|
+
// Organization keys administer settings, not another person's session contents.
|
|
108
|
+
// The database independently fences current key authority, including on replay.
|
|
109
|
+
async function requirePrivateSessionAdministrator(
|
|
110
|
+
context: Context,
|
|
111
|
+
deps: ApiRouteDeps,
|
|
112
|
+
organizationId: string,
|
|
113
|
+
): Promise<{ subjectId: string }> {
|
|
114
|
+
const agent = agentActingAsPerson(
|
|
115
|
+
context,
|
|
116
|
+
organizationId,
|
|
117
|
+
organizationSettingsPermission(context),
|
|
118
|
+
);
|
|
119
|
+
if (agent) return agent;
|
|
120
|
+
if (!context.req.header("authorization")) return requireManagedHuman(context, deps);
|
|
121
|
+
const access = await requireAccessContext(context, deps);
|
|
122
|
+
const key = accountScopedApiKeyWorkspaceAuthority(access);
|
|
123
|
+
if (!key || key.accountId !== organizationId || !key.permissions.includes("workspace:admin")) {
|
|
124
|
+
throw new HTTPException(403, {
|
|
125
|
+
message: "organization administration required",
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
if (
|
|
129
|
+
key.permissionMode === "explicit" &&
|
|
130
|
+
!access.accountGrants.some(
|
|
131
|
+
(grant) => grant.accountId === organizationId && grant.permissions.includes("account:admin"),
|
|
132
|
+
)
|
|
133
|
+
) {
|
|
134
|
+
throw new HTTPException(403, { message: "organization administration requires account:admin" });
|
|
135
|
+
}
|
|
136
|
+
return { subjectId: access.subjectId };
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
async function requireOrganizationKeyWorkspaceDeletion(
|
|
140
|
+
context: Context,
|
|
141
|
+
deps: ApiRouteDeps,
|
|
142
|
+
organizationId: string,
|
|
143
|
+
workspaceId: string,
|
|
144
|
+
): Promise<void> {
|
|
145
|
+
const access = await requireAccessContext(context, deps);
|
|
146
|
+
const key = accountScopedApiKeyWorkspaceAuthority(access);
|
|
147
|
+
if (
|
|
148
|
+
!key ||
|
|
149
|
+
key.accountId !== organizationId ||
|
|
150
|
+
!hasPermission(key.permissions, "workspace:admin")
|
|
151
|
+
) {
|
|
152
|
+
throw new HTTPException(403, {
|
|
153
|
+
message:
|
|
154
|
+
"deleting an organization workspace requires an organization owner session or an organization API key with workspace:admin",
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
const workspace = await requireWorkspace(deps.db, workspaceId).catch(() => null);
|
|
158
|
+
if (!workspace || workspace.accountId !== organizationId) {
|
|
159
|
+
throw new HTTPException(404, { message: "workspace not found" });
|
|
160
|
+
}
|
|
161
|
+
if (workspace.kind !== "shared") {
|
|
162
|
+
throw new HTTPException(403, {
|
|
163
|
+
message: "organization API keys cannot delete a Personal workspace",
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
if (!organizationWorkspaceInScope(key.workspaceScope, workspaceId))
|
|
167
|
+
throw new HTTPException(403, { message: "workspace is outside organization key scope" });
|
|
168
|
+
}
|
|
169
|
+
|
|
91
170
|
async function requireManagedHuman(context: Context, deps: ApiRouteDeps) {
|
|
92
171
|
if (
|
|
93
172
|
deps.settings.productAccessMode !== "managed" ||
|
|
@@ -108,11 +187,32 @@ async function requireManagedHuman(context: Context, deps: ApiRouteDeps) {
|
|
|
108
187
|
return { session, subjectId: `user:${session.user.id}` };
|
|
109
188
|
}
|
|
110
189
|
|
|
190
|
+
/**
|
|
191
|
+
* A person acting in this organization: in their browser, or through an agent
|
|
192
|
+
* acting as them whose access setting includes `permission`. The database
|
|
193
|
+
* still checks the person's own role on every call.
|
|
194
|
+
*/
|
|
195
|
+
async function requireOrganizationPerson(
|
|
196
|
+
context: Context,
|
|
197
|
+
deps: ApiRouteDeps,
|
|
198
|
+
permission: Permission,
|
|
199
|
+
): Promise<{ subjectId: string }> {
|
|
200
|
+
const agent = agentActingAsPerson(context, context.req.param("organizationId") ?? "", permission);
|
|
201
|
+
if (agent) return agent;
|
|
202
|
+
return await requireManagedHuman(context, deps);
|
|
203
|
+
}
|
|
204
|
+
|
|
111
205
|
async function requireOrganizationAdministrator(
|
|
112
206
|
context: Context,
|
|
113
207
|
deps: ApiRouteDeps,
|
|
114
208
|
organizationId: string,
|
|
115
209
|
): Promise<{ subjectId: string }> {
|
|
210
|
+
const agent = agentActingAsPerson(
|
|
211
|
+
context,
|
|
212
|
+
organizationId,
|
|
213
|
+
organizationSettingsPermission(context),
|
|
214
|
+
);
|
|
215
|
+
if (agent) return agent;
|
|
116
216
|
if (deps.settings.productAccessMode === "managed") {
|
|
117
217
|
return await requireManagedHuman(context, deps);
|
|
118
218
|
}
|
|
@@ -217,6 +317,10 @@ export function registerOrganizationMembershipRoutes(app: Hono, deps: ApiRouteDe
|
|
|
217
317
|
subjectId,
|
|
218
318
|
subjectLabel: session.user.email || session.user.name,
|
|
219
319
|
...payload,
|
|
320
|
+
trialCreditModelIds: signupCreditModelIds(deps.settings),
|
|
321
|
+
trialCreditsEnabled:
|
|
322
|
+
deps.settings.productAccessMode === "managed" &&
|
|
323
|
+
deps.settings.verifiedSignupTrialCreditsEnabled,
|
|
220
324
|
}),
|
|
221
325
|
),
|
|
222
326
|
201,
|
|
@@ -406,6 +510,18 @@ export function registerOrganizationMembershipRoutes(app: Hono, deps: ApiRouteDe
|
|
|
406
510
|
context.req.param("organizationId"),
|
|
407
511
|
"organization id",
|
|
408
512
|
);
|
|
513
|
+
if (context.req.header("authorization")) {
|
|
514
|
+
// An integrating backend deletes the organization workspaces it
|
|
515
|
+
// provisions (tenant offboarding, test cleanup) with its organization
|
|
516
|
+
// key. This is exactly the authority `DELETE /v1/workspaces/:id` already
|
|
517
|
+
// grants that key - an organization workspace (never a Personal one) in
|
|
518
|
+
// the key's own organization, with `workspace:admin` - under the same
|
|
519
|
+
// quiescence rules. It confers no organization-administrator identity.
|
|
520
|
+
const workspaceId = parseId(WorkspaceId, context.req.param("workspaceId"), "workspace id");
|
|
521
|
+
await requireOrganizationKeyWorkspaceDeletion(context, deps, organizationId, workspaceId);
|
|
522
|
+
await deleteWorkspaceForRequest(deps, { accountId: organizationId, workspaceId });
|
|
523
|
+
return context.body(null, 204);
|
|
524
|
+
}
|
|
409
525
|
const { subjectId } = await requireOrganizationAdministrator(context, deps, organizationId);
|
|
410
526
|
const workspaceId = parseId(WorkspaceId, context.req.param("workspaceId"), "workspace id");
|
|
411
527
|
await deleteWorkspaceForRequest(deps, {
|
|
@@ -447,7 +563,7 @@ export function registerOrganizationMembershipRoutes(app: Hono, deps: ApiRouteDe
|
|
|
447
563
|
app.put(
|
|
448
564
|
"/v1/organizations/:organizationId/workspaces/:workspaceId/members/:membershipId",
|
|
449
565
|
async (context) => {
|
|
450
|
-
const { subjectId } = await
|
|
566
|
+
const { subjectId } = await requireOrganizationPerson(context, deps, "members:manage");
|
|
451
567
|
const organizationId = parseId(
|
|
452
568
|
OrganizationId,
|
|
453
569
|
context.req.param("organizationId"),
|
|
@@ -478,6 +594,23 @@ export function registerOrganizationMembershipRoutes(app: Hono, deps: ApiRouteDe
|
|
|
478
594
|
},
|
|
479
595
|
);
|
|
480
596
|
|
|
597
|
+
// Organization service key: replace an existing external member's
|
|
598
|
+
// permissions in one shared workspace (keyed, idempotent, non-destructive).
|
|
599
|
+
app.patch(
|
|
600
|
+
"/v1/organizations/:organizationId/workspaces/:workspaceId/external-members/:membershipId",
|
|
601
|
+
async (context) =>
|
|
602
|
+
context.json(
|
|
603
|
+
await updateExternalWorkspaceMemberForRequest(
|
|
604
|
+
context,
|
|
605
|
+
deps,
|
|
606
|
+
parseId(OrganizationId, context.req.param("organizationId"), "organization id"),
|
|
607
|
+
parseId(WorkspaceId, context.req.param("workspaceId"), "workspace id"),
|
|
608
|
+
parseId(MembershipId, context.req.param("membershipId"), "membership id"),
|
|
609
|
+
await readRequestJson(context),
|
|
610
|
+
),
|
|
611
|
+
),
|
|
612
|
+
);
|
|
613
|
+
|
|
481
614
|
app.post(
|
|
482
615
|
"/v1/organizations/:organizationId/workspaces/:workspaceId/members/:membershipId/revoke",
|
|
483
616
|
async (context) => {
|
|
@@ -494,7 +627,7 @@ export function registerOrganizationMembershipRoutes(app: Hono, deps: ApiRouteDe
|
|
|
494
627
|
),
|
|
495
628
|
);
|
|
496
629
|
}
|
|
497
|
-
const { subjectId } = await
|
|
630
|
+
const { subjectId } = await requireOrganizationPerson(context, deps, "members:manage");
|
|
498
631
|
const organizationId = parseId(
|
|
499
632
|
OrganizationId,
|
|
500
633
|
context.req.param("organizationId"),
|
|
@@ -527,20 +660,23 @@ export function registerOrganizationMembershipRoutes(app: Hono, deps: ApiRouteDe
|
|
|
527
660
|
);
|
|
528
661
|
|
|
529
662
|
app.get("/v1/organizations/:organizationId/private-session-settings", async (context) => {
|
|
530
|
-
const { subjectId } = await requireManagedHuman(context, deps);
|
|
531
663
|
const organizationId = parseId(
|
|
532
664
|
OrganizationId,
|
|
533
665
|
context.req.param("organizationId"),
|
|
534
666
|
"organization id",
|
|
535
667
|
);
|
|
668
|
+
const { subjectId } = await requirePrivateSessionAdministrator(context, deps, organizationId);
|
|
536
669
|
try {
|
|
670
|
+
const value = await getOrganizationPrivateSessionSettings(deps.db, {
|
|
671
|
+
organizationId,
|
|
672
|
+
actorSubjectId: subjectId,
|
|
673
|
+
});
|
|
674
|
+
// A deployment that turns Only me off makes it unavailable everywhere.
|
|
537
675
|
return context.json(
|
|
538
|
-
OrganizationPrivateSessionSettings.parse(
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
}),
|
|
543
|
-
),
|
|
676
|
+
OrganizationPrivateSessionSettings.parse({
|
|
677
|
+
...value,
|
|
678
|
+
available: value.available && privacyDeploymentLimits(deps.settings).onlyMeAllowed,
|
|
679
|
+
}),
|
|
544
680
|
);
|
|
545
681
|
} catch (error) {
|
|
546
682
|
rethrowMembershipError(error);
|
|
@@ -548,13 +684,16 @@ export function registerOrganizationMembershipRoutes(app: Hono, deps: ApiRouteDe
|
|
|
548
684
|
});
|
|
549
685
|
|
|
550
686
|
app.patch("/v1/organizations/:organizationId/private-session-settings", async (context) => {
|
|
551
|
-
const { subjectId } = await requireManagedHuman(context, deps);
|
|
552
687
|
const organizationId = parseId(
|
|
553
688
|
OrganizationId,
|
|
554
689
|
context.req.param("organizationId"),
|
|
555
690
|
"organization id",
|
|
556
691
|
);
|
|
692
|
+
const { subjectId } = await requirePrivateSessionAdministrator(context, deps, organizationId);
|
|
557
693
|
const payload = await parseBody(context, UpdateOrganizationPrivateSessionSettingsRequest);
|
|
694
|
+
if (payload.enabled && !privacyDeploymentLimits(deps.settings).onlyMeAllowed) {
|
|
695
|
+
throw new HTTPException(409, { message: "Only me is turned off for this app." });
|
|
696
|
+
}
|
|
558
697
|
try {
|
|
559
698
|
return context.json(
|
|
560
699
|
OrganizationPrivateSessionSettings.parse(
|
|
@@ -566,17 +705,64 @@ export function registerOrganizationMembershipRoutes(app: Hono, deps: ApiRouteDe
|
|
|
566
705
|
),
|
|
567
706
|
);
|
|
568
707
|
} catch (error) {
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
708
|
+
rethrowMembershipError(error);
|
|
709
|
+
}
|
|
710
|
+
});
|
|
711
|
+
|
|
712
|
+
// The organization's privacy choices: the default audience for new chats and
|
|
713
|
+
// schedules, and whether admins see that other people's Only me schedules
|
|
714
|
+
// exist. `limits` reports what this deployment fixes.
|
|
715
|
+
app.get("/v1/organizations/:organizationId/privacy-settings", async (context) => {
|
|
716
|
+
const organizationId = parseId(
|
|
717
|
+
OrganizationId,
|
|
718
|
+
context.req.param("organizationId"),
|
|
719
|
+
"organization id",
|
|
720
|
+
);
|
|
721
|
+
const { subjectId } = await requirePrivateSessionAdministrator(context, deps, organizationId);
|
|
722
|
+
try {
|
|
723
|
+
// The same owner/admin check the private session settings read makes.
|
|
724
|
+
await getOrganizationPrivateSessionSettings(deps.db, {
|
|
725
|
+
organizationId,
|
|
726
|
+
actorSubjectId: subjectId,
|
|
727
|
+
});
|
|
728
|
+
return context.json(
|
|
729
|
+
OrganizationPrivacySettings.parse(
|
|
730
|
+
await getOrganizationPrivacySettings(deps, organizationId),
|
|
731
|
+
),
|
|
732
|
+
);
|
|
733
|
+
} catch (error) {
|
|
734
|
+
rethrowMembershipError(error);
|
|
735
|
+
}
|
|
736
|
+
});
|
|
737
|
+
|
|
738
|
+
app.patch("/v1/organizations/:organizationId/privacy-settings", async (context) => {
|
|
739
|
+
const organizationId = parseId(
|
|
740
|
+
OrganizationId,
|
|
741
|
+
context.req.param("organizationId"),
|
|
742
|
+
"organization id",
|
|
743
|
+
);
|
|
744
|
+
const { subjectId } = await requirePrivateSessionAdministrator(context, deps, organizationId);
|
|
745
|
+
const request = await parseBody(context, UpdateOrganizationPrivacySettingsRequest);
|
|
746
|
+
try {
|
|
747
|
+
return context.json(
|
|
748
|
+
OrganizationPrivacySettings.parse(
|
|
749
|
+
await updateOrganizationPrivacySettings(deps, {
|
|
750
|
+
organizationId,
|
|
751
|
+
actorSubjectId: subjectId,
|
|
752
|
+
request,
|
|
753
|
+
}),
|
|
754
|
+
),
|
|
755
|
+
);
|
|
756
|
+
} catch (error) {
|
|
757
|
+
if (error instanceof OrganizationPrivacyLockedError) {
|
|
758
|
+
throw new HTTPException(409, { message: error.message });
|
|
573
759
|
}
|
|
574
760
|
rethrowMembershipError(error);
|
|
575
761
|
}
|
|
576
762
|
});
|
|
577
763
|
|
|
578
764
|
app.post("/v1/organizations/:organizationId/invitations", async (context) => {
|
|
579
|
-
const { subjectId } = await
|
|
765
|
+
const { subjectId } = await requireOrganizationPerson(context, deps, "members:manage");
|
|
580
766
|
const organizationId = parseId(
|
|
581
767
|
OrganizationId,
|
|
582
768
|
context.req.param("organizationId"),
|
|
@@ -630,7 +816,7 @@ export function registerOrganizationMembershipRoutes(app: Hono, deps: ApiRouteDe
|
|
|
630
816
|
});
|
|
631
817
|
|
|
632
818
|
app.get("/v1/organizations/:organizationId/invitations", async (context) => {
|
|
633
|
-
const { subjectId } = await
|
|
819
|
+
const { subjectId } = await requireOrganizationPerson(context, deps, "account:read");
|
|
634
820
|
const organizationId = parseId(
|
|
635
821
|
OrganizationId,
|
|
636
822
|
context.req.param("organizationId"),
|
|
@@ -661,7 +847,7 @@ export function registerOrganizationMembershipRoutes(app: Hono, deps: ApiRouteDe
|
|
|
661
847
|
app.post(
|
|
662
848
|
"/v1/organizations/:organizationId/invitations/:invitationId/delivery/retry",
|
|
663
849
|
async (context) => {
|
|
664
|
-
const { subjectId } = await
|
|
850
|
+
const { subjectId } = await requireOrganizationPerson(context, deps, "members:manage");
|
|
665
851
|
const organizationId = parseId(
|
|
666
852
|
OrganizationId,
|
|
667
853
|
context.req.param("organizationId"),
|
|
@@ -732,7 +918,7 @@ export function registerOrganizationMembershipRoutes(app: Hono, deps: ApiRouteDe
|
|
|
732
918
|
app.post(
|
|
733
919
|
"/v1/organizations/:organizationId/invitations/:invitationId/revoke",
|
|
734
920
|
async (context) => {
|
|
735
|
-
const { subjectId } = await
|
|
921
|
+
const { subjectId } = await requireOrganizationPerson(context, deps, "members:manage");
|
|
736
922
|
const organizationId = parseId(
|
|
737
923
|
OrganizationId,
|
|
738
924
|
context.req.param("organizationId"),
|
|
@@ -784,7 +970,7 @@ export function registerOrganizationMembershipRoutes(app: Hono, deps: ApiRouteDe
|
|
|
784
970
|
});
|
|
785
971
|
|
|
786
972
|
app.patch("/v1/organizations/:organizationId/members/:membershipId", async (context) => {
|
|
787
|
-
const { subjectId } = await
|
|
973
|
+
const { subjectId } = await requireOrganizationPerson(context, deps, "members:manage");
|
|
788
974
|
const organizationId = parseId(
|
|
789
975
|
OrganizationId,
|
|
790
976
|
context.req.param("organizationId"),
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { canonicalizeConfiguredModelId } from "@opengeni/config";
|
|
2
|
+
import {
|
|
3
|
+
OrganizationModelDefaults,
|
|
4
|
+
UpdateOrganizationModelDefaultsRequest,
|
|
5
|
+
} from "@opengeni/contracts";
|
|
6
|
+
import type { ApiRouteDeps } from "@opengeni/core";
|
|
7
|
+
import {
|
|
8
|
+
getOrganizationModelDefaultsForAdministrator,
|
|
9
|
+
nestedPostgresSqlState,
|
|
10
|
+
updateOrganizationModelDefaults,
|
|
11
|
+
} from "@opengeni/db";
|
|
12
|
+
import type { Hono } from "hono";
|
|
13
|
+
import { HTTPException } from "hono/http-exception";
|
|
14
|
+
import { z } from "zod";
|
|
15
|
+
|
|
16
|
+
import { requireOrganizationCodexHuman, requireSameOriginBrowserMutation } from "./codex";
|
|
17
|
+
|
|
18
|
+
const OrganizationId = z.string().uuid();
|
|
19
|
+
|
|
20
|
+
function parseOrganizationId(value: string | undefined): string {
|
|
21
|
+
const parsed = OrganizationId.safeParse(value);
|
|
22
|
+
if (!parsed.success) throw new HTTPException(404, { message: "organization not found" });
|
|
23
|
+
return parsed.data;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function refused(error: unknown): never {
|
|
27
|
+
if (nestedPostgresSqlState(error) === "42501") {
|
|
28
|
+
throw new HTTPException(403, {
|
|
29
|
+
message: "Only organization owners and admins can change model defaults",
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
if (error instanceof RangeError) throw new HTTPException(422, { message: error.message });
|
|
33
|
+
throw error;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Organization model defaults: what every workspace follows until it saves
|
|
38
|
+
* its own default model, allowed models or compaction trigger. Owners and
|
|
39
|
+
* admins read and change them; workspaces read them through their own model
|
|
40
|
+
* routes, which report where each value comes from.
|
|
41
|
+
*/
|
|
42
|
+
export function registerOrganizationModelDefaultsRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
43
|
+
const path = "/v1/organizations/:organizationId/model-defaults";
|
|
44
|
+
app.get(path, async (c) => {
|
|
45
|
+
c.header("cache-control", "private, no-store");
|
|
46
|
+
const organizationId = parseOrganizationId(c.req.param("organizationId"));
|
|
47
|
+
const human = await requireOrganizationCodexHuman(c, deps, organizationId);
|
|
48
|
+
try {
|
|
49
|
+
return c.json(
|
|
50
|
+
OrganizationModelDefaults.parse(
|
|
51
|
+
await getOrganizationModelDefaultsForAdministrator(deps.db, {
|
|
52
|
+
organizationId,
|
|
53
|
+
actorSubjectId: human.subjectId,
|
|
54
|
+
}),
|
|
55
|
+
),
|
|
56
|
+
);
|
|
57
|
+
} catch (error) {
|
|
58
|
+
refused(error);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
app.patch(path, async (c) => {
|
|
63
|
+
requireSameOriginBrowserMutation(c, deps);
|
|
64
|
+
const organizationId = parseOrganizationId(c.req.param("organizationId"));
|
|
65
|
+
const human = await requireOrganizationCodexHuman(c, deps, organizationId);
|
|
66
|
+
const parsed = UpdateOrganizationModelDefaultsRequest.safeParse(
|
|
67
|
+
await c.req.json().catch(() => null),
|
|
68
|
+
);
|
|
69
|
+
if (!parsed.success) {
|
|
70
|
+
throw new HTTPException(422, { message: "invalid organization model defaults" });
|
|
71
|
+
}
|
|
72
|
+
const { settings } = await deps.resolveCatalogSettings();
|
|
73
|
+
const canonical = (id: string) => canonicalizeConfiguredModelId(settings, id);
|
|
74
|
+
const patch = parsed.data;
|
|
75
|
+
try {
|
|
76
|
+
return c.json(
|
|
77
|
+
OrganizationModelDefaults.parse(
|
|
78
|
+
await updateOrganizationModelDefaults(deps.db, {
|
|
79
|
+
organizationId,
|
|
80
|
+
actorSubjectId: human.subjectId,
|
|
81
|
+
patch: {
|
|
82
|
+
...(patch.sessionDefaults === undefined
|
|
83
|
+
? {}
|
|
84
|
+
: {
|
|
85
|
+
sessionDefaults: patch.sessionDefaults
|
|
86
|
+
? { ...patch.sessionDefaults, model: canonical(patch.sessionDefaults.model) }
|
|
87
|
+
: null,
|
|
88
|
+
}),
|
|
89
|
+
...(patch.modelPolicy === undefined
|
|
90
|
+
? {}
|
|
91
|
+
: {
|
|
92
|
+
modelPolicy: {
|
|
93
|
+
allowedProviders: patch.modelPolicy?.allowedProviders ?? null,
|
|
94
|
+
allowedModels: patch.modelPolicy?.allowedModels
|
|
95
|
+
? [...new Set(patch.modelPolicy.allowedModels.map(canonical))]
|
|
96
|
+
: null,
|
|
97
|
+
},
|
|
98
|
+
}),
|
|
99
|
+
...(patch.modelCompactionThresholds === undefined
|
|
100
|
+
? {}
|
|
101
|
+
: { modelCompactionThresholds: patch.modelCompactionThresholds }),
|
|
102
|
+
},
|
|
103
|
+
}),
|
|
104
|
+
),
|
|
105
|
+
);
|
|
106
|
+
} catch (error) {
|
|
107
|
+
refused(error);
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { claudeProviderId, opperCredentialProblem } from "@opengeni/config";
|
|
1
2
|
import {
|
|
2
3
|
CreateOrganizationProviderCustomModelRequest,
|
|
3
4
|
DeleteOrganizationProviderCustomModelRequest,
|
|
@@ -25,6 +26,7 @@ import type { Context, Hono } from "hono";
|
|
|
25
26
|
import { HTTPException } from "hono/http-exception";
|
|
26
27
|
import { z } from "zod";
|
|
27
28
|
|
|
29
|
+
import { offerClaudeDefaultModels } from "../claude-default-models";
|
|
28
30
|
import { requireOrganizationCodexHuman, requireSameOriginBrowserMutation } from "./codex";
|
|
29
31
|
|
|
30
32
|
const OrganizationId = z.string().uuid();
|
|
@@ -48,7 +50,7 @@ function providerKind(value: string) {
|
|
|
48
50
|
}
|
|
49
51
|
|
|
50
52
|
function connectionJson(connection: {
|
|
51
|
-
providerKind: "vercel_gateway" | "openrouter";
|
|
53
|
+
providerKind: "vercel_gateway" | "openrouter" | "anthropic" | "claude_subscription" | "opper";
|
|
52
54
|
status: "active" | "revoked";
|
|
53
55
|
version: number;
|
|
54
56
|
createdAt: Date;
|
|
@@ -87,10 +89,28 @@ function conflict(error: unknown): never {
|
|
|
87
89
|
}
|
|
88
90
|
|
|
89
91
|
export function registerOrganizationModelProviderRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
92
|
+
app.use("/v1/organizations/:organizationId/model-providers/:providerKind", async (c, next) => {
|
|
93
|
+
if (
|
|
94
|
+
c.req.param("providerKind") === "claude_subscription" &&
|
|
95
|
+
!deps.settings.claudeSubscriptionEnabled
|
|
96
|
+
)
|
|
97
|
+
throw new HTTPException(404, { message: "Claude subscriptions are not enabled" });
|
|
98
|
+
await next();
|
|
99
|
+
});
|
|
100
|
+
app.use("/v1/organizations/:organizationId/model-providers/:providerKind/*", async (c, next) => {
|
|
101
|
+
if (
|
|
102
|
+
c.req.param("providerKind") === "claude_subscription" &&
|
|
103
|
+
!deps.settings.claudeSubscriptionEnabled
|
|
104
|
+
)
|
|
105
|
+
throw new HTTPException(404, { message: "Claude subscriptions are not enabled" });
|
|
106
|
+
await next();
|
|
107
|
+
});
|
|
90
108
|
app.get("/v1/organizations/:organizationId/model-providers/:providerKind", async (c) => {
|
|
91
109
|
c.header("cache-control", "private, no-store");
|
|
92
110
|
const organizationId = parseOrganizationId(c.req.param("organizationId"));
|
|
93
111
|
const human = await requireOrganizationCodexHuman(c, deps, organizationId);
|
|
112
|
+
if (c.req.param("providerKind") === "claude_subscription")
|
|
113
|
+
throw new HTTPException(410, { message: "Claude subscriptions use individual accounts." });
|
|
94
114
|
const connection = await getOrganizationModelProviderConnection(deps.db, {
|
|
95
115
|
organizationId,
|
|
96
116
|
actorSubjectId: human.subjectId,
|
|
@@ -98,6 +118,29 @@ export function registerOrganizationModelProviderRoutes(app: Hono, deps: ApiRout
|
|
|
98
118
|
});
|
|
99
119
|
return connection ? c.json(connectionJson(connection)) : c.json(null);
|
|
100
120
|
});
|
|
121
|
+
const usagePath = "/v1/organizations/:organizationId/model-providers/:providerKind/usage";
|
|
122
|
+
async function usageScope(c: Context) {
|
|
123
|
+
c.header("cache-control", "private, no-store");
|
|
124
|
+
if (providerKind(c.req.param("providerKind")!) !== "claude_subscription")
|
|
125
|
+
throw new HTTPException(404, { message: "Usage not available for this provider" });
|
|
126
|
+
const organizationId = parseOrganizationId(c.req.param("organizationId")!);
|
|
127
|
+
const human = await requireOrganizationCodexHuman(c, deps, organizationId);
|
|
128
|
+
return {
|
|
129
|
+
accountId: organizationId,
|
|
130
|
+
workspaceId: null,
|
|
131
|
+
scope: "organization" as const,
|
|
132
|
+
actorSubjectId: human.subjectId,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
app.get(usagePath, async (c) => {
|
|
136
|
+
await usageScope(c);
|
|
137
|
+
throw new HTTPException(410, { message: "Check usage on the individual Claude account." });
|
|
138
|
+
});
|
|
139
|
+
app.post(`${usagePath}/refresh`, async (c) => {
|
|
140
|
+
requireSameOriginBrowserMutation(c, deps);
|
|
141
|
+
await usageScope(c);
|
|
142
|
+
throw new HTTPException(410, { message: "Check usage on the individual Claude account." });
|
|
143
|
+
});
|
|
101
144
|
|
|
102
145
|
app.put("/v1/organizations/:organizationId/model-providers/:providerKind", async (c) => {
|
|
103
146
|
c.header("cache-control", "private, no-store");
|
|
@@ -109,6 +152,20 @@ export function registerOrganizationModelProviderRoutes(app: Hono, deps: ApiRout
|
|
|
109
152
|
UpsertOrganizationModelProviderConnectionRequest,
|
|
110
153
|
"invalid organization model provider connection",
|
|
111
154
|
);
|
|
155
|
+
const kind = providerKind(c.req.param("providerKind"));
|
|
156
|
+
if (kind === "claude_subscription")
|
|
157
|
+
throw new HTTPException(410, { message: "Claude subscriptions use individual accounts." });
|
|
158
|
+
if (kind === "anthropic" && !/^sk-ant-api[0-9]+-\S+$/.test(payload.apiKey))
|
|
159
|
+
throw new HTTPException(422, {
|
|
160
|
+
message: "Enter an Anthropic API key. Use Claude subscription for setup tokens.",
|
|
161
|
+
});
|
|
162
|
+
const opperProblem = kind === "opper" ? opperCredentialProblem(payload.apiKey) : null;
|
|
163
|
+
if (opperProblem) throw new HTTPException(422, { message: opperProblem });
|
|
164
|
+
if (payload.claudeIdentity)
|
|
165
|
+
throw new HTTPException(422, {
|
|
166
|
+
message: "Claude identity is only valid for subscription connections.",
|
|
167
|
+
});
|
|
168
|
+
const credential = payload.apiKey;
|
|
112
169
|
try {
|
|
113
170
|
const connection = await upsertOrganizationModelProviderConnection(deps.db, {
|
|
114
171
|
organizationId,
|
|
@@ -116,14 +173,20 @@ export function registerOrganizationModelProviderRoutes(app: Hono, deps: ApiRout
|
|
|
116
173
|
providerKind: providerKind(c.req.param("providerKind")),
|
|
117
174
|
credentialEncrypted: encryptEnvironmentValue(
|
|
118
175
|
requireEnvironmentEncryption(deps.settings),
|
|
119
|
-
|
|
176
|
+
credential,
|
|
120
177
|
),
|
|
121
|
-
credentialDigest: organizationModelProviderCredentialDigest(
|
|
178
|
+
credentialDigest: organizationModelProviderCredentialDigest(credential),
|
|
122
179
|
operationId: payload.operationId,
|
|
123
180
|
...(payload.expectedVersion === undefined
|
|
124
181
|
? {}
|
|
125
182
|
: { expectedVersion: payload.expectedVersion }),
|
|
126
183
|
});
|
|
184
|
+
if (kind === "anthropic")
|
|
185
|
+
await offerClaudeDefaultModels(deps, {
|
|
186
|
+
organizationId,
|
|
187
|
+
actorSubjectId: human.subjectId,
|
|
188
|
+
providerKind: kind,
|
|
189
|
+
});
|
|
127
190
|
return c.json(connectionJson(connection));
|
|
128
191
|
} catch (error) {
|
|
129
192
|
conflict(error);
|
|
@@ -141,6 +204,8 @@ export function registerOrganizationModelProviderRoutes(app: Hono, deps: ApiRout
|
|
|
141
204
|
"invalid organization model provider disconnect",
|
|
142
205
|
);
|
|
143
206
|
try {
|
|
207
|
+
if (c.req.param("providerKind") === "claude_subscription")
|
|
208
|
+
throw new HTTPException(410, { message: "Claude subscriptions use individual accounts." });
|
|
144
209
|
const connection = await revokeOrganizationModelProviderConnection(deps.db, {
|
|
145
210
|
organizationId,
|
|
146
211
|
actorSubjectId: human.subjectId,
|
|
@@ -182,6 +247,12 @@ export function registerOrganizationModelProviderRoutes(app: Hono, deps: ApiRout
|
|
|
182
247
|
CreateOrganizationProviderCustomModelRequest,
|
|
183
248
|
"invalid organization custom model",
|
|
184
249
|
);
|
|
250
|
+
const kind = providerKind(c.req.param("providerKind"));
|
|
251
|
+
if (
|
|
252
|
+
(kind === "anthropic" || kind === "claude_subscription") &&
|
|
253
|
+
`${claudeProviderId(kind)}/${payload.upstreamModelId}`.length > 256
|
|
254
|
+
)
|
|
255
|
+
throw new HTTPException(422, { message: "Claude model ID is too long" });
|
|
185
256
|
try {
|
|
186
257
|
const model = await createOrganizationModelProviderCustomModel(deps.db, {
|
|
187
258
|
organizationId,
|