@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
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Tests the two layers protecting managed inference profiles:
|
|
3
3
|
*
|
|
4
|
-
* - Route-level managed guards:
|
|
4
|
+
* - Route-level managed guards: cloud profiles can't be deleted via PATCH
|
|
5
5
|
* and the PUT profile route accepts only a pure status re-enable body for
|
|
6
6
|
* them.
|
|
7
|
-
* - The commitConfigWrite invariant guard: every
|
|
7
|
+
* - The commitConfigWrite invariant guard: every cloud profile name
|
|
8
8
|
* ("quality-optimized", "balanced", "cost-optimized", "os-beta") is fully
|
|
9
9
|
* read-only across PATCH/SET/PUT while its on-disk entry is
|
|
10
10
|
* managed-source — the only writable transition is re-enabling a disabled
|
|
11
|
-
* profile. A user-owned (`source: "user"`) entry sharing a
|
|
11
|
+
* profile. A user-owned (`source: "user"`) entry sharing a cloud name is
|
|
12
12
|
* not locked.
|
|
13
13
|
*
|
|
14
14
|
* Plus the wire-only profile keys (`invariant`, `supportsVision`) stamped on
|
|
@@ -105,7 +105,7 @@ mock.module("../providers/inference/connections.js", () => ({
|
|
|
105
105
|
listConnections: () => [],
|
|
106
106
|
createConnection: () => ({ ok: false, error: { code: "already_exists" } }),
|
|
107
107
|
getConnection: () => null,
|
|
108
|
-
|
|
108
|
+
CADET_CLOUD_CONNECTION_NAME: "cadet",
|
|
109
109
|
}));
|
|
110
110
|
|
|
111
111
|
import { ROUTES } from "../runtime/routes/conversation-query-routes.js";
|
|
@@ -145,7 +145,7 @@ function savedProfile(name: string): Record<string, unknown> {
|
|
|
145
145
|
// PUT /v1/config/llm/profiles/:name — replace inference profile
|
|
146
146
|
// ---------------------------------------------------------------------------
|
|
147
147
|
|
|
148
|
-
describe("PUT /v1/config/llm/profiles/:name —
|
|
148
|
+
describe("PUT /v1/config/llm/profiles/:name — cloud profile guard", () => {
|
|
149
149
|
test("rejects provider/model edits to quality-optimized", async () => {
|
|
150
150
|
await expect(
|
|
151
151
|
replaceRoute.handler({
|
|
@@ -153,8 +153,8 @@ describe("PUT /v1/config/llm/profiles/:name — managed profile guard", () => {
|
|
|
153
153
|
body: { provider: "openai", model: "gpt-4o" },
|
|
154
154
|
}),
|
|
155
155
|
).rejects.toThrow(
|
|
156
|
-
'Cannot edit
|
|
157
|
-
"
|
|
156
|
+
'Cannot edit cloud profile "quality-optimized" fields [provider, model]. ' +
|
|
157
|
+
"Cloud profiles are read-only (a disabled profile can be re-enabled); " +
|
|
158
158
|
"duplicate to a custom profile to customize.",
|
|
159
159
|
);
|
|
160
160
|
});
|
|
@@ -219,7 +219,7 @@ describe("PUT /v1/config/llm/profiles/:name — managed profile guard", () => {
|
|
|
219
219
|
pathParams: { name: "my-custom" },
|
|
220
220
|
body: { provider: "cadet", model: "not-a-real-model" },
|
|
221
221
|
}),
|
|
222
|
-
).rejects.toThrow(/not served by the Cadet
|
|
222
|
+
).rejects.toThrow(/not served by the Cadet Cloud route/);
|
|
223
223
|
expect(committedRaw()).toBeNull();
|
|
224
224
|
});
|
|
225
225
|
|
|
@@ -234,14 +234,14 @@ describe("PUT /v1/config/llm/profiles/:name — managed profile guard", () => {
|
|
|
234
234
|
|
|
235
235
|
// -------------------------------------------------------------------------
|
|
236
236
|
// Null-as-clear sentinel: clients send `{ label: null }` or
|
|
237
|
-
// `{ status: null }` to clear a
|
|
237
|
+
// `{ status: null }` to clear a cloud profile's overrides back to the
|
|
238
238
|
// seed defaults. The Zod `ProfileEntry` schema accepts null for both
|
|
239
239
|
// fields. Every managed name is invariant, so on managed-source entries
|
|
240
240
|
// only the status clear is allowed (re-enable) — every other field is
|
|
241
241
|
// frozen at commit time.
|
|
242
242
|
// -------------------------------------------------------------------------
|
|
243
243
|
|
|
244
|
-
test("PUT { label: null } on a
|
|
244
|
+
test("PUT { label: null } on a cloud profile is rejected (label is frozen)", async () => {
|
|
245
245
|
seedRawConfig({
|
|
246
246
|
llm: {
|
|
247
247
|
profiles: {
|
|
@@ -259,13 +259,13 @@ describe("PUT /v1/config/llm/profiles/:name — managed profile guard", () => {
|
|
|
259
259
|
pathParams: { name: "balanced" },
|
|
260
260
|
body: { label: null },
|
|
261
261
|
}),
|
|
262
|
-
).rejects.toThrow('Cannot edit
|
|
262
|
+
).rejects.toThrow('Cannot edit cloud profile "balanced" fields [label]');
|
|
263
263
|
expectNothingCommitted();
|
|
264
264
|
});
|
|
265
265
|
|
|
266
266
|
test("PUT on the code-owned latency profile is rejected, status re-enable included", async () => {
|
|
267
267
|
// Fast fronts live voice, so it takes no writes at all: the re-enable
|
|
268
|
-
// escape hatch the other
|
|
268
|
+
// escape hatch the other cloud profiles keep would persist a stub that
|
|
269
269
|
// never governs what the name resolves to.
|
|
270
270
|
seedRawConfig({ llm: { profiles: {} } });
|
|
271
271
|
|
|
@@ -286,7 +286,7 @@ describe("PUT /v1/config/llm/profiles/:name — managed profile guard", () => {
|
|
|
286
286
|
expectNothingCommitted();
|
|
287
287
|
});
|
|
288
288
|
|
|
289
|
-
test("PUT on a
|
|
289
|
+
test("PUT on a cloud backup profile is rejected as code-owned", async () => {
|
|
290
290
|
// Backups are code-owned too, and they carry no on-disk entry, so the
|
|
291
291
|
// code-owned rejection has to win over the availability gate: reporting
|
|
292
292
|
// "not currently available" would be wrong for a profile the picker
|
|
@@ -314,7 +314,7 @@ describe("PUT /v1/config/llm/profiles/:name — managed profile guard", () => {
|
|
|
314
314
|
expectNothingCommitted();
|
|
315
315
|
});
|
|
316
316
|
|
|
317
|
-
test("PUT { status: null } on
|
|
317
|
+
test("PUT { status: null } on cloud profile clears status (back to active-by-absence)", async () => {
|
|
318
318
|
seedRawConfig({
|
|
319
319
|
llm: {
|
|
320
320
|
profiles: {
|
|
@@ -359,7 +359,7 @@ describe("PUT /v1/config/llm/profiles/:name — managed profile guard", () => {
|
|
|
359
359
|
pathParams: { name: "os-beta" },
|
|
360
360
|
body: { label: null, status: null },
|
|
361
361
|
}),
|
|
362
|
-
).rejects.toThrow('Cannot edit
|
|
362
|
+
).rejects.toThrow('Cannot edit cloud profile "os-beta" fields [label]');
|
|
363
363
|
expectNothingCommitted();
|
|
364
364
|
});
|
|
365
365
|
|
|
@@ -382,7 +382,7 @@ describe("PUT /v1/config/llm/profiles/:name — managed profile guard", () => {
|
|
|
382
382
|
body: { status: "disabled" },
|
|
383
383
|
}),
|
|
384
384
|
).rejects.toThrow(
|
|
385
|
-
'Cannot edit
|
|
385
|
+
'Cannot edit cloud profile "os-beta". Cloud profiles are read-only',
|
|
386
386
|
);
|
|
387
387
|
expectNothingCommitted();
|
|
388
388
|
});
|
|
@@ -404,7 +404,7 @@ describe("PUT /v1/config/llm/profiles/:name — managed profile guard", () => {
|
|
|
404
404
|
pathParams: { name: "os-beta" },
|
|
405
405
|
body: { topP: 0.9 },
|
|
406
406
|
}),
|
|
407
|
-
).rejects.toThrow('Cannot edit
|
|
407
|
+
).rejects.toThrow('Cannot edit cloud profile "os-beta" fields [topP]');
|
|
408
408
|
expectNothingCommitted();
|
|
409
409
|
});
|
|
410
410
|
|
|
@@ -426,7 +426,7 @@ describe("PUT /v1/config/llm/profiles/:name — managed profile guard", () => {
|
|
|
426
426
|
pathParams: { name: "os-beta" },
|
|
427
427
|
body: { topP: null },
|
|
428
428
|
}),
|
|
429
|
-
).rejects.toThrow('Cannot edit
|
|
429
|
+
).rejects.toThrow('Cannot edit cloud profile "os-beta" fields [topP]');
|
|
430
430
|
expectNothingCommitted();
|
|
431
431
|
});
|
|
432
432
|
|
|
@@ -455,7 +455,7 @@ describe("PUT /v1/config/llm/profiles/:name — managed profile guard", () => {
|
|
|
455
455
|
expect(profile.model).toBe("zai-org/GLM-5.2");
|
|
456
456
|
});
|
|
457
457
|
|
|
458
|
-
test("allows edits to a user-owned profile sharing a
|
|
458
|
+
test("allows edits to a user-owned profile sharing a cloud name (os-beta)", async () => {
|
|
459
459
|
seedRawConfig({
|
|
460
460
|
llm: {
|
|
461
461
|
profiles: {
|
|
@@ -477,7 +477,7 @@ describe("PUT /v1/config/llm/profiles/:name — managed profile guard", () => {
|
|
|
477
477
|
expect(profile.model).toBe("gpt-4o");
|
|
478
478
|
});
|
|
479
479
|
|
|
480
|
-
test("rejects edits to a
|
|
480
|
+
test("rejects edits to a cloud os-beta profile", async () => {
|
|
481
481
|
seedRawConfig({
|
|
482
482
|
llm: {
|
|
483
483
|
profiles: {
|
|
@@ -513,7 +513,7 @@ describe("PUT /v1/config/llm/profiles/:name — managed profile guard", () => {
|
|
|
513
513
|
expect(onDisk?.llm?.profiles?.["os-beta"]).toBeUndefined();
|
|
514
514
|
});
|
|
515
515
|
|
|
516
|
-
test("PUT { label: '' } on
|
|
516
|
+
test("PUT { label: '' } on cloud profile still rejected by `.min(1)`", async () => {
|
|
517
517
|
// `.nullable()` only widens the type to accept null — empty strings
|
|
518
518
|
// still fail the min-length check, which is correct: an empty string
|
|
519
519
|
// would persist as a literal "" override, not the clear-to-seed
|
|
@@ -528,16 +528,16 @@ describe("PUT /v1/config/llm/profiles/:name — managed profile guard", () => {
|
|
|
528
528
|
});
|
|
529
529
|
|
|
530
530
|
// ---------------------------------------------------------------------------
|
|
531
|
-
// PATCH /v1/config —
|
|
531
|
+
// PATCH /v1/config — cloud profile deletion guard
|
|
532
532
|
// ---------------------------------------------------------------------------
|
|
533
533
|
|
|
534
|
-
describe("PATCH /v1/config —
|
|
534
|
+
describe("PATCH /v1/config — cloud profile deletion guard", () => {
|
|
535
535
|
test("rejects deletion of quality-optimized via null with descriptive message", async () => {
|
|
536
536
|
await expect(
|
|
537
537
|
patchRoute.handler({
|
|
538
538
|
body: { llm: { profiles: { "quality-optimized": null } } },
|
|
539
539
|
}),
|
|
540
|
-
).rejects.toThrow('Cannot delete
|
|
540
|
+
).rejects.toThrow('Cannot delete cloud profile "quality-optimized".');
|
|
541
541
|
});
|
|
542
542
|
|
|
543
543
|
test("rejects deletion of balanced via null", async () => {
|
|
@@ -600,7 +600,7 @@ describe("PATCH /v1/config — managed profile deletion guard", () => {
|
|
|
600
600
|
});
|
|
601
601
|
});
|
|
602
602
|
|
|
603
|
-
test("allows patches that modify a
|
|
603
|
+
test("allows patches that modify a cloud profile (non-null)", async () => {
|
|
604
604
|
const result = await patchRoute.handler({
|
|
605
605
|
body: {
|
|
606
606
|
llm: {
|
|
@@ -611,7 +611,7 @@ describe("PATCH /v1/config — managed profile deletion guard", () => {
|
|
|
611
611
|
expect(result).toHaveProperty("llm");
|
|
612
612
|
});
|
|
613
613
|
|
|
614
|
-
test("allows deletion of a user-owned profile sharing a
|
|
614
|
+
test("allows deletion of a user-owned profile sharing a cloud name (os-beta)", async () => {
|
|
615
615
|
seedRawConfig({
|
|
616
616
|
llm: {
|
|
617
617
|
profiles: {
|
|
@@ -629,7 +629,7 @@ describe("PATCH /v1/config — managed profile deletion guard", () => {
|
|
|
629
629
|
expect(result).toHaveProperty("llm");
|
|
630
630
|
});
|
|
631
631
|
|
|
632
|
-
test("rejects deletion of a
|
|
632
|
+
test("rejects deletion of a cloud os-beta profile", async () => {
|
|
633
633
|
seedRawConfig({
|
|
634
634
|
llm: {
|
|
635
635
|
profiles: {
|
|
@@ -645,7 +645,7 @@ describe("PATCH /v1/config — managed profile deletion guard", () => {
|
|
|
645
645
|
patchRoute.handler({
|
|
646
646
|
body: { llm: { profiles: { "os-beta": null } } },
|
|
647
647
|
}),
|
|
648
|
-
).rejects.toThrow('Cannot delete
|
|
648
|
+
).rejects.toThrow('Cannot delete cloud profile "os-beta".');
|
|
649
649
|
});
|
|
650
650
|
|
|
651
651
|
test("rejects nulling the entire profiles map", async () => {
|
|
@@ -658,23 +658,23 @@ describe("PATCH /v1/config — managed profile deletion guard", () => {
|
|
|
658
658
|
});
|
|
659
659
|
|
|
660
660
|
// ---------------------------------------------------------------------------
|
|
661
|
-
// commitConfigWrite —
|
|
661
|
+
// commitConfigWrite — cloud-profile invariant guard
|
|
662
662
|
//
|
|
663
|
-
// Every
|
|
663
|
+
// Every cloud profile name (balanced, quality-optimized, cost-optimized,
|
|
664
664
|
// os-beta) is read-only to every config-write route while its on-disk entry
|
|
665
665
|
// is managed-source; the only writable transition is re-enabling a disabled
|
|
666
|
-
// profile. A user-owned entry sharing a
|
|
666
|
+
// profile. A user-owned entry sharing a cloud name is not locked. Enforced
|
|
667
667
|
// by `assertInvariantProfilesPreserved` at the commitConfigWrite choke
|
|
668
668
|
// point, so PATCH, SET, and PUT are all covered by the same checks.
|
|
669
669
|
// ---------------------------------------------------------------------------
|
|
670
670
|
|
|
671
|
-
describe("
|
|
671
|
+
describe("cloud-profile invariant guard — rejected writes", () => {
|
|
672
672
|
test("PATCH disabling balanced is rejected (active → disabled)", async () => {
|
|
673
673
|
await expect(
|
|
674
674
|
patchRoute.handler({
|
|
675
675
|
body: { llm: { profiles: { balanced: { status: "disabled" } } } },
|
|
676
676
|
}),
|
|
677
|
-
).rejects.toThrow('Cannot disable
|
|
677
|
+
).rejects.toThrow('Cannot disable cloud profile "balanced".');
|
|
678
678
|
expectNothingCommitted();
|
|
679
679
|
});
|
|
680
680
|
|
|
@@ -684,8 +684,8 @@ describe("managed-profile invariant guard — rejected writes", () => {
|
|
|
684
684
|
body: { llm: { profiles: { balanced: { label: "X" } } } },
|
|
685
685
|
}),
|
|
686
686
|
).rejects.toThrow(
|
|
687
|
-
'Cannot edit
|
|
688
|
-
"
|
|
687
|
+
'Cannot edit cloud profile "balanced" fields [label]. ' +
|
|
688
|
+
"Cloud profiles are read-only; duplicate to a custom profile to customize.",
|
|
689
689
|
);
|
|
690
690
|
expectNothingCommitted();
|
|
691
691
|
});
|
|
@@ -697,7 +697,7 @@ describe("managed-profile invariant guard — rejected writes", () => {
|
|
|
697
697
|
patchRoute.handler({
|
|
698
698
|
body: { llm: { profiles: { balanced: { label: null } } } },
|
|
699
699
|
}),
|
|
700
|
-
).rejects.toThrow('Cannot edit
|
|
700
|
+
).rejects.toThrow('Cannot edit cloud profile "balanced" fields [label]');
|
|
701
701
|
expectNothingCommitted();
|
|
702
702
|
});
|
|
703
703
|
|
|
@@ -706,7 +706,7 @@ describe("managed-profile invariant guard — rejected writes", () => {
|
|
|
706
706
|
patchRoute.handler({
|
|
707
707
|
body: { llm: { profiles: { balanced: { topP: 0.8 } } } },
|
|
708
708
|
}),
|
|
709
|
-
).rejects.toThrow('Cannot edit
|
|
709
|
+
).rejects.toThrow('Cannot edit cloud profile "balanced" fields [topP]');
|
|
710
710
|
expectNothingCommitted();
|
|
711
711
|
});
|
|
712
712
|
|
|
@@ -717,11 +717,11 @@ describe("managed-profile invariant guard — rejected writes", () => {
|
|
|
717
717
|
patchRoute.handler({
|
|
718
718
|
body: { llm: { profiles: { balanced: { topP: null } } } },
|
|
719
719
|
}),
|
|
720
|
-
).rejects.toThrow('Cannot edit
|
|
720
|
+
).rejects.toThrow('Cannot edit cloud profile "balanced" fields [topP]');
|
|
721
721
|
expectNothingCommitted();
|
|
722
722
|
});
|
|
723
723
|
|
|
724
|
-
test("PATCH disabling a
|
|
724
|
+
test("PATCH disabling a cloud-source os-beta is rejected (active → disabled)", async () => {
|
|
725
725
|
(rawConfig as Record<string, any>).llm.profiles["os-beta"] = {
|
|
726
726
|
provider: "together",
|
|
727
727
|
model: "zai-org/GLM-5.2",
|
|
@@ -732,11 +732,11 @@ describe("managed-profile invariant guard — rejected writes", () => {
|
|
|
732
732
|
patchRoute.handler({
|
|
733
733
|
body: { llm: { profiles: { "os-beta": { status: "disabled" } } } },
|
|
734
734
|
}),
|
|
735
|
-
).rejects.toThrow('Cannot disable
|
|
735
|
+
).rejects.toThrow('Cannot disable cloud profile "os-beta".');
|
|
736
736
|
expectNothingCommitted();
|
|
737
737
|
});
|
|
738
738
|
|
|
739
|
-
test("SET llm.profiles.os-beta.label is rejected on a
|
|
739
|
+
test("SET llm.profiles.os-beta.label is rejected on a cloud-source entry", async () => {
|
|
740
740
|
(rawConfig as Record<string, any>).llm.profiles["os-beta"] = {
|
|
741
741
|
provider: "together",
|
|
742
742
|
model: "zai-org/GLM-5.2",
|
|
@@ -747,7 +747,7 @@ describe("managed-profile invariant guard — rejected writes", () => {
|
|
|
747
747
|
setRoute.handler({
|
|
748
748
|
body: { path: "llm.profiles.os-beta.label", value: "My OS Beta" },
|
|
749
749
|
}),
|
|
750
|
-
).rejects.toThrow('Cannot edit
|
|
750
|
+
).rejects.toThrow('Cannot edit cloud profile "os-beta" fields [label]');
|
|
751
751
|
expectNothingCommitted();
|
|
752
752
|
});
|
|
753
753
|
|
|
@@ -756,7 +756,7 @@ describe("managed-profile invariant guard — rejected writes", () => {
|
|
|
756
756
|
patchRoute.handler({
|
|
757
757
|
body: { llm: { profiles: { balanced: "junk" } } },
|
|
758
758
|
}),
|
|
759
|
-
).rejects.toThrow('Cannot delete or replace
|
|
759
|
+
).rejects.toThrow('Cannot delete or replace cloud profile "balanced".');
|
|
760
760
|
expectNothingCommitted();
|
|
761
761
|
});
|
|
762
762
|
|
|
@@ -765,7 +765,7 @@ describe("managed-profile invariant guard — rejected writes", () => {
|
|
|
765
765
|
patchRoute.handler({
|
|
766
766
|
body: { llm: { profiles: { balanced: ["disabled"] } } },
|
|
767
767
|
}),
|
|
768
|
-
).rejects.toThrow('Cannot delete or replace
|
|
768
|
+
).rejects.toThrow('Cannot delete or replace cloud profile "balanced".');
|
|
769
769
|
expectNothingCommitted();
|
|
770
770
|
});
|
|
771
771
|
|
|
@@ -780,7 +780,7 @@ describe("managed-profile invariant guard — rejected writes", () => {
|
|
|
780
780
|
body: { status: "disabled" },
|
|
781
781
|
}),
|
|
782
782
|
).rejects.toThrow(
|
|
783
|
-
'Cannot edit
|
|
783
|
+
'Cannot edit cloud profile "balanced". Cloud profiles are read-only',
|
|
784
784
|
);
|
|
785
785
|
expectNothingCommitted();
|
|
786
786
|
});
|
|
@@ -790,14 +790,14 @@ describe("managed-profile invariant guard — rejected writes", () => {
|
|
|
790
790
|
setRoute.handler({
|
|
791
791
|
body: { path: "llm.profiles.balanced.status", value: "disabled" },
|
|
792
792
|
}),
|
|
793
|
-
).rejects.toThrow('Cannot disable
|
|
793
|
+
).rejects.toThrow('Cannot disable cloud profile "balanced".');
|
|
794
794
|
expectNothingCommitted();
|
|
795
795
|
});
|
|
796
796
|
|
|
797
797
|
test("SET llm = {} is rejected (would drop all defaults)", async () => {
|
|
798
798
|
await expect(
|
|
799
799
|
setRoute.handler({ body: { path: "llm", value: {} } }),
|
|
800
|
-
).rejects.toThrow(/Cannot delete or replace
|
|
800
|
+
).rejects.toThrow(/Cannot delete or replace cloud profile/);
|
|
801
801
|
expectNothingCommitted();
|
|
802
802
|
});
|
|
803
803
|
|
|
@@ -807,7 +807,7 @@ describe("managed-profile invariant guard — rejected writes", () => {
|
|
|
807
807
|
body: { llm: { profiles: { balanced: { status: "weird" } } } },
|
|
808
808
|
}),
|
|
809
809
|
).rejects.toThrow(
|
|
810
|
-
'Cannot set status "weird" on
|
|
810
|
+
'Cannot set status "weird" on cloud profile "balanced". ' +
|
|
811
811
|
'Only re-enabling (status "active") is allowed.',
|
|
812
812
|
);
|
|
813
813
|
expectNothingCommitted();
|
|
@@ -818,13 +818,13 @@ describe("managed-profile invariant guard — rejected writes", () => {
|
|
|
818
818
|
setRoute.handler({
|
|
819
819
|
body: { path: "llm.profiles.balanced.status", value: 123 },
|
|
820
820
|
}),
|
|
821
|
-
).rejects.toThrow('Cannot set status 123 on
|
|
821
|
+
).rejects.toThrow('Cannot set status 123 on cloud profile "balanced"');
|
|
822
822
|
expectNothingCommitted();
|
|
823
823
|
});
|
|
824
824
|
});
|
|
825
825
|
|
|
826
826
|
describe("default-profile invariant guard — allowed writes", () => {
|
|
827
|
-
test("PATCH re-enables a disabled
|
|
827
|
+
test("PATCH re-enables a disabled cloud profile (BYOK re-enable)", async () => {
|
|
828
828
|
(rawConfig as Record<string, any>).llm.profiles.balanced.status =
|
|
829
829
|
"disabled";
|
|
830
830
|
seedRawConfig(rawConfig);
|
|
@@ -848,7 +848,7 @@ describe("default-profile invariant guard — allowed writes", () => {
|
|
|
848
848
|
expect(savedProfile("balanced").status ?? null).toBeNull();
|
|
849
849
|
});
|
|
850
850
|
|
|
851
|
-
test("PUT { status: 'active' } re-enables a disabled
|
|
851
|
+
test("PUT { status: 'active' } re-enables a disabled cloud profile", async () => {
|
|
852
852
|
(rawConfig as Record<string, any>).llm.profiles.balanced.status =
|
|
853
853
|
"disabled";
|
|
854
854
|
seedRawConfig(rawConfig);
|
|
@@ -861,7 +861,7 @@ describe("default-profile invariant guard — allowed writes", () => {
|
|
|
861
861
|
expect(savedProfile("balanced").status).toBe("active");
|
|
862
862
|
});
|
|
863
863
|
|
|
864
|
-
test("SET llm.profiles.balanced.status = 'active' re-enables a disabled
|
|
864
|
+
test("SET llm.profiles.balanced.status = 'active' re-enables a disabled cloud profile", async () => {
|
|
865
865
|
(rawConfig as Record<string, any>).llm.profiles.balanced.status =
|
|
866
866
|
"disabled";
|
|
867
867
|
seedRawConfig(rawConfig);
|
|
@@ -893,9 +893,9 @@ describe("default-profile invariant guard — allowed writes", () => {
|
|
|
893
893
|
});
|
|
894
894
|
|
|
895
895
|
test("PATCH deleting a user-sourced balanced entry is allowed (invariance is source-gated)", async () => {
|
|
896
|
-
// A `source: "user"` entry passes the
|
|
896
|
+
// A `source: "user"` entry passes the cloud-deletion guard AND the
|
|
897
897
|
// invariant guard — both key on the on-disk entry's managed source, so
|
|
898
|
-
// a user-owned profile sharing a
|
|
898
|
+
// a user-owned profile sharing a cloud name stays deletable.
|
|
899
899
|
(rawConfig as Record<string, any>).llm.profiles.balanced.source = "user";
|
|
900
900
|
seedRawConfig(rawConfig);
|
|
901
901
|
const result = await patchRoute.handler({
|
|
@@ -1014,13 +1014,13 @@ describe("wire-only profile keys are stripped from writes", () => {
|
|
|
1014
1014
|
|
|
1015
1015
|
// -------------------------------------------------------------------------
|
|
1016
1016
|
// Stale wire-only keys on disk: configs written before the write-side strip
|
|
1017
|
-
// existed can carry `supportsVision` under a
|
|
1017
|
+
// existed can carry `supportsVision` under a cloud profile. The invariant
|
|
1018
1018
|
// guard ignores wire-only keys on both sides, so a GET → write round-trip
|
|
1019
1019
|
// (whose incoming copy is stripped) is not rejected for "removing" the
|
|
1020
1020
|
// stale key — and a full-entry SET drops it from disk.
|
|
1021
1021
|
// -------------------------------------------------------------------------
|
|
1022
1022
|
|
|
1023
|
-
test("SET round-trip re-enabling a
|
|
1023
|
+
test("SET round-trip re-enabling a cloud profile with stale on-disk supportsVision succeeds and drops the stale key", async () => {
|
|
1024
1024
|
const balanced = (rawConfig as Record<string, any>).llm.profiles.balanced;
|
|
1025
1025
|
balanced.supportsVision = true; // stale pre-strip persistence
|
|
1026
1026
|
balanced.status = "disabled";
|
|
@@ -1186,7 +1186,7 @@ describe("code-owned default profiles — wire view and write normalization", ()
|
|
|
1186
1186
|
},
|
|
1187
1187
|
}),
|
|
1188
1188
|
).rejects.toThrow(
|
|
1189
|
-
'Cannot edit
|
|
1189
|
+
'Cannot edit cloud profile "cost-optimized" fields [model].',
|
|
1190
1190
|
);
|
|
1191
1191
|
expectNothingCommitted();
|
|
1192
1192
|
});
|
|
@@ -1201,7 +1201,7 @@ describe("code-owned default profiles — wire view and write normalization", ()
|
|
|
1201
1201
|
},
|
|
1202
1202
|
},
|
|
1203
1203
|
}),
|
|
1204
|
-
).rejects.toThrow('Cannot disable
|
|
1204
|
+
).rejects.toThrow('Cannot disable cloud profile "balanced".');
|
|
1205
1205
|
expectNothingCommitted();
|
|
1206
1206
|
});
|
|
1207
1207
|
|
|
@@ -1302,7 +1302,7 @@ describe("code-owned default profiles — BYO default provider wire view", () =>
|
|
|
1302
1302
|
});
|
|
1303
1303
|
|
|
1304
1304
|
describe("code-owned default profiles — leaf SET source stamping", () => {
|
|
1305
|
-
test("a leaf SET creating a
|
|
1305
|
+
test("a leaf SET creating a cloud entry stamps the cloud marker", async () => {
|
|
1306
1306
|
seedRawConfig({ llm: { profiles: {} } });
|
|
1307
1307
|
const result = await setRoute.handler({
|
|
1308
1308
|
body: { path: "llm.profiles.balanced.status", value: "active" },
|
|
@@ -1348,7 +1348,7 @@ describe("code-owned default profiles — leaf SET source stamping", () => {
|
|
|
1348
1348
|
});
|
|
1349
1349
|
|
|
1350
1350
|
describe("code-owned default profiles — echoes over stale on-disk bodies", () => {
|
|
1351
|
-
// An overlay can persist a
|
|
1351
|
+
// An overlay can persist a cloud entry whose content differs from the
|
|
1352
1352
|
// catalog; GET serves catalog content, so a client echo carries values
|
|
1353
1353
|
// that match neither nothing — they match the wire view. The round-trip
|
|
1354
1354
|
// must still be a no-op.
|
|
@@ -8,139 +8,139 @@ const secureKeys = useMemorySecureKeyMap();
|
|
|
8
8
|
const ASSISTANT_API_KEY = credentialKey("cadet", "assistant_api_key");
|
|
9
9
|
|
|
10
10
|
// Mutable state for env stubs
|
|
11
|
-
let
|
|
11
|
+
let mockCloudBaseUrl = "";
|
|
12
12
|
|
|
13
13
|
mock.module("../config/env.js", () => ({
|
|
14
|
-
|
|
14
|
+
getCloudBaseUrl: () => mockCloudBaseUrl,
|
|
15
15
|
}));
|
|
16
16
|
|
|
17
17
|
import {
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
buildCloudBaseUrl,
|
|
19
|
+
hasCloudProxyPrereqs,
|
|
20
20
|
managedFallbackEnabledFor,
|
|
21
|
-
|
|
22
|
-
} from "../providers/
|
|
21
|
+
resolveCloudProxyContext,
|
|
22
|
+
} from "../providers/cloud-proxy/context.js";
|
|
23
23
|
|
|
24
|
-
describe("
|
|
24
|
+
describe("resolveCloudProxyContext", () => {
|
|
25
25
|
beforeEach(() => {
|
|
26
|
-
|
|
26
|
+
mockCloudBaseUrl = "";
|
|
27
27
|
secureKeys.delete(ASSISTANT_API_KEY);
|
|
28
28
|
});
|
|
29
29
|
|
|
30
30
|
test("returns disabled when platform URL is empty", async () => {
|
|
31
|
-
|
|
31
|
+
mockCloudBaseUrl = "";
|
|
32
32
|
secureKeys.set(ASSISTANT_API_KEY, "sk-test-key");
|
|
33
33
|
|
|
34
|
-
const ctx = await
|
|
34
|
+
const ctx = await resolveCloudProxyContext();
|
|
35
35
|
expect(ctx.enabled).toBe(false);
|
|
36
|
-
expect(ctx.
|
|
36
|
+
expect(ctx.cloudBaseUrl).toBe("");
|
|
37
37
|
});
|
|
38
38
|
|
|
39
39
|
test("returns disabled when assistant API key is missing", async () => {
|
|
40
|
-
|
|
40
|
+
mockCloudBaseUrl = "https://platform.example.com";
|
|
41
41
|
secureKeys.delete(ASSISTANT_API_KEY);
|
|
42
42
|
|
|
43
|
-
const ctx = await
|
|
43
|
+
const ctx = await resolveCloudProxyContext();
|
|
44
44
|
expect(ctx.enabled).toBe(false);
|
|
45
45
|
expect(ctx.assistantApiKey).toBe("");
|
|
46
46
|
});
|
|
47
47
|
|
|
48
48
|
test("returns disabled when both are missing", async () => {
|
|
49
|
-
const ctx = await
|
|
49
|
+
const ctx = await resolveCloudProxyContext();
|
|
50
50
|
expect(ctx.enabled).toBe(false);
|
|
51
51
|
});
|
|
52
52
|
|
|
53
53
|
test("returns enabled when both platform URL and API key are present", async () => {
|
|
54
|
-
|
|
54
|
+
mockCloudBaseUrl = "https://platform.example.com/";
|
|
55
55
|
secureKeys.set(ASSISTANT_API_KEY, "sk-test-key");
|
|
56
56
|
|
|
57
|
-
const ctx = await
|
|
57
|
+
const ctx = await resolveCloudProxyContext();
|
|
58
58
|
expect(ctx.enabled).toBe(true);
|
|
59
|
-
expect(ctx.
|
|
59
|
+
expect(ctx.cloudBaseUrl).toBe("https://platform.example.com");
|
|
60
60
|
expect(ctx.assistantApiKey).toBe("sk-test-key");
|
|
61
61
|
});
|
|
62
62
|
|
|
63
63
|
test("strips trailing slashes from platform URL", async () => {
|
|
64
|
-
|
|
64
|
+
mockCloudBaseUrl = "https://platform.example.com///";
|
|
65
65
|
secureKeys.set(ASSISTANT_API_KEY, "sk-test-key");
|
|
66
66
|
|
|
67
|
-
const ctx = await
|
|
68
|
-
expect(ctx.
|
|
67
|
+
const ctx = await resolveCloudProxyContext();
|
|
68
|
+
expect(ctx.cloudBaseUrl).toBe("https://platform.example.com");
|
|
69
69
|
});
|
|
70
70
|
});
|
|
71
71
|
|
|
72
|
-
describe("
|
|
72
|
+
describe("hasCloudProxyPrereqs", () => {
|
|
73
73
|
beforeEach(() => {
|
|
74
|
-
|
|
74
|
+
mockCloudBaseUrl = "";
|
|
75
75
|
secureKeys.delete(ASSISTANT_API_KEY);
|
|
76
76
|
});
|
|
77
77
|
|
|
78
78
|
test("returns false when prerequisites are missing", async () => {
|
|
79
|
-
expect(await
|
|
79
|
+
expect(await hasCloudProxyPrereqs()).toBe(false);
|
|
80
80
|
});
|
|
81
81
|
|
|
82
82
|
test("returns true when prerequisites are satisfied", async () => {
|
|
83
|
-
|
|
83
|
+
mockCloudBaseUrl = "https://platform.example.com";
|
|
84
84
|
secureKeys.set(ASSISTANT_API_KEY, "sk-test-key");
|
|
85
|
-
expect(await
|
|
85
|
+
expect(await hasCloudProxyPrereqs()).toBe(true);
|
|
86
86
|
});
|
|
87
87
|
});
|
|
88
88
|
|
|
89
|
-
describe("
|
|
89
|
+
describe("buildCloudBaseUrl", () => {
|
|
90
90
|
beforeEach(() => {
|
|
91
|
-
|
|
91
|
+
mockCloudBaseUrl = "https://platform.example.com";
|
|
92
92
|
secureKeys.set(ASSISTANT_API_KEY, "sk-test-key");
|
|
93
93
|
});
|
|
94
94
|
|
|
95
|
-
test("builds correct URL for
|
|
96
|
-
expect(await
|
|
95
|
+
test("builds correct URL for cloud providers", async () => {
|
|
96
|
+
expect(await buildCloudBaseUrl("anthropic")).toBe(
|
|
97
97
|
"https://platform.example.com/v1/runtime-proxy/anthropic",
|
|
98
98
|
);
|
|
99
|
-
expect(await
|
|
99
|
+
expect(await buildCloudBaseUrl("gemini")).toBe(
|
|
100
100
|
"https://platform.example.com/v1/runtime-proxy/gemini",
|
|
101
101
|
);
|
|
102
|
-
expect(await
|
|
102
|
+
expect(await buildCloudBaseUrl("openai")).toBe(
|
|
103
103
|
"https://platform.example.com/v1/runtime-proxy/openai",
|
|
104
104
|
);
|
|
105
105
|
});
|
|
106
106
|
|
|
107
107
|
test("returns managed URL for fireworks", async () => {
|
|
108
|
-
expect(await
|
|
108
|
+
expect(await buildCloudBaseUrl("fireworks")).toBe(
|
|
109
109
|
"https://platform.example.com/v1/runtime-proxy/fireworks",
|
|
110
110
|
);
|
|
111
111
|
});
|
|
112
112
|
|
|
113
|
-
test("returns undefined for non-
|
|
114
|
-
expect(await
|
|
115
|
-
expect(await
|
|
113
|
+
test("returns undefined for non-cloud providers", async () => {
|
|
114
|
+
expect(await buildCloudBaseUrl("openrouter")).toBeUndefined();
|
|
115
|
+
expect(await buildCloudBaseUrl("ollama")).toBeUndefined();
|
|
116
116
|
});
|
|
117
117
|
|
|
118
118
|
test("returns undefined for unknown provider", async () => {
|
|
119
|
-
expect(await
|
|
119
|
+
expect(await buildCloudBaseUrl("unknown-provider")).toBeUndefined();
|
|
120
120
|
});
|
|
121
121
|
|
|
122
122
|
test("returns undefined when prerequisites are missing", async () => {
|
|
123
|
-
|
|
123
|
+
mockCloudBaseUrl = "";
|
|
124
124
|
secureKeys.delete(ASSISTANT_API_KEY);
|
|
125
|
-
expect(await
|
|
126
|
-
expect(await
|
|
127
|
-
expect(await
|
|
125
|
+
expect(await buildCloudBaseUrl("anthropic")).toBeUndefined();
|
|
126
|
+
expect(await buildCloudBaseUrl("gemini")).toBeUndefined();
|
|
127
|
+
expect(await buildCloudBaseUrl("openai")).toBeUndefined();
|
|
128
128
|
});
|
|
129
129
|
});
|
|
130
130
|
|
|
131
131
|
describe("managedFallbackEnabledFor", () => {
|
|
132
132
|
beforeEach(() => {
|
|
133
|
-
|
|
133
|
+
mockCloudBaseUrl = "https://platform.example.com";
|
|
134
134
|
secureKeys.set(ASSISTANT_API_KEY, "sk-test-key");
|
|
135
135
|
});
|
|
136
136
|
|
|
137
|
-
test("returns true only for
|
|
137
|
+
test("returns true only for cloud fallback providers with prerequisites", async () => {
|
|
138
138
|
expect(await managedFallbackEnabledFor("anthropic")).toBe(true);
|
|
139
139
|
expect(await managedFallbackEnabledFor("gemini")).toBe(true);
|
|
140
140
|
expect(await managedFallbackEnabledFor("openai")).toBe(true);
|
|
141
141
|
});
|
|
142
142
|
|
|
143
|
-
test("returns false for non-
|
|
143
|
+
test("returns false for non-cloud provider", async () => {
|
|
144
144
|
expect(await managedFallbackEnabledFor("ollama")).toBe(false);
|
|
145
145
|
});
|
|
146
146
|
|
|
@@ -149,7 +149,7 @@ describe("managedFallbackEnabledFor", () => {
|
|
|
149
149
|
});
|
|
150
150
|
|
|
151
151
|
test("returns false when prerequisites are missing", async () => {
|
|
152
|
-
|
|
152
|
+
mockCloudBaseUrl = "";
|
|
153
153
|
secureKeys.delete(ASSISTANT_API_KEY);
|
|
154
154
|
expect(await managedFallbackEnabledFor("anthropic")).toBe(false);
|
|
155
155
|
expect(await managedFallbackEnabledFor("gemini")).toBe(false);
|