@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
|
@@ -10,7 +10,6 @@ import {
|
|
|
10
10
|
getUsageTotals,
|
|
11
11
|
listRunConversationIds,
|
|
12
12
|
listUsageEvents,
|
|
13
|
-
queryUnreportedUsageEvents,
|
|
14
13
|
recordUsageEvent,
|
|
15
14
|
} from "../persistence/llm-usage-store.js";
|
|
16
15
|
import type { PricingResult, UsageEventInput } from "../usage/types.js";
|
|
@@ -1668,497 +1667,3 @@ describe("getUsageGroupedSeries", () => {
|
|
|
1668
1667
|
});
|
|
1669
1668
|
});
|
|
1670
1669
|
});
|
|
1671
|
-
|
|
1672
|
-
// ---------------------------------------------------------------------------
|
|
1673
|
-
// queryUnreportedUsageEvents tests
|
|
1674
|
-
// ---------------------------------------------------------------------------
|
|
1675
|
-
|
|
1676
|
-
describe("queryUnreportedUsageEvents", () => {
|
|
1677
|
-
beforeEach(() => {
|
|
1678
|
-
const db = getDb();
|
|
1679
|
-
// Order matters: clear `llm_usage_events` (no FK), then `messages`
|
|
1680
|
-
// (FK to conversations cascades, but be explicit), then
|
|
1681
|
-
// `conversations`. The conversation-level metadata tests below
|
|
1682
|
-
// depend on a clean conversations + messages slate so JOINs are
|
|
1683
|
-
// deterministic.
|
|
1684
|
-
db.run(`DELETE FROM llm_usage_events`);
|
|
1685
|
-
db.run(`DELETE FROM messages`);
|
|
1686
|
-
db.run(`DELETE FROM conversations`);
|
|
1687
|
-
});
|
|
1688
|
-
|
|
1689
|
-
test("returns events with createdAt strictly greater than afterCreatedAt in ascending order", () => {
|
|
1690
|
-
insertEventAt(1000, { model: "model-a" });
|
|
1691
|
-
insertEventAt(2000, { model: "model-b" });
|
|
1692
|
-
insertEventAt(3000, { model: "model-c" });
|
|
1693
|
-
|
|
1694
|
-
// afterCreatedAt = 1000 should exclude the event at exactly 1000
|
|
1695
|
-
const events = queryUnreportedUsageEvents(1000, undefined, 100);
|
|
1696
|
-
expect(events).toHaveLength(2);
|
|
1697
|
-
expect(events[0].model).toBe("model-b");
|
|
1698
|
-
expect(events[0].createdAt).toBe(2000);
|
|
1699
|
-
expect(events[1].model).toBe("model-c");
|
|
1700
|
-
expect(events[1].createdAt).toBe(3000);
|
|
1701
|
-
});
|
|
1702
|
-
|
|
1703
|
-
test("respects the limit parameter", () => {
|
|
1704
|
-
insertEventAt(1000, { model: "model-a" });
|
|
1705
|
-
insertEventAt(2000, { model: "model-b" });
|
|
1706
|
-
insertEventAt(3000, { model: "model-c" });
|
|
1707
|
-
|
|
1708
|
-
const events = queryUnreportedUsageEvents(0, undefined, 2);
|
|
1709
|
-
expect(events).toHaveLength(2);
|
|
1710
|
-
// Should return the earliest two due to ASC ordering
|
|
1711
|
-
expect(events[0].model).toBe("model-a");
|
|
1712
|
-
expect(events[1].model).toBe("model-b");
|
|
1713
|
-
});
|
|
1714
|
-
|
|
1715
|
-
test("returns attribution fields for unreported usage events", () => {
|
|
1716
|
-
insertEventAt(1000, {
|
|
1717
|
-
callSite: "mainAgent",
|
|
1718
|
-
inferenceProfile: "balanced",
|
|
1719
|
-
inferenceProfileSource: "active",
|
|
1720
|
-
});
|
|
1721
|
-
|
|
1722
|
-
const events = queryUnreportedUsageEvents(0, undefined, 100);
|
|
1723
|
-
expect(events).toHaveLength(1);
|
|
1724
|
-
expect(events[0].callSite).toBe("mainAgent");
|
|
1725
|
-
expect(events[0].inferenceProfile).toBe("balanced");
|
|
1726
|
-
expect(events[0].inferenceProfileSource).toBe("active");
|
|
1727
|
-
});
|
|
1728
|
-
|
|
1729
|
-
test("returns empty array when no events match", () => {
|
|
1730
|
-
insertEventAt(1000, { model: "model-a" });
|
|
1731
|
-
|
|
1732
|
-
const events = queryUnreportedUsageEvents(2000, undefined, 100);
|
|
1733
|
-
expect(events).toHaveLength(0);
|
|
1734
|
-
});
|
|
1735
|
-
|
|
1736
|
-
test("returns empty array when table is empty", () => {
|
|
1737
|
-
const events = queryUnreportedUsageEvents(0, undefined, 100);
|
|
1738
|
-
expect(events).toHaveLength(0);
|
|
1739
|
-
});
|
|
1740
|
-
|
|
1741
|
-
// -------------------------------------------------------------------------
|
|
1742
|
-
// Conversation-level metadata (conversationType + turnIndex).
|
|
1743
|
-
// `conversationType` is stamped on the row at record time (so it survives
|
|
1744
|
-
// deletion of the parent conversation before flush) with a JOIN fallback
|
|
1745
|
-
// for pre-migration rows; `turnIndex` is JOIN-computed at telemetry-query
|
|
1746
|
-
// time.
|
|
1747
|
-
// -------------------------------------------------------------------------
|
|
1748
|
-
|
|
1749
|
-
test("conversationType resolves from the conversations table", () => {
|
|
1750
|
-
const db = getDb();
|
|
1751
|
-
const now = Date.now();
|
|
1752
|
-
db.run(
|
|
1753
|
-
`INSERT INTO conversations (id, conversation_type, created_at, updated_at) VALUES ('conv-std', 'standard', ${now}, ${now})`,
|
|
1754
|
-
);
|
|
1755
|
-
db.run(
|
|
1756
|
-
`INSERT INTO conversations (id, conversation_type, created_at, updated_at) VALUES ('conv-bg', 'background', ${now}, ${now})`,
|
|
1757
|
-
);
|
|
1758
|
-
|
|
1759
|
-
insertEventAt(1000, { conversationId: "conv-std" });
|
|
1760
|
-
insertEventAt(2000, { conversationId: "conv-bg" });
|
|
1761
|
-
insertEventAt(3000, { conversationId: null });
|
|
1762
|
-
|
|
1763
|
-
const events = queryUnreportedUsageEvents(0, undefined, 100);
|
|
1764
|
-
expect(events).toHaveLength(3);
|
|
1765
|
-
expect(events[0].conversationType).toBe("standard");
|
|
1766
|
-
expect(events[1].conversationType).toBe("background");
|
|
1767
|
-
// LLM calls without a parent conversation get null — LEFT JOIN, not INNER.
|
|
1768
|
-
expect(events[2].conversationType).toBeNull();
|
|
1769
|
-
});
|
|
1770
|
-
|
|
1771
|
-
test("conversationType is stamped on the row at record time", () => {
|
|
1772
|
-
const db = getDb();
|
|
1773
|
-
const now = Date.now();
|
|
1774
|
-
db.run(
|
|
1775
|
-
`INSERT INTO conversations (id, conversation_type, created_at, updated_at) VALUES ('conv-stamp', 'background', ${now}, ${now})`,
|
|
1776
|
-
);
|
|
1777
|
-
|
|
1778
|
-
const event = recordUsageEvent(
|
|
1779
|
-
makeInput({ conversationId: "conv-stamp" }),
|
|
1780
|
-
pricedResult,
|
|
1781
|
-
);
|
|
1782
|
-
|
|
1783
|
-
const row = getSqlite()
|
|
1784
|
-
.query("SELECT conversation_type FROM llm_usage_events WHERE id = ?")
|
|
1785
|
-
.get(event.id) as { conversation_type: string | null } | null;
|
|
1786
|
-
expect(row?.conversation_type).toBe("background");
|
|
1787
|
-
});
|
|
1788
|
-
|
|
1789
|
-
test("conversationType survives deletion of the parent conversation before flush", () => {
|
|
1790
|
-
// Reproduces the memory-retrospective NULL-label bug: the retrospective
|
|
1791
|
-
// runs in a `background` fork conversation whose row is GC'd once a
|
|
1792
|
-
// newer run supersedes it (or immediately on wake failure). Usage rows
|
|
1793
|
-
// flushed after that deletion carried a conversation_id but a null
|
|
1794
|
-
// conversation_type, because the type was derived only via a flush-time
|
|
1795
|
-
// JOIN. Same mechanism covers users deleting a standard conversation
|
|
1796
|
-
// within the flush window (the mainAgent NULL case).
|
|
1797
|
-
const db = getDb();
|
|
1798
|
-
const now = Date.now();
|
|
1799
|
-
db.run(
|
|
1800
|
-
`INSERT INTO conversations (id, conversation_type, created_at, updated_at) VALUES ('conv-gone', 'background', ${now}, ${now})`,
|
|
1801
|
-
);
|
|
1802
|
-
insertEventAt(1000, {
|
|
1803
|
-
conversationId: "conv-gone",
|
|
1804
|
-
callSite: "memoryRetrospective",
|
|
1805
|
-
});
|
|
1806
|
-
|
|
1807
|
-
db.run(`DELETE FROM conversations WHERE id = 'conv-gone'`);
|
|
1808
|
-
|
|
1809
|
-
const events = queryUnreportedUsageEvents(0, undefined, 100);
|
|
1810
|
-
expect(events).toHaveLength(1);
|
|
1811
|
-
expect(events[0].conversationId).toBe("conv-gone");
|
|
1812
|
-
expect(events[0].conversationType).toBe("background");
|
|
1813
|
-
});
|
|
1814
|
-
|
|
1815
|
-
test("conversationType falls back to the JOIN for pre-migration rows", () => {
|
|
1816
|
-
const db = getDb();
|
|
1817
|
-
const now = Date.now();
|
|
1818
|
-
db.run(
|
|
1819
|
-
`INSERT INTO conversations (id, conversation_type, created_at, updated_at) VALUES ('conv-legacy', 'scheduled', ${now}, ${now})`,
|
|
1820
|
-
);
|
|
1821
|
-
insertEventAt(1000, { conversationId: "conv-legacy" });
|
|
1822
|
-
// Simulate a row persisted before migration 353 stamped the column.
|
|
1823
|
-
db.run(
|
|
1824
|
-
`UPDATE llm_usage_events SET conversation_type = NULL WHERE conversation_id = 'conv-legacy'`,
|
|
1825
|
-
);
|
|
1826
|
-
|
|
1827
|
-
const events = queryUnreportedUsageEvents(0, undefined, 100);
|
|
1828
|
-
expect(events).toHaveLength(1);
|
|
1829
|
-
expect(events[0].conversationType).toBe("scheduled");
|
|
1830
|
-
});
|
|
1831
|
-
|
|
1832
|
-
test("turnIndex counts real user turns up to the LLM call's createdAt", () => {
|
|
1833
|
-
const db = getDb();
|
|
1834
|
-
const now = Date.now();
|
|
1835
|
-
db.run(
|
|
1836
|
-
`INSERT INTO conversations (id, conversation_type, created_at, updated_at) VALUES ('conv-1', 'standard', ${now}, ${now})`,
|
|
1837
|
-
);
|
|
1838
|
-
// Two user messages in the conversation.
|
|
1839
|
-
db.run(
|
|
1840
|
-
`INSERT INTO messages (id, conversation_id, role, content, created_at) VALUES ('m1', 'conv-1', 'user', 'hello', 1000)`,
|
|
1841
|
-
);
|
|
1842
|
-
db.run(
|
|
1843
|
-
`INSERT INTO messages (id, conversation_id, role, content, created_at) VALUES ('m2', 'conv-1', 'user', 'follow up', 3000)`,
|
|
1844
|
-
);
|
|
1845
|
-
|
|
1846
|
-
// Three LLM calls across the timeline:
|
|
1847
|
-
// - mid-turn-1 (between m1 and m2)
|
|
1848
|
-
// - exactly at m2's createdAt (still counts m2: `created_at <= e.created_at`)
|
|
1849
|
-
// - after m2
|
|
1850
|
-
insertEventAt(2000, { conversationId: "conv-1" });
|
|
1851
|
-
insertEventAt(3000, { conversationId: "conv-1" });
|
|
1852
|
-
insertEventAt(4000, { conversationId: "conv-1" });
|
|
1853
|
-
|
|
1854
|
-
const events = queryUnreportedUsageEvents(0, undefined, 100);
|
|
1855
|
-
expect(events).toHaveLength(3);
|
|
1856
|
-
expect(events[0].turnIndex).toBe(1);
|
|
1857
|
-
expect(events[1].turnIndex).toBe(2);
|
|
1858
|
-
expect(events[2].turnIndex).toBe(2);
|
|
1859
|
-
});
|
|
1860
|
-
|
|
1861
|
-
test("turnIndex is null when the LLM call has no conversationId", () => {
|
|
1862
|
-
insertEventAt(1000, { conversationId: null });
|
|
1863
|
-
|
|
1864
|
-
const events = queryUnreportedUsageEvents(0, undefined, 100);
|
|
1865
|
-
expect(events).toHaveLength(1);
|
|
1866
|
-
expect(events[0].conversationId).toBeNull();
|
|
1867
|
-
expect(events[0].turnIndex).toBeNull();
|
|
1868
|
-
});
|
|
1869
|
-
|
|
1870
|
-
test("turnIndex skips tool_result rows when counting", () => {
|
|
1871
|
-
const db = getDb();
|
|
1872
|
-
const now = Date.now();
|
|
1873
|
-
db.run(
|
|
1874
|
-
`INSERT INTO conversations (id, conversation_type, created_at, updated_at) VALUES ('conv-tr', 'standard', ${now}, ${now})`,
|
|
1875
|
-
);
|
|
1876
|
-
// One real user turn, then a tool_result row (which should be
|
|
1877
|
-
// ignored), then the LLM call. Expected turn_index = 1.
|
|
1878
|
-
db.run(
|
|
1879
|
-
`INSERT INTO messages (id, conversation_id, role, content, created_at) VALUES ('real-1', 'conv-tr', 'user', 'real text', 1000)`,
|
|
1880
|
-
);
|
|
1881
|
-
db.run(
|
|
1882
|
-
`INSERT INTO messages (id, conversation_id, role, content, created_at) VALUES ('tool-1', 'conv-tr', 'user', '[{"type":"tool_result","tool_use_id":"x","content":""}]', 1500)`,
|
|
1883
|
-
);
|
|
1884
|
-
insertEventAt(2000, { conversationId: "conv-tr" });
|
|
1885
|
-
|
|
1886
|
-
const events = queryUnreportedUsageEvents(0, undefined, 100);
|
|
1887
|
-
expect(events).toHaveLength(1);
|
|
1888
|
-
expect(events[0].turnIndex).toBe(1);
|
|
1889
|
-
});
|
|
1890
|
-
|
|
1891
|
-
test("turnIndex is 0 when the LLM call fires before any user message", () => {
|
|
1892
|
-
const db = getDb();
|
|
1893
|
-
const now = Date.now();
|
|
1894
|
-
db.run(
|
|
1895
|
-
`INSERT INTO conversations (id, conversation_type, created_at, updated_at) VALUES ('conv-early', 'standard', ${now}, ${now})`,
|
|
1896
|
-
);
|
|
1897
|
-
// LLM call fires at t=1000; first user message is at t=2000.
|
|
1898
|
-
insertEventAt(1000, { conversationId: "conv-early" });
|
|
1899
|
-
db.run(
|
|
1900
|
-
`INSERT INTO messages (id, conversation_id, role, content, created_at) VALUES ('later', 'conv-early', 'user', 'hi', 2000)`,
|
|
1901
|
-
);
|
|
1902
|
-
|
|
1903
|
-
const events = queryUnreportedUsageEvents(0, undefined, 100);
|
|
1904
|
-
expect(events).toHaveLength(1);
|
|
1905
|
-
// Conversation exists but no user turn has fired yet. The CASE
|
|
1906
|
-
// short-circuits only on null conversationId, so we get a real 0.
|
|
1907
|
-
// Analytics can treat 0 as "pre-first-turn" if needed.
|
|
1908
|
-
expect(events[0].turnIndex).toBe(0);
|
|
1909
|
-
});
|
|
1910
|
-
|
|
1911
|
-
// -------------------------------------------------------------------------
|
|
1912
|
-
// Parent linkage (parentConversationId + parentTurnIndex): subagent spawns
|
|
1913
|
-
// stamp `parent_conversation_id` on their background conversation; the
|
|
1914
|
-
// query resolves it (with a fork-parent fallback) so the reporter can
|
|
1915
|
-
// attribute the child's usage to the parent turn in flight at spawn.
|
|
1916
|
-
// -------------------------------------------------------------------------
|
|
1917
|
-
|
|
1918
|
-
test("parentConversationId links a subagent conversation and parentTurnIndex counts the parent turn in flight at spawn", () => {
|
|
1919
|
-
const db = getDb();
|
|
1920
|
-
// Parent user turns at t=1000 and t=3000; the child conversation is
|
|
1921
|
-
// created at t=2000, i.e. while the parent's turn 1 is in flight.
|
|
1922
|
-
db.run(
|
|
1923
|
-
`INSERT INTO conversations (id, conversation_type, created_at, updated_at) VALUES ('parent-1', 'standard', 500, 500)`,
|
|
1924
|
-
);
|
|
1925
|
-
db.run(
|
|
1926
|
-
`INSERT INTO messages (id, conversation_id, role, content, created_at) VALUES ('p1', 'parent-1', 'user', 'first', 1000)`,
|
|
1927
|
-
);
|
|
1928
|
-
db.run(
|
|
1929
|
-
`INSERT INTO messages (id, conversation_id, role, content, created_at) VALUES ('p2', 'parent-1', 'user', 'second', 3000)`,
|
|
1930
|
-
);
|
|
1931
|
-
db.run(
|
|
1932
|
-
`INSERT INTO conversations (id, conversation_type, created_at, updated_at, parent_conversation_id) VALUES ('child-1', 'background', 2000, 2000, 'parent-1')`,
|
|
1933
|
-
);
|
|
1934
|
-
// The usage event fires after the parent's turn 2, but attribution is
|
|
1935
|
-
// anchored to the child's creation time, not the event time.
|
|
1936
|
-
insertEventAt(5000, { conversationId: "child-1" });
|
|
1937
|
-
|
|
1938
|
-
const events = queryUnreportedUsageEvents(0, undefined, 100);
|
|
1939
|
-
expect(events).toHaveLength(1);
|
|
1940
|
-
expect(events[0].parentConversationId).toBe("parent-1");
|
|
1941
|
-
expect(events[0].parentTurnIndex).toBe(1);
|
|
1942
|
-
});
|
|
1943
|
-
|
|
1944
|
-
test("parent linkage falls back to fork_parent_conversation_id (retrospective forks)", () => {
|
|
1945
|
-
const db = getDb();
|
|
1946
|
-
db.run(
|
|
1947
|
-
`INSERT INTO conversations (id, conversation_type, created_at, updated_at) VALUES ('source-1', 'standard', 500, 500)`,
|
|
1948
|
-
);
|
|
1949
|
-
db.run(
|
|
1950
|
-
`INSERT INTO messages (id, conversation_id, role, content, created_at) VALUES ('s1', 'source-1', 'user', 'hello', 1000)`,
|
|
1951
|
-
);
|
|
1952
|
-
db.run(
|
|
1953
|
-
`INSERT INTO conversations (id, conversation_type, created_at, updated_at, fork_parent_conversation_id) VALUES ('retro-1', 'background', 2000, 2000, 'source-1')`,
|
|
1954
|
-
);
|
|
1955
|
-
insertEventAt(3000, { conversationId: "retro-1" });
|
|
1956
|
-
|
|
1957
|
-
const events = queryUnreportedUsageEvents(0, undefined, 100);
|
|
1958
|
-
expect(events).toHaveLength(1);
|
|
1959
|
-
expect(events[0].parentConversationId).toBe("source-1");
|
|
1960
|
-
expect(events[0].parentTurnIndex).toBe(1);
|
|
1961
|
-
});
|
|
1962
|
-
|
|
1963
|
-
test("fork parentTurnIndex anchors on the fork boundary message, not fork creation time", () => {
|
|
1964
|
-
const db = getDb();
|
|
1965
|
-
// Source conversation with turns at t=1000 and t=3000. The fork
|
|
1966
|
-
// branches from the FIRST turn (boundary message s1) but is created
|
|
1967
|
-
// at t=5000, after turn 2 exists — attribution must report turn 1.
|
|
1968
|
-
db.run(
|
|
1969
|
-
`INSERT INTO conversations (id, conversation_type, created_at, updated_at) VALUES ('source-2', 'standard', 500, 500)`,
|
|
1970
|
-
);
|
|
1971
|
-
db.run(
|
|
1972
|
-
`INSERT INTO messages (id, conversation_id, role, content, created_at) VALUES ('s2a', 'source-2', 'user', 'first', 1000)`,
|
|
1973
|
-
);
|
|
1974
|
-
db.run(
|
|
1975
|
-
`INSERT INTO messages (id, conversation_id, role, content, created_at) VALUES ('s2b', 'source-2', 'user', 'second', 3000)`,
|
|
1976
|
-
);
|
|
1977
|
-
db.run(
|
|
1978
|
-
`INSERT INTO conversations (id, conversation_type, created_at, updated_at, fork_parent_conversation_id, fork_parent_message_id) VALUES ('retro-2', 'background', 5000, 5000, 'source-2', 's2a')`,
|
|
1979
|
-
);
|
|
1980
|
-
insertEventAt(6000, { conversationId: "retro-2" });
|
|
1981
|
-
|
|
1982
|
-
const events = queryUnreportedUsageEvents(0, undefined, 100);
|
|
1983
|
-
expect(events).toHaveLength(1);
|
|
1984
|
-
expect(events[0].parentConversationId).toBe("source-2");
|
|
1985
|
-
expect(events[0].parentTurnIndex).toBe(1);
|
|
1986
|
-
});
|
|
1987
|
-
|
|
1988
|
-
test("user-initiated forks (standard type) do not inherit fork parent attribution", () => {
|
|
1989
|
-
const db = getDb();
|
|
1990
|
-
// A user forks a conversation: the fork stamps
|
|
1991
|
-
// fork_parent_conversation_id but is a first-class standard
|
|
1992
|
-
// conversation — its usage must not fold into the source turn.
|
|
1993
|
-
db.run(
|
|
1994
|
-
`INSERT INTO conversations (id, conversation_type, created_at, updated_at) VALUES ('source-3', 'standard', 500, 500)`,
|
|
1995
|
-
);
|
|
1996
|
-
db.run(
|
|
1997
|
-
`INSERT INTO messages (id, conversation_id, role, content, created_at) VALUES ('s3', 'source-3', 'user', 'hello', 1000)`,
|
|
1998
|
-
);
|
|
1999
|
-
db.run(
|
|
2000
|
-
`INSERT INTO conversations (id, conversation_type, created_at, updated_at, fork_parent_conversation_id, fork_parent_message_id) VALUES ('user-fork-1', 'standard', 2000, 2000, 'source-3', 's3')`,
|
|
2001
|
-
);
|
|
2002
|
-
insertEventAt(3000, { conversationId: "user-fork-1" });
|
|
2003
|
-
|
|
2004
|
-
const events = queryUnreportedUsageEvents(0, undefined, 100);
|
|
2005
|
-
expect(events).toHaveLength(1);
|
|
2006
|
-
expect(events[0].parentConversationId).toBeNull();
|
|
2007
|
-
expect(events[0].parentTurnIndex).toBeNull();
|
|
2008
|
-
});
|
|
2009
|
-
|
|
2010
|
-
test("parent fields are null for parentless conversations and no-conversation events", () => {
|
|
2011
|
-
const db = getDb();
|
|
2012
|
-
const now = Date.now();
|
|
2013
|
-
db.run(
|
|
2014
|
-
`INSERT INTO conversations (id, conversation_type, created_at, updated_at) VALUES ('conv-solo', 'background', ${now}, ${now})`,
|
|
2015
|
-
);
|
|
2016
|
-
insertEventAt(1000, { conversationId: "conv-solo" });
|
|
2017
|
-
insertEventAt(2000, { conversationId: null });
|
|
2018
|
-
|
|
2019
|
-
const events = queryUnreportedUsageEvents(0, undefined, 100);
|
|
2020
|
-
expect(events).toHaveLength(2);
|
|
2021
|
-
expect(events[0].parentConversationId).toBeNull();
|
|
2022
|
-
expect(events[0].parentTurnIndex).toBeNull();
|
|
2023
|
-
expect(events[1].parentConversationId).toBeNull();
|
|
2024
|
-
expect(events[1].parentTurnIndex).toBeNull();
|
|
2025
|
-
});
|
|
2026
|
-
|
|
2027
|
-
// -------------------------------------------------------------------------
|
|
2028
|
-
// Delegated-work decomposition (subagentRole + subagentSpawnMode). Every
|
|
2029
|
-
// subagent variety emits under `llm_call_site = "subagentSpawn"`, so these
|
|
2030
|
-
// two orthogonal columns, stamped on the conversation row at spawn, are
|
|
2031
|
-
// what make advisor consults, forks and regular spawns separable.
|
|
2032
|
-
// -------------------------------------------------------------------------
|
|
2033
|
-
|
|
2034
|
-
test("surfaces subagentRole and subagentSpawnMode from the child conversation", () => {
|
|
2035
|
-
const db = getDb();
|
|
2036
|
-
db.run(
|
|
2037
|
-
`INSERT INTO conversations (id, conversation_type, created_at, updated_at, parent_conversation_id, subagent_role, subagent_spawn_mode) VALUES ('advisor-child', 'background', 1000, 1000, 'parent-1', 'advisor', 'advisor_consult')`,
|
|
2038
|
-
);
|
|
2039
|
-
insertEventAt(2000, { conversationId: "advisor-child" });
|
|
2040
|
-
|
|
2041
|
-
const events = queryUnreportedUsageEvents(0, undefined, 100);
|
|
2042
|
-
expect(events).toHaveLength(1);
|
|
2043
|
-
expect(events[0].subagentRole).toBe("advisor");
|
|
2044
|
-
expect(events[0].subagentSpawnMode).toBe("advisor_consult");
|
|
2045
|
-
});
|
|
2046
|
-
|
|
2047
|
-
test("role and spawn mode are independent: a general subagent can be regular or forked", () => {
|
|
2048
|
-
const db = getDb();
|
|
2049
|
-
db.run(
|
|
2050
|
-
`INSERT INTO conversations (id, conversation_type, created_at, updated_at, subagent_role, subagent_spawn_mode) VALUES ('plain-child', 'background', 1000, 1000, 'general', 'regular')`,
|
|
2051
|
-
);
|
|
2052
|
-
db.run(
|
|
2053
|
-
`INSERT INTO conversations (id, conversation_type, created_at, updated_at, subagent_role, subagent_spawn_mode) VALUES ('forked-child', 'background', 1000, 1000, 'general', 'fork')`,
|
|
2054
|
-
);
|
|
2055
|
-
insertEventAt(2000, { conversationId: "plain-child" });
|
|
2056
|
-
insertEventAt(3000, { conversationId: "forked-child" });
|
|
2057
|
-
|
|
2058
|
-
const events = queryUnreportedUsageEvents(0, undefined, 100);
|
|
2059
|
-
expect(events).toHaveLength(2);
|
|
2060
|
-
expect(events[0].subagentRole).toBe("general");
|
|
2061
|
-
expect(events[0].subagentSpawnMode).toBe("regular");
|
|
2062
|
-
expect(events[1].subagentRole).toBe("general");
|
|
2063
|
-
expect(events[1].subagentSpawnMode).toBe("fork");
|
|
2064
|
-
});
|
|
2065
|
-
|
|
2066
|
-
test("subagent fields are null for ordinary conversations and no-conversation events", () => {
|
|
2067
|
-
const db = getDb();
|
|
2068
|
-
db.run(
|
|
2069
|
-
`INSERT INTO conversations (id, conversation_type, created_at, updated_at) VALUES ('conv-plain', 'standard', 500, 500)`,
|
|
2070
|
-
);
|
|
2071
|
-
insertEventAt(1000, { conversationId: "conv-plain" });
|
|
2072
|
-
insertEventAt(2000, { conversationId: null });
|
|
2073
|
-
|
|
2074
|
-
const events = queryUnreportedUsageEvents(0, undefined, 100);
|
|
2075
|
-
expect(events).toHaveLength(2);
|
|
2076
|
-
expect(events[0].subagentRole).toBeNull();
|
|
2077
|
-
expect(events[0].subagentSpawnMode).toBeNull();
|
|
2078
|
-
expect(events[1].subagentRole).toBeNull();
|
|
2079
|
-
expect(events[1].subagentSpawnMode).toBeNull();
|
|
2080
|
-
});
|
|
2081
|
-
|
|
2082
|
-
test("surfaces llmCallCount on unreported events", () => {
|
|
2083
|
-
insertEventAt(1000, { llmCallCount: 4 });
|
|
2084
|
-
insertEventAt(2000, {});
|
|
2085
|
-
|
|
2086
|
-
const events = queryUnreportedUsageEvents(0, undefined, 100);
|
|
2087
|
-
expect(events).toHaveLength(2);
|
|
2088
|
-
expect(events[0].llmCallCount).toBe(4);
|
|
2089
|
-
// recordUsageEvent defaults llmCallCount to 1 when unset.
|
|
2090
|
-
expect(events[1].llmCallCount).toBe(1);
|
|
2091
|
-
});
|
|
2092
|
-
|
|
2093
|
-
test("surfaces raw_usage on unreported events", () => {
|
|
2094
|
-
// The telemetry reporter consumes `queryUnreportedUsageEvents` output
|
|
2095
|
-
// directly and forwards it to BigQuery. If the SELECT projection
|
|
2096
|
-
// drops the `raw_usage` column, every provider-specific detail
|
|
2097
|
-
// (Anthropic TTL breakdown, OpenAI prompt-token details, etc.)
|
|
2098
|
-
// vanishes silently — covered here so a refactor of the projection
|
|
2099
|
-
// can't regress the wire shape.
|
|
2100
|
-
const rawUsage = {
|
|
2101
|
-
input_tokens: 1500,
|
|
2102
|
-
output_tokens: 600,
|
|
2103
|
-
cache_creation_input_tokens: 800,
|
|
2104
|
-
cache_creation: {
|
|
2105
|
-
ephemeral_5m_input_tokens: 300,
|
|
2106
|
-
ephemeral_1h_input_tokens: 500,
|
|
2107
|
-
},
|
|
2108
|
-
};
|
|
2109
|
-
insertEventAt(1000, {
|
|
2110
|
-
cacheCreationInputTokens: 800,
|
|
2111
|
-
rawUsage,
|
|
2112
|
-
});
|
|
2113
|
-
|
|
2114
|
-
const events = queryUnreportedUsageEvents(0, undefined, 100);
|
|
2115
|
-
expect(events).toHaveLength(1);
|
|
2116
|
-
expect(events[0].cacheCreationInputTokens).toBe(800);
|
|
2117
|
-
expect(events[0].rawUsage).toEqual(rawUsage);
|
|
2118
|
-
});
|
|
2119
|
-
});
|
|
2120
|
-
|
|
2121
|
-
// ---------------------------------------------------------------------------
|
|
2122
|
-
// Record-time assistantVersion stamping (May 2026 telemetry honesty fix)
|
|
2123
|
-
//
|
|
2124
|
-
// Events buffered while the assistant is offline must remember the binary
|
|
2125
|
-
// that was running when they were recorded, not the one that finally
|
|
2126
|
-
// uploads them. recordUsageEvent stamps APP_VERSION at insert time and the
|
|
2127
|
-
// query must return it so the reporter can put it on the wire.
|
|
2128
|
-
// ---------------------------------------------------------------------------
|
|
2129
|
-
|
|
2130
|
-
describe("recordUsageEvent — assistantVersion stamping", () => {
|
|
2131
|
-
beforeEach(() => {
|
|
2132
|
-
const db = getDb();
|
|
2133
|
-
db.run(`DELETE FROM llm_usage_events`);
|
|
2134
|
-
});
|
|
2135
|
-
|
|
2136
|
-
test("stamps APP_VERSION on the returned event", async () => {
|
|
2137
|
-
const { APP_VERSION } = await import("../version.js");
|
|
2138
|
-
const event = recordUsageEvent(makeInput(), pricedResult);
|
|
2139
|
-
expect(event.assistantVersion).toBe(APP_VERSION);
|
|
2140
|
-
});
|
|
2141
|
-
|
|
2142
|
-
test("persists assistantVersion and queryUnreportedUsageEvents returns it", async () => {
|
|
2143
|
-
const { APP_VERSION } = await import("../version.js");
|
|
2144
|
-
insertEventAt(1000);
|
|
2145
|
-
const [event] = queryUnreportedUsageEvents(0, undefined, 100);
|
|
2146
|
-
expect(event).toBeDefined();
|
|
2147
|
-
expect(event.assistantVersion).toBe(APP_VERSION);
|
|
2148
|
-
});
|
|
2149
|
-
|
|
2150
|
-
test("legacy rows (null assistant_version column) round-trip as null", () => {
|
|
2151
|
-
// Simulate a row that was persisted before migration 267 ran by
|
|
2152
|
-
// inserting one through recordUsageEvent and then nulling the
|
|
2153
|
-
// column out. This mirrors what production rows look like before
|
|
2154
|
-
// the migration backfills `null`s; the reporter must accept them
|
|
2155
|
-
// and let the cloud fall back to the envelope's version.
|
|
2156
|
-
insertEventAt(1000);
|
|
2157
|
-
const db = getDb();
|
|
2158
|
-
db.run(`UPDATE llm_usage_events SET assistant_version = NULL`);
|
|
2159
|
-
|
|
2160
|
-
const [event] = queryUnreportedUsageEvents(0, undefined, 100);
|
|
2161
|
-
expect(event).toBeDefined();
|
|
2162
|
-
expect(event.assistantVersion).toBeNull();
|
|
2163
|
-
});
|
|
2164
|
-
});
|
|
@@ -19,7 +19,7 @@ import { initializeDb } from "../persistence/db-init.js";
|
|
|
19
19
|
import { llmUsageEvents } from "../persistence/schema/index.js";
|
|
20
20
|
import { assistantEventHub } from "../runtime/assistant-event-hub.js";
|
|
21
21
|
import { ROUTES } from "../runtime/routes/log-export-routes.js";
|
|
22
|
-
import { getLogsDir } from "../util/
|
|
22
|
+
import { getLogsDir } from "../util/layout.js";
|
|
23
23
|
|
|
24
24
|
await initializeDb();
|
|
25
25
|
|
|
@@ -101,20 +101,13 @@ const configGetRoute = findRoute("config_get");
|
|
|
101
101
|
const configPatchRoute = findRoute("config_patch");
|
|
102
102
|
const configSetRoute = findRoute("config_set");
|
|
103
103
|
|
|
104
|
-
function withoutWireProfiles(
|
|
105
|
-
result: Record<string, unknown>,
|
|
106
|
-
): Record<string, unknown> {
|
|
107
|
-
const { llm: _llm, ...rest } = result;
|
|
108
|
-
return rest;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
104
|
describe("MCP config secret boundary", () => {
|
|
112
105
|
beforeEach(() => {
|
|
113
106
|
seedRawConfig({});
|
|
114
107
|
rmSync(mcpJsonPath(), { force: true });
|
|
115
108
|
});
|
|
116
109
|
|
|
117
|
-
test("config_get
|
|
110
|
+
test("config_get serves no mcp subtree — workspace mcp.json headers never reach the config wire", () => {
|
|
118
111
|
seedWorkspaceMcp({
|
|
119
112
|
mcpServers: {
|
|
120
113
|
remote: {
|
|
@@ -132,16 +125,10 @@ describe("MCP config secret boundary", () => {
|
|
|
132
125
|
|
|
133
126
|
expect(JSON.stringify(result)).not.toContain("mcp-secret");
|
|
134
127
|
expect(JSON.stringify(result)).not.toContain("mcp-api-secret");
|
|
135
|
-
|
|
136
|
-
servers: { remote: { transport: Record<string, unknown> } };
|
|
137
|
-
};
|
|
138
|
-
expect(mcp.servers.remote.transport).toEqual({
|
|
139
|
-
type: "streamable-http",
|
|
140
|
-
url: "https://mcp.example.com",
|
|
141
|
-
});
|
|
128
|
+
expect(result.mcp).toBeUndefined();
|
|
142
129
|
});
|
|
143
130
|
|
|
144
|
-
test("config_get
|
|
131
|
+
test("config_get drops leftover config.json mcp so its headers cannot leak", () => {
|
|
145
132
|
seedRawConfig({
|
|
146
133
|
mcp: {
|
|
147
134
|
servers: {
|
|
@@ -159,12 +146,10 @@ describe("MCP config secret boundary", () => {
|
|
|
159
146
|
const result = configGetRoute.handler({}) as Record<string, unknown>;
|
|
160
147
|
|
|
161
148
|
expect(JSON.stringify(result)).not.toContain("leftover-secret");
|
|
162
|
-
expect(
|
|
163
|
-
(result.mcp as { servers: Record<string, unknown> }).servers,
|
|
164
|
-
).toEqual({});
|
|
149
|
+
expect(result.mcp).toBeUndefined();
|
|
165
150
|
});
|
|
166
151
|
|
|
167
|
-
test("config_get
|
|
152
|
+
test("config_get ignores workspace mcp.json even when a server is named headers", () => {
|
|
168
153
|
seedWorkspaceMcp({
|
|
169
154
|
mcpServers: {
|
|
170
155
|
headers: {
|
|
@@ -176,19 +161,10 @@ describe("MCP config secret boundary", () => {
|
|
|
176
161
|
|
|
177
162
|
const result = configGetRoute.handler({}) as Record<string, unknown>;
|
|
178
163
|
|
|
179
|
-
expect(
|
|
180
|
-
servers: {
|
|
181
|
-
headers: {
|
|
182
|
-
transport: {
|
|
183
|
-
type: "streamable-http",
|
|
184
|
-
url: "https://mcp.example.com",
|
|
185
|
-
},
|
|
186
|
-
},
|
|
187
|
-
},
|
|
188
|
-
});
|
|
164
|
+
expect(result.mcp).toBeUndefined();
|
|
189
165
|
});
|
|
190
166
|
|
|
191
|
-
test("config_get
|
|
167
|
+
test("config_get ignores workspace mcp.json env vars (the MCP API serves them)", () => {
|
|
192
168
|
seedWorkspaceMcp({
|
|
193
169
|
mcpServers: {
|
|
194
170
|
local: {
|
|
@@ -203,20 +179,7 @@ describe("MCP config secret boundary", () => {
|
|
|
203
179
|
|
|
204
180
|
const result = configGetRoute.handler({}) as Record<string, unknown>;
|
|
205
181
|
|
|
206
|
-
expect(
|
|
207
|
-
servers: {
|
|
208
|
-
local: {
|
|
209
|
-
transport: {
|
|
210
|
-
type: "stdio",
|
|
211
|
-
command: "npx",
|
|
212
|
-
args: [],
|
|
213
|
-
env: {
|
|
214
|
-
headers: "not-a-transport-header",
|
|
215
|
-
},
|
|
216
|
-
},
|
|
217
|
-
},
|
|
218
|
-
},
|
|
219
|
-
});
|
|
182
|
+
expect(result.mcp).toBeUndefined();
|
|
220
183
|
});
|
|
221
184
|
|
|
222
185
|
test("config_patch strips MCP transport headers so generic writes cannot persist plaintext credentials", async () => {
|
|
@@ -237,12 +200,10 @@ describe("MCP config secret boundary", () => {
|
|
|
237
200
|
});
|
|
238
201
|
|
|
239
202
|
// `mcp` is not an AssistantConfigSchema key: the write's schema parse
|
|
240
|
-
// strips it, so the secret never reaches disk — and the response
|
|
241
|
-
//
|
|
203
|
+
// strips it, so the secret never reaches disk — and the response
|
|
204
|
+
// echoes no such subtree either.
|
|
242
205
|
expect(committedRaw()?.mcp).toBeUndefined();
|
|
243
|
-
expect(
|
|
244
|
-
(result as { mcp: { servers: Record<string, unknown> } }).mcp.servers,
|
|
245
|
-
).toEqual({});
|
|
206
|
+
expect(result).not.toHaveProperty("mcp");
|
|
246
207
|
});
|
|
247
208
|
|
|
248
209
|
test("config_patch strips mcp so a full-config round trip cannot write it back", async () => {
|
|
@@ -262,9 +223,7 @@ describe("MCP config secret boundary", () => {
|
|
|
262
223
|
});
|
|
263
224
|
|
|
264
225
|
expect(committedRaw()?.mcp).toBeUndefined();
|
|
265
|
-
expect(
|
|
266
|
-
(result as { mcp: { servers: Record<string, unknown> } }).mcp.servers,
|
|
267
|
-
).toEqual({});
|
|
226
|
+
expect(result).not.toHaveProperty("mcp");
|
|
268
227
|
});
|
|
269
228
|
|
|
270
229
|
test("config_set drops MCP server writes", async () => {
|
|
@@ -75,7 +75,7 @@ setWorkspaceMcp({
|
|
|
75
75
|
},
|
|
76
76
|
});
|
|
77
77
|
|
|
78
|
-
const { getWorkspacePluginsDir } = await import("../util/
|
|
78
|
+
const { getWorkspacePluginsDir } = await import("../util/layout.js");
|
|
79
79
|
const { ROUTES } = await import("../runtime/routes/mcp-auth-routes.js");
|
|
80
80
|
|
|
81
81
|
const listHandler = ROUTES.find(
|
|
@@ -15,7 +15,7 @@ import { afterEach, beforeEach, describe, expect, test } from "bun:test";
|
|
|
15
15
|
|
|
16
16
|
import { getConfig } from "../config/loader.js";
|
|
17
17
|
import { getMemoryConfig } from "../plugins/defaults/memory/config.js";
|
|
18
|
-
import { getWorkspaceConfigPath } from "../util/
|
|
18
|
+
import { getWorkspaceConfigPath } from "../util/layout.js";
|
|
19
19
|
|
|
20
20
|
const configPath = getWorkspaceConfigPath();
|
|
21
21
|
const savedIsPlatform = process.env.IS_CLOUD;
|
|
@@ -29,7 +29,7 @@ import { afterEach, beforeEach, describe, expect, test } from "bun:test";
|
|
|
29
29
|
import { memoryInjectors } from "../plugins/defaults/memory/injectors.js";
|
|
30
30
|
import type { Injector, TurnContext } from "../plugins/types.js";
|
|
31
31
|
import type { Message } from "../providers/types.js";
|
|
32
|
-
import { getWorkspacePromptPath } from "../util/
|
|
32
|
+
import { getWorkspacePromptPath } from "../util/layout.js";
|
|
33
33
|
|
|
34
34
|
function findInjector(name: string): Injector {
|
|
35
35
|
const injector = memoryInjectors.find((i) => i.name === name);
|
|
@@ -65,8 +65,6 @@ const BASELINE: Readonly<Record<string, number>> = {
|
|
|
65
65
|
"src/runtime/pre-first-message-gate.ts": 1,
|
|
66
66
|
"src/runtime/routes/log-export-routes.ts": 1,
|
|
67
67
|
"src/runtime/routes/surface-conversation-resolver.ts": 2,
|
|
68
|
-
"src/telemetry/turn-events-store.ts": 2,
|
|
69
|
-
"src/telemetry/turn-trace-store.ts": 2,
|
|
70
68
|
"src/workspace/migrations/rebuild-conversation-disk-view.ts": 1,
|
|
71
69
|
};
|
|
72
70
|
|