@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
|
@@ -8,7 +8,7 @@ import { afterEach, beforeEach, describe, expect, mock, test } from "bun:test";
|
|
|
8
8
|
|
|
9
9
|
import { UnprocessableEntityError } from "../errors.js";
|
|
10
10
|
|
|
11
|
-
let cloudBaseUrl = "https://
|
|
11
|
+
let cloudBaseUrl = "https://test-cloud.mycadet.ai";
|
|
12
12
|
let authHeader: string | null = "Api-Key test";
|
|
13
13
|
|
|
14
14
|
// Spread the real module: replacing it wholesale breaks unrelated importers
|
|
@@ -33,9 +33,10 @@ const creditsHandler = ROUTES.find(
|
|
|
33
33
|
(r) => r.operationId === "platform_credits",
|
|
34
34
|
)!.handler;
|
|
35
35
|
|
|
36
|
-
const SUMMARY_URL =
|
|
36
|
+
const SUMMARY_URL =
|
|
37
|
+
"https://test-cloud.mycadet.ai/v1/organizations/billing/summary/";
|
|
37
38
|
const SUBSCRIPTION_URL =
|
|
38
|
-
"https://
|
|
39
|
+
"https://test-cloud.mycadet.ai/v1/organizations/billing/subscription/";
|
|
39
40
|
|
|
40
41
|
const FULL_SUMMARY = {
|
|
41
42
|
settled_balance_usd: "50.00",
|
|
@@ -84,7 +85,7 @@ function stubFetch(
|
|
|
84
85
|
}
|
|
85
86
|
|
|
86
87
|
beforeEach(() => {
|
|
87
|
-
cloudBaseUrl = "https://
|
|
88
|
+
cloudBaseUrl = "https://test-cloud.mycadet.ai";
|
|
88
89
|
authHeader = "Api-Key test";
|
|
89
90
|
fetchedUrls = [];
|
|
90
91
|
});
|
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
UnprocessableEntityError,
|
|
13
13
|
} from "../errors.js";
|
|
14
14
|
|
|
15
|
-
let cloudBaseUrl = "https://
|
|
15
|
+
let cloudBaseUrl = "https://test-cloud.mycadet.ai";
|
|
16
16
|
let authHeader: string | null = "Api-Key test";
|
|
17
17
|
|
|
18
18
|
// Spread the real module: replacing it wholesale breaks unrelated importers
|
|
@@ -41,7 +41,8 @@ const getHandler = ROUTES.find(
|
|
|
41
41
|
(r) => r.operationId === "platform_invoices_by_id_get",
|
|
42
42
|
)!.handler;
|
|
43
43
|
|
|
44
|
-
const INVOICES_URL =
|
|
44
|
+
const INVOICES_URL =
|
|
45
|
+
"https://test-cloud.mycadet.ai/v1/organizations/billing/invoices/";
|
|
45
46
|
|
|
46
47
|
function invoice(id: string) {
|
|
47
48
|
return {
|
|
@@ -103,7 +104,7 @@ function jsonResponse(body: unknown, status = 200): Response {
|
|
|
103
104
|
}
|
|
104
105
|
|
|
105
106
|
beforeEach(() => {
|
|
106
|
-
cloudBaseUrl = "https://
|
|
107
|
+
cloudBaseUrl = "https://test-cloud.mycadet.ai";
|
|
107
108
|
authHeader = "Api-Key test";
|
|
108
109
|
fetchCalls = [];
|
|
109
110
|
});
|
|
@@ -52,16 +52,13 @@ mock.module("../../../persistence/embeddings/embedding-backend.js", () => ({
|
|
|
52
52
|
}));
|
|
53
53
|
|
|
54
54
|
import type { AssistantEventEnvelope } from "../../../api/index.js";
|
|
55
|
-
import { BACKUP_PROFILE_KEYS } from "../../../config/default-profile-names.js";
|
|
56
55
|
import {
|
|
57
56
|
getConfig,
|
|
58
57
|
invalidateConfigCache,
|
|
59
|
-
loadConfig,
|
|
60
58
|
loadRawConfig,
|
|
61
59
|
setNestedValue,
|
|
62
60
|
} from "../../../config/loader.js";
|
|
63
61
|
import { AssistantConfigSchema } from "../../../config/schema.js";
|
|
64
|
-
import { LLMConfigBase } from "../../../config/schemas/llm.js";
|
|
65
62
|
import type { ConversationCreateType } from "../../../persistence/conversation-types.js";
|
|
66
63
|
import {
|
|
67
64
|
getDb,
|
|
@@ -847,49 +844,6 @@ describe("PUT /v1/config/llm/profiles/:name", () => {
|
|
|
847
844
|
seedRawConfig();
|
|
848
845
|
});
|
|
849
846
|
|
|
850
|
-
describe("fallbackProfile write protection", () => {
|
|
851
|
-
beforeEach(() => {
|
|
852
|
-
const llm = rawConfigFixture.llm as {
|
|
853
|
-
profiles: Record<string, Record<string, unknown>>;
|
|
854
|
-
};
|
|
855
|
-
llm.profiles.backup = {
|
|
856
|
-
provider: "anthropic",
|
|
857
|
-
model: "claude-sonnet-4-6",
|
|
858
|
-
};
|
|
859
|
-
seedRawConfig();
|
|
860
|
-
});
|
|
861
|
-
|
|
862
|
-
test("rejects a custom fallbackProfile without writing", async () => {
|
|
863
|
-
await expect(
|
|
864
|
-
replaceProfileRoute.handler({
|
|
865
|
-
pathParams: { name: "custom" },
|
|
866
|
-
body: {
|
|
867
|
-
provider: "anthropic",
|
|
868
|
-
model: "claude-sonnet-4-6",
|
|
869
|
-
fallbackProfile: "backup",
|
|
870
|
-
},
|
|
871
|
-
}),
|
|
872
|
-
).rejects.toThrow(/Automatic fallbacks are code-owned/);
|
|
873
|
-
expect(persistedProfile("custom").fallbackProfile).toBeUndefined();
|
|
874
|
-
expect(initializeProvidersCalls).toBe(0);
|
|
875
|
-
});
|
|
876
|
-
|
|
877
|
-
test("rejects a custom pointer at a cloud backup name", async () => {
|
|
878
|
-
await expect(
|
|
879
|
-
replaceProfileRoute.handler({
|
|
880
|
-
pathParams: { name: "custom" },
|
|
881
|
-
body: {
|
|
882
|
-
provider: "anthropic",
|
|
883
|
-
model: "claude-sonnet-4-6",
|
|
884
|
-
fallbackProfile: "balanced-backup",
|
|
885
|
-
},
|
|
886
|
-
}),
|
|
887
|
-
).rejects.toThrow(/Automatic fallbacks are code-owned/);
|
|
888
|
-
expect(persistedProfile("custom").fallbackProfile).toBeUndefined();
|
|
889
|
-
expect(initializeProvidersCalls).toBe(0);
|
|
890
|
-
});
|
|
891
|
-
});
|
|
892
|
-
|
|
893
847
|
test("owns contextWindow maxInputTokens while preserving non-UI profile leaves", async () => {
|
|
894
848
|
const result = await replaceProfileRoute.handler({
|
|
895
849
|
pathParams: { name: "custom" },
|
|
@@ -908,20 +862,14 @@ describe("PUT /v1/config/llm/profiles/:name", () => {
|
|
|
908
862
|
|
|
909
863
|
expect(savedProfile.provider).toBe("openai");
|
|
910
864
|
expect(savedProfile.model).toBe("gpt-5.5");
|
|
911
|
-
//
|
|
912
|
-
//
|
|
913
|
-
//
|
|
914
|
-
|
|
915
|
-
expect(savedProfile.maxTokens).toBe(schemaDefault.maxTokens);
|
|
865
|
+
// The entry replaces verbatim; contextWindow is route-owned — the
|
|
866
|
+
// non-UI leaves survive the write, the UI-owned maxInputTokens does
|
|
867
|
+
// not (it only lands when the body carries it).
|
|
868
|
+
expect(savedProfile.maxTokens).toBeUndefined();
|
|
916
869
|
expect(savedProfile.contextWindow).toEqual({
|
|
917
|
-
...schemaDefault.contextWindow,
|
|
918
870
|
targetBudgetRatio: 0.3,
|
|
919
871
|
summaryBudgetRatio: 0.08,
|
|
920
|
-
overflowRecovery: {
|
|
921
|
-
...schemaDefault.contextWindow.overflowRecovery,
|
|
922
|
-
enabled: true,
|
|
923
|
-
maxAttempts: 4,
|
|
924
|
-
},
|
|
872
|
+
overflowRecovery: { enabled: true, maxAttempts: 4 },
|
|
925
873
|
});
|
|
926
874
|
expect(savedProfile.openrouter).toEqual({ only: ["anthropic"] });
|
|
927
875
|
});
|
|
@@ -946,17 +894,13 @@ describe("PUT /v1/config/llm/profiles/:name", () => {
|
|
|
946
894
|
}
|
|
947
895
|
).profiles.custom;
|
|
948
896
|
|
|
949
|
-
|
|
897
|
+
// Only the maxInputTokens override is taken; the non-UI leaves ride
|
|
898
|
+
// from the existing entry.
|
|
950
899
|
expect(savedProfile.contextWindow).toEqual({
|
|
951
|
-
...schemaDefault.contextWindow,
|
|
952
900
|
maxInputTokens: 150000,
|
|
953
901
|
targetBudgetRatio: 0.3,
|
|
954
902
|
summaryBudgetRatio: 0.08,
|
|
955
|
-
overflowRecovery: {
|
|
956
|
-
...schemaDefault.contextWindow.overflowRecovery,
|
|
957
|
-
enabled: true,
|
|
958
|
-
maxAttempts: 4,
|
|
959
|
-
},
|
|
903
|
+
overflowRecovery: { enabled: true, maxAttempts: 4 },
|
|
960
904
|
});
|
|
961
905
|
expect(savedProfile.openrouter).toEqual({ only: ["anthropic"] });
|
|
962
906
|
});
|
|
@@ -1138,24 +1082,21 @@ describe("PUT /v1/config/llm/profiles/:name", () => {
|
|
|
1138
1082
|
|
|
1139
1083
|
describe("cloud profile guard", () => {
|
|
1140
1084
|
beforeEach(() => {
|
|
1141
|
-
// Seed two managed
|
|
1142
|
-
//
|
|
1143
|
-
//
|
|
1144
|
-
// the disabled → active status transition.
|
|
1085
|
+
// Seed two managed profiles alongside the existing custom one. A
|
|
1086
|
+
// cadet-provider entry under a managed name is read-only except the
|
|
1087
|
+
// disabled → active status transition (the up-front route check).
|
|
1145
1088
|
const profiles = (
|
|
1146
1089
|
rawConfigFixture.llm as { profiles: Record<string, unknown> }
|
|
1147
1090
|
).profiles;
|
|
1148
1091
|
profiles["balanced"] = {
|
|
1149
|
-
|
|
1150
|
-
provider: "anthropic",
|
|
1092
|
+
provider: "cadet",
|
|
1151
1093
|
model: "claude-sonnet-4-6",
|
|
1152
1094
|
label: "Balanced",
|
|
1153
1095
|
status: "active",
|
|
1154
1096
|
};
|
|
1155
1097
|
profiles["os-beta"] = {
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
model: "zai-org/GLM-5.2",
|
|
1098
|
+
provider: "cadet",
|
|
1099
|
+
model: "claude-sonnet-4-6",
|
|
1159
1100
|
label: "OS Beta",
|
|
1160
1101
|
status: "active",
|
|
1161
1102
|
};
|
|
@@ -1208,9 +1149,8 @@ describe("PUT /v1/config/llm/profiles/:name", () => {
|
|
|
1208
1149
|
|
|
1209
1150
|
expect(savedProfile.status).toBe("active");
|
|
1210
1151
|
// Seed fields preserved.
|
|
1211
|
-
expect(savedProfile.provider).toBe("
|
|
1212
|
-
expect(savedProfile.model).toBe("
|
|
1213
|
-
expect(savedProfile.source).toBe("managed");
|
|
1152
|
+
expect(savedProfile.provider).toBe("cadet");
|
|
1153
|
+
expect(savedProfile.model).toBe("claude-sonnet-4-6");
|
|
1214
1154
|
});
|
|
1215
1155
|
|
|
1216
1156
|
// The full commit-time rejection matrix for invariant cloud profiles
|
|
@@ -1257,7 +1197,7 @@ describe("PUT /v1/config/llm/profiles/:name", () => {
|
|
|
1257
1197
|
(rawConfigFixture.llm as { profiles: Record<string, unknown> }).profiles[
|
|
1258
1198
|
"balanced"
|
|
1259
1199
|
] = {
|
|
1260
|
-
source: "
|
|
1200
|
+
source: "cloud",
|
|
1261
1201
|
provider: "anthropic",
|
|
1262
1202
|
model: "claude-sonnet-4-6",
|
|
1263
1203
|
label: "Balanced",
|
|
@@ -1336,189 +1276,34 @@ describe("PATCH /v1/config fallbackProfile write protection", () => {
|
|
|
1336
1276
|
});
|
|
1337
1277
|
});
|
|
1338
1278
|
|
|
1339
|
-
describe("
|
|
1340
|
-
const configPatchRoute = ROUTES.find(
|
|
1341
|
-
(r) => r.operationId === "config_patch",
|
|
1342
|
-
)!;
|
|
1343
|
-
const configSetRoute = ROUTES.find((r) => r.operationId === "config_set")!;
|
|
1344
|
-
|
|
1345
|
-
const distinctiveDefault = {
|
|
1346
|
-
provider: "anthropic",
|
|
1347
|
-
model: "claude-opus-4-8",
|
|
1348
|
-
maxTokens: 12345,
|
|
1349
|
-
temperature: 0.7,
|
|
1350
|
-
logitBias: "suppress-cjk",
|
|
1351
|
-
};
|
|
1352
|
-
|
|
1279
|
+
describe("profile writes are schema-canonical", () => {
|
|
1353
1280
|
beforeEach(() => {
|
|
1354
1281
|
rawConfigFixture = {
|
|
1355
1282
|
llm: {
|
|
1356
|
-
default:
|
|
1283
|
+
default: { provider: "anthropic", model: "claude-opus-4-8" },
|
|
1357
1284
|
profiles: {
|
|
1358
|
-
partial: {
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
};
|
|
1362
|
-
seedRawConfig();
|
|
1363
|
-
});
|
|
1364
|
-
|
|
1365
|
-
const savedProfiles = () =>
|
|
1366
|
-
(
|
|
1367
|
-
loadRawConfig().llm as {
|
|
1368
|
-
profiles: Record<string, Record<string, unknown>>;
|
|
1369
|
-
}
|
|
1370
|
-
).profiles;
|
|
1371
|
-
|
|
1372
|
-
test("PUT of a partial body stores a complete profile", async () => {
|
|
1373
|
-
await replaceProfileRoute.handler({
|
|
1374
|
-
pathParams: { name: "mine" },
|
|
1375
|
-
body: { model: "claude-haiku-4-5-20251001" },
|
|
1376
|
-
});
|
|
1377
|
-
const saved = savedProfiles().mine;
|
|
1378
|
-
expect(saved.model).toBe("claude-haiku-4-5-20251001");
|
|
1379
|
-
expect(saved.provider).toBe("anthropic");
|
|
1380
|
-
expect(saved.maxTokens).toBe(12345);
|
|
1381
|
-
// Non-null default sampling is baked in; logitBias never is.
|
|
1382
|
-
expect(saved.temperature).toBe(0.7);
|
|
1383
|
-
expect(saved.logitBias).toBeUndefined();
|
|
1384
|
-
expect(saved.thinking).toBeDefined();
|
|
1385
|
-
expect(saved.contextWindow).toBeDefined();
|
|
1386
|
-
});
|
|
1387
|
-
|
|
1388
|
-
test("PATCH creating a partial profile stores it complete", async () => {
|
|
1389
|
-
await configPatchRoute.handler({
|
|
1390
|
-
body: {
|
|
1391
|
-
llm: {
|
|
1392
|
-
default: structuredClone(distinctiveDefault),
|
|
1393
|
-
profiles: {
|
|
1394
|
-
mine: { source: "user", model: "claude-haiku-4-5-20251001" },
|
|
1285
|
+
partial: {
|
|
1286
|
+
model: "claude-haiku-4-5-20251001",
|
|
1287
|
+
futureField: "keep-me",
|
|
1395
1288
|
},
|
|
1396
1289
|
},
|
|
1397
1290
|
},
|
|
1398
|
-
});
|
|
1399
|
-
const saved = savedProfiles().mine;
|
|
1400
|
-
expect(saved.provider).toBe("anthropic");
|
|
1401
|
-
expect(saved.maxTokens).toBe(12345);
|
|
1402
|
-
expect(saved.temperature).toBe(0.7);
|
|
1403
|
-
expect(saved.logitBias).toBeUndefined();
|
|
1404
|
-
});
|
|
1405
|
-
|
|
1406
|
-
test("SET on a profile leaf completes the whole entry", async () => {
|
|
1407
|
-
await configSetRoute.handler({
|
|
1408
|
-
body: { path: "llm.profiles.partial.maxTokens", value: 999 },
|
|
1409
|
-
});
|
|
1410
|
-
const saved = savedProfiles().partial;
|
|
1411
|
-
expect(saved.maxTokens).toBe(999);
|
|
1412
|
-
expect(saved.provider).toBe("anthropic");
|
|
1413
|
-
expect(saved.temperature).toBe(0.7);
|
|
1414
|
-
expect(saved.model).toBe("claude-haiku-4-5-20251001");
|
|
1415
|
-
});
|
|
1416
|
-
|
|
1417
|
-
test("an unrelated write leaves untouched partial profiles byte-identical", async () => {
|
|
1418
|
-
await configSetRoute.handler({
|
|
1419
|
-
body: { path: "heartbeat.activeHoursStart", value: 9 },
|
|
1420
|
-
});
|
|
1421
|
-
expect(savedProfiles().partial).toEqual({
|
|
1422
|
-
source: "user",
|
|
1423
|
-
model: "claude-haiku-4-5-20251001",
|
|
1424
|
-
});
|
|
1425
|
-
});
|
|
1426
|
-
|
|
1427
|
-
test("nested unknown keys survive completion of a touched entry", async () => {
|
|
1428
|
-
(
|
|
1429
|
-
rawConfigFixture.llm as { profiles: Record<string, unknown> }
|
|
1430
|
-
).profiles.partial = {
|
|
1431
|
-
source: "user",
|
|
1432
|
-
model: "claude-haiku-4-5-20251001",
|
|
1433
|
-
contextWindow: { futureField: "keep-me", maxInputTokens: 111 },
|
|
1434
1291
|
};
|
|
1435
1292
|
seedRawConfig();
|
|
1436
|
-
await configSetRoute.handler({
|
|
1437
|
-
body: { path: "llm.profiles.partial.maxTokens", value: 999 },
|
|
1438
|
-
});
|
|
1439
|
-
const saved = savedProfiles().partial;
|
|
1440
|
-
const contextWindow = saved.contextWindow as Record<string, unknown>;
|
|
1441
|
-
// Schema-canonical saves strip keys the schema doesn't know.
|
|
1442
|
-
expect(contextWindow.futureField).toBeUndefined();
|
|
1443
|
-
expect(contextWindow.maxInputTokens).toBe(111);
|
|
1444
|
-
expect(saved.provider).toBe("anthropic");
|
|
1445
1293
|
});
|
|
1446
1294
|
|
|
1447
1295
|
test("unknown profile keys are stripped by the schema parse", async () => {
|
|
1448
|
-
(
|
|
1449
|
-
rawConfigFixture.llm as { profiles: Record<string, unknown> }
|
|
1450
|
-
).profiles.partial = {
|
|
1451
|
-
source: "user",
|
|
1452
|
-
model: "claude-haiku-4-5-20251001",
|
|
1453
|
-
futureField: "keep-me",
|
|
1454
|
-
};
|
|
1455
|
-
seedRawConfig();
|
|
1296
|
+
const configSetRoute = ROUTES.find((r) => r.operationId === "config_set")!;
|
|
1456
1297
|
await configSetRoute.handler({
|
|
1457
1298
|
body: { path: "llm.profiles.partial.maxTokens", value: 999 },
|
|
1458
1299
|
});
|
|
1459
|
-
const saved =
|
|
1300
|
+
const saved = (
|
|
1301
|
+
loadRawConfig().llm as {
|
|
1302
|
+
profiles: Record<string, Record<string, unknown>>;
|
|
1303
|
+
}
|
|
1304
|
+
).profiles.partial;
|
|
1460
1305
|
expect(saved.futureField).toBeUndefined();
|
|
1461
1306
|
expect(saved.maxTokens).toBe(999);
|
|
1462
|
-
expect(saved.provider).toBe("anthropic");
|
|
1463
|
-
});
|
|
1464
|
-
|
|
1465
|
-
test("a bogus managed source on a non-catalog name is normalized and completed", async () => {
|
|
1466
|
-
await replaceProfileRoute.handler({
|
|
1467
|
-
pathParams: { name: "mine" },
|
|
1468
|
-
body: { source: "managed", model: "claude-haiku-4-5-20251001" },
|
|
1469
|
-
});
|
|
1470
|
-
const saved = savedProfiles().mine;
|
|
1471
|
-
expect(saved.source).toBe("user");
|
|
1472
|
-
expect(saved.provider).toBe("anthropic");
|
|
1473
|
-
expect(saved.maxTokens).toBe(12345);
|
|
1474
|
-
});
|
|
1475
|
-
|
|
1476
|
-
test("a cloud status re-enable stays a thin stub", async () => {
|
|
1477
|
-
(
|
|
1478
|
-
rawConfigFixture.llm as { profiles: Record<string, unknown> }
|
|
1479
|
-
).profiles.balanced = { source: "managed", status: "disabled" };
|
|
1480
|
-
seedRawConfig();
|
|
1481
|
-
await replaceProfileRoute.handler({
|
|
1482
|
-
pathParams: { name: "balanced" },
|
|
1483
|
-
body: { status: null },
|
|
1484
|
-
});
|
|
1485
|
-
expect(savedProfiles().balanced).toEqual({ source: "managed" });
|
|
1486
|
-
});
|
|
1487
|
-
|
|
1488
|
-
test("a mix profile write is not completed", async () => {
|
|
1489
|
-
await replaceProfileRoute.handler({
|
|
1490
|
-
pathParams: { name: "ab" },
|
|
1491
|
-
body: {
|
|
1492
|
-
label: "A/B",
|
|
1493
|
-
mix: [
|
|
1494
|
-
{ profile: "balanced", weight: 1 },
|
|
1495
|
-
{ profile: "cost-optimized", weight: 1 },
|
|
1496
|
-
],
|
|
1497
|
-
},
|
|
1498
|
-
});
|
|
1499
|
-
const saved = savedProfiles().ab;
|
|
1500
|
-
expect(saved.mix).toBeDefined();
|
|
1501
|
-
expect(saved.provider).toBeUndefined();
|
|
1502
|
-
expect(saved.model).toBeUndefined();
|
|
1503
|
-
expect(saved.maxTokens).toBeUndefined();
|
|
1504
|
-
});
|
|
1505
|
-
|
|
1506
|
-
test("re-writing a completed profile is idempotent", async () => {
|
|
1507
|
-
// Deterministic connection state: the PUT handler derives a connection
|
|
1508
|
-
// for provider-carrying bodies, so both writes must see the same rows.
|
|
1509
|
-
getDb().delete(providerConnections).run();
|
|
1510
|
-
await replaceProfileRoute.handler({
|
|
1511
|
-
pathParams: { name: "mine" },
|
|
1512
|
-
body: { provider: "anthropic", model: "claude-haiku-4-5-20251001" },
|
|
1513
|
-
});
|
|
1514
|
-
const first = structuredClone(savedProfiles().mine);
|
|
1515
|
-
rawConfigFixture = structuredClone(loadRawConfig());
|
|
1516
|
-
seedRawConfig();
|
|
1517
|
-
await replaceProfileRoute.handler({
|
|
1518
|
-
pathParams: { name: "mine" },
|
|
1519
|
-
body: first as Record<string, unknown>,
|
|
1520
|
-
});
|
|
1521
|
-
expect(savedProfiles().mine).toEqual(first);
|
|
1522
1307
|
});
|
|
1523
1308
|
});
|
|
1524
1309
|
|
|
@@ -1758,7 +1543,7 @@ describe("sparse services.stt patch provider seeding", () => {
|
|
|
1758
1543
|
});
|
|
1759
1544
|
});
|
|
1760
1545
|
|
|
1761
|
-
describe("config
|
|
1546
|
+
describe("config GET serves profiles verbatim", () => {
|
|
1762
1547
|
const configGetRoute = ROUTES.find((r) => r.operationId === "config_get")!;
|
|
1763
1548
|
const configPatchRoute = ROUTES.find(
|
|
1764
1549
|
(r) => r.operationId === "config_patch",
|
|
@@ -1775,21 +1560,19 @@ describe("config invariant flag enrichment", () => {
|
|
|
1775
1560
|
llm: {
|
|
1776
1561
|
profiles: {
|
|
1777
1562
|
balanced: {
|
|
1778
|
-
source: "
|
|
1563
|
+
source: "cloud",
|
|
1779
1564
|
provider: "fireworks",
|
|
1780
1565
|
model: "accounts/fireworks/models/glm-5p2",
|
|
1781
1566
|
label: "Balanced",
|
|
1782
1567
|
status: "active",
|
|
1783
1568
|
},
|
|
1784
1569
|
"os-beta": {
|
|
1785
|
-
source: "
|
|
1570
|
+
source: "cloud",
|
|
1786
1571
|
provider: "together",
|
|
1787
1572
|
model: "zai-org/GLM-5.2",
|
|
1788
1573
|
label: "OS Beta",
|
|
1789
1574
|
status: "active",
|
|
1790
1575
|
},
|
|
1791
|
-
// A user-owned profile sharing a cloud name: no invariant flag —
|
|
1792
|
-
// the stamp is gated on `source: "managed"` to match the guard.
|
|
1793
1576
|
"cost-optimized": {
|
|
1794
1577
|
source: "user",
|
|
1795
1578
|
provider: "anthropic",
|
|
@@ -1805,43 +1588,31 @@ describe("config invariant flag enrichment", () => {
|
|
|
1805
1588
|
seedRawConfig();
|
|
1806
1589
|
});
|
|
1807
1590
|
|
|
1808
|
-
test("GET /v1/config
|
|
1809
|
-
|
|
1810
|
-
|
|
1811
|
-
|
|
1812
|
-
expect(profiles.balanced!.invariant).toBe(true);
|
|
1813
|
-
expect(profiles["os-beta"]!.invariant).toBe(true);
|
|
1814
|
-
expect(profiles["cost-optimized"]!).not.toHaveProperty("invariant");
|
|
1815
|
-
expect(profiles.custom!).not.toHaveProperty("invariant");
|
|
1816
|
-
});
|
|
1817
|
-
|
|
1818
|
-
test("every managed default is invariant on the wire, Fast included", async () => {
|
|
1819
|
-
// The clients drive their read-only lock off this flag, so a default that
|
|
1820
|
-
// resolves from the catalog with no workspace stub must still carry it.
|
|
1591
|
+
test("GET /v1/config returns profile entries verbatim — no wire-only flags stamped", async () => {
|
|
1592
|
+
// The response is the raw loaded config: managed-ness reads off the
|
|
1593
|
+
// entry's own `source`, and capabilities come from the profiles API
|
|
1594
|
+
// (`GET inference/profiles`), not from flags stamped here.
|
|
1821
1595
|
const body = await configGetRoute.handler({});
|
|
1822
1596
|
const profiles = wireProfiles(body);
|
|
1823
1597
|
|
|
1824
|
-
|
|
1825
|
-
|
|
1826
|
-
|
|
1827
|
-
|
|
1828
|
-
|
|
1829
|
-
|
|
1830
|
-
const body = await configGetRoute.handler({});
|
|
1831
|
-
const profiles = wireProfiles(body);
|
|
1832
|
-
|
|
1833
|
-
for (const name of BACKUP_PROFILE_KEYS) {
|
|
1834
|
-
expect(profiles).not.toHaveProperty(name);
|
|
1598
|
+
expect(profiles.balanced!.provider).toBe("fireworks");
|
|
1599
|
+
expect(profiles.balanced!.model).toBe("accounts/fireworks/models/glm-5p2");
|
|
1600
|
+
expect(profiles.custom!.provider).toBe("anthropic");
|
|
1601
|
+
for (const profile of Object.values(profiles)) {
|
|
1602
|
+
expect(profile).not.toHaveProperty("invariant");
|
|
1603
|
+
expect(profile).not.toHaveProperty("supportsVision");
|
|
1835
1604
|
}
|
|
1836
|
-
expect(profiles.balanced).toBeDefined();
|
|
1837
1605
|
});
|
|
1838
1606
|
|
|
1839
|
-
test("PATCH /v1/config
|
|
1607
|
+
test("PATCH /v1/config response serves profiles verbatim and never persists wire-only keys", async () => {
|
|
1840
1608
|
const body = await configPatchRoute.handler({
|
|
1841
1609
|
body: { memory: { enabled: true } },
|
|
1842
1610
|
});
|
|
1843
1611
|
const profiles = wireProfiles(body);
|
|
1844
|
-
|
|
1612
|
+
for (const profile of Object.values(profiles)) {
|
|
1613
|
+
expect(profile).not.toHaveProperty("invariant");
|
|
1614
|
+
expect(profile).not.toHaveProperty("supportsVision");
|
|
1615
|
+
}
|
|
1845
1616
|
|
|
1846
1617
|
const savedProfiles = (
|
|
1847
1618
|
loadRawConfig().llm as { profiles: WireProfiles } | undefined
|
|
@@ -1849,6 +1620,7 @@ describe("config invariant flag enrichment", () => {
|
|
|
1849
1620
|
expect(savedProfiles).toBeDefined();
|
|
1850
1621
|
for (const profile of Object.values(savedProfiles!)) {
|
|
1851
1622
|
expect(profile).not.toHaveProperty("invariant");
|
|
1623
|
+
expect(profile).not.toHaveProperty("supportsVision");
|
|
1852
1624
|
}
|
|
1853
1625
|
});
|
|
1854
1626
|
});
|
|
@@ -2026,7 +1798,7 @@ describe("config writes to a per-agent acp entry", () => {
|
|
|
2026
1798
|
|
|
2027
1799
|
expect("model" in agentEntry(loadRawConfig())).toBe(false);
|
|
2028
1800
|
expect(AssistantConfigSchema.safeParse(loadRawConfig()).success).toBe(true);
|
|
2029
|
-
expect(
|
|
1801
|
+
expect(getConfig().acp.agents.claude?.model).toBeUndefined();
|
|
2030
1802
|
});
|
|
2031
1803
|
|
|
2032
1804
|
test("a nulled per-agent command is dropped on both write paths", async () => {
|
|
@@ -2036,7 +1808,7 @@ describe("config writes to a per-agent acp entry", () => {
|
|
|
2036
1808
|
|
|
2037
1809
|
expect("command" in agentEntry(loadRawConfig())).toBe(false);
|
|
2038
1810
|
expect(AssistantConfigSchema.safeParse(loadRawConfig()).success).toBe(true);
|
|
2039
|
-
expect(
|
|
1811
|
+
expect(getConfig().acp.agents.claude?.command).toBeUndefined();
|
|
2040
1812
|
|
|
2041
1813
|
seedRawConfig();
|
|
2042
1814
|
await patchRoute.handler({
|
|
@@ -2047,7 +1819,7 @@ describe("config writes to a per-agent acp entry", () => {
|
|
|
2047
1819
|
expect("command" in patched).toBe(false);
|
|
2048
1820
|
expect(patched.model).toBe("opus");
|
|
2049
1821
|
expect(AssistantConfigSchema.safeParse(loadRawConfig()).success).toBe(true);
|
|
2050
|
-
expect(
|
|
1822
|
+
expect(getConfig().acp.agents.claude?.command).toBeUndefined();
|
|
2051
1823
|
});
|
|
2052
1824
|
|
|
2053
1825
|
test("a nulled command on an id with no bundled profile is rejected", async () => {
|
|
@@ -2078,7 +1850,7 @@ describe("config writes to a per-agent acp entry", () => {
|
|
|
2078
1850
|
const entry = agentEntry(loadRawConfig());
|
|
2079
1851
|
expect("command" in entry).toBe(false);
|
|
2080
1852
|
expect(AssistantConfigSchema.safeParse(loadRawConfig()).success).toBe(true);
|
|
2081
|
-
expect(
|
|
1853
|
+
expect(getConfig().acp.agents.claude?.model).toBe("sonnet");
|
|
2082
1854
|
});
|
|
2083
1855
|
});
|
|
2084
1856
|
|
|
@@ -2233,7 +2005,7 @@ describe("persisted chat settings", () => {
|
|
|
2233
2005
|
|
|
2234
2006
|
// Nulled leaves reset to the schema default on the canonical save (the
|
|
2235
2007
|
// read-time recovery had already cleaned the stored nulls).
|
|
2236
|
-
expect(
|
|
2008
|
+
expect(getConfig().conversations.autoArchive).toEqual({
|
|
2237
2009
|
enabled: false,
|
|
2238
2010
|
afterDays: 7,
|
|
2239
2011
|
});
|
|
@@ -2285,11 +2057,11 @@ describe("persisted chat settings", () => {
|
|
|
2285
2057
|
notifications: { newMessageEnabled: false },
|
|
2286
2058
|
});
|
|
2287
2059
|
invalidateConfigCache();
|
|
2288
|
-
expect(
|
|
2060
|
+
expect(getConfig().conversations.autoArchive).toEqual({
|
|
2289
2061
|
enabled: true,
|
|
2290
2062
|
afterDays: 30,
|
|
2291
2063
|
});
|
|
2292
|
-
expect(
|
|
2064
|
+
expect(getConfig().notifications.newMessageEnabled).toBe(false);
|
|
2293
2065
|
expect(await getRoute.handler({})).toEqual(result);
|
|
2294
2066
|
expect(initializeProvidersCalls).toBe(1);
|
|
2295
2067
|
expect(clearEmbeddingBackendCacheCalls).toBe(1);
|
|
@@ -2321,11 +2093,11 @@ describe("persisted chat settings", () => {
|
|
|
2321
2093
|
});
|
|
2322
2094
|
// The nulled leaves restore to the schema defaults on the canonical
|
|
2323
2095
|
// save; the unknown sibling key (futureOption) doesn't persist.
|
|
2324
|
-
expect(
|
|
2096
|
+
expect(getConfig().conversations.autoArchive).toEqual({
|
|
2325
2097
|
enabled: false,
|
|
2326
2098
|
afterDays: 7,
|
|
2327
2099
|
});
|
|
2328
|
-
expect(
|
|
2100
|
+
expect(getConfig().notifications.newMessageEnabled).toBe(true);
|
|
2329
2101
|
expect(
|
|
2330
2102
|
"futureOption" in
|
|
2331
2103
|
(loadRawConfig().conversations as Record<string, unknown>),
|
|
@@ -2343,11 +2115,11 @@ describe("persisted chat settings", () => {
|
|
|
2343
2115
|
});
|
|
2344
2116
|
// The nulled subtrees restore to the schema defaults on the canonical
|
|
2345
2117
|
// save — the same values a fresh read would materialize.
|
|
2346
|
-
expect(
|
|
2118
|
+
expect(getConfig().conversations.autoArchive).toEqual({
|
|
2347
2119
|
enabled: false,
|
|
2348
2120
|
afterDays: 7,
|
|
2349
2121
|
});
|
|
2350
|
-
expect(
|
|
2122
|
+
expect(getConfig().notifications.newMessageEnabled).toBe(true);
|
|
2351
2123
|
});
|
|
2352
2124
|
|
|
2353
2125
|
test.each([
|
|
@@ -2429,7 +2201,7 @@ describe("persisted chat settings", () => {
|
|
|
2429
2201
|
await setRoute.handler({
|
|
2430
2202
|
body: { path: "notifications.newMessageEnabled", value: true },
|
|
2431
2203
|
});
|
|
2432
|
-
expect(
|
|
2204
|
+
expect(getConfig().notifications.newMessageEnabled).toBe(true);
|
|
2433
2205
|
// Schema-canonical saves strip keys the schema doesn't know.
|
|
2434
2206
|
expect(
|
|
2435
2207
|
"futureOption" in
|
|
@@ -27,7 +27,7 @@ import {
|
|
|
27
27
|
getDefaultPluginRouteRoots,
|
|
28
28
|
getDefaultPluginRoutesDir,
|
|
29
29
|
} from "../../../plugins/defaults/main.js";
|
|
30
|
-
import { getWorkspacePluginsDir } from "../../../util/
|
|
30
|
+
import { getWorkspacePluginsDir } from "../../../util/layout.js";
|
|
31
31
|
import { UserRouteDispatcher } from "../user-route-dispatcher.js";
|
|
32
32
|
import {
|
|
33
33
|
isRouteTestPath,
|