@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,352 @@
|
|
|
1
|
+
import { ReasoningEffort } from "@opengeni/contracts";
|
|
2
|
+
import { ModelCallError, type ModelCallInput } from "@opengeni/core";
|
|
3
|
+
import {
|
|
4
|
+
normalizeModelCallUsage,
|
|
5
|
+
type SingleModelCallContentPart,
|
|
6
|
+
type SingleModelCallMessage,
|
|
7
|
+
type SingleModelCallResult,
|
|
8
|
+
} from "@opengeni/runtime/model-call";
|
|
9
|
+
import { z } from "zod";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* The OpenAI Chat Completions wire format for stateless single model calls:
|
|
13
|
+
* text and image messages, sampling and output-length controls, reasoning
|
|
14
|
+
* effort, JSON-schema output and streaming. Anything agentic (tools, function
|
|
15
|
+
* calls, hosted search, audio) is refused with a 400 naming the parameter;
|
|
16
|
+
* agentic work uses sessions.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
const TextPart = z.object({ type: z.literal("text"), text: z.string() });
|
|
20
|
+
const ImagePart = z.object({
|
|
21
|
+
type: z.literal("image_url"),
|
|
22
|
+
image_url: z.object({
|
|
23
|
+
url: z.string().min(1),
|
|
24
|
+
detail: z.enum(["auto", "low", "high"]).optional(),
|
|
25
|
+
}),
|
|
26
|
+
});
|
|
27
|
+
const RefusalPart = z.object({ type: z.literal("refusal"), refusal: z.string() });
|
|
28
|
+
|
|
29
|
+
const Message = z.object({
|
|
30
|
+
role: z.string(),
|
|
31
|
+
content: z.union([z.string(), z.array(z.record(z.string(), z.unknown())), z.null()]).optional(),
|
|
32
|
+
name: z.string().optional(),
|
|
33
|
+
tool_calls: z.unknown().optional(),
|
|
34
|
+
function_call: z.unknown().optional(),
|
|
35
|
+
tool_call_id: z.unknown().optional(),
|
|
36
|
+
audio: z.unknown().optional(),
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
const JsonSchemaFormat = z.object({
|
|
40
|
+
type: z.literal("json_schema"),
|
|
41
|
+
json_schema: z.object({
|
|
42
|
+
name: z.string().regex(/^[A-Za-z0-9_-]{1,64}$/, "must be 1-64 letters, digits, _ or -"),
|
|
43
|
+
description: z.string().optional(),
|
|
44
|
+
schema: z.record(z.string(), z.unknown()),
|
|
45
|
+
strict: z.boolean().nullish(),
|
|
46
|
+
}),
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
const ChatCompletionRequest = z.object({
|
|
50
|
+
model: z.string().trim().min(1).max(256).nullish(),
|
|
51
|
+
messages: z.array(Message).min(1).max(4096),
|
|
52
|
+
max_tokens: z.number().int().positive().nullish(),
|
|
53
|
+
max_completion_tokens: z.number().int().positive().nullish(),
|
|
54
|
+
temperature: z.number().min(0).max(2).nullish(),
|
|
55
|
+
top_p: z.number().min(0).max(1).nullish(),
|
|
56
|
+
stop: z.union([z.string(), z.array(z.string()).max(4)]).nullish(),
|
|
57
|
+
reasoning_effort: ReasoningEffort.nullish(),
|
|
58
|
+
verbosity: z.enum(["low", "medium", "high"]).nullish(),
|
|
59
|
+
response_format: z.object({ type: z.string() }).passthrough().nullish(),
|
|
60
|
+
stream: z.boolean().nullish(),
|
|
61
|
+
stream_options: z.object({ include_usage: z.boolean().nullish() }).nullish(),
|
|
62
|
+
n: z.number().int().nullish(),
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
/** Parameters with no meaning without tools or outside text output. */
|
|
66
|
+
const AGENTIC_PARAMETERS = [
|
|
67
|
+
"tools",
|
|
68
|
+
"tool_choice",
|
|
69
|
+
"functions",
|
|
70
|
+
"function_call",
|
|
71
|
+
"web_search_options",
|
|
72
|
+
"audio",
|
|
73
|
+
"prediction",
|
|
74
|
+
] as const;
|
|
75
|
+
|
|
76
|
+
export type ParsedChatCompletionRequest = {
|
|
77
|
+
model: string | null;
|
|
78
|
+
request: ModelCallInput["request"];
|
|
79
|
+
stream: boolean;
|
|
80
|
+
includeUsage: boolean;
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
function invalid(message: string, param: string | null, code = "invalid_value"): ModelCallError {
|
|
84
|
+
return new ModelCallError({ status: 400, type: "invalid_request_error", code, param, message });
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function unsupported(param: string, message: string): ModelCallError {
|
|
88
|
+
return invalid(message, param, "unsupported_parameter");
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function issueParam(path: readonly PropertyKey[]): string {
|
|
92
|
+
let param = "";
|
|
93
|
+
for (const segment of path) {
|
|
94
|
+
param +=
|
|
95
|
+
typeof segment === "number"
|
|
96
|
+
? `[${segment}]`
|
|
97
|
+
: param
|
|
98
|
+
? `.${String(segment)}`
|
|
99
|
+
: String(segment);
|
|
100
|
+
}
|
|
101
|
+
return param;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function present(value: unknown): boolean {
|
|
105
|
+
if (value === undefined || value === null || value === false) return false;
|
|
106
|
+
if (Array.isArray(value)) return value.length > 0;
|
|
107
|
+
if (typeof value === "object") return Object.keys(value).length > 0;
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function refuseUnsupported(body: Record<string, unknown>): void {
|
|
112
|
+
for (const key of AGENTIC_PARAMETERS) {
|
|
113
|
+
if (present(body[key])) {
|
|
114
|
+
throw unsupported(
|
|
115
|
+
key,
|
|
116
|
+
`'${key}' is not supported: this endpoint makes single model calls without tools. Use sessions for agentic work.`,
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (body.logprobs === true || present(body.top_logprobs)) {
|
|
121
|
+
throw unsupported(
|
|
122
|
+
body.logprobs === true ? "logprobs" : "top_logprobs",
|
|
123
|
+
"Log probabilities are not supported.",
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
if (present(body.logit_bias)) throw unsupported("logit_bias", "'logit_bias' is not supported.");
|
|
127
|
+
for (const key of ["presence_penalty", "frequency_penalty"] as const) {
|
|
128
|
+
if (body[key] !== undefined && body[key] !== null && body[key] !== 0) {
|
|
129
|
+
throw unsupported(key, `'${key}' is not supported.`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (body.store === true) {
|
|
133
|
+
throw unsupported("store", "Stored completions are not supported; requests are stateless.");
|
|
134
|
+
}
|
|
135
|
+
const modalities = body.modalities;
|
|
136
|
+
if (Array.isArray(modalities) && modalities.some((modality) => modality !== "text")) {
|
|
137
|
+
throw unsupported("modalities", "Only text output is supported.");
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function textOf(parts: Record<string, unknown>[], param: string, allowRefusal: boolean): string {
|
|
142
|
+
return parts
|
|
143
|
+
.map((part, index) => {
|
|
144
|
+
const text = TextPart.safeParse(part);
|
|
145
|
+
if (text.success) return text.data.text;
|
|
146
|
+
const refusal = allowRefusal ? RefusalPart.safeParse(part) : null;
|
|
147
|
+
if (refusal?.success) return refusal.data.refusal;
|
|
148
|
+
throw invalid(
|
|
149
|
+
`Only text content is supported for this message role.`,
|
|
150
|
+
`${param}[${index}]`,
|
|
151
|
+
"unsupported_content",
|
|
152
|
+
);
|
|
153
|
+
})
|
|
154
|
+
.join("");
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
function userContent(
|
|
158
|
+
parts: Record<string, unknown>[],
|
|
159
|
+
param: string,
|
|
160
|
+
): string | SingleModelCallContentPart[] {
|
|
161
|
+
return parts.map((part, index): SingleModelCallContentPart => {
|
|
162
|
+
const text = TextPart.safeParse(part);
|
|
163
|
+
if (text.success) return { type: "text", text: text.data.text };
|
|
164
|
+
const image = ImagePart.safeParse(part);
|
|
165
|
+
if (image.success) {
|
|
166
|
+
return {
|
|
167
|
+
type: "image",
|
|
168
|
+
url: image.data.image_url.url,
|
|
169
|
+
...(image.data.image_url.detail ? { detail: image.data.image_url.detail } : {}),
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
throw invalid(
|
|
173
|
+
`Unsupported content part type '${String(part.type)}'. Text and image_url parts are supported.`,
|
|
174
|
+
`${param}[${index}]`,
|
|
175
|
+
"unsupported_content",
|
|
176
|
+
);
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function messages(input: z.infer<typeof Message>[]): SingleModelCallMessage[] {
|
|
181
|
+
return input.map((message, index): SingleModelCallMessage => {
|
|
182
|
+
const param = `messages[${index}]`;
|
|
183
|
+
if (message.role === "tool" || message.role === "function") {
|
|
184
|
+
throw unsupported(
|
|
185
|
+
`${param}.role`,
|
|
186
|
+
`'${message.role}' messages are not supported without tools.`,
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
if (present(message.tool_calls) || present(message.function_call)) {
|
|
190
|
+
throw unsupported(`${param}.tool_calls`, "Tool calls are not supported.");
|
|
191
|
+
}
|
|
192
|
+
if (present(message.audio)) throw unsupported(`${param}.audio`, "Audio is not supported.");
|
|
193
|
+
const content = message.content ?? null;
|
|
194
|
+
if (message.role === "system" || message.role === "developer") {
|
|
195
|
+
if (content === null) throw invalid("System messages need content.", `${param}.content`);
|
|
196
|
+
return {
|
|
197
|
+
role: "system",
|
|
198
|
+
content: typeof content === "string" ? content : textOf(content, `${param}.content`, false),
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
if (message.role === "assistant") {
|
|
202
|
+
return {
|
|
203
|
+
role: "assistant",
|
|
204
|
+
content:
|
|
205
|
+
content === null
|
|
206
|
+
? ""
|
|
207
|
+
: typeof content === "string"
|
|
208
|
+
? content
|
|
209
|
+
: textOf(content, `${param}.content`, true),
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
if (message.role === "user") {
|
|
213
|
+
if (content === null) throw invalid("User messages need content.", `${param}.content`);
|
|
214
|
+
return {
|
|
215
|
+
role: "user",
|
|
216
|
+
content: typeof content === "string" ? content : userContent(content, `${param}.content`),
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
throw invalid(`Unknown message role '${message.role}'.`, `${param}.role`);
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
export function parseChatCompletionRequest(body: unknown): ParsedChatCompletionRequest {
|
|
224
|
+
if (!body || typeof body !== "object" || Array.isArray(body)) {
|
|
225
|
+
throw invalid("The request body must be a JSON object.", null);
|
|
226
|
+
}
|
|
227
|
+
refuseUnsupported(body as Record<string, unknown>);
|
|
228
|
+
const parsed = ChatCompletionRequest.safeParse(body);
|
|
229
|
+
if (!parsed.success) {
|
|
230
|
+
const issue = parsed.error.issues[0]!;
|
|
231
|
+
const param = issueParam(issue.path);
|
|
232
|
+
throw invalid(param ? `Invalid '${param}': ${issue.message}` : issue.message, param || null);
|
|
233
|
+
}
|
|
234
|
+
const data = parsed.data;
|
|
235
|
+
if (data.n !== null && data.n !== undefined && data.n !== 1) {
|
|
236
|
+
throw unsupported("n", "Only one choice per request is supported.");
|
|
237
|
+
}
|
|
238
|
+
const format = data.response_format;
|
|
239
|
+
if (format && format.type !== "text" && format.type !== "json_schema") {
|
|
240
|
+
throw unsupported(
|
|
241
|
+
"response_format",
|
|
242
|
+
format.type === "json_object"
|
|
243
|
+
? "JSON mode is not supported; use response_format type 'json_schema'."
|
|
244
|
+
: `Unsupported response_format type '${format.type}'.`,
|
|
245
|
+
);
|
|
246
|
+
}
|
|
247
|
+
let jsonSchema: z.infer<typeof JsonSchemaFormat>["json_schema"] | null = null;
|
|
248
|
+
if (format?.type === "json_schema") {
|
|
249
|
+
const schema = JsonSchemaFormat.safeParse(format);
|
|
250
|
+
if (!schema.success) {
|
|
251
|
+
const issue = schema.error.issues[0]!;
|
|
252
|
+
const param = issueParam(["response_format", ...issue.path]);
|
|
253
|
+
throw invalid(`Invalid '${param}': ${issue.message}`, param);
|
|
254
|
+
}
|
|
255
|
+
jsonSchema = schema.data.json_schema;
|
|
256
|
+
}
|
|
257
|
+
const maxOutputTokens = data.max_completion_tokens ?? data.max_tokens ?? undefined;
|
|
258
|
+
const stop = typeof data.stop === "string" ? [data.stop] : (data.stop ?? undefined);
|
|
259
|
+
const converted = messages(data.messages);
|
|
260
|
+
if (!converted.some((message) => message.role !== "system")) {
|
|
261
|
+
throw invalid("At least one user or assistant message is required.", "messages");
|
|
262
|
+
}
|
|
263
|
+
return {
|
|
264
|
+
model: data.model ?? null,
|
|
265
|
+
stream: data.stream === true,
|
|
266
|
+
includeUsage: data.stream_options?.include_usage === true,
|
|
267
|
+
request: {
|
|
268
|
+
messages: converted,
|
|
269
|
+
...(maxOutputTokens !== undefined ? { maxOutputTokens } : {}),
|
|
270
|
+
...(data.temperature != null ? { temperature: data.temperature } : {}),
|
|
271
|
+
...(data.top_p != null ? { topP: data.top_p } : {}),
|
|
272
|
+
...(stop?.length ? { stop } : {}),
|
|
273
|
+
...(data.reasoning_effort ? { reasoningEffort: data.reasoning_effort } : {}),
|
|
274
|
+
...(data.verbosity ? { verbosity: data.verbosity } : {}),
|
|
275
|
+
...(jsonSchema
|
|
276
|
+
? {
|
|
277
|
+
outputFormat: {
|
|
278
|
+
type: "json_schema" as const,
|
|
279
|
+
name: jsonSchema.name,
|
|
280
|
+
schema: jsonSchema.schema,
|
|
281
|
+
strict: jsonSchema.strict ?? false,
|
|
282
|
+
},
|
|
283
|
+
}
|
|
284
|
+
: {}),
|
|
285
|
+
},
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
export function chatCompletionUsage(usage: SingleModelCallResult["usage"]) {
|
|
290
|
+
if (!usage) return null;
|
|
291
|
+
const normalized = normalizeModelCallUsage(usage.usage);
|
|
292
|
+
const prompt = normalized.telemetry.inputTokens ?? 0;
|
|
293
|
+
const completion = normalized.telemetry.outputTokens ?? 0;
|
|
294
|
+
return {
|
|
295
|
+
prompt_tokens: prompt,
|
|
296
|
+
completion_tokens: completion,
|
|
297
|
+
total_tokens: normalized.totalTokens ?? prompt + completion,
|
|
298
|
+
prompt_tokens_details: { cached_tokens: normalized.telemetry.cachedTokens ?? 0 },
|
|
299
|
+
completion_tokens_details: { reasoning_tokens: normalized.telemetry.reasoningTokens ?? 0 },
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
export function chatCompletionId(requestId: string): string {
|
|
304
|
+
return `chatcmpl-${requestId.replaceAll("-", "")}`;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
export function chatCompletionResponse(input: {
|
|
308
|
+
requestId: string;
|
|
309
|
+
created: number;
|
|
310
|
+
model: string;
|
|
311
|
+
result: SingleModelCallResult;
|
|
312
|
+
}) {
|
|
313
|
+
return {
|
|
314
|
+
id: chatCompletionId(input.requestId),
|
|
315
|
+
object: "chat.completion",
|
|
316
|
+
created: input.created,
|
|
317
|
+
model: input.model,
|
|
318
|
+
choices: [
|
|
319
|
+
{
|
|
320
|
+
index: 0,
|
|
321
|
+
message: { role: "assistant", content: input.result.text, refusal: null },
|
|
322
|
+
logprobs: null,
|
|
323
|
+
finish_reason: input.result.finishReason,
|
|
324
|
+
},
|
|
325
|
+
],
|
|
326
|
+
usage: chatCompletionUsage(input.result.usage),
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
export function chatCompletionChunk(input: {
|
|
331
|
+
requestId: string;
|
|
332
|
+
created: number;
|
|
333
|
+
model: string;
|
|
334
|
+
delta: { role?: "assistant"; content?: string };
|
|
335
|
+
finishReason: SingleModelCallResult["finishReason"] | null;
|
|
336
|
+
includeUsage: boolean;
|
|
337
|
+
}) {
|
|
338
|
+
return {
|
|
339
|
+
id: chatCompletionId(input.requestId),
|
|
340
|
+
object: "chat.completion.chunk",
|
|
341
|
+
created: input.created,
|
|
342
|
+
model: input.model,
|
|
343
|
+
choices: [{ index: 0, delta: input.delta, logprobs: null, finish_reason: input.finishReason }],
|
|
344
|
+
...(input.includeUsage ? { usage: null } : {}),
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
export function chatCompletionError(error: ModelCallError) {
|
|
349
|
+
return {
|
|
350
|
+
error: { message: error.message, type: error.type, param: error.param, code: error.code },
|
|
351
|
+
};
|
|
352
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fast in-process retry for task usage receipts of attempt-authenticated
|
|
3
|
+
* single model calls. Durable custody lives in the database, not here.
|
|
4
|
+
*
|
|
5
|
+
* Before dispatch, admission opens a durable pending marker for the call's
|
|
6
|
+
* source identity (`model_call:<requestId>`). The provider response has
|
|
7
|
+
* already been returned when settlement runs, so a failed settlement is never
|
|
8
|
+
* fixed by calling the provider again:
|
|
9
|
+
*
|
|
10
|
+
* - the exact settlement is retained here and retried against the database
|
|
11
|
+
* with bounded backoff until it lands (no expiry, no silent eviction);
|
|
12
|
+
* - the marker is fenced at once when possible, and any marker left unfilled
|
|
13
|
+
* (fenced, or older than the overdue window after a crash or on another
|
|
14
|
+
* replica) blocks new model requests for the whole task on every replica;
|
|
15
|
+
* - maintenance discloses a marker that is never filled as an unpriced call,
|
|
16
|
+
* so coverage reads partial instead of complete.
|
|
17
|
+
*
|
|
18
|
+
* Settlement is idempotent on the source identity and fills the marker
|
|
19
|
+
* exactly once, so a retry racing a slow original write records usage once.
|
|
20
|
+
* When this process already retains `maxEntries` settlements it refuses new
|
|
21
|
+
* task calls instead of dropping any.
|
|
22
|
+
*/
|
|
23
|
+
export type RetainedSettlement = () => Promise<unknown>;
|
|
24
|
+
|
|
25
|
+
export type PendingUsageSettlementsOptions = {
|
|
26
|
+
/** Upper bound on retained settlements across all sessions. */
|
|
27
|
+
maxEntries?: number;
|
|
28
|
+
/** First background retry delay; doubles up to `maxDelayMs`. */
|
|
29
|
+
initialDelayMs?: number;
|
|
30
|
+
maxDelayMs?: number;
|
|
31
|
+
/** Test hook; defaults to setTimeout with unref. */
|
|
32
|
+
schedule?: (fn: () => void, delayMs: number) => void;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
type Entry = {
|
|
36
|
+
sessionId: string;
|
|
37
|
+
settle: RetainedSettlement;
|
|
38
|
+
delayMs: number;
|
|
39
|
+
scheduled: boolean;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export class PendingUsageSettlements {
|
|
43
|
+
private readonly entries = new Map<string, Entry>();
|
|
44
|
+
private readonly maxEntries: number;
|
|
45
|
+
private readonly initialDelayMs: number;
|
|
46
|
+
private readonly maxDelayMs: number;
|
|
47
|
+
|
|
48
|
+
constructor(private readonly options: PendingUsageSettlementsOptions = {}) {
|
|
49
|
+
this.maxEntries = Math.max(1, options.maxEntries ?? 1_000);
|
|
50
|
+
this.initialDelayMs = Math.max(10, options.initialDelayMs ?? 1_000);
|
|
51
|
+
this.maxDelayMs = Math.max(this.initialDelayMs, options.maxDelayMs ?? 60_000);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
get size(): number {
|
|
55
|
+
return this.entries.size;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** True when no further settlement can be retained: new task calls are refused. */
|
|
59
|
+
get full(): boolean {
|
|
60
|
+
return this.entries.size >= this.maxEntries;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** True when this session has a retained, not yet recorded settlement. */
|
|
64
|
+
has(sessionId: string): boolean {
|
|
65
|
+
for (const entry of this.entries.values()) if (entry.sessionId === sessionId) return true;
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Retain a failed settlement for exact DB-only retry. Returns false only
|
|
71
|
+
* when the process is already at capacity; the durable marker then remains
|
|
72
|
+
* the custody (fenced or overdue, later disclosed as unpriced).
|
|
73
|
+
*/
|
|
74
|
+
retain(sessionId: string, sourceId: string, settle: RetainedSettlement): boolean {
|
|
75
|
+
const key = `${sessionId}\u0000${sourceId}`;
|
|
76
|
+
if (this.entries.has(key)) return true;
|
|
77
|
+
if (this.full) return false;
|
|
78
|
+
const entry: Entry = { sessionId, settle, delayMs: this.initialDelayMs, scheduled: false };
|
|
79
|
+
this.entries.set(key, entry);
|
|
80
|
+
this.scheduleRetry(key, entry);
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Record every retained settlement of `sessionId`. Throws the first failure;
|
|
86
|
+
* successful ones are removed either way.
|
|
87
|
+
*/
|
|
88
|
+
async flush(sessionId: string): Promise<void> {
|
|
89
|
+
let failure: unknown = null;
|
|
90
|
+
for (const [key, entry] of [...this.entries]) {
|
|
91
|
+
if (entry.sessionId !== sessionId) continue;
|
|
92
|
+
try {
|
|
93
|
+
await entry.settle();
|
|
94
|
+
this.entries.delete(key);
|
|
95
|
+
} catch (error) {
|
|
96
|
+
failure ??= error;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (failure !== null) throw failure;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
private scheduleRetry(key: string, entry: Entry): void {
|
|
103
|
+
if (entry.scheduled) return;
|
|
104
|
+
entry.scheduled = true;
|
|
105
|
+
const run = async () => {
|
|
106
|
+
entry.scheduled = false;
|
|
107
|
+
if (this.entries.get(key) !== entry) return;
|
|
108
|
+
try {
|
|
109
|
+
await entry.settle();
|
|
110
|
+
if (this.entries.get(key) === entry) this.entries.delete(key);
|
|
111
|
+
} catch {
|
|
112
|
+
if (this.entries.get(key) !== entry) return;
|
|
113
|
+
entry.delayMs = Math.min(this.maxDelayMs, entry.delayMs * 2);
|
|
114
|
+
this.scheduleRetry(key, entry);
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
const schedule =
|
|
118
|
+
this.options.schedule ??
|
|
119
|
+
((fn: () => void, delayMs: number) => {
|
|
120
|
+
const timer = setTimeout(fn, delayMs);
|
|
121
|
+
(timer as { unref?: () => void }).unref?.();
|
|
122
|
+
});
|
|
123
|
+
schedule(() => void run(), entry.delayMs);
|
|
124
|
+
}
|
|
125
|
+
}
|