@mycadet/assistant 0.12.9 → 0.12.11
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/node_modules/@mycadet/ces-client/node_modules/@mycadet/service-contracts/src/__tests__/ingress.test.ts +8 -8
- package/node_modules/@mycadet/ces-client/node_modules/@mycadet/service-contracts/src/ingress.ts +1 -1
- package/node_modules/@mycadet/ces-client/src/http-credentials.ts +18 -1
- package/node_modules/@mycadet/gateway-client/node_modules/@mycadet/service-contracts/src/__tests__/ingress.test.ts +8 -8
- package/node_modules/@mycadet/gateway-client/node_modules/@mycadet/service-contracts/src/ingress.ts +1 -1
- package/node_modules/@mycadet/service-contracts/src/__tests__/ingress.test.ts +8 -8
- package/node_modules/@mycadet/service-contracts/src/ingress.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 +87 -404
- 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 +25 -32
- 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 +72 -298
- 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 +49 -706
- 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.
|
|
1821
|
-
const body = await configGetRoute.handler({});
|
|
1822
|
-
const profiles = wireProfiles(body);
|
|
1823
|
-
|
|
1824
|
-
for (const name of ["balanced", "quality-optimized", "latency-optimized"]) {
|
|
1825
|
-
expect(profiles[name]!.invariant).toBe(true);
|
|
1826
|
-
}
|
|
1827
|
-
});
|
|
1828
|
-
|
|
1829
|
-
test("GET /v1/config hides managed backups from the picker catalog", async () => {
|
|
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.
|
|
1830
1595
|
const body = await configGetRoute.handler({});
|
|
1831
1596
|
const profiles = wireProfiles(body);
|
|
1832
1597
|
|
|
1833
|
-
|
|
1834
|
-
|
|
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,11 +1620,12 @@ 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
|
});
|
|
1855
1627
|
|
|
1856
|
-
describe("provider
|
|
1628
|
+
describe("provider labels follow the open-string Zod schema", () => {
|
|
1857
1629
|
const configPatchRoute = ROUTES.find(
|
|
1858
1630
|
(r) => r.operationId === "config_patch",
|
|
1859
1631
|
)!;
|
|
@@ -1887,21 +1659,23 @@ describe("provider membership at the write choke point", () => {
|
|
|
1887
1659
|
expect(llm.profiles?.work?.provider).toBe("anthropic-work");
|
|
1888
1660
|
});
|
|
1889
1661
|
|
|
1890
|
-
test("
|
|
1662
|
+
test("a new provider label is accepted by the schema", async () => {
|
|
1891
1663
|
rawConfigFixture = { llm: {} };
|
|
1892
1664
|
seedRawConfig();
|
|
1893
|
-
|
|
1894
|
-
|
|
1895
|
-
|
|
1896
|
-
|
|
1897
|
-
|
|
1898
|
-
|
|
1899
|
-
|
|
1665
|
+
await configPatchRoute.handler({
|
|
1666
|
+
body: {
|
|
1667
|
+
llm: {
|
|
1668
|
+
profiles: {
|
|
1669
|
+
work: {
|
|
1670
|
+
source: "user",
|
|
1671
|
+
provider: "anthropic-work",
|
|
1672
|
+
model: "claude-opus-4-8",
|
|
1900
1673
|
},
|
|
1901
1674
|
},
|
|
1902
1675
|
},
|
|
1903
|
-
}
|
|
1904
|
-
)
|
|
1676
|
+
},
|
|
1677
|
+
});
|
|
1678
|
+
expect(persistedProfile("work").provider).toBe("anthropic-work");
|
|
1905
1679
|
});
|
|
1906
1680
|
});
|
|
1907
1681
|
|
|
@@ -2026,7 +1800,7 @@ describe("config writes to a per-agent acp entry", () => {
|
|
|
2026
1800
|
|
|
2027
1801
|
expect("model" in agentEntry(loadRawConfig())).toBe(false);
|
|
2028
1802
|
expect(AssistantConfigSchema.safeParse(loadRawConfig()).success).toBe(true);
|
|
2029
|
-
expect(
|
|
1803
|
+
expect(getConfig().acp.agents.claude?.model).toBeUndefined();
|
|
2030
1804
|
});
|
|
2031
1805
|
|
|
2032
1806
|
test("a nulled per-agent command is dropped on both write paths", async () => {
|
|
@@ -2036,7 +1810,7 @@ describe("config writes to a per-agent acp entry", () => {
|
|
|
2036
1810
|
|
|
2037
1811
|
expect("command" in agentEntry(loadRawConfig())).toBe(false);
|
|
2038
1812
|
expect(AssistantConfigSchema.safeParse(loadRawConfig()).success).toBe(true);
|
|
2039
|
-
expect(
|
|
1813
|
+
expect(getConfig().acp.agents.claude?.command).toBeUndefined();
|
|
2040
1814
|
|
|
2041
1815
|
seedRawConfig();
|
|
2042
1816
|
await patchRoute.handler({
|
|
@@ -2047,7 +1821,7 @@ describe("config writes to a per-agent acp entry", () => {
|
|
|
2047
1821
|
expect("command" in patched).toBe(false);
|
|
2048
1822
|
expect(patched.model).toBe("opus");
|
|
2049
1823
|
expect(AssistantConfigSchema.safeParse(loadRawConfig()).success).toBe(true);
|
|
2050
|
-
expect(
|
|
1824
|
+
expect(getConfig().acp.agents.claude?.command).toBeUndefined();
|
|
2051
1825
|
});
|
|
2052
1826
|
|
|
2053
1827
|
test("a nulled command on an id with no bundled profile is rejected", async () => {
|
|
@@ -2078,7 +1852,7 @@ describe("config writes to a per-agent acp entry", () => {
|
|
|
2078
1852
|
const entry = agentEntry(loadRawConfig());
|
|
2079
1853
|
expect("command" in entry).toBe(false);
|
|
2080
1854
|
expect(AssistantConfigSchema.safeParse(loadRawConfig()).success).toBe(true);
|
|
2081
|
-
expect(
|
|
1855
|
+
expect(getConfig().acp.agents.claude?.model).toBe("sonnet");
|
|
2082
1856
|
});
|
|
2083
1857
|
});
|
|
2084
1858
|
|
|
@@ -2233,7 +2007,7 @@ describe("persisted chat settings", () => {
|
|
|
2233
2007
|
|
|
2234
2008
|
// Nulled leaves reset to the schema default on the canonical save (the
|
|
2235
2009
|
// read-time recovery had already cleaned the stored nulls).
|
|
2236
|
-
expect(
|
|
2010
|
+
expect(getConfig().conversations.autoArchive).toEqual({
|
|
2237
2011
|
enabled: false,
|
|
2238
2012
|
afterDays: 7,
|
|
2239
2013
|
});
|
|
@@ -2285,11 +2059,11 @@ describe("persisted chat settings", () => {
|
|
|
2285
2059
|
notifications: { newMessageEnabled: false },
|
|
2286
2060
|
});
|
|
2287
2061
|
invalidateConfigCache();
|
|
2288
|
-
expect(
|
|
2062
|
+
expect(getConfig().conversations.autoArchive).toEqual({
|
|
2289
2063
|
enabled: true,
|
|
2290
2064
|
afterDays: 30,
|
|
2291
2065
|
});
|
|
2292
|
-
expect(
|
|
2066
|
+
expect(getConfig().notifications.newMessageEnabled).toBe(false);
|
|
2293
2067
|
expect(await getRoute.handler({})).toEqual(result);
|
|
2294
2068
|
expect(initializeProvidersCalls).toBe(1);
|
|
2295
2069
|
expect(clearEmbeddingBackendCacheCalls).toBe(1);
|
|
@@ -2321,11 +2095,11 @@ describe("persisted chat settings", () => {
|
|
|
2321
2095
|
});
|
|
2322
2096
|
// The nulled leaves restore to the schema defaults on the canonical
|
|
2323
2097
|
// save; the unknown sibling key (futureOption) doesn't persist.
|
|
2324
|
-
expect(
|
|
2098
|
+
expect(getConfig().conversations.autoArchive).toEqual({
|
|
2325
2099
|
enabled: false,
|
|
2326
2100
|
afterDays: 7,
|
|
2327
2101
|
});
|
|
2328
|
-
expect(
|
|
2102
|
+
expect(getConfig().notifications.newMessageEnabled).toBe(true);
|
|
2329
2103
|
expect(
|
|
2330
2104
|
"futureOption" in
|
|
2331
2105
|
(loadRawConfig().conversations as Record<string, unknown>),
|
|
@@ -2343,11 +2117,11 @@ describe("persisted chat settings", () => {
|
|
|
2343
2117
|
});
|
|
2344
2118
|
// The nulled subtrees restore to the schema defaults on the canonical
|
|
2345
2119
|
// save — the same values a fresh read would materialize.
|
|
2346
|
-
expect(
|
|
2120
|
+
expect(getConfig().conversations.autoArchive).toEqual({
|
|
2347
2121
|
enabled: false,
|
|
2348
2122
|
afterDays: 7,
|
|
2349
2123
|
});
|
|
2350
|
-
expect(
|
|
2124
|
+
expect(getConfig().notifications.newMessageEnabled).toBe(true);
|
|
2351
2125
|
});
|
|
2352
2126
|
|
|
2353
2127
|
test.each([
|
|
@@ -2429,7 +2203,7 @@ describe("persisted chat settings", () => {
|
|
|
2429
2203
|
await setRoute.handler({
|
|
2430
2204
|
body: { path: "notifications.newMessageEnabled", value: true },
|
|
2431
2205
|
});
|
|
2432
|
-
expect(
|
|
2206
|
+
expect(getConfig().notifications.newMessageEnabled).toBe(true);
|
|
2433
2207
|
// Schema-canonical saves strip keys the schema doesn't know.
|
|
2434
2208
|
expect(
|
|
2435
2209
|
"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,
|