@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
|
@@ -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
|
};
|
|
@@ -141,6 +138,42 @@ function savedProfile(name: string): Record<string, unknown> {
|
|
|
141
138
|
>;
|
|
142
139
|
}
|
|
143
140
|
|
|
141
|
+
describe("partial default-provider config", () => {
|
|
142
|
+
for (const provider of ["cadet", "chatgpt"]) {
|
|
143
|
+
test(`timezone PATCH accepts a model-less ${provider} default`, async () => {
|
|
144
|
+
seedRawConfig({ llm: { default: { provider } } });
|
|
145
|
+
await patchRoute.handler({
|
|
146
|
+
body: { ui: { userTimezone: "America/New_York" } },
|
|
147
|
+
});
|
|
148
|
+
const saved = committedRaw() as {
|
|
149
|
+
ui: { userTimezone: string };
|
|
150
|
+
llm: { default: { provider: string; model?: string } };
|
|
151
|
+
};
|
|
152
|
+
expect(saved.ui.userTimezone).toBe("America/New_York");
|
|
153
|
+
expect(saved.llm.default).toEqual({ provider });
|
|
154
|
+
expectOneCommitCycle();
|
|
155
|
+
});
|
|
156
|
+
test(`PATCH can select ${provider} as default without a model`, async () => {
|
|
157
|
+
seedRawConfig({});
|
|
158
|
+
await patchRoute.handler({ body: { llm: { default: { provider } } } });
|
|
159
|
+
expect(
|
|
160
|
+
(committedRaw() as { llm: { default: { provider: string } } }).llm
|
|
161
|
+
.default,
|
|
162
|
+
).toEqual({ provider });
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
test("Zod rejects a default model with the wrong type", async () => {
|
|
166
|
+
await expect(
|
|
167
|
+
patchRoute.handler({
|
|
168
|
+
body: {
|
|
169
|
+
llm: { default: { provider: "cadet", model: 42 } },
|
|
170
|
+
},
|
|
171
|
+
}),
|
|
172
|
+
).rejects.toThrow(/model|expected string/i);
|
|
173
|
+
expectNothingCommitted();
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
|
|
144
177
|
// ---------------------------------------------------------------------------
|
|
145
178
|
// PUT /v1/config/llm/profiles/:name — replace inference profile
|
|
146
179
|
// ---------------------------------------------------------------------------
|
|
@@ -213,13 +246,13 @@ describe("PUT /v1/config/llm/profiles/:name — cloud profile guard", () => {
|
|
|
213
246
|
).toBeUndefined();
|
|
214
247
|
});
|
|
215
248
|
|
|
216
|
-
test("rejects
|
|
249
|
+
test("Zod rejects invalid fields in a replacement profile", async () => {
|
|
217
250
|
await expect(
|
|
218
251
|
replaceRoute.handler({
|
|
219
252
|
pathParams: { name: "my-custom" },
|
|
220
|
-
body: { provider: "cadet", model: "
|
|
253
|
+
body: { provider: "cadet", model: "claude-opus-4-8", maxTokens: 0 },
|
|
221
254
|
}),
|
|
222
|
-
).rejects.toThrow(/
|
|
255
|
+
).rejects.toThrow(/expected number to be >0/);
|
|
223
256
|
expect(committedRaw()).toBeNull();
|
|
224
257
|
});
|
|
225
258
|
|
|
@@ -246,10 +279,9 @@ describe("PUT /v1/config/llm/profiles/:name — cloud profile guard", () => {
|
|
|
246
279
|
llm: {
|
|
247
280
|
profiles: {
|
|
248
281
|
balanced: {
|
|
249
|
-
provider: "
|
|
250
|
-
model: "claude-sonnet",
|
|
282
|
+
provider: "cadet",
|
|
283
|
+
model: "claude-sonnet-4-6",
|
|
251
284
|
label: "My Custom Name",
|
|
252
|
-
source: "managed",
|
|
253
285
|
},
|
|
254
286
|
},
|
|
255
287
|
},
|
|
@@ -319,10 +351,9 @@ describe("PUT /v1/config/llm/profiles/:name — cloud profile guard", () => {
|
|
|
319
351
|
llm: {
|
|
320
352
|
profiles: {
|
|
321
353
|
"quality-optimized": {
|
|
322
|
-
provider: "
|
|
323
|
-
model: "claude-
|
|
354
|
+
provider: "cadet",
|
|
355
|
+
model: "claude-sonnet-4-6",
|
|
324
356
|
status: "disabled",
|
|
325
|
-
source: "managed",
|
|
326
357
|
},
|
|
327
358
|
},
|
|
328
359
|
},
|
|
@@ -334,8 +365,8 @@ describe("PUT /v1/config/llm/profiles/:name — cloud profile guard", () => {
|
|
|
334
365
|
expect(result).toEqual({ ok: true });
|
|
335
366
|
const profile = savedProfile("quality-optimized");
|
|
336
367
|
expect("status" in profile).toBe(false);
|
|
337
|
-
expect(profile.provider).toBe("
|
|
338
|
-
expect(profile.model).toBe("claude-
|
|
368
|
+
expect(profile.provider).toBe("cadet");
|
|
369
|
+
expect(profile.model).toBe("claude-sonnet-4-6");
|
|
339
370
|
});
|
|
340
371
|
|
|
341
372
|
test("PUT { label: null, status: null } on managed os-beta is rejected (label is frozen)", async () => {
|
|
@@ -343,11 +374,10 @@ describe("PUT /v1/config/llm/profiles/:name — cloud profile guard", () => {
|
|
|
343
374
|
llm: {
|
|
344
375
|
profiles: {
|
|
345
376
|
"os-beta": {
|
|
346
|
-
provider: "
|
|
377
|
+
provider: "cadet",
|
|
347
378
|
model: "zai-org/GLM-5.2",
|
|
348
379
|
label: "OS Beta (Custom)",
|
|
349
380
|
status: "disabled",
|
|
350
|
-
source: "managed",
|
|
351
381
|
},
|
|
352
382
|
},
|
|
353
383
|
},
|
|
@@ -368,10 +398,9 @@ describe("PUT /v1/config/llm/profiles/:name — cloud profile guard", () => {
|
|
|
368
398
|
llm: {
|
|
369
399
|
profiles: {
|
|
370
400
|
"os-beta": {
|
|
371
|
-
provider: "
|
|
401
|
+
provider: "cadet",
|
|
372
402
|
model: "zai-org/GLM-5.2",
|
|
373
403
|
label: "Custom Label",
|
|
374
|
-
source: "managed",
|
|
375
404
|
},
|
|
376
405
|
},
|
|
377
406
|
},
|
|
@@ -392,9 +421,8 @@ describe("PUT /v1/config/llm/profiles/:name — cloud profile guard", () => {
|
|
|
392
421
|
llm: {
|
|
393
422
|
profiles: {
|
|
394
423
|
"os-beta": {
|
|
395
|
-
provider: "
|
|
424
|
+
provider: "cadet",
|
|
396
425
|
model: "zai-org/GLM-5.2",
|
|
397
|
-
source: "managed",
|
|
398
426
|
},
|
|
399
427
|
},
|
|
400
428
|
},
|
|
@@ -413,10 +441,9 @@ describe("PUT /v1/config/llm/profiles/:name — cloud profile guard", () => {
|
|
|
413
441
|
llm: {
|
|
414
442
|
profiles: {
|
|
415
443
|
"os-beta": {
|
|
416
|
-
provider: "
|
|
444
|
+
provider: "cadet",
|
|
417
445
|
model: "zai-org/GLM-5.2",
|
|
418
446
|
topP: 0.7,
|
|
419
|
-
source: "managed",
|
|
420
447
|
},
|
|
421
448
|
},
|
|
422
449
|
},
|
|
@@ -435,10 +462,9 @@ describe("PUT /v1/config/llm/profiles/:name — cloud profile guard", () => {
|
|
|
435
462
|
llm: {
|
|
436
463
|
profiles: {
|
|
437
464
|
"os-beta": {
|
|
438
|
-
provider: "
|
|
439
|
-
model: "
|
|
465
|
+
provider: "cadet",
|
|
466
|
+
model: "claude-sonnet-4-6",
|
|
440
467
|
status: "disabled",
|
|
441
|
-
source: "managed",
|
|
442
468
|
},
|
|
443
469
|
},
|
|
444
470
|
},
|
|
@@ -451,8 +477,8 @@ describe("PUT /v1/config/llm/profiles/:name — cloud profile guard", () => {
|
|
|
451
477
|
expectOneCommitCycle();
|
|
452
478
|
const profile = savedProfile("os-beta");
|
|
453
479
|
expect(profile.status).toBe("active");
|
|
454
|
-
expect(profile.provider).toBe("
|
|
455
|
-
expect(profile.model).toBe("
|
|
480
|
+
expect(profile.provider).toBe("cadet");
|
|
481
|
+
expect(profile.model).toBe("claude-sonnet-4-6");
|
|
456
482
|
});
|
|
457
483
|
|
|
458
484
|
test("allows edits to a user-owned profile sharing a cloud name (os-beta)", async () => {
|
|
@@ -461,8 +487,7 @@ describe("PUT /v1/config/llm/profiles/:name — cloud profile guard", () => {
|
|
|
461
487
|
profiles: {
|
|
462
488
|
"os-beta": {
|
|
463
489
|
provider: "anthropic",
|
|
464
|
-
model: "
|
|
465
|
-
source: "user",
|
|
490
|
+
model: "gpt-4o",
|
|
466
491
|
},
|
|
467
492
|
},
|
|
468
493
|
},
|
|
@@ -482,9 +507,8 @@ describe("PUT /v1/config/llm/profiles/:name — cloud profile guard", () => {
|
|
|
482
507
|
llm: {
|
|
483
508
|
profiles: {
|
|
484
509
|
"os-beta": {
|
|
485
|
-
provider: "
|
|
510
|
+
provider: "cadet",
|
|
486
511
|
model: "accounts/fireworks/models/glm-5p2",
|
|
487
|
-
source: "managed",
|
|
488
512
|
},
|
|
489
513
|
},
|
|
490
514
|
},
|
|
@@ -532,30 +556,6 @@ describe("PUT /v1/config/llm/profiles/:name — cloud profile guard", () => {
|
|
|
532
556
|
// ---------------------------------------------------------------------------
|
|
533
557
|
|
|
534
558
|
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
559
|
test("allows deletion of custom-balanced via null (user-owned)", async () => {
|
|
560
560
|
const result = await patchRoute.handler({
|
|
561
561
|
body: { llm: { profiles: { "custom-balanced": null } } },
|
|
@@ -616,9 +616,8 @@ describe("PATCH /v1/config — cloud profile deletion guard", () => {
|
|
|
616
616
|
llm: {
|
|
617
617
|
profiles: {
|
|
618
618
|
"os-beta": {
|
|
619
|
-
provider: "
|
|
620
|
-
model: "claude-sonnet",
|
|
621
|
-
source: "user",
|
|
619
|
+
provider: "cadet",
|
|
620
|
+
model: "claude-sonnet-4-6",
|
|
622
621
|
},
|
|
623
622
|
},
|
|
624
623
|
},
|
|
@@ -628,33 +627,6 @@ describe("PATCH /v1/config — cloud profile deletion guard", () => {
|
|
|
628
627
|
});
|
|
629
628
|
expect(result).toHaveProperty("llm");
|
|
630
629
|
});
|
|
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
630
|
});
|
|
659
631
|
|
|
660
632
|
// ---------------------------------------------------------------------------
|
|
@@ -664,93 +636,10 @@ describe("PATCH /v1/config — cloud profile deletion guard", () => {
|
|
|
664
636
|
// os-beta) is read-only to every config-write route while its on-disk entry
|
|
665
637
|
// is managed-source; the only writable transition is re-enabling a disabled
|
|
666
638
|
// profile. A user-owned entry sharing a cloud name is not locked. Enforced
|
|
667
|
-
// by `assertInvariantProfilesPreserved` at the commitConfigWrite choke
|
|
668
639
|
// point, so PATCH, SET, and PUT are all covered by the same checks.
|
|
669
640
|
// ---------------------------------------------------------------------------
|
|
670
641
|
|
|
671
642
|
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
643
|
test("PATCH overwriting balanced with a string is rejected", async () => {
|
|
755
644
|
await expect(
|
|
756
645
|
patchRoute.handler({
|
|
@@ -785,22 +674,6 @@ describe("cloud-profile invariant guard — rejected writes", () => {
|
|
|
785
674
|
expectNothingCommitted();
|
|
786
675
|
});
|
|
787
676
|
|
|
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
677
|
test("PATCH { status: 'weird' } on balanced is rejected (junk status)", async () => {
|
|
805
678
|
await expect(
|
|
806
679
|
patchRoute.handler({
|
|
@@ -905,8 +778,7 @@ describe("default-profile invariant guard — allowed writes", () => {
|
|
|
905
778
|
test("PUT full edits on a user-sourced os-beta entry are allowed (invariance is source-gated)", async () => {
|
|
906
779
|
(rawConfig as Record<string, any>).llm.profiles["os-beta"] = {
|
|
907
780
|
provider: "anthropic",
|
|
908
|
-
model: "claude-sonnet",
|
|
909
|
-
source: "user",
|
|
781
|
+
model: "claude-sonnet-4-6",
|
|
910
782
|
};
|
|
911
783
|
seedRawConfig(rawConfig);
|
|
912
784
|
const result = await replaceRoute.handler({
|
|
@@ -997,8 +869,8 @@ describe("wire-only profile keys are stripped from writes", () => {
|
|
|
997
869
|
const profile = savedProfile("balanced");
|
|
998
870
|
expect("invariant" in profile).toBe(false);
|
|
999
871
|
expect("supportsVision" in profile).toBe(false);
|
|
1000
|
-
expect(profile.provider).toBe("
|
|
1001
|
-
expect(profile.model).toBe("claude-sonnet");
|
|
872
|
+
expect(profile.provider).toBe("cadet");
|
|
873
|
+
expect(profile.model).toBe("claude-sonnet-4-6");
|
|
1002
874
|
});
|
|
1003
875
|
|
|
1004
876
|
test("SET of a wire-only leaf path never persists the key", async () => {
|
|
@@ -1035,8 +907,8 @@ describe("wire-only profile keys are stripped from writes", () => {
|
|
|
1035
907
|
expect(profile.status).toBe("active");
|
|
1036
908
|
expect("supportsVision" in profile).toBe(false);
|
|
1037
909
|
expect("invariant" in profile).toBe(false);
|
|
1038
|
-
expect(profile.provider).toBe("
|
|
1039
|
-
expect(profile.model).toBe("claude-sonnet");
|
|
910
|
+
expect(profile.provider).toBe("cadet");
|
|
911
|
+
expect(profile.model).toBe("claude-sonnet-4-6");
|
|
1040
912
|
});
|
|
1041
913
|
|
|
1042
914
|
test("pure no-op SET round-trip with stale on-disk supportsVision succeeds", async () => {
|
|
@@ -1053,8 +925,8 @@ describe("wire-only profile keys are stripped from writes", () => {
|
|
|
1053
925
|
const profile = savedProfile("balanced");
|
|
1054
926
|
expect("supportsVision" in profile).toBe(false);
|
|
1055
927
|
expect("invariant" in profile).toBe(false);
|
|
1056
|
-
expect(profile.provider).toBe("
|
|
1057
|
-
expect(profile.model).toBe("claude-sonnet");
|
|
928
|
+
expect(profile.provider).toBe("cadet");
|
|
929
|
+
expect(profile.model).toBe("claude-sonnet-4-6");
|
|
1058
930
|
});
|
|
1059
931
|
|
|
1060
932
|
test("PATCH re-enable carrying wire keys succeeds when the on-disk entry has stale supportsVision", async () => {
|
|
@@ -1108,99 +980,18 @@ describe("wire-only profile keys are stripped from writes", () => {
|
|
|
1108
980
|
const getRoute = ROUTES.find((r) => r.operationId === "config_get")!;
|
|
1109
981
|
|
|
1110
982
|
describe("code-owned default profiles — wire view and write normalization", () => {
|
|
1111
|
-
test("GET
|
|
983
|
+
test("GET serves thin stubs verbatim — materialization lives on the profiles API", async () => {
|
|
1112
984
|
seedRawConfig({
|
|
1113
985
|
llm: {
|
|
1114
|
-
profiles: { balanced: {
|
|
986
|
+
profiles: { balanced: { status: "disabled" } },
|
|
1115
987
|
},
|
|
1116
988
|
});
|
|
1117
989
|
const response = (await getRoute.handler({})) as Record<string, any>;
|
|
1118
990
|
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();
|
|
991
|
+
expect(wireBalanced).toEqual({ status: "disabled" });
|
|
992
|
+
// Catalog-only defaults (no on-disk stub) do not appear at all — the
|
|
993
|
+
// profiles API's list serves their resolved bodies.
|
|
994
|
+
expect(response.llm.profiles["quality-optimized"]).toBeUndefined();
|
|
1204
995
|
});
|
|
1205
996
|
|
|
1206
997
|
test("PUT status re-enable on an absent always-available default creates a thin managed stub", async () => {
|
|
@@ -1211,7 +1002,6 @@ describe("code-owned default profiles — wire view and write normalization", ()
|
|
|
1211
1002
|
});
|
|
1212
1003
|
expect(result).toEqual({ ok: true });
|
|
1213
1004
|
expect(savedProfile("balanced")).toEqual({
|
|
1214
|
-
source: "managed",
|
|
1215
1005
|
status: "active",
|
|
1216
1006
|
});
|
|
1217
1007
|
});
|
|
@@ -1251,25 +1041,19 @@ describe("code-owned default profiles — BYO default provider wire view", () =>
|
|
|
1251
1041
|
// intent × provider matrix that actually dispatches — not the cadet
|
|
1252
1042
|
// column — and the write path must echo-strip against that same view or an
|
|
1253
1043
|
// honest GET → write round-trip is rejected.
|
|
1254
|
-
test("GET
|
|
1044
|
+
test("GET serves no catalog-only defaults — the profiles API materializes the column", async () => {
|
|
1255
1045
|
seedRawConfig({
|
|
1256
1046
|
llm: { default: { provider: "anthropic" }, profiles: {} },
|
|
1257
1047
|
});
|
|
1258
1048
|
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
|
-
);
|
|
1049
|
+
expect(response.llm.profiles).toEqual({});
|
|
1266
1050
|
});
|
|
1267
1051
|
|
|
1268
|
-
test("GET → PATCH round-trip of the
|
|
1052
|
+
test("GET → PATCH round-trip of the raw profiles is accepted on a BYO install too", async () => {
|
|
1269
1053
|
seedRawConfig({
|
|
1270
1054
|
llm: {
|
|
1271
1055
|
default: { provider: "anthropic" },
|
|
1272
|
-
profiles: { balanced: {
|
|
1056
|
+
profiles: { balanced: { status: "disabled" } },
|
|
1273
1057
|
},
|
|
1274
1058
|
});
|
|
1275
1059
|
const response = (await getRoute.handler({})) as Record<string, any>;
|
|
@@ -1279,14 +1063,13 @@ describe("code-owned default profiles — BYO default provider wire view", () =>
|
|
|
1279
1063
|
expect(result).toHaveProperty("llm");
|
|
1280
1064
|
expectOneCommitCycle();
|
|
1281
1065
|
expect(savedProfile("balanced")).toEqual({
|
|
1282
|
-
source: "managed",
|
|
1283
1066
|
status: "disabled",
|
|
1284
1067
|
});
|
|
1285
|
-
//
|
|
1286
|
-
expect(savedProfile("quality-optimized")).
|
|
1068
|
+
// No absent-default echoes exist to reduce — nothing else is written.
|
|
1069
|
+
expect(savedProfile("quality-optimized")).toBeUndefined();
|
|
1287
1070
|
});
|
|
1288
1071
|
|
|
1289
|
-
test("GET → SET llm round-trip of the
|
|
1072
|
+
test("GET → SET llm round-trip of the raw view is accepted and writes no stubs", async () => {
|
|
1290
1073
|
seedRawConfig({
|
|
1291
1074
|
llm: { default: { provider: "anthropic" }, profiles: {} },
|
|
1292
1075
|
});
|
|
@@ -1295,109 +1078,9 @@ describe("code-owned default profiles — BYO default provider wire view", () =>
|
|
|
1295
1078
|
body: { path: "llm", value: response.llm },
|
|
1296
1079
|
});
|
|
1297
1080
|
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();
|
|
1081
|
+
// The raw response carries no materialized catalog bodies, so the
|
|
1082
|
+
// catalog-only default stays catalog-only.
|
|
1083
|
+
expect(savedProfile("balanced")).toBeUndefined();
|
|
1401
1084
|
});
|
|
1402
1085
|
});
|
|
1403
1086
|
|