@mycadet/assistant 0.12.9 → 0.12.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Dockerfile +0 -8
- package/eslint-rules/__tests__/cli-no-daemon-internals.test.ts +1 -1
- package/node_modules/@mycadet/ces-client/node_modules/@mycadet/service-contracts/src/__tests__/ingress.test.ts +8 -8
- package/node_modules/@mycadet/ces-client/node_modules/@mycadet/service-contracts/src/ingress.ts +1 -1
- package/node_modules/@mycadet/ces-client/src/http-credentials.ts +18 -1
- package/node_modules/@mycadet/gateway-client/node_modules/@mycadet/service-contracts/src/__tests__/ingress.test.ts +8 -8
- package/node_modules/@mycadet/gateway-client/node_modules/@mycadet/service-contracts/src/ingress.ts +1 -1
- package/node_modules/@mycadet/service-contracts/src/__tests__/ingress.test.ts +8 -8
- package/node_modules/@mycadet/service-contracts/src/ingress.ts +1 -1
- package/openapi.yaml +62 -910
- package/package.json +3 -7
- package/scripts/build-test-fixtures.ts +1 -1
- package/scripts/generate-openapi.ts +22 -6
- package/scripts/postinstall.ts +4 -10
- package/scripts/run-tests.ts +0 -21
- package/src/__tests__/adaptive-thinking-repair.test.ts +19 -57
- package/src/__tests__/agent-loop.test.ts +0 -76
- package/src/__tests__/anthropic-provider.test.ts +6 -6
- package/src/__tests__/assert-not-live-db.ts +1 -1
- package/src/__tests__/assistant-id-boundary-guard.test.ts +3 -3
- package/src/__tests__/attachments-store-heic-normalize.test.ts +1 -1
- package/src/__tests__/attachments-store.test.ts +1 -1
- package/src/__tests__/audit-log-rotation.test.ts +1 -1
- package/src/__tests__/btw-routes.test.ts +1 -1
- package/src/__tests__/byok-default-profile-ensure.test.ts +21 -27
- package/src/__tests__/call-conversation-messages.test.ts +0 -5
- package/src/__tests__/call-recovery.test.ts +2 -7
- package/src/__tests__/call-routes-http.test.ts +0 -12
- package/src/__tests__/call-store.test.ts +2 -7
- package/src/__tests__/catalog-files.test.ts +7 -5
- package/src/__tests__/checker.test.ts +1 -1
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +4 -4
- package/src/__tests__/cloud-client-verify-credential.test.ts +0 -4
- package/src/__tests__/cloud-credential-catalog-cli.test.ts +14 -14
- package/src/__tests__/cloud-profile-guard.test.ts +87 -404
- package/src/__tests__/compaction-events.test.ts +2 -2
- package/src/__tests__/config-loader-backfill.test.ts +74 -163
- package/src/__tests__/config-loader-cloud-defaults.test.ts +11 -11
- package/src/__tests__/config-loader-corrupt.test.ts +10 -10
- package/src/__tests__/config-loader-quarantine-notice.test.ts +7 -7
- package/src/__tests__/config-loader-validation-reset-notice.test.ts +11 -11
- package/src/__tests__/config-schema.test.ts +26 -27
- package/src/__tests__/config-set-route.test.ts +2 -6
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +28 -300
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +39 -246
- package/src/__tests__/conversation-agent-loop.test.ts +2 -58
- package/src/__tests__/conversation-clear-safety.test.ts +0 -30
- package/src/__tests__/conversation-inference-profile-route.test.ts +1 -1
- package/src/__tests__/conversation-queue.test.ts +1 -1
- package/src/__tests__/conversation-runtime-assembly.test.ts +1 -1
- package/src/__tests__/conversation-skill-tools.test.ts +4 -444
- package/src/__tests__/conversation-slash-commands.test.ts +1 -1
- package/src/__tests__/conversation-store.test.ts +1 -84
- package/src/__tests__/conversation-surface-state.test.ts +0 -16
- package/src/__tests__/credential-health-service.test.ts +14 -1
- package/src/__tests__/credential-record-retire.test.ts +1 -1
- package/src/__tests__/credential-record-write-through.test.ts +1 -1
- package/src/__tests__/credential-security-invariants.test.ts +0 -145
- package/src/__tests__/custom-profile-ensure.test.ts +1 -1
- package/src/__tests__/default-profile-catalog-fallback.test.ts +5 -15
- package/src/__tests__/deterministic-verification-control-plane.test.ts +0 -2
- package/src/__tests__/dictation-profile-store.test.ts +6 -6
- package/src/__tests__/disk-usage.test.ts +28 -164
- package/src/__tests__/docker-signing-key-bootstrap.test.ts +1 -1
- package/src/__tests__/embedding-cloud-proxy-selection.test.ts +1 -1
- package/src/__tests__/emit-event-signal.test.ts +1 -1
- package/src/__tests__/gateway-client-cloud-outbound.test.ts +3 -3
- package/src/__tests__/gateway-only-enforcement.test.ts +1 -1
- package/src/__tests__/guardian-dispatch.test.ts +0 -13
- package/src/__tests__/helpers/seed-app.ts +1 -1
- package/src/__tests__/host-cu-routes-targeted.test.ts +1 -1
- package/src/__tests__/host-shell-tool.test.ts +1 -1
- package/src/__tests__/identity-routes.test.ts +1 -1
- package/src/__tests__/inference-profile-session-handler.test.ts +1 -1
- package/src/__tests__/inference-profile-session-ipc.test.ts +1 -1
- package/src/__tests__/injector-chain.test.ts +1 -1
- package/src/__tests__/injector-config-quarantine-notice.test.ts +1 -1
- package/src/__tests__/injector-config-validation-reset-notice.test.ts +1 -1
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +1 -1
- package/src/__tests__/{platform.test.ts → layout.test.ts} +1 -1
- package/src/__tests__/list-all-apps.test.ts +1 -1
- package/src/__tests__/live-workspace-guard.test.ts +2 -2
- package/src/__tests__/llm-resolver-override-or-default.test.ts +5 -6
- package/src/__tests__/llm-resolver.test.ts +7 -7
- package/src/__tests__/llm-schema-fallback-profile.test.ts +9 -10
- package/src/__tests__/llm-usage-store.test.ts +0 -495
- package/src/__tests__/log-export-routes.test.ts +1 -1
- package/src/__tests__/mcp-config-secret-boundary.test.ts +12 -53
- package/src/__tests__/mcp-list-plugin-servers.test.ts +1 -1
- package/src/__tests__/memory-config-file-parity.test.ts +1 -1
- package/src/__tests__/memory-v2-static-injector.test.ts +1 -1
- package/src/__tests__/messages-read-boundary-guard.test.ts +0 -2
- package/src/__tests__/notification-guardian-path.test.ts +0 -7
- package/src/__tests__/onboarding-persona-write.test.ts +1 -1
- package/src/__tests__/openai-provider.test.ts +8 -8
- package/src/__tests__/path-policy.test.ts +1 -1
- package/src/__tests__/persona-resolver.test.ts +1 -1
- package/src/__tests__/plugin-app-serve-routes.test.ts +1 -1
- package/src/__tests__/plugin-effective-enabled-set.test.ts +1 -1
- package/src/__tests__/plugin-import-boundary-guard.test.ts +4 -6
- package/src/__tests__/plugin-import-boundary-reverse-guard.test.ts +0 -3
- package/src/__tests__/provider-cloud-proxy-integration.test.ts +1 -5
- package/src/__tests__/provider-connections-backfill.test.ts +10 -10
- package/src/__tests__/prune-old-conversations-job.test.ts +6 -31
- package/src/__tests__/resolve-app.test.ts +1 -1
- package/src/__tests__/run-due-schedules.test.ts +1 -1
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +0 -53
- package/src/__tests__/schedule-routes.test.ts +1 -1
- package/src/__tests__/schedule-store.test.ts +1 -1
- package/src/__tests__/secret-routes-cloud-proxy.test.ts +1 -1
- package/src/__tests__/skill-load-plugin-scope.test.ts +1 -1
- package/src/__tests__/surface-completion-compaction-boundary.test.ts +1 -1
- package/src/__tests__/tool-approval-handler.test.ts +1 -1
- package/src/__tests__/tool-audit.test.ts +5 -235
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +54 -114
- package/src/__tests__/tools-get-route.test.ts +1 -1
- package/src/__tests__/turn-outcome-read.test.ts +1 -1
- package/src/__tests__/twilio-routes.test.ts +0 -1
- package/src/__tests__/usage-attribution.test.ts +0 -31
- package/src/__tests__/verification-control-plane-policy.test.ts +3 -10
- package/src/__tests__/visible-app-context.test.ts +1 -1
- package/src/__tests__/voice-ingress-preflight.test.ts +1 -1
- package/src/__tests__/workspace-git-service.test.ts +1 -1
- package/src/__tests__/workspace-greetings.test.ts +1 -1
- package/src/acp/__tests__/helpers/acp-config-stub.ts +1 -1
- package/src/activation/progress-store.ts +1 -1
- package/src/activation/turn-hooks.ts +1 -1
- package/src/agent/loop.ts +0 -51
- package/src/apps/app-store.ts +1 -1
- package/src/avatar/__tests__/avatar-store.test.ts +2 -172
- package/src/avatar/accent-backfill.ts +1 -1
- package/src/avatar/avatar-manifest.ts +1 -1
- package/src/avatar/avatar-store.ts +10 -69
- package/src/avatar/ensure-raster.ts +1 -1
- package/src/avatar/identity-avatar.ts +1 -1
- package/src/avatar/sync-avatar.ts +1 -1
- package/src/avatar/traits-png-sync.ts +1 -1
- package/src/bundler/compiler-tools.ts +1 -1
- package/src/bundler/package-resolver.ts +1 -1
- package/src/calls/__tests__/call-controller.test.ts +25 -27
- package/src/calls/active-call-lease.ts +1 -1
- package/src/calls/call-controller.ts +3 -3
- package/src/calls/call-domain.ts +4 -8
- package/src/calls/call-store.ts +2 -76
- package/src/calls/resolve-call-tts-provider.ts +3 -3
- package/src/calls/twilio-config.ts +3 -3
- package/src/calls/twilio-rest.ts +2 -2
- package/src/calls/voice-ingress-preflight.ts +2 -2
- package/src/cli/bundled-modules.ts +0 -2
- package/src/cli/commands/__tests__/apps.test.ts +1 -1
- package/src/cli/commands/__tests__/plugins.test.ts +9 -66
- package/src/cli/commands/__tests__/ps.test.ts +67 -0
- package/src/cli/commands/auth.help.ts +2 -2
- package/src/cli/commands/avatar.ts +1 -1
- package/src/cli/commands/changelog.ts +1 -1
- package/src/cli/commands/cloud/__tests__/subscription.test.ts +2 -2
- package/src/cli/commands/cloud/index.help.ts +1 -1
- package/src/cli/commands/cloud/index.ts +2 -2
- package/src/cli/commands/db/refresh.ts +1 -1
- package/src/cli/commands/db/repair-step-conversation-backfill.ts +1 -1
- package/src/cli/commands/db/repair.ts +1 -1
- package/src/cli/commands/db/status.ts +1 -1
- package/src/cli/commands/inference-profiles.ts +1 -12
- package/src/cli/commands/memory/__tests__/memory-v3.test.ts +1 -116
- package/src/cli/commands/memory/index.help.ts +1 -43
- package/src/cli/commands/memory/memory-v3.ts +0 -64
- package/src/cli/commands/plugins.ts +54 -205
- package/src/cli/commands/ps.ts +5 -2
- package/src/cli/commands/status.ts +1 -1
- package/src/cli/index.help.ts +0 -2
- package/src/cli/lib/__tests__/inspect-plugin.test.ts +36 -66
- package/src/cli/lib/__tests__/install-from-cloud.test.ts +1 -1
- package/src/cli/lib/__tests__/install-from-github.test.ts +41 -117
- package/src/cli/lib/__tests__/plugin-catalog-cache.test.ts +2 -185
- package/src/cli/lib/__tests__/plugin-catalog-resolve.test.ts +36 -66
- package/src/cli/lib/__tests__/plugin-catalog-visibility.test.ts +4 -6
- package/src/cli/lib/__tests__/plugin-details.test.ts +113 -96
- package/src/cli/lib/__tests__/search-plugins.test.ts +9 -16
- package/src/cli/lib/__tests__/uninstall-plugin.test.ts +1 -1
- package/src/cli/lib/__tests__/upgrade-plugin.test.ts +38 -15
- package/src/cli/lib/diff-plugin.ts +1 -1
- package/src/cli/lib/inspect-plugin.ts +13 -97
- package/src/cli/lib/install-from-cloud.ts +1 -1
- package/src/cli/lib/install-from-github.ts +75 -154
- package/src/cli/lib/install-plugin-dependencies.ts +1 -1
- package/src/cli/lib/list-installed-plugins.ts +1 -1
- package/src/cli/lib/open-browser.ts +1 -1
- package/src/cli/lib/plugin-catalog-cache.ts +8 -51
- package/src/cli/lib/plugin-catalog-resolve.ts +3 -22
- package/src/cli/lib/plugin-details.ts +5 -27
- package/src/cli/lib/plugin-marketplace.ts +18 -266
- package/src/cli/lib/search-plugins.ts +23 -43
- package/src/cli/lib/toggle-plugin.ts +1 -1
- package/src/cli/lib/uninstall-plugin.ts +1 -1
- package/src/cli/lib/upgrade-plugin.ts +3 -49
- package/src/cli/program.ts +1 -3
- package/src/cli.ts +1 -1
- package/src/cloud/client.ts +0 -6
- package/src/cloud/consent-cache.test.ts +22 -201
- package/src/cloud/consent-cache.ts +16 -111
- package/src/cloud/sync-identity.ts +1 -1
- package/src/config/__tests__/chat-settings.test.ts +1 -1
- package/src/config/__tests__/cloud-identity.test.ts +15 -2
- package/src/config/__tests__/default-plugin-skill-discovery.test.ts +1 -1
- package/src/config/__tests__/default-profile-catalog.test.ts +12 -51
- package/src/config/__tests__/deployment-context-defaults.test.ts +13 -13
- package/src/config/__tests__/loader-callsite-strip-fallback.test.ts +4 -4
- package/src/config/__tests__/loader-last-known-good.test.ts +9 -9
- package/src/config/__tests__/loader-sparse-array-cleanup.test.ts +7 -7
- package/src/config/__tests__/plugin-resident-skill-discovery.test.ts +1 -1
- package/src/config/__tests__/profile-materialization.test.ts +2 -4
- package/src/config/__tests__/sync-gated-profiles.test.ts +1 -106
- package/src/config/acp-agent-write.ts +1 -1
- package/src/config/bundled-skills/settings/tools/open-system-settings.test.ts +1 -1
- package/src/config/bundled-skills/settings/tools/open-system-settings.ts +1 -1
- package/src/config/call-site-defaults.ts +0 -6
- package/src/config/cloud-identity.ts +12 -5
- package/src/config/composer-preferences.ts +1 -1
- package/src/config/default-profile-catalog.ts +8 -75
- package/src/config/default-profile-names.ts +2 -25
- package/src/config/env-registry.ts +1 -14
- package/src/config/env.ts +8 -6
- package/src/config/llm-resolver.ts +1 -2
- package/src/config/loader.ts +13 -17
- package/src/config/profile-materialization.ts +1 -1
- package/src/config/schema.ts +1 -7
- package/src/config/schemas/call-site-catalog.ts +0 -7
- package/src/config/schemas/llm.ts +25 -32
- package/src/config/seed-inference-profiles.ts +16 -17
- package/src/config/skills.ts +2 -2
- package/src/config/sync-gated-profiles.ts +6 -24
- package/src/credential-health/credential-health-service.ts +10 -3
- package/src/daemon/approval-generators.ts +3 -3
- package/src/daemon/config-watcher.ts +2 -2
- package/src/daemon/conversation-agent-loop-handlers.ts +0 -18
- package/src/daemon/conversation-agent-loop.ts +6 -97
- package/src/daemon/conversation-process.ts +1 -1
- package/src/daemon/conversation-skill-tools.ts +4 -72
- package/src/daemon/conversation-store.ts +1 -1
- package/src/daemon/conversation-surface-state.ts +0 -33
- package/src/daemon/conversation-surfaces.ts +1 -86
- package/src/daemon/conversation-tool-setup.test.ts +1 -1
- package/src/daemon/conversation-tool-setup.ts +0 -23
- package/src/daemon/conversation.ts +3 -5
- package/src/daemon/daemon-control.ts +3 -3
- package/src/daemon/dictation-profile-store.ts +3 -3
- package/src/daemon/event-loop-watchdog.test.ts +2 -198
- package/src/daemon/event-loop-watchdog.ts +0 -185
- package/src/daemon/external-plugins-bootstrap.ts +1 -1
- package/src/daemon/first-greeting.ts +1 -1
- package/src/daemon/handlers/skills.ts +1 -1
- package/src/daemon/host-app-control-proxy.ts +1 -1
- package/src/daemon/host-cu-proxy.ts +2 -2
- package/src/daemon/identity-helpers.ts +1 -1
- package/src/daemon/lifecycle.ts +11 -15
- package/src/daemon/main.ts +1 -1
- package/src/daemon/now-scratchpad.ts +1 -1
- package/src/daemon/process-message.ts +4 -4
- package/src/daemon/profiler-run-store.ts +2 -2
- package/src/daemon/providers-setup.ts +2 -2
- package/src/daemon/shutdown-handlers.ts +0 -10
- package/src/daemon/sqlite-corruption-watchdog.test.ts +2 -142
- package/src/daemon/sqlite-corruption-watchdog.ts +17 -81
- package/src/daemon/tool-side-effects.ts +1 -1
- package/src/desktop/desktop-session-manager.ts +1 -1
- package/src/desktop/desktop-wallpaper-renderer.ts +1 -1
- package/src/heartbeat/heartbeat-service.ts +1 -1
- package/src/home/feed-writer.ts +1 -1
- package/src/home/home-greeting-cache.ts +1 -1
- package/src/home/relationship-state-writer.ts +2 -2
- package/src/hooks/__tests__/hook-live-reload.test.ts +1 -1
- package/src/hooks/hook-loader.ts +2 -2
- package/src/inbound/__tests__/oauth-callback-url.test.ts +2 -2
- package/src/inbound/oauth-callback-url.ts +3 -3
- package/src/ipc/__tests__/attachment-ipc.test.ts +1 -1
- package/src/ipc/socket-path.ts +1 -1
- package/src/live-voice/__tests__/live-voice-archive.test.ts +1 -1
- package/src/live-voice/__tests__/live-voice-vad.test.ts +1 -1
- package/src/live-voice/live-voice-session.ts +3 -66
- package/src/mcp/__tests__/effective-config.test.ts +1 -1
- package/src/mcp/__tests__/mcp-oauth-client-registration.test.ts +2 -2
- package/src/mcp/__tests__/mcp-oauth-provider.test.ts +2 -3
- package/src/mcp/__tests__/reload-signal-emission.test.ts +1 -1
- package/src/mcp/__tests__/reload-signal.test.ts +1 -1
- package/src/mcp/__tests__/workspace-mcp-config.test.ts +19 -21
- package/src/mcp/reload-signal.ts +1 -1
- package/src/mcp/workspace-mcp-config.ts +1 -23
- package/src/messaging/draft-store.ts +1 -1
- package/src/monitoring/__tests__/active-conversations.test.ts +1 -1
- package/src/monitoring/__tests__/page-cache.test.ts +1 -1
- package/src/monitoring/__tests__/stall-capture.test.ts +1 -1
- package/src/monitoring/__tests__/workspace-git-heartbeat.test.ts +1 -1
- package/src/monitoring/active-conversations.ts +1 -1
- package/src/monitoring/control.ts +1 -1
- package/src/monitoring/daemon-boot-time.ts +1 -1
- package/src/monitoring/daemon-heartbeat.ts +1 -1
- package/src/monitoring/page-cache.ts +1 -1
- package/src/monitoring/plugin-auto-update.ts +1 -7
- package/src/monitoring/plugin-source-watch.ts +1 -1
- package/src/monitoring/recovery/db.ts +1 -1
- package/src/monitoring/recovery/inflight-content.ts +1 -1
- package/src/monitoring/resource-sampler.ts +3 -14
- package/src/monitoring/stall-capture.ts +1 -1
- package/src/monitoring/worker.ts +9 -76
- package/src/monitoring/workspace-git-heartbeat.ts +1 -1
- package/src/oauth/connect-orchestrator.ts +4 -4
- package/src/permissions/checker.ts +1 -1
- package/src/permissions/workspace-policy.ts +1 -1
- package/src/persistence/__tests__/main-db-readonly-probe.ts +27 -52
- package/src/persistence/__tests__/message-content-file.test.ts +1 -1
- package/src/persistence/__tests__/slow-sync-log.test.ts +0 -2
- package/src/persistence/attachments-store.ts +1 -1
- package/src/persistence/conversation-crud.ts +1 -38
- package/src/persistence/conversation-directories.ts +1 -1
- package/src/persistence/conversation-types.ts +0 -8
- package/src/persistence/db-async-query.ts +1 -1
- package/src/persistence/db-connection.ts +11 -1
- package/src/persistence/db-init.ts +1 -1
- package/src/persistence/db-maintenance.ts +1 -1
- package/src/persistence/embeddings/__tests__/embedding-local-lifecycle.test.ts +1 -1
- package/src/persistence/embeddings/embedding-local.ts +4 -4
- package/src/persistence/embeddings/embedding-runtime-manager.ts +1 -1
- package/src/persistence/embeddings/qdrant-client.ts +1 -1
- package/src/persistence/embeddings/qdrant-manager.ts +1 -1
- package/src/persistence/job-handlers/__tests__/message-lexical-backfill.test.ts +1 -1
- package/src/persistence/job-handlers/__tests__/message-lexical-enqueue.test.ts +1 -1
- package/src/persistence/job-handlers/cleanup.ts +8 -17
- package/src/persistence/llm-usage-store.ts +2 -229
- package/src/persistence/message-content-file.ts +1 -1
- package/src/persistence/migrations/209-strip-thinking-from-consolidated.ts +1 -1
- package/src/persistence/migrations/222-strip-placeholder-sentinels-from-messages.ts +1 -1
- package/src/persistence/migrations/296-rewrite-balanced-economy-profile-pins.test.ts +1 -1
- package/src/persistence/migrations/306-rewrite-frontier-profile-pins.test.ts +1 -1
- package/src/persistence/migrations/329-move-onboarding-events-to-telemetry-db.test.ts +13 -0
- package/src/persistence/migrations/330-move-auth-fallback-events-to-telemetry-db.test.ts +13 -0
- package/src/persistence/migrations/331-move-lifecycle-events-to-telemetry-db.test.ts +13 -0
- package/src/persistence/migrations/332-move-skill-loaded-events-to-telemetry-db.test.ts +13 -0
- package/src/persistence/migrations/333-create-telemetry-events-table.test.ts +7 -4
- package/src/persistence/migrations/334-backfill-telemetry-events-outbox.test.ts +13 -0
- package/src/persistence/migrations/387-drop-telemetry-tables.ts +51 -0
- package/src/persistence/migrations/__tests__/327-create-flush-checkpoints.test.ts +9 -1
- package/src/persistence/migrations/__tests__/387-drop-telemetry-tables.test.ts +79 -0
- package/src/persistence/migrations/helpers/relocation.ts +1 -1
- package/src/persistence/migrations/run-migrations.ts +1 -1
- package/src/persistence/migrations/validate-migration-state.ts +1 -1
- package/src/persistence/raw-query.ts +1 -29
- package/src/persistence/slow-sync-log.ts +0 -23
- package/src/persistence/steps.ts +2 -0
- package/src/{telemetry → persistence}/tool-audit.ts +6 -121
- package/src/plugin-api/index.ts +1 -1
- package/src/plugin-api/plugin-name-env.ts +1 -1
- package/src/plugins/__tests__/installed-plugin-dirs.test.ts +1 -1
- package/src/plugins/collect-source-versions.ts +1 -1
- package/src/plugins/defaults/channel/package.json +1 -1
- package/src/plugins/defaults/cloud-hosted/package.json +1 -1
- package/src/plugins/defaults/compaction/package.json +1 -1
- package/src/plugins/defaults/documents/package.json +1 -1
- package/src/plugins/defaults/empty-response/package.json +1 -1
- package/src/plugins/defaults/exploration-drift/package.json +1 -1
- package/src/plugins/defaults/image-fallback/package.json +1 -1
- package/src/plugins/defaults/image-recovery/package.json +1 -1
- package/src/plugins/defaults/max-tokens-continue/package.json +1 -1
- package/src/plugins/defaults/memory/__tests__/db-async-query.test.ts +1 -1
- package/src/plugins/defaults/memory/__tests__/db-maintenance.test.ts +1 -1
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +0 -82
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-skill-card.test.ts +0 -41
- package/src/plugins/defaults/memory/__tests__/memory-tier-boundary-guard.test.ts +0 -2
- package/src/plugins/defaults/memory/memory-retrospective-job.ts +3 -52
- package/src/plugins/defaults/memory/memory-retrospective-skill-card.ts +0 -18
- package/src/plugins/defaults/memory/package.json +1 -1
- package/src/plugins/defaults/memory/paths.ts +4 -4
- package/src/plugins/defaults/memory/src/__tests__/memory-worker-routes.test.ts +1 -1
- package/src/plugins/defaults/memory/src/memory-v2-routes.ts +5 -5
- package/src/plugins/defaults/memory/src/memory-v3-routes.ts +0 -207
- package/src/plugins/defaults/memory/src/memory-worker-routes.ts +1 -1
- package/src/plugins/defaults/memory/startup.ts +1 -22
- package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +2 -253
- package/src/plugins/defaults/memory/v3/orchestrate.ts +5 -129
- package/src/plugins/defaults/memory/worker-control.ts +1 -1
- package/src/plugins/defaults/memory/worker.ts +2 -2
- package/src/plugins/defaults/session/package.json +1 -1
- package/src/plugins/defaults/surface-completion-nudge/package.json +1 -1
- package/src/plugins/defaults/task-progress/package.json +1 -1
- package/src/plugins/defaults/task-progress-nudge/package.json +1 -1
- package/src/plugins/defaults/title-generate/package.json +1 -1
- package/src/plugins/defaults/tool-error/package.json +1 -1
- package/src/plugins/defaults/tool-result-truncate/package.json +1 -1
- package/src/plugins/defaults/turn-context/package.json +1 -1
- package/src/plugins/defaults/workspace/injectors.ts +1 -1
- package/src/plugins/defaults/workspace/package.json +1 -1
- package/src/plugins/disabled-state.ts +1 -1
- package/src/plugins/ensure-plugin-api-shim.ts +1 -1
- package/src/plugins/ensure-shared-dep-links.ts +1 -1
- package/src/plugins/installed-plugin-dirs.ts +1 -1
- package/src/plugins/mcp-servers.ts +7 -9
- package/src/plugins/mtime-cache.ts +2 -2
- package/src/plugins/source-versions.ts +1 -1
- package/src/prompts/bootstrap-cleanup.ts +1 -1
- package/src/prompts/persona-resolver.ts +1 -1
- package/src/prompts/sections.ts +2 -2
- package/src/prompts/system-prompt.ts +10 -42
- package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +0 -37
- package/src/providers/__tests__/cadet-connection-routing.test.ts +2 -2
- package/src/providers/cadet/client.ts +1 -1
- package/src/providers/inference/__tests__/base-url-route-validation.test.ts +1 -1
- package/src/providers/inference/adapter-factory.ts +1 -1
- package/src/providers/inference/backfill.ts +3 -10
- package/src/providers/inference/profile-probe.ts +1 -1
- package/src/providers/retry.ts +0 -2
- package/src/providers/types.ts +0 -7
- package/src/providers/usage-tracking.ts +1 -1
- package/src/routes/__tests__/route-host.test.ts +1 -1
- package/src/routes/control.ts +1 -1
- package/src/routes/route-host-client.ts +1 -1
- package/src/routes/worker.ts +2 -2
- package/src/runtime/agent-wake.ts +1 -1
- package/src/runtime/assistant-stream-state.ts +1 -1
- package/src/runtime/auth/token-service.ts +1 -1
- package/src/runtime/background-job-runner.ts +1 -1
- package/src/runtime/middleware/twilio-validation.ts +2 -2
- package/src/runtime/routes/__tests__/app-pin-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/apps-refresh-route.test.ts +1 -1
- package/src/runtime/routes/__tests__/avatar-state-routes.test.ts +3 -33
- package/src/runtime/routes/__tests__/cloud-credits-routes.test.ts +5 -4
- package/src/runtime/routes/__tests__/cloud-invoice-routes.test.ts +4 -3
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +72 -298
- package/src/runtime/routes/__tests__/default-plugin-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/deprecated-route-context.test.ts +15 -62
- package/src/runtime/routes/__tests__/inference-profiles-routes.test.ts +105 -12
- package/src/runtime/routes/__tests__/ingress-status-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/monitoring-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +47 -211
- package/src/runtime/routes/__tests__/route-host-worker-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/schedule-routes-disarm-reason.test.ts +1 -1
- package/src/runtime/routes/__tests__/schedule-worker-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/user-route-dispatcher-host.test.ts +1 -1
- package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +1 -1
- package/src/runtime/routes/__tests__/user-routes-cli.test.ts +1 -1
- package/src/runtime/routes/__tests__/user-routes-notices.test.ts +1 -1
- package/src/runtime/routes/__tests__/user-routes-request.test.ts +1 -1
- package/src/runtime/routes/app-management-routes.ts +1 -1
- package/src/runtime/routes/attachment-routes.ts +1 -1
- package/src/runtime/routes/audit-routes.ts +1 -1
- package/src/runtime/routes/avatar-routes.ts +3 -10
- package/src/runtime/routes/cloud-routes.ts +3 -3
- package/src/runtime/routes/content-source-routes.ts +1 -1
- package/src/runtime/routes/conversation-query-routes.ts +49 -706
- package/src/runtime/routes/conversation-routes.ts +1 -38
- package/src/runtime/routes/debug-routes.ts +1 -1
- package/src/runtime/routes/deprecated-route-context.ts +5 -61
- package/src/runtime/routes/heartbeat-routes.ts +1 -1
- package/src/runtime/routes/identity-routes.ts +1 -1
- package/src/runtime/routes/index.ts +0 -6
- package/src/runtime/routes/inference-profile-session-handler.ts +3 -3
- package/src/runtime/routes/inference-profiles-routes.ts +48 -21
- package/src/runtime/routes/inference-provider-connection-routes.ts +0 -1
- package/src/runtime/routes/llm-call-sites-routes.ts +3 -3
- package/src/runtime/routes/log-export/__tests__/installed-inventory.test.ts +1 -1
- package/src/runtime/routes/log-export/__tests__/workspace-allowlist-error-contract.test.ts +1 -1
- package/src/runtime/routes/log-export/__tests__/workspace-allowlist.test.ts +1 -1
- package/src/runtime/routes/log-export/workspace-allowlist.ts +1 -1
- package/src/runtime/routes/log-export-routes.ts +17 -15
- package/src/runtime/routes/migration-rollback-routes.ts +1 -1
- package/src/runtime/routes/migration-routes.ts +2 -3
- package/src/runtime/routes/monitoring-routes.ts +2 -2
- package/src/runtime/routes/oauth-providers.ts +5 -5
- package/src/runtime/routes/plugins-routes.ts +38 -163
- package/src/runtime/routes/profiler-routes.ts +1 -1
- package/src/runtime/routes/route-host-worker-routes.ts +1 -1
- package/src/runtime/routes/sanity-routes.ts +1 -1
- package/src/runtime/routes/schedule-routes.ts +1 -1
- package/src/runtime/routes/schedule-worker-routes.ts +1 -1
- package/src/runtime/routes/settings-routes.ts +1 -1
- package/src/runtime/routes/sounds-config-routes.ts +1 -1
- package/src/runtime/routes/surface-conversation-resolver.ts +1 -7
- package/src/runtime/routes/user-route-dispatcher.ts +1 -3
- package/src/runtime/routes/user-route-import.ts +1 -1
- package/src/runtime/routes/user-route-resolution.ts +1 -1
- package/src/runtime/routes/user-routes-cli.ts +1 -1
- package/src/runtime/routes/workspace-commit-routes.ts +1 -1
- package/src/runtime/routes/workspace-greetings.ts +1 -1
- package/src/runtime/routes/workspace-routes.ts +1 -1
- package/src/runtime/routes/workspace-utils.ts +1 -1
- package/src/runtime/sync/resource-sync-events.ts +1 -1
- package/src/schedule/__tests__/plugin-schedule-declarations.test.ts +1 -1
- package/src/schedule/__tests__/plugin-schedule-reconciler.test.ts +1 -1
- package/src/schedule/plugin-schedule-availability.ts +1 -1
- package/src/schedule/plugin-schedule-declarations.ts +1 -1
- package/src/schedule/run-script.ts +1 -1
- package/src/schedule/scheduler.ts +1 -11
- package/src/schedule/worker-control.ts +1 -1
- package/src/schedule/worker.ts +3 -3
- package/src/security/oauth2.ts +2 -2
- package/src/security/secret-allowlist.ts +1 -1
- package/src/signals/cancel.ts +1 -1
- package/src/signals/conversation-undo.ts +1 -1
- package/src/signals/emit-event.ts +1 -1
- package/src/signals/event-stream.ts +1 -1
- package/src/signals/user-message.ts +1 -1
- package/src/skills/catalog-install.ts +2 -1
- package/src/skills/clawhub.ts +1 -1
- package/src/skills/cloud-store.ts +1 -1
- package/src/skills/path-classifier.ts +1 -1
- package/src/skills/skill-history.ts +1 -1
- package/src/skills/skillssh-registry.ts +1 -1
- package/src/skills/uninstall.ts +1 -1
- package/src/skills/workspace-skill-md-signature.ts +1 -1
- package/src/subagent/manager.ts +1 -1
- package/src/theme/workspace-theme.ts +1 -1
- package/src/tools/browser/auth-cache.ts +1 -1
- package/src/tools/browser/browser-manager.ts +1 -1
- package/src/tools/browser/runtime-check.ts +1 -1
- package/src/tools/executor.ts +4 -4
- package/src/tools/filesystem/write.ts +1 -1
- package/src/tools/permission-checker.ts +2 -51
- package/src/tools/run-standalone.ts +1 -1
- package/src/tools/skills/format-input-schema.ts +1 -1
- package/src/tools/skills/load.ts +1 -1
- package/src/tools/skills/scaffold-cloud.ts +0 -32
- package/src/tools/terminal/safe-env.ts +1 -2
- package/src/tools/terminal/sanitized-bash.ts +1 -1
- package/src/tools/terminal/shell.ts +1 -1
- package/src/tools/tool-approval-handler.ts +4 -1
- package/src/tools/workflows/manage-workflows.ts +2 -2
- package/src/tools/workflows/run-workflow.test.ts +1 -1
- package/src/tools/workspace-tools/loader.ts +1 -1
- package/src/tts/synthesis-stream.ts +2 -2
- package/src/usage/attribution.ts +1 -11
- package/src/util/browser.ts +1 -1
- package/src/util/bun-runtime.ts +2 -1
- package/src/util/device-id.ts +1 -1
- package/src/util/disk-usage.ts +4 -139
- package/src/util/layout.ts +3 -3
- package/src/util/logger.ts +1 -1
- package/src/util/logs-db-path.ts +1 -1
- package/src/util/memory-db-path.ts +1 -1
- package/src/util/{platform.ts → os.ts} +5 -30
- package/src/util/process-tree.ts +19 -0
- package/src/util/sqlite3-runtime.ts +1 -1
- package/src/util/telemetry-db-path.ts +1 -1
- package/src/watcher/__tests__/engine.test.ts +0 -23
- package/src/watcher/engine.ts +0 -7
- package/src/windows-compiled-cli.ts +0 -4
- package/src/windows-compiled-worker-entry.ts +0 -6
- package/src/workflows/leaf-runner.test.ts +1 -1
- package/src/workflows/leaf-runner.ts +1 -1
- package/src/workflows/library.ts +1 -1
- package/src/workspace/adaptive-thinking-repair.ts +5 -24
- package/src/workspace/byok-default-profile-ensure.ts +24 -26
- package/src/workspace/custom-profile-ensure.ts +2 -2
- package/src/workspace/git-service.ts +1 -1
- package/src/workspace/hatched-date.ts +1 -1
- package/src/workspace/migrations/038-unify-llm-callsite-configs.ts +2 -2
- package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +1 -1
- package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +1 -1
- package/src/workspace/migrations/077-seed-memory-router-callsite.ts +1 -1
- package/src/workspace/migrations/registry.ts +0 -4
- package/src/workspace/turn-commit.ts +1 -1
- package/docs/activation-funnel-telemetry.md +0 -324
- package/scripts/bundled-plugin-packages.ts +0 -154
- package/scripts/generate-bundled-plugin-packages.ts +0 -29
- package/src/__tests__/activation-early-marking.test.ts +0 -114
- package/src/__tests__/auth-fallback-events-store.test.ts +0 -99
- package/src/__tests__/config-get-vision-flag.test.ts +0 -139
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +0 -400
- package/src/__tests__/internal-telemetry-routes.test.ts +0 -213
- package/src/__tests__/telemetry-routes.test.ts +0 -182
- package/src/__tests__/turn-events-store.test.ts +0 -376
- package/src/__tests__/ui-channel-variants.test.ts +0 -53
- package/src/avatar/__tests__/avatar-changed-telemetry.test.ts +0 -217
- package/src/avatar/avatar-changed-telemetry.ts +0 -128
- package/src/calls/__tests__/call-funnel-telemetry.test.ts +0 -204
- package/src/cli/commands/telemetry.help.ts +0 -27
- package/src/cli/commands/telemetry.ts +0 -83
- package/src/cli/lib/__tests__/local-plugin-upgrade.test.ts +0 -251
- package/src/cli/lib/__tests__/plugin-catalog-local.test.ts +0 -113
- package/src/cli/lib/__tests__/plugin-marketplace.test.ts +0 -384
- package/src/cli/lib/__tests__/plugin-pin-history.test.ts +0 -164
- package/src/cli/lib/__tests__/plugins-install-offline.test.ts +0 -228
- package/src/cli/lib/bundled-marketplace.json +0 -1575
- package/src/cli/lib/bundled-plugin-packages.json +0 -827
- package/src/cli/lib/bundled-plugin-packages.ts +0 -87
- package/src/cli/lib/plugin-catalog-local.ts +0 -94
- package/src/cli/lib/plugin-pin-history.ts +0 -276
- package/src/cloud/feature-gate.ts +0 -8
- package/src/config/__tests__/cloud-rehydration.test.ts +0 -180
- package/src/config/cloud-rehydration.ts +0 -35
- package/src/daemon/__tests__/auto-profile-router.test.ts +0 -380
- package/src/daemon/auto-profile-router.ts +0 -428
- package/src/live-voice/__tests__/live-voice-session-telemetry.test.ts +0 -391
- package/src/monitoring/__tests__/db-integrity-sample.test.ts +0 -113
- package/src/monitoring/__tests__/oom-kill-reporter.test.ts +0 -374
- package/src/monitoring/db-integrity-check.ts +0 -163
- package/src/monitoring/db-integrity-sample.ts +0 -176
- package/src/monitoring/oom-kill-reporter.ts +0 -469
- package/src/onboarding/__tests__/onboarding-events-store.test.ts +0 -158
- package/src/onboarding/onboarding-events-store.ts +0 -296
- package/src/persistence/__tests__/raw-query-telemetry.test.ts +0 -76
- package/src/persistence/lifecycle-events-store.test.ts +0 -134
- package/src/persistence/lifecycle-events-store.ts +0 -110
- package/src/plugins/defaults/memory/__tests__/activation-session-store.test.ts +0 -76
- package/src/plugins/defaults/memory/activation-session-store.ts +0 -50
- package/src/plugins/defaults/memory/src/__tests__/memory-v3-gate-stats.test.ts +0 -281
- package/src/runtime/routes/auto-profile-routes.ts +0 -83
- package/src/runtime/routes/internal-telemetry-routes.ts +0 -142
- package/src/runtime/routes/telemetry-routes.ts +0 -274
- package/src/security/auth-fallback-events-store.ts +0 -57
- package/src/telemetry/__tests__/activation-funnel.test.ts +0 -95
- package/src/telemetry/__tests__/config-setting-events-store.test.ts +0 -63
- package/src/telemetry/__tests__/config-setting-snapshot.test.ts +0 -143
- package/src/telemetry/__tests__/flush-checkpoints.test.ts +0 -56
- package/src/telemetry/__tests__/live-voice-funnel.test.ts +0 -174
- package/src/telemetry/__tests__/outbox-test-harness.ts +0 -85
- package/src/telemetry/__tests__/phone-call-funnel.test.ts +0 -72
- package/src/telemetry/__tests__/telemetry-event-fixtures.ts +0 -282
- package/src/telemetry/__tests__/watchdog-events-store.test.ts +0 -71
- package/src/telemetry/activation-funnel.ts +0 -172
- package/src/telemetry/config-setting-events-store.ts +0 -40
- package/src/telemetry/config-setting-snapshot.ts +0 -170
- package/src/telemetry/flush-checkpoints.ts +0 -70
- package/src/telemetry/live-voice-funnel.ts +0 -185
- package/src/telemetry/memory-corpus-size.test.ts +0 -120
- package/src/telemetry/memory-corpus-size.ts +0 -184
- package/src/telemetry/memory-tier-reporter.test.ts +0 -195
- package/src/telemetry/memory-tier-reporter.ts +0 -130
- package/src/telemetry/phone-call-funnel.ts +0 -144
- package/src/telemetry/skill-loaded-events-store.test.ts +0 -93
- package/src/telemetry/skill-loaded-events-store.ts +0 -39
- package/src/telemetry/telemetry-event-sources.test.ts +0 -223
- package/src/telemetry/telemetry-event-sources.ts +0 -597
- package/src/telemetry/telemetry-events-outbox.test.ts +0 -375
- package/src/telemetry/telemetry-events-outbox.ts +0 -237
- package/src/telemetry/telemetry-main-db.ts +0 -48
- package/src/telemetry/telemetry-wire-source.json +0 -4
- package/src/telemetry/telemetry-wire-validation.test.ts +0 -157
- package/src/telemetry/telemetry-wire-validation.ts +0 -162
- package/src/telemetry/telemetry-wire.generated.ts +0 -483
- package/src/telemetry/tool-executed-events-store.test.ts +0 -210
- package/src/telemetry/tool-executed-events-store.ts +0 -102
- package/src/telemetry/trace-collection-policy.test.ts +0 -28
- package/src/telemetry/trace-collection-policy.ts +0 -30
- package/src/telemetry/turn-events-store.ts +0 -216
- package/src/telemetry/turn-trace-store.test.ts +0 -884
- package/src/telemetry/turn-trace-store.ts +0 -399
- package/src/telemetry/types.test.ts +0 -38
- package/src/telemetry/types.ts +0 -780
- package/src/telemetry/usage-telemetry-reporter.test.ts +0 -3445
- package/src/telemetry/usage-telemetry-reporter.ts +0 -566
- package/src/telemetry/watchdog-direct-emit.test.ts +0 -112
- package/src/telemetry/watchdog-direct-emit.ts +0 -104
- package/src/telemetry/watchdog-events-store.ts +0 -31
- package/src/tools/ui-surface/channel-variants.ts +0 -52
- package/src/watcher/__tests__/telemetry.test.ts +0 -178
- package/src/watcher/telemetry.ts +0 -93
- package/src/workspace/migrations/097-enable-adaptive-thinking-managed-profiles.ts +0 -165
- package/src/workspace/migrations/104-recheck-adaptive-thinking-model-implied-anthropic.ts +0 -151
- /package/src/{telemetry → persistence}/tool-usage-store.ts +0 -0
- /package/src/{telemetry → persistence}/turn-outcome.ts +0 -0
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
import { getRawShareAnalytics } from "../cloud/consent-cache.js";
|
|
2
|
-
import { getConfigReadOnly } from "../config/loader.js";
|
|
3
|
-
import type { AssistantConfig } from "../config/schema.js";
|
|
4
|
-
import { getLogger } from "../util/logger.js";
|
|
5
|
-
import { recordConfigSettingEvent } from "./config-setting-events-store.js";
|
|
6
|
-
|
|
7
|
-
const log = getLogger("config-setting-snapshot");
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* How often the config snapshot re-records the tracked settings. The snapshot
|
|
11
|
-
* memoizes per key, so a steady-state tick records nothing; the cadence
|
|
12
|
-
* exists so the first opted-in tick (consent resolves asynchronously after
|
|
13
|
-
* boot) lands and a live config edit is captured within one window. Hourly is
|
|
14
|
-
* ample — these values change rarely and every boot re-asserts them.
|
|
15
|
-
*/
|
|
16
|
-
const CONFIG_SNAPSHOT_INTERVAL_MS = 60 * 60 * 1000;
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* The explicit allowlist of settings reported as `config_setting` telemetry,
|
|
20
|
-
* as `(config_key, config_value)` pairs. Keys are dotted config paths; values
|
|
21
|
-
* are the effective (defaults-applied) values rendered as strings. Add only
|
|
22
|
-
* non-sensitive settings — never free-form config content, paths, or
|
|
23
|
-
* credentials.
|
|
24
|
-
*
|
|
25
|
-
* Optional chaining is defensive: the effective config always carries these
|
|
26
|
-
* fields, but a partial config (a mocked config in tests) skips the key
|
|
27
|
-
* rather than recording a bogus value or throwing out of the emitter.
|
|
28
|
-
*/
|
|
29
|
-
function trackedConfigSettings(
|
|
30
|
-
config: AssistantConfig,
|
|
31
|
-
): ReadonlyArray<readonly [string, string]> {
|
|
32
|
-
const pairs: ReadonlyArray<readonly [string, boolean | undefined]> = [
|
|
33
|
-
["memory.enabled", config.memory?.enabled],
|
|
34
|
-
["memory.v2.enabled", config.memory?.v2?.enabled],
|
|
35
|
-
["memory.v3.live", config.memory?.v3?.live],
|
|
36
|
-
];
|
|
37
|
-
return pairs
|
|
38
|
-
.filter((pair): pair is readonly [string, boolean] => pair[1] != null)
|
|
39
|
-
.map(([key, value]) => [key, String(value)] as const);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Per-process memo of the last value recorded for each tracked key, so a
|
|
44
|
-
* repeated snapshot only persists a row when the effective value actually
|
|
45
|
-
* changed. Process-scoped on purpose: a restart re-records the current
|
|
46
|
-
* values, giving downstream consumers a fresh per-boot assertion of each
|
|
47
|
-
* setting.
|
|
48
|
-
*/
|
|
49
|
-
const lastRecorded = new Map<string, string>();
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Record a `config_setting` event for every tracked setting whose effective
|
|
53
|
-
* value differs from what this process last recorded.
|
|
54
|
-
*
|
|
55
|
-
* Consent-gated with a memo reset on opt-out. While `share_analytics` is a
|
|
56
|
-
* confirmed opt-out, nothing is recorded and the memo is cleared: the
|
|
57
|
-
* reporter's opt-out flush discards any config_setting rows still pending
|
|
58
|
-
* upload, so a memo entry from before the opt-out no longer corresponds to a
|
|
59
|
-
* delivered row. Clearing it means a later re-opt-in (in the same process,
|
|
60
|
-
* unchanged config) re-records the full current snapshot rather than skipping
|
|
61
|
-
* memoized keys — consumers that expect a complete snapshot after re-opt-in
|
|
62
|
-
* stay correct. An UNKNOWN consent state skips entirely (no record, no memo,
|
|
63
|
-
* no clear): unlike outbox events, a snapshot is re-derivable state, so
|
|
64
|
-
* deferring it loses nothing — while recording it would either memoize a row
|
|
65
|
-
* a later opt-out purge invalidates, or (without the memo) double-record on
|
|
66
|
-
* every boot.
|
|
67
|
-
*
|
|
68
|
-
* Retry-friendly when opted in: `recordConfigSettingEvent` returns false when
|
|
69
|
-
* the telemetry DB is momentarily unavailable, and the memo is only advanced
|
|
70
|
-
* on a real persist, so a caller that re-invokes this each cycle records the
|
|
71
|
-
* snapshot on its first cycle with a resolvable DB, then stays quiet until a
|
|
72
|
-
* value changes. Never throws — a storage failure is logged and the key
|
|
73
|
-
* retries on the next invocation.
|
|
74
|
-
*/
|
|
75
|
-
export function recordConfigSettingSnapshot(config: AssistantConfig): void {
|
|
76
|
-
const consent = getRawShareAnalytics();
|
|
77
|
-
if (consent === "unknown") {
|
|
78
|
-
return;
|
|
79
|
-
}
|
|
80
|
-
if (consent === false) {
|
|
81
|
-
lastRecorded.clear();
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
for (const [configKey, configValue] of trackedConfigSettings(config)) {
|
|
85
|
-
if (lastRecorded.get(configKey) === configValue) {
|
|
86
|
-
continue;
|
|
87
|
-
}
|
|
88
|
-
try {
|
|
89
|
-
if (recordConfigSettingEvent({ configKey, configValue })) {
|
|
90
|
-
lastRecorded.set(configKey, configValue);
|
|
91
|
-
}
|
|
92
|
-
} catch (err) {
|
|
93
|
-
log.warn(
|
|
94
|
-
{ err, configKey },
|
|
95
|
-
"Failed to record config_setting telemetry event — will retry on the next snapshot",
|
|
96
|
-
);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
let snapshotTimer: ReturnType<typeof setInterval> | null = null;
|
|
102
|
-
let bootRetryTimer: ReturnType<typeof setTimeout> | null = null;
|
|
103
|
-
|
|
104
|
-
// The boot-time snapshot races the first consent refresh (fire-and-forget in
|
|
105
|
-
// the monitor's startup), so consent is usually still "unknown" on the first
|
|
106
|
-
// call and the snapshot is skipped. Retry on a short timer until consent
|
|
107
|
-
// resolves rather than waiting a full hourly interval for the per-boot
|
|
108
|
-
// assertion.
|
|
109
|
-
const BOOT_RETRY_INTERVAL_MS = 60_000;
|
|
110
|
-
|
|
111
|
-
function recordSnapshotFromConfig(): void {
|
|
112
|
-
try {
|
|
113
|
-
// `getConfigReadOnly()` re-reads config.json on change (capturing live
|
|
114
|
-
// edits) and never writes to disk — safe for the monitor process.
|
|
115
|
-
recordConfigSettingSnapshot(getConfigReadOnly());
|
|
116
|
-
} catch (err) {
|
|
117
|
-
log.warn({ err }, "Config-setting snapshot failed (non-fatal)");
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
function recordBootSnapshotOnceConsentKnown(): void {
|
|
122
|
-
if (getRawShareAnalytics() === "unknown") {
|
|
123
|
-
bootRetryTimer = setTimeout(
|
|
124
|
-
recordBootSnapshotOnceConsentKnown,
|
|
125
|
-
BOOT_RETRY_INTERVAL_MS,
|
|
126
|
-
);
|
|
127
|
-
bootRetryTimer.unref?.();
|
|
128
|
-
return;
|
|
129
|
-
}
|
|
130
|
-
bootRetryTimer = null;
|
|
131
|
-
recordSnapshotFromConfig();
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
* Start the config-setting snapshot loop in the resource monitor process:
|
|
136
|
-
* record the tracked settings once at boot, then hourly. No-op in dev mode
|
|
137
|
-
* (CADET_DEV=1) and idempotent if already started. Mirrors
|
|
138
|
-
* {@link import("./usage-telemetry-reporter.js").startMonitorUsageTelemetryReporter}
|
|
139
|
-
* — the snapshot feeds the same config_setting pipeline the monitor flushes.
|
|
140
|
-
*/
|
|
141
|
-
export function startConfigSnapshotReporter(): void {
|
|
142
|
-
if (process.env.CADET_DEV === "1") {
|
|
143
|
-
return;
|
|
144
|
-
}
|
|
145
|
-
if (snapshotTimer) {
|
|
146
|
-
return;
|
|
147
|
-
}
|
|
148
|
-
recordBootSnapshotOnceConsentKnown();
|
|
149
|
-
snapshotTimer = setInterval(
|
|
150
|
-
recordSnapshotFromConfig,
|
|
151
|
-
CONFIG_SNAPSHOT_INTERVAL_MS,
|
|
152
|
-
);
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
/** Stop the config-setting snapshot loop. Idempotent. */
|
|
156
|
-
export function stopConfigSnapshotReporter(): void {
|
|
157
|
-
if (snapshotTimer) {
|
|
158
|
-
clearInterval(snapshotTimer);
|
|
159
|
-
snapshotTimer = null;
|
|
160
|
-
}
|
|
161
|
-
if (bootRetryTimer) {
|
|
162
|
-
clearTimeout(bootRetryTimer);
|
|
163
|
-
bootRetryTimer = null;
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
/** Test-only: clear the per-process last-recorded memo. */
|
|
168
|
-
export function resetConfigSettingSnapshotForTesting(): void {
|
|
169
|
-
lastRecorded.clear();
|
|
170
|
-
}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import { eq } from "drizzle-orm";
|
|
2
|
-
|
|
3
|
-
import { getTelemetryDb } from "../persistence/db-connection.js";
|
|
4
|
-
import { flushCheckpoints } from "../persistence/schema/index.js";
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Telemetry flush state — the per-event-type watermark cursors the usage
|
|
8
|
-
* telemetry reporter advances after each successful upload. Backed by the
|
|
9
|
-
* `flush_checkpoints` table on the dedicated telemetry database
|
|
10
|
-
* (`assistant-telemetry.db`); the main DB's `memory_checkpoints` ledger is
|
|
11
|
-
* reserved for DB-migration checkpoints.
|
|
12
|
-
*
|
|
13
|
-
* Reads and writes throw when the table is missing (migrations not yet run)
|
|
14
|
-
* and are no-op/null when the telemetry DB cannot be opened at all. Callers
|
|
15
|
-
* that must not mistake an unreadable store for "no watermark" (which would
|
|
16
|
-
* re-ship history from cursor 0) should gate on
|
|
17
|
-
* {@link isFlushCheckpointStoreAvailable} first.
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
/** True when the telemetry DB connection is open. */
|
|
21
|
-
export function isFlushCheckpointStoreAvailable(): boolean {
|
|
22
|
-
return getTelemetryDb() != null;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export function getFlushCheckpoint(key: string): string | null {
|
|
26
|
-
const db = getTelemetryDb();
|
|
27
|
-
if (!db) {
|
|
28
|
-
return null;
|
|
29
|
-
}
|
|
30
|
-
const row = db
|
|
31
|
-
.select({ value: flushCheckpoints.value })
|
|
32
|
-
.from(flushCheckpoints)
|
|
33
|
-
.where(eq(flushCheckpoints.key, key))
|
|
34
|
-
.get();
|
|
35
|
-
return row?.value ?? null;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export function setFlushCheckpoint(key: string, value: string): void {
|
|
39
|
-
const db = getTelemetryDb();
|
|
40
|
-
if (!db) {
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
const now = Date.now();
|
|
44
|
-
db.insert(flushCheckpoints)
|
|
45
|
-
.values({ key, value, updatedAt: now })
|
|
46
|
-
.onConflictDoUpdate({
|
|
47
|
-
target: flushCheckpoints.key,
|
|
48
|
-
set: { value, updatedAt: now },
|
|
49
|
-
})
|
|
50
|
-
.run();
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Watermark storage seam for the usage telemetry reporter. The reporter
|
|
55
|
-
* takes this as a constructor dependency (defaulting to
|
|
56
|
-
* {@link telemetryDbFlushCheckpointStore}) so tests can substitute an
|
|
57
|
-
* in-memory fake without process-global module mocking.
|
|
58
|
-
*/
|
|
59
|
-
export interface FlushCheckpointStore {
|
|
60
|
-
isAvailable(): boolean;
|
|
61
|
-
get(key: string): string | null;
|
|
62
|
-
set(key: string, value: string): void;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/** The production store, backed by the telemetry DB's `flush_checkpoints`. */
|
|
66
|
-
export const telemetryDbFlushCheckpointStore: FlushCheckpointStore = {
|
|
67
|
-
isAvailable: isFlushCheckpointStoreAvailable,
|
|
68
|
-
get: getFlushCheckpoint,
|
|
69
|
-
set: setFlushCheckpoint,
|
|
70
|
-
};
|
|
@@ -1,185 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Live-voice session telemetry vocabulary: the single source of truth for the
|
|
3
|
-
* step names, funnel version, and end-reason values the live-voice session
|
|
4
|
-
* emitter uses.
|
|
5
|
-
*
|
|
6
|
-
* Rides the existing onboarding telemetry substrate (`type: "onboarding"`),
|
|
7
|
-
* exactly as `activation-funnel.ts` does: the backend stores `step_name` and
|
|
8
|
-
* `funnel_version` as open strings, so this funnel needs no platform serializer
|
|
9
|
-
* and no wire-contract change.
|
|
10
|
-
*
|
|
11
|
-
* **Duration is not a field.** The onboarding event shape carries no numeric
|
|
12
|
-
* slot for it, so the two events below are keyed by the live-voice `sessionId`
|
|
13
|
-
* in `session_id` and the warehouse subtracts their `recorded_at` stamps. That
|
|
14
|
-
* yields exact percentiles rather than the bucketed-string dimension the tips
|
|
15
|
-
* and tour funnels pack into `screen`.
|
|
16
|
-
*
|
|
17
|
-
* **Turn count is not a field either.** It comes from the `turn` telemetry
|
|
18
|
-
* events voice turns already produce, which carry this session's id in their
|
|
19
|
-
* `client` bag (see `voice-session-bridge.ts`), so a turn count is a count of
|
|
20
|
-
* those rows rather than a number restated here.
|
|
21
|
-
*
|
|
22
|
-
* A session that starts and never ends is **censored, not infinite**: a daemon
|
|
23
|
-
* crash or kill emits no end event, so downstream duration math must drop
|
|
24
|
-
* unmatched `started` rows instead of treating them as open-ended sessions.
|
|
25
|
-
*/
|
|
26
|
-
|
|
27
|
-
import type { ClientOs } from "../channels/types.js";
|
|
28
|
-
import type { LiveVoiceSessionCloseReason } from "../live-voice/live-voice-session-manager.js";
|
|
29
|
-
import type { LiveVoiceProtocolErrorCode } from "../live-voice/protocol.js";
|
|
30
|
-
|
|
31
|
-
/** Funnel version stamped on every live-voice session event. */
|
|
32
|
-
export const LIVE_VOICE_FUNNEL_VERSION = "live_voice_v1_2026_08";
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Live-voice session funnel steps. `stepName` is the wire value; `stepIndex`
|
|
36
|
-
* is the ordinal position.
|
|
37
|
-
*
|
|
38
|
-
* `sessionStarted` fires for every *attempted* session, before the credential
|
|
39
|
-
* preflight that can reject it. A session that fails to connect is exactly the
|
|
40
|
-
* one worth counting, and gating the start event on `ready` would hide it from
|
|
41
|
-
* the failure rate entirely.
|
|
42
|
-
*/
|
|
43
|
-
export const LIVE_VOICE_STEPS = {
|
|
44
|
-
sessionStarted: { stepName: "live_voice_session_started", stepIndex: 0 },
|
|
45
|
-
sessionEnded: { stepName: "live_voice_session_ended", stepIndex: 1 },
|
|
46
|
-
} as const;
|
|
47
|
-
|
|
48
|
-
export type LiveVoiceStepName =
|
|
49
|
-
(typeof LIVE_VOICE_STEPS)[keyof typeof LIVE_VOICE_STEPS]["stepName"];
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* How a session ended, stamped as `outcome`.
|
|
53
|
-
*
|
|
54
|
-
* `failed` means the session died on an error: a credential preflight
|
|
55
|
-
* rejection before `ready`, or an utterance-arm failure after it. Everything
|
|
56
|
-
* else, including a dropped socket, is `completed`: the session ran and then
|
|
57
|
-
* stopped, and the close reason on `screen` says how.
|
|
58
|
-
*/
|
|
59
|
-
export type LiveVoiceSessionOutcome = "completed" | "failed";
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* How far a session that produced NO turn actually got.
|
|
63
|
-
*
|
|
64
|
-
* A quarter of live-voice sessions end without a single turn, at a median of a
|
|
65
|
-
* few seconds. That is the closest thing the telemetry has to a "voice didn't
|
|
66
|
-
* work for me" rate, and a bare connect/close row cannot separate a denied
|
|
67
|
-
* microphone from a muted one from someone deliberately backing out. Those have
|
|
68
|
-
* completely different fixes, so the reason is what makes the rate actionable.
|
|
69
|
-
*
|
|
70
|
-
* The values are ordered by how far the session got, and each one narrows the
|
|
71
|
-
* cause to a different layer:
|
|
72
|
-
*
|
|
73
|
-
* - `no_ready` never reached `active`: died in the credential preflight or
|
|
74
|
-
* the transport, before the user could have said anything.
|
|
75
|
-
* - `text_only` opened without a speech-to-text leg because the client could
|
|
76
|
-
* type, and then the user never typed. Ranked ahead of the audio
|
|
77
|
-
* signals because they cannot mean anything here: no microphone
|
|
78
|
-
* was ever expected, so scoring such a session `no_audio` would
|
|
79
|
-
* read as a failure the session does not have.
|
|
80
|
-
* - `no_audio` reached `active` but not one audio chunk ever arrived, so the
|
|
81
|
-
* microphone never opened. Permission denial looks like this.
|
|
82
|
-
* - `no_speech` audio arrived but the detector never classified any of it as
|
|
83
|
-
* speech: a muted or dead mic, or a genuinely silent user.
|
|
84
|
-
* - `no_turn` speech was detected but no turn was ever dispatched, so the
|
|
85
|
-
* utterance was abandoned, aborted, or failed to arm.
|
|
86
|
-
*/
|
|
87
|
-
export type LiveVoiceSilenceReason =
|
|
88
|
-
| "no_ready"
|
|
89
|
-
| "text_only"
|
|
90
|
-
| "no_audio"
|
|
91
|
-
| "no_speech"
|
|
92
|
-
| "no_turn";
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Classify a zero-turn session from what the session observed. Call only when
|
|
96
|
-
* the session really produced no turn: every branch here asserts silence, so a
|
|
97
|
-
* session that did dispatch a turn would be mislabelled by the last one.
|
|
98
|
-
*/
|
|
99
|
-
export function liveVoiceSilenceReason(signals: {
|
|
100
|
-
reachedActive: boolean;
|
|
101
|
-
audioInput: boolean;
|
|
102
|
-
receivedAudio: boolean;
|
|
103
|
-
detectedSpeech: boolean;
|
|
104
|
-
}): LiveVoiceSilenceReason {
|
|
105
|
-
if (!signals.reachedActive) {
|
|
106
|
-
return "no_ready";
|
|
107
|
-
}
|
|
108
|
-
if (!signals.audioInput) {
|
|
109
|
-
return "text_only";
|
|
110
|
-
}
|
|
111
|
-
if (!signals.receivedAudio) {
|
|
112
|
-
return "no_audio";
|
|
113
|
-
}
|
|
114
|
-
if (!signals.detectedSpeech) {
|
|
115
|
-
return "no_speech";
|
|
116
|
-
}
|
|
117
|
-
return "no_turn";
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* The half of a start stamp that stands in for a dimension the client did not
|
|
122
|
-
* send: an older client, or one that sends no identity at all.
|
|
123
|
-
*/
|
|
124
|
-
const LIVE_VOICE_UNATTRIBUTED = "unknown";
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* The `screen` dimension for a started session: the client it started on and
|
|
128
|
-
* the control it started from, as `started_<client>:<entry>`.
|
|
129
|
-
*
|
|
130
|
-
* Both halves come off the start frame verbatim (`client` is a `ClientOs`;
|
|
131
|
-
* `entry` is the client's own token, see `protocol.ts`). Both are always
|
|
132
|
-
* present, with {@link LIVE_VOICE_UNATTRIBUTED} standing in for a missing one,
|
|
133
|
-
* so a query can split the stamp on its colon without a null branch per half.
|
|
134
|
-
*
|
|
135
|
-
* The client rides the started row and not only the turn rows because a
|
|
136
|
-
* quarter of sessions never produce a turn, and those are the ones the client
|
|
137
|
-
* dimension is most needed on: "voice did nothing for me" is a per-client
|
|
138
|
-
* question. Until now those sessions had no client at all (the admin
|
|
139
|
-
* dashboard's `(no turns)` bucket); this stamp gives every session one.
|
|
140
|
-
*
|
|
141
|
-
* The entry is what separates the macOS app's three ways in from each other:
|
|
142
|
-
* the same `client` covers the chat's voice button, the companion's Talk and
|
|
143
|
-
* the voice key, and only the entry says which one the user reached for.
|
|
144
|
-
*/
|
|
145
|
-
export function liveVoiceStartScreen(
|
|
146
|
-
client?: ClientOs | null,
|
|
147
|
-
entry?: string | null,
|
|
148
|
-
): string {
|
|
149
|
-
return `started_${client ?? LIVE_VOICE_UNATTRIBUTED}:${entry ?? LIVE_VOICE_UNATTRIBUTED}`;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
/**
|
|
153
|
-
* The `screen` dimension for an ended session: how it closed, plus a detail
|
|
154
|
-
* half. That detail is the protocol error code when a failure closed it, or the
|
|
155
|
-
* silence classification when the session produced no turn at all.
|
|
156
|
-
*
|
|
157
|
-
* Every part is the daemon's own vocabulary verbatim
|
|
158
|
-
* (`LiveVoiceSessionCloseReason`, `LiveVoiceProtocolErrorCode`,
|
|
159
|
-
* {@link LiveVoiceSilenceReason}) rather than a mapping, so a rename on any of
|
|
160
|
-
* them surfaces here as a compile error instead of a silently-empty dashboard
|
|
161
|
-
* facet. The longest combination this can produce is well inside the wire
|
|
162
|
-
* field's 64-char bound.
|
|
163
|
-
*
|
|
164
|
-
* A failure code wins over a silence reason when both apply: a session that
|
|
165
|
-
* died on an error is explained by the error, and the silence is a consequence
|
|
166
|
-
* of it rather than a separate finding.
|
|
167
|
-
*
|
|
168
|
-
* The silence value carries a `silent_` prefix on purpose. It shares the detail
|
|
169
|
-
* slot with failure codes, and the admin dashboard currently renders that slot
|
|
170
|
-
* in a column labelled "failure code", so the value has to read correctly even
|
|
171
|
-
* where the column header is wrong, until that panel learns the difference.
|
|
172
|
-
*/
|
|
173
|
-
export function liveVoiceEndScreen(
|
|
174
|
-
reason: LiveVoiceSessionCloseReason,
|
|
175
|
-
failureCode?: LiveVoiceProtocolErrorCode | null,
|
|
176
|
-
silenceReason?: LiveVoiceSilenceReason | null,
|
|
177
|
-
): string {
|
|
178
|
-
if (failureCode) {
|
|
179
|
-
return `ended_${reason}:${failureCode}`;
|
|
180
|
-
}
|
|
181
|
-
if (silenceReason) {
|
|
182
|
-
return `ended_${reason}:silent_${silenceReason}`;
|
|
183
|
-
}
|
|
184
|
-
return `ended_${reason}`;
|
|
185
|
-
}
|
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
import { mkdirSync, rmSync, symlinkSync, writeFileSync } from "node:fs";
|
|
2
|
-
import { join } from "node:path";
|
|
3
|
-
import { beforeEach, describe, expect, test } from "bun:test";
|
|
4
|
-
|
|
5
|
-
let workspaceDir = "";
|
|
6
|
-
|
|
7
|
-
import {
|
|
8
|
-
measureMarkdownTree,
|
|
9
|
-
measureMemoryCorpusSize,
|
|
10
|
-
} from "./memory-corpus-size.js";
|
|
11
|
-
|
|
12
|
-
// Captured at module scope: the preload cleans up its env var between suites.
|
|
13
|
-
const PRELOAD_WS = process.env.CADET_WORKSPACE_DIR!;
|
|
14
|
-
|
|
15
|
-
function write(relativePath: string, contents: string): void {
|
|
16
|
-
const full = join(workspaceDir, relativePath);
|
|
17
|
-
mkdirSync(join(full, ".."), { recursive: true });
|
|
18
|
-
writeFileSync(full, contents, "utf8");
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
describe("measureMemoryCorpusSize", () => {
|
|
22
|
-
beforeEach(() => {
|
|
23
|
-
// The preload owns CADET_WORKSPACE_DIR; give this test a clean one.
|
|
24
|
-
workspaceDir = PRELOAD_WS;
|
|
25
|
-
rmSync(workspaceDir, { recursive: true, force: true });
|
|
26
|
-
mkdirSync(workspaceDir, { recursive: true });
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
test("an empty workspace measures as all zeros", () => {
|
|
30
|
-
expect(measureMemoryCorpusSize()).toEqual({
|
|
31
|
-
concept_pages: 0,
|
|
32
|
-
concept_bytes: 0,
|
|
33
|
-
pkb_files: 0,
|
|
34
|
-
pkb_bytes: 0,
|
|
35
|
-
buffer_lines: 0,
|
|
36
|
-
});
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
test("counts concept pages recursively and totals their bytes", () => {
|
|
40
|
-
write("memory/concepts/alice.md", "12345"); // 5 bytes
|
|
41
|
-
write("memory/concepts/people/bob.md", "1234567890"); // 10 bytes
|
|
42
|
-
write("memory/concepts/people/nested/carol.md", "12345"); // 5 bytes
|
|
43
|
-
|
|
44
|
-
const size = measureMemoryCorpusSize();
|
|
45
|
-
|
|
46
|
-
expect(size.concept_pages).toBe(3);
|
|
47
|
-
expect(size.concept_bytes).toBe(20);
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
test("counts the PKB tree independently of concept pages", () => {
|
|
51
|
-
write("memory/concepts/alice.md", "12345");
|
|
52
|
-
write("pkb/essentials.md", "1234567890");
|
|
53
|
-
write("pkb/archive/2026-01-01.md", "12345");
|
|
54
|
-
|
|
55
|
-
const size = measureMemoryCorpusSize();
|
|
56
|
-
|
|
57
|
-
expect(size.concept_pages).toBe(1);
|
|
58
|
-
expect(size.pkb_files).toBe(2);
|
|
59
|
-
expect(size.pkb_bytes).toBe(15);
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
test("ignores non-markdown files", () => {
|
|
63
|
-
write("memory/concepts/alice.md", "12345");
|
|
64
|
-
write("memory/concepts/notes.txt", "ignored");
|
|
65
|
-
write("memory/concepts/.DS_Store", "ignored");
|
|
66
|
-
|
|
67
|
-
expect(measureMemoryCorpusSize().concept_pages).toBe(1);
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
test("buffer_lines counts non-empty lines only", () => {
|
|
71
|
-
write("memory/buffer.md", "- one\n\n- two\n \n- three\n");
|
|
72
|
-
|
|
73
|
-
expect(measureMemoryCorpusSize().buffer_lines).toBe(3);
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
test("an absent buffer reads as zero rather than failing", () => {
|
|
77
|
-
write("memory/concepts/alice.md", "12345");
|
|
78
|
-
|
|
79
|
-
expect(measureMemoryCorpusSize().buffer_lines).toBe(0);
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
test("the traversal ceiling counts every entry, not just markdown", () => {
|
|
83
|
-
// The regression this guards: a ceiling that only counted `.md` matches
|
|
84
|
-
// would not bound this walk at all, because nothing in the root is
|
|
85
|
-
// Markdown.
|
|
86
|
-
//
|
|
87
|
-
// The page sits one level down so the assertion does not depend on
|
|
88
|
-
// readdir order. The root holds 11 entries (10 noise files + the subdir),
|
|
89
|
-
// so a limit of 5 is exhausted while still scanning the root and the walk
|
|
90
|
-
// returns before it ever descends — whichever order those 11 come back in.
|
|
91
|
-
const dir = join(workspaceDir, "noise");
|
|
92
|
-
mkdirSync(join(dir, "sub"), { recursive: true });
|
|
93
|
-
for (let i = 0; i < 10; i++) {
|
|
94
|
-
writeFileSync(join(dir, `placeholder-${i}.txt`), "x", "utf8");
|
|
95
|
-
}
|
|
96
|
-
writeFileSync(join(dir, "sub", "page.md"), "12345", "utf8");
|
|
97
|
-
|
|
98
|
-
expect(measureMarkdownTree(dir, 5)).toEqual({ files: 0, bytes: 0 });
|
|
99
|
-
// Unbounded, the same tree yields the one page it contains.
|
|
100
|
-
expect(measureMarkdownTree(dir)).toEqual({ files: 1, bytes: 5 });
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
test("does not follow symlinked directories", () => {
|
|
104
|
-
// A link back to an ancestor would otherwise walk forever. Dirents carry
|
|
105
|
-
// lstat semantics, so the link is skipped rather than recursed into.
|
|
106
|
-
write("memory/concepts/alice.md", "12345");
|
|
107
|
-
mkdirSync(join(workspaceDir, "outside"), { recursive: true });
|
|
108
|
-
writeFileSync(join(workspaceDir, "outside", "extra.md"), "12345", "utf8");
|
|
109
|
-
symlinkSync(
|
|
110
|
-
join(workspaceDir, "outside"),
|
|
111
|
-
join(workspaceDir, "memory", "concepts", "linked"),
|
|
112
|
-
"dir",
|
|
113
|
-
);
|
|
114
|
-
|
|
115
|
-
const size = measureMemoryCorpusSize();
|
|
116
|
-
|
|
117
|
-
expect(size.concept_pages).toBe(1);
|
|
118
|
-
expect(size.concept_bytes).toBe(5);
|
|
119
|
-
});
|
|
120
|
-
});
|