@mycadet/assistant 0.12.7 → 0.12.8
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/README.md +1 -1
- package/docs/activation-funnel-telemetry.md +6 -6
- package/docs/cadet-doctor.md +7 -7
- package/docs/desktop-browser-cli.md +7 -7
- package/docs/skills.md +2 -2
- package/docs/voice-input-diagnostics.md +1 -1
- package/eslint-rules/__tests__/cli-no-daemon-internals.test.ts +2 -2
- package/node_modules/@mycadet/avatar-manifest/src/__tests__/notification-avatar.test.ts +1 -1
- package/node_modules/@mycadet/avatar-manifest/src/notification-avatar.ts +2 -2
- package/node_modules/@mycadet/ces-client/node_modules/@mycadet/service-contracts/package.json +1 -1
- package/node_modules/@mycadet/ces-client/node_modules/@mycadet/service-contracts/src/{platform-credential.ts → cloud-credential.ts} +9 -9
- package/node_modules/@mycadet/ces-client/node_modules/@mycadet/service-contracts/src/handles.ts +3 -3
- package/node_modules/@mycadet/ces-client/node_modules/@mycadet/service-contracts/src/index.ts +1 -1
- package/node_modules/@mycadet/ces-client/node_modules/@mycadet/service-contracts/src/ingress.ts +11 -5
- package/node_modules/@mycadet/ces-client/node_modules/@mycadet/service-contracts/src/remote-web-pairing.ts +1 -1
- package/node_modules/@mycadet/ces-client/node_modules/@mycadet/service-contracts/src/rpc.ts +14 -14
- package/node_modules/@mycadet/ces-client/node_modules/@mycadet/service-contracts/src/trust-rules.ts +5 -5
- package/node_modules/@mycadet/ces-client/src/rpc-client.ts +1 -1
- package/node_modules/@mycadet/credential-storage/src/oauth-runtime.ts +1 -1
- package/node_modules/@mycadet/credential-storage/src/static-credentials.ts +1 -1
- package/node_modules/@mycadet/environments/src/seeds.ts +6 -6
- package/node_modules/@mycadet/environments/src/shell.test.ts +1 -1
- package/node_modules/@mycadet/environments/src/types.ts +6 -6
- package/node_modules/@mycadet/gateway-client/node_modules/@mycadet/service-contracts/package.json +1 -1
- package/node_modules/@mycadet/gateway-client/node_modules/@mycadet/service-contracts/src/{platform-credential.ts → cloud-credential.ts} +9 -9
- package/node_modules/@mycadet/gateway-client/node_modules/@mycadet/service-contracts/src/handles.ts +3 -3
- package/node_modules/@mycadet/gateway-client/node_modules/@mycadet/service-contracts/src/index.ts +1 -1
- package/node_modules/@mycadet/gateway-client/node_modules/@mycadet/service-contracts/src/ingress.ts +11 -5
- package/node_modules/@mycadet/gateway-client/node_modules/@mycadet/service-contracts/src/remote-web-pairing.ts +1 -1
- package/node_modules/@mycadet/gateway-client/node_modules/@mycadet/service-contracts/src/rpc.ts +14 -14
- package/node_modules/@mycadet/gateway-client/node_modules/@mycadet/service-contracts/src/trust-rules.ts +5 -5
- package/node_modules/@mycadet/gateway-client/src/binding-strength-contract.ts +5 -5
- package/node_modules/@mycadet/gateway-client/src/gateway-ipc-contracts.ts +1 -1
- package/node_modules/@mycadet/gateway-client/src/inbound-contract.ts +2 -2
- package/node_modules/@mycadet/gateway-client/src/outbound-contract.ts +1 -1
- package/node_modules/@mycadet/service-contracts/package.json +1 -1
- package/node_modules/@mycadet/service-contracts/src/{platform-credential.ts → cloud-credential.ts} +9 -9
- package/node_modules/@mycadet/service-contracts/src/handles.ts +3 -3
- package/node_modules/@mycadet/service-contracts/src/index.ts +1 -1
- package/node_modules/@mycadet/service-contracts/src/ingress.ts +11 -5
- package/node_modules/@mycadet/service-contracts/src/remote-web-pairing.ts +1 -1
- package/node_modules/@mycadet/service-contracts/src/rpc.ts +14 -14
- package/node_modules/@mycadet/service-contracts/src/trust-rules.ts +5 -5
- package/openapi.yaml +6815 -794
- package/package.json +2 -2
- package/scripts/build-test-fixtures.ts +1 -1
- package/scripts/probe-skill-retrieval.ts +1 -1
- package/scripts/sync-llm-catalog.ts +2 -2
- package/scripts/voice-ttft-spike.ts +2 -2
- package/src/__tests__/adaptive-thinking-repair.test.ts +4 -4
- package/src/__tests__/agent-loop-override-profile.test.ts +4 -4
- package/src/__tests__/agent-loop-subagent-billing-headers.test.ts +1 -1
- package/src/__tests__/anthropic-provider.test.ts +2 -2
- package/src/__tests__/available-skills.test.ts +11 -12
- package/src/__tests__/avatar-identity-sync.test.ts +1 -1
- package/src/__tests__/byok-default-profile-ensure.test.ts +7 -7
- package/src/__tests__/call-domain.test.ts +1 -1
- package/src/__tests__/call-site-routing-connection-auto-resolve.test.ts +2 -2
- package/src/__tests__/catalog-files.test.ts +10 -10
- package/src/__tests__/catalog-install-normalize.test.ts +3 -3
- package/src/__tests__/channel-availability-routes.test.ts +8 -8
- package/src/__tests__/channel-readiness-routes.test.ts +4 -4
- package/src/__tests__/channel-readiness-service.test.ts +14 -14
- package/src/__tests__/channel-readiness-telegram-remote.test.ts +1 -1
- package/src/__tests__/chat-reveal-guard-priming.test.ts +5 -6
- package/src/__tests__/checker.test.ts +6 -6
- package/src/__tests__/clawhub.test.ts +1 -1
- package/src/__tests__/{platform-callback-registration.test.ts → cloud-callback-registration.test.ts} +66 -90
- package/src/__tests__/{platform-client-verify-credential.test.ts → cloud-client-verify-credential.test.ts} +14 -14
- package/src/__tests__/{managed-credential-catalog-cli.test.ts → cloud-credential-catalog-cli.test.ts} +41 -41
- package/src/__tests__/{managed-fallback-dispatch.test.ts → cloud-fallback-dispatch.test.ts} +21 -16
- package/src/__tests__/{managed-profile-guard.test.ts → cloud-profile-guard.test.ts} +60 -60
- package/src/__tests__/{platform-proxy-context.test.ts → cloud-proxy-context.test.ts} +44 -44
- package/src/__tests__/{managed-speech-defaults.test.ts → cloud-speech-defaults.test.ts} +41 -41
- package/src/__tests__/{managed-store.test.ts → cloud-store.test.ts} +99 -99
- package/src/__tests__/compaction-events.test.ts +7 -5
- package/src/__tests__/config-loader-backfill.test.ts +65 -65
- package/src/__tests__/config-loader-cloud-defaults.test.ts +373 -0
- package/src/__tests__/config-loader-corrupt.test.ts +1 -1
- package/src/__tests__/config-loader-validation-reset-notice.test.ts +1 -1
- package/src/__tests__/config-schema.test.ts +3 -3
- package/src/__tests__/{config-set-platform-guard.test.ts → config-set-cloud-guard.test.ts} +6 -6
- package/src/__tests__/config-watcher-cleanup-throttle.test.ts +0 -8
- package/src/__tests__/config-watcher.test.ts +1 -1
- package/src/__tests__/contacts-write.test.ts +1 -1
- package/src/__tests__/conversation-agent-loop.test.ts +2 -2
- package/src/__tests__/conversation-app-control-instantiation.test.ts +18 -18
- package/src/__tests__/conversation-error.test.ts +45 -45
- package/src/__tests__/conversation-inference-profile-route.test.ts +4 -4
- package/src/__tests__/conversation-rendered-delegation-state.test.ts +4 -4
- package/src/__tests__/conversation-skill-tools.test.ts +7 -8
- package/src/__tests__/conversation-slash.test.ts +2 -2
- package/src/__tests__/conversation-speed-override.test.ts +8 -10
- package/src/__tests__/conversation-summarize-up-to.test.ts +4 -4
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +1 -1
- package/src/__tests__/conversation-wait-for-idle.test.ts +7 -5
- package/src/__tests__/credential-execution-api-key-propagation.test.ts +5 -5
- package/src/__tests__/{credential-execution-managed-contract.test.ts → credential-execution-cloud-contract.test.ts} +24 -24
- package/src/__tests__/credential-health-service.test.ts +27 -41
- package/src/__tests__/credential-routes.test.ts +85 -165
- package/src/__tests__/credential-security-invariants.test.ts +6 -7
- package/src/__tests__/custom-profile-ensure.test.ts +1 -1
- package/src/__tests__/date-context.test.ts +1 -1
- package/src/__tests__/default-profile-catalog-fallback.test.ts +15 -15
- package/src/__tests__/delete-managed-skill-tool.test.ts +8 -8
- package/src/__tests__/discord-callback-round-trip.test.ts +1 -1
- package/src/__tests__/disk-usage.test.ts +3 -3
- package/src/__tests__/email-invite-adapter.test.ts +5 -5
- package/src/__tests__/{embedding-managed-proxy-selection.test.ts → embedding-cloud-proxy-selection.test.ts} +44 -43
- package/src/__tests__/emit-signal-routing-intent.test.ts +13 -15
- package/src/__tests__/events-dev-bypass-actor.test.ts +2 -2
- package/src/__tests__/fallback-breaker.test.ts +7 -7
- package/src/__tests__/feature-flag-test-helpers.ts +106 -0
- package/src/__tests__/gateway-flag-listener.test.ts +1 -1
- package/src/__tests__/gemini-image-service.test.ts +2 -2
- package/src/__tests__/gemini-provider.test.ts +5 -5
- package/src/__tests__/get-skill-detail-audit.test.ts +9 -8
- package/src/__tests__/guardian-verification-voice-binding.test.ts +1 -1
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +5 -5
- package/src/__tests__/host-cu-routes-targeted.test.ts +8 -8
- package/src/__tests__/image-credentials.test.ts +13 -13
- package/src/__tests__/inbound-admitted-introduction-nudge.test.ts +14 -6
- package/src/__tests__/inbound-trust-verdict.test.ts +14 -6
- package/src/__tests__/inference-no-mode-boot-e2e.test.ts +11 -11
- package/src/__tests__/inference-profile-session-handler.test.ts +7 -7
- package/src/__tests__/inference-profile-session-ipc.test.ts +5 -5
- package/src/__tests__/inference-profile-validation-jev.test.ts +1 -1
- package/src/__tests__/init-feature-flag-overrides.test.ts +40 -24
- package/src/__tests__/input-repairs.test.ts +1 -1
- package/src/__tests__/install-skill-routing.test.ts +10 -8
- package/src/__tests__/integration-status.test.ts +5 -5
- package/src/__tests__/internal-telemetry-routes.test.ts +3 -3
- package/src/__tests__/invite-routes-http.test.ts +1 -1
- package/src/__tests__/llm-catalog-parity.test.ts +5 -7
- package/src/__tests__/llm-request-log-source-clickhouse.test.ts +2 -2
- package/src/__tests__/llm-resolver-override-or-default.test.ts +3 -3
- package/src/__tests__/llm-resolver.test.ts +1 -1
- package/src/__tests__/llm-schema-fallback-profile.test.ts +25 -19
- package/src/__tests__/llm-usage-store.test.ts +1 -1
- package/src/__tests__/managed-skill-lifecycle.test.ts +12 -12
- package/src/__tests__/mcp-abort-signal.test.ts +2 -2
- package/src/__tests__/mcp-client-auth.test.ts +2 -2
- package/src/__tests__/mcp-tool-annotations-risk.test.ts +2 -2
- package/src/__tests__/media-generate-image.test.ts +30 -30
- package/src/__tests__/memory-config-file-parity.test.ts +6 -6
- package/src/__tests__/migration-export-to-gcs.test.ts +4 -4
- package/src/__tests__/migration-import-commit-http.test.ts +1 -1
- package/src/__tests__/mtime-cache.test.ts +2 -2
- package/src/__tests__/{notification-platform-adapter.test.ts → notification-cloud-adapter.test.ts} +39 -39
- package/src/__tests__/notification-deep-link.test.ts +40 -40
- package/src/__tests__/oauth-apps-routes.test.ts +3 -3
- package/src/__tests__/oauth-cli.test.ts +9 -9
- package/src/__tests__/oauth-commands-routes.test.ts +16 -16
- package/src/__tests__/oauth-connect-orchestrator.test.ts +2 -2
- package/src/__tests__/oauth-provider-serializer.test.ts +11 -11
- package/src/__tests__/oauth-providers-routes.test.ts +12 -12
- package/src/__tests__/oauth-store.test.ts +1 -1
- package/src/__tests__/oauth2-gateway-transport.test.ts +3 -3
- package/src/__tests__/onboarding-persona-write.test.ts +2 -2
- package/src/__tests__/openai-image-service.test.ts +2 -2
- package/src/__tests__/openai-responses-cutover-guard.test.ts +2 -2
- package/src/__tests__/openai-responses-provider.test.ts +1 -1
- package/src/__tests__/path-policy.test.ts +4 -4
- package/src/__tests__/personal-memory-auth-bypass.test.ts +1 -1
- package/src/__tests__/platform-bash-auto-approve.test.ts +18 -18
- package/src/__tests__/plugin-api-model-profiles.test.ts +1 -1
- package/src/__tests__/plugin-api-provider.test.ts +1 -1
- package/src/__tests__/plugin-api-webhook-url.test.ts +4 -5
- package/src/__tests__/plugin-import-boundary-guard.test.ts +8 -39
- package/src/__tests__/plugin-import-boundary-reverse-guard.test.ts +2 -2
- package/src/__tests__/{provider-platform-proxy-integration.test.ts → provider-cloud-proxy-integration.test.ts} +70 -72
- package/src/__tests__/provider-commit-message-generator.test.ts +1 -1
- package/src/__tests__/provider-connections-backfill.test.ts +9 -9
- package/src/__tests__/provider-error-scenarios.test.ts +8 -8
- package/src/__tests__/provider-registry-ollama.test.ts +1 -1
- package/src/__tests__/provider-send-message-override-profile.test.ts +5 -5
- package/src/__tests__/registry.test.ts +3 -3
- package/src/__tests__/requests-mock.ts +972 -0
- package/src/__tests__/resolve-trust-class.test.ts +1 -1
- package/src/__tests__/resource-pressure-guard.test.ts +6 -6
- package/src/__tests__/resource-pressure-routes.test.ts +5 -5
- package/src/__tests__/retry-fallback-escalation.test.ts +5 -5
- package/src/__tests__/sanitize-config-for-transfer.test.ts +1 -1
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +97 -97
- package/src/__tests__/schedule-store.test.ts +1 -1
- package/src/__tests__/search-skills-unified.test.ts +9 -7
- package/src/__tests__/{secret-routes-platform-proxy.test.ts → secret-routes-cloud-proxy.test.ts} +48 -95
- package/src/__tests__/secret-routes-scrub.test.ts +2 -59
- package/src/__tests__/secure-keys.test.ts +1 -1
- package/src/__tests__/skill-load-plugin-scope.test.ts +2 -2
- package/src/__tests__/skill-load-tool.test.ts +1 -1
- package/src/__tests__/skill-projection-feature-flag.test.ts +0 -19
- package/src/__tests__/skill-projection.benchmark.test.ts +5 -7
- package/src/__tests__/skill-tool-factory.test.ts +1 -1
- package/src/__tests__/skills-file-content-endpoint.test.ts +12 -12
- package/src/__tests__/skills-files-catalog-fallback.test.ts +9 -9
- package/src/__tests__/skills.test.ts +1 -1
- package/src/__tests__/slim-skill-category.test.ts +11 -9
- package/src/__tests__/stt-stream-session.test.ts +3 -3
- package/src/__tests__/subagent-call-site-routing.test.ts +1 -1
- package/src/__tests__/subagent-disposal.test.ts +5 -5
- package/src/__tests__/subagent-fork-notifications.test.ts +4 -4
- package/src/__tests__/subagent-fork-spawn.test.ts +5 -5
- package/src/__tests__/subagent-manager-notify.test.ts +5 -5
- package/src/__tests__/subagent-tool-gate-mode.test.ts +2 -2
- package/src/__tests__/system-prompt.test.ts +1 -1
- package/src/__tests__/telegram-bot-username-resolution.test.ts +34 -52
- package/src/__tests__/telegram-config.test.ts +16 -16
- package/src/__tests__/telephony-tts-guard.test.ts +13 -13
- package/src/__tests__/test-preload.ts +17 -7
- package/src/__tests__/tool-audit.test.ts +1 -1
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +7 -5
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +1 -1
- package/src/__tests__/turn-events-store.test.ts +1 -1
- package/src/__tests__/twilio-routes.test.ts +2 -1
- package/src/__tests__/ui-choice-copy-surfaces.test.ts +1 -1
- package/src/__tests__/unified-turn-context-client-os.test.ts +1 -1
- package/src/__tests__/validate-input.test.ts +5 -5
- package/src/__tests__/verification-outbound-delivery.test.ts +1 -1
- package/src/__tests__/voice-config-update.test.ts +15 -15
- package/src/__tests__/voice-ingress-preflight.test.ts +4 -4
- package/src/__tests__/web-search.test.ts +340 -859
- package/src/__tests__/workspace-git-service.test.ts +1 -1
- package/src/__tests__/workspace-migration-082-backfill-managed-profile-labels.test.ts +12 -12
- package/src/__tests__/workspace-migration-087-memory-router-balanced-profile.test.ts +1 -1
- package/src/__tests__/workspace-migration-090-memory-router-cost-optimized-profile.test.ts +1 -1
- package/src/__tests__/workspace-migration-100-upgrade-quality-profile-to-fable-5.test.ts +1 -1
- package/src/__tests__/workspace-migration-103-upgrade-quality-profile-to-opus-4-8.test.ts +1 -1
- package/src/__tests__/workspace-migration-110-flip-balanced-profile-to-together.test.ts +1 -1
- package/src/__tests__/workspace-migration-113-swap-balanced-profile-to-glm-5p2.test.ts +1 -1
- package/src/__tests__/workspace-migration-114-swap-quality-profile-to-opus.test.ts +1 -1
- package/src/__tests__/workspace-migration-123-swap-quality-profile-to-fable.test.ts +1 -1
- package/src/__tests__/workspace-migration-125-repoint-managed-connections-to-cadet.test.ts +3 -3
- package/src/__tests__/workspace-migration-126-strip-managed-profile-bodies.test.ts +9 -9
- package/src/__tests__/workspace-migration-127-backfill-default-provider.test.ts +11 -11
- package/src/__tests__/workspace-migration-130-speech-mode-to-provider.test.ts +3 -3
- package/src/__tests__/workspace-migration-132-web-search-mode-to-provider.test.ts +6 -6
- package/src/__tests__/workspace-migration-133-collapse-provider-connections.test.ts +3 -3
- package/src/__tests__/workspace-migration-134-image-generation-mode-to-provider.test.ts +6 -6
- package/src/__tests__/workspace-migration-136-repair-stale-fireworks-kimi-model-id.test.ts +1 -1
- package/src/__tests__/workspace-migration-137-repair-retired-fireworks-minimax-model-id.test.ts +1 -1
- package/src/__tests__/workspace-migration-146-repair-retired-fireworks-deepseek-flash-model-id.test.ts +1 -1
- package/src/__tests__/workspace-migration-147-rename-colliding-backup-profile-names.test.ts +1 -1
- package/src/__tests__/workspace-migration-151-repair-renamed-fireworks-deepseek-pro-model-id.test.ts +1 -1
- package/src/__tests__/workspace-migration-152-repair-retired-fireworks-minimax-m2p7-model-id.test.ts +1 -1
- package/src/__tests__/workspace-migration-159-rename-colliding-jev-profile-name.test.ts +1 -1
- package/src/__tests__/workspace-migration-160-repair-retired-fireworks-model-ids.test.ts +1 -1
- package/src/__tests__/workspace-migration-161-repair-retired-fireworks-glm-5p2-model-id.test.ts +1 -1
- package/src/api/events/cloud-disconnected.ts +21 -0
- package/src/api/events/host-bash.ts +1 -1
- package/src/api/events/host-cu.ts +1 -1
- package/src/api/events/host-file.ts +1 -1
- package/src/api/events/notification-intent.ts +1 -1
- package/src/api/events/{show-platform-login.ts → show-cloud-login.ts} +3 -5
- package/src/api/index.ts +11 -11
- package/src/api/responses/home.ts +1 -1
- package/src/api/surfaces.ts +4 -4
- package/src/approvals/guardian-request-resolvers.ts +2 -2
- package/src/avatar/accent-backfill.ts +1 -1
- package/src/avatar/identity-avatar.ts +1 -1
- package/src/avatar/notification-avatar.test.ts +2 -2
- package/src/avatar/notification-avatar.ts +2 -2
- package/src/avatar/resvg-lazy.test.ts +1 -1
- package/src/avatar/resvg-lazy.ts +3 -3
- package/src/avatar/sync-avatar.test.ts +76 -76
- package/src/avatar/sync-avatar.ts +15 -15
- package/src/avatar/traits-png-sync.ts +1 -1
- package/src/background-wake/background-wake-routes.test.ts +39 -39
- package/src/background-wake/{platform-client.test.ts → cloud-client.test.ts} +11 -11
- package/src/background-wake/{platform-client.ts → cloud-client.ts} +14 -14
- package/src/background-wake/publisher.ts +4 -4
- package/src/background-wake/wake-intent-hooks.test.ts +3 -3
- package/src/calls/__tests__/call-controller.test.ts +2 -2
- package/src/calls/__tests__/voice-session-bridge.test.ts +1 -1
- package/src/calls/call-domain.ts +1 -1
- package/src/calls/resolve-call-tts-provider.ts +6 -6
- package/src/calls/telephony-credential-preflight.ts +3 -3
- package/src/calls/telephony-tts-capability.ts +5 -6
- package/src/calls/tts-call-strategy.ts +1 -1
- package/src/calls/voice-escalation-judge.ts +1 -1
- package/src/calls/voice-ingress-preflight.ts +4 -4
- package/src/cli/bundled-modules.ts +1 -1
- package/src/cli/commands/__tests__/apps.test.ts +18 -53
- package/src/cli/commands/__tests__/plugins.test.ts +13 -13
- package/src/cli/commands/__tests__/tts.test.ts +1 -1
- package/src/cli/commands/auth.help.ts +3 -3
- package/src/cli/commands/auth.ts +2 -4
- package/src/cli/commands/browser.help.ts +2 -2
- package/src/cli/commands/channels/index.help.ts +2 -2
- package/src/cli/commands/channels/index.ts +1 -1
- package/src/cli/commands/channels/send.ts +1 -1
- package/src/cli/commands/cloud/__tests__/connect.test.ts +1 -1
- package/src/cli/commands/cloud/__tests__/disconnect.test.ts +3 -4
- package/src/cli/commands/cloud/connect.ts +2 -2
- package/src/cli/commands/cloud/credits-format.ts +1 -1
- package/src/cli/commands/cloud/index.help.ts +35 -35
- package/src/cli/commands/config.ts +1 -1
- package/src/cli/commands/credentials.ts +10 -12
- package/src/cli/commands/domain.ts +1 -1
- package/src/cli/commands/email.help.ts +1 -1
- package/src/cli/commands/email.ts +2 -2
- package/src/cli/commands/gateway.help.ts +1 -1
- package/src/cli/commands/gateway.ts +1 -1
- package/src/cli/commands/image-generation.help.ts +1 -1
- package/src/cli/commands/inference-providers.ts +1 -1
- package/src/cli/commands/inference.help.ts +2 -2
- package/src/cli/commands/memory/index.help.ts +1 -1
- package/src/cli/commands/oauth/connect.test.ts +2 -2
- package/src/cli/commands/oauth/connect.ts +1 -1
- package/src/cli/commands/oauth/index.help.ts +5 -5
- package/src/cli/commands/oauth/providers.ts +2 -2
- package/src/cli/commands/oauth/shared.ts +3 -3
- package/src/cli/commands/plugins.help.ts +2 -3
- package/src/cli/commands/plugins.ts +5 -5
- package/src/cli/commands/roadmap.help.ts +1 -1
- package/src/cli/commands/telemetry.help.ts +2 -2
- package/src/cli/commands/telemetry.ts +2 -2
- package/src/cli/commands/tts.help.ts +3 -3
- package/src/cli/commands/webhooks.help.ts +9 -9
- package/src/cli/commands/webhooks.ts +1 -1
- package/src/cli/lib/__tests__/inspect-plugin.test.ts +8 -8
- package/src/cli/lib/__tests__/{install-from-platform.test.ts → install-from-cloud.test.ts} +54 -54
- package/src/cli/lib/__tests__/plugin-catalog-cache.test.ts +18 -18
- package/src/cli/lib/__tests__/{plugin-catalog-platform.test.ts → plugin-catalog-cloud.test.ts} +2 -2
- package/src/cli/lib/__tests__/plugin-catalog-local.test.ts +1 -1
- package/src/cli/lib/__tests__/plugin-catalog-resolve.test.ts +9 -9
- package/src/cli/lib/__tests__/plugin-details.test.ts +10 -10
- package/src/cli/lib/__tests__/plugins-install-offline.test.ts +24 -24
- package/src/cli/lib/bundled-marketplace.json +1 -1
- package/src/cli/lib/inspect-plugin.ts +2 -2
- package/src/cli/lib/{install-from-platform.ts → install-from-cloud.ts} +29 -29
- package/src/cli/lib/install-from-github.ts +4 -4
- package/src/cli/lib/plugin-catalog-cache.ts +7 -7
- package/src/cli/lib/{plugin-catalog-platform.ts → plugin-catalog-cloud.ts} +6 -6
- package/src/cli/lib/plugin-catalog-local.ts +2 -2
- package/src/cli/lib/publish-plugin.ts +9 -10
- package/src/cli/lib/search-plugins.ts +2 -2
- package/src/{platform → cloud}/client.test.ts +85 -86
- package/src/{platform → cloud}/client.ts +38 -46
- package/src/{platform/platform-patch-queue.test.ts → cloud/cloud-patch-queue.test.ts} +6 -9
- package/src/{platform/platform-patch-queue.ts → cloud/cloud-patch-queue.ts} +11 -11
- package/src/{platform/managed-speech.test.ts → cloud/cloud-speech.test.ts} +19 -19
- package/src/{platform/managed-speech.ts → cloud/cloud-speech.ts} +41 -41
- package/src/{platform → cloud}/consent-cache.test.ts +5 -5
- package/src/{platform → cloud}/consent-cache.ts +8 -8
- package/src/cloud/feature-gate.ts +8 -0
- package/src/{platform → cloud}/sync-identity.test.ts +4 -4
- package/src/{platform → cloud}/sync-identity.ts +6 -6
- package/src/config/__tests__/{platform-identity.test.ts → cloud-identity.test.ts} +54 -56
- package/src/config/__tests__/{platform-rehydration.test.ts → cloud-rehydration.test.ts} +47 -80
- package/src/config/__tests__/default-profile-catalog.test.ts +12 -12
- package/src/config/__tests__/default-provider.test.ts +4 -4
- package/src/config/__tests__/deployment-context-defaults.test.ts +23 -23
- package/src/config/__tests__/{jev-managed-profile.test.ts → jev-cloud-profile.test.ts} +3 -5
- package/src/config/__tests__/loader-callsite-strip-fallback.test.ts +2 -2
- package/src/config/__tests__/loader-last-known-good.test.ts +6 -6
- package/src/config/__tests__/loader-sparse-array-cleanup.test.ts +2 -2
- package/src/config/__tests__/profile-materialization.test.ts +7 -7
- package/src/config/__tests__/seed-default-provider.test.ts +17 -17
- package/src/config/__tests__/sync-gated-profiles.test.ts +20 -20
- package/src/config/__tests__/webhook-routing.test.ts +51 -51
- package/src/config/bundled-skills/computer-use/TOOLS.json +12 -12
- package/src/config/bundled-skills/messaging/SKILL.md +8 -8
- package/src/config/bundled-skills/messaging/TOOLS.json +2 -2
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +1 -1
- package/src/config/bundled-skills/messaging/tools/shared.ts +1 -1
- package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +2 -2
- package/src/config/bundled-skills/settings/TOOLS.json +3 -3
- package/src/config/bundled-skills/settings/tools/shared.ts +1 -1
- package/src/config/bundled-skills/settings/tools/voice-config-update.ts +12 -12
- package/src/config/bundled-skills/skill-management/SKILL.md +3 -3
- package/src/config/bundled-skills/skill-management/TOOLS.json +8 -8
- package/src/config/bundled-skills/skill-management/tools/{delete-managed.ts → delete-cloud.ts} +2 -2
- package/src/config/bundled-skills/skill-management/tools/{scaffold-managed.ts → scaffold-cloud.ts} +2 -2
- package/src/config/call-site-defaults.ts +6 -6
- package/src/config/{platform-identity.ts → cloud-identity.ts} +39 -42
- package/src/config/cloud-rehydration.ts +35 -0
- package/src/config/{managed-speech-defaults.ts → cloud-speech-defaults.ts} +13 -13
- package/src/config/default-profile-catalog.ts +36 -38
- package/src/config/default-profile-names.ts +11 -11
- package/src/config/default-provider-resolution.ts +2 -2
- package/src/config/default-provider.ts +1 -1
- package/src/config/env-registry.ts +23 -21
- package/src/config/env.ts +33 -46
- package/src/config/feature-flag-registry.json +5 -5
- package/src/config/inference-profile-validation.ts +1 -1
- package/src/config/llm-resolver.ts +9 -10
- package/src/config/loader.ts +33 -17
- package/src/config/profile-materialization.ts +8 -8
- package/src/config/profile-text-generation.test.ts +1 -1
- package/src/config/sanitize-for-transfer.ts +1 -1
- package/src/config/schema.ts +6 -6
- package/src/config/schemas/__tests__/stt.test.ts +2 -2
- package/src/config/schemas/call-site-catalog.ts +1 -1
- package/src/config/schemas/channels.ts +8 -0
- package/src/config/schemas/{platform.ts → cloud.ts} +7 -6
- package/src/config/schemas/host-browser.ts +1 -0
- package/src/config/schemas/ingress.ts +1 -12
- package/src/config/schemas/llm.ts +45 -36
- package/src/config/schemas/memory-lifecycle.ts +11 -1
- package/src/config/schemas/services.ts +4 -4
- package/src/config/schemas/stt.ts +3 -3
- package/src/config/schemas/tts.ts +10 -5
- package/src/config/schemas/voice.ts +1 -1
- package/src/config/seed-inference-profiles.ts +19 -19
- package/src/config/skill-state.ts +2 -2
- package/src/config/skills.ts +4 -4
- package/src/config/sync-gated-profiles.ts +8 -8
- package/src/config/webhook-routing.ts +19 -19
- package/src/contacts/contacts-write.ts +1 -1
- package/src/credential-execution/ces-runtime.ts +6 -6
- package/src/credential-execution/{managed-catalog.ts → cloud-catalog.ts} +24 -24
- package/src/credential-execution/prompted-credential.ts +6 -18
- package/src/credential-health/credential-health-service.ts +61 -76
- package/src/daemon/__tests__/can-spawn-subagents.test.ts +1 -1
- package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +4 -4
- package/src/daemon/config-watcher.ts +2 -2
- package/src/daemon/conversation-agent-loop.ts +9 -9
- package/src/daemon/conversation-error.ts +36 -36
- package/src/daemon/conversation-skill-tools.ts +7 -7
- package/src/daemon/conversation-surfaces.ts +1 -1
- package/src/daemon/conversation-tool-setup.ts +2 -2
- package/src/daemon/conversation-turn-finalize.ts +1 -1
- package/src/daemon/conversation-workspace.ts +1 -1
- package/src/daemon/conversation.ts +1 -1
- package/src/daemon/credential-transcript-scrub.ts +21 -35
- package/src/daemon/daemon-readiness.ts +1 -1
- package/src/daemon/event-loop-watchdog.ts +2 -2
- package/src/daemon/handlers/config-ingress.ts +9 -9
- package/src/daemon/handlers/config-telegram.ts +6 -6
- package/src/daemon/handlers/skills.ts +20 -20
- package/src/daemon/host-cu-proxy.ts +1 -1
- package/src/daemon/lifecycle.ts +19 -19
- package/src/daemon/parse-actual-tokens-from-error.ts +3 -3
- package/src/daemon/providers-setup.ts +6 -6
- package/src/daemon/resource-pressure-guard-lifecycle.ts +1 -1
- package/src/daemon/resource-pressure-guard.ts +6 -6
- package/src/daemon/shutdown-handlers.ts +1 -1
- package/src/daemon/sqlite-corruption-watchdog.ts +3 -3
- package/src/daemon/trust-context.ts +1 -1
- package/src/desktop/desktop-automation-lease.ts +1 -1
- package/src/desktop/desktop-browser-endpoint.ts +2 -4
- package/src/desktop/desktop-computer-use-routing.test.ts +6 -6
- package/src/desktop/desktop-stream-bridge.test.ts +4 -4
- package/src/desktop/desktop-stream-bridge.ts +1 -1
- package/src/desktop/{virtual-desktop-platform.test.ts → virtual-desktop-cloud.test.ts} +6 -6
- package/src/desktop/virtual-desktop-feature.ts +7 -7
- package/src/email/byo-email-credential.ts +1 -1
- package/src/email/registered-inbox.test.ts +16 -16
- package/src/email/registered-inbox.ts +20 -20
- package/src/heartbeat/heartbeat-service.ts +1 -1
- package/src/hooks/hook-loader.ts +2 -2
- package/src/inbound/__tests__/oauth-callback-url.test.ts +2 -2
- package/src/inbound/__tests__/tunnel-probe.test.ts +8 -8
- package/src/inbound/{platform-callback-registration.ts → cloud-callback-registration.ts} +49 -60
- package/src/inbound/oauth-callback-url.ts +6 -6
- package/src/inbound/pod-webhook-claim.ts +2 -2
- package/src/inbound/public-ingress-urls.ts +3 -3
- package/src/inbound/tunnel-probe.ts +21 -15
- package/src/inbound/tunnel-webhooks-gate.ts +3 -3
- package/src/ipc/__tests__/db-readiness-ipc-gate.test.ts +1 -1
- package/src/ipc/__tests__/email-ipc.test.ts +8 -8
- package/src/ipc/gateway-client.test.ts +55 -59
- package/src/ipc/gateway-flag-listener.ts +3 -3
- package/src/ipc/routes/db-proxy.ts +1 -1
- package/src/live-voice/__tests__/live-activity-reporter.test.ts +2 -2
- package/src/live-voice/__tests__/{live-voice-managed-speech-fallback.test.ts → live-voice-cloud-speech-fallback.test.ts} +15 -15
- package/src/live-voice/__tests__/live-voice-credential-preflight.test.ts +7 -7
- package/src/live-voice/__tests__/live-voice-stt.test.ts +1 -1
- package/src/live-voice/live-activity-reporter.ts +7 -7
- package/src/live-voice/live-voice-credential-preflight.ts +6 -6
- package/src/live-voice/live-voice-session.ts +3 -3
- package/src/live-voice/live-voice-tts.ts +1 -1
- package/src/mcp/__tests__/mcp-oauth-client-registration.test.ts +4 -4
- package/src/mcp/__tests__/mcp-oauth-provider.test.ts +1 -1
- package/src/mcp/mcp-oauth-provider.ts +2 -2
- package/src/media/gemini-image-service.ts +11 -13
- package/src/media/image-credentials.ts +9 -9
- package/src/media/openai-image-service.ts +1 -1
- package/src/media/types.ts +3 -3
- package/src/messaging/providers/channel-transport.ts +1 -1
- package/src/messaging/providers/discord/transport.ts +1 -1
- package/src/messaging/providers/gmail/adapter.ts +1 -1
- package/src/messaging/providers/gmail/client.ts +4 -4
- package/src/messaging/providers/outlook/adapter.ts +1 -1
- package/src/messaging/providers/slack/adapter.ts +1 -1
- package/src/messaging/providers/slack/transport.ts +1 -1
- package/src/messaging/providers/telegram-bot/transport.ts +1 -1
- package/src/monitoring/db-integrity-check.ts +1 -1
- package/src/monitoring/db-integrity-sample.ts +2 -2
- package/src/monitoring/mount-watch.ts +1 -1
- package/src/monitoring/oom-kill-reporter.ts +1 -1
- package/src/monitoring/worker.ts +5 -5
- package/src/notifications/README.md +2 -2
- package/src/notifications/__tests__/broadcaster.test.ts +9 -9
- package/src/notifications/__tests__/completion-policy.test.ts +1 -1
- package/src/notifications/__tests__/emit-signal-pipeline-failure.test.ts +4 -4
- package/src/notifications/activity-failed-dedupe.ts +1 -1
- package/src/notifications/adapters/{platform.ts → cloud.ts} +8 -8
- package/src/notifications/broadcaster.ts +10 -10
- package/src/notifications/decision-engine.ts +1 -1
- package/src/notifications/destination-resolver.ts +1 -1
- package/src/notifications/emit-signal.ts +6 -6
- package/src/notifications/types.ts +2 -2
- package/src/oauth/__tests__/identity-verifier.test.ts +1 -1
- package/src/oauth/__tests__/{seed-providers-managed.test.ts → seed-providers-cloud.test.ts} +13 -13
- package/src/oauth/byo-connection.test.ts +2 -2
- package/src/oauth/{platform-connection.test.ts → cloud-connection.test.ts} +41 -43
- package/src/oauth/{platform-connection.ts → cloud-connection.ts} +19 -19
- package/src/oauth/connection-resolver.test.ts +59 -61
- package/src/oauth/connection-resolver.ts +22 -22
- package/src/oauth/connection.ts +1 -1
- package/src/oauth/oauth-store.ts +8 -8
- package/src/oauth/provider-serializer.ts +4 -4
- package/src/oauth/revoke.ts +1 -1
- package/src/oauth/seed-providers.ts +32 -32
- package/src/permissions/approval-provenance.ts +1 -1
- package/src/permissions/checker.test.ts +18 -16
- package/src/permissions/checker.ts +3 -3
- package/src/persistence/compaction-log-store-clickhouse.ts +3 -3
- package/src/persistence/embeddings/embedding-backend.test.ts +16 -16
- package/src/persistence/embeddings/embedding-backend.ts +13 -13
- package/src/persistence/embeddings/embedding-gemini.test.ts +9 -12
- package/src/persistence/embeddings/embedding-gemini.ts +11 -11
- package/src/persistence/embeddings/embedding-runtime-manager.ts +2 -2
- package/src/persistence/jobs-store.ts +1 -1
- package/src/persistence/lifecycle-events-store.ts +1 -1
- package/src/persistence/llm-request-log-sink-clickhouse.ts +3 -3
- package/src/persistence/llm-request-log-source-clickhouse.ts +3 -3
- package/src/persistence/migrations/224-oauth-providers-managed-service-is-paid.ts +1 -1
- package/src/persistence/migrations/296-rewrite-balanced-economy-profile-pins.test.ts +1 -1
- package/src/persistence/migrations/296-rewrite-balanced-economy-profile-pins.ts +2 -2
- package/src/persistence/migrations/306-rewrite-frontier-profile-pins.test.ts +1 -1
- package/src/persistence/migrations/306-rewrite-frontier-profile-pins.ts +1 -1
- package/src/persistence/migrations/351-schedule-skill-script-handoff.ts +1 -1
- package/src/persistence/migrations/361-normalize-managed-connection-rows.test.ts +3 -3
- package/src/persistence/migrations/361-normalize-managed-connection-rows.ts +7 -7
- package/src/persistence/migrations/__tests__/319-remove-legacy-managed-connections.test.ts +2 -2
- package/src/persistence/schema/oauth.ts +1 -1
- package/src/plugin-api/index.ts +4 -4
- package/src/plugin-api/model-profiles.test.ts +1 -1
- package/src/plugin-api/model-profiles.ts +1 -1
- package/src/plugin-api/transcription-session.ts +1 -1
- package/src/plugin-api/vision-support.test.ts +1 -1
- package/src/plugin-api/webhook-url.ts +12 -12
- package/src/plugins/__tests__/source-fingerprint.test.ts +1 -1
- package/src/plugins/defaults/{platform-hosted → cloud-hosted}/__tests__/reengage.test.ts +5 -6
- package/src/plugins/defaults/cloud-hosted/package.json +14 -0
- package/src/plugins/defaults/{platform-hosted → cloud-hosted}/routes/reengage.ts +3 -3
- package/src/plugins/defaults/index.ts +6 -6
- package/src/plugins/defaults/main.ts +5 -5
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +5 -5
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-prompt.test.ts +1 -1
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-provider-path.test.ts +1 -1
- package/src/plugins/defaults/memory/config.ts +4 -4
- package/src/plugins/defaults/memory/memory-retrospective-constants.ts +2 -2
- package/src/plugins/defaults/memory/memory-retrospective-job.ts +7 -7
- package/src/plugins/defaults/memory/memory-retrospective-prompt.ts +5 -5
- package/src/plugins/defaults/memory/memory-retrospective-skill-card.ts +2 -2
- package/src/plugins/defaults/memory/src/__tests__/memory-v2-routes.test.ts +1 -1
- package/src/plugins/defaults/memory/src/__tests__/memory-worker-routes.test.ts +1 -1
- package/src/plugins/defaults/memory/substrate/__tests__/boot-maintenance.test.ts +20 -20
- package/src/plugins/defaults/memory/substrate/__tests__/cli-command-store.test.ts +1 -1
- package/src/plugins/defaults/memory/substrate/__tests__/skill-store.test.ts +3 -3
- package/src/plugins/defaults/memory/substrate/boot-maintenance.ts +17 -17
- package/src/plugins/defaults/memory/substrate/cli-command-store.ts +2 -2
- package/src/plugins/defaults/memory/substrate/prompts/consolidation.ts +1 -1
- package/src/plugins/defaults/memory/substrate/skill-store.ts +4 -4
- package/src/plugins/defaults/memory/v3/__tests__/maintain-job.test.ts +3 -3
- package/src/plugins/defaults/memory/v3/__tests__/pool-select.test.ts +2 -2
- package/src/plugins/defaults/memory/v3/maintain-job.ts +10 -10
- package/src/plugins/defaults/memory/v3/orchestrate.ts +3 -3
- package/src/plugins/defaults/memory/worker.ts +5 -5
- package/src/plugins/defaults/workspace/injectors.ts +2 -2
- package/src/plugins/mtime-cache.ts +1 -1
- package/src/plugins/source-versions.ts +1 -1
- package/src/plugins/types.ts +1 -1
- package/src/prompts/__tests__/system-prompt.test.ts +1 -1
- package/src/prompts/normalize-onboarding.ts +1 -1
- package/src/prompts/persona-resolver.ts +1 -1
- package/src/prompts/templates/system-sections.ts +3 -3
- package/src/providers/__tests__/cadet-connection-routing.test.ts +7 -7
- package/src/providers/__tests__/cadet-mismatch-routing.test.ts +12 -12
- package/src/providers/__tests__/connection-model-compat.test.ts +2 -2
- package/src/providers/__tests__/dispatch-connection-routing.test.ts +10 -10
- package/src/providers/__tests__/inference.test.ts +2 -2
- package/src/providers/__tests__/preflight-resolved-config.test.ts +16 -16
- package/src/providers/__tests__/retry-callsite.test.ts +1 -1
- package/src/providers/__tests__/satellite-connection-routing.test.ts +4 -4
- package/src/providers/__tests__/search-provider-catalog.test.ts +2 -2
- package/src/providers/__tests__/voice-error-copy.test.ts +3 -3
- package/src/providers/anthropic/client.ts +1 -1
- package/src/providers/cadet/client.ts +1 -1
- package/src/providers/cadet-model-routing.test.ts +19 -19
- package/src/providers/cadet-model-routing.ts +23 -23
- package/src/providers/call-site-routing.ts +10 -10
- package/src/providers/{platform-proxy → cloud-proxy}/constants.ts +11 -11
- package/src/providers/{platform-proxy → cloud-proxy}/context.ts +26 -26
- package/src/providers/connection-resolution.ts +43 -43
- package/src/providers/fallback-breaker.ts +2 -2
- package/src/providers/fetch-provider-catalog.ts +3 -3
- package/src/providers/gemini/client.ts +5 -5
- package/src/providers/inference/__tests__/adapter-factory-openai-compatible.test.ts +3 -3
- package/src/providers/inference/__tests__/base-url-route-validation.test.ts +8 -8
- package/src/providers/inference/__tests__/base-url-security.test.ts +4 -4
- package/src/providers/inference/adapter-factory.ts +35 -35
- package/src/providers/inference/auth.ts +10 -10
- package/src/providers/inference/backfill.ts +11 -11
- package/src/providers/inference/connection-availability.ts +24 -24
- package/src/providers/inference/connections.ts +18 -20
- package/src/providers/inference/profile-probe.ts +4 -4
- package/src/providers/inference/resolve-auth.ts +8 -8
- package/src/providers/jev/ask.test.ts +1 -1
- package/src/providers/jev/ask.ts +2 -2
- package/src/providers/model-catalog.ts +8 -9
- package/src/providers/openai/__tests__/api-error-normalization.test.ts +3 -3
- package/src/providers/openai/api-error-normalization.ts +2 -2
- package/src/providers/provider-availability.ts +4 -4
- package/src/providers/provider-env-vars.ts +1 -1
- package/src/providers/provider-secret-catalog.ts +1 -1
- package/src/providers/registry.ts +20 -20
- package/src/providers/retry.ts +26 -26
- package/src/providers/routing-identity.ts +10 -10
- package/src/providers/search-provider-catalog.ts +2 -2
- package/src/providers/speech-to-text/__tests__/{cadet-managed-realtime.test.ts → cadet-cloud-realtime.test.ts} +3 -3
- package/src/providers/speech-to-text/__tests__/{cadet-managed.test.ts → cadet-cloud.test.ts} +35 -35
- package/src/providers/speech-to-text/__tests__/deepgram-flux-realtime.test.ts +1 -1
- package/src/providers/speech-to-text/__tests__/resolve.test.ts +27 -27
- package/src/providers/speech-to-text/{cadet-managed-flux-realtime.ts → cadet-cloud-flux-realtime.ts} +6 -8
- package/src/providers/speech-to-text/{cadet-managed-realtime.ts → cadet-cloud-realtime.ts} +3 -3
- package/src/providers/speech-to-text/{cadet-managed.ts → cadet-cloud.ts} +18 -20
- package/src/providers/speech-to-text/cadet-speech-relay-connection.ts +7 -7
- package/src/providers/speech-to-text/deepgram-flux-frames.ts +3 -3
- package/src/providers/speech-to-text/deepgram-flux-realtime.ts +4 -4
- package/src/providers/speech-to-text/provider-catalog.ts +3 -3
- package/src/providers/speech-to-text/resolve.ts +26 -28
- package/src/providers/together/client.ts +1 -1
- package/src/providers/types.ts +4 -4
- package/src/providers/voice-error-copy.ts +1 -1
- package/src/runtime/__tests__/desktop-stream-upgrade.test.ts +10 -10
- package/src/runtime/agent-wake.ts +1 -1
- package/src/runtime/auth/__tests__/middleware.test.ts +1 -1
- package/src/runtime/auth/middleware.ts +1 -1
- package/src/runtime/auth/scopes.ts +1 -1
- package/src/runtime/capabilities.ts +1 -1
- package/src/runtime/channel-invite-transports/discord.ts +1 -1
- package/src/runtime/channel-invite-transports/email.ts +2 -2
- package/src/runtime/channel-readiness-service.ts +15 -13
- package/src/runtime/channel-reply-session.test.ts +1 -1
- package/src/runtime/channel-reply-session.ts +1 -1
- package/src/runtime/http-server.ts +4 -4
- package/src/runtime/introduction-policy.ts +4 -4
- package/src/runtime/migrations/__tests__/origin-mode.test.ts +14 -14
- package/src/runtime/migrations/__tests__/v1-test-helpers.ts +1 -1
- package/src/runtime/migrations/__tests__/vbundle-import-version-compat.test.ts +2 -2
- package/src/runtime/migrations/__tests__/vbundle-metadata-merge-integration.test.ts +3 -4
- package/src/runtime/migrations/__tests__/vbundle-metadata-merge.test.ts +6 -7
- package/src/runtime/migrations/__tests__/vbundle-validator-v1-schema.test.ts +1 -1
- package/src/runtime/migrations/migration-transport.ts +3 -3
- package/src/runtime/migrations/origin-mode.ts +6 -9
- package/src/runtime/migrations/vbundle-import-policy.ts +2 -2
- package/src/runtime/migrations/vbundle-importer.ts +4 -4
- package/src/runtime/migrations/vbundle-streaming-importer.ts +6 -6
- package/src/runtime/migrations/vbundle-validator.ts +1 -1
- package/src/runtime/routes/__tests__/{platform-credits-routes.test.ts → cloud-credits-routes.test.ts} +9 -9
- package/src/runtime/routes/__tests__/{platform-invoice-routes.test.ts → cloud-invoice-routes.test.ts} +13 -13
- package/src/runtime/routes/__tests__/connection-routes-vs-cli-parity.test.ts +1 -1
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +26 -25
- package/src/runtime/routes/__tests__/default-plugin-routes.test.ts +5 -5
- package/src/runtime/routes/__tests__/default-provider-routes.test.ts +10 -10
- package/src/runtime/routes/__tests__/inference-profiles-routes.test.ts +18 -18
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +18 -16
- package/src/runtime/routes/__tests__/inference-send-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/ingress-status-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/migration-cadet-metadata-reconcile.test.ts +5 -20
- package/src/runtime/routes/__tests__/migration-import-credential-filter.test.ts +19 -22
- package/src/runtime/routes/__tests__/oauth-proxy-routes.test.ts +27 -27
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +5 -5
- package/src/runtime/routes/__tests__/ps-routes.test.ts +5 -3
- package/src/runtime/routes/__tests__/roadmap-routes.test.ts +15 -15
- package/src/runtime/routes/__tests__/webhook-routes.test.ts +31 -31
- package/src/runtime/routes/app-management-routes.ts +1 -1
- package/src/runtime/routes/attachment-routes.ts +1 -1
- package/src/runtime/routes/auth-routes.ts +14 -14
- package/src/runtime/routes/avatar-routes.ts +0 -14
- package/src/runtime/routes/background-wake-routes.ts +4 -4
- package/src/runtime/routes/channel-availability-routes.ts +4 -4
- package/src/runtime/routes/client-routes.ts +5 -5
- package/src/runtime/routes/cloud-credentials.ts +45 -0
- package/src/runtime/routes/{platform-routes.ts → cloud-routes.ts} +83 -116
- package/src/runtime/routes/conversation-compaction-routes.ts +1 -1
- package/src/runtime/routes/conversation-query-routes.ts +82 -282
- package/src/runtime/routes/credential-routes.ts +28 -30
- package/src/runtime/routes/default-provider-routes.ts +1 -1
- package/src/runtime/routes/desktop-setup-routes.test.ts +5 -5
- package/src/runtime/routes/desktop-setup-routes.ts +1 -1
- package/src/runtime/routes/domain-routes.ts +15 -21
- package/src/runtime/routes/email-routes.ts +13 -13
- package/src/runtime/routes/errors.ts +1 -1
- package/src/runtime/routes/gateway-status-routes.ts +1 -1
- package/src/runtime/routes/identity-routes.ts +3 -3
- package/src/runtime/routes/inbound-message-handler.ts +1 -1
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +1 -1
- package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +1 -1
- package/src/runtime/routes/index.ts +1 -1
- package/src/runtime/routes/inference-profile-availability-guard.ts +5 -5
- package/src/runtime/routes/inference-profiles-routes.ts +11 -11
- package/src/runtime/routes/inference-provider-connection-routes.ts +24 -24
- package/src/runtime/routes/ingress-status-routes.ts +1 -1
- package/src/runtime/routes/integrations/a2a.ts +2 -2
- package/src/runtime/routes/integrations/twilio.ts +21 -35
- package/src/runtime/routes/internal-telemetry-routes.ts +2 -2
- package/src/runtime/routes/live-voice-routes.test.ts +4 -4
- package/src/runtime/routes/live-voice-routes.ts +6 -6
- package/src/runtime/routes/migration-routes.ts +34 -40
- package/src/runtime/routes/oauth-commands-routes.ts +31 -31
- package/src/runtime/routes/oauth-providers.ts +5 -5
- package/src/runtime/routes/oauth-proxy-passthrough.test.ts +1 -1
- package/src/runtime/routes/oauth-proxy-passthrough.ts +8 -8
- package/src/runtime/routes/oauth-proxy-routes.ts +15 -17
- package/src/runtime/routes/oauth-request-hints.test.ts +1 -1
- package/src/runtime/routes/oauth-request-hints.ts +1 -1
- package/src/runtime/routes/plugins-routes.ts +9 -9
- package/src/runtime/routes/profiler-routes.ts +1 -1
- package/src/runtime/routes/ps-routes.ts +4 -0
- package/src/runtime/routes/roadmap-routes.ts +18 -20
- package/src/runtime/routes/secret-routes.ts +29 -55
- package/src/runtime/routes/settings-routes.ts +18 -23
- package/src/runtime/routes/telemetry-routes.ts +4 -4
- package/src/runtime/routes/tts-routes.ts +4 -4
- package/src/runtime/routes/user-route-resolution.ts +1 -1
- package/src/runtime/routes/webhook-routes.ts +18 -18
- package/src/runtime/routes/workflow-routes.ts +5 -5
- package/src/runtime/sync/resource-sync-events.ts +2 -2
- package/src/runtime/verification-outbound-actions.ts +4 -4
- package/src/schedule/integration-status.ts +6 -6
- package/src/schedule/run-script.ts +1 -1
- package/src/schedule/schedule-timezone.ts +1 -1
- package/src/schedule/worker.ts +5 -5
- package/src/security/auth-fallback-events-store.ts +1 -1
- package/src/security/oauth2.ts +4 -4
- package/src/skills/available-skills.ts +4 -4
- package/src/skills/catalog-files.ts +8 -8
- package/src/skills/catalog-install.ts +12 -12
- package/src/skills/categories-cache.ts +3 -3
- package/src/skills/clawhub.ts +1 -1
- package/src/skills/{platform-compatibility.test.ts → cloud-compatibility.test.ts} +7 -7
- package/src/skills/{platform-compatibility.ts → cloud-compatibility.ts} +2 -4
- package/src/skills/{managed-store.ts → cloud-store.ts} +21 -23
- package/src/skills/inline-command-runner.ts +1 -1
- package/src/skills/install-meta.ts +1 -1
- package/src/skills/path-classifier.ts +4 -4
- package/src/skills/skill-history.ts +4 -4
- package/src/skills/skillssh-registry.ts +1 -1
- package/src/stt/__tests__/daemon-batch-transcriber.test.ts +1 -1
- package/src/stt/daemon-batch-transcriber.ts +7 -7
- package/src/stt/types.ts +3 -3
- package/src/subagent/manager.ts +15 -15
- package/src/subagent/types.ts +1 -1
- package/src/telegram/__tests__/webhook-health.test.ts +16 -16
- package/src/telegram/webhook-health.ts +10 -10
- package/src/telemetry/__tests__/config-setting-events-store.test.ts +1 -1
- package/src/telemetry/__tests__/outbox-test-harness.ts +2 -2
- package/src/telemetry/config-setting-events-store.ts +1 -1
- package/src/telemetry/config-setting-snapshot.ts +1 -1
- package/src/telemetry/memory-corpus-size.ts +1 -1
- package/src/telemetry/memory-tier-reporter.test.ts +2 -2
- package/src/telemetry/memory-tier-reporter.ts +3 -3
- package/src/telemetry/telemetry-event-sources.test.ts +2 -2
- package/src/telemetry/telemetry-event-sources.ts +9 -9
- package/src/telemetry/telemetry-events-outbox.ts +2 -2
- package/src/telemetry/telemetry-wire-validation.test.ts +1 -1
- package/src/telemetry/telemetry-wire-validation.ts +3 -3
- package/src/telemetry/telemetry-wire.generated.ts +1 -1
- package/src/telemetry/tool-audit.ts +1 -1
- package/src/telemetry/tool-executed-events-store.test.ts +1 -1
- package/src/telemetry/trace-collection-policy.ts +4 -4
- package/src/telemetry/turn-events-store.ts +1 -1
- package/src/telemetry/turn-outcome.ts +1 -1
- package/src/telemetry/turn-trace-store.ts +2 -2
- package/src/telemetry/types.test.ts +1 -1
- package/src/telemetry/types.ts +19 -19
- package/src/telemetry/usage-telemetry-reporter.test.ts +42 -42
- package/src/telemetry/usage-telemetry-reporter.ts +17 -17
- package/src/telemetry/watchdog-direct-emit.test.ts +9 -9
- package/src/telemetry/watchdog-direct-emit.ts +10 -10
- package/src/tools/__tests__/side-effect-abort-guard.test.ts +2 -2
- package/src/tools/browser/cdp-client/factory.ts +1 -1
- package/src/tools/computer-use/target.ts +2 -2
- package/src/tools/credentials/store.ts +6 -15
- package/src/tools/network/__tests__/{managed-search-proxy.test.ts → cloud-search-proxy.test.ts} +20 -20
- package/src/tools/network/__tests__/web-search.test.ts +14 -14
- package/src/tools/network/{managed-search-proxy.ts → cloud-search-proxy.ts} +13 -13
- package/src/tools/network/web-search.ts +9 -9
- package/src/tools/permission-checker.ts +2 -2
- package/src/tools/shared/input-misuse.ts +1 -1
- package/src/tools/shared/input-repairs.ts +4 -4
- package/src/tools/skills/{delete-managed.ts → delete-cloud.ts} +4 -4
- package/src/tools/skills/find-similar-skills.test.ts +7 -7
- package/src/tools/skills/find-similar-skills.ts +15 -15
- package/src/tools/skills/load.ts +6 -6
- package/src/tools/skills/{scaffold-managed.ts → scaffold-cloud.ts} +16 -16
- package/src/tools/skills/skill-script-runner.ts +2 -2
- package/src/tools/terminal/safe-env.ts +3 -3
- package/src/tools/tool-types.ts +2 -2
- package/src/tools/types.ts +2 -2
- package/src/tools/ui-surface/surface-shape-docs.ts +2 -2
- package/src/tools/workflows/manage-workflows.ts +1 -1
- package/src/tools/workspace-tools/loader.ts +1 -1
- package/src/tts/__tests__/cadet-provider.test.ts +5 -5
- package/src/tts/provider-catalog.ts +1 -1
- package/src/tts/providers/cadet-provider.ts +23 -23
- package/src/tts/providers/cadet-tts-socket.ts +2 -2
- package/src/tts/tts-config-resolver.ts +1 -1
- package/src/tts/tts-voice-field.ts +3 -3
- package/src/usage/subagent-attribution.ts +1 -1
- package/src/util/__tests__/process-table.test.ts +47 -0
- package/src/util/canonicalize-identity.ts +1 -1
- package/src/util/cgroup-cpu.ts +5 -5
- package/src/util/cgroup-memory.ts +2 -2
- package/src/util/container-cpu-sampler.ts +4 -4
- package/src/util/disk-usage.ts +4 -4
- package/src/util/errors.ts +3 -3
- package/src/util/oom-priority.ts +1 -1
- package/src/util/platform.ts +5 -5
- package/src/util/process-table.ts +39 -5
- package/src/util/provider-error-patterns.ts +2 -2
- package/src/watch/__tests__/watch-retro.test.ts +2 -2
- package/src/watch/watch-retro.ts +1 -1
- package/src/watcher/__tests__/telemetry.test.ts +2 -2
- package/src/watcher/telemetry.ts +1 -1
- package/src/windows-compiled-cli.ts +1 -1
- package/src/workspace/adaptive-thinking-repair.ts +4 -4
- package/src/workspace/byok-default-profile-ensure.ts +7 -7
- package/src/workspace/git-service.ts +2 -2
- package/src/workspace/migrations/006-services-config.ts +1 -1
- package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +1 -1
- package/src/workspace/migrations/052-seed-default-inference-profiles.ts +1 -1
- package/src/workspace/migrations/063-release-notes-dynamic-model-context.ts +1 -1
- package/src/workspace/migrations/066-seed-heartbeat-callsite-cost-default.ts +1 -1
- package/src/workspace/migrations/082-backfill-managed-profile-labels.ts +4 -4
- package/src/workspace/migrations/087-memory-router-balanced-profile.ts +3 -3
- package/src/workspace/migrations/090-memory-router-cost-optimized-profile.ts +4 -4
- package/src/workspace/migrations/097-enable-adaptive-thinking-managed-profiles.ts +5 -5
- package/src/workspace/migrations/100-upgrade-quality-profile-to-fable-5.ts +4 -4
- package/src/workspace/migrations/101-upgrade-balanced-economy-to-minimax-m3.ts +4 -4
- package/src/workspace/migrations/103-upgrade-quality-profile-to-opus-4-8.ts +5 -5
- package/src/workspace/migrations/104-recheck-adaptive-thinking-model-implied-anthropic.ts +1 -1
- package/src/workspace/migrations/106-drop-collect-usage-data.ts +1 -1
- package/src/workspace/migrations/108-drop-balanced-economy-profile.ts +4 -4
- package/src/workspace/migrations/109-swap-quality-profile-to-glm-5p2.ts +11 -11
- package/src/workspace/migrations/110-flip-balanced-profile-to-together.ts +6 -6
- package/src/workspace/migrations/113-swap-balanced-profile-to-glm-5p2.ts +5 -5
- package/src/workspace/migrations/114-swap-quality-profile-to-opus.ts +4 -4
- package/src/workspace/migrations/115-drop-frontier-profile.ts +5 -5
- package/src/workspace/migrations/123-swap-quality-profile-to-fable.ts +5 -5
- package/src/workspace/migrations/125-repoint-managed-connections-to-cadet.ts +3 -3
- package/src/workspace/migrations/126-strip-managed-profile-bodies.ts +2 -2
- package/src/workspace/migrations/127-backfill-default-provider.ts +4 -4
- package/src/workspace/migrations/130-speech-mode-to-provider.ts +4 -4
- package/src/workspace/migrations/131-drop-web-fetch-mode.ts +1 -1
- package/src/workspace/migrations/132-web-search-mode-to-provider.ts +6 -6
- package/src/workspace/migrations/133-collapse-provider-connections.ts +3 -3
- package/src/workspace/migrations/134-image-generation-mode-to-provider.ts +4 -4
- package/src/workspace/migrations/136-repair-stale-fireworks-kimi-model-id.ts +2 -2
- package/src/workspace/migrations/137-repair-retired-fireworks-minimax-model-id.ts +2 -2
- package/src/workspace/migrations/139-clear-renamed-cost-profile-label.ts +2 -2
- package/src/workspace/migrations/141-stt-english-default-to-multilingual.ts +4 -4
- package/src/workspace/migrations/144-convert-stranded-subscription-openai-profiles.ts +1 -1
- package/src/workspace/migrations/145-collapse-profile-bindings-to-entries.ts +2 -2
- package/src/workspace/migrations/146-repair-retired-fireworks-deepseek-flash-model-id.ts +2 -2
- package/src/workspace/migrations/148-strip-unsupported-fallback-profiles.ts +2 -2
- package/src/workspace/migrations/150-stt-flux-provider-to-model-family.ts +1 -1
- package/src/workspace/migrations/151-repair-renamed-fireworks-deepseek-pro-model-id.ts +2 -2
- package/src/workspace/migrations/152-repair-retired-fireworks-minimax-m2p7-model-id.ts +2 -2
- package/src/workspace/migrations/159-rename-colliding-jev-profile-name.ts +2 -2
- package/src/workspace/migrations/160-repair-retired-fireworks-model-ids.ts +2 -2
- package/src/workspace/migrations/161-repair-retired-fireworks-glm-5p2-model-id.ts +2 -2
- package/src/workspace/migrations/__tests__/141-stt-english-default-to-multilingual.test.ts +1 -1
- package/src/workspace/migrations/__tests__/150-stt-flux-provider-to-model-family.test.ts +1 -1
- package/src/workspace/migrations/registry.ts +6 -6
- package/src/workspace/top-level-renderer.ts +1 -1
- package/src/workspace/turn-commit.ts +2 -2
- package/src/__tests__/config-loader-platform-defaults.test.ts +0 -606
- package/src/__tests__/mock-gateway-ipc.ts +0 -260
- package/src/api/events/platform-disconnected.ts +0 -21
- package/src/config/platform-rehydration.ts +0 -60
- package/src/platform/feature-gate.ts +0 -8
- package/src/plugins/defaults/platform-hosted/package.json +0 -14
- package/src/runtime/routes/platform-managed-credentials.ts +0 -50
- /package/src/__tests__/{gateway-client-managed-outbound.test.ts → gateway-client-cloud-outbound.test.ts} +0 -0
- /package/src/__tests__/{secure-keys-managed-failover.test.ts → secure-keys-cloud-failover.test.ts} +0 -0
|
@@ -23,8 +23,8 @@ import { PassThrough, Readable } from "node:stream";
|
|
|
23
23
|
import { GatewayDebugExportIpcResponseSchema } from "@mycadet/gateway-client/gateway-ipc-contracts";
|
|
24
24
|
import { z } from "zod";
|
|
25
25
|
|
|
26
|
+
import { resolveCloudAssistantId } from "../../config/cloud-identity.js";
|
|
26
27
|
import { invalidateConfigCache } from "../../config/loader.js";
|
|
27
|
-
import { resolvePlatformAssistantId } from "../../config/platform-identity.js";
|
|
28
28
|
import { trackDaemonActivity } from "../../daemon/activity-trail.js";
|
|
29
29
|
import { getAssistantName } from "../../daemon/identity-helpers.js";
|
|
30
30
|
import { ipcCallPersistent } from "../../ipc/gateway-client.js";
|
|
@@ -108,7 +108,7 @@ import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
|
|
|
108
108
|
import { RouteResponse } from "./types.js";
|
|
109
109
|
|
|
110
110
|
/**
|
|
111
|
-
* CES account prefix for
|
|
111
|
+
* CES account prefix for cloud-identity (`cadet:*`) credentials. Entries
|
|
112
112
|
* with an account that starts with this string are filtered out of any
|
|
113
113
|
* imported bundle so they don't overwrite the target's own Django-provisioned
|
|
114
114
|
* platform identity (most notably `assistant_api_key`).
|
|
@@ -119,23 +119,17 @@ import { RouteResponse } from "./types.js";
|
|
|
119
119
|
const PLATFORM_CREDENTIAL_PREFIX = credentialKey("cadet", "");
|
|
120
120
|
|
|
121
121
|
/**
|
|
122
|
-
*
|
|
123
|
-
* On a
|
|
124
|
-
* `POST /v1/secrets
|
|
125
|
-
*
|
|
126
|
-
* organization. A signed-in client may additionally (re)assert some of them
|
|
127
|
-
* on teleport / local→managed transfer. Either set of writes can race with
|
|
122
|
+
* Cadet credentials that the cloud runtime expects to see in CES.
|
|
123
|
+
* On a cloud assistant the cloud provisions these after hatch via
|
|
124
|
+
* `POST /v1/secrets`. A signed-in client may additionally (re)assert some of
|
|
125
|
+
* them on teleport / local→managed transfer. Either set of writes can race with
|
|
128
126
|
* the import — the CES write survives (separate volume), but the metadata
|
|
129
127
|
* upsert may be clobbered by the in-place clear / atomic swap. After every
|
|
130
128
|
* import we reconcile metadata.json against CES so any field CES already holds
|
|
131
129
|
* a value for gets a matching metadata entry.
|
|
132
130
|
*/
|
|
133
|
-
const
|
|
134
|
-
"platform_base_url",
|
|
131
|
+
const CADET_CREDENTIAL_FIELDS = [
|
|
135
132
|
"assistant_api_key",
|
|
136
|
-
"platform_assistant_id",
|
|
137
|
-
"platform_organization_id",
|
|
138
|
-
"platform_user_id",
|
|
139
133
|
"webhook_secret",
|
|
140
134
|
] as const;
|
|
141
135
|
|
|
@@ -150,7 +144,7 @@ const CADET_PLATFORM_IDENTITY_FIELDS = [
|
|
|
150
144
|
export async function reconcileCadetMetadataFromCes(warningSink: {
|
|
151
145
|
warnings: string[];
|
|
152
146
|
}): Promise<void> {
|
|
153
|
-
for (const field of
|
|
147
|
+
for (const field of CADET_CREDENTIAL_FIELDS) {
|
|
154
148
|
try {
|
|
155
149
|
const value = await getSecureKeyAsync(credentialKey("cadet", field));
|
|
156
150
|
if (!value) {
|
|
@@ -244,7 +238,7 @@ interface ExportManifestInputs {
|
|
|
244
238
|
* `DAEMON_INTERNAL_ASSISTANT_ID` rather than the empty string.
|
|
245
239
|
*/
|
|
246
240
|
async function resolveAssistantId(): Promise<string> {
|
|
247
|
-
const resolved = await
|
|
241
|
+
const resolved = await resolveCloudAssistantId();
|
|
248
242
|
if (resolved) {
|
|
249
243
|
return resolved;
|
|
250
244
|
}
|
|
@@ -272,9 +266,9 @@ async function resolveAssistantId(): Promise<string> {
|
|
|
272
266
|
*
|
|
273
267
|
* Managed-mode exports never reach this with credentials: both export
|
|
274
268
|
* handlers skip credential collection entirely when `origin.mode` is
|
|
275
|
-
* "managed" (the validator's cross-field refine rejects a
|
|
269
|
+
* "managed" (the validator's cross-field refine rejects a cloud bundle
|
|
276
270
|
* with `secrets_redacted: false`, and teleport clients re-provision
|
|
277
|
-
* platform identity after a
|
|
271
|
+
* platform identity after a cloud→local import).
|
|
278
272
|
*/
|
|
279
273
|
export function computeSecretsRedacted(
|
|
280
274
|
credentialCount: number,
|
|
@@ -383,7 +377,7 @@ export async function handleMigrationExport(
|
|
|
383
377
|
// Managed deployments never ship credentials in bundles — the manifest
|
|
384
378
|
// schema forbids it (`secrets_redacted` must be true when `origin.mode`
|
|
385
379
|
// is "managed"), and teleport clients re-provision platform identity
|
|
386
|
-
// after a
|
|
380
|
+
// after a cloud→local import. Redact instead of emitting a bundle
|
|
387
381
|
// the importer is guaranteed to reject.
|
|
388
382
|
let credentials: Array<{ account: string; value: string }> = [];
|
|
389
383
|
let secretsRedacted = true;
|
|
@@ -642,7 +636,7 @@ export async function handleMigrationExportToGcs({ body }: RouteHandlerArgs) {
|
|
|
642
636
|
// deployments never ship credentials in bundles — the manifest schema
|
|
643
637
|
// forbids it (`secrets_redacted` must be true when `origin.mode` is
|
|
644
638
|
// "managed"), and teleport clients re-provision platform identity after
|
|
645
|
-
// a
|
|
639
|
+
// a cloud→local import — so redact instead of emitting a bundle the
|
|
646
640
|
// importer is guaranteed to reject.
|
|
647
641
|
//
|
|
648
642
|
// A debug bundle goes to Cadet staff, so it never carries credentials
|
|
@@ -729,7 +723,7 @@ export async function handleMigrationExportToGcs({ body }: RouteHandlerArgs) {
|
|
|
729
723
|
method: "PUT",
|
|
730
724
|
body: webBody,
|
|
731
725
|
// `duplex: "half"` is required when sending a streaming body
|
|
732
|
-
// via fetch in Node/Bun — without it the
|
|
726
|
+
// via fetch in Node/Bun — without it the cloud rejects the
|
|
733
727
|
// request as "duplex option is required when body is a
|
|
734
728
|
// ReadableStream".
|
|
735
729
|
duplex: "half",
|
|
@@ -1143,7 +1137,7 @@ function wasFetchBodyTornDown(stream: PassThrough): boolean {
|
|
|
1143
1137
|
* assistant is willing to PUT a bundle (SSRF). Widening the export path is
|
|
1144
1138
|
* its own explicit operator opt-in via the separate
|
|
1145
1139
|
* `CADET_MIGRATION_EXPORT_ALLOWED_HOSTS` env var (local/minikube only,
|
|
1146
|
-
* where the
|
|
1140
|
+
* where the cloud serves plain-http SigV4 URLs from SeaweedFS) — see
|
|
1147
1141
|
* `exportValidatorOptions`.
|
|
1148
1142
|
*/
|
|
1149
1143
|
let urlValidatorOptions: ValidateGcsSignedUrlOptions | undefined;
|
|
@@ -1174,7 +1168,7 @@ export function parseMigrationImportAllowedHostsEnv(
|
|
|
1174
1168
|
*
|
|
1175
1169
|
* Precedence: an explicit test override (when set) wins; otherwise the
|
|
1176
1170
|
* env-derived import allowlist from `CADET_MIGRATION_IMPORT_ALLOWED_HOSTS`.
|
|
1177
|
-
* The
|
|
1171
|
+
* The cloud injects that env var only where the bundle is served over
|
|
1178
1172
|
* plain http from a non-GCS host — e.g. local/minikube, where the signed
|
|
1179
1173
|
* bundle URL points at `http://host.docker.internal/...`. Supplying a
|
|
1180
1174
|
* non-default allowlist intentionally relaxes the validator's scheme check
|
|
@@ -1211,7 +1205,7 @@ function importValidatorOptions(): ValidateGcsSignedUrlOptions | undefined {
|
|
|
1211
1205
|
* Deliberately a separate env var from the import allowlist: the export
|
|
1212
1206
|
* path controls where the assistant will PUT a full workspace bundle, so
|
|
1213
1207
|
* widening it must be its own operator decision, never a side effect of
|
|
1214
|
-
* relaxing imports. The
|
|
1208
|
+
* relaxing imports. The cloud injects it only where the signed upload
|
|
1215
1209
|
* URL is served over plain http from a non-GCS host (local/minikube
|
|
1216
1210
|
* SeaweedFS); it is unset in staging/prod, keeping the strict GCS-only
|
|
1217
1211
|
* default there.
|
|
@@ -1265,7 +1259,7 @@ interface GcsImportErrorInit {
|
|
|
1265
1259
|
reason?: string;
|
|
1266
1260
|
errors?: Array<{ code: string; message: string; path?: string }>;
|
|
1267
1261
|
partial_report?: ImportCommitReport;
|
|
1268
|
-
/** Populated for `version_incompatible` — mirrors the
|
|
1262
|
+
/** Populated for `version_incompatible` — mirrors the cloud's PR #5470
|
|
1269
1263
|
* response shape so the URL-body endpoint can return the same body. */
|
|
1270
1264
|
bundle_compat?: RuntimeCompatibility;
|
|
1271
1265
|
/** Populated for `version_incompatible`. */
|
|
@@ -1607,7 +1601,7 @@ async function runGcsImport(
|
|
|
1607
1601
|
}
|
|
1608
1602
|
if (result.reason === "version_incompatible") {
|
|
1609
1603
|
// Returned by commitImport / streamCommitImport when the runtime falls
|
|
1610
|
-
// outside the bundle's compat range. The
|
|
1604
|
+
// outside the bundle's compat range. The cloud-side gate is the
|
|
1611
1605
|
// primary check; this catches legacy bundles whose ExportJob row
|
|
1612
1606
|
// predates PR #5470 (compat columns NULL → platform gate skipped).
|
|
1613
1607
|
throw new GcsImportError({
|
|
@@ -1890,7 +1884,7 @@ function throwGcsImportError(err: unknown): never {
|
|
|
1890
1884
|
}
|
|
1891
1885
|
if (err.code === "version_incompatible") {
|
|
1892
1886
|
// 422 (not 500) — the bundle is structurally valid but cannot be
|
|
1893
|
-
// imported on this runtime. Body mirrors the
|
|
1887
|
+
// imported on this runtime. Body mirrors the cloud's PR #5470
|
|
1894
1888
|
// response shape.
|
|
1895
1889
|
throw new UnprocessableEntityError(err.message, {
|
|
1896
1890
|
reason: "version_incompatible" as const,
|
|
@@ -2094,7 +2088,7 @@ interface CredentialImportSummary {
|
|
|
2094
2088
|
succeeded: number;
|
|
2095
2089
|
failed: number;
|
|
2096
2090
|
failedAccounts: string[];
|
|
2097
|
-
|
|
2091
|
+
skippedCloud: number;
|
|
2098
2092
|
}
|
|
2099
2093
|
|
|
2100
2094
|
/**
|
|
@@ -2108,7 +2102,7 @@ interface CredentialWarningSink {
|
|
|
2108
2102
|
}
|
|
2109
2103
|
|
|
2110
2104
|
/**
|
|
2111
|
-
* Filter
|
|
2105
|
+
* Filter cloud-identity (cadet:*) credentials out of the bundle, push
|
|
2112
2106
|
* user credentials into CES via `bulkSetSecureKeysAsync`, and return a
|
|
2113
2107
|
* structured summary. Never throws — CES failures become report warnings.
|
|
2114
2108
|
*/
|
|
@@ -2116,18 +2110,18 @@ async function importBundleCredentialsIntoCes(
|
|
|
2116
2110
|
bundleCredentials: Array<{ account: string; value: string }>,
|
|
2117
2111
|
warningSink: CredentialWarningSink,
|
|
2118
2112
|
): Promise<CredentialImportSummary | undefined> {
|
|
2119
|
-
// Filter out
|
|
2113
|
+
// Filter out cloud-identity credentials (cadet:*) — these are
|
|
2120
2114
|
// environment-specific and must not overwrite the target's own identity.
|
|
2121
2115
|
const userCredentials = bundleCredentials.filter(
|
|
2122
2116
|
(c) => !c.account.startsWith(PLATFORM_CREDENTIAL_PREFIX),
|
|
2123
2117
|
);
|
|
2124
|
-
const
|
|
2125
|
-
if (
|
|
2126
|
-
log.info(`Skipped ${
|
|
2118
|
+
const skippedCloud = bundleCredentials.length - userCredentials.length;
|
|
2119
|
+
if (skippedCloud > 0) {
|
|
2120
|
+
log.info(`Skipped ${skippedCloud} cloud credential(s) from import`);
|
|
2127
2121
|
}
|
|
2128
2122
|
|
|
2129
2123
|
if (userCredentials.length === 0) {
|
|
2130
|
-
if (
|
|
2124
|
+
if (skippedCloud > 0) {
|
|
2131
2125
|
// All credentials in the bundle were cloud credentials — report
|
|
2132
2126
|
// the skip count even though nothing was sent to CES.
|
|
2133
2127
|
return {
|
|
@@ -2135,7 +2129,7 @@ async function importBundleCredentialsIntoCes(
|
|
|
2135
2129
|
succeeded: 0,
|
|
2136
2130
|
failed: 0,
|
|
2137
2131
|
failedAccounts: [],
|
|
2138
|
-
|
|
2132
|
+
skippedCloud,
|
|
2139
2133
|
};
|
|
2140
2134
|
}
|
|
2141
2135
|
return undefined;
|
|
@@ -2165,7 +2159,7 @@ async function importBundleCredentialsIntoCes(
|
|
|
2165
2159
|
succeeded,
|
|
2166
2160
|
failed: failedResults.length,
|
|
2167
2161
|
failedAccounts: failedResults.map((f) => f.account),
|
|
2168
|
-
|
|
2162
|
+
skippedCloud,
|
|
2169
2163
|
};
|
|
2170
2164
|
} catch (err) {
|
|
2171
2165
|
log.warn({ err }, "Credential import failed entirely");
|
|
@@ -2177,7 +2171,7 @@ async function importBundleCredentialsIntoCes(
|
|
|
2177
2171
|
succeeded: 0,
|
|
2178
2172
|
failed: userCredentials.length,
|
|
2179
2173
|
failedAccounts: userCredentials.map((c) => c.account),
|
|
2180
|
-
|
|
2174
|
+
skippedCloud,
|
|
2181
2175
|
};
|
|
2182
2176
|
}
|
|
2183
2177
|
}
|
|
@@ -2248,13 +2242,13 @@ function throwImportCommitFailure(
|
|
|
2248
2242
|
|
|
2249
2243
|
if (result.reason === "version_incompatible") {
|
|
2250
2244
|
// Returned by commitImport / streamCommitImport when the runtime falls
|
|
2251
|
-
// outside the bundle's compat range. The
|
|
2245
|
+
// outside the bundle's compat range. The cloud-side gate is the
|
|
2252
2246
|
// primary check; this catches legacy bundles whose ExportJob row
|
|
2253
2247
|
// predates PR #5470 (compat columns NULL → platform gate skipped).
|
|
2254
2248
|
//
|
|
2255
2249
|
// 422 (not 500) — the bundle is structurally valid but cannot be
|
|
2256
2250
|
// imported on this runtime; the caller can act on it (upgrade the
|
|
2257
|
-
// runtime, choose a different bundle). Body mirrors the
|
|
2251
|
+
// runtime, choose a different bundle). Body mirrors the cloud's
|
|
2258
2252
|
// PR #5470 response shape.
|
|
2259
2253
|
throw new UnprocessableEntityError(
|
|
2260
2254
|
formatRuntimeCompatibilityMessage(
|
|
@@ -2286,7 +2280,7 @@ function throwImportCommitFailure(
|
|
|
2286
2280
|
*
|
|
2287
2281
|
* - `{ job_id, type, status: "processing" }`
|
|
2288
2282
|
* Covers both the internal `pending` and `running` states — collapsed
|
|
2289
|
-
* into a single wire value to match the
|
|
2283
|
+
* into a single wire value to match the cloud's transport shape used
|
|
2290
2284
|
* by `ExportStatusProcessingSerializer` / `ImportStatusProcessingSerializer`.
|
|
2291
2285
|
* - `{ job_id, type, status: "complete", result }`
|
|
2292
2286
|
* - `{ job_id, type, status: "failed", error, error_code, upstream_status? }`
|
|
@@ -2330,7 +2324,7 @@ export async function handleMigrationJobStatus({
|
|
|
2330
2324
|
return result;
|
|
2331
2325
|
}
|
|
2332
2326
|
|
|
2333
|
-
// pending or running — collapse to the
|
|
2327
|
+
// pending or running — collapse to the cloud's "processing" wire value.
|
|
2334
2328
|
return {
|
|
2335
2329
|
job_id: job.id,
|
|
2336
2330
|
type: job.type,
|
|
@@ -9,6 +9,7 @@ import { readFileSync } from "node:fs";
|
|
|
9
9
|
|
|
10
10
|
import { channelForBotProvider } from "@mycadet/service-contracts/channels";
|
|
11
11
|
|
|
12
|
+
import { CadetCloudClient } from "../../cloud/client.js";
|
|
12
13
|
import {
|
|
13
14
|
getConfig,
|
|
14
15
|
loadRawConfig,
|
|
@@ -46,7 +47,6 @@ import {
|
|
|
46
47
|
type OAuthProviderRow,
|
|
47
48
|
} from "../../oauth/oauth-store.js";
|
|
48
49
|
import { missingScopesForStoredToken } from "../../oauth/scope-utils.js";
|
|
49
|
-
import { CadetPlatformClient } from "../../platform/client.js";
|
|
50
50
|
import { withValidToken } from "../../security/token-manager.js";
|
|
51
51
|
import { matchHostPattern } from "../../tools/credentials/host-pattern-match.js";
|
|
52
52
|
import { parseJsonSafe } from "../../util/json.js";
|
|
@@ -77,14 +77,14 @@ interface PlatformConnectionEntry {
|
|
|
77
77
|
|
|
78
78
|
function getManagedServiceConfigKey(provider: string): string | null {
|
|
79
79
|
const providerRow = getProvider(provider);
|
|
80
|
-
const managedKey = providerRow?.
|
|
80
|
+
const managedKey = providerRow?.cloudServiceConfigKey;
|
|
81
81
|
if (!managedKey || !(managedKey in ServicesSchema.shape)) {
|
|
82
82
|
return null;
|
|
83
83
|
}
|
|
84
84
|
return managedKey;
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
-
function
|
|
87
|
+
function isCloudMode(provider: string): boolean {
|
|
88
88
|
const managedKey = getManagedServiceConfigKey(provider);
|
|
89
89
|
if (!managedKey) {
|
|
90
90
|
return false;
|
|
@@ -97,30 +97,30 @@ function isManagedMode(provider: string): boolean {
|
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
99
|
|
|
100
|
-
async function
|
|
101
|
-
const client = await
|
|
100
|
+
async function requireCloudClient(): Promise<CadetCloudClient> {
|
|
101
|
+
const client = await CadetCloudClient.create();
|
|
102
102
|
if (!client) {
|
|
103
103
|
throw new BadRequestError(
|
|
104
104
|
"Not connected to Cadet Cloud. Run `cadet cloud connect` to connect first.",
|
|
105
105
|
);
|
|
106
106
|
}
|
|
107
|
-
if (!client.
|
|
107
|
+
if (!client.cloudAssistantId) {
|
|
108
108
|
throw new BadRequestError(
|
|
109
|
-
"Connected to Cadet Cloud but no assistant ID is configured. Ensure the assistant is registered on the
|
|
109
|
+
"Connected to Cadet Cloud but no assistant ID is configured. Ensure the assistant is registered on the cloud.",
|
|
110
110
|
);
|
|
111
111
|
}
|
|
112
112
|
return client;
|
|
113
113
|
}
|
|
114
114
|
|
|
115
115
|
async function fetchActiveConnections(
|
|
116
|
-
client:
|
|
116
|
+
client: CadetCloudClient,
|
|
117
117
|
provider: string,
|
|
118
118
|
): Promise<PlatformConnectionEntry[]> {
|
|
119
119
|
const params = new URLSearchParams();
|
|
120
120
|
params.set("provider", provider);
|
|
121
121
|
params.set("status", "ACTIVE");
|
|
122
122
|
|
|
123
|
-
const path = `/v1/assistants/${encodeURIComponent(client.
|
|
123
|
+
const path = `/v1/assistants/${encodeURIComponent(client.cloudAssistantId)}/oauth/connections/?${params.toString()}`;
|
|
124
124
|
const response = await client.fetch(path);
|
|
125
125
|
|
|
126
126
|
if (!response.ok) {
|
|
@@ -141,12 +141,12 @@ async function fetchActiveConnections(
|
|
|
141
141
|
|
|
142
142
|
/**
|
|
143
143
|
* Best-effort helper to count active cloud connections for a provider.
|
|
144
|
-
* Returns 0 if the
|
|
144
|
+
* Returns 0 if the cloud client cannot be created or the fetch fails.
|
|
145
145
|
*/
|
|
146
146
|
async function countManagedConnections(provider: string): Promise<number> {
|
|
147
147
|
try {
|
|
148
|
-
const client = await
|
|
149
|
-
if (!client || !client.
|
|
148
|
+
const client = await CadetCloudClient.create();
|
|
149
|
+
if (!client || !client.cloudAssistantId) {
|
|
150
150
|
return 0;
|
|
151
151
|
}
|
|
152
152
|
const entries = await fetchActiveConnections(client, provider);
|
|
@@ -264,7 +264,7 @@ function judgeProviderResponse(
|
|
|
264
264
|
* health measures the same thing on the heartbeat; measuring it on the
|
|
265
265
|
* request names the gap at the moment a call may depend on it, since a
|
|
266
266
|
* connection made before a scope was required keeps working for every call
|
|
267
|
-
* that does not need it. A
|
|
267
|
+
* that does not need it. A cloud connection has no local row and reports
|
|
268
268
|
* nothing.
|
|
269
269
|
*/
|
|
270
270
|
function missingScopesForConnection(
|
|
@@ -312,10 +312,10 @@ async function handleDisconnect({ body = {} }: RouteHandlerArgs) {
|
|
|
312
312
|
);
|
|
313
313
|
}
|
|
314
314
|
|
|
315
|
-
const managed =
|
|
315
|
+
const managed = isCloudMode(b.provider);
|
|
316
316
|
|
|
317
317
|
if (managed) {
|
|
318
|
-
const client = await
|
|
318
|
+
const client = await requireCloudClient();
|
|
319
319
|
const entries = await fetchActiveConnections(client, b.provider);
|
|
320
320
|
|
|
321
321
|
let connectionId: string | undefined;
|
|
@@ -355,7 +355,7 @@ async function handleDisconnect({ body = {} }: RouteHandlerArgs) {
|
|
|
355
355
|
accountLabel = entries[0].account_label;
|
|
356
356
|
}
|
|
357
357
|
|
|
358
|
-
const disconnectPath = `/v1/assistants/${encodeURIComponent(client.
|
|
358
|
+
const disconnectPath = `/v1/assistants/${encodeURIComponent(client.cloudAssistantId)}/oauth/connections/${encodeURIComponent(connectionId!)}/disconnect/`;
|
|
359
359
|
const disconnectResponse = await client.fetch(disconnectPath, {
|
|
360
360
|
method: "POST",
|
|
361
361
|
headers: { "Content-Type": "application/json" },
|
|
@@ -513,13 +513,13 @@ async function handleModeSet({ body = {} }: RouteHandlerArgs) {
|
|
|
513
513
|
};
|
|
514
514
|
}
|
|
515
515
|
throw new BadRequestError(
|
|
516
|
-
`Managed mode is not available for ${b.provider}. Only providers with
|
|
516
|
+
`Managed mode is not available for ${b.provider}. Only providers with cloud OAuth support can be switched to managed mode.`,
|
|
517
517
|
);
|
|
518
518
|
}
|
|
519
519
|
|
|
520
520
|
// Require cloud connection when switching to managed mode
|
|
521
521
|
if (b.mode === "managed") {
|
|
522
|
-
const client = await
|
|
522
|
+
const client = await CadetCloudClient.create();
|
|
523
523
|
if (!client) {
|
|
524
524
|
throw new BadRequestError(
|
|
525
525
|
"Not connected to Cadet Cloud. Run `cadet cloud connect` to connect first.",
|
|
@@ -590,10 +590,10 @@ async function handleStatus({ queryParams = {} }: RouteHandlerArgs) {
|
|
|
590
590
|
);
|
|
591
591
|
}
|
|
592
592
|
|
|
593
|
-
const managed =
|
|
593
|
+
const managed = isCloudMode(provider);
|
|
594
594
|
|
|
595
595
|
if (managed) {
|
|
596
|
-
const client = await
|
|
596
|
+
const client = await requireCloudClient();
|
|
597
597
|
const rawEntries = await fetchActiveConnections(client, provider);
|
|
598
598
|
|
|
599
599
|
const connections = rawEntries.map((c) => ({
|
|
@@ -762,9 +762,9 @@ async function handleToken({ body = {} }: RouteHandlerArgs) {
|
|
|
762
762
|
throw new BadRequestError("provider is required");
|
|
763
763
|
}
|
|
764
764
|
|
|
765
|
-
if (
|
|
765
|
+
if (isCloudMode(b.provider)) {
|
|
766
766
|
throw new BadRequestError(
|
|
767
|
-
"Token retrieval is not supported for
|
|
767
|
+
"Token retrieval is not supported for cloud providers. " +
|
|
768
768
|
"When a provider is in managed mode, Cadet handles OAuth tokens on your behalf — " +
|
|
769
769
|
"they are not exposed directly.\n\n" +
|
|
770
770
|
`To verify your connection is working, run 'assistant oauth ping ${b.provider}'.\n` +
|
|
@@ -858,11 +858,11 @@ export async function handleRequest({ body = {} }: RouteHandlerArgs) {
|
|
|
858
858
|
);
|
|
859
859
|
}
|
|
860
860
|
|
|
861
|
-
const managed =
|
|
861
|
+
const managed = isCloudMode(b.provider);
|
|
862
862
|
|
|
863
863
|
if (b.client_id) {
|
|
864
864
|
if (managed) {
|
|
865
|
-
log.info("--client-id is ignored for
|
|
865
|
+
log.info("--client-id is ignored for cloud providers");
|
|
866
866
|
} else {
|
|
867
867
|
const app = getAppByProviderAndClientId(b.provider, b.client_id);
|
|
868
868
|
if (!app) {
|
|
@@ -1075,9 +1075,9 @@ async function handleManagedConnect({ body = {} }: RouteHandlerArgs) {
|
|
|
1075
1075
|
throw new BadRequestError("provider is required");
|
|
1076
1076
|
}
|
|
1077
1077
|
|
|
1078
|
-
const client = await
|
|
1078
|
+
const client = await requireCloudClient();
|
|
1079
1079
|
|
|
1080
|
-
const startPath = `/v1/assistants/${encodeURIComponent(client.
|
|
1080
|
+
const startPath = `/v1/assistants/${encodeURIComponent(client.cloudAssistantId)}/oauth/${encodeURIComponent(b.provider)}/start/`;
|
|
1081
1081
|
|
|
1082
1082
|
const reqBody: Record<string, unknown> = {};
|
|
1083
1083
|
if (b.scopes && b.scopes.length > 0) {
|
|
@@ -1085,7 +1085,7 @@ async function handleManagedConnect({ body = {} }: RouteHandlerArgs) {
|
|
|
1085
1085
|
}
|
|
1086
1086
|
reqBody.redirect_after_connect =
|
|
1087
1087
|
b.redirect_after_connect ?? "/account/oauth/complete";
|
|
1088
|
-
// Only forwarded when present: the
|
|
1088
|
+
// Only forwarded when present: the cloud validates it against the
|
|
1089
1089
|
// provider's pattern and rejects per-tenant providers that omit it.
|
|
1090
1090
|
const tenantHost =
|
|
1091
1091
|
typeof b.tenant_host === "string" ? b.tenant_host.trim() : "";
|
|
@@ -1129,7 +1129,7 @@ async function handleManagedConnectPoll({
|
|
|
1129
1129
|
throw new BadRequestError("provider query param is required");
|
|
1130
1130
|
}
|
|
1131
1131
|
|
|
1132
|
-
const client = await
|
|
1132
|
+
const client = await requireCloudClient();
|
|
1133
1133
|
const entries = await fetchActiveConnections(client, provider);
|
|
1134
1134
|
|
|
1135
1135
|
return {
|
|
@@ -1268,9 +1268,9 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
1268
1268
|
requiredScopes: ["settings.write"],
|
|
1269
1269
|
allowedPrincipalTypes: LOCAL_PRINCIPALS,
|
|
1270
1270
|
},
|
|
1271
|
-
summary: "Start
|
|
1271
|
+
summary: "Start cloud OAuth connect",
|
|
1272
1272
|
description:
|
|
1273
|
-
"Start a
|
|
1273
|
+
"Start a cloud (platform) OAuth connect flow and return the connect URL.",
|
|
1274
1274
|
tags: ["oauth"],
|
|
1275
1275
|
handler: handleManagedConnect,
|
|
1276
1276
|
},
|
|
@@ -1282,7 +1282,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
1282
1282
|
requiredScopes: ["settings.read"],
|
|
1283
1283
|
allowedPrincipalTypes: LOCAL_PRINCIPALS,
|
|
1284
1284
|
},
|
|
1285
|
-
summary: "Poll
|
|
1285
|
+
summary: "Poll cloud OAuth connections",
|
|
1286
1286
|
description:
|
|
1287
1287
|
"Fetch active cloud connections for a provider (used to detect new connections after managed connect).",
|
|
1288
1288
|
tags: ["oauth"],
|
|
@@ -72,11 +72,11 @@ function handleListProviders({ queryParams = {} }: RouteHandlerArgs) {
|
|
|
72
72
|
.map((row) => serializeProviderSummary(row))
|
|
73
73
|
.filter((s): s is NonNullable<typeof s> => s !== null);
|
|
74
74
|
|
|
75
|
-
const supportsManagedMode = queryParams.
|
|
75
|
+
const supportsManagedMode = queryParams.supports_cloud_mode;
|
|
76
76
|
if (supportsManagedMode === "true") {
|
|
77
|
-
serialized = serialized.filter((p) => p.
|
|
77
|
+
serialized = serialized.filter((p) => p.supports_cloud_mode);
|
|
78
78
|
} else if (supportsManagedMode === "false") {
|
|
79
|
-
serialized = serialized.filter((p) => !p.
|
|
79
|
+
serialized = serialized.filter((p) => !p.supports_cloud_mode);
|
|
80
80
|
}
|
|
81
81
|
|
|
82
82
|
return { providers: serialized };
|
|
@@ -399,7 +399,7 @@ export const oauthProviderSummarySchema = z.object({
|
|
|
399
399
|
client_id_placeholder: z.string().nullable(),
|
|
400
400
|
requires_client_secret: z.boolean(),
|
|
401
401
|
logo_url: z.string().nullable(),
|
|
402
|
-
|
|
402
|
+
supports_cloud_mode: z.boolean(),
|
|
403
403
|
managed_service_is_paid: z.boolean(),
|
|
404
404
|
feature_flag: z.string().nullable(),
|
|
405
405
|
category: z
|
|
@@ -446,7 +446,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
446
446
|
handler: handleListProviders,
|
|
447
447
|
queryParams: [
|
|
448
448
|
{
|
|
449
|
-
name: "
|
|
449
|
+
name: "supports_cloud_mode",
|
|
450
450
|
schema: { type: "string" },
|
|
451
451
|
description: "Filter by managed mode support (true/false)",
|
|
452
452
|
},
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
CredentialRequiredError,
|
|
5
5
|
InsufficientBalanceError,
|
|
6
6
|
ProviderUnreachableError,
|
|
7
|
-
} from "../../oauth/
|
|
7
|
+
} from "../../oauth/cloud-connection.js";
|
|
8
8
|
import { BackendError } from "../../util/errors.js";
|
|
9
9
|
import { BadRequestError, ForbiddenError, RouteError } from "./errors.js";
|
|
10
10
|
import {
|
|
@@ -7,14 +7,14 @@
|
|
|
7
7
|
* fidelity, header stripping, error mapping) testable in isolation.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
+
import {
|
|
11
|
+
CredentialRequiredError,
|
|
12
|
+
InsufficientBalanceError,
|
|
13
|
+
} from "../../oauth/cloud-connection.js";
|
|
10
14
|
import {
|
|
11
15
|
isBinaryOAuthBody,
|
|
12
16
|
type OAuthConnectionResponse,
|
|
13
17
|
} from "../../oauth/connection.js";
|
|
14
|
-
import {
|
|
15
|
-
CredentialRequiredError,
|
|
16
|
-
InsufficientBalanceError,
|
|
17
|
-
} from "../../oauth/platform-connection.js";
|
|
18
18
|
import type { TokenExpiredError } from "../../security/token-manager.js";
|
|
19
19
|
import { findContentTypeHeader } from "../../util/oauth-request-body.js";
|
|
20
20
|
import {
|
|
@@ -69,7 +69,7 @@ const TEXT_ENCODER = new TextEncoder();
|
|
|
69
69
|
/**
|
|
70
70
|
* Statuses the `Response` constructor refuses a body on, limited to the ones
|
|
71
71
|
* this route can emit. The interim 1xx statuses are absent: a BYO `fetch`
|
|
72
|
-
* never surfaces one as a final response and the
|
|
72
|
+
* never surfaces one as a final response and the cloud envelope refuses a
|
|
73
73
|
* status outside 200 to 599, so a `RouteResponse` carrying one would only make
|
|
74
74
|
* the adapter's `Response` constructor throw.
|
|
75
75
|
*/
|
|
@@ -409,9 +409,9 @@ export function mapProxyResolveError(
|
|
|
409
409
|
*
|
|
410
410
|
* Upstream text arrives here verbatim: a BYO refresh failure carries the
|
|
411
411
|
* provider token endpoint's own response and the refresh breaker's state, and
|
|
412
|
-
* a
|
|
412
|
+
* a cloud provider that could not be reached carries the cloud proxy's
|
|
413
413
|
* body. The grant holder learns which dependency failed and what repairs it,
|
|
414
|
-
* and nothing the provider or the
|
|
414
|
+
* and nothing the provider or the cloud wrote; the route logs the verbatim
|
|
415
415
|
* text so the operator still has it.
|
|
416
416
|
*
|
|
417
417
|
* `InsufficientBalanceError` is the exception: it is raised on a bare status
|
|
@@ -506,7 +506,7 @@ function pinningProviderSegment(
|
|
|
506
506
|
* A BYO connection reports a dead credential either as `TokenExpiredError`
|
|
507
507
|
* (no token, or a refresh that cannot succeed) or, when a refreshed request
|
|
508
508
|
* still comes back 401, as an error carrying `status: 401`. Both mean the same
|
|
509
|
-
* thing the
|
|
509
|
+
* thing the cloud's `CredentialRequiredError` does: reconnect.
|
|
510
510
|
*/
|
|
511
511
|
function isBYOCredentialFailure(err: unknown): boolean {
|
|
512
512
|
return isTokenExpiredError(err) || hasUnauthorizedStatus(err);
|
|
@@ -11,7 +11,11 @@
|
|
|
11
11
|
* `oauth-proxy-passthrough.ts`; this module is the wiring around them.
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
|
-
import {
|
|
14
|
+
import { isCloudAuthBypassActive } from "../../config/env.js";
|
|
15
|
+
import {
|
|
16
|
+
CloudOAuthConnection,
|
|
17
|
+
prepareCloudProxyHeaders,
|
|
18
|
+
} from "../../oauth/cloud-connection.js";
|
|
15
19
|
import {
|
|
16
20
|
isIdempotentHttpMethod,
|
|
17
21
|
type OAuthConnectionResponse,
|
|
@@ -19,10 +23,6 @@ import {
|
|
|
19
23
|
import type { OAuthConnectionResolution } from "../../oauth/connection-resolver.js";
|
|
20
24
|
import { resolveOAuthConnectionWithMeta } from "../../oauth/connection-resolver.js";
|
|
21
25
|
import { getProvider } from "../../oauth/oauth-store.js";
|
|
22
|
-
import {
|
|
23
|
-
PlatformOAuthConnection,
|
|
24
|
-
prepareManagedProxyHeaders,
|
|
25
|
-
} from "../../oauth/platform-connection.js";
|
|
26
26
|
import { getLogger } from "../../util/logger.js";
|
|
27
27
|
import { LOCAL_PRINCIPALS } from "../auth/route-policy.js";
|
|
28
28
|
import {
|
|
@@ -76,11 +76,11 @@ export async function handleOAuthProxy(
|
|
|
76
76
|
// A grant names one provider and, when it pinned one, one account. The
|
|
77
77
|
// subject is re-derived from this request's own segment, so rewriting or
|
|
78
78
|
// dropping `@account` cannot match the grant's subject. Only a
|
|
79
|
-
//
|
|
79
|
+
// cloud-managed pod skips the comparison: there the daemon discards the
|
|
80
80
|
// token and builds a synthetic context that carries no grant subject to
|
|
81
81
|
// compare against.
|
|
82
82
|
if (
|
|
83
|
-
!
|
|
83
|
+
!isCloudAuthBypassActive() &&
|
|
84
84
|
args.headers?.["x-cadet-subject"] !== proxyGrantSubject(provider, account)
|
|
85
85
|
) {
|
|
86
86
|
throw new ForbiddenError(
|
|
@@ -118,13 +118,11 @@ export async function handleOAuthProxy(
|
|
|
118
118
|
}
|
|
119
119
|
|
|
120
120
|
const { connection } = resolution;
|
|
121
|
-
if (connection instanceof
|
|
121
|
+
if (connection instanceof CloudOAuthConnection) {
|
|
122
122
|
if (method === "HEAD") {
|
|
123
|
-
throw new MethodNotAllowedError(
|
|
124
|
-
"Managed connections do not support HEAD",
|
|
125
|
-
);
|
|
123
|
+
throw new MethodNotAllowedError("Cloud connections do not support HEAD");
|
|
126
124
|
}
|
|
127
|
-
const managedHeaders =
|
|
125
|
+
const managedHeaders = prepareCloudProxyHeaders(headers);
|
|
128
126
|
const { unsupportedHeaders } = managedHeaders;
|
|
129
127
|
if (unsupportedHeaders.length > 0) {
|
|
130
128
|
throw new BadRequestError(
|
|
@@ -134,7 +132,7 @@ export async function handleOAuthProxy(
|
|
|
134
132
|
headers = managedHeaders.headers;
|
|
135
133
|
}
|
|
136
134
|
|
|
137
|
-
// A Buffer travels as raw bytes on BYO and as base64 on the
|
|
135
|
+
// A Buffer travels as raw bytes on BYO and as base64 on the cloud, in
|
|
138
136
|
// both cases under the caller's own Content-Type.
|
|
139
137
|
const body =
|
|
140
138
|
carriesBody(method) && args.rawBody?.byteLength
|
|
@@ -152,7 +150,7 @@ export async function handleOAuthProxy(
|
|
|
152
150
|
headers,
|
|
153
151
|
body,
|
|
154
152
|
signal: args.abortSignal,
|
|
155
|
-
// Byte-exact passthrough. Honored by BYO connections; a
|
|
153
|
+
// Byte-exact passthrough. Honored by BYO connections; a cloud
|
|
156
154
|
// connection is parsed platform-side and cannot offer it.
|
|
157
155
|
rawResponseBody: true,
|
|
158
156
|
// The caller's own HTTP client decides what to do with a 3xx; the
|
|
@@ -163,7 +161,7 @@ export async function handleOAuthProxy(
|
|
|
163
161
|
// the other idempotent methods keep their retries.
|
|
164
162
|
singleAttempt: !isIdempotentHttpMethod(method),
|
|
165
163
|
// The provider signing this query sees the bytes the caller wrote: key
|
|
166
|
-
// order, `%20`, and valueless flags all survive.
|
|
164
|
+
// order, `%20`, and valueless flags all survive. Cloud connections
|
|
167
165
|
// have no raw mode and send `query` instead.
|
|
168
166
|
rawQuery: args.rawUrl.search,
|
|
169
167
|
});
|
|
@@ -202,9 +200,9 @@ const BINARY_BODY = {
|
|
|
202
200
|
const ERROR_RESPONSES: Record<string, { description: string }> = {
|
|
203
201
|
"400": {
|
|
204
202
|
description:
|
|
205
|
-
"Malformed provider segment or proxied path, or request headers unsupported by a
|
|
203
|
+
"Malformed provider segment or proxied path, or request headers unsupported by a cloud connection",
|
|
206
204
|
},
|
|
207
|
-
"402": { description: "The
|
|
205
|
+
"402": { description: "The cloud account is out of balance" },
|
|
208
206
|
"403": {
|
|
209
207
|
description: "The grant was minted for a different provider or account",
|
|
210
208
|
},
|