@mycadet/assistant 0.12.9 → 0.12.10
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/Dockerfile +0 -8
- package/eslint-rules/__tests__/cli-no-daemon-internals.test.ts +1 -1
- package/openapi.yaml +62 -910
- package/package.json +3 -7
- package/scripts/build-test-fixtures.ts +1 -1
- package/scripts/generate-openapi.ts +22 -6
- package/scripts/postinstall.ts +4 -10
- package/scripts/run-tests.ts +0 -21
- package/src/__tests__/adaptive-thinking-repair.test.ts +19 -57
- package/src/__tests__/agent-loop.test.ts +0 -76
- package/src/__tests__/anthropic-provider.test.ts +6 -6
- package/src/__tests__/assert-not-live-db.ts +1 -1
- package/src/__tests__/assistant-id-boundary-guard.test.ts +3 -3
- package/src/__tests__/attachments-store-heic-normalize.test.ts +1 -1
- package/src/__tests__/attachments-store.test.ts +1 -1
- package/src/__tests__/audit-log-rotation.test.ts +1 -1
- package/src/__tests__/btw-routes.test.ts +1 -1
- package/src/__tests__/byok-default-profile-ensure.test.ts +21 -27
- package/src/__tests__/call-conversation-messages.test.ts +0 -5
- package/src/__tests__/call-recovery.test.ts +2 -7
- package/src/__tests__/call-routes-http.test.ts +0 -12
- package/src/__tests__/call-store.test.ts +2 -7
- package/src/__tests__/catalog-files.test.ts +7 -5
- package/src/__tests__/checker.test.ts +1 -1
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +4 -4
- package/src/__tests__/cloud-client-verify-credential.test.ts +0 -4
- package/src/__tests__/cloud-credential-catalog-cli.test.ts +14 -14
- package/src/__tests__/cloud-profile-guard.test.ts +48 -401
- package/src/__tests__/compaction-events.test.ts +2 -2
- package/src/__tests__/config-loader-backfill.test.ts +74 -163
- package/src/__tests__/config-loader-cloud-defaults.test.ts +11 -11
- package/src/__tests__/config-loader-corrupt.test.ts +10 -10
- package/src/__tests__/config-loader-quarantine-notice.test.ts +7 -7
- package/src/__tests__/config-loader-validation-reset-notice.test.ts +11 -11
- package/src/__tests__/config-schema.test.ts +26 -27
- package/src/__tests__/config-set-route.test.ts +2 -6
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +28 -300
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +39 -246
- package/src/__tests__/conversation-agent-loop.test.ts +2 -58
- package/src/__tests__/conversation-clear-safety.test.ts +0 -30
- package/src/__tests__/conversation-inference-profile-route.test.ts +1 -1
- package/src/__tests__/conversation-queue.test.ts +1 -1
- package/src/__tests__/conversation-runtime-assembly.test.ts +1 -1
- package/src/__tests__/conversation-skill-tools.test.ts +4 -444
- package/src/__tests__/conversation-slash-commands.test.ts +1 -1
- package/src/__tests__/conversation-store.test.ts +1 -84
- package/src/__tests__/conversation-surface-state.test.ts +0 -16
- package/src/__tests__/credential-health-service.test.ts +14 -1
- package/src/__tests__/credential-record-retire.test.ts +1 -1
- package/src/__tests__/credential-record-write-through.test.ts +1 -1
- package/src/__tests__/credential-security-invariants.test.ts +0 -145
- package/src/__tests__/custom-profile-ensure.test.ts +1 -1
- package/src/__tests__/default-profile-catalog-fallback.test.ts +5 -15
- package/src/__tests__/deterministic-verification-control-plane.test.ts +0 -2
- package/src/__tests__/dictation-profile-store.test.ts +6 -6
- package/src/__tests__/disk-usage.test.ts +28 -164
- package/src/__tests__/docker-signing-key-bootstrap.test.ts +1 -1
- package/src/__tests__/embedding-cloud-proxy-selection.test.ts +1 -1
- package/src/__tests__/emit-event-signal.test.ts +1 -1
- package/src/__tests__/gateway-client-cloud-outbound.test.ts +3 -3
- package/src/__tests__/gateway-only-enforcement.test.ts +1 -1
- package/src/__tests__/guardian-dispatch.test.ts +0 -13
- package/src/__tests__/helpers/seed-app.ts +1 -1
- package/src/__tests__/host-cu-routes-targeted.test.ts +1 -1
- package/src/__tests__/host-shell-tool.test.ts +1 -1
- package/src/__tests__/identity-routes.test.ts +1 -1
- package/src/__tests__/inference-profile-session-handler.test.ts +1 -1
- package/src/__tests__/inference-profile-session-ipc.test.ts +1 -1
- package/src/__tests__/injector-chain.test.ts +1 -1
- package/src/__tests__/injector-config-quarantine-notice.test.ts +1 -1
- package/src/__tests__/injector-config-validation-reset-notice.test.ts +1 -1
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +1 -1
- package/src/__tests__/{platform.test.ts → layout.test.ts} +1 -1
- package/src/__tests__/list-all-apps.test.ts +1 -1
- package/src/__tests__/live-workspace-guard.test.ts +2 -2
- package/src/__tests__/llm-resolver-override-or-default.test.ts +5 -6
- package/src/__tests__/llm-resolver.test.ts +7 -7
- package/src/__tests__/llm-schema-fallback-profile.test.ts +9 -10
- package/src/__tests__/llm-usage-store.test.ts +0 -495
- package/src/__tests__/log-export-routes.test.ts +1 -1
- package/src/__tests__/mcp-config-secret-boundary.test.ts +12 -53
- package/src/__tests__/mcp-list-plugin-servers.test.ts +1 -1
- package/src/__tests__/memory-config-file-parity.test.ts +1 -1
- package/src/__tests__/memory-v2-static-injector.test.ts +1 -1
- package/src/__tests__/messages-read-boundary-guard.test.ts +0 -2
- package/src/__tests__/notification-guardian-path.test.ts +0 -7
- package/src/__tests__/onboarding-persona-write.test.ts +1 -1
- package/src/__tests__/openai-provider.test.ts +8 -8
- package/src/__tests__/path-policy.test.ts +1 -1
- package/src/__tests__/persona-resolver.test.ts +1 -1
- package/src/__tests__/plugin-app-serve-routes.test.ts +1 -1
- package/src/__tests__/plugin-effective-enabled-set.test.ts +1 -1
- package/src/__tests__/plugin-import-boundary-guard.test.ts +4 -6
- package/src/__tests__/plugin-import-boundary-reverse-guard.test.ts +0 -3
- package/src/__tests__/provider-cloud-proxy-integration.test.ts +1 -5
- package/src/__tests__/provider-connections-backfill.test.ts +10 -10
- package/src/__tests__/prune-old-conversations-job.test.ts +6 -31
- package/src/__tests__/resolve-app.test.ts +1 -1
- package/src/__tests__/run-due-schedules.test.ts +1 -1
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +0 -53
- package/src/__tests__/schedule-routes.test.ts +1 -1
- package/src/__tests__/schedule-store.test.ts +1 -1
- package/src/__tests__/secret-routes-cloud-proxy.test.ts +1 -1
- package/src/__tests__/skill-load-plugin-scope.test.ts +1 -1
- package/src/__tests__/surface-completion-compaction-boundary.test.ts +1 -1
- package/src/__tests__/tool-approval-handler.test.ts +1 -1
- package/src/__tests__/tool-audit.test.ts +5 -235
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +54 -114
- package/src/__tests__/tools-get-route.test.ts +1 -1
- package/src/__tests__/turn-outcome-read.test.ts +1 -1
- package/src/__tests__/twilio-routes.test.ts +0 -1
- package/src/__tests__/usage-attribution.test.ts +0 -31
- package/src/__tests__/verification-control-plane-policy.test.ts +3 -10
- package/src/__tests__/visible-app-context.test.ts +1 -1
- package/src/__tests__/voice-ingress-preflight.test.ts +1 -1
- package/src/__tests__/workspace-git-service.test.ts +1 -1
- package/src/__tests__/workspace-greetings.test.ts +1 -1
- package/src/acp/__tests__/helpers/acp-config-stub.ts +1 -1
- package/src/activation/progress-store.ts +1 -1
- package/src/activation/turn-hooks.ts +1 -1
- package/src/agent/loop.ts +0 -51
- package/src/apps/app-store.ts +1 -1
- package/src/avatar/__tests__/avatar-store.test.ts +2 -172
- package/src/avatar/accent-backfill.ts +1 -1
- package/src/avatar/avatar-manifest.ts +1 -1
- package/src/avatar/avatar-store.ts +10 -69
- package/src/avatar/ensure-raster.ts +1 -1
- package/src/avatar/identity-avatar.ts +1 -1
- package/src/avatar/sync-avatar.ts +1 -1
- package/src/avatar/traits-png-sync.ts +1 -1
- package/src/bundler/compiler-tools.ts +1 -1
- package/src/bundler/package-resolver.ts +1 -1
- package/src/calls/__tests__/call-controller.test.ts +25 -27
- package/src/calls/active-call-lease.ts +1 -1
- package/src/calls/call-controller.ts +3 -3
- package/src/calls/call-domain.ts +4 -8
- package/src/calls/call-store.ts +2 -76
- package/src/calls/resolve-call-tts-provider.ts +3 -3
- package/src/calls/twilio-config.ts +3 -3
- package/src/calls/twilio-rest.ts +2 -2
- package/src/calls/voice-ingress-preflight.ts +2 -2
- package/src/cli/bundled-modules.ts +0 -2
- package/src/cli/commands/__tests__/apps.test.ts +1 -1
- package/src/cli/commands/__tests__/plugins.test.ts +9 -66
- package/src/cli/commands/__tests__/ps.test.ts +67 -0
- package/src/cli/commands/auth.help.ts +2 -2
- package/src/cli/commands/avatar.ts +1 -1
- package/src/cli/commands/changelog.ts +1 -1
- package/src/cli/commands/cloud/__tests__/subscription.test.ts +2 -2
- package/src/cli/commands/cloud/index.help.ts +1 -1
- package/src/cli/commands/cloud/index.ts +2 -2
- package/src/cli/commands/db/refresh.ts +1 -1
- package/src/cli/commands/db/repair-step-conversation-backfill.ts +1 -1
- package/src/cli/commands/db/repair.ts +1 -1
- package/src/cli/commands/db/status.ts +1 -1
- package/src/cli/commands/inference-profiles.ts +1 -12
- package/src/cli/commands/memory/__tests__/memory-v3.test.ts +1 -116
- package/src/cli/commands/memory/index.help.ts +1 -43
- package/src/cli/commands/memory/memory-v3.ts +0 -64
- package/src/cli/commands/plugins.ts +54 -205
- package/src/cli/commands/ps.ts +5 -2
- package/src/cli/commands/status.ts +1 -1
- package/src/cli/index.help.ts +0 -2
- package/src/cli/lib/__tests__/inspect-plugin.test.ts +36 -66
- package/src/cli/lib/__tests__/install-from-cloud.test.ts +1 -1
- package/src/cli/lib/__tests__/install-from-github.test.ts +41 -117
- package/src/cli/lib/__tests__/plugin-catalog-cache.test.ts +2 -185
- package/src/cli/lib/__tests__/plugin-catalog-resolve.test.ts +36 -66
- package/src/cli/lib/__tests__/plugin-catalog-visibility.test.ts +4 -6
- package/src/cli/lib/__tests__/plugin-details.test.ts +113 -96
- package/src/cli/lib/__tests__/search-plugins.test.ts +9 -16
- package/src/cli/lib/__tests__/uninstall-plugin.test.ts +1 -1
- package/src/cli/lib/__tests__/upgrade-plugin.test.ts +38 -15
- package/src/cli/lib/diff-plugin.ts +1 -1
- package/src/cli/lib/inspect-plugin.ts +13 -97
- package/src/cli/lib/install-from-cloud.ts +1 -1
- package/src/cli/lib/install-from-github.ts +75 -154
- package/src/cli/lib/install-plugin-dependencies.ts +1 -1
- package/src/cli/lib/list-installed-plugins.ts +1 -1
- package/src/cli/lib/open-browser.ts +1 -1
- package/src/cli/lib/plugin-catalog-cache.ts +8 -51
- package/src/cli/lib/plugin-catalog-resolve.ts +3 -22
- package/src/cli/lib/plugin-details.ts +5 -27
- package/src/cli/lib/plugin-marketplace.ts +18 -266
- package/src/cli/lib/search-plugins.ts +23 -43
- package/src/cli/lib/toggle-plugin.ts +1 -1
- package/src/cli/lib/uninstall-plugin.ts +1 -1
- package/src/cli/lib/upgrade-plugin.ts +3 -49
- package/src/cli/program.ts +1 -3
- package/src/cli.ts +1 -1
- package/src/cloud/client.ts +0 -6
- package/src/cloud/consent-cache.test.ts +22 -201
- package/src/cloud/consent-cache.ts +16 -111
- package/src/cloud/sync-identity.ts +1 -1
- package/src/config/__tests__/chat-settings.test.ts +1 -1
- package/src/config/__tests__/cloud-identity.test.ts +15 -2
- package/src/config/__tests__/default-plugin-skill-discovery.test.ts +1 -1
- package/src/config/__tests__/default-profile-catalog.test.ts +12 -51
- package/src/config/__tests__/deployment-context-defaults.test.ts +13 -13
- package/src/config/__tests__/loader-callsite-strip-fallback.test.ts +4 -4
- package/src/config/__tests__/loader-last-known-good.test.ts +9 -9
- package/src/config/__tests__/loader-sparse-array-cleanup.test.ts +7 -7
- package/src/config/__tests__/plugin-resident-skill-discovery.test.ts +1 -1
- package/src/config/__tests__/profile-materialization.test.ts +2 -4
- package/src/config/__tests__/sync-gated-profiles.test.ts +1 -106
- package/src/config/acp-agent-write.ts +1 -1
- package/src/config/bundled-skills/settings/tools/open-system-settings.test.ts +1 -1
- package/src/config/bundled-skills/settings/tools/open-system-settings.ts +1 -1
- package/src/config/call-site-defaults.ts +0 -6
- package/src/config/cloud-identity.ts +12 -5
- package/src/config/composer-preferences.ts +1 -1
- package/src/config/default-profile-catalog.ts +8 -75
- package/src/config/default-profile-names.ts +2 -25
- package/src/config/env-registry.ts +1 -14
- package/src/config/env.ts +8 -6
- package/src/config/llm-resolver.ts +1 -2
- package/src/config/loader.ts +13 -17
- package/src/config/profile-materialization.ts +1 -1
- package/src/config/schema.ts +1 -7
- package/src/config/schemas/call-site-catalog.ts +0 -7
- package/src/config/schemas/llm.ts +22 -27
- package/src/config/seed-inference-profiles.ts +16 -17
- package/src/config/skills.ts +2 -2
- package/src/config/sync-gated-profiles.ts +6 -24
- package/src/credential-health/credential-health-service.ts +10 -3
- package/src/daemon/approval-generators.ts +3 -3
- package/src/daemon/config-watcher.ts +2 -2
- package/src/daemon/conversation-agent-loop-handlers.ts +0 -18
- package/src/daemon/conversation-agent-loop.ts +6 -97
- package/src/daemon/conversation-process.ts +1 -1
- package/src/daemon/conversation-skill-tools.ts +4 -72
- package/src/daemon/conversation-store.ts +1 -1
- package/src/daemon/conversation-surface-state.ts +0 -33
- package/src/daemon/conversation-surfaces.ts +1 -86
- package/src/daemon/conversation-tool-setup.test.ts +1 -1
- package/src/daemon/conversation-tool-setup.ts +0 -23
- package/src/daemon/conversation.ts +3 -5
- package/src/daemon/daemon-control.ts +3 -3
- package/src/daemon/dictation-profile-store.ts +3 -3
- package/src/daemon/event-loop-watchdog.test.ts +2 -198
- package/src/daemon/event-loop-watchdog.ts +0 -185
- package/src/daemon/external-plugins-bootstrap.ts +1 -1
- package/src/daemon/first-greeting.ts +1 -1
- package/src/daemon/handlers/skills.ts +1 -1
- package/src/daemon/host-app-control-proxy.ts +1 -1
- package/src/daemon/host-cu-proxy.ts +2 -2
- package/src/daemon/identity-helpers.ts +1 -1
- package/src/daemon/lifecycle.ts +11 -15
- package/src/daemon/main.ts +1 -1
- package/src/daemon/now-scratchpad.ts +1 -1
- package/src/daemon/process-message.ts +4 -4
- package/src/daemon/profiler-run-store.ts +2 -2
- package/src/daemon/providers-setup.ts +2 -2
- package/src/daemon/shutdown-handlers.ts +0 -10
- package/src/daemon/sqlite-corruption-watchdog.test.ts +2 -142
- package/src/daemon/sqlite-corruption-watchdog.ts +17 -81
- package/src/daemon/tool-side-effects.ts +1 -1
- package/src/desktop/desktop-session-manager.ts +1 -1
- package/src/desktop/desktop-wallpaper-renderer.ts +1 -1
- package/src/heartbeat/heartbeat-service.ts +1 -1
- package/src/home/feed-writer.ts +1 -1
- package/src/home/home-greeting-cache.ts +1 -1
- package/src/home/relationship-state-writer.ts +2 -2
- package/src/hooks/__tests__/hook-live-reload.test.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/oauth-callback-url.ts +3 -3
- package/src/ipc/__tests__/attachment-ipc.test.ts +1 -1
- package/src/ipc/socket-path.ts +1 -1
- package/src/live-voice/__tests__/live-voice-archive.test.ts +1 -1
- package/src/live-voice/__tests__/live-voice-vad.test.ts +1 -1
- package/src/live-voice/live-voice-session.ts +3 -66
- package/src/mcp/__tests__/effective-config.test.ts +1 -1
- package/src/mcp/__tests__/mcp-oauth-client-registration.test.ts +2 -2
- package/src/mcp/__tests__/mcp-oauth-provider.test.ts +2 -3
- package/src/mcp/__tests__/reload-signal-emission.test.ts +1 -1
- package/src/mcp/__tests__/reload-signal.test.ts +1 -1
- package/src/mcp/__tests__/workspace-mcp-config.test.ts +19 -21
- package/src/mcp/reload-signal.ts +1 -1
- package/src/mcp/workspace-mcp-config.ts +1 -23
- package/src/messaging/draft-store.ts +1 -1
- package/src/monitoring/__tests__/active-conversations.test.ts +1 -1
- package/src/monitoring/__tests__/page-cache.test.ts +1 -1
- package/src/monitoring/__tests__/stall-capture.test.ts +1 -1
- package/src/monitoring/__tests__/workspace-git-heartbeat.test.ts +1 -1
- package/src/monitoring/active-conversations.ts +1 -1
- package/src/monitoring/control.ts +1 -1
- package/src/monitoring/daemon-boot-time.ts +1 -1
- package/src/monitoring/daemon-heartbeat.ts +1 -1
- package/src/monitoring/page-cache.ts +1 -1
- package/src/monitoring/plugin-auto-update.ts +1 -7
- package/src/monitoring/plugin-source-watch.ts +1 -1
- package/src/monitoring/recovery/db.ts +1 -1
- package/src/monitoring/recovery/inflight-content.ts +1 -1
- package/src/monitoring/resource-sampler.ts +3 -14
- package/src/monitoring/stall-capture.ts +1 -1
- package/src/monitoring/worker.ts +9 -76
- package/src/monitoring/workspace-git-heartbeat.ts +1 -1
- package/src/oauth/connect-orchestrator.ts +4 -4
- package/src/permissions/checker.ts +1 -1
- package/src/permissions/workspace-policy.ts +1 -1
- package/src/persistence/__tests__/main-db-readonly-probe.ts +27 -52
- package/src/persistence/__tests__/message-content-file.test.ts +1 -1
- package/src/persistence/__tests__/slow-sync-log.test.ts +0 -2
- package/src/persistence/attachments-store.ts +1 -1
- package/src/persistence/conversation-crud.ts +1 -38
- package/src/persistence/conversation-directories.ts +1 -1
- package/src/persistence/conversation-types.ts +0 -8
- package/src/persistence/db-async-query.ts +1 -1
- package/src/persistence/db-connection.ts +11 -1
- package/src/persistence/db-init.ts +1 -1
- package/src/persistence/db-maintenance.ts +1 -1
- package/src/persistence/embeddings/__tests__/embedding-local-lifecycle.test.ts +1 -1
- package/src/persistence/embeddings/embedding-local.ts +4 -4
- package/src/persistence/embeddings/embedding-runtime-manager.ts +1 -1
- package/src/persistence/embeddings/qdrant-client.ts +1 -1
- package/src/persistence/embeddings/qdrant-manager.ts +1 -1
- package/src/persistence/job-handlers/__tests__/message-lexical-backfill.test.ts +1 -1
- package/src/persistence/job-handlers/__tests__/message-lexical-enqueue.test.ts +1 -1
- package/src/persistence/job-handlers/cleanup.ts +8 -17
- package/src/persistence/llm-usage-store.ts +2 -229
- package/src/persistence/message-content-file.ts +1 -1
- package/src/persistence/migrations/209-strip-thinking-from-consolidated.ts +1 -1
- package/src/persistence/migrations/222-strip-placeholder-sentinels-from-messages.ts +1 -1
- package/src/persistence/migrations/296-rewrite-balanced-economy-profile-pins.test.ts +1 -1
- package/src/persistence/migrations/306-rewrite-frontier-profile-pins.test.ts +1 -1
- package/src/persistence/migrations/329-move-onboarding-events-to-telemetry-db.test.ts +13 -0
- package/src/persistence/migrations/330-move-auth-fallback-events-to-telemetry-db.test.ts +13 -0
- package/src/persistence/migrations/331-move-lifecycle-events-to-telemetry-db.test.ts +13 -0
- package/src/persistence/migrations/332-move-skill-loaded-events-to-telemetry-db.test.ts +13 -0
- package/src/persistence/migrations/333-create-telemetry-events-table.test.ts +7 -4
- package/src/persistence/migrations/334-backfill-telemetry-events-outbox.test.ts +13 -0
- package/src/persistence/migrations/387-drop-telemetry-tables.ts +51 -0
- package/src/persistence/migrations/__tests__/327-create-flush-checkpoints.test.ts +9 -1
- package/src/persistence/migrations/__tests__/387-drop-telemetry-tables.test.ts +79 -0
- package/src/persistence/migrations/helpers/relocation.ts +1 -1
- package/src/persistence/migrations/run-migrations.ts +1 -1
- package/src/persistence/migrations/validate-migration-state.ts +1 -1
- package/src/persistence/raw-query.ts +1 -29
- package/src/persistence/slow-sync-log.ts +0 -23
- package/src/persistence/steps.ts +2 -0
- package/src/{telemetry → persistence}/tool-audit.ts +6 -121
- package/src/plugin-api/index.ts +1 -1
- package/src/plugin-api/plugin-name-env.ts +1 -1
- package/src/plugins/__tests__/installed-plugin-dirs.test.ts +1 -1
- package/src/plugins/collect-source-versions.ts +1 -1
- package/src/plugins/defaults/channel/package.json +1 -1
- package/src/plugins/defaults/cloud-hosted/package.json +1 -1
- package/src/plugins/defaults/compaction/package.json +1 -1
- package/src/plugins/defaults/documents/package.json +1 -1
- package/src/plugins/defaults/empty-response/package.json +1 -1
- package/src/plugins/defaults/exploration-drift/package.json +1 -1
- package/src/plugins/defaults/image-fallback/package.json +1 -1
- package/src/plugins/defaults/image-recovery/package.json +1 -1
- package/src/plugins/defaults/max-tokens-continue/package.json +1 -1
- package/src/plugins/defaults/memory/__tests__/db-async-query.test.ts +1 -1
- package/src/plugins/defaults/memory/__tests__/db-maintenance.test.ts +1 -1
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +0 -82
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-skill-card.test.ts +0 -41
- package/src/plugins/defaults/memory/__tests__/memory-tier-boundary-guard.test.ts +0 -2
- package/src/plugins/defaults/memory/memory-retrospective-job.ts +3 -52
- package/src/plugins/defaults/memory/memory-retrospective-skill-card.ts +0 -18
- package/src/plugins/defaults/memory/package.json +1 -1
- package/src/plugins/defaults/memory/paths.ts +4 -4
- package/src/plugins/defaults/memory/src/__tests__/memory-worker-routes.test.ts +1 -1
- package/src/plugins/defaults/memory/src/memory-v2-routes.ts +5 -5
- package/src/plugins/defaults/memory/src/memory-v3-routes.ts +0 -207
- package/src/plugins/defaults/memory/src/memory-worker-routes.ts +1 -1
- package/src/plugins/defaults/memory/startup.ts +1 -22
- package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +2 -253
- package/src/plugins/defaults/memory/v3/orchestrate.ts +5 -129
- package/src/plugins/defaults/memory/worker-control.ts +1 -1
- package/src/plugins/defaults/memory/worker.ts +2 -2
- package/src/plugins/defaults/session/package.json +1 -1
- package/src/plugins/defaults/surface-completion-nudge/package.json +1 -1
- package/src/plugins/defaults/task-progress/package.json +1 -1
- package/src/plugins/defaults/task-progress-nudge/package.json +1 -1
- package/src/plugins/defaults/title-generate/package.json +1 -1
- package/src/plugins/defaults/tool-error/package.json +1 -1
- package/src/plugins/defaults/tool-result-truncate/package.json +1 -1
- package/src/plugins/defaults/turn-context/package.json +1 -1
- package/src/plugins/defaults/workspace/injectors.ts +1 -1
- package/src/plugins/defaults/workspace/package.json +1 -1
- package/src/plugins/disabled-state.ts +1 -1
- package/src/plugins/ensure-plugin-api-shim.ts +1 -1
- package/src/plugins/ensure-shared-dep-links.ts +1 -1
- package/src/plugins/installed-plugin-dirs.ts +1 -1
- package/src/plugins/mcp-servers.ts +7 -9
- package/src/plugins/mtime-cache.ts +2 -2
- package/src/plugins/source-versions.ts +1 -1
- package/src/prompts/bootstrap-cleanup.ts +1 -1
- package/src/prompts/persona-resolver.ts +1 -1
- package/src/prompts/sections.ts +2 -2
- package/src/prompts/system-prompt.ts +10 -42
- package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +0 -37
- package/src/providers/__tests__/cadet-connection-routing.test.ts +2 -2
- package/src/providers/cadet/client.ts +1 -1
- package/src/providers/inference/__tests__/base-url-route-validation.test.ts +1 -1
- package/src/providers/inference/adapter-factory.ts +1 -1
- package/src/providers/inference/backfill.ts +3 -10
- package/src/providers/inference/profile-probe.ts +1 -1
- package/src/providers/retry.ts +0 -2
- package/src/providers/types.ts +0 -7
- package/src/providers/usage-tracking.ts +1 -1
- package/src/routes/__tests__/route-host.test.ts +1 -1
- package/src/routes/control.ts +1 -1
- package/src/routes/route-host-client.ts +1 -1
- package/src/routes/worker.ts +2 -2
- package/src/runtime/agent-wake.ts +1 -1
- package/src/runtime/assistant-stream-state.ts +1 -1
- package/src/runtime/auth/token-service.ts +1 -1
- package/src/runtime/background-job-runner.ts +1 -1
- package/src/runtime/middleware/twilio-validation.ts +2 -2
- package/src/runtime/routes/__tests__/app-pin-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/apps-refresh-route.test.ts +1 -1
- package/src/runtime/routes/__tests__/avatar-state-routes.test.ts +3 -33
- package/src/runtime/routes/__tests__/cloud-credits-routes.test.ts +5 -4
- package/src/runtime/routes/__tests__/cloud-invoice-routes.test.ts +4 -3
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +59 -287
- package/src/runtime/routes/__tests__/default-plugin-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/deprecated-route-context.test.ts +15 -62
- package/src/runtime/routes/__tests__/inference-profiles-routes.test.ts +105 -12
- package/src/runtime/routes/__tests__/ingress-status-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/monitoring-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +47 -211
- package/src/runtime/routes/__tests__/route-host-worker-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/schedule-routes-disarm-reason.test.ts +1 -1
- package/src/runtime/routes/__tests__/schedule-worker-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/user-route-dispatcher-host.test.ts +1 -1
- package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +1 -1
- package/src/runtime/routes/__tests__/user-routes-cli.test.ts +1 -1
- package/src/runtime/routes/__tests__/user-routes-notices.test.ts +1 -1
- package/src/runtime/routes/__tests__/user-routes-request.test.ts +1 -1
- package/src/runtime/routes/app-management-routes.ts +1 -1
- package/src/runtime/routes/attachment-routes.ts +1 -1
- package/src/runtime/routes/audit-routes.ts +1 -1
- package/src/runtime/routes/avatar-routes.ts +3 -10
- package/src/runtime/routes/cloud-routes.ts +3 -3
- package/src/runtime/routes/content-source-routes.ts +1 -1
- package/src/runtime/routes/conversation-query-routes.ts +60 -621
- package/src/runtime/routes/conversation-routes.ts +1 -38
- package/src/runtime/routes/debug-routes.ts +1 -1
- package/src/runtime/routes/deprecated-route-context.ts +5 -61
- package/src/runtime/routes/heartbeat-routes.ts +1 -1
- package/src/runtime/routes/identity-routes.ts +1 -1
- package/src/runtime/routes/index.ts +0 -6
- package/src/runtime/routes/inference-profile-session-handler.ts +3 -3
- package/src/runtime/routes/inference-profiles-routes.ts +48 -21
- package/src/runtime/routes/inference-provider-connection-routes.ts +0 -1
- package/src/runtime/routes/llm-call-sites-routes.ts +3 -3
- package/src/runtime/routes/log-export/__tests__/installed-inventory.test.ts +1 -1
- package/src/runtime/routes/log-export/__tests__/workspace-allowlist-error-contract.test.ts +1 -1
- package/src/runtime/routes/log-export/__tests__/workspace-allowlist.test.ts +1 -1
- package/src/runtime/routes/log-export/workspace-allowlist.ts +1 -1
- package/src/runtime/routes/log-export-routes.ts +17 -15
- package/src/runtime/routes/migration-rollback-routes.ts +1 -1
- package/src/runtime/routes/migration-routes.ts +2 -3
- package/src/runtime/routes/monitoring-routes.ts +2 -2
- package/src/runtime/routes/oauth-providers.ts +5 -5
- package/src/runtime/routes/plugins-routes.ts +38 -163
- package/src/runtime/routes/profiler-routes.ts +1 -1
- package/src/runtime/routes/route-host-worker-routes.ts +1 -1
- package/src/runtime/routes/sanity-routes.ts +1 -1
- package/src/runtime/routes/schedule-routes.ts +1 -1
- package/src/runtime/routes/schedule-worker-routes.ts +1 -1
- package/src/runtime/routes/settings-routes.ts +1 -1
- package/src/runtime/routes/sounds-config-routes.ts +1 -1
- package/src/runtime/routes/surface-conversation-resolver.ts +1 -7
- package/src/runtime/routes/user-route-dispatcher.ts +1 -3
- package/src/runtime/routes/user-route-import.ts +1 -1
- package/src/runtime/routes/user-route-resolution.ts +1 -1
- package/src/runtime/routes/user-routes-cli.ts +1 -1
- package/src/runtime/routes/workspace-commit-routes.ts +1 -1
- package/src/runtime/routes/workspace-greetings.ts +1 -1
- package/src/runtime/routes/workspace-routes.ts +1 -1
- package/src/runtime/routes/workspace-utils.ts +1 -1
- package/src/runtime/sync/resource-sync-events.ts +1 -1
- package/src/schedule/__tests__/plugin-schedule-declarations.test.ts +1 -1
- package/src/schedule/__tests__/plugin-schedule-reconciler.test.ts +1 -1
- package/src/schedule/plugin-schedule-availability.ts +1 -1
- package/src/schedule/plugin-schedule-declarations.ts +1 -1
- package/src/schedule/run-script.ts +1 -1
- package/src/schedule/scheduler.ts +1 -11
- package/src/schedule/worker-control.ts +1 -1
- package/src/schedule/worker.ts +3 -3
- package/src/security/oauth2.ts +2 -2
- package/src/security/secret-allowlist.ts +1 -1
- package/src/signals/cancel.ts +1 -1
- package/src/signals/conversation-undo.ts +1 -1
- package/src/signals/emit-event.ts +1 -1
- package/src/signals/event-stream.ts +1 -1
- package/src/signals/user-message.ts +1 -1
- package/src/skills/catalog-install.ts +2 -1
- package/src/skills/clawhub.ts +1 -1
- package/src/skills/cloud-store.ts +1 -1
- package/src/skills/path-classifier.ts +1 -1
- package/src/skills/skill-history.ts +1 -1
- package/src/skills/skillssh-registry.ts +1 -1
- package/src/skills/uninstall.ts +1 -1
- package/src/skills/workspace-skill-md-signature.ts +1 -1
- package/src/subagent/manager.ts +1 -1
- package/src/theme/workspace-theme.ts +1 -1
- package/src/tools/browser/auth-cache.ts +1 -1
- package/src/tools/browser/browser-manager.ts +1 -1
- package/src/tools/browser/runtime-check.ts +1 -1
- package/src/tools/executor.ts +4 -4
- package/src/tools/filesystem/write.ts +1 -1
- package/src/tools/permission-checker.ts +2 -51
- package/src/tools/run-standalone.ts +1 -1
- package/src/tools/skills/format-input-schema.ts +1 -1
- package/src/tools/skills/load.ts +1 -1
- package/src/tools/skills/scaffold-cloud.ts +0 -32
- package/src/tools/terminal/safe-env.ts +1 -2
- package/src/tools/terminal/sanitized-bash.ts +1 -1
- package/src/tools/terminal/shell.ts +1 -1
- package/src/tools/tool-approval-handler.ts +4 -1
- package/src/tools/workflows/manage-workflows.ts +2 -2
- package/src/tools/workflows/run-workflow.test.ts +1 -1
- package/src/tools/workspace-tools/loader.ts +1 -1
- package/src/tts/synthesis-stream.ts +2 -2
- package/src/usage/attribution.ts +1 -11
- package/src/util/browser.ts +1 -1
- package/src/util/bun-runtime.ts +2 -1
- package/src/util/device-id.ts +1 -1
- package/src/util/disk-usage.ts +4 -139
- package/src/util/layout.ts +3 -3
- package/src/util/logger.ts +1 -1
- package/src/util/logs-db-path.ts +1 -1
- package/src/util/memory-db-path.ts +1 -1
- package/src/util/{platform.ts → os.ts} +5 -30
- package/src/util/process-tree.ts +19 -0
- package/src/util/sqlite3-runtime.ts +1 -1
- package/src/util/telemetry-db-path.ts +1 -1
- package/src/watcher/__tests__/engine.test.ts +0 -23
- package/src/watcher/engine.ts +0 -7
- package/src/windows-compiled-cli.ts +0 -4
- package/src/windows-compiled-worker-entry.ts +0 -6
- package/src/workflows/leaf-runner.test.ts +1 -1
- package/src/workflows/leaf-runner.ts +1 -1
- package/src/workflows/library.ts +1 -1
- package/src/workspace/adaptive-thinking-repair.ts +5 -24
- package/src/workspace/byok-default-profile-ensure.ts +24 -26
- package/src/workspace/custom-profile-ensure.ts +2 -2
- package/src/workspace/git-service.ts +1 -1
- package/src/workspace/hatched-date.ts +1 -1
- package/src/workspace/migrations/038-unify-llm-callsite-configs.ts +2 -2
- package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +1 -1
- package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +1 -1
- package/src/workspace/migrations/077-seed-memory-router-callsite.ts +1 -1
- package/src/workspace/migrations/registry.ts +0 -4
- package/src/workspace/turn-commit.ts +1 -1
- package/docs/activation-funnel-telemetry.md +0 -324
- package/scripts/bundled-plugin-packages.ts +0 -154
- package/scripts/generate-bundled-plugin-packages.ts +0 -29
- package/src/__tests__/activation-early-marking.test.ts +0 -114
- package/src/__tests__/auth-fallback-events-store.test.ts +0 -99
- package/src/__tests__/config-get-vision-flag.test.ts +0 -139
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +0 -400
- package/src/__tests__/internal-telemetry-routes.test.ts +0 -213
- package/src/__tests__/telemetry-routes.test.ts +0 -182
- package/src/__tests__/turn-events-store.test.ts +0 -376
- package/src/__tests__/ui-channel-variants.test.ts +0 -53
- package/src/avatar/__tests__/avatar-changed-telemetry.test.ts +0 -217
- package/src/avatar/avatar-changed-telemetry.ts +0 -128
- package/src/calls/__tests__/call-funnel-telemetry.test.ts +0 -204
- package/src/cli/commands/telemetry.help.ts +0 -27
- package/src/cli/commands/telemetry.ts +0 -83
- package/src/cli/lib/__tests__/local-plugin-upgrade.test.ts +0 -251
- package/src/cli/lib/__tests__/plugin-catalog-local.test.ts +0 -113
- package/src/cli/lib/__tests__/plugin-marketplace.test.ts +0 -384
- package/src/cli/lib/__tests__/plugin-pin-history.test.ts +0 -164
- package/src/cli/lib/__tests__/plugins-install-offline.test.ts +0 -228
- package/src/cli/lib/bundled-marketplace.json +0 -1575
- package/src/cli/lib/bundled-plugin-packages.json +0 -827
- package/src/cli/lib/bundled-plugin-packages.ts +0 -87
- package/src/cli/lib/plugin-catalog-local.ts +0 -94
- package/src/cli/lib/plugin-pin-history.ts +0 -276
- package/src/cloud/feature-gate.ts +0 -8
- package/src/config/__tests__/cloud-rehydration.test.ts +0 -180
- package/src/config/cloud-rehydration.ts +0 -35
- package/src/daemon/__tests__/auto-profile-router.test.ts +0 -380
- package/src/daemon/auto-profile-router.ts +0 -428
- package/src/live-voice/__tests__/live-voice-session-telemetry.test.ts +0 -391
- package/src/monitoring/__tests__/db-integrity-sample.test.ts +0 -113
- package/src/monitoring/__tests__/oom-kill-reporter.test.ts +0 -374
- package/src/monitoring/db-integrity-check.ts +0 -163
- package/src/monitoring/db-integrity-sample.ts +0 -176
- package/src/monitoring/oom-kill-reporter.ts +0 -469
- package/src/onboarding/__tests__/onboarding-events-store.test.ts +0 -158
- package/src/onboarding/onboarding-events-store.ts +0 -296
- package/src/persistence/__tests__/raw-query-telemetry.test.ts +0 -76
- package/src/persistence/lifecycle-events-store.test.ts +0 -134
- package/src/persistence/lifecycle-events-store.ts +0 -110
- package/src/plugins/defaults/memory/__tests__/activation-session-store.test.ts +0 -76
- package/src/plugins/defaults/memory/activation-session-store.ts +0 -50
- package/src/plugins/defaults/memory/src/__tests__/memory-v3-gate-stats.test.ts +0 -281
- package/src/runtime/routes/auto-profile-routes.ts +0 -83
- package/src/runtime/routes/internal-telemetry-routes.ts +0 -142
- package/src/runtime/routes/telemetry-routes.ts +0 -274
- package/src/security/auth-fallback-events-store.ts +0 -57
- package/src/telemetry/__tests__/activation-funnel.test.ts +0 -95
- package/src/telemetry/__tests__/config-setting-events-store.test.ts +0 -63
- package/src/telemetry/__tests__/config-setting-snapshot.test.ts +0 -143
- package/src/telemetry/__tests__/flush-checkpoints.test.ts +0 -56
- package/src/telemetry/__tests__/live-voice-funnel.test.ts +0 -174
- package/src/telemetry/__tests__/outbox-test-harness.ts +0 -85
- package/src/telemetry/__tests__/phone-call-funnel.test.ts +0 -72
- package/src/telemetry/__tests__/telemetry-event-fixtures.ts +0 -282
- package/src/telemetry/__tests__/watchdog-events-store.test.ts +0 -71
- package/src/telemetry/activation-funnel.ts +0 -172
- package/src/telemetry/config-setting-events-store.ts +0 -40
- package/src/telemetry/config-setting-snapshot.ts +0 -170
- package/src/telemetry/flush-checkpoints.ts +0 -70
- package/src/telemetry/live-voice-funnel.ts +0 -185
- package/src/telemetry/memory-corpus-size.test.ts +0 -120
- package/src/telemetry/memory-corpus-size.ts +0 -184
- package/src/telemetry/memory-tier-reporter.test.ts +0 -195
- package/src/telemetry/memory-tier-reporter.ts +0 -130
- package/src/telemetry/phone-call-funnel.ts +0 -144
- package/src/telemetry/skill-loaded-events-store.test.ts +0 -93
- package/src/telemetry/skill-loaded-events-store.ts +0 -39
- package/src/telemetry/telemetry-event-sources.test.ts +0 -223
- package/src/telemetry/telemetry-event-sources.ts +0 -597
- package/src/telemetry/telemetry-events-outbox.test.ts +0 -375
- package/src/telemetry/telemetry-events-outbox.ts +0 -237
- package/src/telemetry/telemetry-main-db.ts +0 -48
- package/src/telemetry/telemetry-wire-source.json +0 -4
- package/src/telemetry/telemetry-wire-validation.test.ts +0 -157
- package/src/telemetry/telemetry-wire-validation.ts +0 -162
- package/src/telemetry/telemetry-wire.generated.ts +0 -483
- package/src/telemetry/tool-executed-events-store.test.ts +0 -210
- package/src/telemetry/tool-executed-events-store.ts +0 -102
- package/src/telemetry/trace-collection-policy.test.ts +0 -28
- package/src/telemetry/trace-collection-policy.ts +0 -30
- package/src/telemetry/turn-events-store.ts +0 -216
- package/src/telemetry/turn-trace-store.test.ts +0 -884
- package/src/telemetry/turn-trace-store.ts +0 -399
- package/src/telemetry/types.test.ts +0 -38
- package/src/telemetry/types.ts +0 -780
- package/src/telemetry/usage-telemetry-reporter.test.ts +0 -3445
- package/src/telemetry/usage-telemetry-reporter.ts +0 -566
- package/src/telemetry/watchdog-direct-emit.test.ts +0 -112
- package/src/telemetry/watchdog-direct-emit.ts +0 -104
- package/src/telemetry/watchdog-events-store.ts +0 -31
- package/src/tools/ui-surface/channel-variants.ts +0 -52
- package/src/watcher/__tests__/telemetry.test.ts +0 -178
- package/src/watcher/telemetry.ts +0 -93
- package/src/workspace/migrations/097-enable-adaptive-thinking-managed-profiles.ts +0 -165
- package/src/workspace/migrations/104-recheck-adaptive-thinking-model-implied-anthropic.ts +0 -151
- /package/src/{telemetry → persistence}/tool-usage-store.ts +0 -0
- /package/src/{telemetry → persistence}/turn-outcome.ts +0 -0
|
@@ -10,7 +10,6 @@ import {
|
|
|
10
10
|
getEffectiveProfiles,
|
|
11
11
|
getEffectiveProfilesForProvider,
|
|
12
12
|
getUserSelectableProfilesForProvider,
|
|
13
|
-
MANAGED_PROFILE_TEMPLATES,
|
|
14
13
|
PROFILE_IMPLS,
|
|
15
14
|
resolveDefaultProfileForProvider,
|
|
16
15
|
} from "../default-profile-catalog.js";
|
|
@@ -32,11 +31,11 @@ import {
|
|
|
32
31
|
type ProfileEntry,
|
|
33
32
|
} from "../schemas/llm.js";
|
|
34
33
|
|
|
35
|
-
/** Thin managed
|
|
36
|
-
*
|
|
34
|
+
/** Thin managed stubs: a workspace that carries only the cadet-provider
|
|
35
|
+
* marker for the defaults, no profile content. */
|
|
37
36
|
function managedStubs(): Record<string, ProfileEntry> {
|
|
38
37
|
return Object.fromEntries(
|
|
39
|
-
DEFAULT_PROFILE_KEYS.map((key) => [key, {
|
|
38
|
+
DEFAULT_PROFILE_KEYS.map((key) => [key, { provider: "cadet" as const }]),
|
|
40
39
|
);
|
|
41
40
|
}
|
|
42
41
|
|
|
@@ -48,7 +47,6 @@ describe("getEffectiveProfiles", () => {
|
|
|
48
47
|
expect(typeof body.model).toBe("string");
|
|
49
48
|
expect(body.provider).toBe("cadet");
|
|
50
49
|
expect(body.provider_connection).toBeUndefined();
|
|
51
|
-
expect(body.source).toBe("managed");
|
|
52
50
|
}
|
|
53
51
|
});
|
|
54
52
|
|
|
@@ -80,35 +78,6 @@ describe("getEffectiveProfiles", () => {
|
|
|
80
78
|
).toBeUndefined();
|
|
81
79
|
});
|
|
82
80
|
|
|
83
|
-
test("the Auto profile is the cloud Balanced body relabeled, managed-only, and flag-gated", () => {
|
|
84
|
-
const auto = CODE_DEFAULT_PROFILE_ENTRIES.auto;
|
|
85
|
-
const balanced = CODE_DEFAULT_PROFILE_ENTRIES.balanced;
|
|
86
|
-
expect(auto.label).toBe("Auto");
|
|
87
|
-
expect(auto.model).toBe(balanced.model);
|
|
88
|
-
expect(auto.provider).toBe(balanced.provider);
|
|
89
|
-
expect(auto.fallbackProfile).toBeUndefined();
|
|
90
|
-
// Not seeded unconditionally: the flag reconcile writes the stub.
|
|
91
|
-
expect(Object.keys(MANAGED_PROFILE_TEMPLATES)).not.toContain("auto");
|
|
92
|
-
expect(
|
|
93
|
-
resolveDefaultProfileForProvider(undefined, "auto", undefined),
|
|
94
|
-
).toBeUndefined();
|
|
95
|
-
const stub: Record<string, ProfileEntry> = { auto: { source: "managed" } };
|
|
96
|
-
expect(
|
|
97
|
-
resolveDefaultProfileForProvider(stub, "auto", undefined)?.model,
|
|
98
|
-
).toBe(balanced.model);
|
|
99
|
-
expect(
|
|
100
|
-
resolveDefaultProfileForProvider(stub, "auto", {
|
|
101
|
-
provider: "anthropic",
|
|
102
|
-
provider_connection: "anthropic-personal",
|
|
103
|
-
}),
|
|
104
|
-
).toBeUndefined();
|
|
105
|
-
expect(
|
|
106
|
-
Object.keys(
|
|
107
|
-
getConversationProfilesForProvider(LLMSchema.parse({ profiles: stub })),
|
|
108
|
-
),
|
|
109
|
-
).toContain("auto");
|
|
110
|
-
});
|
|
111
|
-
|
|
112
81
|
test("the conversation view drops the cloud Jev profile but keeps it selectable for call sites", () => {
|
|
113
82
|
expect(
|
|
114
83
|
Object.keys(getConversationProfilesForProvider(undefined)),
|
|
@@ -150,15 +119,14 @@ describe("getEffectiveProfiles", () => {
|
|
|
150
119
|
expect(getEffectiveProfile({}, OS_BETA_PROFILE_KEY)).toBeUndefined();
|
|
151
120
|
});
|
|
152
121
|
|
|
153
|
-
test("a
|
|
122
|
+
test("a cadet-provider entry resolves to the code body with only label/status/topP from disk", () => {
|
|
154
123
|
const workspace: Record<string, ProfileEntry> = {
|
|
155
124
|
balanced: {
|
|
156
|
-
|
|
125
|
+
provider: "cadet",
|
|
157
126
|
label: "Balanced (Managed)",
|
|
158
127
|
status: "disabled",
|
|
159
128
|
topP: 0.7,
|
|
160
129
|
// Stale content drift on disk must lose to the code default body.
|
|
161
|
-
provider: "anthropic",
|
|
162
130
|
model: "claude-sonnet-4-6",
|
|
163
131
|
maxTokens: 1,
|
|
164
132
|
},
|
|
@@ -180,7 +148,6 @@ describe("getEffectiveProfiles", () => {
|
|
|
180
148
|
test("a user-owned profile sharing a default name wins verbatim", () => {
|
|
181
149
|
const workspace: Record<string, ProfileEntry> = {
|
|
182
150
|
balanced: {
|
|
183
|
-
source: "user",
|
|
184
151
|
provider: "anthropic",
|
|
185
152
|
model: "claude-sonnet-4-6",
|
|
186
153
|
maxTokens: 1000,
|
|
@@ -297,9 +264,8 @@ describe("resolver integration", () => {
|
|
|
297
264
|
test("a disabled managed default does not divert resolution to the custom-* clone", () => {
|
|
298
265
|
const llm = LLMSchema.parse({
|
|
299
266
|
profiles: {
|
|
300
|
-
balanced: {
|
|
267
|
+
balanced: { provider: "cadet", status: "disabled" },
|
|
301
268
|
"custom-balanced": {
|
|
302
|
-
source: "user",
|
|
303
269
|
provider: "anthropic",
|
|
304
270
|
model: "claude-sonnet-4-6",
|
|
305
271
|
maxTokens: 1000,
|
|
@@ -324,7 +290,6 @@ describe("resolver integration", () => {
|
|
|
324
290
|
const llm = LLMSchema.parse({
|
|
325
291
|
profiles: {
|
|
326
292
|
"latency-optimized": {
|
|
327
|
-
source: "user",
|
|
328
293
|
provider: "anthropic",
|
|
329
294
|
model: "claude-opus-4-6",
|
|
330
295
|
provider_connection: "anthropic-personal",
|
|
@@ -366,7 +331,6 @@ describe("resolver integration", () => {
|
|
|
366
331
|
const llm = LLMSchema.parse({
|
|
367
332
|
profiles: {
|
|
368
333
|
[key]: {
|
|
369
|
-
source: "user",
|
|
370
334
|
provider: "anthropic",
|
|
371
335
|
model: "claude-opus-4-6",
|
|
372
336
|
provider_connection: "anthropic-personal",
|
|
@@ -414,7 +378,7 @@ describe("schema validation", () => {
|
|
|
414
378
|
expect(() =>
|
|
415
379
|
LLMSchema.parse({
|
|
416
380
|
activeProfile: OS_BETA_PROFILE_KEY,
|
|
417
|
-
profiles: { [OS_BETA_PROFILE_KEY]: {
|
|
381
|
+
profiles: { [OS_BETA_PROFILE_KEY]: { provider: "cadet" } },
|
|
418
382
|
}),
|
|
419
383
|
).not.toThrow();
|
|
420
384
|
expect(() =>
|
|
@@ -485,7 +449,6 @@ describe("resolveDefaultProfileForProvider", () => {
|
|
|
485
449
|
} else {
|
|
486
450
|
expect(entry?.provider_connection).toBeDefined();
|
|
487
451
|
}
|
|
488
|
-
expect(entry?.source).toBe("managed");
|
|
489
452
|
}
|
|
490
453
|
}
|
|
491
454
|
});
|
|
@@ -507,7 +470,6 @@ describe("resolveDefaultProfileForProvider", () => {
|
|
|
507
470
|
expect(entry?.provider).toBe("chatgpt");
|
|
508
471
|
expect(entry?.model).toBe(model);
|
|
509
472
|
expect(entry?.provider_connection).toBeUndefined();
|
|
510
|
-
expect(entry?.source).toBe("managed");
|
|
511
473
|
}
|
|
512
474
|
// Budget and Fast both opt fully out of reasoning.
|
|
513
475
|
expect(effective["cost-optimized"]?.effort).toBe("none");
|
|
@@ -526,7 +488,6 @@ describe("resolveDefaultProfileForProvider", () => {
|
|
|
526
488
|
// No intent table for `together`: the intent falls back to the
|
|
527
489
|
// provider's catalog defaultModel.
|
|
528
490
|
expect(entry?.model).toBe(resolveModelIntent("together", "balanced"));
|
|
529
|
-
expect(entry?.source).toBe("managed");
|
|
530
491
|
});
|
|
531
492
|
|
|
532
493
|
test("maxTokens clamps to the resolved model's catalog output cap", () => {
|
|
@@ -599,7 +560,7 @@ describe("resolveDefaultProfileForProvider", () => {
|
|
|
599
560
|
|
|
600
561
|
test("a user-source workspace entry shadows the provider-resolved default", () => {
|
|
601
562
|
const workspace: Record<string, ProfileEntry> = {
|
|
602
|
-
balanced: {
|
|
563
|
+
balanced: { provider: "openai", model: "gpt-5.5" },
|
|
603
564
|
};
|
|
604
565
|
const entry = resolveDefaultProfileForProvider(
|
|
605
566
|
workspace,
|
|
@@ -631,10 +592,10 @@ describe("resolveDefaultProfileForProvider", () => {
|
|
|
631
592
|
}
|
|
632
593
|
});
|
|
633
594
|
|
|
634
|
-
test("a
|
|
595
|
+
test("a cadet-provider stub contributes only label/status/topP over the provider-resolved body", () => {
|
|
635
596
|
const workspace: Record<string, ProfileEntry> = {
|
|
636
597
|
balanced: {
|
|
637
|
-
|
|
598
|
+
provider: "cadet",
|
|
638
599
|
label: "Balanced (BYOK)",
|
|
639
600
|
status: "disabled",
|
|
640
601
|
topP: 0.7,
|
|
@@ -664,7 +625,7 @@ describe("resolveDefaultProfileForProvider", () => {
|
|
|
664
625
|
|
|
665
626
|
test("non-matrix names pass through like getEffectiveProfile", () => {
|
|
666
627
|
const workspace: Record<string, ProfileEntry> = {
|
|
667
|
-
"custom-mine": {
|
|
628
|
+
"custom-mine": { provider: "openai", model: "gpt-5.4" },
|
|
668
629
|
};
|
|
669
630
|
expect(
|
|
670
631
|
resolveDefaultProfileForProvider(
|
|
@@ -687,7 +648,7 @@ describe("resolveDefaultProfileForProvider", () => {
|
|
|
687
648
|
),
|
|
688
649
|
).toBeUndefined();
|
|
689
650
|
const workspace: Record<string, ProfileEntry> = {
|
|
690
|
-
[OS_BETA_PROFILE_KEY]: {
|
|
651
|
+
[OS_BETA_PROFILE_KEY]: { provider: "cadet" },
|
|
691
652
|
};
|
|
692
653
|
const entry = resolveDefaultProfileForProvider(
|
|
693
654
|
workspace,
|
|
@@ -53,7 +53,7 @@ afterAll(() => {
|
|
|
53
53
|
});
|
|
54
54
|
|
|
55
55
|
import { enableMemoryV3LiveForNewWorkspacesMigration } from "../../workspace/migrations/105-enable-memory-v3-live-for-new-workspaces.js";
|
|
56
|
-
import {
|
|
56
|
+
import { getConfig, invalidateConfigCache } from "../loader.js";
|
|
57
57
|
|
|
58
58
|
// ---------------------------------------------------------------------------
|
|
59
59
|
// Helpers
|
|
@@ -74,7 +74,7 @@ let originalIsPlatform: string | undefined;
|
|
|
74
74
|
// Tests
|
|
75
75
|
// ---------------------------------------------------------------------------
|
|
76
76
|
|
|
77
|
-
describe("deployment-context embedding-provider default (via
|
|
77
|
+
describe("deployment-context embedding-provider default (via getConfig)", () => {
|
|
78
78
|
beforeEach(() => {
|
|
79
79
|
ensureTestDir();
|
|
80
80
|
const resetPaths = [
|
|
@@ -109,7 +109,7 @@ describe("deployment-context embedding-provider default (via loadConfig)", () =>
|
|
|
109
109
|
writeConfig({});
|
|
110
110
|
process.env.IS_CLOUD = "true";
|
|
111
111
|
|
|
112
|
-
const config =
|
|
112
|
+
const config = getConfig();
|
|
113
113
|
|
|
114
114
|
// In-memory effective config reflects the cloud intent.
|
|
115
115
|
expect(config.memory.embeddings.provider).toBe("gemini");
|
|
@@ -138,7 +138,7 @@ describe("deployment-context embedding-provider default (via loadConfig)", () =>
|
|
|
138
138
|
}
|
|
139
139
|
process.env.IS_CLOUD = "true";
|
|
140
140
|
|
|
141
|
-
const config =
|
|
141
|
+
const config = getConfig();
|
|
142
142
|
|
|
143
143
|
// In-memory effective config still reflects the cloud intent.
|
|
144
144
|
expect(config.memory.embeddings.provider).toBe("gemini");
|
|
@@ -180,14 +180,14 @@ describe("deployment-context embedding-provider default (via loadConfig)", () =>
|
|
|
180
180
|
// provider leaf absent), the cloud default re-applies in memory rather
|
|
181
181
|
// than being lost to a persisted "auto" read back as an explicit choice.
|
|
182
182
|
invalidateConfigCache();
|
|
183
|
-
expect(
|
|
183
|
+
expect(getConfig().memory.embeddings.provider).toBe("gemini");
|
|
184
184
|
});
|
|
185
185
|
|
|
186
186
|
test("IS_CLOUD='1' also fills provider=gemini in memory", () => {
|
|
187
187
|
writeConfig({});
|
|
188
188
|
process.env.IS_CLOUD = "1";
|
|
189
189
|
|
|
190
|
-
const config =
|
|
190
|
+
const config = getConfig();
|
|
191
191
|
|
|
192
192
|
expect(config.memory.embeddings.provider).toBe("gemini");
|
|
193
193
|
});
|
|
@@ -198,7 +198,7 @@ describe("deployment-context embedding-provider default (via loadConfig)", () =>
|
|
|
198
198
|
});
|
|
199
199
|
process.env.IS_CLOUD = "true";
|
|
200
200
|
|
|
201
|
-
const config =
|
|
201
|
+
const config = getConfig();
|
|
202
202
|
|
|
203
203
|
expect(config.memory.embeddings.provider).toBe("local");
|
|
204
204
|
expect(config.memory.qdrant.vectorSize).toBe(384);
|
|
@@ -214,7 +214,7 @@ describe("deployment-context embedding-provider default (via loadConfig)", () =>
|
|
|
214
214
|
writeConfig({});
|
|
215
215
|
delete process.env.IS_CLOUD;
|
|
216
216
|
|
|
217
|
-
const config =
|
|
217
|
+
const config = getConfig();
|
|
218
218
|
|
|
219
219
|
expect(config.memory.embeddings.provider).toBe("auto");
|
|
220
220
|
expect(config.memory.qdrant.vectorSize).toBe(384);
|
|
@@ -226,7 +226,7 @@ describe("deployment-context embedding-provider default (via loadConfig)", () =>
|
|
|
226
226
|
}
|
|
227
227
|
delete process.env.IS_CLOUD;
|
|
228
228
|
|
|
229
|
-
const config =
|
|
229
|
+
const config = getConfig();
|
|
230
230
|
|
|
231
231
|
// In-memory effective config still carries the full tuning (schema defaults).
|
|
232
232
|
expect(config.memory.v3.gate.denseThreshold).toBe(0.66);
|
|
@@ -253,7 +253,7 @@ describe("deployment-context embedding-provider default (via loadConfig)", () =>
|
|
|
253
253
|
}
|
|
254
254
|
delete process.env.IS_CLOUD;
|
|
255
255
|
|
|
256
|
-
|
|
256
|
+
getConfig();
|
|
257
257
|
enableMemoryV3LiveForNewWorkspacesMigration.run(WORKSPACE_DIR, {
|
|
258
258
|
isNewWorkspace: true,
|
|
259
259
|
});
|
|
@@ -295,7 +295,7 @@ describe("deployment-context embedding-provider default (via loadConfig)", () =>
|
|
|
295
295
|
`{\n "memory": {\n "v3": {\n "live": true\n }\n },\n "llm": {\n "activeProf`,
|
|
296
296
|
);
|
|
297
297
|
|
|
298
|
-
const config =
|
|
298
|
+
const config = getConfig();
|
|
299
299
|
|
|
300
300
|
// The corrupt file was quarantined and the reseeded config carries the
|
|
301
301
|
// tier forward, both in-memory (this boot runs v3) and on disk
|
|
@@ -311,7 +311,7 @@ describe("deployment-context embedding-provider default (via loadConfig)", () =>
|
|
|
311
311
|
`{\n "memory": {\n "v3": {\n "live": false\n }\n },\n "llm": {\n "activeProf`,
|
|
312
312
|
);
|
|
313
313
|
|
|
314
|
-
const config =
|
|
314
|
+
const config = getConfig();
|
|
315
315
|
|
|
316
316
|
// Never carry `false` forward: an absent leaf is the only way to keep
|
|
317
317
|
// "no decision recorded" representable for migration 105.
|
|
@@ -331,7 +331,7 @@ describe("deployment-context embedding-provider default (via loadConfig)", () =>
|
|
|
331
331
|
JSON.stringify({ memory: { v3: { live: true } } }, null, 2),
|
|
332
332
|
);
|
|
333
333
|
|
|
334
|
-
const config =
|
|
334
|
+
const config = getConfig();
|
|
335
335
|
|
|
336
336
|
expect(config.memory.v3.live).toBe(true);
|
|
337
337
|
expect(readV3Raw()).toEqual({ live: true });
|
|
@@ -32,7 +32,7 @@ afterAll(() => {
|
|
|
32
32
|
});
|
|
33
33
|
|
|
34
34
|
import { resolveCallSiteConfig } from "../llm-resolver.js";
|
|
35
|
-
import {
|
|
35
|
+
import { getConfig, invalidateConfigCache } from "../loader.js";
|
|
36
36
|
|
|
37
37
|
function writeConfig(obj: unknown): void {
|
|
38
38
|
writeFileSync(CONFIG_PATH, JSON.stringify(obj, null, 2) + "\n");
|
|
@@ -84,7 +84,7 @@ describe("config recovery prunes call-site overrides emptied by a strip", () =>
|
|
|
84
84
|
// `{profile:"balanced"}` default — silently resolving to the active profile.
|
|
85
85
|
writeConfig(baseLlm({ memoryV3SelectL2: { profile: "ghost-profile" } }));
|
|
86
86
|
|
|
87
|
-
const config =
|
|
87
|
+
const config = getConfig();
|
|
88
88
|
|
|
89
89
|
// The emptied call-site entry must be pruned entirely, not left as `{}`.
|
|
90
90
|
expect(config.llm.callSites?.memoryV3SelectL2).toBeUndefined();
|
|
@@ -105,7 +105,7 @@ describe("config recovery prunes call-site overrides emptied by a strip", () =>
|
|
|
105
105
|
}),
|
|
106
106
|
);
|
|
107
107
|
|
|
108
|
-
const config =
|
|
108
|
+
const config = getConfig();
|
|
109
109
|
|
|
110
110
|
expect(config.llm.callSites?.memoryV3SelectL2).toBeUndefined();
|
|
111
111
|
expect(config.llm.callSites?.memoryRouter).toEqual({ profile: "balanced" });
|
|
@@ -119,7 +119,7 @@ describe("config recovery prunes call-site overrides emptied by a strip", () =>
|
|
|
119
119
|
baseLlm({ memoryV3SelectL2: { profile: "missing", temperature: 0.5 } }),
|
|
120
120
|
);
|
|
121
121
|
|
|
122
|
-
const config =
|
|
122
|
+
const config = getConfig();
|
|
123
123
|
|
|
124
124
|
expect(config.llm.callSites?.memoryV3SelectL2).toEqual({
|
|
125
125
|
temperature: 0.5,
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
* The strip-and-reparse cleanup (including sparse-array compaction) repairs
|
|
8
8
|
* every known real-world config shape, so no config.json fixture reliably
|
|
9
|
-
* reaches the ladder through `
|
|
9
|
+
* reaches the ladder through `getConfig` — the ladder is defense-in-depth
|
|
10
10
|
* for schema shapes the cleanup does not anticipate. The ladder tests here
|
|
11
11
|
* therefore drive `_recoverFromInvalidConfigForTests` directly, while the
|
|
12
12
|
* file-based tests assert the cleanup's healing behavior end-to-end.
|
|
@@ -48,9 +48,9 @@ afterAll(() => {
|
|
|
48
48
|
import {
|
|
49
49
|
_recoverFromInvalidConfigForTests,
|
|
50
50
|
_resetLastKnownGoodConfigForTests,
|
|
51
|
+
getConfig,
|
|
51
52
|
getConfigReadOnly,
|
|
52
53
|
invalidateConfigCache,
|
|
53
|
-
loadConfig,
|
|
54
54
|
} from "../loader.js";
|
|
55
55
|
|
|
56
56
|
function writeConfig(obj: unknown): void {
|
|
@@ -90,7 +90,7 @@ describe("config recovery ladder for cleanup-resistant invalid config", () => {
|
|
|
90
90
|
test("keeps the last-known-good config when recovery runs after a good load", () => {
|
|
91
91
|
// A valid load captures the last-known-good snapshot for this process.
|
|
92
92
|
writeConfig({ maxStepsPerSession: 123 });
|
|
93
|
-
expect(
|
|
93
|
+
expect(getConfig().maxStepsPerSession).toBe(123);
|
|
94
94
|
|
|
95
95
|
// Recovery for an irreparable config returns the snapshot — the whole
|
|
96
96
|
// config is NOT reset to schema defaults (which would be 50).
|
|
@@ -123,7 +123,7 @@ describe("config recovery ladder for cleanup-resistant invalid config", () => {
|
|
|
123
123
|
// the sibling value is preserved and the recovery ladder is never reached.
|
|
124
124
|
writeConfig({ maxStepsPerSession: 9999, tools: { exclude: ["keep-me"] } });
|
|
125
125
|
|
|
126
|
-
const config =
|
|
126
|
+
const config = getConfig();
|
|
127
127
|
|
|
128
128
|
expect(config.maxStepsPerSession).toBe(50);
|
|
129
129
|
expect(config.tools.exclude).toEqual(["keep-me"]);
|
|
@@ -135,14 +135,14 @@ describe("config recovery ladder for cleanup-resistant invalid config", () => {
|
|
|
135
135
|
// rung runs, the valid element survives, and sibling sections keep their
|
|
136
136
|
// values from the file (not from the last-known-good snapshot).
|
|
137
137
|
writeConfig({ maxStepsPerSession: 42 });
|
|
138
|
-
expect(
|
|
138
|
+
expect(getConfig().maxStepsPerSession).toBe(42);
|
|
139
139
|
|
|
140
140
|
writeConfig({
|
|
141
141
|
maxStepsPerSession: 123,
|
|
142
142
|
tools: { exclude: ["valid-tool", 456] },
|
|
143
143
|
});
|
|
144
144
|
invalidateConfigCache();
|
|
145
|
-
const healed =
|
|
145
|
+
const healed = getConfig();
|
|
146
146
|
|
|
147
147
|
expect(healed.maxStepsPerSession).toBe(123);
|
|
148
148
|
expect(healed.tools.exclude).toEqual(["valid-tool"]);
|
|
@@ -150,7 +150,7 @@ describe("config recovery ladder for cleanup-resistant invalid config", () => {
|
|
|
150
150
|
|
|
151
151
|
test("invalidateConfigCache does not clear the last-known-good safety net", () => {
|
|
152
152
|
writeConfig({ maxStepsPerSession: 77 });
|
|
153
|
-
expect(
|
|
153
|
+
expect(getConfig().maxStepsPerSession).toBe(77);
|
|
154
154
|
|
|
155
155
|
// A bare cache invalidation must not drop the safety net.
|
|
156
156
|
invalidateConfigCache();
|
|
@@ -165,7 +165,7 @@ describe("config recovery ladder for cleanup-resistant invalid config", () => {
|
|
|
165
165
|
|
|
166
166
|
test("getConfigReadOnly returns schema defaults for a top-level `null` config without throwing", () => {
|
|
167
167
|
// `JSON.parse("null")` is valid JSON, so it reaches validateWithSchema as a
|
|
168
|
-
// non-object top-level value. `
|
|
168
|
+
// non-object top-level value. `getConfig` quarantines non-object files
|
|
169
169
|
// before validation, so `getConfigReadOnly` (which validates the parsed
|
|
170
170
|
// value directly) is the path that exercises the recovery ladder's
|
|
171
171
|
// non-object guard. It must degrade to schema defaults, not throw on
|
|
@@ -193,7 +193,7 @@ describe("config recovery ladder for cleanup-resistant invalid config", () => {
|
|
|
193
193
|
// First load with no config.json seeds the file and fills the
|
|
194
194
|
// deployment-context cloud OAuth service modes in memory; the
|
|
195
195
|
// last-known-good snapshot is refreshed AFTER that fill.
|
|
196
|
-
const seeded =
|
|
196
|
+
const seeded = getConfig();
|
|
197
197
|
expect(seeded.services["outlook-oauth"].mode).toBe("managed");
|
|
198
198
|
|
|
199
199
|
// Recovery keeps the last-known-good EFFECTIVE config, so the cloud mode
|
|
@@ -31,7 +31,7 @@ afterAll(() => {
|
|
|
31
31
|
mock.restore();
|
|
32
32
|
});
|
|
33
33
|
|
|
34
|
-
import {
|
|
34
|
+
import { getConfig, invalidateConfigCache } from "../loader.js";
|
|
35
35
|
|
|
36
36
|
function writeConfig(obj: unknown): void {
|
|
37
37
|
writeFileSync(CONFIG_PATH, JSON.stringify(obj, null, 2) + "\n");
|
|
@@ -64,7 +64,7 @@ describe("config recovery compacts arrays after stripping invalid elements", ()
|
|
|
64
64
|
maxStepsPerSession: 77,
|
|
65
65
|
});
|
|
66
66
|
|
|
67
|
-
const config =
|
|
67
|
+
const config = getConfig();
|
|
68
68
|
|
|
69
69
|
expect(config.tools.exclude).toEqual(["tool-a", "tool-b"]);
|
|
70
70
|
// The rest of the config survives — cleanup succeeded, so recovery never
|
|
@@ -77,7 +77,7 @@ describe("config recovery compacts arrays after stripping invalid elements", ()
|
|
|
77
77
|
tools: { exclude: [1, "tool-a", 2, "tool-b", 3] },
|
|
78
78
|
});
|
|
79
79
|
|
|
80
|
-
const config =
|
|
80
|
+
const config = getConfig();
|
|
81
81
|
|
|
82
82
|
expect(config.tools.exclude).toEqual(["tool-a", "tool-b"]);
|
|
83
83
|
});
|
|
@@ -91,7 +91,7 @@ describe("config recovery compacts arrays after stripping invalid elements", ()
|
|
|
91
91
|
maxStepsPerSession: 66,
|
|
92
92
|
});
|
|
93
93
|
|
|
94
|
-
const config =
|
|
94
|
+
const config = getConfig();
|
|
95
95
|
|
|
96
96
|
expect(config.tools.exclude).toEqual([]);
|
|
97
97
|
expect(config.maxStepsPerSession).toBe(66);
|
|
@@ -107,7 +107,7 @@ describe("config recovery compacts arrays after stripping invalid elements", ()
|
|
|
107
107
|
maxStepsPerSession: 66,
|
|
108
108
|
});
|
|
109
109
|
|
|
110
|
-
const config =
|
|
110
|
+
const config = getConfig();
|
|
111
111
|
|
|
112
112
|
expect(config.skills.allowBundled).toBeNull();
|
|
113
113
|
expect(config.maxStepsPerSession).toBe(66);
|
|
@@ -122,7 +122,7 @@ describe("config recovery compacts arrays after stripping invalid elements", ()
|
|
|
122
122
|
maxStepsPerSession: 66,
|
|
123
123
|
});
|
|
124
124
|
|
|
125
|
-
const config =
|
|
125
|
+
const config = getConfig();
|
|
126
126
|
|
|
127
127
|
expect(config.skills.allowBundled).toBeNull();
|
|
128
128
|
expect(config.maxStepsPerSession).toBe(66);
|
|
@@ -138,7 +138,7 @@ describe("config recovery compacts arrays after stripping invalid elements", ()
|
|
|
138
138
|
maxStepsPerSession: "not-a-number",
|
|
139
139
|
});
|
|
140
140
|
|
|
141
|
-
const config =
|
|
141
|
+
const config = getConfig();
|
|
142
142
|
|
|
143
143
|
expect(config.skills.allowBundled).toEqual([]);
|
|
144
144
|
});
|
|
@@ -14,7 +14,7 @@ import { existsSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
|
14
14
|
import { join } from "node:path";
|
|
15
15
|
import { beforeEach, describe, expect, test } from "bun:test";
|
|
16
16
|
|
|
17
|
-
import { getWorkspacePluginsDir } from "../../util/
|
|
17
|
+
import { getWorkspacePluginsDir } from "../../util/layout.js";
|
|
18
18
|
import { loadSkillCatalog } from "../skills.js";
|
|
19
19
|
|
|
20
20
|
function writePlugin(
|
|
@@ -248,20 +248,18 @@ describe("completeCustomProfile", () => {
|
|
|
248
248
|
expect(completeCustomProfile(fullDefault, mix)).toBe(mix);
|
|
249
249
|
});
|
|
250
250
|
|
|
251
|
-
test("passes
|
|
252
|
-
const managed: ProfileEntry = {
|
|
251
|
+
test("passes cadet-provider profiles through untouched", () => {
|
|
252
|
+
const managed: ProfileEntry = { provider: "cadet", topP: 0.9 };
|
|
253
253
|
expect(completeCustomProfile(fullDefault, managed)).toBe(managed);
|
|
254
254
|
});
|
|
255
255
|
|
|
256
256
|
test("preserves metadata fields", () => {
|
|
257
257
|
const completed = completeCustomProfile(fullDefault, {
|
|
258
|
-
source: "user",
|
|
259
258
|
label: "Fast drafts",
|
|
260
259
|
description: "cheap and quick",
|
|
261
260
|
status: "disabled",
|
|
262
261
|
model: "claude-haiku-4-5-20251001",
|
|
263
262
|
});
|
|
264
|
-
expect(completed.source).toBe("user");
|
|
265
263
|
expect(completed.label).toBe("Fast drafts");
|
|
266
264
|
expect(completed.description).toBe("cheap and quick");
|
|
267
265
|
expect(completed.status).toBe("disabled");
|
|
@@ -94,14 +94,13 @@ describe("reconcileFlagGatedProfiles", () => {
|
|
|
94
94
|
const raw = readConfig();
|
|
95
95
|
// On disk: a thin managed stub — profile content is code-owned.
|
|
96
96
|
const osBeta = raw.llm.profiles["os-beta"]!;
|
|
97
|
-
expect(osBeta).toEqual({
|
|
97
|
+
expect(osBeta).toEqual({ provider: "cadet" });
|
|
98
98
|
|
|
99
99
|
// Through the effective view the stub resolves to the catalog body.
|
|
100
100
|
const effective = getEffectiveProfile(raw.llm.profiles, "os-beta")!;
|
|
101
101
|
expect(effective.model).toBe("MiniMaxAI/MiniMax-M3");
|
|
102
102
|
expect(effective.provider_connection).toBeUndefined();
|
|
103
103
|
expect(effective.provider).toBe("cadet");
|
|
104
|
-
expect(effective.source).toBe("managed");
|
|
105
104
|
expect(effective.label).toBe("OS Beta");
|
|
106
105
|
expect(effective.effort).toBe("low");
|
|
107
106
|
expect(effective.topP).toBe(0.95);
|
|
@@ -120,7 +119,6 @@ describe("reconcileFlagGatedProfiles", () => {
|
|
|
120
119
|
const osBeta = profiles["os-beta"]!;
|
|
121
120
|
expect(osBeta.status).toBe("disabled");
|
|
122
121
|
expect(osBeta.label).toBe("OS Beta (Managed)");
|
|
123
|
-
expect(osBeta.source).toBe("managed");
|
|
124
122
|
// Content stays code-owned; the effective view supplies it.
|
|
125
123
|
expect(osBeta.effort).toBeUndefined();
|
|
126
124
|
expect(getEffectiveProfile(profiles, "os-beta")?.effort).toBe("low");
|
|
@@ -203,7 +201,6 @@ describe("reconcileFlagGatedProfiles", () => {
|
|
|
203
201
|
|
|
204
202
|
const raw = readConfig();
|
|
205
203
|
raw.llm.profiles["my-mix"] = {
|
|
206
|
-
source: "user",
|
|
207
204
|
label: "My Mix",
|
|
208
205
|
mix: [
|
|
209
206
|
{ profile: "balanced", weight: 70 },
|
|
@@ -225,7 +222,6 @@ describe("reconcileFlagGatedProfiles", () => {
|
|
|
225
222
|
{ profile: "balanced", weight: 70 },
|
|
226
223
|
{ profile: "quality-optimized", weight: 20 },
|
|
227
224
|
]);
|
|
228
|
-
expect(mix.source).toBe("user");
|
|
229
225
|
expect(mix.label).toBe("My Mix");
|
|
230
226
|
|
|
231
227
|
invalidateConfigCache();
|
|
@@ -240,7 +236,6 @@ describe("reconcileFlagGatedProfiles", () => {
|
|
|
240
236
|
|
|
241
237
|
const raw = readConfig();
|
|
242
238
|
raw.llm.profiles["experiment"] = {
|
|
243
|
-
source: "user",
|
|
244
239
|
label: "Experiment",
|
|
245
240
|
mix: [
|
|
246
241
|
{ profile: "balanced", weight: 50 },
|
|
@@ -339,104 +334,4 @@ describe("reconcileFlagGatedProfiles", () => {
|
|
|
339
334
|
|
|
340
335
|
expect(LLMSchema.safeParse(after.llm).success).toBe(true);
|
|
341
336
|
});
|
|
342
|
-
|
|
343
|
-
test("a user-owned os-beta profile is never touched", () => {
|
|
344
|
-
process.env.IS_CLOUD = "true";
|
|
345
|
-
writeConfig({
|
|
346
|
-
llm: {
|
|
347
|
-
default: { provider: "anthropic" },
|
|
348
|
-
profiles: {
|
|
349
|
-
"os-beta": {
|
|
350
|
-
source: "user",
|
|
351
|
-
label: "Mine",
|
|
352
|
-
provider: "anthropic",
|
|
353
|
-
model: "claude-x",
|
|
354
|
-
provider_connection: "anthropic-personal",
|
|
355
|
-
},
|
|
356
|
-
},
|
|
357
|
-
profileOrder: ["os-beta"],
|
|
358
|
-
},
|
|
359
|
-
});
|
|
360
|
-
invalidateConfigCache();
|
|
361
|
-
const before = readFileSync(CONFIG_PATH, "utf-8");
|
|
362
|
-
|
|
363
|
-
setOverridesForTesting({ "os-beta": true });
|
|
364
|
-
expect(reconcileFlagGatedProfiles()).toBe(false);
|
|
365
|
-
expect(readFileSync(CONFIG_PATH, "utf-8")).toBe(before);
|
|
366
|
-
|
|
367
|
-
setOverridesForTesting({ "os-beta": false });
|
|
368
|
-
expect(reconcileFlagGatedProfiles()).toBe(false);
|
|
369
|
-
expect(readFileSync(CONFIG_PATH, "utf-8")).toBe(before);
|
|
370
|
-
});
|
|
371
|
-
|
|
372
|
-
test("auto-profile flag on materializes the cloud auto profile at the head of the order", () => {
|
|
373
|
-
process.env.IS_CLOUD = "true";
|
|
374
|
-
seedBalancedConfig();
|
|
375
|
-
setOverridesForTesting({ "auto-profile": true });
|
|
376
|
-
|
|
377
|
-
expect(reconcileFlagGatedProfiles()).toBe(true);
|
|
378
|
-
|
|
379
|
-
const raw = readConfig();
|
|
380
|
-
expect(raw.llm.profiles.auto).toEqual({ source: "managed" });
|
|
381
|
-
expect(raw.llm.profileOrder[0]).toBe("auto");
|
|
382
|
-
const effective = getEffectiveProfile(raw.llm.profiles, "auto")!;
|
|
383
|
-
expect(effective.label).toBe("Auto");
|
|
384
|
-
expect(effective.model).toBe(
|
|
385
|
-
getEffectiveProfile(raw.llm.profiles, "balanced")!.model,
|
|
386
|
-
);
|
|
387
|
-
expect(LLMSchema.safeParse(raw.llm).success).toBe(true);
|
|
388
|
-
});
|
|
389
|
-
|
|
390
|
-
test("auto-profile flag on in BYOK mode writes a plain stub that the effective view hides", () => {
|
|
391
|
-
seedBalancedConfig();
|
|
392
|
-
setOverridesForTesting({ "auto-profile": true });
|
|
393
|
-
|
|
394
|
-
expect(reconcileFlagGatedProfiles()).toBe(true);
|
|
395
|
-
|
|
396
|
-
const raw = readConfig();
|
|
397
|
-
expect(raw.llm.profiles.auto).toEqual({ source: "managed" });
|
|
398
|
-
expect(getEffectiveProfile(raw.llm.profiles, "auto")).toBeDefined();
|
|
399
|
-
});
|
|
400
|
-
|
|
401
|
-
test("auto-profile flag off removes the cloud auto profile and repoints its references", () => {
|
|
402
|
-
process.env.IS_CLOUD = "true";
|
|
403
|
-
seedBalancedConfig();
|
|
404
|
-
setOverridesForTesting({ "auto-profile": true });
|
|
405
|
-
reconcileFlagGatedProfiles();
|
|
406
|
-
|
|
407
|
-
const raw = readConfig();
|
|
408
|
-
raw.llm.activeProfile = "auto";
|
|
409
|
-
(raw.llm as Record<string, unknown>).callSites = {
|
|
410
|
-
subagentSpawn: { profile: "auto" },
|
|
411
|
-
};
|
|
412
|
-
writeConfig(raw);
|
|
413
|
-
invalidateConfigCache();
|
|
414
|
-
|
|
415
|
-
setOverridesForTesting({ "auto-profile": false });
|
|
416
|
-
expect(reconcileFlagGatedProfiles()).toBe(true);
|
|
417
|
-
|
|
418
|
-
const after = readConfig();
|
|
419
|
-
expect(after.llm.profiles.auto).toBeUndefined();
|
|
420
|
-
expect(after.llm.profileOrder.includes("auto")).toBe(false);
|
|
421
|
-
expect(after.llm.activeProfile).toBe("balanced");
|
|
422
|
-
expect((after.llm as Record<string, unknown>).callSites).toEqual({
|
|
423
|
-
subagentSpawn: {},
|
|
424
|
-
});
|
|
425
|
-
});
|
|
426
|
-
|
|
427
|
-
test("os-beta and auto-profile reconcile independently in one pass", () => {
|
|
428
|
-
process.env.IS_CLOUD = "true";
|
|
429
|
-
seedBalancedConfig();
|
|
430
|
-
setOverridesForTesting({ "os-beta": true, "auto-profile": true });
|
|
431
|
-
expect(reconcileFlagGatedProfiles()).toBe(true);
|
|
432
|
-
let order = readConfig().llm.profileOrder;
|
|
433
|
-
expect(order[0]).toBe("auto");
|
|
434
|
-
expect(order.indexOf("os-beta")).toBe(order.indexOf("balanced") + 1);
|
|
435
|
-
|
|
436
|
-
setOverridesForTesting({ "os-beta": false, "auto-profile": true });
|
|
437
|
-
expect(reconcileFlagGatedProfiles()).toBe(true);
|
|
438
|
-
order = readConfig().llm.profileOrder;
|
|
439
|
-
expect(order[0]).toBe("auto");
|
|
440
|
-
expect(order.includes("os-beta")).toBe(false);
|
|
441
|
-
});
|
|
442
337
|
});
|
|
@@ -11,7 +11,7 @@ import { isPlainObject } from "../util/object.js";
|
|
|
11
11
|
* `config set acp.agents.<id>.model null`. The deep-merge assigns that literal
|
|
12
12
|
* `null` because the stored value is a scalar, and a SET writes it verbatim by
|
|
13
13
|
* design. Both `command` and `model` are optional strings in `AcpConfigSchema`,
|
|
14
|
-
* so a persisted `null` makes every later `
|
|
14
|
+
* so a persisted `null` makes every later `getConfig()` warn and take its
|
|
15
15
|
* salvage path, dropping the whole `acp` section with the agents defined in it.
|
|
16
16
|
* Clearing means removing the key, so drop it here on every write path.
|
|
17
17
|
*
|