@opengeni/api-router 0.30.3 → 1.0.0
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 +3 -0
- package/dist/admission-trace.d.ts +8 -0
- package/dist/api-websocket.d.ts +18 -0
- package/dist/app.d.ts +50 -2
- package/dist/app.js +12 -1
- package/dist/artifact-catalog-cursor.d.ts +27 -0
- package/dist/auth/managed-auth-attempt-context.d.ts +10 -0
- package/dist/auth/managed-auth-rate-limits.d.ts +167 -0
- package/dist/auth/managed-auth-session-adapter.d.ts +6 -0
- package/dist/auth/managed-auth.d.ts +102 -3
- package/dist/auth/managed-email.d.ts +29 -0
- package/dist/auth/managed-sign-in-notifications.d.ts +4 -0
- package/dist/auth/new-signups-gate.d.ts +23 -0
- package/dist/auth/organization-user-setup.d.ts +80 -0
- package/dist/auth/signup-funnel-metrics.d.ts +44 -0
- package/dist/browser-controller-authority.d.ts +1 -61
- package/dist/browser-ephemeral.d.ts +5 -0
- package/dist/browser-state-authority.d.ts +1 -27
- package/dist/chunk-6TZ5LG3O.js +123948 -0
- package/dist/chunk-6TZ5LG3O.js.map +1 -0
- package/dist/chunk-OGQDXVXY.js +18 -0
- package/dist/chunk-OGQDXVXY.js.map +1 -0
- package/dist/claude-subscription-account-conflicts.d.ts +1 -0
- package/dist/claude-subscription-account-usage.d.ts +39 -0
- package/dist/claude-subscription-oauth.d.ts +25 -0
- package/dist/claude-subscription-profile.d.ts +9 -0
- package/dist/claude-subscription-usage.d.ts +44 -0
- package/dist/claude-workspace-connection.d.ts +15 -0
- package/dist/codemode.d.ts +32 -1
- package/dist/company-brain-okf.d.ts +24 -0
- package/dist/connected-machine-computer-access.d.ts +11 -0
- package/dist/connection-ownership.d.ts +54 -0
- package/dist/controller-data-plane.d.ts +32 -0
- package/dist/editable-artifact-source-session.d.ts +3 -0
- package/dist/editable-artifact-websocket.d.ts +10 -18
- package/dist/editable-artifact-workspace-files.d.ts +1 -1
- package/dist/fatal-process-boundary.d.ts +25 -0
- package/dist/github-access.d.ts +31 -2
- package/dist/http/acting-person.d.ts +24 -0
- package/dist/http/api-contract-compat.d.ts +19 -0
- package/dist/http/api-error.d.ts +27 -1
- package/dist/http/cors.d.ts +17 -0
- package/dist/http/deprecation.d.ts +42 -0
- package/dist/http/interaction-control-error.d.ts +13 -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/request-body.d.ts +27 -0
- package/dist/http/request-source.d.ts +52 -0
- package/dist/http/sse.d.ts +17 -6
- package/dist/http/unmatched-route.d.ts +18 -0
- package/dist/http/user-content.d.ts +36 -0
- package/dist/http/websocket-upgrade-dispatch.d.ts +18 -0
- package/dist/index.d.ts +10 -3
- package/dist/index.js +1091 -162
- package/dist/index.js.map +1 -1
- package/dist/integration-endpoint-test.d.ts +20 -0
- package/dist/integrations/api-integrations.d.ts +2 -2
- package/dist/integrations/atlassian.d.ts +29 -3
- package/dist/integrations/connect-authority.d.ts +1 -0
- package/dist/integrations/connect-callback-return.d.ts +6 -0
- package/dist/integrations/fiken.d.ts +16 -2
- package/dist/integrations/github-app-connect.d.ts +47 -0
- package/dist/integrations/github-installation-proof.d.ts +3 -0
- package/dist/integrations/github-lens-connect.d.ts +116 -0
- package/dist/integrations/github-skill-source.d.ts +1 -5
- package/dist/integrations/google-drive.d.ts +24 -0
- package/dist/integrations/integration-commit-authority.d.ts +13 -0
- package/dist/integrations/marketplace-plugin.d.ts +2691 -0
- package/dist/integrations/oauth-client.d.ts +178 -18
- package/dist/integrations/oauth-profiles.d.ts +222 -0
- package/dist/integrations/oauth-return-path.d.ts +1 -0
- package/dist/integrations/personal-github-repositories.d.ts +84 -0
- package/dist/integrations/personal-github.d.ts +42 -0
- package/dist/integrations/pr-review-provider.d.ts +22 -0
- package/dist/integrations/provider-oauth.d.ts +19 -1
- package/dist/integrations/slack-app-home.d.ts +24 -0
- package/dist/integrations/slack-bot.d.ts +367 -12
- package/dist/integrations/slack-file-upload-flow.d.ts +62 -0
- package/dist/integrations/slack-install.d.ts +20 -0
- package/dist/integrations/slack-interactions.d.ts +107 -9
- package/dist/integrations/slack-mrkdwn.d.ts +41 -0
- package/dist/integrations/slack-routing.d.ts +120 -0
- package/dist/integrations/slack-session-defaults.d.ts +58 -0
- package/dist/integrations/slack-task-file-upload.d.ts +36 -0
- package/dist/integrations/social-oauth.d.ts +7 -0
- package/dist/interaction-agent-access.d.ts +15 -0
- package/dist/interaction-frame-proxy.d.ts +68 -0
- package/dist/interaction-metrics.d.ts +2 -0
- package/dist/mcp/action-catalog-types.d.ts +9 -0
- package/dist/mcp/action-catalog.gen.d.ts +2 -0
- package/dist/mcp/capability-account-readiness.d.ts +7 -0
- package/dist/mcp/child-read-evidence.d.ts +9 -0
- package/dist/mcp/command-read.d.ts +24 -0
- package/dist/mcp/company-profile-agent-admin.d.ts +44 -0
- package/dist/mcp/contract-input.d.ts +11 -0
- package/dist/mcp/documents.d.ts +7 -5
- package/dist/mcp/files.d.ts +2 -2
- package/dist/mcp/first-party-tool-permissions.d.ts +650 -0
- package/dist/mcp/knowledge-entries.d.ts +5 -0
- package/dist/mcp/orchestration-failure-diagnostic.d.ts +43 -0
- package/dist/mcp/receipts.d.ts +9 -0
- package/dist/mcp/request-abort.d.ts +19 -0
- package/dist/mcp/scheduled-task-input.d.ts +1189 -0
- package/dist/mcp/scheduled-task-view.d.ts +22 -4
- package/dist/mcp/server.d.ts +255 -3
- package/dist/mcp/session-event-view.d.ts +94 -0
- package/dist/mcp/session-view.d.ts +66 -2
- package/dist/mcp/session-wait.d.ts +174 -0
- package/dist/mcp-oauth.d.ts +52 -0
- package/dist/model-catalog.d.ts +11 -31
- package/dist/observability.d.ts +3 -1
- package/dist/organization-mcp.d.ts +52 -0
- package/dist/organization-recovery-notifications.d.ts +41 -0
- package/dist/routes/analytics-consent.d.ts +26 -0
- package/dist/routes/api-integrations.d.ts +25 -0
- package/dist/routes/api-keys.d.ts +17 -0
- package/dist/routes/artifact-catalog.d.ts +6 -0
- package/dist/routes/automations.d.ts +19 -0
- package/dist/routes/billing.d.ts +49 -0
- package/dist/routes/browser-sessions.d.ts +59 -2
- 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 +146 -0
- package/dist/routes/codex.d.ts +76 -2
- package/dist/routes/company-brain.d.ts +3 -0
- package/dist/routes/company-profile.d.ts +2 -1
- package/dist/routes/computer-sessions.d.ts +14 -0
- package/dist/routes/connect.d.ts +5 -0
- package/dist/routes/editable-artifacts.d.ts +2 -0
- package/dist/routes/external-identity-links.d.ts +6 -0
- package/dist/routes/feedback.d.ts +3 -0
- package/dist/routes/github-browser-pages.d.ts +12 -0
- package/dist/routes/github.d.ts +2 -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 +30 -1
- package/dist/routes/knowledge.d.ts +3 -0
- package/dist/routes/managed-auth-session-sets.d.ts +26 -0
- package/dist/routes/managed-onboarding.d.ts +29 -0
- package/dist/routes/managed-sign-in-methods.d.ts +6 -0
- package/dist/routes/model-connection-access.d.ts +3 -0
- package/dist/routes/organization-integration-policy.d.ts +3 -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-providers.d.ts +3 -0
- package/dist/routes/organization-recovery.d.ts +19 -0
- package/dist/routes/organization-service-accounts.d.ts +3 -0
- package/dist/routes/organization-sessions.d.ts +26 -0
- package/dist/routes/personal-github-git-broker.d.ts +29 -0
- package/dist/routes/personal-github.d.ts +3 -0
- package/dist/routes/pr-review-github.d.ts +3 -0
- package/dist/routes/pr-review.d.ts +3 -0
- package/dist/routes/session-artifact-associations.d.ts +4 -0
- package/dist/routes/session-history-imports.d.ts +9 -0
- package/dist/routes/sessions.d.ts +44 -6
- package/dist/routes/skill-content.d.ts +4 -0
- package/dist/routes/skill-install-authority.d.ts +6 -0
- package/dist/routes/subscription-account-pools.d.ts +34 -0
- package/dist/routes/subscription-pool-access.d.ts +16 -0
- package/dist/routes/supergrok.d.ts +6 -1
- package/dist/routes/usage-allowances.d.ts +12 -0
- package/dist/routes/user-resource-authorities.d.ts +3 -0
- package/dist/routes/workspace-artifacts.d.ts +2 -1
- package/dist/routes/workspace-capture.d.ts +10 -2
- package/dist/routes/workspace-integrations.d.ts +35 -0
- package/dist/routes/workspace-learning.d.ts +3 -0
- package/dist/routes/workspace-model-providers.d.ts +4 -0
- package/dist/routes/workspaces.d.ts +29 -0
- package/dist/sandbox/auth-callout.d.ts +8 -0
- package/dist/sandbox/channel-a.d.ts +19 -1
- package/dist/sandbox/connection-authority.d.ts +3 -0
- package/dist/sandbox/enrollment.d.ts +9 -1
- package/dist/sandbox/machines.d.ts +5 -2
- package/dist/sandbox/metrics-ingestion.d.ts +28 -20
- package/dist/sandbox/rematerialize.d.ts +2 -0
- package/dist/sandbox/session-attach-variable-sets.d.ts +30 -0
- package/dist/sandbox/viewer.d.ts +26 -1
- package/dist/sandbox-file-artifacts.d.ts +50 -0
- package/dist/scheduled-task-deletion.d.ts +13 -0
- package/dist/session-create-observability.d.ts +5 -0
- package/dist/session-event-view-MPS2OZD3.js +292 -0
- package/dist/session-event-view-MPS2OZD3.js.map +1 -0
- package/dist/site-session-origin.d.ts +13 -0
- package/dist/site-uploads.d.ts +41 -0
- package/dist/slack-reaction-files.d.ts +1 -1
- package/dist/temporal-schedule-cleanup.d.ts +1 -0
- package/dist/temporal-schedule-sync.d.ts +26 -0
- package/dist/transcription/providers/xai-subscription.d.ts +1 -0
- package/dist/transcription/service.d.ts +2 -1
- package/dist/work-discovery-observability.d.ts +33 -0
- package/dist/workspace-artifact-content.d.ts +28 -0
- package/dist/workspace-artifact-provenance.d.ts +7 -0
- package/dist/workspace-delete-observability.d.ts +10 -0
- package/dist/workspace-deletion.d.ts +6 -0
- package/dist/workspace-state-projection.d.ts +3 -5
- package/dist/workspace-tool-gateway-observability.d.ts +17 -0
- package/dist/workspace-tool-gateway.d.ts +123 -0
- package/dist/workspace-webhook-dispatch.d.ts +26 -0
- package/package.json +23 -19
- package/src/access-grant-rls.ts +75 -0
- package/src/admission-trace.ts +14 -0
- package/src/api-websocket.ts +23 -0
- package/src/app.ts +1967 -252
- package/src/artifact-catalog-cursor.ts +60 -0
- package/src/auth/managed-auth-attempt-context.ts +70 -0
- package/src/auth/managed-auth-rate-limits.ts +252 -0
- package/src/auth/managed-auth-session-adapter.ts +222 -0
- package/src/auth/managed-auth.ts +536 -60
- package/src/auth/managed-email.ts +174 -0
- 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 +307 -0
- package/src/auth/signup-funnel-metrics.ts +164 -0
- package/src/browser-controller-authority.ts +1 -186
- package/src/browser-ephemeral.ts +39 -0
- package/src/browser-state-authority.ts +1 -236
- package/src/claude-subscription-account-conflicts.ts +12 -0
- package/src/claude-subscription-account-usage.ts +48 -0
- package/src/claude-subscription-oauth.ts +362 -0
- package/src/claude-subscription-profile.ts +73 -0
- package/src/claude-subscription-usage.ts +97 -0
- package/src/claude-workspace-connection.ts +82 -0
- package/src/codemode.ts +194 -30
- package/src/codex-realtime.ts +8 -2
- package/src/company-brain-okf.ts +340 -0
- package/src/connected-machine-computer-access.ts +33 -0
- package/src/connection-ownership.ts +199 -0
- package/src/controller-data-plane.ts +81 -0
- package/src/editable-artifact-native-kernel.ts +26 -15
- package/src/editable-artifact-office-import.ts +28 -3
- package/src/editable-artifact-production.ts +23 -7
- package/src/editable-artifact-source-session.ts +123 -0
- package/src/editable-artifact-websocket.ts +27 -21
- package/src/editable-artifact-workspace-files.ts +31 -6
- package/src/fatal-process-boundary.ts +246 -0
- package/src/gateway-realtime.ts +1 -1
- package/src/github-access.ts +147 -5
- package/src/http/acting-person.ts +71 -0
- package/src/http/api-contract-compat.ts +49 -0
- package/src/http/api-error.ts +115 -1
- package/src/http/auth.ts +48 -0
- package/src/http/cors.ts +67 -0
- package/src/http/deprecation.ts +118 -0
- package/src/http/interaction-control-error.ts +164 -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/request-body.ts +127 -0
- package/src/http/request-source.ts +178 -0
- package/src/http/sse.ts +486 -132
- package/src/http/unmatched-route.ts +60 -0
- package/src/http/user-content.ts +158 -0
- package/src/http/websocket-upgrade-dispatch.ts +29 -0
- package/src/index.ts +157 -52
- package/src/integration-endpoint-test.ts +291 -0
- package/src/integrations/api-integrations.ts +98 -11
- package/src/integrations/atlassian.ts +474 -136
- package/src/integrations/connect-authority.ts +2 -0
- package/src/integrations/connect-callback-return.ts +86 -0
- package/src/integrations/fiken.ts +354 -64
- package/src/integrations/github-app-connect.ts +435 -0
- package/src/integrations/github-installation-proof.ts +60 -0
- package/src/integrations/github-lens-connect.ts +76 -0
- package/src/integrations/github-skill-source.ts +2 -142
- package/src/integrations/google-drive.ts +717 -225
- package/src/integrations/integration-commit-authority.ts +69 -0
- package/src/integrations/marketplace-plugin.ts +48 -0
- package/src/integrations/oauth-client.ts +1356 -459
- package/src/integrations/oauth-profiles.ts +537 -0
- package/src/integrations/oauth-return-path.ts +18 -0
- package/src/integrations/personal-github-repositories.ts +674 -0
- package/src/integrations/personal-github.ts +825 -0
- package/src/integrations/pr-review-provider.ts +246 -0
- package/src/integrations/provider-oauth.ts +250 -22
- package/src/integrations/slack-app-home.ts +300 -0
- package/src/integrations/slack-bot.ts +963 -239
- package/src/integrations/slack-file-upload-flow.ts +147 -0
- package/src/integrations/slack-install.ts +83 -0
- package/src/integrations/slack-interactions.ts +3167 -474
- package/src/integrations/slack-mrkdwn.ts +193 -0
- package/src/integrations/slack-routing.ts +337 -0
- package/src/integrations/slack-session-defaults.ts +224 -0
- package/src/integrations/slack-task-file-upload.ts +323 -0
- package/src/integrations/social-oauth.ts +213 -15
- package/src/interaction-agent-access.ts +48 -0
- package/src/interaction-frame-proxy.ts +409 -0
- package/src/interaction-metrics.ts +30 -0
- package/src/mcp/action-catalog-types.ts +9 -0
- package/src/mcp/action-catalog.gen.ts +6696 -0
- package/src/mcp/capability-account-readiness.ts +17 -0
- package/src/mcp/child-read-evidence.ts +19 -0
- package/src/mcp/command-read.ts +109 -0
- package/src/mcp/company-profile-agent-admin.ts +198 -0
- package/src/mcp/contract-input.ts +141 -0
- package/src/mcp/documents.ts +65 -377
- package/src/mcp/editable-artifacts.ts +12 -6
- package/src/mcp/files.ts +80 -43
- package/src/mcp/first-party-tool-permissions.ts +305 -0
- package/src/mcp/knowledge-entries.ts +322 -0
- package/src/mcp/orchestration-failure-diagnostic.ts +43 -0
- package/src/mcp/receipts.ts +34 -0
- package/src/mcp/request-abort.ts +44 -0
- package/src/mcp/scheduled-task-input.ts +76 -0
- package/src/mcp/scheduled-task-view.ts +44 -3
- package/src/mcp/server.ts +3030 -1267
- package/src/mcp/session-event-view.ts +383 -0
- package/src/mcp/session-view.ts +84 -3
- package/src/mcp/session-wait.ts +665 -0
- package/src/mcp-oauth.ts +1123 -0
- package/src/model-catalog.ts +91 -333
- package/src/observability.ts +15 -1
- package/src/organization-mcp.ts +397 -0
- package/src/organization-recovery-notifications.ts +103 -0
- package/src/routes/analytics-consent.ts +123 -0
- package/src/routes/api-integrations.ts +364 -74
- package/src/routes/api-keys.ts +336 -10
- package/src/routes/artifact-catalog.ts +279 -0
- package/src/routes/automations.ts +768 -0
- package/src/routes/billing.ts +461 -46
- package/src/routes/browser-sessions.ts +780 -112
- package/src/routes/canonical-human-identities.ts +90 -14
- package/src/routes/capabilities.ts +107 -6
- package/src/routes/channels.ts +20 -3
- package/src/routes/claude-subscription-accounts.ts +334 -0
- package/src/routes/claude-subscription-oauth.ts +142 -0
- package/src/routes/client-errors.ts +362 -0
- package/src/routes/codex.ts +833 -116
- package/src/routes/company-brain.ts +322 -0
- package/src/routes/company-profile.ts +65 -1
- package/src/routes/computer-sessions.ts +557 -106
- package/src/routes/connect.ts +1938 -0
- package/src/routes/connections.ts +1039 -349
- package/src/routes/documents.ts +488 -287
- package/src/routes/editable-artifacts.ts +79 -9
- package/src/routes/enrollments.ts +135 -39
- package/src/routes/environments.ts +154 -58
- package/src/routes/external-identity-links.ts +201 -0
- package/src/routes/feedback.ts +113 -0
- package/src/routes/files.ts +267 -33
- package/src/routes/github-browser-pages.ts +162 -0
- package/src/routes/github.ts +446 -144
- package/src/routes/insights-response-cache.ts +83 -0
- package/src/routes/insights-usage.ts +345 -0
- package/src/routes/insights.ts +153 -19
- package/src/routes/install.ts +133 -38
- package/src/routes/integration-facets.ts +107 -33
- package/src/routes/interaction-resources.ts +30 -3
- package/src/routes/knowledge.ts +488 -0
- package/src/routes/machines.ts +313 -15
- package/src/routes/managed-auth-session-sets.ts +1218 -0
- package/src/routes/managed-onboarding.ts +337 -0
- package/src/routes/managed-sign-in-methods.ts +433 -0
- package/src/routes/memory-slack-publications.ts +3 -2
- package/src/routes/model-connection-access.ts +208 -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 +178 -0
- package/src/routes/organization-memberships.ts +1019 -27
- package/src/routes/organization-model-providers.ts +293 -0
- package/src/routes/organization-recovery.ts +325 -0
- package/src/routes/organization-service-accounts.ts +128 -0
- package/src/routes/organization-sessions.ts +350 -0
- package/src/routes/personal-github-git-broker.ts +785 -0
- package/src/routes/personal-github.ts +370 -0
- package/src/routes/plugins.ts +251 -22
- package/src/routes/pr-review-github.ts +881 -0
- package/src/routes/pr-review.ts +622 -0
- package/src/routes/preference-registry.ts +12 -93
- package/src/routes/rigs.ts +167 -50
- package/src/routes/scheduled-tasks.ts +346 -41
- package/src/routes/session-artifact-associations.ts +87 -0
- package/src/routes/session-history-imports.ts +280 -0
- package/src/routes/sessions.ts +2306 -264
- package/src/routes/skill-content.ts +297 -0
- package/src/routes/skill-install-authority.ts +64 -0
- package/src/routes/skills.ts +62 -9
- package/src/routes/social.ts +46 -18
- package/src/routes/subscription-account-pools.ts +436 -0
- package/src/routes/subscription-pool-access.ts +126 -0
- package/src/routes/supergrok.ts +219 -303
- package/src/routes/transcription-recordings.ts +38 -3
- package/src/routes/transcriptions.ts +4 -0
- package/src/routes/usage-allowances.ts +378 -0
- package/src/routes/user-resource-authorities.ts +138 -0
- package/src/routes/video-generation.ts +14 -10
- package/src/routes/workspace-artifacts.ts +275 -69
- package/src/routes/workspace-capture.ts +21 -0
- package/src/routes/workspace-integrations.ts +576 -0
- package/src/routes/workspace-learning.ts +159 -0
- package/src/routes/workspace-model-providers.ts +148 -0
- package/src/routes/workspace-state.ts +38 -25
- package/src/routes/workspaces.ts +1004 -127
- package/src/sandbox/auth-callout.ts +96 -19
- package/src/sandbox/channel-a.ts +323 -24
- package/src/sandbox/connection-authority.ts +3 -0
- package/src/sandbox/enrollment.ts +81 -6
- package/src/sandbox/machines.ts +218 -76
- package/src/sandbox/metrics-ingestion.ts +411 -62
- package/src/sandbox/rematerialize.ts +121 -19
- package/src/sandbox/session-attach-variable-sets.ts +131 -0
- package/src/sandbox/viewer.ts +280 -25
- package/src/sandbox-file-artifacts.ts +413 -0
- package/src/scheduled-task-deletion.ts +138 -0
- package/src/session-create-observability.ts +46 -0
- package/src/session-realtime-context.ts +6 -3
- package/src/site-session-origin.ts +48 -0
- package/src/site-uploads.ts +224 -0
- package/src/slack-reaction-files.ts +16 -5
- package/src/temporal-schedule-cleanup.ts +13 -0
- package/src/temporal-schedule-sync.ts +74 -0
- package/src/transcription/providers/codex-subscription.ts +2 -0
- package/src/transcription/providers/openai.ts +1 -0
- package/src/transcription/providers/xai-subscription.ts +49 -3
- package/src/transcription/segmenter.ts +8 -2
- package/src/transcription/service.ts +43 -6
- package/src/work-discovery-observability.ts +121 -0
- package/src/workspace-artifact-content.ts +144 -0
- package/src/workspace-artifact-provenance.ts +104 -0
- package/src/workspace-delete-observability.ts +75 -0
- package/src/workspace-deletion.ts +73 -0
- package/src/workspace-state-projection.ts +18 -148
- package/src/workspace-tool-gateway-observability.ts +100 -0
- package/src/workspace-tool-gateway.ts +870 -0
- package/src/workspace-webhook-dispatch.ts +190 -0
- package/src/xai-subscription-auth.ts +9 -2
- package/dist/chunk-WCXHI3FF.js +0 -49920
- package/dist/chunk-WCXHI3FF.js.map +0 -1
- package/dist/routes/packs.d.ts +0 -3
- package/src/routes/packs.ts +0 -729
package/src/routes/supergrok.ts
CHANGED
|
@@ -1,12 +1,23 @@
|
|
|
1
|
+
import { registerSubscriptionAccountPoolRoutes } from "./subscription-account-pools";
|
|
2
|
+
import {
|
|
3
|
+
requireSameOriginBrowserMutation,
|
|
4
|
+
requirePrivateSubscriptionHuman,
|
|
5
|
+
requireSubscriptionScopeMutation,
|
|
6
|
+
} from "./subscription-pool-access";
|
|
7
|
+
export { managedCookieHuman } from "./subscription-pool-access";
|
|
8
|
+
import { requireOrganizationCodexHuman } from "./codex";
|
|
9
|
+
import {
|
|
10
|
+
listOrganizationXaiSubscriptions,
|
|
11
|
+
upsertOrganizationXaiSubscription,
|
|
12
|
+
updateOrganizationXaiSubscription,
|
|
13
|
+
updateOrganizationXaiRotation,
|
|
14
|
+
} from "@opengeni/db";
|
|
1
15
|
import {
|
|
2
16
|
configuredModels,
|
|
3
17
|
environmentsEncryptionKeyBytes,
|
|
4
18
|
withXaiSubscriptionCatalogProvider,
|
|
5
19
|
} from "@opengeni/config";
|
|
6
|
-
import {
|
|
7
|
-
WORKSPACE_XAI_PROVIDER_ACCOUNT_AUTHORITY_SNAPSHOT_V1,
|
|
8
|
-
type XaiProviderAccountAuthoritySnapshotV1,
|
|
9
|
-
} from "@opengeni/contracts";
|
|
20
|
+
import type { XaiProviderAccountAuthoritySnapshotV1 } from "@opengeni/contracts";
|
|
10
21
|
import {
|
|
11
22
|
disconnectXaiSubscriptionCredentialAndRepick,
|
|
12
23
|
ensureXaiRotationSettings,
|
|
@@ -23,19 +34,26 @@ import {
|
|
|
23
34
|
updateXaiRotationSettings,
|
|
24
35
|
upsertXaiSubscriptionCredential,
|
|
25
36
|
wakeXaiCapacityWaiters,
|
|
37
|
+
encryptEnvironmentValue,
|
|
38
|
+
decryptEnvironmentValue,
|
|
26
39
|
type XaiSubscriptionAccountMetadata,
|
|
27
40
|
} from "@opengeni/db";
|
|
28
41
|
import { createSignedState, readSignedState } from "@opengeni/github";
|
|
29
|
-
import {
|
|
42
|
+
import {
|
|
43
|
+
requireAccessGrant,
|
|
44
|
+
requireAccessGrantAuthorization,
|
|
45
|
+
externalActorContinuationForAuthorization,
|
|
46
|
+
type ApiRouteDeps,
|
|
47
|
+
} from "@opengeni/core";
|
|
30
48
|
import {
|
|
31
49
|
XAI_CLIENT_VERSION,
|
|
32
50
|
XaiSubscriptionError,
|
|
33
51
|
fetchXaiSubscriptionModels,
|
|
34
|
-
fetchXaiVerifiedIdentity,
|
|
35
52
|
pollXaiDeviceCode,
|
|
36
53
|
refreshXaiToken,
|
|
37
54
|
requestXaiDeviceCode,
|
|
38
55
|
xaiAccessTokenExpiry,
|
|
56
|
+
xaiIdentityFromDeviceTokens,
|
|
39
57
|
type XaiFetch,
|
|
40
58
|
type XaiProxyAuthContext,
|
|
41
59
|
} from "@opengeni/xai-subscription";
|
|
@@ -43,11 +61,13 @@ import type { Context, Hono } from "hono";
|
|
|
43
61
|
import { HTTPException } from "hono/http-exception";
|
|
44
62
|
import * as z from "zod/v4";
|
|
45
63
|
import { projectClientModel } from "../model-catalog";
|
|
64
|
+
import { ExternalActorContinuation } from "@opengeni/contracts/external-identities";
|
|
65
|
+
import { requireConnectOwnerAuthority } from "../integrations/connect-authority";
|
|
46
66
|
|
|
47
67
|
type XaiAuthoritySnapshot = XaiProviderAccountAuthoritySnapshotV1;
|
|
48
|
-
type ManagedCookieHuman = { subjectId: string };
|
|
49
68
|
|
|
50
69
|
type SuperGrokConnectState = {
|
|
70
|
+
externalContinuationEncrypted?: string;
|
|
51
71
|
workspaceId: string;
|
|
52
72
|
scope: "workspace" | "user";
|
|
53
73
|
subjectId: string;
|
|
@@ -61,51 +81,6 @@ const connectStartBody = z.object({
|
|
|
61
81
|
scope: z.enum(["workspace", "user"]).default("workspace"),
|
|
62
82
|
});
|
|
63
83
|
const connectPollBody = z.object({ state: z.string().min(1).max(16_384) });
|
|
64
|
-
const allocatorBody = z.object({
|
|
65
|
-
enabled: z.boolean(),
|
|
66
|
-
expectedVersion: z.number().int().positive(),
|
|
67
|
-
});
|
|
68
|
-
const settingsBody = z.object({ rotationEnabled: z.boolean() });
|
|
69
|
-
const renameBody = z.object({ label: z.string().trim().max(200).nullable() });
|
|
70
|
-
|
|
71
|
-
async function managedCookieHuman(
|
|
72
|
-
c: Context,
|
|
73
|
-
deps: ApiRouteDeps,
|
|
74
|
-
): Promise<ManagedCookieHuman | null> {
|
|
75
|
-
if (
|
|
76
|
-
deps.settings.productAccessMode !== "managed" ||
|
|
77
|
-
!deps.managedAuth ||
|
|
78
|
-
!c.req.header("cookie") ||
|
|
79
|
-
c.req.header("authorization")
|
|
80
|
-
) {
|
|
81
|
-
return null;
|
|
82
|
-
}
|
|
83
|
-
const session = await getManagedSession(c, deps.managedAuth);
|
|
84
|
-
return session?.user?.id ? { subjectId: `user:${session.user.id}` } : null;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
function requireSameOriginBrowserMutation(c: Context, deps: ApiRouteDeps): void {
|
|
88
|
-
const contentType = c.req.header("content-type")?.split(";", 1)[0]?.trim().toLowerCase();
|
|
89
|
-
if (contentType !== "application/json") {
|
|
90
|
-
throw new HTTPException(403, { message: "JSON browser request required" });
|
|
91
|
-
}
|
|
92
|
-
if (!deps.settings.publicBaseUrl) {
|
|
93
|
-
throw new HTTPException(503, {
|
|
94
|
-
message: "managed browser origin is not configured",
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
const expectedOrigin = new URL(deps.settings.publicBaseUrl).origin;
|
|
98
|
-
if (c.req.header("origin") !== expectedOrigin) {
|
|
99
|
-
throw new HTTPException(403, {
|
|
100
|
-
message: "same-origin browser request required",
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
if (c.req.header("sec-fetch-site")?.toLowerCase() !== "same-origin") {
|
|
104
|
-
throw new HTTPException(403, {
|
|
105
|
-
message: "same-origin fetch metadata required",
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
84
|
|
|
110
85
|
function requireEnabled(deps: ApiRouteDeps): void {
|
|
111
86
|
if (!deps.settings.supergrokSubscriptionEnabled) {
|
|
@@ -115,44 +90,14 @@ function requireEnabled(deps: ApiRouteDeps): void {
|
|
|
115
90
|
}
|
|
116
91
|
}
|
|
117
92
|
|
|
118
|
-
|
|
119
|
-
c
|
|
120
|
-
|
|
121
|
-
workspaceId: string,
|
|
122
|
-
): Promise<{ accountId: string; subjectId: string }> {
|
|
123
|
-
if (c.req.header("authorization")) {
|
|
124
|
-
throw new HTTPException(403, {
|
|
125
|
-
message: "authorization bearer is not allowed for private SuperGrok accounts",
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
const human = await managedCookieHuman(c, deps);
|
|
129
|
-
if (!human) {
|
|
130
|
-
throw new HTTPException(401, {
|
|
131
|
-
message: "managed browser session required",
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
const grant = await requireAccessGrant(c, deps, workspaceId, "connections:write");
|
|
135
|
-
if (grant.subjectId !== human.subjectId) {
|
|
136
|
-
throw new HTTPException(403, {
|
|
137
|
-
message: "managed browser identity mismatch",
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
return { accountId: grant.accountId, subjectId: grant.subjectId };
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
async function requireScopeMutation(
|
|
93
|
+
const requirePrivateHuman = (c: Context, deps: ApiRouteDeps, workspaceId: string) =>
|
|
94
|
+
requirePrivateSubscriptionHuman(c, deps, workspaceId, "SuperGrok");
|
|
95
|
+
export const requireScopeMutation = (
|
|
144
96
|
c: Context,
|
|
145
97
|
deps: ApiRouteDeps,
|
|
146
98
|
workspaceId: string,
|
|
147
|
-
scope: "workspace" | "user",
|
|
148
|
-
)
|
|
149
|
-
if (scope === "user") {
|
|
150
|
-
requireSameOriginBrowserMutation(c, deps);
|
|
151
|
-
return await requirePrivateHuman(c, deps, workspaceId);
|
|
152
|
-
}
|
|
153
|
-
const grant = await requireAccessGrant(c, deps, workspaceId, "workspace:admin");
|
|
154
|
-
return { accountId: grant.accountId, subjectId: grant.subjectId };
|
|
155
|
-
}
|
|
99
|
+
scope: "workspace" | "user" | "organization",
|
|
100
|
+
) => requireSubscriptionScopeMutation(c, deps, workspaceId, scope, "SuperGrok");
|
|
156
101
|
|
|
157
102
|
async function resolveReadAuthority(
|
|
158
103
|
c: Context,
|
|
@@ -168,7 +113,7 @@ async function resolveReadAuthority(
|
|
|
168
113
|
workspaceId,
|
|
169
114
|
subjectId: grant.subjectId,
|
|
170
115
|
});
|
|
171
|
-
if (snapshot.scope
|
|
116
|
+
if (snapshot.scope !== "user") {
|
|
172
117
|
return { accountId: grant.accountId, subjectId: grant.subjectId, snapshot };
|
|
173
118
|
}
|
|
174
119
|
const human = await requirePrivateHuman(c, deps, workspaceId);
|
|
@@ -197,6 +142,7 @@ function accountJson(row: XaiSubscriptionAccountMetadata, activeCredentialId: st
|
|
|
197
142
|
subject: row.providerAccountId ?? row.accountEmail ?? row.id,
|
|
198
143
|
email: row.accountEmail,
|
|
199
144
|
label: row.label,
|
|
145
|
+
plan: row.planType,
|
|
200
146
|
status: row.status === "disabled" ? "error" : row.status,
|
|
201
147
|
active: row.id === activeCredentialId,
|
|
202
148
|
expiresAt: row.expiresAt?.toISOString() ?? null,
|
|
@@ -307,34 +253,135 @@ async function materializedAuthContext(
|
|
|
307
253
|
};
|
|
308
254
|
}
|
|
309
255
|
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
256
|
+
export function registerSuperGrokRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
257
|
+
registerSubscriptionAccountPoolRoutes(app, deps, {
|
|
258
|
+
provider: "xai",
|
|
259
|
+
route: "supergrok",
|
|
260
|
+
displayName: "SuperGrok",
|
|
261
|
+
enabled: () => deps.settings.supergrokSubscriptionEnabled,
|
|
262
|
+
accountJson,
|
|
263
|
+
repository: {
|
|
264
|
+
listOrganizationSubscriptions: listOrganizationXaiSubscriptions,
|
|
265
|
+
updateOrganizationSubscription: updateOrganizationXaiSubscription,
|
|
266
|
+
updateOrganizationSubscriptionRotation: updateOrganizationXaiRotation,
|
|
267
|
+
listSubscriptionAccountsMetadata: listXaiSubscriptionAccountsMetadata,
|
|
268
|
+
getSubscriptionRotationSettings: getXaiRotationSettings,
|
|
269
|
+
ensureSubscriptionRotationSettings: ensureXaiRotationSettings,
|
|
270
|
+
getSubscriptionAccountAuthoritySnapshot: getXaiSubscriptionAccountAuthoritySnapshot,
|
|
271
|
+
resolveSubscriptionProviderAccountAuthoritySnapshotForAcceptance:
|
|
272
|
+
resolveXaiProviderAccountAuthoritySnapshotForAcceptance,
|
|
273
|
+
setActiveSubscriptionCredential: setActiveXaiCredential,
|
|
274
|
+
updateSubscriptionRotationSettings: updateXaiRotationSettings,
|
|
275
|
+
updateSubscriptionAllocatorEligibility: updateXaiAllocatorEligibility,
|
|
276
|
+
renameSubscriptionAccount: renameXaiSubscriptionAccount,
|
|
277
|
+
disconnectSubscriptionCredentialAndRepick: disconnectXaiSubscriptionCredentialAndRepick,
|
|
278
|
+
wakeSubscriptionCapacityWaiters: wakeXaiCapacityWaiters,
|
|
279
|
+
},
|
|
325
280
|
});
|
|
326
|
-
|
|
327
|
-
const mutation = await requireScopeMutation(c, deps, workspaceId, snapshot.scope);
|
|
328
|
-
return { ...mutation, snapshot };
|
|
329
|
-
}
|
|
281
|
+
const { db } = deps;
|
|
330
282
|
|
|
331
|
-
|
|
283
|
+
const organizationPath = "/v1/organizations/:organizationId/supergrok";
|
|
284
|
+
const organizationActor = async (c: Context, mutation = false, providerConsent = false) => {
|
|
285
|
+
requireEnabled(deps);
|
|
286
|
+
if (mutation) requireSameOriginBrowserMutation(c, deps);
|
|
287
|
+
const organizationId = c.req.param("organizationId")!;
|
|
288
|
+
const human = await requireOrganizationCodexHuman(c, deps, organizationId, { providerConsent });
|
|
289
|
+
return { organizationId, actorSubjectId: human.subjectId };
|
|
290
|
+
};
|
|
291
|
+
app.post(`${organizationPath}/connect/start`, async (c) => {
|
|
292
|
+
const actor = await organizationActor(c, true, true);
|
|
293
|
+
try {
|
|
294
|
+
const start = await requestXaiDeviceCode({ fetch: (deps.xaiFetch ?? fetch) as XaiFetch });
|
|
295
|
+
const expiresAt = Math.floor(Date.now() / 1000) + start.expiresInSeconds;
|
|
296
|
+
return c.json({
|
|
297
|
+
...start,
|
|
298
|
+
scope: "organization",
|
|
299
|
+
state: createSignedState(deps.githubStateSecret, {
|
|
300
|
+
...actor,
|
|
301
|
+
deviceCode: start.deviceCode,
|
|
302
|
+
intervalSeconds: start.intervalSeconds,
|
|
303
|
+
expiresAt,
|
|
304
|
+
}),
|
|
305
|
+
deviceCode: undefined,
|
|
306
|
+
});
|
|
307
|
+
} catch (error) {
|
|
308
|
+
throw xaiHttpError(error, "Failed to start SuperGrok device login");
|
|
309
|
+
}
|
|
310
|
+
});
|
|
311
|
+
app.post(`${organizationPath}/connect/poll`, async (c) => {
|
|
312
|
+
const actor = await organizationActor(c, true, true);
|
|
313
|
+
const parsed = connectPollBody.safeParse(await c.req.json().catch(() => null));
|
|
314
|
+
if (!parsed.success) throw new HTTPException(400, { message: "SuperGrok state is required" });
|
|
315
|
+
const state = readSignedState(parsed.data.state, deps.githubStateSecret) as {
|
|
316
|
+
organizationId?: string;
|
|
317
|
+
actorSubjectId?: string;
|
|
318
|
+
deviceCode?: string;
|
|
319
|
+
intervalSeconds?: number;
|
|
320
|
+
expiresAt?: number;
|
|
321
|
+
} | null;
|
|
322
|
+
if (
|
|
323
|
+
!state ||
|
|
324
|
+
state.organizationId !== actor.organizationId ||
|
|
325
|
+
state.actorSubjectId !== actor.actorSubjectId ||
|
|
326
|
+
!state.deviceCode ||
|
|
327
|
+
!Number.isFinite(state.intervalSeconds) ||
|
|
328
|
+
!Number.isFinite(state.expiresAt)
|
|
329
|
+
) {
|
|
330
|
+
throw new HTTPException(400, { message: "SuperGrok connect state is invalid or expired" });
|
|
331
|
+
}
|
|
332
|
+
if (Math.floor(Date.now() / 1000) >= state.expiresAt!) return c.json({ status: "expired" });
|
|
333
|
+
try {
|
|
334
|
+
const poll = await pollXaiDeviceCode(
|
|
335
|
+
{ deviceCode: state.deviceCode, intervalSeconds: state.intervalSeconds! },
|
|
336
|
+
{ fetch: (deps.xaiFetch ?? fetch) as XaiFetch },
|
|
337
|
+
);
|
|
338
|
+
if (poll.status !== "authorized") return c.json(poll);
|
|
339
|
+
const identity = xaiIdentityFromDeviceTokens(poll.tokens);
|
|
340
|
+
const encryptionKey = environmentsEncryptionKeyBytes(deps.settings);
|
|
341
|
+
if (!encryptionKey)
|
|
342
|
+
throw new HTTPException(500, { message: "Connection encryption is not configured" });
|
|
343
|
+
const connected = await upsertOrganizationXaiSubscription(db, {
|
|
344
|
+
...actor,
|
|
345
|
+
encryptionKey,
|
|
346
|
+
secret: {
|
|
347
|
+
version: 1,
|
|
348
|
+
accessToken: poll.tokens.accessToken,
|
|
349
|
+
refreshToken: poll.tokens.refreshToken,
|
|
350
|
+
},
|
|
351
|
+
providerAccountId: identity.subject,
|
|
352
|
+
label: identity.name ?? identity.email ?? identity.subject,
|
|
353
|
+
accountEmail: identity.email,
|
|
354
|
+
expiresAt:
|
|
355
|
+
xaiAccessTokenExpiry(poll.tokens.accessToken) ??
|
|
356
|
+
new Date(Date.now() + poll.tokens.expiresInSeconds * 1000),
|
|
357
|
+
});
|
|
358
|
+
return c.json({
|
|
359
|
+
status: "connected",
|
|
360
|
+
accountId: connected.account.id,
|
|
361
|
+
scope: "organization",
|
|
362
|
+
isActive: connected.isActive,
|
|
363
|
+
email: identity.email,
|
|
364
|
+
});
|
|
365
|
+
} catch (error) {
|
|
366
|
+
throw xaiHttpError(error, "SuperGrok device login failed");
|
|
367
|
+
}
|
|
368
|
+
});
|
|
332
369
|
app.post("/v1/workspaces/:workspaceId/supergrok/connect/start", async (c) => {
|
|
333
370
|
requireEnabled(deps);
|
|
334
371
|
const workspaceId = c.req.param("workspaceId");
|
|
335
372
|
const parsed = connectStartBody.safeParse(await c.req.json().catch(() => ({})));
|
|
336
373
|
if (!parsed.success) throw new HTTPException(400, { message: "invalid SuperGrok scope" });
|
|
337
374
|
const authority = await requireScopeMutation(c, deps, workspaceId, parsed.data.scope);
|
|
375
|
+
const authorization = await requireAccessGrantAuthorization(
|
|
376
|
+
c,
|
|
377
|
+
deps,
|
|
378
|
+
workspaceId,
|
|
379
|
+
parsed.data.scope === "workspace" ? "workspace:admin" : "connections:write",
|
|
380
|
+
);
|
|
381
|
+
const continuation = externalActorContinuationForAuthorization(authorization);
|
|
382
|
+
const encryptionKey = environmentsEncryptionKeyBytes(deps.settings);
|
|
383
|
+
if (continuation && !encryptionKey)
|
|
384
|
+
throw new HTTPException(503, { message: "Credential encryption is unavailable" });
|
|
338
385
|
try {
|
|
339
386
|
const start = await requestXaiDeviceCode({
|
|
340
387
|
fetch: (deps.xaiFetch ?? fetch) as XaiFetch,
|
|
@@ -354,6 +401,14 @@ export function registerSuperGrokRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
354
401
|
deviceCode: start.deviceCode,
|
|
355
402
|
intervalSeconds: start.intervalSeconds,
|
|
356
403
|
expiresAt,
|
|
404
|
+
...(continuation
|
|
405
|
+
? {
|
|
406
|
+
externalContinuationEncrypted: encryptEnvironmentValue(
|
|
407
|
+
encryptionKey!,
|
|
408
|
+
JSON.stringify(continuation),
|
|
409
|
+
),
|
|
410
|
+
}
|
|
411
|
+
: {}),
|
|
357
412
|
}),
|
|
358
413
|
});
|
|
359
414
|
} catch (error) {
|
|
@@ -389,9 +444,34 @@ export function registerSuperGrokRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
389
444
|
message: "SuperGrok connect identity changed",
|
|
390
445
|
});
|
|
391
446
|
}
|
|
447
|
+
const originKey = environmentsEncryptionKeyBytes(deps.settings);
|
|
448
|
+
const origin =
|
|
449
|
+
state.externalContinuationEncrypted && originKey
|
|
450
|
+
? ExternalActorContinuation.parse(
|
|
451
|
+
JSON.parse(decryptEnvironmentValue(originKey, state.externalContinuationEncrypted)),
|
|
452
|
+
)
|
|
453
|
+
: null;
|
|
454
|
+
if (state.externalContinuationEncrypted && !origin)
|
|
455
|
+
throw new HTTPException(503, { message: "Connection origin unavailable" });
|
|
456
|
+
const requireOrigin = async () => {
|
|
457
|
+
if (origin)
|
|
458
|
+
await requireConnectOwnerAuthority(
|
|
459
|
+
deps.db,
|
|
460
|
+
{
|
|
461
|
+
accountId: authority.accountId,
|
|
462
|
+
workspaceId,
|
|
463
|
+
subjectId: authority.subjectId,
|
|
464
|
+
externalContinuation: origin,
|
|
465
|
+
},
|
|
466
|
+
state.scope === "workspace" ? "workspace:admin" : "connections:write",
|
|
467
|
+
origin,
|
|
468
|
+
);
|
|
469
|
+
};
|
|
470
|
+
await requireOrigin();
|
|
392
471
|
if (Math.floor(Date.now() / 1_000) >= state.expiresAt) {
|
|
393
472
|
return c.json({ status: "expired" as const });
|
|
394
473
|
}
|
|
474
|
+
let phase = "device_token_exchange";
|
|
395
475
|
try {
|
|
396
476
|
const poll = await pollXaiDeviceCode(
|
|
397
477
|
{
|
|
@@ -401,9 +481,16 @@ export function registerSuperGrokRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
401
481
|
{ fetch: (deps.xaiFetch ?? fetch) as XaiFetch },
|
|
402
482
|
);
|
|
403
483
|
if (poll.status !== "authorized") return c.json(poll);
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
484
|
+
phase = "token_identity";
|
|
485
|
+
const identity = xaiIdentityFromDeviceTokens(poll.tokens);
|
|
486
|
+
phase = "credential_persist";
|
|
487
|
+
await requireOrigin();
|
|
488
|
+
const liveAuthority = await requireScopeMutation(c, deps, workspaceId, state.scope);
|
|
489
|
+
if (
|
|
490
|
+
liveAuthority.accountId !== authority.accountId ||
|
|
491
|
+
liveAuthority.subjectId !== authority.subjectId
|
|
492
|
+
)
|
|
493
|
+
throw new HTTPException(403, { message: "SuperGrok connection identity changed" });
|
|
407
494
|
const encryptionKey = environmentsEncryptionKeyBytes(deps.settings);
|
|
408
495
|
if (!encryptionKey) {
|
|
409
496
|
throw new HTTPException(500, {
|
|
@@ -458,37 +545,28 @@ export function registerSuperGrokRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
458
545
|
email: identity.email,
|
|
459
546
|
});
|
|
460
547
|
} catch (error) {
|
|
548
|
+
deps.observability?.warn("SuperGrok connection operation failed", {
|
|
549
|
+
provider: "xai",
|
|
550
|
+
providerApi: "oauth",
|
|
551
|
+
op: phase,
|
|
552
|
+
outcome: "failed",
|
|
553
|
+
reason:
|
|
554
|
+
error instanceof XaiSubscriptionError
|
|
555
|
+
? error.kind
|
|
556
|
+
: error instanceof HTTPException
|
|
557
|
+
? "http_exception"
|
|
558
|
+
: "unexpected",
|
|
559
|
+
status:
|
|
560
|
+
error instanceof XaiSubscriptionError
|
|
561
|
+
? error.status
|
|
562
|
+
: error instanceof HTTPException
|
|
563
|
+
? error.status
|
|
564
|
+
: undefined,
|
|
565
|
+
});
|
|
461
566
|
throw xaiHttpError(error, "SuperGrok device login failed");
|
|
462
567
|
}
|
|
463
568
|
});
|
|
464
569
|
|
|
465
|
-
app.get("/v1/workspaces/:workspaceId/supergrok/accounts", async (c) => {
|
|
466
|
-
requireEnabled(deps);
|
|
467
|
-
const workspaceId = c.req.param("workspaceId");
|
|
468
|
-
const authority = await resolveReadAuthority(c, deps, workspaceId);
|
|
469
|
-
const [accounts, settings] = await Promise.all([
|
|
470
|
-
listXaiSubscriptionAccountsMetadata(deps.db, {
|
|
471
|
-
workspaceId,
|
|
472
|
-
subjectId: authority.subjectId,
|
|
473
|
-
}),
|
|
474
|
-
getXaiRotationSettings(deps.db, {
|
|
475
|
-
workspaceId,
|
|
476
|
-
subjectId: authority.subjectId,
|
|
477
|
-
authoritySnapshot: authority.snapshot,
|
|
478
|
-
}),
|
|
479
|
-
]);
|
|
480
|
-
const activeCredentialId = settings?.activeCredentialId ?? null;
|
|
481
|
-
return c.json({
|
|
482
|
-
accounts: accounts.map((account) => accountJson(account, activeCredentialId)),
|
|
483
|
-
activeAccountId: activeCredentialId,
|
|
484
|
-
settings: {
|
|
485
|
-
rotationEnabled: settings?.rotationEnabled ?? true,
|
|
486
|
-
rotationStrategy: "sharded" as const,
|
|
487
|
-
activeCredentialId,
|
|
488
|
-
},
|
|
489
|
-
});
|
|
490
|
-
});
|
|
491
|
-
|
|
492
570
|
app.get("/v1/workspaces/:workspaceId/supergrok/status", async (c) => {
|
|
493
571
|
requireEnabled(deps);
|
|
494
572
|
const workspaceId = c.req.param("workspaceId");
|
|
@@ -529,8 +607,9 @@ export function registerSuperGrokRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
529
607
|
} catch {
|
|
530
608
|
valid = false;
|
|
531
609
|
}
|
|
532
|
-
const
|
|
533
|
-
|
|
610
|
+
const catalogSettings = valid ? (await deps.resolveCatalogSettings()).settings : null;
|
|
611
|
+
const catalog = catalogSettings
|
|
612
|
+
? configuredModels(withXaiSubscriptionCatalogProvider(catalogSettings))
|
|
534
613
|
.filter(
|
|
535
614
|
(model) =>
|
|
536
615
|
model.credentialSource.kind === "connected_subscription" &&
|
|
@@ -551,167 +630,4 @@ export function registerSuperGrokRoutes(app: Hono, deps: ApiRouteDeps): void {
|
|
|
551
630
|
},
|
|
552
631
|
});
|
|
553
632
|
});
|
|
554
|
-
|
|
555
|
-
app.post("/v1/workspaces/:workspaceId/supergrok/accounts/:accountId/activate", async (c) => {
|
|
556
|
-
requireEnabled(deps);
|
|
557
|
-
const workspaceId = c.req.param("workspaceId");
|
|
558
|
-
const credentialId = c.req.param("accountId");
|
|
559
|
-
const authority = await authorityForAccountMutation(c, deps, workspaceId, credentialId);
|
|
560
|
-
const activated = await setActiveXaiCredential(deps.db, {
|
|
561
|
-
accountId: authority.accountId,
|
|
562
|
-
workspaceId,
|
|
563
|
-
subjectId: authority.subjectId,
|
|
564
|
-
authoritySnapshot: authority.snapshot,
|
|
565
|
-
credentialId,
|
|
566
|
-
});
|
|
567
|
-
if (!activated)
|
|
568
|
-
throw new HTTPException(409, {
|
|
569
|
-
message: "SuperGrok account requires relogin",
|
|
570
|
-
});
|
|
571
|
-
await wakeXaiCapacityWaiters(deps.db, {
|
|
572
|
-
workspaceId,
|
|
573
|
-
subjectId: authority.subjectId,
|
|
574
|
-
authoritySnapshot: authority.snapshot,
|
|
575
|
-
reason: "xai_active_credential_changed",
|
|
576
|
-
});
|
|
577
|
-
return c.json({ activated: true, accountId: credentialId });
|
|
578
|
-
});
|
|
579
|
-
|
|
580
|
-
app.patch("/v1/workspaces/:workspaceId/supergrok/settings", async (c) => {
|
|
581
|
-
requireEnabled(deps);
|
|
582
|
-
const workspaceId = c.req.param("workspaceId");
|
|
583
|
-
const parsed = settingsBody.safeParse(await c.req.json().catch(() => null));
|
|
584
|
-
if (!parsed.success) throw new HTTPException(400, { message: "rotationEnabled is required" });
|
|
585
|
-
const readAuthority = await resolveReadAuthority(c, deps, workspaceId);
|
|
586
|
-
const authority = await requireScopeMutation(
|
|
587
|
-
c,
|
|
588
|
-
deps,
|
|
589
|
-
workspaceId,
|
|
590
|
-
readAuthority.snapshot.scope,
|
|
591
|
-
);
|
|
592
|
-
const current = await ensureXaiRotationSettings(deps.db, {
|
|
593
|
-
accountId: authority.accountId,
|
|
594
|
-
workspaceId,
|
|
595
|
-
subjectId: authority.subjectId,
|
|
596
|
-
authoritySnapshot: readAuthority.snapshot,
|
|
597
|
-
});
|
|
598
|
-
const updated = await updateXaiRotationSettings(deps.db, {
|
|
599
|
-
workspaceId,
|
|
600
|
-
subjectId: authority.subjectId,
|
|
601
|
-
authoritySnapshot: readAuthority.snapshot,
|
|
602
|
-
expectedVersion: current.version,
|
|
603
|
-
rotationEnabled: parsed.data.rotationEnabled,
|
|
604
|
-
}).catch(() => null);
|
|
605
|
-
if (!updated) throw new HTTPException(409, { message: "SuperGrok settings changed" });
|
|
606
|
-
await wakeXaiCapacityWaiters(deps.db, {
|
|
607
|
-
workspaceId,
|
|
608
|
-
subjectId: authority.subjectId,
|
|
609
|
-
authoritySnapshot: readAuthority.snapshot,
|
|
610
|
-
reason: "xai_rotation_settings_changed",
|
|
611
|
-
});
|
|
612
|
-
return c.json({
|
|
613
|
-
rotationEnabled: updated.rotationEnabled,
|
|
614
|
-
rotationStrategy: "sharded" as const,
|
|
615
|
-
activeCredentialId: updated.activeCredentialId,
|
|
616
|
-
});
|
|
617
|
-
});
|
|
618
|
-
|
|
619
|
-
app.patch("/v1/workspaces/:workspaceId/supergrok/accounts/:accountId/allocator", async (c) => {
|
|
620
|
-
requireEnabled(deps);
|
|
621
|
-
const workspaceId = c.req.param("workspaceId");
|
|
622
|
-
const credentialId = c.req.param("accountId");
|
|
623
|
-
const authority = await authorityForAccountMutation(c, deps, workspaceId, credentialId);
|
|
624
|
-
const parsed = allocatorBody.safeParse(await c.req.json().catch(() => null));
|
|
625
|
-
if (!parsed.success) {
|
|
626
|
-
throw new HTTPException(400, {
|
|
627
|
-
message: "enabled and expectedVersion are required",
|
|
628
|
-
});
|
|
629
|
-
}
|
|
630
|
-
const result = await updateXaiAllocatorEligibility(deps.db, {
|
|
631
|
-
workspaceId,
|
|
632
|
-
subjectId: authority.subjectId,
|
|
633
|
-
credentialId,
|
|
634
|
-
enabled: parsed.data.enabled,
|
|
635
|
-
expectedVersion: parsed.data.expectedVersion,
|
|
636
|
-
});
|
|
637
|
-
if (result.kind === "not_found") {
|
|
638
|
-
throw new HTTPException(404, {
|
|
639
|
-
message: "SuperGrok account not found",
|
|
640
|
-
});
|
|
641
|
-
}
|
|
642
|
-
const response = {
|
|
643
|
-
allocatorEnabled: result.allocatorEnabled,
|
|
644
|
-
allocatorVersion: result.allocatorVersion,
|
|
645
|
-
allocatorUpdatedAt: result.allocatorUpdatedAt?.toISOString() ?? null,
|
|
646
|
-
changed: result.kind === "updated",
|
|
647
|
-
};
|
|
648
|
-
if (result.kind === "updated") {
|
|
649
|
-
await wakeXaiCapacityWaiters(deps.db, {
|
|
650
|
-
workspaceId,
|
|
651
|
-
subjectId: authority.subjectId,
|
|
652
|
-
authoritySnapshot: authority.snapshot,
|
|
653
|
-
reason: "xai_allocator_eligibility_changed",
|
|
654
|
-
});
|
|
655
|
-
}
|
|
656
|
-
return result.kind === "conflict" ? c.json(response, 409) : c.json(response);
|
|
657
|
-
});
|
|
658
|
-
|
|
659
|
-
app.patch("/v1/workspaces/:workspaceId/supergrok/accounts/:accountId", async (c) => {
|
|
660
|
-
requireEnabled(deps);
|
|
661
|
-
const workspaceId = c.req.param("workspaceId");
|
|
662
|
-
const credentialId = c.req.param("accountId");
|
|
663
|
-
const authority = await authorityForAccountMutation(c, deps, workspaceId, credentialId);
|
|
664
|
-
const parsed = renameBody.safeParse(await c.req.json().catch(() => null));
|
|
665
|
-
if (!parsed.success) throw new HTTPException(400, { message: "label is invalid" });
|
|
666
|
-
const account = await renameXaiSubscriptionAccount(deps.db, {
|
|
667
|
-
workspaceId,
|
|
668
|
-
subjectId: authority.subjectId,
|
|
669
|
-
credentialId,
|
|
670
|
-
label: parsed.data.label || null,
|
|
671
|
-
});
|
|
672
|
-
if (!account)
|
|
673
|
-
throw new HTTPException(404, {
|
|
674
|
-
message: "SuperGrok account not found",
|
|
675
|
-
});
|
|
676
|
-
const settings = await getXaiRotationSettings(deps.db, {
|
|
677
|
-
workspaceId,
|
|
678
|
-
subjectId: authority.subjectId,
|
|
679
|
-
authoritySnapshot: authority.snapshot,
|
|
680
|
-
});
|
|
681
|
-
return c.json(accountJson(account, settings?.activeCredentialId ?? null));
|
|
682
|
-
});
|
|
683
|
-
|
|
684
|
-
app.delete("/v1/workspaces/:workspaceId/supergrok/accounts/:accountId", async (c) => {
|
|
685
|
-
requireEnabled(deps);
|
|
686
|
-
const workspaceId = c.req.param("workspaceId");
|
|
687
|
-
const credentialId = c.req.param("accountId");
|
|
688
|
-
const authority = await authorityForAccountMutation(c, deps, workspaceId, credentialId);
|
|
689
|
-
if (authority.snapshot.scope === "user") {
|
|
690
|
-
await wakeXaiCapacityWaiters(deps.db, {
|
|
691
|
-
workspaceId,
|
|
692
|
-
subjectId: authority.subjectId,
|
|
693
|
-
authoritySnapshot: authority.snapshot,
|
|
694
|
-
reason: "xai_credential_disconnecting",
|
|
695
|
-
});
|
|
696
|
-
}
|
|
697
|
-
const result = await disconnectXaiSubscriptionCredentialAndRepick(deps.db, {
|
|
698
|
-
accountId: authority.accountId,
|
|
699
|
-
workspaceId,
|
|
700
|
-
subjectId: authority.subjectId,
|
|
701
|
-
credentialId,
|
|
702
|
-
authoritySnapshot: authority.snapshot,
|
|
703
|
-
});
|
|
704
|
-
if (result.disconnected && authority.snapshot.scope === "workspace") {
|
|
705
|
-
await wakeXaiCapacityWaiters(deps.db, {
|
|
706
|
-
workspaceId,
|
|
707
|
-
subjectId: authority.subjectId,
|
|
708
|
-
authoritySnapshot: WORKSPACE_XAI_PROVIDER_ACCOUNT_AUTHORITY_SNAPSHOT_V1,
|
|
709
|
-
reason: "xai_credential_disconnected",
|
|
710
|
-
});
|
|
711
|
-
}
|
|
712
|
-
return c.json({
|
|
713
|
-
disconnected: result.disconnected,
|
|
714
|
-
newActiveId: result.newActiveCredentialId,
|
|
715
|
-
});
|
|
716
|
-
});
|
|
717
633
|
}
|