@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,147 @@
|
|
|
1
|
+
// Claude usage routes on the shared subscription core (design 5.3, Claude
|
|
2
|
+
// track C2a, EP-N24 and EP-S13). The usage routes read the organization's
|
|
3
|
+
// Claude provider route once after authentication: missing or disabled
|
|
4
|
+
// receipts answer a typed 503; `core` projects the connection's quota in the legacy
|
|
5
|
+
// `ClaudeSubscriptionUsage` shape. Paths, auth checks and cache headers are
|
|
6
|
+
// the legacy ones. A refresh reads live: a shared connection of the
|
|
7
|
+
// workspace's pool through the core connection seam, the caller's own
|
|
8
|
+
// personal connection in their own Personal workspace through the owner-only
|
|
9
|
+
// seam, and an organization-pool connection on the organization route
|
|
10
|
+
// through the administrator seam (design 5.3, C2c).
|
|
11
|
+
import type { Context } from "hono";
|
|
12
|
+
import { HTTPException } from "hono/http-exception";
|
|
13
|
+
import type { ClaudeSubscriptionUsage } from "@opengeni/contracts";
|
|
14
|
+
import type { ApiRouteDeps } from "@opengeni/core";
|
|
15
|
+
import {
|
|
16
|
+
deliverSubscriptionCoreProviderWake,
|
|
17
|
+
projectSubscriptionCoreClaudeUsage,
|
|
18
|
+
readSubscriptionCoreClaudeOrganizationUsageRow,
|
|
19
|
+
readSubscriptionCoreClaudeWorkspaceUsageTarget,
|
|
20
|
+
readSubscriptionCoreProviderRouteForWorkspace,
|
|
21
|
+
refreshSubscriptionCoreClaudeOrganizationUsage,
|
|
22
|
+
refreshSubscriptionCoreClaudeWorkspaceUsage,
|
|
23
|
+
} from "@opengeni/db";
|
|
24
|
+
import { ApiHttpError } from "../http/api-error";
|
|
25
|
+
import { SUBSCRIPTION_CORE_CUTOVER_DISABLED } from "./codex-core";
|
|
26
|
+
import {
|
|
27
|
+
requirePrivateSubscriptionHuman,
|
|
28
|
+
requireSubscriptionScopeMutation,
|
|
29
|
+
} from "./subscription-pool-access";
|
|
30
|
+
|
|
31
|
+
/** An authenticated usage caller whose organization serves Claude from the core. */
|
|
32
|
+
export type CoreClaudeUsageCaller = {
|
|
33
|
+
core: true;
|
|
34
|
+
accountId: string;
|
|
35
|
+
/** Null on the organization path. */
|
|
36
|
+
workspaceId: string | null;
|
|
37
|
+
subjectId: string;
|
|
38
|
+
/** The route's account id: a canonical connection id or a cutover alias. */
|
|
39
|
+
accountIdParam: string;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Require Claude's core route for an authenticated usage caller. Missing or
|
|
44
|
+
* disabled receipts fail closed with the typed 503 the Codex routes use.
|
|
45
|
+
*/
|
|
46
|
+
export async function claudeUsageRoute(
|
|
47
|
+
deps: ApiRouteDeps,
|
|
48
|
+
accountId: string,
|
|
49
|
+
workspaceId: string | null,
|
|
50
|
+
): Promise<"core"> {
|
|
51
|
+
const route = await readSubscriptionCoreProviderRouteForWorkspace(deps.db, {
|
|
52
|
+
accountId,
|
|
53
|
+
workspaceId,
|
|
54
|
+
provider: "claude",
|
|
55
|
+
});
|
|
56
|
+
if (route !== "core") {
|
|
57
|
+
throw new ApiHttpError(503, {
|
|
58
|
+
code: "upstream_unavailable",
|
|
59
|
+
message: "Claude subscriptions are paused for maintenance in this organization",
|
|
60
|
+
retryable: true,
|
|
61
|
+
outcomeUnknown: false,
|
|
62
|
+
details: { reason: SUBSCRIPTION_CORE_CUTOVER_DISABLED },
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
return route;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Wake the Claude core waiters after a reading that ended a stored
|
|
70
|
+
* exhaustion. The reading already committed; a failed wake hint never fails
|
|
71
|
+
* the read (every core waiter has its own recheck).
|
|
72
|
+
*/
|
|
73
|
+
async function wakeAfterRecovery(
|
|
74
|
+
deps: ApiRouteDeps,
|
|
75
|
+
accountId: string,
|
|
76
|
+
result: { usage: ClaudeSubscriptionUsage; recovered: boolean },
|
|
77
|
+
): Promise<ClaudeSubscriptionUsage> {
|
|
78
|
+
if (result.recovered) {
|
|
79
|
+
await deliverSubscriptionCoreProviderWake(deps.db, "claude", {
|
|
80
|
+
accountId,
|
|
81
|
+
reason: "usage_recovered",
|
|
82
|
+
}).catch(() => undefined);
|
|
83
|
+
}
|
|
84
|
+
return result.usage;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/** GET or POST refresh of one Claude account's usage on the core. */
|
|
88
|
+
export async function coreClaudeUsage(
|
|
89
|
+
c: Context,
|
|
90
|
+
deps: ApiRouteDeps,
|
|
91
|
+
caller: CoreClaudeUsageCaller,
|
|
92
|
+
mutation: boolean,
|
|
93
|
+
): Promise<ClaudeSubscriptionUsage> {
|
|
94
|
+
if (caller.workspaceId === null) {
|
|
95
|
+
const row = await readSubscriptionCoreClaudeOrganizationUsageRow(deps.db, {
|
|
96
|
+
organizationId: caller.accountId,
|
|
97
|
+
subjectId: caller.subjectId,
|
|
98
|
+
accountIdParam: caller.accountIdParam,
|
|
99
|
+
});
|
|
100
|
+
if (!row) throw new HTTPException(404, { message: "Claude account not found" });
|
|
101
|
+
if (!mutation) return projectSubscriptionCoreClaudeUsage(row);
|
|
102
|
+
return await wakeAfterRecovery(
|
|
103
|
+
deps,
|
|
104
|
+
caller.accountId,
|
|
105
|
+
await refreshSubscriptionCoreClaudeOrganizationUsage(
|
|
106
|
+
deps.db,
|
|
107
|
+
deps.settings,
|
|
108
|
+
{ organizationId: caller.accountId, subjectId: caller.subjectId, row },
|
|
109
|
+
deps.claudeFetch ? { fetchImpl: deps.claudeFetch } : {},
|
|
110
|
+
),
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
const workspaceId = caller.workspaceId;
|
|
114
|
+
const target = await readSubscriptionCoreClaudeWorkspaceUsageTarget(deps.db, {
|
|
115
|
+
accountId: caller.accountId,
|
|
116
|
+
workspaceId,
|
|
117
|
+
subjectId: caller.subjectId,
|
|
118
|
+
accountIdParam: caller.accountIdParam,
|
|
119
|
+
});
|
|
120
|
+
if (!target) throw new HTTPException(404, { message: "Claude account not found" });
|
|
121
|
+
// The legacy authority checks, by the scope the connection maps to. A
|
|
122
|
+
// personal connection lives only in its owner's own Personal workspace on
|
|
123
|
+
// the core (D-03), so its verified owner is checked there, never through
|
|
124
|
+
// the legacy ordinary-workspace membership rule (which no Personal
|
|
125
|
+
// workspace passes).
|
|
126
|
+
if (target.scope === "user")
|
|
127
|
+
await requirePrivateSubscriptionHuman(c, deps, workspaceId, "Claude", "personal_workspace");
|
|
128
|
+
if (!mutation) return projectSubscriptionCoreClaudeUsage(target.row);
|
|
129
|
+
await requireSubscriptionScopeMutation(
|
|
130
|
+
c,
|
|
131
|
+
deps,
|
|
132
|
+
workspaceId,
|
|
133
|
+
target.scope,
|
|
134
|
+
"Claude",
|
|
135
|
+
"personal_workspace",
|
|
136
|
+
);
|
|
137
|
+
return await wakeAfterRecovery(
|
|
138
|
+
deps,
|
|
139
|
+
caller.accountId,
|
|
140
|
+
await refreshSubscriptionCoreClaudeWorkspaceUsage(
|
|
141
|
+
deps.db,
|
|
142
|
+
deps.settings,
|
|
143
|
+
{ accountId: caller.accountId, workspaceId, subjectId: caller.subjectId, target },
|
|
144
|
+
deps.claudeFetch ? { fetchImpl: deps.claudeFetch } : {},
|
|
145
|
+
),
|
|
146
|
+
);
|
|
147
|
+
}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { createHmac } from "node:crypto";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { requireEnvironmentEncryption } from "@opengeni/core";
|
|
4
|
+
import { ClaudeSubscriptionCredential } from "@opengeni/config";
|
|
5
|
+
import type { ClaudeSubscriptionAccountMetadata } from "@opengeni/db";
|
|
6
|
+
|
|
7
|
+
import { prepareClaudeSubscriptionCredential } from "../claude-workspace-connection";
|
|
8
|
+
import { requireAccessGrant } from "@opengeni/core";
|
|
9
|
+
import { ClaudeSubscriptionUsage, ClaudeSubscriptionSetupTokenRequest } from "@opengeni/contracts";
|
|
10
|
+
|
|
11
|
+
import { requireOrganizationCodexHuman } from "./codex";
|
|
12
|
+
import {
|
|
13
|
+
requireSameOriginBrowserMutation,
|
|
14
|
+
requireSubscriptionScopeMutation,
|
|
15
|
+
} from "./subscription-pool-access";
|
|
16
|
+
|
|
17
|
+
import { HTTPException } from "hono/http-exception";
|
|
18
|
+
import type { Context } from "hono";
|
|
19
|
+
|
|
20
|
+
import type { ApiRouteDeps } from "@opengeni/core";
|
|
21
|
+
import type { Hono } from "hono";
|
|
22
|
+
import { offerClaudeDefaultModels } from "../claude-default-models";
|
|
23
|
+
import { registerSubscriptionAccountPoolRoutes } from "./subscription-account-pools";
|
|
24
|
+
import { claudeUsageRoute, coreClaudeUsage, type CoreClaudeUsageCaller } from "./claude-core-usage";
|
|
25
|
+
import {
|
|
26
|
+
claudeCoreAccount,
|
|
27
|
+
claudeCoreRoute,
|
|
28
|
+
claudePoolCore,
|
|
29
|
+
connectClaudeCore,
|
|
30
|
+
requireClaudeCorePersonalWorkspace,
|
|
31
|
+
} from "../claude-subscription-core";
|
|
32
|
+
import { deliverPoolCoreWake } from "./subscription-pool-core";
|
|
33
|
+
import { managedCookieHuman } from "./subscription-pool-access";
|
|
34
|
+
|
|
35
|
+
function accountJson(account: ClaudeSubscriptionAccountMetadata, activeId: string | null) {
|
|
36
|
+
return {
|
|
37
|
+
id: account.id,
|
|
38
|
+
scope: account.scope,
|
|
39
|
+
subject: account.providerAccountId ?? account.id,
|
|
40
|
+
email: account.accountEmail,
|
|
41
|
+
label: account.label,
|
|
42
|
+
plan: account.planType,
|
|
43
|
+
status: account.status,
|
|
44
|
+
active: account.id === activeId,
|
|
45
|
+
version: account.version,
|
|
46
|
+
expiresAt: account.expiresAt?.toISOString() ?? null,
|
|
47
|
+
lastRefreshAt: account.lastRefreshAt?.toISOString() ?? null,
|
|
48
|
+
lastError: account.lastError,
|
|
49
|
+
allocatorEnabled: account.allocatorEnabled,
|
|
50
|
+
allocatorVersion: account.allocatorVersion,
|
|
51
|
+
allocatorUpdatedAt: account.allocatorUpdatedAt?.toISOString() ?? null,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const CLAUDE_CORE = claudePoolCore(accountJson);
|
|
56
|
+
const SETUP_TOKEN_CHANGED = "Claude account changed. Reload it before replacing the token.";
|
|
57
|
+
|
|
58
|
+
export function registerClaudeSubscriptionAccountRoutes(app: Hono, deps: ApiRouteDeps) {
|
|
59
|
+
registerSubscriptionAccountPoolRoutes(app, deps, {
|
|
60
|
+
provider: "claude",
|
|
61
|
+
route: "claude",
|
|
62
|
+
displayName: "Claude",
|
|
63
|
+
enabled: () => deps.settings.claudeSubscriptionEnabled,
|
|
64
|
+
accountJson,
|
|
65
|
+
core: CLAUDE_CORE,
|
|
66
|
+
});
|
|
67
|
+
async function usageAuthority(
|
|
68
|
+
c: Context,
|
|
69
|
+
organization: boolean,
|
|
70
|
+
mutation: boolean,
|
|
71
|
+
): Promise<CoreClaudeUsageCaller> {
|
|
72
|
+
c.header("cache-control", "private, no-store");
|
|
73
|
+
if (!deps.settings.claudeSubscriptionEnabled)
|
|
74
|
+
throw new HTTPException(404, { message: "Claude subscriptions are not enabled" });
|
|
75
|
+
const credentialId = z.string().uuid().safeParse(c.req.param("accountId"));
|
|
76
|
+
if (!credentialId.success)
|
|
77
|
+
throw new HTTPException(400, { message: "Invalid Claude account ID" });
|
|
78
|
+
if (mutation && !c.req.header("authorization")) requireSameOriginBrowserMutation(c, deps);
|
|
79
|
+
if (organization) {
|
|
80
|
+
const accountId = c.req.param("organizationId")!;
|
|
81
|
+
const human = await requireOrganizationCodexHuman(c, deps, accountId);
|
|
82
|
+
await claudeUsageRoute(deps, accountId, null);
|
|
83
|
+
return {
|
|
84
|
+
core: true,
|
|
85
|
+
accountId,
|
|
86
|
+
workspaceId: null,
|
|
87
|
+
subjectId: human.subjectId,
|
|
88
|
+
accountIdParam: credentialId.data,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
const workspaceId = c.req.param("workspaceId")!;
|
|
92
|
+
const grant = await requireAccessGrant(c, deps, workspaceId, "workspace:read");
|
|
93
|
+
await claudeUsageRoute(deps, grant.accountId, workspaceId);
|
|
94
|
+
return {
|
|
95
|
+
core: true,
|
|
96
|
+
accountId: grant.accountId,
|
|
97
|
+
workspaceId,
|
|
98
|
+
subjectId: grant.subjectId,
|
|
99
|
+
accountIdParam: credentialId.data,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
for (const organization of [false, true]) {
|
|
103
|
+
const path = organization
|
|
104
|
+
? "/v1/organizations/:organizationId/claude/accounts/:accountId/usage"
|
|
105
|
+
: "/v1/workspaces/:workspaceId/claude/accounts/:accountId/usage";
|
|
106
|
+
app.get(path, async (c) => {
|
|
107
|
+
const authority = await usageAuthority(c, organization, false);
|
|
108
|
+
return c.json(
|
|
109
|
+
ClaudeSubscriptionUsage.parse(await coreClaudeUsage(c, deps, authority, false)),
|
|
110
|
+
);
|
|
111
|
+
});
|
|
112
|
+
app.post(path + "/refresh", async (c) => {
|
|
113
|
+
const authority = await usageAuthority(c, organization, true);
|
|
114
|
+
return c.json(ClaudeSubscriptionUsage.parse(await coreClaudeUsage(c, deps, authority, true)));
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const setupRequest = ClaudeSubscriptionSetupTokenRequest;
|
|
119
|
+
for (const organization of [false, true]) {
|
|
120
|
+
const path = organization
|
|
121
|
+
? "/v1/organizations/:organizationId/claude/accounts/setup-token"
|
|
122
|
+
: "/v1/workspaces/:workspaceId/claude/accounts/setup-token";
|
|
123
|
+
app.post(path, async (c) => {
|
|
124
|
+
c.header("cache-control", "private, no-store");
|
|
125
|
+
if (!deps.settings.claudeSubscriptionEnabled)
|
|
126
|
+
throw new HTTPException(404, { message: "Claude subscriptions are not enabled" });
|
|
127
|
+
requireSameOriginBrowserMutation(c, deps);
|
|
128
|
+
const parsed = setupRequest.safeParse(await c.req.json().catch(() => null));
|
|
129
|
+
if (!parsed.success || (organization && parsed.data.scope !== "workspace"))
|
|
130
|
+
throw new HTTPException(422, { message: "Enter the Claude setup token." });
|
|
131
|
+
const actor = organization
|
|
132
|
+
? {
|
|
133
|
+
organizationId: c.req.param("organizationId")!,
|
|
134
|
+
...(await requireOrganizationCodexHuman(c, deps, c.req.param("organizationId")!)),
|
|
135
|
+
}
|
|
136
|
+
: null;
|
|
137
|
+
const workspaceId = organization ? null : c.req.param("workspaceId")!;
|
|
138
|
+
// The runtime first (one receipt read), so a private account on the
|
|
139
|
+
// core is authorized in the owner's Personal workspace, where the core
|
|
140
|
+
// keeps it, and refused (403) anywhere else. The read grant naming the
|
|
141
|
+
// organization is taken only once a receipt exists (the callback), so
|
|
142
|
+
// legacy authorizes exactly as before.
|
|
143
|
+
const read: { grant?: Awaited<ReturnType<typeof requireAccessGrant>> } = {};
|
|
144
|
+
await claudeCoreRoute(deps, async () => {
|
|
145
|
+
if (actor) return actor.organizationId;
|
|
146
|
+
read.grant = await requireAccessGrant(c, deps, workspaceId!, "workspace:read");
|
|
147
|
+
return read.grant.accountId;
|
|
148
|
+
});
|
|
149
|
+
if (workspaceId && parsed.data.scope === "user") {
|
|
150
|
+
if (!read.grant) throw new Error("core Claude route without its read grant");
|
|
151
|
+
await requireClaudeCorePersonalWorkspace(deps, {
|
|
152
|
+
accountId: read.grant.accountId,
|
|
153
|
+
workspaceId,
|
|
154
|
+
subjectId: read.grant.subjectId,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
const authority = workspaceId
|
|
158
|
+
? await requireSubscriptionScopeMutation(
|
|
159
|
+
c,
|
|
160
|
+
deps,
|
|
161
|
+
workspaceId,
|
|
162
|
+
parsed.data.scope,
|
|
163
|
+
"Claude",
|
|
164
|
+
"personal_workspace",
|
|
165
|
+
)
|
|
166
|
+
: null;
|
|
167
|
+
const accountId = actor?.organizationId ?? authority!.accountId;
|
|
168
|
+
const subjectId = actor?.subjectId ?? authority!.subjectId;
|
|
169
|
+
const encryptionKey = requireEnvironmentEncryption(deps.settings);
|
|
170
|
+
const reconnectId = parsed.data.reconnectAccountId;
|
|
171
|
+
|
|
172
|
+
const scope = workspaceId ? parsed.data.scope : "organization";
|
|
173
|
+
const personal = scope === "user";
|
|
174
|
+
const target = reconnectId
|
|
175
|
+
? await claudeCoreAccount(deps, { accountId, workspaceId, subjectId }, reconnectId)
|
|
176
|
+
: null;
|
|
177
|
+
if (
|
|
178
|
+
reconnectId &&
|
|
179
|
+
(!target ||
|
|
180
|
+
target.version !== parsed.data.expectedCredentialVersion ||
|
|
181
|
+
target.scope !== scope)
|
|
182
|
+
)
|
|
183
|
+
throw new HTTPException(409, { message: SETUP_TOKEN_CHANGED });
|
|
184
|
+
const connected = await connectClaudeCore(
|
|
185
|
+
deps.db,
|
|
186
|
+
{
|
|
187
|
+
accountId,
|
|
188
|
+
workspaceId,
|
|
189
|
+
subjectId,
|
|
190
|
+
...(personal ? { personal: true } : {}),
|
|
191
|
+
encryptionKey,
|
|
192
|
+
credential: ClaudeSubscriptionCredential.parse(
|
|
193
|
+
JSON.parse(
|
|
194
|
+
prepareClaudeSubscriptionCredential(
|
|
195
|
+
deps.settings,
|
|
196
|
+
workspaceId ? "workspace:" + workspaceId : "organization:" + accountId,
|
|
197
|
+
parsed.data.token,
|
|
198
|
+
),
|
|
199
|
+
),
|
|
200
|
+
),
|
|
201
|
+
providerAccountId:
|
|
202
|
+
"setup:" + createHmac("sha256", encryptionKey).update(parsed.data.token).digest("hex"),
|
|
203
|
+
accountEmail: null,
|
|
204
|
+
planType: null,
|
|
205
|
+
label: target?.label ?? parsed.data.label ?? "Claude subscription",
|
|
206
|
+
connectedBySubjectId: (await managedCookieHuman(c, deps))?.subjectId ?? null,
|
|
207
|
+
...(target
|
|
208
|
+
? {
|
|
209
|
+
reconnectTarget: {
|
|
210
|
+
connectionId: target.id,
|
|
211
|
+
expectedVersion: target.version,
|
|
212
|
+
providerAccountId: target.providerAccountId,
|
|
213
|
+
},
|
|
214
|
+
}
|
|
215
|
+
: {}),
|
|
216
|
+
},
|
|
217
|
+
SETUP_TOKEN_CHANGED,
|
|
218
|
+
);
|
|
219
|
+
await deliverPoolCoreWake(deps, CLAUDE_CORE, connected.wake);
|
|
220
|
+
await offerClaudeDefaultModels(deps, {
|
|
221
|
+
...(workspaceId ? { accountId, workspaceId } : { organizationId: accountId }),
|
|
222
|
+
actorSubjectId: subjectId,
|
|
223
|
+
providerKind: "claude_subscription",
|
|
224
|
+
});
|
|
225
|
+
return c.json({
|
|
226
|
+
connected: true,
|
|
227
|
+
accountId: connected.id,
|
|
228
|
+
credentialVersion: connected.version,
|
|
229
|
+
scope,
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { requireSubscriptionScopeMutation } from "./subscription-pool-access";
|
|
2
|
+
import {
|
|
3
|
+
ClaudeSubscriptionOAuthCompleteRequest,
|
|
4
|
+
ClaudeSubscriptionOAuthStartRequest,
|
|
5
|
+
} from "@opengeni/contracts";
|
|
6
|
+
import { requireAccessGrant, requireFreshAccessGrant, type ApiRouteDeps } from "@opengeni/core";
|
|
7
|
+
import { type Context, type Hono } from "hono";
|
|
8
|
+
import { HTTPException } from "hono/http-exception";
|
|
9
|
+
import { z } from "zod";
|
|
10
|
+
import { hashCodexBrowserSession } from "../codex-redemption-security";
|
|
11
|
+
import { isConfiguredDeploymentKeyRequest } from "../http/auth";
|
|
12
|
+
import {
|
|
13
|
+
startClaudeSubscriptionOAuth,
|
|
14
|
+
completeClaudeSubscriptionOAuth,
|
|
15
|
+
type ClaudeOAuthScope,
|
|
16
|
+
} from "../claude-subscription-oauth";
|
|
17
|
+
import {
|
|
18
|
+
managedCookieHuman,
|
|
19
|
+
requireOrganizationCodexHuman,
|
|
20
|
+
requireSameOriginBrowserMutation,
|
|
21
|
+
} from "./codex";
|
|
22
|
+
import { claudeCoreRoute, requireClaudeCorePersonalWorkspace } from "../claude-subscription-core";
|
|
23
|
+
|
|
24
|
+
export function registerClaudeSubscriptionOAuthRoutes(
|
|
25
|
+
app: Hono,
|
|
26
|
+
deps: ApiRouteDeps,
|
|
27
|
+
fetchImpl: typeof fetch = globalThis.fetch,
|
|
28
|
+
) {
|
|
29
|
+
async function scope(
|
|
30
|
+
c: Context,
|
|
31
|
+
organization: boolean,
|
|
32
|
+
fresh = false,
|
|
33
|
+
): Promise<ClaudeOAuthScope> {
|
|
34
|
+
c.header("cache-control", "private, no-store");
|
|
35
|
+
if (!deps.settings.claudeSubscriptionEnabled)
|
|
36
|
+
throw new HTTPException(404, {
|
|
37
|
+
message: "Claude subscriptions are not enabled",
|
|
38
|
+
});
|
|
39
|
+
// A key-only deployment has no Opengeni sign-in, so its operator connects
|
|
40
|
+
// Claude with the deployment key itself (console or API).
|
|
41
|
+
const deploymentKey = !organization && isConfiguredDeploymentKeyRequest(c, deps.settings);
|
|
42
|
+
if (!deploymentKey) requireSameOriginBrowserMutation(c, deps);
|
|
43
|
+
const id = z
|
|
44
|
+
.string()
|
|
45
|
+
.uuid()
|
|
46
|
+
.safeParse(c.req.param(organization ? "organizationId" : "workspaceId"));
|
|
47
|
+
if (!id.success) throw new HTTPException(404, { message: "Scope not found" });
|
|
48
|
+
if (organization) {
|
|
49
|
+
const human = await requireOrganizationCodexHuman(c, deps, id.data, {
|
|
50
|
+
providerConsent: true,
|
|
51
|
+
});
|
|
52
|
+
return {
|
|
53
|
+
accountId: id.data,
|
|
54
|
+
workspaceId: null,
|
|
55
|
+
actorSubjectId: human.subjectId,
|
|
56
|
+
browserSessionHash: human.browserSessionHash,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
const grant = await (fresh ? requireFreshAccessGrant : requireAccessGrant)(
|
|
60
|
+
c,
|
|
61
|
+
deps,
|
|
62
|
+
id.data,
|
|
63
|
+
"connections:write",
|
|
64
|
+
);
|
|
65
|
+
const human = await managedCookieHuman(c, deps);
|
|
66
|
+
if (human && human.subjectId === grant.subjectId)
|
|
67
|
+
return {
|
|
68
|
+
accountId: grant.accountId,
|
|
69
|
+
workspaceId: id.data,
|
|
70
|
+
actorSubjectId: human.subjectId,
|
|
71
|
+
browserSessionHash: human.browserSessionHash,
|
|
72
|
+
};
|
|
73
|
+
if (deploymentKey && grant.principalKind === "configured_key" && grant.subjectId)
|
|
74
|
+
return {
|
|
75
|
+
accountId: grant.accountId,
|
|
76
|
+
workspaceId: id.data,
|
|
77
|
+
actorSubjectId: grant.subjectId,
|
|
78
|
+
browserSessionHash: await hashCodexBrowserSession("configured:" + grant.subjectId),
|
|
79
|
+
};
|
|
80
|
+
if (
|
|
81
|
+
deps.settings.productAccessMode === "local" &&
|
|
82
|
+
grant.subjectId &&
|
|
83
|
+
!c.req.header("authorization")
|
|
84
|
+
)
|
|
85
|
+
return {
|
|
86
|
+
accountId: grant.accountId,
|
|
87
|
+
workspaceId: id.data,
|
|
88
|
+
actorSubjectId: grant.subjectId,
|
|
89
|
+
browserSessionHash: await hashCodexBrowserSession("local:" + grant.subjectId),
|
|
90
|
+
};
|
|
91
|
+
throw new HTTPException(401, {
|
|
92
|
+
message: "Sign in to Opengeni to connect Claude.",
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Require the Claude cutover receipt at start and completion alike.
|
|
97
|
+
*/
|
|
98
|
+
async function oauthCore(c: Context, inputScope: ClaudeOAuthScope) {
|
|
99
|
+
await claudeCoreRoute(deps, async () => inputScope.accountId);
|
|
100
|
+
return { connectedBySubjectId: (await managedCookieHuman(c, deps))?.subjectId ?? null };
|
|
101
|
+
}
|
|
102
|
+
for (const organization of [false, true]) {
|
|
103
|
+
const path = organization
|
|
104
|
+
? "/v1/organizations/:organizationId/model-providers/claude_subscription/oauth"
|
|
105
|
+
: "/v1/workspaces/:workspaceId/model-providers/claude_subscription/oauth";
|
|
106
|
+
app.post(`${path}/start`, async (c) => {
|
|
107
|
+
const inputScope = await scope(c, organization);
|
|
108
|
+
const payload = ClaudeSubscriptionOAuthStartRequest.safeParse(
|
|
109
|
+
await c.req.json().catch(() => null),
|
|
110
|
+
);
|
|
111
|
+
if (!payload.success || (organization && payload.data.scope !== "workspace"))
|
|
112
|
+
throw new HTTPException(422, { message: "Choose where to connect this Claude account." });
|
|
113
|
+
// The runtime first: on the core a private account is authorized in
|
|
114
|
+
// the owner's Personal workspace and refused (403) anywhere else,
|
|
115
|
+
// before any Claude sign-in.
|
|
116
|
+
const core = await oauthCore(c, inputScope);
|
|
117
|
+
if (payload.data.scope === "user")
|
|
118
|
+
await requireClaudeCorePersonalWorkspace(deps, {
|
|
119
|
+
accountId: inputScope.accountId,
|
|
120
|
+
workspaceId: inputScope.workspaceId,
|
|
121
|
+
subjectId: inputScope.actorSubjectId,
|
|
122
|
+
});
|
|
123
|
+
if (!organization)
|
|
124
|
+
await requireSubscriptionScopeMutation(
|
|
125
|
+
c,
|
|
126
|
+
deps,
|
|
127
|
+
inputScope.workspaceId!,
|
|
128
|
+
payload.data.scope,
|
|
129
|
+
"Claude",
|
|
130
|
+
"personal_workspace",
|
|
131
|
+
);
|
|
132
|
+
return c.json(await startClaudeSubscriptionOAuth(deps, inputScope, payload.data, core));
|
|
133
|
+
});
|
|
134
|
+
app.post(`${path}/complete`, async (c) => {
|
|
135
|
+
const inputScope = await scope(c, organization);
|
|
136
|
+
const payload = ClaudeSubscriptionOAuthCompleteRequest.safeParse(
|
|
137
|
+
await c.req.json().catch(() => null),
|
|
138
|
+
);
|
|
139
|
+
if (!payload.success)
|
|
140
|
+
throw new HTTPException(422, {
|
|
141
|
+
message: "Enter the authorization code from Claude.",
|
|
142
|
+
});
|
|
143
|
+
const core = await oauthCore(c, inputScope);
|
|
144
|
+
return c.json(
|
|
145
|
+
await completeClaudeSubscriptionOAuth(
|
|
146
|
+
deps,
|
|
147
|
+
inputScope,
|
|
148
|
+
payload.data,
|
|
149
|
+
async (poolScope) => {
|
|
150
|
+
if (!organization)
|
|
151
|
+
await requireSubscriptionScopeMutation(
|
|
152
|
+
c,
|
|
153
|
+
deps,
|
|
154
|
+
inputScope.workspaceId!,
|
|
155
|
+
poolScope ?? "workspace",
|
|
156
|
+
"Claude",
|
|
157
|
+
"personal_workspace",
|
|
158
|
+
);
|
|
159
|
+
const fresh = await scope(c, organization, true);
|
|
160
|
+
if (
|
|
161
|
+
fresh.accountId !== inputScope.accountId ||
|
|
162
|
+
fresh.actorSubjectId !== inputScope.actorSubjectId ||
|
|
163
|
+
fresh.browserSessionHash !== inputScope.browserSessionHash
|
|
164
|
+
)
|
|
165
|
+
throw new HTTPException(403, {
|
|
166
|
+
message: "Your access changed during Claude sign-in. Start again.",
|
|
167
|
+
});
|
|
168
|
+
},
|
|
169
|
+
fetchImpl,
|
|
170
|
+
core,
|
|
171
|
+
),
|
|
172
|
+
);
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
}
|