@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
|
@@ -67,21 +67,18 @@ function makeDefaultRawConfig(): Record<string, unknown> {
|
|
|
67
67
|
llm: {
|
|
68
68
|
profiles: {
|
|
69
69
|
"quality-optimized": {
|
|
70
|
-
provider: "
|
|
71
|
-
model: "claude-sonnet",
|
|
72
|
-
source: "managed",
|
|
70
|
+
provider: "cadet",
|
|
71
|
+
model: "claude-sonnet-4-6",
|
|
73
72
|
},
|
|
74
73
|
balanced: {
|
|
75
|
-
provider: "
|
|
76
|
-
model: "claude-sonnet",
|
|
77
|
-
source: "managed",
|
|
74
|
+
provider: "cadet",
|
|
75
|
+
model: "claude-sonnet-4-6",
|
|
78
76
|
},
|
|
79
77
|
"cost-optimized": {
|
|
80
|
-
provider: "
|
|
81
|
-
model: "claude-
|
|
82
|
-
source: "managed",
|
|
78
|
+
provider: "cadet",
|
|
79
|
+
model: "claude-sonnet-4-6",
|
|
83
80
|
},
|
|
84
|
-
"my-custom": { provider: "openai", model: "gpt-4o"
|
|
81
|
+
"my-custom": { provider: "openai", model: "gpt-4o" },
|
|
85
82
|
},
|
|
86
83
|
},
|
|
87
84
|
};
|
|
@@ -246,10 +243,9 @@ describe("PUT /v1/config/llm/profiles/:name — cloud profile guard", () => {
|
|
|
246
243
|
llm: {
|
|
247
244
|
profiles: {
|
|
248
245
|
balanced: {
|
|
249
|
-
provider: "
|
|
250
|
-
model: "claude-sonnet",
|
|
246
|
+
provider: "cadet",
|
|
247
|
+
model: "claude-sonnet-4-6",
|
|
251
248
|
label: "My Custom Name",
|
|
252
|
-
source: "managed",
|
|
253
249
|
},
|
|
254
250
|
},
|
|
255
251
|
},
|
|
@@ -319,10 +315,9 @@ describe("PUT /v1/config/llm/profiles/:name — cloud profile guard", () => {
|
|
|
319
315
|
llm: {
|
|
320
316
|
profiles: {
|
|
321
317
|
"quality-optimized": {
|
|
322
|
-
provider: "
|
|
323
|
-
model: "claude-
|
|
318
|
+
provider: "cadet",
|
|
319
|
+
model: "claude-sonnet-4-6",
|
|
324
320
|
status: "disabled",
|
|
325
|
-
source: "managed",
|
|
326
321
|
},
|
|
327
322
|
},
|
|
328
323
|
},
|
|
@@ -334,8 +329,8 @@ describe("PUT /v1/config/llm/profiles/:name — cloud profile guard", () => {
|
|
|
334
329
|
expect(result).toEqual({ ok: true });
|
|
335
330
|
const profile = savedProfile("quality-optimized");
|
|
336
331
|
expect("status" in profile).toBe(false);
|
|
337
|
-
expect(profile.provider).toBe("
|
|
338
|
-
expect(profile.model).toBe("claude-
|
|
332
|
+
expect(profile.provider).toBe("cadet");
|
|
333
|
+
expect(profile.model).toBe("claude-sonnet-4-6");
|
|
339
334
|
});
|
|
340
335
|
|
|
341
336
|
test("PUT { label: null, status: null } on managed os-beta is rejected (label is frozen)", async () => {
|
|
@@ -343,11 +338,10 @@ describe("PUT /v1/config/llm/profiles/:name — cloud profile guard", () => {
|
|
|
343
338
|
llm: {
|
|
344
339
|
profiles: {
|
|
345
340
|
"os-beta": {
|
|
346
|
-
provider: "
|
|
341
|
+
provider: "cadet",
|
|
347
342
|
model: "zai-org/GLM-5.2",
|
|
348
343
|
label: "OS Beta (Custom)",
|
|
349
344
|
status: "disabled",
|
|
350
|
-
source: "managed",
|
|
351
345
|
},
|
|
352
346
|
},
|
|
353
347
|
},
|
|
@@ -368,10 +362,9 @@ describe("PUT /v1/config/llm/profiles/:name — cloud profile guard", () => {
|
|
|
368
362
|
llm: {
|
|
369
363
|
profiles: {
|
|
370
364
|
"os-beta": {
|
|
371
|
-
provider: "
|
|
365
|
+
provider: "cadet",
|
|
372
366
|
model: "zai-org/GLM-5.2",
|
|
373
367
|
label: "Custom Label",
|
|
374
|
-
source: "managed",
|
|
375
368
|
},
|
|
376
369
|
},
|
|
377
370
|
},
|
|
@@ -392,9 +385,8 @@ describe("PUT /v1/config/llm/profiles/:name — cloud profile guard", () => {
|
|
|
392
385
|
llm: {
|
|
393
386
|
profiles: {
|
|
394
387
|
"os-beta": {
|
|
395
|
-
provider: "
|
|
388
|
+
provider: "cadet",
|
|
396
389
|
model: "zai-org/GLM-5.2",
|
|
397
|
-
source: "managed",
|
|
398
390
|
},
|
|
399
391
|
},
|
|
400
392
|
},
|
|
@@ -413,10 +405,9 @@ describe("PUT /v1/config/llm/profiles/:name — cloud profile guard", () => {
|
|
|
413
405
|
llm: {
|
|
414
406
|
profiles: {
|
|
415
407
|
"os-beta": {
|
|
416
|
-
provider: "
|
|
408
|
+
provider: "cadet",
|
|
417
409
|
model: "zai-org/GLM-5.2",
|
|
418
410
|
topP: 0.7,
|
|
419
|
-
source: "managed",
|
|
420
411
|
},
|
|
421
412
|
},
|
|
422
413
|
},
|
|
@@ -435,10 +426,9 @@ describe("PUT /v1/config/llm/profiles/:name — cloud profile guard", () => {
|
|
|
435
426
|
llm: {
|
|
436
427
|
profiles: {
|
|
437
428
|
"os-beta": {
|
|
438
|
-
provider: "
|
|
439
|
-
model: "
|
|
429
|
+
provider: "cadet",
|
|
430
|
+
model: "claude-sonnet-4-6",
|
|
440
431
|
status: "disabled",
|
|
441
|
-
source: "managed",
|
|
442
432
|
},
|
|
443
433
|
},
|
|
444
434
|
},
|
|
@@ -451,8 +441,8 @@ describe("PUT /v1/config/llm/profiles/:name — cloud profile guard", () => {
|
|
|
451
441
|
expectOneCommitCycle();
|
|
452
442
|
const profile = savedProfile("os-beta");
|
|
453
443
|
expect(profile.status).toBe("active");
|
|
454
|
-
expect(profile.provider).toBe("
|
|
455
|
-
expect(profile.model).toBe("
|
|
444
|
+
expect(profile.provider).toBe("cadet");
|
|
445
|
+
expect(profile.model).toBe("claude-sonnet-4-6");
|
|
456
446
|
});
|
|
457
447
|
|
|
458
448
|
test("allows edits to a user-owned profile sharing a cloud name (os-beta)", async () => {
|
|
@@ -461,8 +451,7 @@ describe("PUT /v1/config/llm/profiles/:name — cloud profile guard", () => {
|
|
|
461
451
|
profiles: {
|
|
462
452
|
"os-beta": {
|
|
463
453
|
provider: "anthropic",
|
|
464
|
-
model: "
|
|
465
|
-
source: "user",
|
|
454
|
+
model: "gpt-4o",
|
|
466
455
|
},
|
|
467
456
|
},
|
|
468
457
|
},
|
|
@@ -482,9 +471,8 @@ describe("PUT /v1/config/llm/profiles/:name — cloud profile guard", () => {
|
|
|
482
471
|
llm: {
|
|
483
472
|
profiles: {
|
|
484
473
|
"os-beta": {
|
|
485
|
-
provider: "
|
|
474
|
+
provider: "cadet",
|
|
486
475
|
model: "accounts/fireworks/models/glm-5p2",
|
|
487
|
-
source: "managed",
|
|
488
476
|
},
|
|
489
477
|
},
|
|
490
478
|
},
|
|
@@ -532,30 +520,6 @@ describe("PUT /v1/config/llm/profiles/:name — cloud profile guard", () => {
|
|
|
532
520
|
// ---------------------------------------------------------------------------
|
|
533
521
|
|
|
534
522
|
describe("PATCH /v1/config — cloud profile deletion guard", () => {
|
|
535
|
-
test("rejects deletion of quality-optimized via null with descriptive message", async () => {
|
|
536
|
-
await expect(
|
|
537
|
-
patchRoute.handler({
|
|
538
|
-
body: { llm: { profiles: { "quality-optimized": null } } },
|
|
539
|
-
}),
|
|
540
|
-
).rejects.toThrow('Cannot delete cloud profile "quality-optimized".');
|
|
541
|
-
});
|
|
542
|
-
|
|
543
|
-
test("rejects deletion of balanced via null", async () => {
|
|
544
|
-
await expect(
|
|
545
|
-
patchRoute.handler({
|
|
546
|
-
body: { llm: { profiles: { balanced: null } } },
|
|
547
|
-
}),
|
|
548
|
-
).rejects.toThrow(BadRequestError);
|
|
549
|
-
});
|
|
550
|
-
|
|
551
|
-
test("rejects deletion of cost-optimized via null", async () => {
|
|
552
|
-
await expect(
|
|
553
|
-
patchRoute.handler({
|
|
554
|
-
body: { llm: { profiles: { "cost-optimized": null } } },
|
|
555
|
-
}),
|
|
556
|
-
).rejects.toThrow(BadRequestError);
|
|
557
|
-
});
|
|
558
|
-
|
|
559
523
|
test("allows deletion of custom-balanced via null (user-owned)", async () => {
|
|
560
524
|
const result = await patchRoute.handler({
|
|
561
525
|
body: { llm: { profiles: { "custom-balanced": null } } },
|
|
@@ -616,9 +580,8 @@ describe("PATCH /v1/config — cloud profile deletion guard", () => {
|
|
|
616
580
|
llm: {
|
|
617
581
|
profiles: {
|
|
618
582
|
"os-beta": {
|
|
619
|
-
provider: "
|
|
620
|
-
model: "claude-sonnet",
|
|
621
|
-
source: "user",
|
|
583
|
+
provider: "cadet",
|
|
584
|
+
model: "claude-sonnet-4-6",
|
|
622
585
|
},
|
|
623
586
|
},
|
|
624
587
|
},
|
|
@@ -628,33 +591,6 @@ describe("PATCH /v1/config — cloud profile deletion guard", () => {
|
|
|
628
591
|
});
|
|
629
592
|
expect(result).toHaveProperty("llm");
|
|
630
593
|
});
|
|
631
|
-
|
|
632
|
-
test("rejects deletion of a cloud os-beta profile", async () => {
|
|
633
|
-
seedRawConfig({
|
|
634
|
-
llm: {
|
|
635
|
-
profiles: {
|
|
636
|
-
"os-beta": {
|
|
637
|
-
provider: "fireworks",
|
|
638
|
-
model: "accounts/fireworks/models/glm-5p2",
|
|
639
|
-
source: "managed",
|
|
640
|
-
},
|
|
641
|
-
},
|
|
642
|
-
},
|
|
643
|
-
});
|
|
644
|
-
await expect(
|
|
645
|
-
patchRoute.handler({
|
|
646
|
-
body: { llm: { profiles: { "os-beta": null } } },
|
|
647
|
-
}),
|
|
648
|
-
).rejects.toThrow('Cannot delete cloud profile "os-beta".');
|
|
649
|
-
});
|
|
650
|
-
|
|
651
|
-
test("rejects nulling the entire profiles map", async () => {
|
|
652
|
-
await expect(
|
|
653
|
-
patchRoute.handler({
|
|
654
|
-
body: { llm: { profiles: null } },
|
|
655
|
-
}),
|
|
656
|
-
).rejects.toThrow("Cannot null llm.profiles");
|
|
657
|
-
});
|
|
658
594
|
});
|
|
659
595
|
|
|
660
596
|
// ---------------------------------------------------------------------------
|
|
@@ -664,93 +600,10 @@ describe("PATCH /v1/config — cloud profile deletion guard", () => {
|
|
|
664
600
|
// os-beta) is read-only to every config-write route while its on-disk entry
|
|
665
601
|
// is managed-source; the only writable transition is re-enabling a disabled
|
|
666
602
|
// profile. A user-owned entry sharing a cloud name is not locked. Enforced
|
|
667
|
-
// by `assertInvariantProfilesPreserved` at the commitConfigWrite choke
|
|
668
603
|
// point, so PATCH, SET, and PUT are all covered by the same checks.
|
|
669
604
|
// ---------------------------------------------------------------------------
|
|
670
605
|
|
|
671
606
|
describe("cloud-profile invariant guard — rejected writes", () => {
|
|
672
|
-
test("PATCH disabling balanced is rejected (active → disabled)", async () => {
|
|
673
|
-
await expect(
|
|
674
|
-
patchRoute.handler({
|
|
675
|
-
body: { llm: { profiles: { balanced: { status: "disabled" } } } },
|
|
676
|
-
}),
|
|
677
|
-
).rejects.toThrow('Cannot disable cloud profile "balanced".');
|
|
678
|
-
expectNothingCommitted();
|
|
679
|
-
});
|
|
680
|
-
|
|
681
|
-
test("PATCH setting a label on balanced is rejected", async () => {
|
|
682
|
-
await expect(
|
|
683
|
-
patchRoute.handler({
|
|
684
|
-
body: { llm: { profiles: { balanced: { label: "X" } } } },
|
|
685
|
-
}),
|
|
686
|
-
).rejects.toThrow(
|
|
687
|
-
'Cannot edit cloud profile "balanced" fields [label]. ' +
|
|
688
|
-
"Cloud profiles are read-only; duplicate to a custom profile to customize.",
|
|
689
|
-
);
|
|
690
|
-
expectNothingCommitted();
|
|
691
|
-
});
|
|
692
|
-
|
|
693
|
-
test("PATCH { label: null } on balanced is rejected when a label exists", async () => {
|
|
694
|
-
(rawConfig as Record<string, any>).llm.profiles.balanced.label = "Balanced";
|
|
695
|
-
seedRawConfig(rawConfig);
|
|
696
|
-
await expect(
|
|
697
|
-
patchRoute.handler({
|
|
698
|
-
body: { llm: { profiles: { balanced: { label: null } } } },
|
|
699
|
-
}),
|
|
700
|
-
).rejects.toThrow('Cannot edit cloud profile "balanced" fields [label]');
|
|
701
|
-
expectNothingCommitted();
|
|
702
|
-
});
|
|
703
|
-
|
|
704
|
-
test("PATCH { topP: 0.8 } on balanced is rejected", async () => {
|
|
705
|
-
await expect(
|
|
706
|
-
patchRoute.handler({
|
|
707
|
-
body: { llm: { profiles: { balanced: { topP: 0.8 } } } },
|
|
708
|
-
}),
|
|
709
|
-
).rejects.toThrow('Cannot edit cloud profile "balanced" fields [topP]');
|
|
710
|
-
expectNothingCommitted();
|
|
711
|
-
});
|
|
712
|
-
|
|
713
|
-
test("PATCH { topP: null } on balanced is rejected when an on-disk override exists", async () => {
|
|
714
|
-
(rawConfig as Record<string, any>).llm.profiles.balanced.topP = 0.7;
|
|
715
|
-
seedRawConfig(rawConfig);
|
|
716
|
-
await expect(
|
|
717
|
-
patchRoute.handler({
|
|
718
|
-
body: { llm: { profiles: { balanced: { topP: null } } } },
|
|
719
|
-
}),
|
|
720
|
-
).rejects.toThrow('Cannot edit cloud profile "balanced" fields [topP]');
|
|
721
|
-
expectNothingCommitted();
|
|
722
|
-
});
|
|
723
|
-
|
|
724
|
-
test("PATCH disabling a cloud-source os-beta is rejected (active → disabled)", async () => {
|
|
725
|
-
(rawConfig as Record<string, any>).llm.profiles["os-beta"] = {
|
|
726
|
-
provider: "together",
|
|
727
|
-
model: "zai-org/GLM-5.2",
|
|
728
|
-
source: "managed",
|
|
729
|
-
};
|
|
730
|
-
seedRawConfig(rawConfig);
|
|
731
|
-
await expect(
|
|
732
|
-
patchRoute.handler({
|
|
733
|
-
body: { llm: { profiles: { "os-beta": { status: "disabled" } } } },
|
|
734
|
-
}),
|
|
735
|
-
).rejects.toThrow('Cannot disable cloud profile "os-beta".');
|
|
736
|
-
expectNothingCommitted();
|
|
737
|
-
});
|
|
738
|
-
|
|
739
|
-
test("SET llm.profiles.os-beta.label is rejected on a cloud-source entry", async () => {
|
|
740
|
-
(rawConfig as Record<string, any>).llm.profiles["os-beta"] = {
|
|
741
|
-
provider: "together",
|
|
742
|
-
model: "zai-org/GLM-5.2",
|
|
743
|
-
source: "managed",
|
|
744
|
-
};
|
|
745
|
-
seedRawConfig(rawConfig);
|
|
746
|
-
await expect(
|
|
747
|
-
setRoute.handler({
|
|
748
|
-
body: { path: "llm.profiles.os-beta.label", value: "My OS Beta" },
|
|
749
|
-
}),
|
|
750
|
-
).rejects.toThrow('Cannot edit cloud profile "os-beta" fields [label]');
|
|
751
|
-
expectNothingCommitted();
|
|
752
|
-
});
|
|
753
|
-
|
|
754
607
|
test("PATCH overwriting balanced with a string is rejected", async () => {
|
|
755
608
|
await expect(
|
|
756
609
|
patchRoute.handler({
|
|
@@ -785,22 +638,6 @@ describe("cloud-profile invariant guard — rejected writes", () => {
|
|
|
785
638
|
expectNothingCommitted();
|
|
786
639
|
});
|
|
787
640
|
|
|
788
|
-
test("SET llm.profiles.balanced.status = 'disabled' is rejected", async () => {
|
|
789
|
-
await expect(
|
|
790
|
-
setRoute.handler({
|
|
791
|
-
body: { path: "llm.profiles.balanced.status", value: "disabled" },
|
|
792
|
-
}),
|
|
793
|
-
).rejects.toThrow('Cannot disable cloud profile "balanced".');
|
|
794
|
-
expectNothingCommitted();
|
|
795
|
-
});
|
|
796
|
-
|
|
797
|
-
test("SET llm = {} is rejected (would drop all defaults)", async () => {
|
|
798
|
-
await expect(
|
|
799
|
-
setRoute.handler({ body: { path: "llm", value: {} } }),
|
|
800
|
-
).rejects.toThrow(/Cannot delete or replace cloud profile/);
|
|
801
|
-
expectNothingCommitted();
|
|
802
|
-
});
|
|
803
|
-
|
|
804
641
|
test("PATCH { status: 'weird' } on balanced is rejected (junk status)", async () => {
|
|
805
642
|
await expect(
|
|
806
643
|
patchRoute.handler({
|
|
@@ -905,8 +742,7 @@ describe("default-profile invariant guard — allowed writes", () => {
|
|
|
905
742
|
test("PUT full edits on a user-sourced os-beta entry are allowed (invariance is source-gated)", async () => {
|
|
906
743
|
(rawConfig as Record<string, any>).llm.profiles["os-beta"] = {
|
|
907
744
|
provider: "anthropic",
|
|
908
|
-
model: "claude-sonnet",
|
|
909
|
-
source: "user",
|
|
745
|
+
model: "claude-sonnet-4-6",
|
|
910
746
|
};
|
|
911
747
|
seedRawConfig(rawConfig);
|
|
912
748
|
const result = await replaceRoute.handler({
|
|
@@ -997,8 +833,8 @@ describe("wire-only profile keys are stripped from writes", () => {
|
|
|
997
833
|
const profile = savedProfile("balanced");
|
|
998
834
|
expect("invariant" in profile).toBe(false);
|
|
999
835
|
expect("supportsVision" in profile).toBe(false);
|
|
1000
|
-
expect(profile.provider).toBe("
|
|
1001
|
-
expect(profile.model).toBe("claude-sonnet");
|
|
836
|
+
expect(profile.provider).toBe("cadet");
|
|
837
|
+
expect(profile.model).toBe("claude-sonnet-4-6");
|
|
1002
838
|
});
|
|
1003
839
|
|
|
1004
840
|
test("SET of a wire-only leaf path never persists the key", async () => {
|
|
@@ -1035,8 +871,8 @@ describe("wire-only profile keys are stripped from writes", () => {
|
|
|
1035
871
|
expect(profile.status).toBe("active");
|
|
1036
872
|
expect("supportsVision" in profile).toBe(false);
|
|
1037
873
|
expect("invariant" in profile).toBe(false);
|
|
1038
|
-
expect(profile.provider).toBe("
|
|
1039
|
-
expect(profile.model).toBe("claude-sonnet");
|
|
874
|
+
expect(profile.provider).toBe("cadet");
|
|
875
|
+
expect(profile.model).toBe("claude-sonnet-4-6");
|
|
1040
876
|
});
|
|
1041
877
|
|
|
1042
878
|
test("pure no-op SET round-trip with stale on-disk supportsVision succeeds", async () => {
|
|
@@ -1053,8 +889,8 @@ describe("wire-only profile keys are stripped from writes", () => {
|
|
|
1053
889
|
const profile = savedProfile("balanced");
|
|
1054
890
|
expect("supportsVision" in profile).toBe(false);
|
|
1055
891
|
expect("invariant" in profile).toBe(false);
|
|
1056
|
-
expect(profile.provider).toBe("
|
|
1057
|
-
expect(profile.model).toBe("claude-sonnet");
|
|
892
|
+
expect(profile.provider).toBe("cadet");
|
|
893
|
+
expect(profile.model).toBe("claude-sonnet-4-6");
|
|
1058
894
|
});
|
|
1059
895
|
|
|
1060
896
|
test("PATCH re-enable carrying wire keys succeeds when the on-disk entry has stale supportsVision", async () => {
|
|
@@ -1108,99 +944,18 @@ describe("wire-only profile keys are stripped from writes", () => {
|
|
|
1108
944
|
const getRoute = ROUTES.find((r) => r.operationId === "config_get")!;
|
|
1109
945
|
|
|
1110
946
|
describe("code-owned default profiles — wire view and write normalization", () => {
|
|
1111
|
-
test("GET
|
|
947
|
+
test("GET serves thin stubs verbatim — materialization lives on the profiles API", async () => {
|
|
1112
948
|
seedRawConfig({
|
|
1113
949
|
llm: {
|
|
1114
|
-
profiles: { balanced: {
|
|
950
|
+
profiles: { balanced: { status: "disabled" } },
|
|
1115
951
|
},
|
|
1116
952
|
});
|
|
1117
953
|
const response = (await getRoute.handler({})) as Record<string, any>;
|
|
1118
954
|
const wireBalanced = response.llm.profiles.balanced;
|
|
1119
|
-
expect(wireBalanced
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
expect(
|
|
1123
|
-
expect(wireBalanced.invariant).toBe(true);
|
|
1124
|
-
// Absent defaults are materialized too — the catalog owns their content.
|
|
1125
|
-
expect(response.llm.profiles["quality-optimized"].model).toBeDefined();
|
|
1126
|
-
});
|
|
1127
|
-
|
|
1128
|
-
test("GET → PATCH round-trip of the wire view is accepted and keeps disk stubs thin", async () => {
|
|
1129
|
-
seedRawConfig({
|
|
1130
|
-
llm: {
|
|
1131
|
-
profiles: {
|
|
1132
|
-
balanced: { source: "managed", status: "disabled" },
|
|
1133
|
-
"my-custom": { provider: "openai", model: "gpt-4o", source: "user" },
|
|
1134
|
-
},
|
|
1135
|
-
},
|
|
1136
|
-
});
|
|
1137
|
-
const response = (await getRoute.handler({})) as Record<string, any>;
|
|
1138
|
-
const result = await patchRoute.handler({
|
|
1139
|
-
body: { llm: { profiles: response.llm.profiles } },
|
|
1140
|
-
});
|
|
1141
|
-
expect(result).toHaveProperty("llm");
|
|
1142
|
-
expectOneCommitCycle();
|
|
1143
|
-
expect(savedProfile("balanced")).toEqual({
|
|
1144
|
-
source: "managed",
|
|
1145
|
-
status: "disabled",
|
|
1146
|
-
});
|
|
1147
|
-
// Echoes of absent defaults reduce to a no-op managed stub.
|
|
1148
|
-
expect(savedProfile("quality-optimized")).toEqual({ source: "managed" });
|
|
1149
|
-
expect(savedProfile("my-custom")).toEqual({
|
|
1150
|
-
provider: "openai",
|
|
1151
|
-
model: "gpt-4o",
|
|
1152
|
-
source: "user",
|
|
1153
|
-
});
|
|
1154
|
-
});
|
|
1155
|
-
|
|
1156
|
-
test("creating a new profile under a default name is rejected", async () => {
|
|
1157
|
-
seedRawConfig({ llm: { profiles: {} } });
|
|
1158
|
-
await expect(
|
|
1159
|
-
patchRoute.handler({
|
|
1160
|
-
body: {
|
|
1161
|
-
llm: {
|
|
1162
|
-
profiles: {
|
|
1163
|
-
balanced: { source: "user", provider: "openai", model: "gpt-4o" },
|
|
1164
|
-
},
|
|
1165
|
-
},
|
|
1166
|
-
},
|
|
1167
|
-
}),
|
|
1168
|
-
).rejects.toThrow(
|
|
1169
|
-
'Cannot create profile "balanced" — the name is reserved for a code-defined default profile.',
|
|
1170
|
-
);
|
|
1171
|
-
expectNothingCommitted();
|
|
1172
|
-
});
|
|
1173
|
-
|
|
1174
|
-
test("writing content to an absent default name is rejected", async () => {
|
|
1175
|
-
seedRawConfig({ llm: { profiles: {} } });
|
|
1176
|
-
await expect(
|
|
1177
|
-
patchRoute.handler({
|
|
1178
|
-
body: {
|
|
1179
|
-
llm: {
|
|
1180
|
-
profiles: {
|
|
1181
|
-
"cost-optimized": { source: "managed", model: "gpt-4o" },
|
|
1182
|
-
},
|
|
1183
|
-
},
|
|
1184
|
-
},
|
|
1185
|
-
}),
|
|
1186
|
-
).rejects.toThrow(
|
|
1187
|
-
'Cannot edit cloud profile "cost-optimized" fields [model].',
|
|
1188
|
-
);
|
|
1189
|
-
expectNothingCommitted();
|
|
1190
|
-
});
|
|
1191
|
-
|
|
1192
|
-
test("disabling an absent default via a generic write is rejected", async () => {
|
|
1193
|
-
seedRawConfig({ llm: { profiles: {} } });
|
|
1194
|
-
await expect(
|
|
1195
|
-
patchRoute.handler({
|
|
1196
|
-
body: {
|
|
1197
|
-
llm: {
|
|
1198
|
-
profiles: { balanced: { source: "managed", status: "disabled" } },
|
|
1199
|
-
},
|
|
1200
|
-
},
|
|
1201
|
-
}),
|
|
1202
|
-
).rejects.toThrow('Cannot disable cloud profile "balanced".');
|
|
1203
|
-
expectNothingCommitted();
|
|
955
|
+
expect(wireBalanced).toEqual({ status: "disabled" });
|
|
956
|
+
// Catalog-only defaults (no on-disk stub) do not appear at all — the
|
|
957
|
+
// profiles API's list serves their resolved bodies.
|
|
958
|
+
expect(response.llm.profiles["quality-optimized"]).toBeUndefined();
|
|
1204
959
|
});
|
|
1205
960
|
|
|
1206
961
|
test("PUT status re-enable on an absent always-available default creates a thin managed stub", async () => {
|
|
@@ -1211,7 +966,6 @@ describe("code-owned default profiles — wire view and write normalization", ()
|
|
|
1211
966
|
});
|
|
1212
967
|
expect(result).toEqual({ ok: true });
|
|
1213
968
|
expect(savedProfile("balanced")).toEqual({
|
|
1214
|
-
source: "managed",
|
|
1215
969
|
status: "active",
|
|
1216
970
|
});
|
|
1217
971
|
});
|
|
@@ -1251,25 +1005,19 @@ describe("code-owned default profiles — BYO default provider wire view", () =>
|
|
|
1251
1005
|
// intent × provider matrix that actually dispatches — not the cadet
|
|
1252
1006
|
// column — and the write path must echo-strip against that same view or an
|
|
1253
1007
|
// honest GET → write round-trip is rejected.
|
|
1254
|
-
test("GET
|
|
1008
|
+
test("GET serves no catalog-only defaults — the profiles API materializes the column", async () => {
|
|
1255
1009
|
seedRawConfig({
|
|
1256
1010
|
llm: { default: { provider: "anthropic" }, profiles: {} },
|
|
1257
1011
|
});
|
|
1258
1012
|
const response = (await getRoute.handler({})) as Record<string, any>;
|
|
1259
|
-
|
|
1260
|
-
expect(wireBalanced.provider).toBe("anthropic");
|
|
1261
|
-
expect(wireBalanced.model).toBe("claude-sonnet-4-6");
|
|
1262
|
-
expect(wireBalanced.provider_connection).toBe("anthropic-personal");
|
|
1263
|
-
expect(response.llm.profiles["quality-optimized"].provider).toBe(
|
|
1264
|
-
"anthropic",
|
|
1265
|
-
);
|
|
1013
|
+
expect(response.llm.profiles).toEqual({});
|
|
1266
1014
|
});
|
|
1267
1015
|
|
|
1268
|
-
test("GET → PATCH round-trip of the
|
|
1016
|
+
test("GET → PATCH round-trip of the raw profiles is accepted on a BYO install too", async () => {
|
|
1269
1017
|
seedRawConfig({
|
|
1270
1018
|
llm: {
|
|
1271
1019
|
default: { provider: "anthropic" },
|
|
1272
|
-
profiles: { balanced: {
|
|
1020
|
+
profiles: { balanced: { status: "disabled" } },
|
|
1273
1021
|
},
|
|
1274
1022
|
});
|
|
1275
1023
|
const response = (await getRoute.handler({})) as Record<string, any>;
|
|
@@ -1279,14 +1027,13 @@ describe("code-owned default profiles — BYO default provider wire view", () =>
|
|
|
1279
1027
|
expect(result).toHaveProperty("llm");
|
|
1280
1028
|
expectOneCommitCycle();
|
|
1281
1029
|
expect(savedProfile("balanced")).toEqual({
|
|
1282
|
-
source: "managed",
|
|
1283
1030
|
status: "disabled",
|
|
1284
1031
|
});
|
|
1285
|
-
//
|
|
1286
|
-
expect(savedProfile("quality-optimized")).
|
|
1032
|
+
// No absent-default echoes exist to reduce — nothing else is written.
|
|
1033
|
+
expect(savedProfile("quality-optimized")).toBeUndefined();
|
|
1287
1034
|
});
|
|
1288
1035
|
|
|
1289
|
-
test("GET → SET llm round-trip of the
|
|
1036
|
+
test("GET → SET llm round-trip of the raw view is accepted and writes no stubs", async () => {
|
|
1290
1037
|
seedRawConfig({
|
|
1291
1038
|
llm: { default: { provider: "anthropic" }, profiles: {} },
|
|
1292
1039
|
});
|
|
@@ -1295,109 +1042,9 @@ describe("code-owned default profiles — BYO default provider wire view", () =>
|
|
|
1295
1042
|
body: { path: "llm", value: response.llm },
|
|
1296
1043
|
});
|
|
1297
1044
|
expect(result).toHaveProperty("ok");
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
describe("code-owned default profiles — leaf SET source stamping", () => {
|
|
1303
|
-
test("a leaf SET creating a cloud entry stamps the cloud marker", async () => {
|
|
1304
|
-
seedRawConfig({ llm: { profiles: {} } });
|
|
1305
|
-
const result = await setRoute.handler({
|
|
1306
|
-
body: { path: "llm.profiles.balanced.status", value: "active" },
|
|
1307
|
-
});
|
|
1308
|
-
expect(result).toEqual({ ok: true });
|
|
1309
|
-
expect(savedProfile("balanced")).toEqual({
|
|
1310
|
-
source: "managed",
|
|
1311
|
-
status: "active",
|
|
1312
|
-
});
|
|
1313
|
-
});
|
|
1314
|
-
|
|
1315
|
-
test("a leaf SET on an existing user shadow does not stamp it managed", async () => {
|
|
1316
|
-
seedRawConfig({
|
|
1317
|
-
llm: {
|
|
1318
|
-
profiles: {
|
|
1319
|
-
balanced: { source: "user", provider: "openai", model: "gpt-4o" },
|
|
1320
|
-
},
|
|
1321
|
-
},
|
|
1322
|
-
});
|
|
1323
|
-
const result = await setRoute.handler({
|
|
1324
|
-
body: { path: "llm.profiles.balanced.model", value: "gpt-5.4" },
|
|
1325
|
-
});
|
|
1326
|
-
expect(result).toEqual({ ok: true });
|
|
1327
|
-
// Write normalization completes the changed user entry; the guard's
|
|
1328
|
-
// concern is only that `source` stays user-owned.
|
|
1329
|
-
expect(savedProfile("balanced")).toMatchObject({
|
|
1330
|
-
source: "user",
|
|
1331
|
-
provider: "openai",
|
|
1332
|
-
model: "gpt-5.4",
|
|
1333
|
-
});
|
|
1334
|
-
expect(savedProfile("balanced").source).toBe("user");
|
|
1335
|
-
});
|
|
1336
|
-
|
|
1337
|
-
test("a leaf SET writing content to an absent default is rejected", async () => {
|
|
1338
|
-
seedRawConfig({ llm: { profiles: {} } });
|
|
1339
|
-
await expect(
|
|
1340
|
-
setRoute.handler({
|
|
1341
|
-
body: { path: "llm.profiles.balanced.model", value: "gpt-4o" },
|
|
1342
|
-
}),
|
|
1343
|
-
).rejects.toThrow(BadRequestError);
|
|
1344
|
-
expectNothingCommitted();
|
|
1345
|
-
});
|
|
1346
|
-
});
|
|
1347
|
-
|
|
1348
|
-
describe("code-owned default profiles — echoes over stale on-disk bodies", () => {
|
|
1349
|
-
// An overlay can persist a cloud entry whose content differs from the
|
|
1350
|
-
// catalog; GET serves catalog content, so a client echo carries values
|
|
1351
|
-
// that match neither nothing — they match the wire view. The round-trip
|
|
1352
|
-
// must still be a no-op.
|
|
1353
|
-
const staleBody = {
|
|
1354
|
-
source: "managed",
|
|
1355
|
-
provider: "anthropic",
|
|
1356
|
-
model: "claude-sonnet",
|
|
1357
|
-
maxTokens: 16000,
|
|
1358
|
-
};
|
|
1359
|
-
|
|
1360
|
-
test("GET → PATCH round-trip over a stale managed body is accepted and changes nothing", async () => {
|
|
1361
|
-
seedRawConfig({
|
|
1362
|
-
llm: { profiles: { balanced: structuredClone(staleBody) } },
|
|
1363
|
-
});
|
|
1364
|
-
const response = (await getRoute.handler({})) as Record<string, any>;
|
|
1365
|
-
// The wire view serves catalog content, not the stale body.
|
|
1366
|
-
expect(response.llm.profiles.balanced.model).toBe(
|
|
1367
|
-
"accounts/fireworks/models/glm-5p3-flash",
|
|
1368
|
-
);
|
|
1369
|
-
const result = await patchRoute.handler({
|
|
1370
|
-
body: { llm: { profiles: response.llm.profiles } },
|
|
1371
|
-
});
|
|
1372
|
-
expect(result).toHaveProperty("llm");
|
|
1373
|
-
expectOneCommitCycle();
|
|
1374
|
-
expect(savedProfile("balanced")).toEqual(staleBody);
|
|
1375
|
-
});
|
|
1376
|
-
|
|
1377
|
-
test("GET → SET llm round-trip over a stale managed body is accepted and changes nothing", async () => {
|
|
1378
|
-
seedRawConfig({
|
|
1379
|
-
llm: { profiles: { balanced: structuredClone(staleBody) } },
|
|
1380
|
-
});
|
|
1381
|
-
const response = (await getRoute.handler({})) as Record<string, any>;
|
|
1382
|
-
const result = await setRoute.handler({
|
|
1383
|
-
body: { path: "llm.profiles", value: response.llm.profiles },
|
|
1384
|
-
});
|
|
1385
|
-
expect(result).toEqual({ ok: true });
|
|
1386
|
-
expect(savedProfile("balanced")).toEqual(staleBody);
|
|
1387
|
-
});
|
|
1388
|
-
|
|
1389
|
-
test("a genuine content edit over a stale managed body is still rejected", async () => {
|
|
1390
|
-
seedRawConfig({
|
|
1391
|
-
llm: { profiles: { balanced: structuredClone(staleBody) } },
|
|
1392
|
-
});
|
|
1393
|
-
await expect(
|
|
1394
|
-
patchRoute.handler({
|
|
1395
|
-
body: {
|
|
1396
|
-
llm: { profiles: { balanced: { model: "some-other-model" } } },
|
|
1397
|
-
},
|
|
1398
|
-
}),
|
|
1399
|
-
).rejects.toThrow(BadRequestError);
|
|
1400
|
-
expectNothingCommitted();
|
|
1045
|
+
// The raw response carries no materialized catalog bodies, so the
|
|
1046
|
+
// catalog-only default stays catalog-only.
|
|
1047
|
+
expect(savedProfile("balanced")).toBeUndefined();
|
|
1401
1048
|
});
|
|
1402
1049
|
});
|
|
1403
1050
|
|
|
@@ -37,8 +37,8 @@ import { setConfig } from "./helpers/set-config.js";
|
|
|
37
37
|
setConfig("llm", {
|
|
38
38
|
profiles: {
|
|
39
39
|
// Disable the catalog default so resolution lands on llm.default.
|
|
40
|
-
balanced: { source: "
|
|
41
|
-
"cost-optimized": { source: "
|
|
40
|
+
balanced: { source: "cloud", status: "disabled" },
|
|
41
|
+
"cost-optimized": { source: "cloud", status: "disabled" },
|
|
42
42
|
},
|
|
43
43
|
callSites: {
|
|
44
44
|
// This file's blanket assistant-feature-flags mock forces the
|