@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
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Direct (unbuffered) emit of a single `watchdog` telemetry event.
|
|
3
|
-
*
|
|
4
|
-
* The usual watchdog path persists to the SQLite `telemetry_events` outbox and
|
|
5
|
-
* lets {@link ./usage-telemetry-reporter} batch and upload it later. That
|
|
6
|
-
* durable buffer is the right default — it survives restarts and dedupes on
|
|
7
|
-
* `daemon_event_id`. But it is the wrong tool for a check that fires *because*
|
|
8
|
-
* SQLite is unusable: recording a corruption event into SQLite can hit the very
|
|
9
|
-
* damage it is reporting, and the store's `recordWatchdogEvent` drags the whole
|
|
10
|
-
* `db-connection` graph in behind it.
|
|
11
|
-
*
|
|
12
|
-
* This helper POSTs the event straight to the cloud ingest instead. It is
|
|
13
|
-
* best-effort: opt-out, missing credentials (early boot, before the CES
|
|
14
|
-
* handshake), platform-disabled, and HTTP failures all no-op. No retry — a lost
|
|
15
|
-
* event is acceptable for a rare, high-signal check. Deduped downstream on
|
|
16
|
-
* `daemon_event_id` like every other telemetry event.
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
import { v4 as uuid } from "uuid";
|
|
20
|
-
|
|
21
|
-
import { CadetCloudClient } from "../cloud/client.js";
|
|
22
|
-
import { getRawShareAnalytics } from "../cloud/consent-cache.js";
|
|
23
|
-
import { areCloudFeaturesEnabled } from "../cloud/feature-gate.js";
|
|
24
|
-
import { getCloudOrganizationId, getCloudUserId } from "../config/env.js";
|
|
25
|
-
import { getDeviceId } from "../util/device-id.js";
|
|
26
|
-
import { getLogger } from "../util/logger.js";
|
|
27
|
-
import { APP_VERSION } from "../version.js";
|
|
28
|
-
import { validateWireEvents } from "./telemetry-wire-validation.js";
|
|
29
|
-
import type { WatchdogTelemetryEvent } from "./types.js";
|
|
30
|
-
|
|
31
|
-
const log = getLogger("watchdog-direct-emit");
|
|
32
|
-
|
|
33
|
-
/** Platform telemetry ingest endpoint (same one the batched reporter POSTs to). */
|
|
34
|
-
const TELEMETRY_INGEST_PATH = "/v1/telemetry/ingest/";
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* POST one `watchdog` event directly to the cloud, bypassing the SQLite
|
|
38
|
-
* buffer. Honors a confirmed `share_analytics` opt-out and the
|
|
39
|
-
* platform-features gate. An unknown consent state emits: this path reports
|
|
40
|
-
* SQLite corruption and has no outbox to defer into, and platform ingest
|
|
41
|
-
* re-gates on consent authoritatively server-side. Never throws — the caller
|
|
42
|
-
* is on a query hot path.
|
|
43
|
-
*/
|
|
44
|
-
export async function emitWatchdogEventDirect(
|
|
45
|
-
checkName: string,
|
|
46
|
-
detail: Record<string, unknown> | null,
|
|
47
|
-
value: number | null = null,
|
|
48
|
-
): Promise<void> {
|
|
49
|
-
try {
|
|
50
|
-
// Drop only on a confirmed opt-out; unknown emits (no buffer to defer
|
|
51
|
-
// into, and platform ingest re-gates on consent server-side).
|
|
52
|
-
if (getRawShareAnalytics() === false) {
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
if (!areCloudFeaturesEnabled()) {
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// Authenticated-only. Null before the CES handshake resolves credentials;
|
|
60
|
-
// the event is simply dropped (no durable backlog to retry from).
|
|
61
|
-
const client = await CadetCloudClient.create();
|
|
62
|
-
if (!client) {
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
const event: WatchdogTelemetryEvent = {
|
|
67
|
-
type: "watchdog",
|
|
68
|
-
daemon_event_id: uuid(),
|
|
69
|
-
recorded_at: Date.now(),
|
|
70
|
-
check_name: checkName,
|
|
71
|
-
value,
|
|
72
|
-
detail,
|
|
73
|
-
assistant_version: APP_VERSION,
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
// Pre-flush wire validation — observability only: warns when the server
|
|
77
|
-
// would silently drop the event; the POST proceeds unchanged.
|
|
78
|
-
validateWireEvents([event], log);
|
|
79
|
-
|
|
80
|
-
const organizationId = getCloudOrganizationId() || undefined;
|
|
81
|
-
const userId = getCloudUserId() || undefined;
|
|
82
|
-
const resp = await client.fetch(TELEMETRY_INGEST_PATH, {
|
|
83
|
-
method: "POST",
|
|
84
|
-
headers: { "Content-Type": "application/json" },
|
|
85
|
-
body: JSON.stringify({
|
|
86
|
-
device_id: getDeviceId(),
|
|
87
|
-
assistant_version: APP_VERSION,
|
|
88
|
-
...(organizationId ? { organization_id: organizationId } : {}),
|
|
89
|
-
...(userId ? { user_id: userId } : {}),
|
|
90
|
-
events: [event],
|
|
91
|
-
}),
|
|
92
|
-
});
|
|
93
|
-
// Consume the body to release the connection, mirroring the reporter.
|
|
94
|
-
await resp.text();
|
|
95
|
-
if (!resp.ok) {
|
|
96
|
-
log.warn(
|
|
97
|
-
{ status: resp.status, checkName },
|
|
98
|
-
"Direct watchdog telemetry POST failed (non-fatal)",
|
|
99
|
-
);
|
|
100
|
-
}
|
|
101
|
-
} catch (err) {
|
|
102
|
-
log.warn({ err, checkName }, "Direct watchdog telemetry emit failed");
|
|
103
|
-
}
|
|
104
|
-
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { recordTelemetryEvent } from "./telemetry-events-outbox.js";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Input for one `watchdog` telemetry event. Metadata only — never conversation
|
|
5
|
-
* content. `value` and `detail` are optional; omitting both yields the minimal
|
|
6
|
-
* event (check_name only). `detail` is an open JSON bag carried verbatim in
|
|
7
|
-
* the event payload.
|
|
8
|
-
*/
|
|
9
|
-
export interface WatchdogEventRecord {
|
|
10
|
-
checkName: string;
|
|
11
|
-
/** Measured magnitude (block ms, idle ms, ...). Null when the check carries no scalar. */
|
|
12
|
-
value?: number | null;
|
|
13
|
-
/** Open JSON bag for extra fields (reason codes, secondary numbers, ...). */
|
|
14
|
-
detail?: Record<string, unknown> | null;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Record a `watchdog` telemetry event for a watchdog check firing, enqueued
|
|
19
|
-
* on the `telemetry_events` outbox. Consent gating and degraded-mode behavior
|
|
20
|
-
* are `recordTelemetryEvent`'s, as is the return value: the queued outbox
|
|
21
|
-
* row, or null when the event was dropped (opt-out) or could not be stored.
|
|
22
|
-
*/
|
|
23
|
-
export function recordWatchdogEvent(
|
|
24
|
-
record: WatchdogEventRecord,
|
|
25
|
-
): { id: string; createdAt: number } | null {
|
|
26
|
-
return recordTelemetryEvent("watchdog", {
|
|
27
|
-
check_name: record.checkName,
|
|
28
|
-
value: record.value ?? null,
|
|
29
|
-
detail: record.detail ?? null,
|
|
30
|
-
});
|
|
31
|
-
}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Conversation-stable wire projections of the UI surface tool definitions.
|
|
3
|
-
*
|
|
4
|
-
* `ui_show`, `ui_update`, and `ui_dismiss` keep one definition across every
|
|
5
|
-
* channel and across live vs clientless turns. Channel renderers enforce the
|
|
6
|
-
* surfaces they can display at execution. Clientless calls persist surface
|
|
7
|
-
* content for the next capable client that opens the conversation.
|
|
8
|
-
*
|
|
9
|
-
* `activation_moment` is the remaining schema projection. It applies only to
|
|
10
|
-
* activation-rail conversations, whose marker is written before the first
|
|
11
|
-
* tool resolution, so the extra property is stable for that conversation's
|
|
12
|
-
* lifetime. It must not vary by channel or turn presence.
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
import type { ToolDefinition } from "../../providers/types.js";
|
|
16
|
-
import { ACTIVATION_MOMENT_PARAMS } from "../../telemetry/activation-funnel.js";
|
|
17
|
-
|
|
18
|
-
const ACTIVATION_MOMENT_PROPERTY = {
|
|
19
|
-
type: "string",
|
|
20
|
-
enum: ACTIVATION_MOMENT_PARAMS,
|
|
21
|
-
description:
|
|
22
|
-
"Activation-rail telemetry tag. Set this when this surface IS one of the activation funnel moments; the milestone is recorded automatically when the user commits the surface. Omit for all non-activation surfaces.",
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Add the optional `activation_moment` param to ui_show's schema. Applied
|
|
27
|
-
* only for activation-rail conversations (`isActivationSession`). The rail
|
|
28
|
-
* bootstrap prompt instructs the tagging, and the daemon's emit path reads
|
|
29
|
-
* the tag from tool input independently of this schema.
|
|
30
|
-
*/
|
|
31
|
-
export function injectActivationMomentParam(
|
|
32
|
-
definitions: ToolDefinition[],
|
|
33
|
-
): ToolDefinition[] {
|
|
34
|
-
return definitions.map((def) => {
|
|
35
|
-
if (def.name !== "ui_show") {
|
|
36
|
-
return def;
|
|
37
|
-
}
|
|
38
|
-
const schema = def.input_schema as {
|
|
39
|
-
properties?: Record<string, unknown>;
|
|
40
|
-
};
|
|
41
|
-
return {
|
|
42
|
-
...def,
|
|
43
|
-
input_schema: {
|
|
44
|
-
...schema,
|
|
45
|
-
properties: {
|
|
46
|
-
...schema.properties,
|
|
47
|
-
activation_moment: ACTIVATION_MOMENT_PROPERTY,
|
|
48
|
-
},
|
|
49
|
-
},
|
|
50
|
-
};
|
|
51
|
-
});
|
|
52
|
-
}
|
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for watcher usage telemetry.
|
|
3
|
-
*
|
|
4
|
-
* Strategy: stub the checkpoint store, lifecycle-event store, and
|
|
5
|
-
* watcher store via `mock.module()` so we can drive the inventory
|
|
6
|
-
* throttle and event naming without touching the DB.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { beforeEach, describe, expect, mock, test } from "bun:test";
|
|
10
|
-
|
|
11
|
-
import type { ConsentState } from "../../cloud/consent-cache.js";
|
|
12
|
-
import type { LifecycleEvent } from "../../persistence/lifecycle-events-store.js";
|
|
13
|
-
|
|
14
|
-
const checkpoints = new Map<string, string>();
|
|
15
|
-
const recordedEvents: string[] = [];
|
|
16
|
-
let fakeEnabledWatchers: Array<{ providerId: string }> = [];
|
|
17
|
-
let shareAnalytics: ConsentState = true;
|
|
18
|
-
const recordAndReturnEvent = (name: string): LifecycleEvent => {
|
|
19
|
-
recordedEvents.push(name);
|
|
20
|
-
return { id: "evt-1", eventName: name, createdAt: 0 };
|
|
21
|
-
};
|
|
22
|
-
let recordImpl: (name: string) => LifecycleEvent | null = recordAndReturnEvent;
|
|
23
|
-
|
|
24
|
-
mock.module("../../persistence/checkpoints.js", () => ({
|
|
25
|
-
getMemoryCheckpoint: (key: string) => checkpoints.get(key) ?? null,
|
|
26
|
-
setMemoryCheckpoint: (key: string, value: string) => {
|
|
27
|
-
checkpoints.set(key, value);
|
|
28
|
-
},
|
|
29
|
-
}));
|
|
30
|
-
|
|
31
|
-
mock.module("../../persistence/lifecycle-events-store.js", () => ({
|
|
32
|
-
recordLifecycleEvent: (name: string) => recordImpl(name),
|
|
33
|
-
}));
|
|
34
|
-
|
|
35
|
-
mock.module("../../cloud/consent-cache.js", () => ({
|
|
36
|
-
getRawShareAnalytics: () => shareAnalytics,
|
|
37
|
-
}));
|
|
38
|
-
|
|
39
|
-
mock.module("../watcher-store.js", () => ({
|
|
40
|
-
listWatchers: () => fakeEnabledWatchers,
|
|
41
|
-
}));
|
|
42
|
-
|
|
43
|
-
const {
|
|
44
|
-
recordWatcherInventoryIfDue,
|
|
45
|
-
recordWatcherLlmProcessed,
|
|
46
|
-
WATCHER_INVENTORY_INTERVAL_MS,
|
|
47
|
-
} = await import("../telemetry.js");
|
|
48
|
-
|
|
49
|
-
const INVENTORY_KEY = "telemetry:watchers:inventory_last_recorded";
|
|
50
|
-
// Realistic epoch base: an absent checkpoint reads as 0, so `now` must be
|
|
51
|
-
// at least one interval past the epoch for the inventory to be due.
|
|
52
|
-
const BASE = 1_700_000_000_000;
|
|
53
|
-
|
|
54
|
-
beforeEach(() => {
|
|
55
|
-
checkpoints.clear();
|
|
56
|
-
recordedEvents.length = 0;
|
|
57
|
-
fakeEnabledWatchers = [];
|
|
58
|
-
shareAnalytics = true;
|
|
59
|
-
recordImpl = recordAndReturnEvent;
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
describe("recordWatcherInventoryIfDue", () => {
|
|
63
|
-
test("records one event per enabled watcher when due", () => {
|
|
64
|
-
fakeEnabledWatchers = [
|
|
65
|
-
{ providerId: "gmail" },
|
|
66
|
-
{ providerId: "linear" },
|
|
67
|
-
{ providerId: "gmail" },
|
|
68
|
-
];
|
|
69
|
-
|
|
70
|
-
recordWatcherInventoryIfDue(BASE);
|
|
71
|
-
|
|
72
|
-
expect(recordedEvents).toEqual([
|
|
73
|
-
"watcher_enabled:gmail",
|
|
74
|
-
"watcher_enabled:linear",
|
|
75
|
-
"watcher_enabled:gmail",
|
|
76
|
-
]);
|
|
77
|
-
expect(checkpoints.get(INVENTORY_KEY)).toBe(String(BASE));
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
test("skips when the last inventory is within the interval", () => {
|
|
81
|
-
fakeEnabledWatchers = [{ providerId: "gmail" }];
|
|
82
|
-
checkpoints.set(INVENTORY_KEY, String(BASE));
|
|
83
|
-
|
|
84
|
-
recordWatcherInventoryIfDue(BASE + WATCHER_INVENTORY_INTERVAL_MS - 1);
|
|
85
|
-
|
|
86
|
-
expect(recordedEvents).toEqual([]);
|
|
87
|
-
expect(checkpoints.get(INVENTORY_KEY)).toBe(String(BASE));
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
test("records again once the interval has elapsed", () => {
|
|
91
|
-
fakeEnabledWatchers = [{ providerId: "github" }];
|
|
92
|
-
checkpoints.set(INVENTORY_KEY, String(BASE));
|
|
93
|
-
|
|
94
|
-
recordWatcherInventoryIfDue(BASE + WATCHER_INVENTORY_INTERVAL_MS);
|
|
95
|
-
|
|
96
|
-
expect(recordedEvents).toEqual(["watcher_enabled:github"]);
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
test("advances the checkpoint even when no watchers are enabled", () => {
|
|
100
|
-
recordWatcherInventoryIfDue(BASE + 1);
|
|
101
|
-
|
|
102
|
-
expect(recordedEvents).toEqual([]);
|
|
103
|
-
expect(checkpoints.get(INVENTORY_KEY)).toBe(String(BASE + 1));
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
test("swallows storage errors and leaves the checkpoint for retry", () => {
|
|
107
|
-
fakeEnabledWatchers = [{ providerId: "gmail" }];
|
|
108
|
-
recordImpl = () => {
|
|
109
|
-
throw new Error("db unavailable");
|
|
110
|
-
};
|
|
111
|
-
|
|
112
|
-
expect(() => recordWatcherInventoryIfDue(BASE + 2)).not.toThrow();
|
|
113
|
-
// Checkpoint must not advance on failure: the next tick retries
|
|
114
|
-
// instead of skipping a day of inventory.
|
|
115
|
-
expect(checkpoints.get(INVENTORY_KEY)).toBeUndefined();
|
|
116
|
-
|
|
117
|
-
recordImpl = recordAndReturnEvent;
|
|
118
|
-
recordWatcherInventoryIfDue(BASE + 3);
|
|
119
|
-
|
|
120
|
-
expect(recordedEvents).toEqual(["watcher_enabled:gmail"]);
|
|
121
|
-
expect(checkpoints.get(INVENTORY_KEY)).toBe(String(BASE + 3));
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
test("leaves the checkpoint for retry when the telemetry DB is unavailable with consent on", () => {
|
|
125
|
-
fakeEnabledWatchers = [{ providerId: "gmail" }];
|
|
126
|
-
// Degraded mode: consent granted but the store reports nothing recorded.
|
|
127
|
-
recordImpl = () => null;
|
|
128
|
-
|
|
129
|
-
recordWatcherInventoryIfDue(BASE + 2);
|
|
130
|
-
expect(checkpoints.get(INVENTORY_KEY)).toBeUndefined();
|
|
131
|
-
|
|
132
|
-
recordImpl = recordAndReturnEvent;
|
|
133
|
-
recordWatcherInventoryIfDue(BASE + 3);
|
|
134
|
-
|
|
135
|
-
expect(recordedEvents).toEqual(["watcher_enabled:gmail"]);
|
|
136
|
-
expect(checkpoints.get(INVENTORY_KEY)).toBe(String(BASE + 3));
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
test("advances the checkpoint when consent is a confirmed opt-out", () => {
|
|
140
|
-
fakeEnabledWatchers = [{ providerId: "gmail" }];
|
|
141
|
-
shareAnalytics = false;
|
|
142
|
-
// Confirmed-opt-out skip: the store records nothing and returns null.
|
|
143
|
-
recordImpl = () => null;
|
|
144
|
-
|
|
145
|
-
recordWatcherInventoryIfDue(BASE + 4);
|
|
146
|
-
|
|
147
|
-
expect(recordedEvents).toEqual([]);
|
|
148
|
-
expect(checkpoints.get(INVENTORY_KEY)).toBe(String(BASE + 4));
|
|
149
|
-
});
|
|
150
|
-
|
|
151
|
-
test("leaves the checkpoint for retry when the store returns null while consent is unknown", () => {
|
|
152
|
-
fakeEnabledWatchers = [{ providerId: "gmail" }];
|
|
153
|
-
shareAnalytics = "unknown";
|
|
154
|
-
// Unknown consent never drops at record time, so a null here means the
|
|
155
|
-
// telemetry DB is unavailable — retry, don't skip a day.
|
|
156
|
-
recordImpl = () => null;
|
|
157
|
-
|
|
158
|
-
recordWatcherInventoryIfDue(BASE + 4);
|
|
159
|
-
|
|
160
|
-
expect(checkpoints.get(INVENTORY_KEY)).toBeUndefined();
|
|
161
|
-
});
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
describe("recordWatcherLlmProcessed", () => {
|
|
165
|
-
test("embeds provider and conversation id in the event name", () => {
|
|
166
|
-
recordWatcherLlmProcessed("linear", "conv-123");
|
|
167
|
-
|
|
168
|
-
expect(recordedEvents).toEqual(["watcher_llm_processed:linear:conv-123"]);
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
test("swallows storage errors", () => {
|
|
172
|
-
recordImpl = () => {
|
|
173
|
-
throw new Error("db unavailable");
|
|
174
|
-
};
|
|
175
|
-
|
|
176
|
-
expect(() => recordWatcherLlmProcessed("gmail", "conv-456")).not.toThrow();
|
|
177
|
-
});
|
|
178
|
-
});
|
package/src/watcher/telemetry.ts
DELETED
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Watcher usage telemetry — lifecycle-event breadcrumbs that let fleet
|
|
3
|
-
* analytics answer "is anyone using watchers, and what do they cost?"
|
|
4
|
-
* ahead of the planned watcher → skills-and-schedules migration.
|
|
5
|
-
*
|
|
6
|
-
* Both event shapes ship through the existing lifecycle-event telemetry
|
|
7
|
-
* pipeline, so they inherit its platform `share_analytics` consent gate and
|
|
8
|
-
* need no wire-contract or platform-side changes:
|
|
9
|
-
*
|
|
10
|
-
* - `watcher_enabled:<providerId>` — one per enabled watcher, at most
|
|
11
|
-
* once per 24h per daemon. Counts devices that have watchers
|
|
12
|
-
* configured, including ones whose providers rarely produce events.
|
|
13
|
-
* - `watcher_llm_processed:<providerId>:<conversationId>` — one per
|
|
14
|
-
* watcher tick that ran an LLM background job. The conversation id is
|
|
15
|
-
* embedded so analytics can join against `llm_usage` events for exact
|
|
16
|
-
* cost attribution.
|
|
17
|
-
*
|
|
18
|
-
* Telemetry must never break the polling loop, so every entry point
|
|
19
|
-
* swallows storage errors.
|
|
20
|
-
*/
|
|
21
|
-
|
|
22
|
-
import { getRawShareAnalytics } from "../cloud/consent-cache.js";
|
|
23
|
-
import {
|
|
24
|
-
getMemoryCheckpoint,
|
|
25
|
-
setMemoryCheckpoint,
|
|
26
|
-
} from "../persistence/checkpoints.js";
|
|
27
|
-
import { recordLifecycleEvent } from "../persistence/lifecycle-events-store.js";
|
|
28
|
-
import { getLogger } from "../util/logger.js";
|
|
29
|
-
import { listWatchers } from "./watcher-store.js";
|
|
30
|
-
|
|
31
|
-
const log = getLogger("watcher-telemetry");
|
|
32
|
-
|
|
33
|
-
const INVENTORY_CHECKPOINT_KEY = "telemetry:watchers:inventory_last_recorded";
|
|
34
|
-
export const WATCHER_INVENTORY_INTERVAL_MS = 24 * 60 * 60 * 1000;
|
|
35
|
-
|
|
36
|
-
let warnedInventoryDbUnavailable = false;
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Record one `watcher_enabled:<providerId>` lifecycle event per enabled
|
|
40
|
-
* watcher, at most once per 24h. Called from every watcher tick; the
|
|
41
|
-
* checkpoint advances only after the events are recorded, so a transient
|
|
42
|
-
* storage failure (a throw, or a degraded-mode `null` while consent is not
|
|
43
|
-
* a confirmed opt-out) retries on the next tick instead of skipping a day.
|
|
44
|
-
* A confirmed-opt-out `null` is a deliberate skip and still advances. Retries
|
|
45
|
-
* can duplicate events for watchers recorded before the failure point —
|
|
46
|
-
* an acceptable overcount for best-effort telemetry, where losing a full
|
|
47
|
-
* day's inventory would not be.
|
|
48
|
-
*/
|
|
49
|
-
export function recordWatcherInventoryIfDue(now: number): void {
|
|
50
|
-
try {
|
|
51
|
-
const last = Number(getMemoryCheckpoint(INVENTORY_CHECKPOINT_KEY) ?? "0");
|
|
52
|
-
if (now - last < WATCHER_INVENTORY_INTERVAL_MS) {
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
for (const watcher of listWatchers({ enabledOnly: true })) {
|
|
56
|
-
const recorded = recordLifecycleEvent(
|
|
57
|
-
`watcher_enabled:${watcher.providerId}`,
|
|
58
|
-
);
|
|
59
|
-
if (recorded === null && getRawShareAnalytics() !== false) {
|
|
60
|
-
if (!warnedInventoryDbUnavailable) {
|
|
61
|
-
warnedInventoryDbUnavailable = true;
|
|
62
|
-
log.warn(
|
|
63
|
-
"Telemetry DB unavailable; watcher inventory retries next tick",
|
|
64
|
-
);
|
|
65
|
-
}
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
warnedInventoryDbUnavailable = false;
|
|
70
|
-
setMemoryCheckpoint(INVENTORY_CHECKPOINT_KEY, String(now));
|
|
71
|
-
} catch (err) {
|
|
72
|
-
log.warn({ err }, "Failed to record watcher inventory telemetry");
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* Record a `watcher_llm_processed:<providerId>:<conversationId>`
|
|
78
|
-
* lifecycle event for a watcher tick that bootstrapped an LLM background
|
|
79
|
-
* job. Recorded whenever a conversation was created — even if the job
|
|
80
|
-
* later failed — because tokens may already have been spent.
|
|
81
|
-
*/
|
|
82
|
-
export function recordWatcherLlmProcessed(
|
|
83
|
-
providerId: string,
|
|
84
|
-
conversationId: string,
|
|
85
|
-
): void {
|
|
86
|
-
try {
|
|
87
|
-
recordLifecycleEvent(
|
|
88
|
-
`watcher_llm_processed:${providerId}:${conversationId}`,
|
|
89
|
-
);
|
|
90
|
-
} catch (err) {
|
|
91
|
-
log.warn({ err }, "Failed to record watcher LLM-processed telemetry");
|
|
92
|
-
}
|
|
93
|
-
}
|
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
-
import { join } from "node:path";
|
|
3
|
-
|
|
4
|
-
import type { WorkspaceMigration } from "./types.js";
|
|
5
|
-
|
|
6
|
-
// Enable adaptive thinking on the cloud "balanced" and "quality-optimized"
|
|
7
|
-
// profiles for existing platform instances.
|
|
8
|
-
//
|
|
9
|
-
// The assistant-side seed defaults (MANAGED_PROFILE_TEMPLATES in
|
|
10
|
-
// seed-inference-profiles.ts) already ship thinking: { enabled: true,
|
|
11
|
-
// streamThinking: true } for both profiles, which normalizes to
|
|
12
|
-
// { type: "adaptive" } on the wire. Off-platform (BYOK) instances pick this
|
|
13
|
-
// up on every boot because the seeder overwrites cloud profiles. On-platform
|
|
14
|
-
// instances preserve existing profiles (the cloud overlay is authoritative),
|
|
15
|
-
// so instances that were hatched before thinking was enabled in the templates
|
|
16
|
-
// are stuck with thinking disabled or absent.
|
|
17
|
-
//
|
|
18
|
-
// This migration patches the on-disk config for both profiles, adding
|
|
19
|
-
// thinking: { enabled: true, streamThinking: true } where it's missing or
|
|
20
|
-
// explicitly disabled. It skips profiles that:
|
|
21
|
-
// - Don't exist (no profile to patch)
|
|
22
|
-
// - Already have thinking enabled (idempotent)
|
|
23
|
-
// - Are source: "user" (user-created profiles are untouched)
|
|
24
|
-
// - Have a non-managed, non-absent source (unknown origin)
|
|
25
|
-
// - Resolve to a non-Anthropic provider (adaptive thinking is
|
|
26
|
-
// Anthropic-specific). Effective provider is the profile's explicit
|
|
27
|
-
// `provider`; otherwise the provider implied by a known Claude `model`
|
|
28
|
-
// (mirroring the resolver's withImpliedProviders); otherwise
|
|
29
|
-
// llm.default.provider — with a completely absent llm.default.provider
|
|
30
|
-
// treated as Anthropic, matching migration 052's own `?? "anthropic"`
|
|
31
|
-
// default. This keeps the legacy non-Anthropic empty `{}` shells seeded by
|
|
32
|
-
// migration 052 off the repair while still patching profiles that pin a
|
|
33
|
-
// known Claude model under a non-Anthropic default.
|
|
34
|
-
//
|
|
35
|
-
// Note: the live startup path re-runs the same repair after the cloud
|
|
36
|
-
// overlay merge — see assistant/src/workspace/adaptive-thinking-repair.ts.
|
|
37
|
-
// This file keeps its own frozen copy of the logic because migration modules
|
|
38
|
-
// are self-contained snapshots and must never be imported by other code.
|
|
39
|
-
|
|
40
|
-
const ADAPTIVE_THINKING = { enabled: true, streamThinking: true } as const;
|
|
41
|
-
const TARGET_PROFILES = ["balanced", "quality-optimized"] as const;
|
|
42
|
-
|
|
43
|
-
export const enableAdaptiveThinkingCloudProfilesMigration: WorkspaceMigration =
|
|
44
|
-
{
|
|
45
|
-
id: "097-enable-adaptive-thinking-managed-profiles",
|
|
46
|
-
description:
|
|
47
|
-
"Enable adaptive thinking on managed balanced and quality-optimized profiles",
|
|
48
|
-
run(workspaceDir: string): void {
|
|
49
|
-
const configPath = join(workspaceDir, "config.json");
|
|
50
|
-
if (!existsSync(configPath)) {
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
let config: Record<string, unknown>;
|
|
55
|
-
try {
|
|
56
|
-
const raw = JSON.parse(readFileSync(configPath, "utf-8"));
|
|
57
|
-
if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
config = raw as Record<string, unknown>;
|
|
61
|
-
} catch {
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
const llm = readObject(config.llm);
|
|
66
|
-
if (llm === null) {
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
const profiles = readObject(llm.profiles);
|
|
71
|
-
if (profiles === null) {
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
// Profiles without an explicit provider and without a model-implied
|
|
76
|
-
// provider inherit llm.default.provider at resolution time; an absent
|
|
77
|
-
// llm.default.provider resolves to Anthropic.
|
|
78
|
-
const defaultBlock = readObject(llm.default);
|
|
79
|
-
const defaultProvider =
|
|
80
|
-
typeof defaultBlock?.provider === "string"
|
|
81
|
-
? defaultBlock.provider
|
|
82
|
-
: "anthropic";
|
|
83
|
-
|
|
84
|
-
let changed = false;
|
|
85
|
-
|
|
86
|
-
for (const name of TARGET_PROFILES) {
|
|
87
|
-
const profile = readObject(profiles[name]);
|
|
88
|
-
if (profile === null) {
|
|
89
|
-
continue;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// Only patch managed Anthropic profiles.
|
|
93
|
-
// Legacy profiles created before the `source` metadata field was
|
|
94
|
-
// introduced have source=undefined. Treat these as managed when the
|
|
95
|
-
// profile name is one of the canonical managed names (which
|
|
96
|
-
// TARGET_PROFILES already guarantees) and the effective provider is
|
|
97
|
-
// Anthropic. Effective provider is the explicit `provider`, else the
|
|
98
|
-
// provider implied by a known Claude `model`, else the inherited
|
|
99
|
-
// llm.default.provider. Explicit `source: "user"` profiles are always
|
|
100
|
-
// skipped.
|
|
101
|
-
if (profile.source === "user") {
|
|
102
|
-
continue;
|
|
103
|
-
}
|
|
104
|
-
if (profile.source !== undefined && profile.source !== "managed") {
|
|
105
|
-
continue;
|
|
106
|
-
}
|
|
107
|
-
const effectiveProvider = resolveEffectiveProvider(
|
|
108
|
-
profile,
|
|
109
|
-
defaultProvider,
|
|
110
|
-
);
|
|
111
|
-
if (effectiveProvider !== "anthropic") {
|
|
112
|
-
continue;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
// Skip if thinking is already enabled.
|
|
116
|
-
const thinking = readObject(profile.thinking);
|
|
117
|
-
if (thinking !== null && thinking.enabled === true) {
|
|
118
|
-
continue;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
profile.thinking = { ...ADAPTIVE_THINKING };
|
|
122
|
-
profiles[name] = profile;
|
|
123
|
-
changed = true;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
if (changed) {
|
|
127
|
-
llm.profiles = profiles;
|
|
128
|
-
config.llm = llm;
|
|
129
|
-
writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n");
|
|
130
|
-
}
|
|
131
|
-
},
|
|
132
|
-
down(_workspaceDir: string): void {
|
|
133
|
-
// Forward-only.
|
|
134
|
-
},
|
|
135
|
-
};
|
|
136
|
-
|
|
137
|
-
// Inline, conservative mirror of the resolver's catalog-based provider
|
|
138
|
-
// implication. Migration modules are frozen, self-contained snapshots and must
|
|
139
|
-
// not import the live model catalog. Anthropic's catalog model ids are bare
|
|
140
|
-
// `claude-*` ids (the slash-prefixed `anthropic/claude-*` ids belong to
|
|
141
|
-
// OpenRouter), so a profile pinning a `claude-*` model with no slash counts as
|
|
142
|
-
// Anthropic.
|
|
143
|
-
function resolveEffectiveProvider(
|
|
144
|
-
profile: Record<string, unknown>,
|
|
145
|
-
defaultProvider: string,
|
|
146
|
-
): string {
|
|
147
|
-
if (typeof profile.provider === "string") {
|
|
148
|
-
return profile.provider;
|
|
149
|
-
}
|
|
150
|
-
if (
|
|
151
|
-
typeof profile.model === "string" &&
|
|
152
|
-
profile.model.startsWith("claude-") &&
|
|
153
|
-
!profile.model.includes("/")
|
|
154
|
-
) {
|
|
155
|
-
return "anthropic";
|
|
156
|
-
}
|
|
157
|
-
return defaultProvider;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
function readObject(value: unknown): Record<string, unknown> | null {
|
|
161
|
-
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
162
|
-
return null;
|
|
163
|
-
}
|
|
164
|
-
return value as Record<string, unknown>;
|
|
165
|
-
}
|