@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,391 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Live-voice session telemetry: the started/ended funnel rows a session
|
|
3
|
-
* records, and the attribution carried on its turns.
|
|
4
|
-
*
|
|
5
|
-
* The recorder is mocked: the outbox and its consent gate are covered by
|
|
6
|
-
* `telemetry-events-outbox.test.ts`. What these tests pin is the wiring that
|
|
7
|
-
* decides whether a row exists at all and what it says, which is where the
|
|
8
|
-
* measurement can silently go wrong: a session that fails before `ready` still
|
|
9
|
-
* has to count, a failed session still has to record an end, and a session's
|
|
10
|
-
* turns have to carry its id or the turn count has nothing to group on.
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import { beforeEach, describe, expect, mock, test } from "bun:test";
|
|
14
|
-
|
|
15
|
-
import type { VoiceTurnOptions } from "../../calls/voice-session-bridge.js";
|
|
16
|
-
import type {
|
|
17
|
-
StreamingTranscriber,
|
|
18
|
-
SttStreamServerEvent,
|
|
19
|
-
} from "../../stt/types.js";
|
|
20
|
-
|
|
21
|
-
const recordLiveVoiceSessionStarted = mock(() => null);
|
|
22
|
-
const recordLiveVoiceSessionEnded = mock(() => null);
|
|
23
|
-
|
|
24
|
-
// Spread the real module rather than replacing it: other importers pull
|
|
25
|
-
// `recordActivationEvent` and friends out of it, and a bare replacement makes
|
|
26
|
-
// those imports fail to resolve.
|
|
27
|
-
const onboardingEventsStore =
|
|
28
|
-
await import("../../onboarding/onboarding-events-store.js");
|
|
29
|
-
mock.module("../../onboarding/onboarding-events-store.js", () => ({
|
|
30
|
-
...onboardingEventsStore,
|
|
31
|
-
recordLiveVoiceSessionStarted,
|
|
32
|
-
recordLiveVoiceSessionEnded,
|
|
33
|
-
}));
|
|
34
|
-
|
|
35
|
-
// Types are erased, so they import statically regardless of the mock ordering
|
|
36
|
-
// the values below depend on.
|
|
37
|
-
import type { LiveVoiceCredentialReadiness } from "../live-voice-credential-preflight.js";
|
|
38
|
-
import type { LiveVoiceSessionFactoryContext } from "../live-voice-session-manager.js";
|
|
39
|
-
import type {
|
|
40
|
-
LiveVoiceClientStartFrame,
|
|
41
|
-
LiveVoiceServerFrame,
|
|
42
|
-
} from "../protocol.js";
|
|
43
|
-
|
|
44
|
-
// Values load after `mock.module` so the session picks up the mocked recorder.
|
|
45
|
-
const { LiveVoiceSession } = await import("../live-voice-session.js");
|
|
46
|
-
const { LiveVoiceSessionStartupError } =
|
|
47
|
-
await import("../live-voice-session-manager.js");
|
|
48
|
-
const { createLiveVoiceServerFrameSequencer } = await import("../protocol.js");
|
|
49
|
-
|
|
50
|
-
const START_FRAME = {
|
|
51
|
-
type: "start",
|
|
52
|
-
conversationId: "conversation-123",
|
|
53
|
-
audio: { mimeType: "audio/pcm", sampleRate: 24_000, channels: 1 },
|
|
54
|
-
} as const satisfies LiveVoiceClientStartFrame;
|
|
55
|
-
|
|
56
|
-
const NOT_READY: LiveVoiceCredentialReadiness = {
|
|
57
|
-
status: "not-ready",
|
|
58
|
-
missing: [
|
|
59
|
-
{
|
|
60
|
-
kind: "tts",
|
|
61
|
-
providerId: "fish-audio",
|
|
62
|
-
reason: 'TTS provider "fish-audio" is missing credentials',
|
|
63
|
-
},
|
|
64
|
-
],
|
|
65
|
-
userMessage: "Live voice is unavailable because it requires an API key.",
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
class MockStreamingTranscriber implements StreamingTranscriber {
|
|
69
|
-
readonly providerId = "deepgram" as const;
|
|
70
|
-
readonly boundaryId = "daemon-streaming" as const;
|
|
71
|
-
private onEvent: ((event: SttStreamServerEvent) => void) | null = null;
|
|
72
|
-
|
|
73
|
-
constructor(private readonly stopEvents: SttStreamServerEvent[] = []) {}
|
|
74
|
-
|
|
75
|
-
async start(onEvent: (event: SttStreamServerEvent) => void): Promise<void> {
|
|
76
|
-
this.onEvent = onEvent;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
sendAudio(): void {}
|
|
80
|
-
|
|
81
|
-
stop(): void {
|
|
82
|
-
for (const event of this.stopEvents) {
|
|
83
|
-
this.onEvent?.(event);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
function createContext(
|
|
89
|
-
startFrame: LiveVoiceClientStartFrame = START_FRAME,
|
|
90
|
-
): LiveVoiceSessionFactoryContext {
|
|
91
|
-
const sequencer = createLiveVoiceServerFrameSequencer();
|
|
92
|
-
const frames: LiveVoiceServerFrame[] = [];
|
|
93
|
-
return {
|
|
94
|
-
sessionId: "session-123",
|
|
95
|
-
startFrame,
|
|
96
|
-
sendFrame: mock(async (payload) => {
|
|
97
|
-
const frame = sequencer.next(payload);
|
|
98
|
-
frames.push(frame);
|
|
99
|
-
return frame;
|
|
100
|
-
}),
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
function readySession(startFrame?: LiveVoiceClientStartFrame) {
|
|
105
|
-
return new LiveVoiceSession(createContext(startFrame), {
|
|
106
|
-
resolveTranscriber: mock(async () => new MockStreamingTranscriber()),
|
|
107
|
-
resolveCredentialReadiness: mock(
|
|
108
|
-
async (): Promise<LiveVoiceCredentialReadiness> => ({ status: "ready" }),
|
|
109
|
-
),
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
describe("live-voice session telemetry", () => {
|
|
114
|
-
beforeEach(() => {
|
|
115
|
-
recordLiveVoiceSessionStarted.mockClear();
|
|
116
|
-
recordLiveVoiceSessionEnded.mockClear();
|
|
117
|
-
});
|
|
118
|
-
|
|
119
|
-
test("records a started row for a session that reaches ready", async () => {
|
|
120
|
-
const session = readySession();
|
|
121
|
-
|
|
122
|
-
await session.start();
|
|
123
|
-
|
|
124
|
-
expect(recordLiveVoiceSessionStarted).toHaveBeenCalledWith({
|
|
125
|
-
sessionId: "session-123",
|
|
126
|
-
screen: "started_unknown:unknown",
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
await session.close("client_end");
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
test("stamps the started row with the client and entry the start frame declared", async () => {
|
|
133
|
-
// The dimension this row exists to carry: the same `macos` client covers
|
|
134
|
-
// the chat's voice button, the companion's Talk and the voice key, and
|
|
135
|
-
// only the entry says which one the user reached for.
|
|
136
|
-
const session = readySession({
|
|
137
|
-
...START_FRAME,
|
|
138
|
-
client: "macos",
|
|
139
|
-
entry: "companion",
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
await session.start();
|
|
143
|
-
|
|
144
|
-
expect(recordLiveVoiceSessionStarted).toHaveBeenCalledWith({
|
|
145
|
-
sessionId: "session-123",
|
|
146
|
-
screen: "started_macos:companion",
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
await session.close("client_end");
|
|
150
|
-
});
|
|
151
|
-
|
|
152
|
-
test("records a started row even when the preflight rejects the session", async () => {
|
|
153
|
-
const session = new LiveVoiceSession(createContext(), {
|
|
154
|
-
resolveTranscriber: mock(async () => new MockStreamingTranscriber()),
|
|
155
|
-
resolveCredentialReadiness: mock(async () => NOT_READY),
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
await expect(session.start()).rejects.toBeInstanceOf(
|
|
159
|
-
LiveVoiceSessionStartupError,
|
|
160
|
-
);
|
|
161
|
-
|
|
162
|
-
// The denominator of the failure rate: a session rejected before `ready`
|
|
163
|
-
// is exactly the one that must not go missing from the started count.
|
|
164
|
-
expect(recordLiveVoiceSessionStarted).toHaveBeenCalledWith({
|
|
165
|
-
sessionId: "session-123",
|
|
166
|
-
screen: "started_unknown:unknown",
|
|
167
|
-
});
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
test("records the close reason and a completed outcome on a clean end", async () => {
|
|
171
|
-
const session = readySession();
|
|
172
|
-
await session.start();
|
|
173
|
-
|
|
174
|
-
await session.close("client_end");
|
|
175
|
-
|
|
176
|
-
// These sessions reach `ready` and are closed without ever sending audio,
|
|
177
|
-
// so they are silent by construction and the reason says which layer
|
|
178
|
-
// stopped short. See `telemetry/live-voice-funnel.ts`.
|
|
179
|
-
expect(recordLiveVoiceSessionEnded).toHaveBeenCalledWith({
|
|
180
|
-
sessionId: "session-123",
|
|
181
|
-
screen: "ended_client_end:silent_no_audio",
|
|
182
|
-
outcome: "completed",
|
|
183
|
-
});
|
|
184
|
-
});
|
|
185
|
-
|
|
186
|
-
/**
|
|
187
|
-
* Run one typed turn against a session with a real turn starter, then close.
|
|
188
|
-
*
|
|
189
|
-
* `readySession` wires none, so `handleTextTurn` returns before dispatching
|
|
190
|
-
* and every silence assertion against it passes for the wrong reason.
|
|
191
|
-
*/
|
|
192
|
-
async function endAfterTypedTurn(frame: {
|
|
193
|
-
text: string;
|
|
194
|
-
hidden?: boolean;
|
|
195
|
-
}): Promise<void> {
|
|
196
|
-
let started = false;
|
|
197
|
-
const session = new LiveVoiceSession(createContext(), {
|
|
198
|
-
resolveTranscriber: mock(async () => new MockStreamingTranscriber()),
|
|
199
|
-
resolveCredentialReadiness: mock(
|
|
200
|
-
async (): Promise<LiveVoiceCredentialReadiness> => ({
|
|
201
|
-
status: "ready",
|
|
202
|
-
}),
|
|
203
|
-
),
|
|
204
|
-
startVoiceTurn: mock(async () => {
|
|
205
|
-
started = true;
|
|
206
|
-
return { turnId: "bridge-turn-1", abort: mock() };
|
|
207
|
-
}),
|
|
208
|
-
emitMetrics: false,
|
|
209
|
-
});
|
|
210
|
-
await session.start();
|
|
211
|
-
await session.handleClientFrame({ type: "text", ...frame });
|
|
212
|
-
for (let attempt = 0; attempt < 40 && !started; attempt += 1) {
|
|
213
|
-
await new Promise((resolve) => setTimeout(resolve, 5));
|
|
214
|
-
}
|
|
215
|
-
if (!started) {
|
|
216
|
-
throw new Error("the typed turn never reached the bridge");
|
|
217
|
-
}
|
|
218
|
-
await session.close("client_end");
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
test("the greeting that opens a session does not spend its silence reason", async () => {
|
|
222
|
-
// The classification answers "did anything come from the person?". A
|
|
223
|
-
// session that greets and hears nothing back is silent, and counting the
|
|
224
|
-
// greeting would retire the taxonomy for every greeted session.
|
|
225
|
-
await endAfterTypedTurn({
|
|
226
|
-
text: "this message is sent automatically",
|
|
227
|
-
hidden: true,
|
|
228
|
-
});
|
|
229
|
-
|
|
230
|
-
expect(recordLiveVoiceSessionEnded).toHaveBeenCalledWith({
|
|
231
|
-
sessionId: "session-123",
|
|
232
|
-
screen: "ended_client_end:silent_no_audio",
|
|
233
|
-
outcome: "completed",
|
|
234
|
-
});
|
|
235
|
-
});
|
|
236
|
-
|
|
237
|
-
test("a turn the user really took clears the silence reason", async () => {
|
|
238
|
-
// The other half, and what keeps the test above honest: the same path with
|
|
239
|
-
// an ordinary typed turn is the person taking a turn, so the session is
|
|
240
|
-
// not silent and carries no classification at all.
|
|
241
|
-
await endAfterTypedTurn({ text: "typed by hand" });
|
|
242
|
-
|
|
243
|
-
expect(recordLiveVoiceSessionEnded).toHaveBeenCalledWith({
|
|
244
|
-
sessionId: "session-123",
|
|
245
|
-
screen: "ended_client_end",
|
|
246
|
-
outcome: "completed",
|
|
247
|
-
});
|
|
248
|
-
});
|
|
249
|
-
|
|
250
|
-
test("a dropped socket ends as completed, not failed", async () => {
|
|
251
|
-
const session = readySession();
|
|
252
|
-
await session.start();
|
|
253
|
-
|
|
254
|
-
await session.close("websocket_close");
|
|
255
|
-
|
|
256
|
-
// The session ran and then stopped; only an error makes it `failed`, and
|
|
257
|
-
// the reason on `screen` is what distinguishes a drop from a hangup.
|
|
258
|
-
expect(recordLiveVoiceSessionEnded).toHaveBeenCalledWith({
|
|
259
|
-
sessionId: "session-123",
|
|
260
|
-
screen: "ended_websocket_close:silent_no_audio",
|
|
261
|
-
outcome: "completed",
|
|
262
|
-
});
|
|
263
|
-
});
|
|
264
|
-
|
|
265
|
-
test("a failed session records an ended row carrying the failure code", async () => {
|
|
266
|
-
const session = new LiveVoiceSession(createContext(), {
|
|
267
|
-
resolveTranscriber: mock(async () => new MockStreamingTranscriber()),
|
|
268
|
-
resolveCredentialReadiness: mock(async () => NOT_READY),
|
|
269
|
-
});
|
|
270
|
-
await expect(session.start()).rejects.toBeInstanceOf(
|
|
271
|
-
LiveVoiceSessionStartupError,
|
|
272
|
-
);
|
|
273
|
-
|
|
274
|
-
// What the manager does after a startup failure.
|
|
275
|
-
await session.close("error");
|
|
276
|
-
|
|
277
|
-
// A failed session suppresses the client-facing `metrics` frame; the end
|
|
278
|
-
// row must not be suppressed with it.
|
|
279
|
-
expect(recordLiveVoiceSessionEnded).toHaveBeenCalledWith({
|
|
280
|
-
sessionId: "session-123",
|
|
281
|
-
screen: "ended_error:credentials_unavailable",
|
|
282
|
-
outcome: "failed",
|
|
283
|
-
});
|
|
284
|
-
});
|
|
285
|
-
|
|
286
|
-
test("records exactly one ended row when close is called twice", async () => {
|
|
287
|
-
const session = readySession();
|
|
288
|
-
await session.start();
|
|
289
|
-
|
|
290
|
-
await session.close("client_end");
|
|
291
|
-
await session.close("websocket_close");
|
|
292
|
-
|
|
293
|
-
expect(recordLiveVoiceSessionEnded).toHaveBeenCalledTimes(1);
|
|
294
|
-
});
|
|
295
|
-
});
|
|
296
|
-
|
|
297
|
-
describe("live-voice turn attribution", () => {
|
|
298
|
-
/** Drives one push-to-talk turn and returns the options the bridge saw. */
|
|
299
|
-
async function captureTurnOptions(
|
|
300
|
-
startFrame: LiveVoiceClientStartFrame,
|
|
301
|
-
): Promise<VoiceTurnOptions> {
|
|
302
|
-
let captured: VoiceTurnOptions | undefined;
|
|
303
|
-
const startVoiceTurn = mock(async (options: VoiceTurnOptions) => {
|
|
304
|
-
captured = options;
|
|
305
|
-
return { turnId: "bridge-turn-1", abort: mock() };
|
|
306
|
-
});
|
|
307
|
-
const session = new LiveVoiceSession(createContext(startFrame), {
|
|
308
|
-
resolveTranscriber: mock(
|
|
309
|
-
async () =>
|
|
310
|
-
new MockStreamingTranscriber([
|
|
311
|
-
{ type: "final", text: "hello" },
|
|
312
|
-
{ type: "closed" },
|
|
313
|
-
]),
|
|
314
|
-
),
|
|
315
|
-
startVoiceTurn,
|
|
316
|
-
emitMetrics: false,
|
|
317
|
-
});
|
|
318
|
-
|
|
319
|
-
await session.start();
|
|
320
|
-
await session.handleClientFrame({ type: "ptt_release" });
|
|
321
|
-
for (let attempt = 0; attempt < 40 && !captured; attempt += 1) {
|
|
322
|
-
await new Promise((resolve) => setTimeout(resolve, 5));
|
|
323
|
-
}
|
|
324
|
-
await session.close("client_end");
|
|
325
|
-
|
|
326
|
-
if (!captured) {
|
|
327
|
-
throw new Error("the live-voice session never started a bridge turn");
|
|
328
|
-
}
|
|
329
|
-
return captured;
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
test("carries the session id and originating client onto the turn", async () => {
|
|
333
|
-
const options = await captureTurnOptions({ ...START_FRAME, client: "ios" });
|
|
334
|
-
|
|
335
|
-
expect(options.voiceTelemetry).toEqual({
|
|
336
|
-
sessionId: "session-123",
|
|
337
|
-
client: "ios",
|
|
338
|
-
});
|
|
339
|
-
});
|
|
340
|
-
|
|
341
|
-
test("leaves the turn's interface id alone while attributing the client", async () => {
|
|
342
|
-
const options = await captureTurnOptions({ ...START_FRAME, client: "ios" });
|
|
343
|
-
|
|
344
|
-
// The load-bearing half of the attribution fix. `userMessageInterface`
|
|
345
|
-
// resolves the turn's channel capabilities, where `macos` is what grants a
|
|
346
|
-
// live-voice turn its dynamic surfaces; reporting the true client here
|
|
347
|
-
// would strip them from every iOS session. Attribution rides
|
|
348
|
-
// `voiceTelemetry` precisely so this can stay put.
|
|
349
|
-
expect(options.userMessageInterface).toBe("macos");
|
|
350
|
-
expect(options.assistantMessageInterface).toBe("macos");
|
|
351
|
-
});
|
|
352
|
-
|
|
353
|
-
test("a session opened from the macOS desktop client asks for the desktop skills", async () => {
|
|
354
|
-
const options = await captureTurnOptions({
|
|
355
|
-
...START_FRAME,
|
|
356
|
-
client: "macos",
|
|
357
|
-
});
|
|
358
|
-
|
|
359
|
-
expect(options.macosDesktopSession).toBe(true);
|
|
360
|
-
});
|
|
361
|
-
|
|
362
|
-
test("a session from any other client does not ask for the desktop skills", async () => {
|
|
363
|
-
for (const startFrame of [{ ...START_FRAME, client: "ios" }, START_FRAME]) {
|
|
364
|
-
const options = await captureTurnOptions(
|
|
365
|
-
startFrame as LiveVoiceClientStartFrame,
|
|
366
|
-
);
|
|
367
|
-
|
|
368
|
-
expect(options.macosDesktopSession).toBeUndefined();
|
|
369
|
-
}
|
|
370
|
-
});
|
|
371
|
-
|
|
372
|
-
test("omits the client when the start frame declares none", async () => {
|
|
373
|
-
const options = await captureTurnOptions(START_FRAME);
|
|
374
|
-
|
|
375
|
-
expect(options.voiceTelemetry).toEqual({ sessionId: "session-123" });
|
|
376
|
-
});
|
|
377
|
-
|
|
378
|
-
test("carries the entry point onto the turn beside the client", async () => {
|
|
379
|
-
const options = await captureTurnOptions({
|
|
380
|
-
...START_FRAME,
|
|
381
|
-
client: "macos",
|
|
382
|
-
entry: "voice_key",
|
|
383
|
-
});
|
|
384
|
-
|
|
385
|
-
expect(options.voiceTelemetry).toEqual({
|
|
386
|
-
sessionId: "session-123",
|
|
387
|
-
client: "macos",
|
|
388
|
-
entry: "voice_key",
|
|
389
|
-
});
|
|
390
|
-
});
|
|
391
|
-
});
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for the quick_check probe. The corruption seed writes junk over a
|
|
3
|
-
* b-tree page of a rollback-journal database (WAL would keep the data in the
|
|
4
|
-
* -wal file, leaving the main file a bare header the check would pass).
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { closeSync, mkdtempSync, openSync, rmSync, writeSync } from "node:fs";
|
|
8
|
-
import { tmpdir } from "node:os";
|
|
9
|
-
import { join } from "node:path";
|
|
10
|
-
import { fileURLToPath } from "node:url";
|
|
11
|
-
import { Database } from "bun:sqlite";
|
|
12
|
-
import {
|
|
13
|
-
afterEach,
|
|
14
|
-
beforeEach,
|
|
15
|
-
expect,
|
|
16
|
-
setDefaultTimeout,
|
|
17
|
-
test,
|
|
18
|
-
} from "bun:test";
|
|
19
|
-
|
|
20
|
-
import { assertNotLiveDb } from "../../__tests__/assert-not-live-db.js";
|
|
21
|
-
import {
|
|
22
|
-
boundErrors,
|
|
23
|
-
type IntegritySampleResult,
|
|
24
|
-
runIntegrityCheck,
|
|
25
|
-
} from "../db-integrity-check.js";
|
|
26
|
-
|
|
27
|
-
// quick_check and the cold `bun run` subprocess are disk-bound; loaded CI
|
|
28
|
-
// runners blow past the 5s default.
|
|
29
|
-
setDefaultTimeout(30_000);
|
|
30
|
-
|
|
31
|
-
let dir: string;
|
|
32
|
-
let dbPath: string;
|
|
33
|
-
|
|
34
|
-
beforeEach(() => {
|
|
35
|
-
dir = mkdtempSync(join(tmpdir(), "integrity-sample-"));
|
|
36
|
-
dbPath = join(dir, "test.db");
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
afterEach(() => {
|
|
40
|
-
assertNotLiveDb(dir);
|
|
41
|
-
rmSync(dir, { recursive: true, force: true });
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
function seedDb(walMode: boolean): void {
|
|
45
|
-
const db = new Database(dbPath);
|
|
46
|
-
try {
|
|
47
|
-
db.exec(`PRAGMA journal_mode=${walMode ? "WAL" : "DELETE"}`);
|
|
48
|
-
db.exec("CREATE TABLE t (id TEXT PRIMARY KEY, v TEXT)");
|
|
49
|
-
const ins = db.prepare("INSERT INTO t (id, v) VALUES (?, ?)");
|
|
50
|
-
// One transaction: 200 per-insert commits are fsync-bound and take
|
|
51
|
-
// seconds on loaded CI runners.
|
|
52
|
-
db.transaction(() => {
|
|
53
|
-
for (let i = 0; i < 200; i++) {
|
|
54
|
-
ins.run(`k-${i}`, `v-${i}`);
|
|
55
|
-
}
|
|
56
|
-
})();
|
|
57
|
-
} finally {
|
|
58
|
-
db.close();
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
function corruptDb(): void {
|
|
63
|
-
const fd = openSync(dbPath, "r+");
|
|
64
|
-
try {
|
|
65
|
-
writeSync(fd, Buffer.alloc(32 * 1024, 0xff), 0, 32 * 1024, 4096);
|
|
66
|
-
} finally {
|
|
67
|
-
closeSync(fd);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
test("returns null when the database does not exist", () => {
|
|
72
|
-
expect(runIntegrityCheck(dbPath)).toBeNull();
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
test("reports ok on a healthy database", () => {
|
|
76
|
-
seedDb(true);
|
|
77
|
-
const result = runIntegrityCheck(dbPath);
|
|
78
|
-
expect(result?.ok).toBe(true);
|
|
79
|
-
expect(result?.errors).toEqual([]);
|
|
80
|
-
expect(result?.pageCount).toBeGreaterThan(0);
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
test("reports corruption instead of throwing", () => {
|
|
84
|
-
seedDb(false);
|
|
85
|
-
corruptDb();
|
|
86
|
-
const result = runIntegrityCheck(dbPath);
|
|
87
|
-
expect(result?.ok).toBe(false);
|
|
88
|
-
expect(result?.errors.length).toBeGreaterThan(0);
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
test("boundErrors caps by UTF-8 bytes without splitting code points", () => {
|
|
92
|
-
const bounded = boundErrors(Array(20).fill("é".repeat(200)));
|
|
93
|
-
expect(bounded.length).toBe(10);
|
|
94
|
-
for (const msg of bounded) {
|
|
95
|
-
expect(Buffer.byteLength(msg, "utf8")).toBeLessThanOrEqual(160);
|
|
96
|
-
expect(msg.includes("�")).toBe(false);
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
test("subprocess entry prints the JSON verdict", () => {
|
|
101
|
-
seedDb(false);
|
|
102
|
-
corruptDb();
|
|
103
|
-
const entry = fileURLToPath(
|
|
104
|
-
new URL("../db-integrity-check.ts", import.meta.url),
|
|
105
|
-
);
|
|
106
|
-
const proc = Bun.spawnSync({ cmd: ["bun", "run", entry, dbPath] });
|
|
107
|
-
expect(proc.exitCode).toBe(0);
|
|
108
|
-
const result = JSON.parse(
|
|
109
|
-
proc.stdout.toString(),
|
|
110
|
-
) as IntegritySampleResult | null;
|
|
111
|
-
expect(result?.ok).toBe(false);
|
|
112
|
-
expect(result?.errors.length).toBeGreaterThan(0);
|
|
113
|
-
});
|