@mycadet/assistant 0.12.9 → 0.12.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Dockerfile +0 -8
- package/eslint-rules/__tests__/cli-no-daemon-internals.test.ts +1 -1
- package/openapi.yaml +62 -910
- package/package.json +3 -7
- package/scripts/build-test-fixtures.ts +1 -1
- package/scripts/generate-openapi.ts +22 -6
- package/scripts/postinstall.ts +4 -10
- package/scripts/run-tests.ts +0 -21
- package/src/__tests__/adaptive-thinking-repair.test.ts +19 -57
- package/src/__tests__/agent-loop.test.ts +0 -76
- package/src/__tests__/anthropic-provider.test.ts +6 -6
- package/src/__tests__/assert-not-live-db.ts +1 -1
- package/src/__tests__/assistant-id-boundary-guard.test.ts +3 -3
- package/src/__tests__/attachments-store-heic-normalize.test.ts +1 -1
- package/src/__tests__/attachments-store.test.ts +1 -1
- package/src/__tests__/audit-log-rotation.test.ts +1 -1
- package/src/__tests__/btw-routes.test.ts +1 -1
- package/src/__tests__/byok-default-profile-ensure.test.ts +21 -27
- package/src/__tests__/call-conversation-messages.test.ts +0 -5
- package/src/__tests__/call-recovery.test.ts +2 -7
- package/src/__tests__/call-routes-http.test.ts +0 -12
- package/src/__tests__/call-store.test.ts +2 -7
- package/src/__tests__/catalog-files.test.ts +7 -5
- package/src/__tests__/checker.test.ts +1 -1
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +4 -4
- package/src/__tests__/cloud-client-verify-credential.test.ts +0 -4
- package/src/__tests__/cloud-credential-catalog-cli.test.ts +14 -14
- package/src/__tests__/cloud-profile-guard.test.ts +48 -401
- package/src/__tests__/compaction-events.test.ts +2 -2
- package/src/__tests__/config-loader-backfill.test.ts +74 -163
- package/src/__tests__/config-loader-cloud-defaults.test.ts +11 -11
- package/src/__tests__/config-loader-corrupt.test.ts +10 -10
- package/src/__tests__/config-loader-quarantine-notice.test.ts +7 -7
- package/src/__tests__/config-loader-validation-reset-notice.test.ts +11 -11
- package/src/__tests__/config-schema.test.ts +26 -27
- package/src/__tests__/config-set-route.test.ts +2 -6
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +28 -300
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +39 -246
- package/src/__tests__/conversation-agent-loop.test.ts +2 -58
- package/src/__tests__/conversation-clear-safety.test.ts +0 -30
- package/src/__tests__/conversation-inference-profile-route.test.ts +1 -1
- package/src/__tests__/conversation-queue.test.ts +1 -1
- package/src/__tests__/conversation-runtime-assembly.test.ts +1 -1
- package/src/__tests__/conversation-skill-tools.test.ts +4 -444
- package/src/__tests__/conversation-slash-commands.test.ts +1 -1
- package/src/__tests__/conversation-store.test.ts +1 -84
- package/src/__tests__/conversation-surface-state.test.ts +0 -16
- package/src/__tests__/credential-health-service.test.ts +14 -1
- package/src/__tests__/credential-record-retire.test.ts +1 -1
- package/src/__tests__/credential-record-write-through.test.ts +1 -1
- package/src/__tests__/credential-security-invariants.test.ts +0 -145
- package/src/__tests__/custom-profile-ensure.test.ts +1 -1
- package/src/__tests__/default-profile-catalog-fallback.test.ts +5 -15
- package/src/__tests__/deterministic-verification-control-plane.test.ts +0 -2
- package/src/__tests__/dictation-profile-store.test.ts +6 -6
- package/src/__tests__/disk-usage.test.ts +28 -164
- package/src/__tests__/docker-signing-key-bootstrap.test.ts +1 -1
- package/src/__tests__/embedding-cloud-proxy-selection.test.ts +1 -1
- package/src/__tests__/emit-event-signal.test.ts +1 -1
- package/src/__tests__/gateway-client-cloud-outbound.test.ts +3 -3
- package/src/__tests__/gateway-only-enforcement.test.ts +1 -1
- package/src/__tests__/guardian-dispatch.test.ts +0 -13
- package/src/__tests__/helpers/seed-app.ts +1 -1
- package/src/__tests__/host-cu-routes-targeted.test.ts +1 -1
- package/src/__tests__/host-shell-tool.test.ts +1 -1
- package/src/__tests__/identity-routes.test.ts +1 -1
- package/src/__tests__/inference-profile-session-handler.test.ts +1 -1
- package/src/__tests__/inference-profile-session-ipc.test.ts +1 -1
- package/src/__tests__/injector-chain.test.ts +1 -1
- package/src/__tests__/injector-config-quarantine-notice.test.ts +1 -1
- package/src/__tests__/injector-config-validation-reset-notice.test.ts +1 -1
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +1 -1
- package/src/__tests__/{platform.test.ts → layout.test.ts} +1 -1
- package/src/__tests__/list-all-apps.test.ts +1 -1
- package/src/__tests__/live-workspace-guard.test.ts +2 -2
- package/src/__tests__/llm-resolver-override-or-default.test.ts +5 -6
- package/src/__tests__/llm-resolver.test.ts +7 -7
- package/src/__tests__/llm-schema-fallback-profile.test.ts +9 -10
- package/src/__tests__/llm-usage-store.test.ts +0 -495
- package/src/__tests__/log-export-routes.test.ts +1 -1
- package/src/__tests__/mcp-config-secret-boundary.test.ts +12 -53
- package/src/__tests__/mcp-list-plugin-servers.test.ts +1 -1
- package/src/__tests__/memory-config-file-parity.test.ts +1 -1
- package/src/__tests__/memory-v2-static-injector.test.ts +1 -1
- package/src/__tests__/messages-read-boundary-guard.test.ts +0 -2
- package/src/__tests__/notification-guardian-path.test.ts +0 -7
- package/src/__tests__/onboarding-persona-write.test.ts +1 -1
- package/src/__tests__/openai-provider.test.ts +8 -8
- package/src/__tests__/path-policy.test.ts +1 -1
- package/src/__tests__/persona-resolver.test.ts +1 -1
- package/src/__tests__/plugin-app-serve-routes.test.ts +1 -1
- package/src/__tests__/plugin-effective-enabled-set.test.ts +1 -1
- package/src/__tests__/plugin-import-boundary-guard.test.ts +4 -6
- package/src/__tests__/plugin-import-boundary-reverse-guard.test.ts +0 -3
- package/src/__tests__/provider-cloud-proxy-integration.test.ts +1 -5
- package/src/__tests__/provider-connections-backfill.test.ts +10 -10
- package/src/__tests__/prune-old-conversations-job.test.ts +6 -31
- package/src/__tests__/resolve-app.test.ts +1 -1
- package/src/__tests__/run-due-schedules.test.ts +1 -1
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +0 -53
- package/src/__tests__/schedule-routes.test.ts +1 -1
- package/src/__tests__/schedule-store.test.ts +1 -1
- package/src/__tests__/secret-routes-cloud-proxy.test.ts +1 -1
- package/src/__tests__/skill-load-plugin-scope.test.ts +1 -1
- package/src/__tests__/surface-completion-compaction-boundary.test.ts +1 -1
- package/src/__tests__/tool-approval-handler.test.ts +1 -1
- package/src/__tests__/tool-audit.test.ts +5 -235
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +54 -114
- package/src/__tests__/tools-get-route.test.ts +1 -1
- package/src/__tests__/turn-outcome-read.test.ts +1 -1
- package/src/__tests__/twilio-routes.test.ts +0 -1
- package/src/__tests__/usage-attribution.test.ts +0 -31
- package/src/__tests__/verification-control-plane-policy.test.ts +3 -10
- package/src/__tests__/visible-app-context.test.ts +1 -1
- package/src/__tests__/voice-ingress-preflight.test.ts +1 -1
- package/src/__tests__/workspace-git-service.test.ts +1 -1
- package/src/__tests__/workspace-greetings.test.ts +1 -1
- package/src/acp/__tests__/helpers/acp-config-stub.ts +1 -1
- package/src/activation/progress-store.ts +1 -1
- package/src/activation/turn-hooks.ts +1 -1
- package/src/agent/loop.ts +0 -51
- package/src/apps/app-store.ts +1 -1
- package/src/avatar/__tests__/avatar-store.test.ts +2 -172
- package/src/avatar/accent-backfill.ts +1 -1
- package/src/avatar/avatar-manifest.ts +1 -1
- package/src/avatar/avatar-store.ts +10 -69
- package/src/avatar/ensure-raster.ts +1 -1
- package/src/avatar/identity-avatar.ts +1 -1
- package/src/avatar/sync-avatar.ts +1 -1
- package/src/avatar/traits-png-sync.ts +1 -1
- package/src/bundler/compiler-tools.ts +1 -1
- package/src/bundler/package-resolver.ts +1 -1
- package/src/calls/__tests__/call-controller.test.ts +25 -27
- package/src/calls/active-call-lease.ts +1 -1
- package/src/calls/call-controller.ts +3 -3
- package/src/calls/call-domain.ts +4 -8
- package/src/calls/call-store.ts +2 -76
- package/src/calls/resolve-call-tts-provider.ts +3 -3
- package/src/calls/twilio-config.ts +3 -3
- package/src/calls/twilio-rest.ts +2 -2
- package/src/calls/voice-ingress-preflight.ts +2 -2
- package/src/cli/bundled-modules.ts +0 -2
- package/src/cli/commands/__tests__/apps.test.ts +1 -1
- package/src/cli/commands/__tests__/plugins.test.ts +9 -66
- package/src/cli/commands/__tests__/ps.test.ts +67 -0
- package/src/cli/commands/auth.help.ts +2 -2
- package/src/cli/commands/avatar.ts +1 -1
- package/src/cli/commands/changelog.ts +1 -1
- package/src/cli/commands/cloud/__tests__/subscription.test.ts +2 -2
- package/src/cli/commands/cloud/index.help.ts +1 -1
- package/src/cli/commands/cloud/index.ts +2 -2
- package/src/cli/commands/db/refresh.ts +1 -1
- package/src/cli/commands/db/repair-step-conversation-backfill.ts +1 -1
- package/src/cli/commands/db/repair.ts +1 -1
- package/src/cli/commands/db/status.ts +1 -1
- package/src/cli/commands/inference-profiles.ts +1 -12
- package/src/cli/commands/memory/__tests__/memory-v3.test.ts +1 -116
- package/src/cli/commands/memory/index.help.ts +1 -43
- package/src/cli/commands/memory/memory-v3.ts +0 -64
- package/src/cli/commands/plugins.ts +54 -205
- package/src/cli/commands/ps.ts +5 -2
- package/src/cli/commands/status.ts +1 -1
- package/src/cli/index.help.ts +0 -2
- package/src/cli/lib/__tests__/inspect-plugin.test.ts +36 -66
- package/src/cli/lib/__tests__/install-from-cloud.test.ts +1 -1
- package/src/cli/lib/__tests__/install-from-github.test.ts +41 -117
- package/src/cli/lib/__tests__/plugin-catalog-cache.test.ts +2 -185
- package/src/cli/lib/__tests__/plugin-catalog-resolve.test.ts +36 -66
- package/src/cli/lib/__tests__/plugin-catalog-visibility.test.ts +4 -6
- package/src/cli/lib/__tests__/plugin-details.test.ts +113 -96
- package/src/cli/lib/__tests__/search-plugins.test.ts +9 -16
- package/src/cli/lib/__tests__/uninstall-plugin.test.ts +1 -1
- package/src/cli/lib/__tests__/upgrade-plugin.test.ts +38 -15
- package/src/cli/lib/diff-plugin.ts +1 -1
- package/src/cli/lib/inspect-plugin.ts +13 -97
- package/src/cli/lib/install-from-cloud.ts +1 -1
- package/src/cli/lib/install-from-github.ts +75 -154
- package/src/cli/lib/install-plugin-dependencies.ts +1 -1
- package/src/cli/lib/list-installed-plugins.ts +1 -1
- package/src/cli/lib/open-browser.ts +1 -1
- package/src/cli/lib/plugin-catalog-cache.ts +8 -51
- package/src/cli/lib/plugin-catalog-resolve.ts +3 -22
- package/src/cli/lib/plugin-details.ts +5 -27
- package/src/cli/lib/plugin-marketplace.ts +18 -266
- package/src/cli/lib/search-plugins.ts +23 -43
- package/src/cli/lib/toggle-plugin.ts +1 -1
- package/src/cli/lib/uninstall-plugin.ts +1 -1
- package/src/cli/lib/upgrade-plugin.ts +3 -49
- package/src/cli/program.ts +1 -3
- package/src/cli.ts +1 -1
- package/src/cloud/client.ts +0 -6
- package/src/cloud/consent-cache.test.ts +22 -201
- package/src/cloud/consent-cache.ts +16 -111
- package/src/cloud/sync-identity.ts +1 -1
- package/src/config/__tests__/chat-settings.test.ts +1 -1
- package/src/config/__tests__/cloud-identity.test.ts +15 -2
- package/src/config/__tests__/default-plugin-skill-discovery.test.ts +1 -1
- package/src/config/__tests__/default-profile-catalog.test.ts +12 -51
- package/src/config/__tests__/deployment-context-defaults.test.ts +13 -13
- package/src/config/__tests__/loader-callsite-strip-fallback.test.ts +4 -4
- package/src/config/__tests__/loader-last-known-good.test.ts +9 -9
- package/src/config/__tests__/loader-sparse-array-cleanup.test.ts +7 -7
- package/src/config/__tests__/plugin-resident-skill-discovery.test.ts +1 -1
- package/src/config/__tests__/profile-materialization.test.ts +2 -4
- package/src/config/__tests__/sync-gated-profiles.test.ts +1 -106
- package/src/config/acp-agent-write.ts +1 -1
- package/src/config/bundled-skills/settings/tools/open-system-settings.test.ts +1 -1
- package/src/config/bundled-skills/settings/tools/open-system-settings.ts +1 -1
- package/src/config/call-site-defaults.ts +0 -6
- package/src/config/cloud-identity.ts +12 -5
- package/src/config/composer-preferences.ts +1 -1
- package/src/config/default-profile-catalog.ts +8 -75
- package/src/config/default-profile-names.ts +2 -25
- package/src/config/env-registry.ts +1 -14
- package/src/config/env.ts +8 -6
- package/src/config/llm-resolver.ts +1 -2
- package/src/config/loader.ts +13 -17
- package/src/config/profile-materialization.ts +1 -1
- package/src/config/schema.ts +1 -7
- package/src/config/schemas/call-site-catalog.ts +0 -7
- package/src/config/schemas/llm.ts +22 -27
- package/src/config/seed-inference-profiles.ts +16 -17
- package/src/config/skills.ts +2 -2
- package/src/config/sync-gated-profiles.ts +6 -24
- package/src/credential-health/credential-health-service.ts +10 -3
- package/src/daemon/approval-generators.ts +3 -3
- package/src/daemon/config-watcher.ts +2 -2
- package/src/daemon/conversation-agent-loop-handlers.ts +0 -18
- package/src/daemon/conversation-agent-loop.ts +6 -97
- package/src/daemon/conversation-process.ts +1 -1
- package/src/daemon/conversation-skill-tools.ts +4 -72
- package/src/daemon/conversation-store.ts +1 -1
- package/src/daemon/conversation-surface-state.ts +0 -33
- package/src/daemon/conversation-surfaces.ts +1 -86
- package/src/daemon/conversation-tool-setup.test.ts +1 -1
- package/src/daemon/conversation-tool-setup.ts +0 -23
- package/src/daemon/conversation.ts +3 -5
- package/src/daemon/daemon-control.ts +3 -3
- package/src/daemon/dictation-profile-store.ts +3 -3
- package/src/daemon/event-loop-watchdog.test.ts +2 -198
- package/src/daemon/event-loop-watchdog.ts +0 -185
- package/src/daemon/external-plugins-bootstrap.ts +1 -1
- package/src/daemon/first-greeting.ts +1 -1
- package/src/daemon/handlers/skills.ts +1 -1
- package/src/daemon/host-app-control-proxy.ts +1 -1
- package/src/daemon/host-cu-proxy.ts +2 -2
- package/src/daemon/identity-helpers.ts +1 -1
- package/src/daemon/lifecycle.ts +11 -15
- package/src/daemon/main.ts +1 -1
- package/src/daemon/now-scratchpad.ts +1 -1
- package/src/daemon/process-message.ts +4 -4
- package/src/daemon/profiler-run-store.ts +2 -2
- package/src/daemon/providers-setup.ts +2 -2
- package/src/daemon/shutdown-handlers.ts +0 -10
- package/src/daemon/sqlite-corruption-watchdog.test.ts +2 -142
- package/src/daemon/sqlite-corruption-watchdog.ts +17 -81
- package/src/daemon/tool-side-effects.ts +1 -1
- package/src/desktop/desktop-session-manager.ts +1 -1
- package/src/desktop/desktop-wallpaper-renderer.ts +1 -1
- package/src/heartbeat/heartbeat-service.ts +1 -1
- package/src/home/feed-writer.ts +1 -1
- package/src/home/home-greeting-cache.ts +1 -1
- package/src/home/relationship-state-writer.ts +2 -2
- package/src/hooks/__tests__/hook-live-reload.test.ts +1 -1
- package/src/hooks/hook-loader.ts +2 -2
- package/src/inbound/__tests__/oauth-callback-url.test.ts +2 -2
- package/src/inbound/oauth-callback-url.ts +3 -3
- package/src/ipc/__tests__/attachment-ipc.test.ts +1 -1
- package/src/ipc/socket-path.ts +1 -1
- package/src/live-voice/__tests__/live-voice-archive.test.ts +1 -1
- package/src/live-voice/__tests__/live-voice-vad.test.ts +1 -1
- package/src/live-voice/live-voice-session.ts +3 -66
- package/src/mcp/__tests__/effective-config.test.ts +1 -1
- package/src/mcp/__tests__/mcp-oauth-client-registration.test.ts +2 -2
- package/src/mcp/__tests__/mcp-oauth-provider.test.ts +2 -3
- package/src/mcp/__tests__/reload-signal-emission.test.ts +1 -1
- package/src/mcp/__tests__/reload-signal.test.ts +1 -1
- package/src/mcp/__tests__/workspace-mcp-config.test.ts +19 -21
- package/src/mcp/reload-signal.ts +1 -1
- package/src/mcp/workspace-mcp-config.ts +1 -23
- package/src/messaging/draft-store.ts +1 -1
- package/src/monitoring/__tests__/active-conversations.test.ts +1 -1
- package/src/monitoring/__tests__/page-cache.test.ts +1 -1
- package/src/monitoring/__tests__/stall-capture.test.ts +1 -1
- package/src/monitoring/__tests__/workspace-git-heartbeat.test.ts +1 -1
- package/src/monitoring/active-conversations.ts +1 -1
- package/src/monitoring/control.ts +1 -1
- package/src/monitoring/daemon-boot-time.ts +1 -1
- package/src/monitoring/daemon-heartbeat.ts +1 -1
- package/src/monitoring/page-cache.ts +1 -1
- package/src/monitoring/plugin-auto-update.ts +1 -7
- package/src/monitoring/plugin-source-watch.ts +1 -1
- package/src/monitoring/recovery/db.ts +1 -1
- package/src/monitoring/recovery/inflight-content.ts +1 -1
- package/src/monitoring/resource-sampler.ts +3 -14
- package/src/monitoring/stall-capture.ts +1 -1
- package/src/monitoring/worker.ts +9 -76
- package/src/monitoring/workspace-git-heartbeat.ts +1 -1
- package/src/oauth/connect-orchestrator.ts +4 -4
- package/src/permissions/checker.ts +1 -1
- package/src/permissions/workspace-policy.ts +1 -1
- package/src/persistence/__tests__/main-db-readonly-probe.ts +27 -52
- package/src/persistence/__tests__/message-content-file.test.ts +1 -1
- package/src/persistence/__tests__/slow-sync-log.test.ts +0 -2
- package/src/persistence/attachments-store.ts +1 -1
- package/src/persistence/conversation-crud.ts +1 -38
- package/src/persistence/conversation-directories.ts +1 -1
- package/src/persistence/conversation-types.ts +0 -8
- package/src/persistence/db-async-query.ts +1 -1
- package/src/persistence/db-connection.ts +11 -1
- package/src/persistence/db-init.ts +1 -1
- package/src/persistence/db-maintenance.ts +1 -1
- package/src/persistence/embeddings/__tests__/embedding-local-lifecycle.test.ts +1 -1
- package/src/persistence/embeddings/embedding-local.ts +4 -4
- package/src/persistence/embeddings/embedding-runtime-manager.ts +1 -1
- package/src/persistence/embeddings/qdrant-client.ts +1 -1
- package/src/persistence/embeddings/qdrant-manager.ts +1 -1
- package/src/persistence/job-handlers/__tests__/message-lexical-backfill.test.ts +1 -1
- package/src/persistence/job-handlers/__tests__/message-lexical-enqueue.test.ts +1 -1
- package/src/persistence/job-handlers/cleanup.ts +8 -17
- package/src/persistence/llm-usage-store.ts +2 -229
- package/src/persistence/message-content-file.ts +1 -1
- package/src/persistence/migrations/209-strip-thinking-from-consolidated.ts +1 -1
- package/src/persistence/migrations/222-strip-placeholder-sentinels-from-messages.ts +1 -1
- package/src/persistence/migrations/296-rewrite-balanced-economy-profile-pins.test.ts +1 -1
- package/src/persistence/migrations/306-rewrite-frontier-profile-pins.test.ts +1 -1
- package/src/persistence/migrations/329-move-onboarding-events-to-telemetry-db.test.ts +13 -0
- package/src/persistence/migrations/330-move-auth-fallback-events-to-telemetry-db.test.ts +13 -0
- package/src/persistence/migrations/331-move-lifecycle-events-to-telemetry-db.test.ts +13 -0
- package/src/persistence/migrations/332-move-skill-loaded-events-to-telemetry-db.test.ts +13 -0
- package/src/persistence/migrations/333-create-telemetry-events-table.test.ts +7 -4
- package/src/persistence/migrations/334-backfill-telemetry-events-outbox.test.ts +13 -0
- package/src/persistence/migrations/387-drop-telemetry-tables.ts +51 -0
- package/src/persistence/migrations/__tests__/327-create-flush-checkpoints.test.ts +9 -1
- package/src/persistence/migrations/__tests__/387-drop-telemetry-tables.test.ts +79 -0
- package/src/persistence/migrations/helpers/relocation.ts +1 -1
- package/src/persistence/migrations/run-migrations.ts +1 -1
- package/src/persistence/migrations/validate-migration-state.ts +1 -1
- package/src/persistence/raw-query.ts +1 -29
- package/src/persistence/slow-sync-log.ts +0 -23
- package/src/persistence/steps.ts +2 -0
- package/src/{telemetry → persistence}/tool-audit.ts +6 -121
- package/src/plugin-api/index.ts +1 -1
- package/src/plugin-api/plugin-name-env.ts +1 -1
- package/src/plugins/__tests__/installed-plugin-dirs.test.ts +1 -1
- package/src/plugins/collect-source-versions.ts +1 -1
- package/src/plugins/defaults/channel/package.json +1 -1
- package/src/plugins/defaults/cloud-hosted/package.json +1 -1
- package/src/plugins/defaults/compaction/package.json +1 -1
- package/src/plugins/defaults/documents/package.json +1 -1
- package/src/plugins/defaults/empty-response/package.json +1 -1
- package/src/plugins/defaults/exploration-drift/package.json +1 -1
- package/src/plugins/defaults/image-fallback/package.json +1 -1
- package/src/plugins/defaults/image-recovery/package.json +1 -1
- package/src/plugins/defaults/max-tokens-continue/package.json +1 -1
- package/src/plugins/defaults/memory/__tests__/db-async-query.test.ts +1 -1
- package/src/plugins/defaults/memory/__tests__/db-maintenance.test.ts +1 -1
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +0 -82
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-skill-card.test.ts +0 -41
- package/src/plugins/defaults/memory/__tests__/memory-tier-boundary-guard.test.ts +0 -2
- package/src/plugins/defaults/memory/memory-retrospective-job.ts +3 -52
- package/src/plugins/defaults/memory/memory-retrospective-skill-card.ts +0 -18
- package/src/plugins/defaults/memory/package.json +1 -1
- package/src/plugins/defaults/memory/paths.ts +4 -4
- package/src/plugins/defaults/memory/src/__tests__/memory-worker-routes.test.ts +1 -1
- package/src/plugins/defaults/memory/src/memory-v2-routes.ts +5 -5
- package/src/plugins/defaults/memory/src/memory-v3-routes.ts +0 -207
- package/src/plugins/defaults/memory/src/memory-worker-routes.ts +1 -1
- package/src/plugins/defaults/memory/startup.ts +1 -22
- package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +2 -253
- package/src/plugins/defaults/memory/v3/orchestrate.ts +5 -129
- package/src/plugins/defaults/memory/worker-control.ts +1 -1
- package/src/plugins/defaults/memory/worker.ts +2 -2
- package/src/plugins/defaults/session/package.json +1 -1
- package/src/plugins/defaults/surface-completion-nudge/package.json +1 -1
- package/src/plugins/defaults/task-progress/package.json +1 -1
- package/src/plugins/defaults/task-progress-nudge/package.json +1 -1
- package/src/plugins/defaults/title-generate/package.json +1 -1
- package/src/plugins/defaults/tool-error/package.json +1 -1
- package/src/plugins/defaults/tool-result-truncate/package.json +1 -1
- package/src/plugins/defaults/turn-context/package.json +1 -1
- package/src/plugins/defaults/workspace/injectors.ts +1 -1
- package/src/plugins/defaults/workspace/package.json +1 -1
- package/src/plugins/disabled-state.ts +1 -1
- package/src/plugins/ensure-plugin-api-shim.ts +1 -1
- package/src/plugins/ensure-shared-dep-links.ts +1 -1
- package/src/plugins/installed-plugin-dirs.ts +1 -1
- package/src/plugins/mcp-servers.ts +7 -9
- package/src/plugins/mtime-cache.ts +2 -2
- package/src/plugins/source-versions.ts +1 -1
- package/src/prompts/bootstrap-cleanup.ts +1 -1
- package/src/prompts/persona-resolver.ts +1 -1
- package/src/prompts/sections.ts +2 -2
- package/src/prompts/system-prompt.ts +10 -42
- package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +0 -37
- package/src/providers/__tests__/cadet-connection-routing.test.ts +2 -2
- package/src/providers/cadet/client.ts +1 -1
- package/src/providers/inference/__tests__/base-url-route-validation.test.ts +1 -1
- package/src/providers/inference/adapter-factory.ts +1 -1
- package/src/providers/inference/backfill.ts +3 -10
- package/src/providers/inference/profile-probe.ts +1 -1
- package/src/providers/retry.ts +0 -2
- package/src/providers/types.ts +0 -7
- package/src/providers/usage-tracking.ts +1 -1
- package/src/routes/__tests__/route-host.test.ts +1 -1
- package/src/routes/control.ts +1 -1
- package/src/routes/route-host-client.ts +1 -1
- package/src/routes/worker.ts +2 -2
- package/src/runtime/agent-wake.ts +1 -1
- package/src/runtime/assistant-stream-state.ts +1 -1
- package/src/runtime/auth/token-service.ts +1 -1
- package/src/runtime/background-job-runner.ts +1 -1
- package/src/runtime/middleware/twilio-validation.ts +2 -2
- package/src/runtime/routes/__tests__/app-pin-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/apps-refresh-route.test.ts +1 -1
- package/src/runtime/routes/__tests__/avatar-state-routes.test.ts +3 -33
- package/src/runtime/routes/__tests__/cloud-credits-routes.test.ts +5 -4
- package/src/runtime/routes/__tests__/cloud-invoice-routes.test.ts +4 -3
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +59 -287
- package/src/runtime/routes/__tests__/default-plugin-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/deprecated-route-context.test.ts +15 -62
- package/src/runtime/routes/__tests__/inference-profiles-routes.test.ts +105 -12
- package/src/runtime/routes/__tests__/ingress-status-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/monitoring-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +47 -211
- package/src/runtime/routes/__tests__/route-host-worker-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/schedule-routes-disarm-reason.test.ts +1 -1
- package/src/runtime/routes/__tests__/schedule-worker-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/user-route-dispatcher-host.test.ts +1 -1
- package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +1 -1
- package/src/runtime/routes/__tests__/user-routes-cli.test.ts +1 -1
- package/src/runtime/routes/__tests__/user-routes-notices.test.ts +1 -1
- package/src/runtime/routes/__tests__/user-routes-request.test.ts +1 -1
- package/src/runtime/routes/app-management-routes.ts +1 -1
- package/src/runtime/routes/attachment-routes.ts +1 -1
- package/src/runtime/routes/audit-routes.ts +1 -1
- package/src/runtime/routes/avatar-routes.ts +3 -10
- package/src/runtime/routes/cloud-routes.ts +3 -3
- package/src/runtime/routes/content-source-routes.ts +1 -1
- package/src/runtime/routes/conversation-query-routes.ts +60 -621
- package/src/runtime/routes/conversation-routes.ts +1 -38
- package/src/runtime/routes/debug-routes.ts +1 -1
- package/src/runtime/routes/deprecated-route-context.ts +5 -61
- package/src/runtime/routes/heartbeat-routes.ts +1 -1
- package/src/runtime/routes/identity-routes.ts +1 -1
- package/src/runtime/routes/index.ts +0 -6
- package/src/runtime/routes/inference-profile-session-handler.ts +3 -3
- package/src/runtime/routes/inference-profiles-routes.ts +48 -21
- package/src/runtime/routes/inference-provider-connection-routes.ts +0 -1
- package/src/runtime/routes/llm-call-sites-routes.ts +3 -3
- package/src/runtime/routes/log-export/__tests__/installed-inventory.test.ts +1 -1
- package/src/runtime/routes/log-export/__tests__/workspace-allowlist-error-contract.test.ts +1 -1
- package/src/runtime/routes/log-export/__tests__/workspace-allowlist.test.ts +1 -1
- package/src/runtime/routes/log-export/workspace-allowlist.ts +1 -1
- package/src/runtime/routes/log-export-routes.ts +17 -15
- package/src/runtime/routes/migration-rollback-routes.ts +1 -1
- package/src/runtime/routes/migration-routes.ts +2 -3
- package/src/runtime/routes/monitoring-routes.ts +2 -2
- package/src/runtime/routes/oauth-providers.ts +5 -5
- package/src/runtime/routes/plugins-routes.ts +38 -163
- package/src/runtime/routes/profiler-routes.ts +1 -1
- package/src/runtime/routes/route-host-worker-routes.ts +1 -1
- package/src/runtime/routes/sanity-routes.ts +1 -1
- package/src/runtime/routes/schedule-routes.ts +1 -1
- package/src/runtime/routes/schedule-worker-routes.ts +1 -1
- package/src/runtime/routes/settings-routes.ts +1 -1
- package/src/runtime/routes/sounds-config-routes.ts +1 -1
- package/src/runtime/routes/surface-conversation-resolver.ts +1 -7
- package/src/runtime/routes/user-route-dispatcher.ts +1 -3
- package/src/runtime/routes/user-route-import.ts +1 -1
- package/src/runtime/routes/user-route-resolution.ts +1 -1
- package/src/runtime/routes/user-routes-cli.ts +1 -1
- package/src/runtime/routes/workspace-commit-routes.ts +1 -1
- package/src/runtime/routes/workspace-greetings.ts +1 -1
- package/src/runtime/routes/workspace-routes.ts +1 -1
- package/src/runtime/routes/workspace-utils.ts +1 -1
- package/src/runtime/sync/resource-sync-events.ts +1 -1
- package/src/schedule/__tests__/plugin-schedule-declarations.test.ts +1 -1
- package/src/schedule/__tests__/plugin-schedule-reconciler.test.ts +1 -1
- package/src/schedule/plugin-schedule-availability.ts +1 -1
- package/src/schedule/plugin-schedule-declarations.ts +1 -1
- package/src/schedule/run-script.ts +1 -1
- package/src/schedule/scheduler.ts +1 -11
- package/src/schedule/worker-control.ts +1 -1
- package/src/schedule/worker.ts +3 -3
- package/src/security/oauth2.ts +2 -2
- package/src/security/secret-allowlist.ts +1 -1
- package/src/signals/cancel.ts +1 -1
- package/src/signals/conversation-undo.ts +1 -1
- package/src/signals/emit-event.ts +1 -1
- package/src/signals/event-stream.ts +1 -1
- package/src/signals/user-message.ts +1 -1
- package/src/skills/catalog-install.ts +2 -1
- package/src/skills/clawhub.ts +1 -1
- package/src/skills/cloud-store.ts +1 -1
- package/src/skills/path-classifier.ts +1 -1
- package/src/skills/skill-history.ts +1 -1
- package/src/skills/skillssh-registry.ts +1 -1
- package/src/skills/uninstall.ts +1 -1
- package/src/skills/workspace-skill-md-signature.ts +1 -1
- package/src/subagent/manager.ts +1 -1
- package/src/theme/workspace-theme.ts +1 -1
- package/src/tools/browser/auth-cache.ts +1 -1
- package/src/tools/browser/browser-manager.ts +1 -1
- package/src/tools/browser/runtime-check.ts +1 -1
- package/src/tools/executor.ts +4 -4
- package/src/tools/filesystem/write.ts +1 -1
- package/src/tools/permission-checker.ts +2 -51
- package/src/tools/run-standalone.ts +1 -1
- package/src/tools/skills/format-input-schema.ts +1 -1
- package/src/tools/skills/load.ts +1 -1
- package/src/tools/skills/scaffold-cloud.ts +0 -32
- package/src/tools/terminal/safe-env.ts +1 -2
- package/src/tools/terminal/sanitized-bash.ts +1 -1
- package/src/tools/terminal/shell.ts +1 -1
- package/src/tools/tool-approval-handler.ts +4 -1
- package/src/tools/workflows/manage-workflows.ts +2 -2
- package/src/tools/workflows/run-workflow.test.ts +1 -1
- package/src/tools/workspace-tools/loader.ts +1 -1
- package/src/tts/synthesis-stream.ts +2 -2
- package/src/usage/attribution.ts +1 -11
- package/src/util/browser.ts +1 -1
- package/src/util/bun-runtime.ts +2 -1
- package/src/util/device-id.ts +1 -1
- package/src/util/disk-usage.ts +4 -139
- package/src/util/layout.ts +3 -3
- package/src/util/logger.ts +1 -1
- package/src/util/logs-db-path.ts +1 -1
- package/src/util/memory-db-path.ts +1 -1
- package/src/util/{platform.ts → os.ts} +5 -30
- package/src/util/process-tree.ts +19 -0
- package/src/util/sqlite3-runtime.ts +1 -1
- package/src/util/telemetry-db-path.ts +1 -1
- package/src/watcher/__tests__/engine.test.ts +0 -23
- package/src/watcher/engine.ts +0 -7
- package/src/windows-compiled-cli.ts +0 -4
- package/src/windows-compiled-worker-entry.ts +0 -6
- package/src/workflows/leaf-runner.test.ts +1 -1
- package/src/workflows/leaf-runner.ts +1 -1
- package/src/workflows/library.ts +1 -1
- package/src/workspace/adaptive-thinking-repair.ts +5 -24
- package/src/workspace/byok-default-profile-ensure.ts +24 -26
- package/src/workspace/custom-profile-ensure.ts +2 -2
- package/src/workspace/git-service.ts +1 -1
- package/src/workspace/hatched-date.ts +1 -1
- package/src/workspace/migrations/038-unify-llm-callsite-configs.ts +2 -2
- package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +1 -1
- package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +1 -1
- package/src/workspace/migrations/077-seed-memory-router-callsite.ts +1 -1
- package/src/workspace/migrations/registry.ts +0 -4
- package/src/workspace/turn-commit.ts +1 -1
- package/docs/activation-funnel-telemetry.md +0 -324
- package/scripts/bundled-plugin-packages.ts +0 -154
- package/scripts/generate-bundled-plugin-packages.ts +0 -29
- package/src/__tests__/activation-early-marking.test.ts +0 -114
- package/src/__tests__/auth-fallback-events-store.test.ts +0 -99
- package/src/__tests__/config-get-vision-flag.test.ts +0 -139
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +0 -400
- package/src/__tests__/internal-telemetry-routes.test.ts +0 -213
- package/src/__tests__/telemetry-routes.test.ts +0 -182
- package/src/__tests__/turn-events-store.test.ts +0 -376
- package/src/__tests__/ui-channel-variants.test.ts +0 -53
- package/src/avatar/__tests__/avatar-changed-telemetry.test.ts +0 -217
- package/src/avatar/avatar-changed-telemetry.ts +0 -128
- package/src/calls/__tests__/call-funnel-telemetry.test.ts +0 -204
- package/src/cli/commands/telemetry.help.ts +0 -27
- package/src/cli/commands/telemetry.ts +0 -83
- package/src/cli/lib/__tests__/local-plugin-upgrade.test.ts +0 -251
- package/src/cli/lib/__tests__/plugin-catalog-local.test.ts +0 -113
- package/src/cli/lib/__tests__/plugin-marketplace.test.ts +0 -384
- package/src/cli/lib/__tests__/plugin-pin-history.test.ts +0 -164
- package/src/cli/lib/__tests__/plugins-install-offline.test.ts +0 -228
- package/src/cli/lib/bundled-marketplace.json +0 -1575
- package/src/cli/lib/bundled-plugin-packages.json +0 -827
- package/src/cli/lib/bundled-plugin-packages.ts +0 -87
- package/src/cli/lib/plugin-catalog-local.ts +0 -94
- package/src/cli/lib/plugin-pin-history.ts +0 -276
- package/src/cloud/feature-gate.ts +0 -8
- package/src/config/__tests__/cloud-rehydration.test.ts +0 -180
- package/src/config/cloud-rehydration.ts +0 -35
- package/src/daemon/__tests__/auto-profile-router.test.ts +0 -380
- package/src/daemon/auto-profile-router.ts +0 -428
- package/src/live-voice/__tests__/live-voice-session-telemetry.test.ts +0 -391
- package/src/monitoring/__tests__/db-integrity-sample.test.ts +0 -113
- package/src/monitoring/__tests__/oom-kill-reporter.test.ts +0 -374
- package/src/monitoring/db-integrity-check.ts +0 -163
- package/src/monitoring/db-integrity-sample.ts +0 -176
- package/src/monitoring/oom-kill-reporter.ts +0 -469
- package/src/onboarding/__tests__/onboarding-events-store.test.ts +0 -158
- package/src/onboarding/onboarding-events-store.ts +0 -296
- package/src/persistence/__tests__/raw-query-telemetry.test.ts +0 -76
- package/src/persistence/lifecycle-events-store.test.ts +0 -134
- package/src/persistence/lifecycle-events-store.ts +0 -110
- package/src/plugins/defaults/memory/__tests__/activation-session-store.test.ts +0 -76
- package/src/plugins/defaults/memory/activation-session-store.ts +0 -50
- package/src/plugins/defaults/memory/src/__tests__/memory-v3-gate-stats.test.ts +0 -281
- package/src/runtime/routes/auto-profile-routes.ts +0 -83
- package/src/runtime/routes/internal-telemetry-routes.ts +0 -142
- package/src/runtime/routes/telemetry-routes.ts +0 -274
- package/src/security/auth-fallback-events-store.ts +0 -57
- package/src/telemetry/__tests__/activation-funnel.test.ts +0 -95
- package/src/telemetry/__tests__/config-setting-events-store.test.ts +0 -63
- package/src/telemetry/__tests__/config-setting-snapshot.test.ts +0 -143
- package/src/telemetry/__tests__/flush-checkpoints.test.ts +0 -56
- package/src/telemetry/__tests__/live-voice-funnel.test.ts +0 -174
- package/src/telemetry/__tests__/outbox-test-harness.ts +0 -85
- package/src/telemetry/__tests__/phone-call-funnel.test.ts +0 -72
- package/src/telemetry/__tests__/telemetry-event-fixtures.ts +0 -282
- package/src/telemetry/__tests__/watchdog-events-store.test.ts +0 -71
- package/src/telemetry/activation-funnel.ts +0 -172
- package/src/telemetry/config-setting-events-store.ts +0 -40
- package/src/telemetry/config-setting-snapshot.ts +0 -170
- package/src/telemetry/flush-checkpoints.ts +0 -70
- package/src/telemetry/live-voice-funnel.ts +0 -185
- package/src/telemetry/memory-corpus-size.test.ts +0 -120
- package/src/telemetry/memory-corpus-size.ts +0 -184
- package/src/telemetry/memory-tier-reporter.test.ts +0 -195
- package/src/telemetry/memory-tier-reporter.ts +0 -130
- package/src/telemetry/phone-call-funnel.ts +0 -144
- package/src/telemetry/skill-loaded-events-store.test.ts +0 -93
- package/src/telemetry/skill-loaded-events-store.ts +0 -39
- package/src/telemetry/telemetry-event-sources.test.ts +0 -223
- package/src/telemetry/telemetry-event-sources.ts +0 -597
- package/src/telemetry/telemetry-events-outbox.test.ts +0 -375
- package/src/telemetry/telemetry-events-outbox.ts +0 -237
- package/src/telemetry/telemetry-main-db.ts +0 -48
- package/src/telemetry/telemetry-wire-source.json +0 -4
- package/src/telemetry/telemetry-wire-validation.test.ts +0 -157
- package/src/telemetry/telemetry-wire-validation.ts +0 -162
- package/src/telemetry/telemetry-wire.generated.ts +0 -483
- package/src/telemetry/tool-executed-events-store.test.ts +0 -210
- package/src/telemetry/tool-executed-events-store.ts +0 -102
- package/src/telemetry/trace-collection-policy.test.ts +0 -28
- package/src/telemetry/trace-collection-policy.ts +0 -30
- package/src/telemetry/turn-events-store.ts +0 -216
- package/src/telemetry/turn-trace-store.test.ts +0 -884
- package/src/telemetry/turn-trace-store.ts +0 -399
- package/src/telemetry/types.test.ts +0 -38
- package/src/telemetry/types.ts +0 -780
- package/src/telemetry/usage-telemetry-reporter.test.ts +0 -3445
- package/src/telemetry/usage-telemetry-reporter.ts +0 -566
- package/src/telemetry/watchdog-direct-emit.test.ts +0 -112
- package/src/telemetry/watchdog-direct-emit.ts +0 -104
- package/src/telemetry/watchdog-events-store.ts +0 -31
- package/src/tools/ui-surface/channel-variants.ts +0 -52
- package/src/watcher/__tests__/telemetry.test.ts +0 -178
- package/src/watcher/telemetry.ts +0 -93
- package/src/workspace/migrations/097-enable-adaptive-thinking-managed-profiles.ts +0 -165
- package/src/workspace/migrations/104-recheck-adaptive-thinking-model-implied-anthropic.ts +0 -151
- /package/src/{telemetry → persistence}/tool-usage-store.ts +0 -0
- /package/src/{telemetry → persistence}/turn-outcome.ts +0 -0
|
@@ -8,33 +8,9 @@
|
|
|
8
8
|
* a wrapped connection hits corruption. The direct emit itself (opt-out gate,
|
|
9
9
|
* POST payload) is covered in `../telemetry/watchdog-direct-emit.test.ts`.
|
|
10
10
|
*/
|
|
11
|
-
import {
|
|
12
|
-
import { tmpdir } from "node:os";
|
|
13
|
-
import { join } from "node:path";
|
|
14
|
-
import { Database } from "bun:sqlite";
|
|
15
|
-
import { beforeEach, describe, expect, mock, test } from "bun:test";
|
|
11
|
+
import { describe, expect, test } from "bun:test";
|
|
16
12
|
|
|
17
|
-
|
|
18
|
-
const emitCalls: Array<{ checkName: string; detail: Record<string, unknown> }> =
|
|
19
|
-
[];
|
|
20
|
-
mock.module("../telemetry/watchdog-direct-emit.js", () => ({
|
|
21
|
-
emitWatchdogEventDirect: (
|
|
22
|
-
checkName: string,
|
|
23
|
-
detail: Record<string, unknown>,
|
|
24
|
-
) => {
|
|
25
|
-
emitCalls.push({ checkName, detail });
|
|
26
|
-
return Promise.resolve();
|
|
27
|
-
},
|
|
28
|
-
}));
|
|
29
|
-
|
|
30
|
-
import { wrapSqliteForSlowQueryLogging } from "../persistence/slow-query-log.js";
|
|
31
|
-
import {
|
|
32
|
-
flushCorruptionEmitsForTesting,
|
|
33
|
-
isSqliteCorruptionError,
|
|
34
|
-
observeSqliteStatementError,
|
|
35
|
-
resetSqliteCorruptionWatchdogForTesting,
|
|
36
|
-
SQLITE_CORRUPTED_CHECK_NAME,
|
|
37
|
-
} from "./sqlite-corruption-watchdog.js";
|
|
13
|
+
import { isSqliteCorruptionError } from "./sqlite-corruption-watchdog.js";
|
|
38
14
|
|
|
39
15
|
/** A synthetic `bun:sqlite`-style error carrying a `code`. */
|
|
40
16
|
function sqliteError(code: string, message: string): Error {
|
|
@@ -86,119 +62,3 @@ describe("isSqliteCorruptionError", () => {
|
|
|
86
62
|
);
|
|
87
63
|
});
|
|
88
64
|
});
|
|
89
|
-
|
|
90
|
-
describe("observeSqliteStatementError", () => {
|
|
91
|
-
beforeEach(() => {
|
|
92
|
-
emitCalls.length = 0;
|
|
93
|
-
resetSqliteCorruptionWatchdogForTesting();
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
test("a corruption error emits sqlite_corrupted with detail", async () => {
|
|
97
|
-
observeSqliteStatementError(
|
|
98
|
-
sqliteError("SQLITE_CORRUPT", "database disk image is malformed"),
|
|
99
|
-
{
|
|
100
|
-
sql: "SELECT * FROM messages WHERE id = ?",
|
|
101
|
-
database: "main",
|
|
102
|
-
label: "load-history",
|
|
103
|
-
},
|
|
104
|
-
);
|
|
105
|
-
await flushCorruptionEmitsForTesting();
|
|
106
|
-
|
|
107
|
-
expect(emitCalls).toHaveLength(1);
|
|
108
|
-
expect(emitCalls[0].checkName).toBe(SQLITE_CORRUPTED_CHECK_NAME);
|
|
109
|
-
expect(emitCalls[0].checkName).toBe("sqlite_corrupted");
|
|
110
|
-
expect(emitCalls[0].detail).toMatchObject({
|
|
111
|
-
database: "main",
|
|
112
|
-
error: "database disk image is malformed",
|
|
113
|
-
sql: "SELECT * FROM messages WHERE id = ?",
|
|
114
|
-
label: "load-history",
|
|
115
|
-
});
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
test('falls back to "unknown" when the connection carried no database tag', async () => {
|
|
119
|
-
observeSqliteStatementError(new Error("file is not a database"), {
|
|
120
|
-
sql: "SELECT 1",
|
|
121
|
-
});
|
|
122
|
-
await flushCorruptionEmitsForTesting();
|
|
123
|
-
|
|
124
|
-
expect(emitCalls).toHaveLength(1);
|
|
125
|
-
expect(emitCalls[0].detail.database).toBe("unknown");
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
test("a transient / unrelated error emits nothing", async () => {
|
|
129
|
-
observeSqliteStatementError(sqliteError("SQLITE_BUSY", "locked"), {
|
|
130
|
-
sql: "INSERT ...",
|
|
131
|
-
database: "main",
|
|
132
|
-
});
|
|
133
|
-
observeSqliteStatementError(
|
|
134
|
-
sqliteError("SQLITE_CONSTRAINT", "UNIQUE constraint failed"),
|
|
135
|
-
{ sql: "INSERT ...", database: "main" },
|
|
136
|
-
);
|
|
137
|
-
observeSqliteStatementError(new Error("no such table: foo"), {
|
|
138
|
-
sql: "SELECT ...",
|
|
139
|
-
database: "main",
|
|
140
|
-
});
|
|
141
|
-
await flushCorruptionEmitsForTesting();
|
|
142
|
-
|
|
143
|
-
expect(emitCalls).toHaveLength(0);
|
|
144
|
-
});
|
|
145
|
-
|
|
146
|
-
test("debounces repeated corruption on the same database", async () => {
|
|
147
|
-
const err = sqliteError(
|
|
148
|
-
"SQLITE_CORRUPT",
|
|
149
|
-
"database disk image is malformed",
|
|
150
|
-
);
|
|
151
|
-
observeSqliteStatementError(err, { sql: "SELECT 1", database: "main" });
|
|
152
|
-
observeSqliteStatementError(err, { sql: "SELECT 2", database: "main" });
|
|
153
|
-
observeSqliteStatementError(err, { sql: "SELECT 3", database: "main" });
|
|
154
|
-
await flushCorruptionEmitsForTesting();
|
|
155
|
-
// One report for `main` within the cooldown window...
|
|
156
|
-
expect(emitCalls).toHaveLength(1);
|
|
157
|
-
|
|
158
|
-
// ...but a distinct database is still free to report.
|
|
159
|
-
observeSqliteStatementError(err, { sql: "SELECT 1", database: "memory" });
|
|
160
|
-
await flushCorruptionEmitsForTesting();
|
|
161
|
-
expect(emitCalls).toHaveLength(2);
|
|
162
|
-
});
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
describe("wired into the slow-query wrapper", () => {
|
|
166
|
-
beforeEach(() => {
|
|
167
|
-
emitCalls.length = 0;
|
|
168
|
-
resetSqliteCorruptionWatchdogForTesting();
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
test("a wrapped connection hitting a corrupt-header file emits, and the error still propagates", async () => {
|
|
172
|
-
// A garbage file throws SQLITE_NOTADB while `.query()` compiles the SQL —
|
|
173
|
-
// the wrapper's create-time seam surfaces it straight to the watchdog, and
|
|
174
|
-
// names the file from the connection's own `filename` (no key plumbing).
|
|
175
|
-
const dir = mkdtempSync(join(tmpdir(), "sqlite-corruption-wd-"));
|
|
176
|
-
const garbagePath = join(dir, "not-a.db");
|
|
177
|
-
writeFileSync(
|
|
178
|
-
garbagePath,
|
|
179
|
-
Buffer.from("this is definitely not a sqlite db"),
|
|
180
|
-
);
|
|
181
|
-
|
|
182
|
-
const db = new Database(garbagePath);
|
|
183
|
-
wrapSqliteForSlowQueryLogging(db);
|
|
184
|
-
|
|
185
|
-
// The original SQLite error must still propagate unchanged.
|
|
186
|
-
expect(() => db.query("SELECT name FROM sqlite_master").all()).toThrow();
|
|
187
|
-
await flushCorruptionEmitsForTesting();
|
|
188
|
-
|
|
189
|
-
expect(emitCalls).toHaveLength(1);
|
|
190
|
-
expect(emitCalls[0].checkName).toBe("sqlite_corrupted");
|
|
191
|
-
expect(emitCalls[0].detail.database).toBe("not-a.db");
|
|
192
|
-
});
|
|
193
|
-
|
|
194
|
-
test("a wrapped connection running healthy queries emits nothing", async () => {
|
|
195
|
-
const db = new Database(":memory:");
|
|
196
|
-
wrapSqliteForSlowQueryLogging(db);
|
|
197
|
-
db.exec("CREATE TABLE t (id INTEGER PRIMARY KEY)");
|
|
198
|
-
db.query("INSERT INTO t (id) VALUES (1)").run();
|
|
199
|
-
db.query("SELECT * FROM t").all();
|
|
200
|
-
await flushCorruptionEmitsForTesting();
|
|
201
|
-
|
|
202
|
-
expect(emitCalls).toHaveLength(0);
|
|
203
|
-
});
|
|
204
|
-
});
|
|
@@ -1,62 +1,29 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* SQLite corruption watchdog.
|
|
3
3
|
*
|
|
4
|
-
* The daemon keeps all of its state — conversations, schedules, memory
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* `
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* feature; the cloud has no fleet-wide view of how often it happens.
|
|
4
|
+
* The daemon keeps all of its state — conversations, schedules, memory — in
|
|
5
|
+
* `bun:sqlite` files. When one of those files is damaged (a torn write, a
|
|
6
|
+
* truncated file, bad disk media) SQLite surfaces it as a `SQLITE_CORRUPT` /
|
|
7
|
+
* `SQLITE_NOTADB` error ("database disk image is malformed" / "file is not a
|
|
8
|
+
* database") on the next statement that touches the damaged page. Left
|
|
9
|
+
* unobserved, that damage is only noticed when a user hits a broken feature.
|
|
11
10
|
*
|
|
12
|
-
* This watchdog makes corruption observable
|
|
13
|
-
*
|
|
14
|
-
* watchdog uses — but POSTs it *directly* to the cloud ingest rather than
|
|
15
|
-
* through the SQLite-backed watchdog buffer: a check that fires because SQLite
|
|
16
|
-
* is unusable must not depend on writing to SQLite, and going direct keeps this
|
|
17
|
-
* module out of the `db-connection` import graph. The direct path still honors
|
|
18
|
-
* the `share_analytics` opt-out (see {@link emitWatchdogEventDirect}). The
|
|
19
|
-
* platform's already-merged `watchdog__sqlite_corruption_daily` admin query
|
|
20
|
-
* filters `check_name` to this exact string, so it is the cross-repo contract
|
|
21
|
-
* and must stay stable.
|
|
11
|
+
* This watchdog makes corruption observable locally: it logs an operator-facing
|
|
12
|
+
* error the moment any statement hits a damaged page.
|
|
22
13
|
*
|
|
23
14
|
* Detection is per-statement: the shared slow-query wrapper — which already
|
|
24
|
-
* wraps every `bun:sqlite` connection (main, logs, memory
|
|
25
|
-
*
|
|
26
|
-
*
|
|
15
|
+
* wraps every `bun:sqlite` connection (main, logs, memory — Drizzle and raw) —
|
|
16
|
+
* hands every failed statement to {@link observeSqliteStatementError}. So
|
|
17
|
+
* corruption is caught on *any* failing query or write, read or write, the
|
|
27
18
|
* moment the workload actually hits the damaged page — no dedicated scan
|
|
28
19
|
* needed. Non-corruption errors (constraint violations, syntax errors,
|
|
29
20
|
* transient `SQLITE_BUSY`) are ignored.
|
|
30
|
-
*
|
|
31
|
-
* Reports are debounced per-database (a corrupt file throws on every
|
|
32
|
-
* subsequent statement) — see {@link REPORT_COOLDOWN_MS}.
|
|
33
21
|
*/
|
|
34
22
|
|
|
35
23
|
import { getLogger } from "../util/logger.js";
|
|
36
24
|
|
|
37
25
|
const log = getLogger("sqlite-corruption-watchdog");
|
|
38
26
|
|
|
39
|
-
/**
|
|
40
|
-
* Check name emitted for SQLite corruption events. The cloud's
|
|
41
|
-
* `watchdog__sqlite_corruption_daily` admin query filters `check_name` to
|
|
42
|
-
* this exact string — it is the cross-repo contract, keep it stable.
|
|
43
|
-
*/
|
|
44
|
-
export const SQLITE_CORRUPTED_CHECK_NAME = "sqlite_corrupted";
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Minimum spacing between reports for a single database. Corruption is sticky:
|
|
48
|
-
* once a file is malformed every subsequent statement against it throws the
|
|
49
|
-
* same way, so without a cooldown a single damaged DB hit in a tight loop
|
|
50
|
-
* would emit a flood of identical events. Keyed per database so damage to one
|
|
51
|
-
* file never suppresses the first report for another.
|
|
52
|
-
*/
|
|
53
|
-
const REPORT_COOLDOWN_MS = 60_000;
|
|
54
|
-
|
|
55
|
-
const lastReportAtByDatabase = new Map<string, number>();
|
|
56
|
-
|
|
57
|
-
/** The most recent in-flight direct emit, so tests can await it. */
|
|
58
|
-
let pendingEmit: Promise<unknown> = Promise.resolve();
|
|
59
|
-
|
|
60
27
|
/**
|
|
61
28
|
* Whether an error is SQLite reporting structural corruption — the
|
|
62
29
|
* `SQLITE_CORRUPT` / `SQLITE_NOTADB` families, by extended result code or by
|
|
@@ -81,34 +48,13 @@ export function isSqliteCorruptionError(err: unknown): boolean {
|
|
|
81
48
|
}
|
|
82
49
|
|
|
83
50
|
/**
|
|
84
|
-
* Report a corruption detection
|
|
85
|
-
*
|
|
86
|
-
* {@link emitWatchdogEventDirect}). The direct emit is lazy-imported so the
|
|
87
|
-
* platform/telemetry stack only loads on the rare corruption path — and so this
|
|
88
|
-
* module never pulls `db-connection` into its static import graph. Fire-and-
|
|
89
|
-
* forget: the observer runs on a query hot path, so nothing here throws or
|
|
90
|
-
* blocks on the POST.
|
|
51
|
+
* Report a corruption detection as an operator-facing error log. Fire-and-
|
|
52
|
+
* forget by construction (logging never throws).
|
|
91
53
|
*/
|
|
92
54
|
function reportCorruption(
|
|
93
55
|
detail: Record<string, unknown> & { database: string },
|
|
94
56
|
): void {
|
|
95
|
-
const now = Date.now();
|
|
96
|
-
const last =
|
|
97
|
-
lastReportAtByDatabase.get(detail.database) ?? Number.NEGATIVE_INFINITY;
|
|
98
|
-
if (now - last < REPORT_COOLDOWN_MS) {
|
|
99
|
-
return;
|
|
100
|
-
}
|
|
101
|
-
lastReportAtByDatabase.set(detail.database, now);
|
|
102
|
-
|
|
103
57
|
log.error(detail, "SQLite corruption detected");
|
|
104
|
-
|
|
105
|
-
pendingEmit = import("../telemetry/watchdog-direct-emit.js")
|
|
106
|
-
.then(({ emitWatchdogEventDirect }) =>
|
|
107
|
-
emitWatchdogEventDirect(SQLITE_CORRUPTED_CHECK_NAME, detail),
|
|
108
|
-
)
|
|
109
|
-
.catch(() => {
|
|
110
|
-
// Best-effort; never let a telemetry failure escape the query path.
|
|
111
|
-
});
|
|
112
58
|
}
|
|
113
59
|
|
|
114
60
|
/** Context handed to {@link observeSqliteStatementError} for a failed execution. */
|
|
@@ -126,10 +72,10 @@ export interface StatementErrorContext {
|
|
|
126
72
|
}
|
|
127
73
|
|
|
128
74
|
/**
|
|
129
|
-
* Called by the slow-query wrapper for every failed statement:
|
|
130
|
-
*
|
|
131
|
-
*
|
|
132
|
-
*
|
|
75
|
+
* Called by the slow-query wrapper for every failed statement: logs corruption
|
|
76
|
+
* for `SQLITE_CORRUPT` / `SQLITE_NOTADB` errors and ignores everything else
|
|
77
|
+
* (constraint/syntax errors, transient `SQLITE_BUSY` / `SQLITE_IOERR`
|
|
78
|
+
* contention). The wrapper calls this directly, so there is no
|
|
133
79
|
* observer registration or start/stop lifecycle — a corrupt file reports the
|
|
134
80
|
* moment a statement hits it.
|
|
135
81
|
*/
|
|
@@ -147,13 +93,3 @@ export function observeSqliteStatementError(
|
|
|
147
93
|
...(context.label ? { label: context.label } : {}),
|
|
148
94
|
});
|
|
149
95
|
}
|
|
150
|
-
|
|
151
|
-
/** Test-only: clear the per-database debounce state between cases. */
|
|
152
|
-
export function resetSqliteCorruptionWatchdogForTesting(): void {
|
|
153
|
-
lastReportAtByDatabase.clear();
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
/** Test-only: await the most recent fire-and-forget direct emit. */
|
|
157
|
-
export function flushCorruptionEmitsForTesting(): Promise<unknown> {
|
|
158
|
-
return pendingEmit;
|
|
159
|
-
}
|
|
@@ -20,8 +20,8 @@ import { getConceptsDir } from "../plugins/defaults/memory/substrate/page-store.
|
|
|
20
20
|
import { broadcastMessage } from "../runtime/assistant-event-hub.js";
|
|
21
21
|
import { publishDocumentsChanged } from "../runtime/sync/resource-sync-events.js";
|
|
22
22
|
import type { ToolExecutionResult } from "../tools/types.js";
|
|
23
|
+
import { getWorkspaceDir } from "../util/layout.js";
|
|
23
24
|
import { getLogger } from "../util/logger.js";
|
|
24
|
-
import { getWorkspaceDir } from "../util/platform.js";
|
|
25
25
|
import {
|
|
26
26
|
broadcastAppFilesChanged,
|
|
27
27
|
notifyAppSurfacesChanged,
|
|
@@ -14,9 +14,9 @@ import { join } from "node:path";
|
|
|
14
14
|
import { getIsContainerized } from "../config/env-registry.js";
|
|
15
15
|
import { connectCdpWsTransport } from "../tools/browser/cdp-client/cdp-inspect/ws-transport.js";
|
|
16
16
|
import { terminateProcessTree } from "../util/host-process.js";
|
|
17
|
+
import { getDataDir, getWorkspaceDir } from "../util/layout.js";
|
|
17
18
|
import { getLogger } from "../util/logger.js";
|
|
18
19
|
import { CHILD_OOM_SCORE_ADJ, withOomScoreAdj } from "../util/oom-priority.js";
|
|
19
|
-
import { getDataDir, getWorkspaceDir } from "../util/platform.js";
|
|
20
20
|
import { sleep } from "../util/retry.js";
|
|
21
21
|
import { DesktopBrowserClient } from "./desktop-browser-client.js";
|
|
22
22
|
import {
|
|
@@ -8,8 +8,8 @@ import { renderCharacterPng } from "../avatar/png-renderer.js";
|
|
|
8
8
|
import { getResvg, isResvgAvailable } from "../avatar/resvg-lazy.js";
|
|
9
9
|
import { isTemplatePlaceholder } from "../daemon/handlers/identity.js";
|
|
10
10
|
import { getAssistantName } from "../daemon/identity-helpers.js";
|
|
11
|
+
import { getAvatarImagePath } from "../util/layout.js";
|
|
11
12
|
import { getLogger } from "../util/logger.js";
|
|
12
|
-
import { getAvatarImagePath } from "../util/platform.js";
|
|
13
13
|
import { escapeXmlContent } from "../util/xml.js";
|
|
14
14
|
|
|
15
15
|
function wallpaperWordmark(
|
|
@@ -27,8 +27,8 @@ import {
|
|
|
27
27
|
resolveScheduleTimezone,
|
|
28
28
|
} from "../schedule/schedule-timezone.js";
|
|
29
29
|
import { readTextFileSync } from "../util/fs.js";
|
|
30
|
+
import { getWorkspaceDir, getWorkspacePromptPath } from "../util/layout.js";
|
|
30
31
|
import { getLogger } from "../util/logger.js";
|
|
31
|
-
import { getWorkspaceDir, getWorkspacePromptPath } from "../util/platform.js";
|
|
32
32
|
import { stripCommentLines } from "../util/strip-comment-lines.js";
|
|
33
33
|
import {
|
|
34
34
|
completeHeartbeatRun,
|
package/src/home/feed-writer.ts
CHANGED
|
@@ -42,8 +42,8 @@ import {
|
|
|
42
42
|
isPendingGuardianFeedItem,
|
|
43
43
|
} from "../api/responses/home.js";
|
|
44
44
|
import { broadcastMessage } from "../runtime/assistant-event-hub.js";
|
|
45
|
+
import { getDataDir } from "../util/layout.js";
|
|
45
46
|
import { getLogger } from "../util/logger.js";
|
|
46
|
-
import { getDataDir } from "../util/platform.js";
|
|
47
47
|
import {
|
|
48
48
|
type FeedItem,
|
|
49
49
|
type FeedItemStatus,
|
|
@@ -18,7 +18,7 @@ import {
|
|
|
18
18
|
setMemoryCheckpoint,
|
|
19
19
|
} from "../persistence/checkpoints.js";
|
|
20
20
|
import { resolveGuardianPersona } from "../prompts/persona-resolver.js";
|
|
21
|
-
import { getWorkspacePromptPath } from "../util/
|
|
21
|
+
import { getWorkspacePromptPath } from "../util/layout.js";
|
|
22
22
|
|
|
23
23
|
// ---------------------------------------------------------------------------
|
|
24
24
|
// Constants
|
|
@@ -26,12 +26,12 @@ import { countConversations as countConversationsDb } from "../persistence/conve
|
|
|
26
26
|
import { resolveGuardianPersonaPath } from "../prompts/persona-resolver.js";
|
|
27
27
|
import { broadcastMessage } from "../runtime/assistant-event-hub.js";
|
|
28
28
|
import type { OnboardingContext } from "../types/onboarding-context.js";
|
|
29
|
-
import { getLogger } from "../util/logger.js";
|
|
30
29
|
import {
|
|
31
30
|
getDataDir,
|
|
32
31
|
getWorkspaceDir,
|
|
33
32
|
getWorkspacePromptPath,
|
|
34
|
-
} from "../util/
|
|
33
|
+
} from "../util/layout.js";
|
|
34
|
+
import { getLogger } from "../util/logger.js";
|
|
35
35
|
import { resolveAndPersistHatchedAt } from "../workspace/hatched-date.js";
|
|
36
36
|
import { computeProgressPercent, computeTier } from "./progress-formula.js";
|
|
37
37
|
import {
|
|
@@ -30,7 +30,7 @@ import { afterAll, beforeEach, describe, expect, test } from "bun:test";
|
|
|
30
30
|
|
|
31
31
|
import { evictModule } from "../../plugins/surface-import.js";
|
|
32
32
|
import type { HookEntry } from "../../plugins/types.js";
|
|
33
|
-
import { getWorkspacePluginsDir } from "../../util/
|
|
33
|
+
import { getWorkspacePluginsDir } from "../../util/layout.js";
|
|
34
34
|
import {
|
|
35
35
|
collectUserHookEntries,
|
|
36
36
|
evictHooksForOwner,
|
package/src/hooks/hook-loader.ts
CHANGED
|
@@ -69,12 +69,12 @@ import {
|
|
|
69
69
|
withTimeout,
|
|
70
70
|
} from "../plugins/surface-import.js";
|
|
71
71
|
import type { HookEntry } from "../plugins/types.js";
|
|
72
|
-
import { getLogger } from "../util/logger.js";
|
|
73
72
|
import {
|
|
74
73
|
getWorkspaceDir,
|
|
75
74
|
getWorkspaceHooksDir,
|
|
76
75
|
getWorkspacePluginsDir,
|
|
77
|
-
} from "../util/
|
|
76
|
+
} from "../util/layout.js";
|
|
77
|
+
import { getLogger } from "../util/logger.js";
|
|
78
78
|
import { APP_VERSION } from "../version.js";
|
|
79
79
|
|
|
80
80
|
const log = getLogger("hook-loader");
|
|
@@ -26,7 +26,7 @@ mock.module("../public-ingress-urls.js", () => ({
|
|
|
26
26
|
}));
|
|
27
27
|
|
|
28
28
|
mock.module("../../config/loader.js", () => ({
|
|
29
|
-
|
|
29
|
+
getConfig: () => ({}),
|
|
30
30
|
}));
|
|
31
31
|
|
|
32
32
|
const {
|
|
@@ -51,7 +51,7 @@ describe("resolveMcpOAuthClientMetadataUrl", () => {
|
|
|
51
51
|
test("returns undefined for a callback served somewhere else", () => {
|
|
52
52
|
expect(
|
|
53
53
|
resolveMcpOAuthClientMetadataUrl(
|
|
54
|
-
"https://
|
|
54
|
+
"https://test-cloud.mycadet.ai/v1/gateway/callbacks/assistant-123/webhooks/oauth/callback",
|
|
55
55
|
),
|
|
56
56
|
).toBeUndefined();
|
|
57
57
|
});
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
* for plugin ingress.
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
|
-
import {
|
|
19
|
+
import { getConfig } from "../config/loader.js";
|
|
20
20
|
import { resolveCallbackUrl } from "./cloud-callback-registration.js";
|
|
21
21
|
import {
|
|
22
22
|
getMcpOAuthClientMetadataUrl,
|
|
@@ -57,7 +57,7 @@ const OAUTH_REGISTRATION_TYPE = "oauth";
|
|
|
57
57
|
*/
|
|
58
58
|
export async function resolveOauthCallbackUrl(): Promise<string> {
|
|
59
59
|
return resolveCallbackUrl(
|
|
60
|
-
() => getOAuthCallbackUrl(
|
|
60
|
+
() => getOAuthCallbackUrl(getConfig()),
|
|
61
61
|
OAUTH_CALLBACK_PATH,
|
|
62
62
|
OAUTH_REGISTRATION_TYPE,
|
|
63
63
|
);
|
|
@@ -77,7 +77,7 @@ export function resolveMcpOAuthClientMetadataUrl(
|
|
|
77
77
|
redirectUrl: string,
|
|
78
78
|
): string | undefined {
|
|
79
79
|
try {
|
|
80
|
-
const config =
|
|
80
|
+
const config = getConfig();
|
|
81
81
|
if (getOAuthCallbackUrl(config) !== redirectUrl) {
|
|
82
82
|
return undefined;
|
|
83
83
|
}
|
|
@@ -12,7 +12,7 @@ import { join } from "node:path";
|
|
|
12
12
|
import { afterEach, beforeEach, describe, expect, test } from "bun:test";
|
|
13
13
|
|
|
14
14
|
import { initializeDb } from "../../persistence/db-init.js";
|
|
15
|
-
import { getWorkspaceDir } from "../../util/
|
|
15
|
+
import { getWorkspaceDir } from "../../util/layout.js";
|
|
16
16
|
import { AssistantIpcServer } from "../assistant-server.js";
|
|
17
17
|
import { cliIpcCall } from "../cli-client.js";
|
|
18
18
|
|
package/src/ipc/socket-path.ts
CHANGED
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
import { getDb } from "../../persistence/db-connection.js";
|
|
14
14
|
import { initializeDb } from "../../persistence/db-init.js";
|
|
15
15
|
import { rawAll, rawGet, rawRun } from "../../persistence/raw-query.js";
|
|
16
|
-
import { getWorkspaceDir } from "../../util/
|
|
16
|
+
import { getWorkspaceDir } from "../../util/layout.js";
|
|
17
17
|
import type { LiveVoiceAudioArtifactMetadata } from "../live-voice-archive.js";
|
|
18
18
|
import {
|
|
19
19
|
archiveLiveVoiceAssistantResponseAudio,
|
|
@@ -30,7 +30,7 @@ import {
|
|
|
30
30
|
unregisterSkillTools,
|
|
31
31
|
} from "../../tools/registry.js";
|
|
32
32
|
import { finalizeTool } from "../../tools/tool-defaults.js";
|
|
33
|
-
import { getWorkspaceSkillsDir } from "../../util/
|
|
33
|
+
import { getWorkspaceSkillsDir } from "../../util/layout.js";
|
|
34
34
|
import type { LiveVoiceContinuationJudge } from "../continuation-judge.js";
|
|
35
35
|
import type { LiveVoiceContinuationLabeler } from "../continuation-label.js";
|
|
36
36
|
import type { LiveVoiceAudioArchiveResult } from "../live-voice-archive.js";
|
|
@@ -75,10 +75,6 @@ import type {
|
|
|
75
75
|
} from "../daemon/conversation-mode-session.js";
|
|
76
76
|
import { isRefusedInReadOnlyPass } from "../daemon/conversation-tool-setup.js";
|
|
77
77
|
import type { TrustContext } from "../daemon/trust-context-types.js";
|
|
78
|
-
import {
|
|
79
|
-
recordLiveVoiceSessionEnded,
|
|
80
|
-
recordLiveVoiceSessionStarted,
|
|
81
|
-
} from "../onboarding/onboarding-events-store.js";
|
|
82
78
|
import { isInstalledStaticSkillLoad } from "../permissions/checker.js";
|
|
83
79
|
import {
|
|
84
80
|
attachmentExists,
|
|
@@ -113,11 +109,6 @@ import type {
|
|
|
113
109
|
} from "../stt/types.js";
|
|
114
110
|
import { getSubagentManager } from "../subagent/index.js";
|
|
115
111
|
import type { SubagentParentNotification } from "../subagent/parent-notification.js";
|
|
116
|
-
import {
|
|
117
|
-
liveVoiceEndScreen,
|
|
118
|
-
liveVoiceSilenceReason,
|
|
119
|
-
liveVoiceStartScreen,
|
|
120
|
-
} from "../telemetry/live-voice-funnel.js";
|
|
121
112
|
import { getTool, getToolOwner } from "../tools/registry.js";
|
|
122
113
|
import { resolveSkillExecuteInvocation } from "../tools/skills/resolve-execute-invocation.js";
|
|
123
114
|
import {
|
|
@@ -1250,13 +1241,8 @@ export class LiveVoiceSession implements LiveVoiceSessionContract {
|
|
|
1250
1241
|
* teardown has already destroyed by then: `state` has moved on, the current
|
|
1251
1242
|
* utterance is gone, and the turn detector is disposed.
|
|
1252
1243
|
*
|
|
1253
|
-
* A quarter of sessions end with no turn at all
|
|
1254
|
-
* what separate a microphone that never opened from one that was muted from a
|
|
1255
|
-
* user who simply left. See `telemetry/live-voice-funnel.ts`.
|
|
1244
|
+
* A quarter of sessions end with no turn at all.
|
|
1256
1245
|
*/
|
|
1257
|
-
private reachedActive = false;
|
|
1258
|
-
private receivedAudio = false;
|
|
1259
|
-
private detectedSpeech = false;
|
|
1260
1246
|
private dispatchedTurn = false;
|
|
1261
1247
|
// Loudest server-VAD chunk not attributed to assistant playback, on the
|
|
1262
1248
|
// gate's own scale. Logged with a silent session's end so `no_speech` can
|
|
@@ -1591,18 +1577,6 @@ export class LiveVoiceSession implements LiveVoiceSessionContract {
|
|
|
1591
1577
|
return;
|
|
1592
1578
|
}
|
|
1593
1579
|
|
|
1594
|
-
// Before the preflight, not after: a session rejected for missing
|
|
1595
|
-
// credentials is precisely the one the failure rate needs to count, and
|
|
1596
|
-
// recording the start only once `ready` goes out would hide every such
|
|
1597
|
-
// session from both the numerator and the denominator.
|
|
1598
|
-
recordLiveVoiceSessionStarted({
|
|
1599
|
-
sessionId: this.context.sessionId,
|
|
1600
|
-
screen: liveVoiceStartScreen(
|
|
1601
|
-
this.context.startFrame.client,
|
|
1602
|
-
this.context.startFrame.entry,
|
|
1603
|
-
),
|
|
1604
|
-
});
|
|
1605
|
-
|
|
1606
1580
|
if (this.resolveCredentialReadiness) {
|
|
1607
1581
|
const readiness = await this.resolveCredentialReadiness();
|
|
1608
1582
|
if (readiness.status === "not-ready") {
|
|
@@ -1644,7 +1618,6 @@ export class LiveVoiceSession implements LiveVoiceSessionContract {
|
|
|
1644
1618
|
// through the pending/pre-roll paths and flushes on arm. An arm failure
|
|
1645
1619
|
// surfaces as a non-recoverable error frame instead of a start rejection.
|
|
1646
1620
|
this.state = "active";
|
|
1647
|
-
this.reachedActive = true;
|
|
1648
1621
|
if (this.turnDetector) {
|
|
1649
1622
|
this.logInputDiagnostic("voice_input_started");
|
|
1650
1623
|
}
|
|
@@ -2140,33 +2113,7 @@ export class LiveVoiceSession implements LiveVoiceSessionContract {
|
|
|
2140
2113
|
});
|
|
2141
2114
|
}
|
|
2142
2115
|
|
|
2143
|
-
|
|
2144
|
-
// below: that flag governs the client-facing `metrics` frame, and a
|
|
2145
|
-
// failed session (which suppresses the frame) is the one whose end
|
|
2146
|
-
// telemetry matters most. Session duration downstream is this row's
|
|
2147
|
-
// `recorded_at` minus the started row's, so it must be written before the
|
|
2148
|
-
// teardown below, which waits for the active turn and can run long.
|
|
2149
|
-
const failed = this.state === "failed";
|
|
2150
|
-
// Only a session that never dispatched a turn gets a silence reason; for
|
|
2151
|
-
// every other session the question is meaningless.
|
|
2152
|
-
const silenceReason = this.dispatchedTurn
|
|
2153
|
-
? null
|
|
2154
|
-
: liveVoiceSilenceReason({
|
|
2155
|
-
reachedActive: this.reachedActive,
|
|
2156
|
-
audioInput: this.audioInput,
|
|
2157
|
-
receivedAudio: this.receivedAudio,
|
|
2158
|
-
detectedSpeech: this.detectedSpeech,
|
|
2159
|
-
});
|
|
2160
|
-
recordLiveVoiceSessionEnded({
|
|
2161
|
-
sessionId: this.context.sessionId,
|
|
2162
|
-
screen: liveVoiceEndScreen(
|
|
2163
|
-
reason,
|
|
2164
|
-
failed ? this.failureCode : null,
|
|
2165
|
-
silenceReason,
|
|
2166
|
-
),
|
|
2167
|
-
outcome: failed ? "failed" : "completed",
|
|
2168
|
-
});
|
|
2169
|
-
if (silenceReason !== null) {
|
|
2116
|
+
if (!this.dispatchedTurn) {
|
|
2170
2117
|
// The levels behind a silent session, on the gate's scale, since the
|
|
2171
2118
|
// end event carries only the classification. A peak below `speechGate`
|
|
2172
2119
|
// on a `no_speech` session is a microphone the gate could not hear.
|
|
@@ -2174,7 +2121,6 @@ export class LiveVoiceSession implements LiveVoiceSessionContract {
|
|
|
2174
2121
|
{
|
|
2175
2122
|
sessionId: this.context.sessionId,
|
|
2176
2123
|
reason,
|
|
2177
|
-
silenceReason,
|
|
2178
2124
|
peakChunkAmplitude: Math.round(this.peakChunkAmplitude),
|
|
2179
2125
|
noiseFloor:
|
|
2180
2126
|
this.roomNoiseFloor.floor === null
|
|
@@ -2527,12 +2473,10 @@ export class LiveVoiceSession implements LiveVoiceSessionContract {
|
|
|
2527
2473
|
// early returns below. The question it answers is "did the microphone ever
|
|
2528
2474
|
// open", which a chunk arriving at all settles regardless of what the
|
|
2529
2475
|
// session then does with it.
|
|
2530
|
-
this.receivedAudio = true;
|
|
2531
2476
|
// A text-only session armed no transcriber, so there is nothing downstream
|
|
2532
2477
|
// to route this into. Dropped rather than errored: the client was told on
|
|
2533
2478
|
// `ready` that the microphone leg is dead, and a client still streaming is
|
|
2534
|
-
// one that has not caught up, not one to end the session over.
|
|
2535
|
-
// above is still set, so telemetry keeps seeing that the mic did open.
|
|
2479
|
+
// one that has not caught up, not one to end the session over.
|
|
2536
2480
|
if (!this.audioInput) {
|
|
2537
2481
|
return;
|
|
2538
2482
|
}
|
|
@@ -2554,10 +2498,6 @@ export class LiveVoiceSession implements LiveVoiceSessionContract {
|
|
|
2554
2498
|
// The chunk belongs to an utterance the user is still holding the button
|
|
2555
2499
|
// for, whether or not the transcriber has produced any text for it yet.
|
|
2556
2500
|
utterance.manualAudioCaptured = true;
|
|
2557
|
-
// Manual sessions have no VAD, so the user holding the talk button is
|
|
2558
|
-
// the only speech signal available. Without this every abandoned manual
|
|
2559
|
-
// session would be misfiled as `no_turn` instead of `no_speech`.
|
|
2560
|
-
this.detectedSpeech = true;
|
|
2561
2501
|
this.collectUserAudio(utterance, chunk);
|
|
2562
2502
|
if (utterance.phase === "pending") {
|
|
2563
2503
|
// The transcriber is still arming (session start overlaps the STT
|
|
@@ -2798,7 +2738,6 @@ export class LiveVoiceSession implements LiveVoiceSessionContract {
|
|
|
2798
2738
|
// resets it.
|
|
2799
2739
|
if (hasSpeech || this.vadPreRollHasSpeech) {
|
|
2800
2740
|
utterance.speechRouted = true;
|
|
2801
|
-
this.detectedSpeech = true;
|
|
2802
2741
|
}
|
|
2803
2742
|
for (const preRollChunk of this.takeVadPreRoll()) {
|
|
2804
2743
|
await this.routeVadAudio(utterance, preRollChunk);
|
|
@@ -3110,7 +3049,6 @@ export class LiveVoiceSession implements LiveVoiceSessionContract {
|
|
|
3110
3049
|
if (preRollHadSpeech) {
|
|
3111
3050
|
utterance.preDialBargeInGuard = preRollBargeInGuard;
|
|
3112
3051
|
utterance.speechRouted = true;
|
|
3113
|
-
this.detectedSpeech = true;
|
|
3114
3052
|
}
|
|
3115
3053
|
}
|
|
3116
3054
|
|
|
@@ -4917,7 +4855,6 @@ export class LiveVoiceSession implements LiveVoiceSessionContract {
|
|
|
4917
4855
|
}
|
|
4918
4856
|
if (this.providerTurnStartActive) {
|
|
4919
4857
|
utterance.speechRouted = true;
|
|
4920
|
-
this.detectedSpeech = true;
|
|
4921
4858
|
this.markSpeechStart(utterance);
|
|
4922
4859
|
this.handleSpeechStart("provider");
|
|
4923
4860
|
}
|
|
@@ -20,7 +20,7 @@ import { join } from "node:path";
|
|
|
20
20
|
import { beforeEach, describe, expect, test } from "bun:test";
|
|
21
21
|
|
|
22
22
|
import type { McpConfig } from "../../config/schemas/mcp.js";
|
|
23
|
-
import { getWorkspacePluginsDir } from "../../util/
|
|
23
|
+
import { getWorkspacePluginsDir } from "../../util/layout.js";
|
|
24
24
|
import {
|
|
25
25
|
buildEffectiveMcpConfig,
|
|
26
26
|
pluginMcpServersChangedSinceLastBuild,
|