@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,399 +0,0 @@
|
|
|
1
|
-
import { and, asc, eq, gt, lt, lte, or, sql } from "drizzle-orm";
|
|
2
|
-
|
|
3
|
-
import { findConversation } from "../daemon/conversation-registry.js";
|
|
4
|
-
import { getDb } from "../persistence/db-connection.js";
|
|
5
|
-
import { realUserTurnContentFilter } from "../persistence/real-user-turn-filter.js";
|
|
6
|
-
import { messages, toolInvocations } from "../persistence/schema/index.js";
|
|
7
|
-
import { getLogger } from "../util/logger.js";
|
|
8
|
-
import type {
|
|
9
|
-
TurnTrace,
|
|
10
|
-
TurnTraceMessage,
|
|
11
|
-
TurnTraceToolCall,
|
|
12
|
-
TurnTraceToolDefinition,
|
|
13
|
-
} from "./types.js";
|
|
14
|
-
|
|
15
|
-
const log = getLogger("turn-trace-store");
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Identifies the user message a trace is being assembled for. Mirrors the
|
|
19
|
-
* `(createdAt, id)` compound cursor the turn-event stream uses so the window
|
|
20
|
-
* boundaries line up exactly.
|
|
21
|
-
*/
|
|
22
|
-
export interface TurnTraceBoundary {
|
|
23
|
-
conversationId: string;
|
|
24
|
-
/** `messages.id` of the real user turn that opens this turn. */
|
|
25
|
-
userMessageId: string;
|
|
26
|
-
/** `messages.created_at` of that user message. */
|
|
27
|
-
userMessageCreatedAt: number;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/** Parse a stored `messages.content` string into its JSON value, verbatim. */
|
|
31
|
-
function parseStoredContent(raw: string): unknown {
|
|
32
|
-
try {
|
|
33
|
-
return JSON.parse(raw) as unknown;
|
|
34
|
-
} catch {
|
|
35
|
-
// Legacy rows stored a plain (non-JSON) string. Forward as-is.
|
|
36
|
-
return raw;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Extract the served model from a stored `messages.metadata` string. The daemon
|
|
42
|
-
* persists `metadata.model` with the finalized content of each assistant row
|
|
43
|
-
* (the `message_complete` event's `response.model`); returns null for rows
|
|
44
|
-
* without it — user rows, tool-result rows, synthetic assistant rows, and
|
|
45
|
-
* historical rows persisted before model stamping — or when the metadata JSON
|
|
46
|
-
* is absent/malformed.
|
|
47
|
-
*/
|
|
48
|
-
function parseStoredModel(raw: string | null): string | null {
|
|
49
|
-
if (raw == null) {
|
|
50
|
-
return null;
|
|
51
|
-
}
|
|
52
|
-
try {
|
|
53
|
-
const parsed = JSON.parse(raw) as unknown;
|
|
54
|
-
if (parsed != null && typeof parsed === "object" && "model" in parsed) {
|
|
55
|
-
const model = (parsed as { model?: unknown }).model;
|
|
56
|
-
return typeof model === "string" ? model : null;
|
|
57
|
-
}
|
|
58
|
-
return null;
|
|
59
|
-
} catch {
|
|
60
|
-
return null;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/** Compound `(createdAt, id)` boundary of the next real user turn. */
|
|
65
|
-
interface NextTurnBoundary {
|
|
66
|
-
createdAt: number;
|
|
67
|
-
id: string;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Find the next real user turn strictly after the given boundary in the same
|
|
72
|
-
* conversation, by the same `(createdAt, id)` cursor the turn-event stream
|
|
73
|
-
* uses. Returns `null` when the boundary is the latest real user turn (the
|
|
74
|
-
* window then runs to the end of the conversation).
|
|
75
|
-
*
|
|
76
|
-
* Returns the next turn's `id` alongside its `createdAt` so the window upper
|
|
77
|
-
* bound is a compound `(createdAt, id)` comparison. Two real user messages can
|
|
78
|
-
* share a `created_at` (forked conversations preserve the source `created_at`
|
|
79
|
-
* with fresh ids; `monotonicNow()` only guarantees monotonicity within a single
|
|
80
|
-
* process), so a timestamp-only upper bound would equal the current turn's own
|
|
81
|
-
* `created_at` and truncate the trace.
|
|
82
|
-
*
|
|
83
|
-
* "Next real user turn" excludes tool-result rows persisted with role="user"
|
|
84
|
-
* (same filter as the turn-event stream), so a turn that issued tool calls —
|
|
85
|
-
* whose results land as role="user" rows — is not truncated at its own tool
|
|
86
|
-
* results.
|
|
87
|
-
*/
|
|
88
|
-
function nextRealUserTurn(
|
|
89
|
-
boundary: TurnTraceBoundary,
|
|
90
|
-
): NextTurnBoundary | null {
|
|
91
|
-
const db = getDb();
|
|
92
|
-
const row = db
|
|
93
|
-
.select({ createdAt: messages.createdAt, id: messages.id })
|
|
94
|
-
.from(messages)
|
|
95
|
-
.where(
|
|
96
|
-
and(
|
|
97
|
-
eq(messages.conversationId, boundary.conversationId),
|
|
98
|
-
eq(messages.role, "user"),
|
|
99
|
-
realUserTurnContentFilter("messages"),
|
|
100
|
-
or(
|
|
101
|
-
gt(messages.createdAt, boundary.userMessageCreatedAt),
|
|
102
|
-
and(
|
|
103
|
-
eq(messages.createdAt, boundary.userMessageCreatedAt),
|
|
104
|
-
gt(messages.id, boundary.userMessageId),
|
|
105
|
-
),
|
|
106
|
-
),
|
|
107
|
-
),
|
|
108
|
-
)
|
|
109
|
-
.orderBy(asc(messages.createdAt), asc(messages.id))
|
|
110
|
-
.limit(1)
|
|
111
|
-
.get();
|
|
112
|
-
return row ?? null;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* Whether a turn is COMPLETE — its own assistant response has finished and the
|
|
117
|
-
* full transcript is durably persisted — so its trace can be assembled without
|
|
118
|
-
* risk of capturing a partial mid-turn snapshot.
|
|
119
|
-
*
|
|
120
|
-
* A turn is settled iff its live conversation is not actively processing.
|
|
121
|
-
* `Conversation.isProcessing()` is flipped to `false` in the agent-loop
|
|
122
|
-
* `finally` *after* the awaited turn-boundary commit, so a non-processing
|
|
123
|
-
* conversation has no in-flight response and all of its persisted turn rows are
|
|
124
|
-
* durable. A conversation absent from the live registry (evicted, or never
|
|
125
|
-
* loaded this process) has no in-flight turn either, so it reads as settled —
|
|
126
|
-
* including after a restart, where a turn that was mid-flight when the process
|
|
127
|
-
* died reads as settled because no more rows are coming.
|
|
128
|
-
*
|
|
129
|
-
* Why this gates on processing for EVERY turn, not just the latest: a
|
|
130
|
-
* "successor real user turn exists ⟹ settled" shortcut is unsound in the
|
|
131
|
-
* batched-message path. When queued messages drain as a batch, `drainBatch`
|
|
132
|
-
* (daemon/conversation-process.ts) persists the head user row AND the tail user
|
|
133
|
-
* rows up front, then runs ONE shared `runAgentLoop` whose response is
|
|
134
|
-
* broadcast to all of them. So the batched HEAD turn has a later real user row
|
|
135
|
-
* (a tail) while the shared response and its tool calls are still in flight —
|
|
136
|
-
* the shortcut would mark the head settled and ship a trace missing the shared
|
|
137
|
-
* response, never retried. Gating on `isProcessing()` defers the head (and any
|
|
138
|
-
* backlog) until the shared response completes and the conversation goes idle.
|
|
139
|
-
*
|
|
140
|
-
* Turns are serialized per conversation and `isProcessing()` is per-response,
|
|
141
|
-
* so the conversation is idle between turns and completed past turns settle
|
|
142
|
-
* promptly; the only cost is that a just-finished turn waits for the current
|
|
143
|
-
* response when one started before it could be reported — minimal latency,
|
|
144
|
-
* preferred over shipping a partial trace.
|
|
145
|
-
*
|
|
146
|
-
* The `isProcessing()` read relies on the daemon's in-memory state, so the
|
|
147
|
-
* reporter and the agent loop share one process (they do — both live in the
|
|
148
|
-
* daemon).
|
|
149
|
-
*/
|
|
150
|
-
export function isTurnSettled(boundary: TurnTraceBoundary): boolean {
|
|
151
|
-
return findConversation(boundary.conversationId)?.isProcessing() !== true;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
/** Message rows belonging to the turn window, oldest-first. */
|
|
155
|
-
function queryTurnMessages(
|
|
156
|
-
boundary: TurnTraceBoundary,
|
|
157
|
-
nextTurn: NextTurnBoundary | null,
|
|
158
|
-
): TurnTraceMessage[] {
|
|
159
|
-
const db = getDb();
|
|
160
|
-
// Lower bound: the user message itself (inclusive), using the same
|
|
161
|
-
// `(createdAt, id)` lex-comparison as the cursor so a row sharing the
|
|
162
|
-
// user message's millisecond isn't dropped.
|
|
163
|
-
const lowerBound = or(
|
|
164
|
-
gt(messages.createdAt, boundary.userMessageCreatedAt),
|
|
165
|
-
and(
|
|
166
|
-
eq(messages.createdAt, boundary.userMessageCreatedAt),
|
|
167
|
-
sql`${messages.id} >= ${boundary.userMessageId}`,
|
|
168
|
-
),
|
|
169
|
-
);
|
|
170
|
-
// Upper bound: strictly before the next real user turn, using the same
|
|
171
|
-
// compound `(createdAt, id)` comparison. A timestamp-only bound would empty
|
|
172
|
-
// the window when the next user turn shares this turn's `created_at`.
|
|
173
|
-
const upperBound =
|
|
174
|
-
nextTurn == null
|
|
175
|
-
? undefined
|
|
176
|
-
: or(
|
|
177
|
-
lt(messages.createdAt, nextTurn.createdAt),
|
|
178
|
-
and(
|
|
179
|
-
eq(messages.createdAt, nextTurn.createdAt),
|
|
180
|
-
sql`${messages.id} < ${nextTurn.id}`,
|
|
181
|
-
),
|
|
182
|
-
);
|
|
183
|
-
|
|
184
|
-
const rows = db
|
|
185
|
-
.select({
|
|
186
|
-
id: messages.id,
|
|
187
|
-
role: messages.role,
|
|
188
|
-
content: messages.content,
|
|
189
|
-
createdAt: messages.createdAt,
|
|
190
|
-
metadata: messages.metadata,
|
|
191
|
-
})
|
|
192
|
-
.from(messages)
|
|
193
|
-
.where(
|
|
194
|
-
and(
|
|
195
|
-
eq(messages.conversationId, boundary.conversationId),
|
|
196
|
-
lowerBound,
|
|
197
|
-
...(upperBound ? [upperBound] : []),
|
|
198
|
-
),
|
|
199
|
-
)
|
|
200
|
-
.orderBy(asc(messages.createdAt), asc(messages.id))
|
|
201
|
-
.all();
|
|
202
|
-
|
|
203
|
-
return rows.map((r) => ({
|
|
204
|
-
id: r.id,
|
|
205
|
-
role: r.role,
|
|
206
|
-
created_at: r.createdAt,
|
|
207
|
-
content: parseStoredContent(r.content),
|
|
208
|
-
model: parseStoredModel(r.metadata),
|
|
209
|
-
}));
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
/**
|
|
213
|
-
* Parse a stored tool-invocation input verbatim.
|
|
214
|
-
*
|
|
215
|
-
* The consented trace is full-fidelity: the input is forwarded exactly as
|
|
216
|
-
* stored (structured JSON when it parses, raw string otherwise — symmetric
|
|
217
|
-
* with how message content is handled). No field-level redaction is applied;
|
|
218
|
-
* the protections for this PII are the consent gate, the PII-segregated
|
|
219
|
-
* `pii_turn_raw` table, and its 30-day TTL.
|
|
220
|
-
*/
|
|
221
|
-
function parseToolInput(raw: string): unknown {
|
|
222
|
-
try {
|
|
223
|
-
return JSON.parse(raw) as unknown;
|
|
224
|
-
} catch {
|
|
225
|
-
// Non-JSON input — forward the raw string verbatim.
|
|
226
|
-
return raw;
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
/**
|
|
231
|
-
* Tool invocations recorded inside the turn window, oldest-first.
|
|
232
|
-
*
|
|
233
|
-
* `tool_invocations` has no message-id link and its ids are unrelated to
|
|
234
|
-
* `messages.id`, so the window is correlated purely by `created_at`:
|
|
235
|
-
* `[userMessageCreatedAt, nextTurn.createdAt)`. The lower bound is inclusive
|
|
236
|
-
* (a tool can fire in the same millisecond as the user message).
|
|
237
|
-
*
|
|
238
|
-
* Degenerate same-`created_at` case: when the next real user turn shares this
|
|
239
|
-
* turn's `created_at`, a strict `<` upper bound yields an empty `[X, X)` window
|
|
240
|
-
* and drops this turn's same-millisecond tools. In that case the upper bound is
|
|
241
|
-
* widened to `<=` so those tools are retained. Same-millisecond tools cannot be
|
|
242
|
-
* attributed to one of two colliding user turns by timestamp alone; including
|
|
243
|
-
* them in the earlier turn matches the message window (which keeps this turn's
|
|
244
|
-
* rows at that millisecond) and is the conservative choice for a diagnostic
|
|
245
|
-
* trace.
|
|
246
|
-
*/
|
|
247
|
-
function queryTurnToolCalls(
|
|
248
|
-
boundary: TurnTraceBoundary,
|
|
249
|
-
nextTurn: NextTurnBoundary | null,
|
|
250
|
-
): TurnTraceToolCall[] {
|
|
251
|
-
const db = getDb();
|
|
252
|
-
let upperBound;
|
|
253
|
-
if (nextTurn == null) {
|
|
254
|
-
upperBound = undefined;
|
|
255
|
-
} else if (nextTurn.createdAt <= boundary.userMessageCreatedAt) {
|
|
256
|
-
// Next turn collides on (or, defensively, predates) this turn's
|
|
257
|
-
// millisecond — keep tools at that millisecond instead of emptying the
|
|
258
|
-
// window.
|
|
259
|
-
upperBound = lte(toolInvocations.createdAt, nextTurn.createdAt);
|
|
260
|
-
} else {
|
|
261
|
-
upperBound = lt(toolInvocations.createdAt, nextTurn.createdAt);
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
const rows = db
|
|
265
|
-
.select({
|
|
266
|
-
id: toolInvocations.id,
|
|
267
|
-
toolName: toolInvocations.toolName,
|
|
268
|
-
input: toolInvocations.input,
|
|
269
|
-
result: toolInvocations.result,
|
|
270
|
-
decision: toolInvocations.decision,
|
|
271
|
-
durationMs: toolInvocations.durationMs,
|
|
272
|
-
createdAt: toolInvocations.createdAt,
|
|
273
|
-
})
|
|
274
|
-
.from(toolInvocations)
|
|
275
|
-
.where(
|
|
276
|
-
and(
|
|
277
|
-
eq(toolInvocations.conversationId, boundary.conversationId),
|
|
278
|
-
sql`${toolInvocations.createdAt} >= ${boundary.userMessageCreatedAt}`,
|
|
279
|
-
...(upperBound ? [upperBound] : []),
|
|
280
|
-
),
|
|
281
|
-
)
|
|
282
|
-
.orderBy(asc(toolInvocations.createdAt), asc(toolInvocations.id))
|
|
283
|
-
.all();
|
|
284
|
-
|
|
285
|
-
return rows.map((r) => ({
|
|
286
|
-
id: r.id,
|
|
287
|
-
tool_name: r.toolName,
|
|
288
|
-
input: parseToolInput(r.input),
|
|
289
|
-
result: r.result,
|
|
290
|
-
decision: r.decision,
|
|
291
|
-
duration_ms: r.durationMs,
|
|
292
|
-
created_at: r.createdAt,
|
|
293
|
-
}));
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
/**
|
|
297
|
-
* Assemble the full transcript for one turn: the user message, the assistant
|
|
298
|
-
* response message(s), any intervening tool-result rows, and the tool
|
|
299
|
-
* invocations recorded for the turn — bounded to the window between this real
|
|
300
|
-
* user turn and the next one.
|
|
301
|
-
*
|
|
302
|
-
* The trace is each turn's natural window. A turn whose own window holds no
|
|
303
|
-
* assistant response (a coalesced-batch head, or a turn that failed/cancelled
|
|
304
|
-
* before producing a response) traces user-only, which is faithful: its window
|
|
305
|
-
* genuinely has no response. A coalesced batch's shared response lives on the
|
|
306
|
-
* batch's FINAL turn's window — exactly where the daemon already attributes it
|
|
307
|
-
* (via `lastUserMessageId` / `llm_usage` / `turn_index`). Which case an empty
|
|
308
|
-
* window is (batched vs failed vs cancelled) is recorded durably on the user
|
|
309
|
-
* message row (`messages.metadata.turnOutcome`, written by `stampTurnOutcome`)
|
|
310
|
-
* and rides the turn event's `outcome` field — the trace itself stays the
|
|
311
|
-
* plain window and attempts no inference.
|
|
312
|
-
*
|
|
313
|
-
* Read-only; touches only existing tables (`messages`, `tool_invocations`), so
|
|
314
|
-
* no migration is involved. Caller is responsible for the consent gate and the
|
|
315
|
-
* serialized-size cap — this function always returns a faithful trace for the
|
|
316
|
-
* window.
|
|
317
|
-
*/
|
|
318
|
-
export function assembleTurnTrace(boundary: TurnTraceBoundary): TurnTrace {
|
|
319
|
-
const nextTurn = nextRealUserTurn(boundary);
|
|
320
|
-
const conversation = findConversation(boundary.conversationId);
|
|
321
|
-
|
|
322
|
-
// System prompt and tool definitions are read from the live conversation's
|
|
323
|
-
// cached state — the same values the agent loop used for this turn. When the
|
|
324
|
-
// conversation has been evicted (e.g. after a daemon restart), these fall
|
|
325
|
-
// back to null / empty, which is faithful: we no longer have the values.
|
|
326
|
-
// (Model is read durably from `messages.metadata`, not from live state, so it
|
|
327
|
-
// survives eviction — see `queryTurnMessages`.)
|
|
328
|
-
const systemPrompt = conversation?.getCurrentSystemPrompt() ?? null;
|
|
329
|
-
|
|
330
|
-
const toolDefinitions: TurnTraceToolDefinition[] = conversation
|
|
331
|
-
? conversation.getRegisteredToolDefinitions().map((tool) => ({
|
|
332
|
-
name: tool.name,
|
|
333
|
-
description: tool.description,
|
|
334
|
-
input_schema: tool.input_schema as Record<string, unknown>,
|
|
335
|
-
}))
|
|
336
|
-
: [];
|
|
337
|
-
|
|
338
|
-
return {
|
|
339
|
-
schema_version: 3,
|
|
340
|
-
messages: queryTurnMessages(boundary, nextTurn),
|
|
341
|
-
tool_calls: queryTurnToolCalls(boundary, nextTurn),
|
|
342
|
-
system_prompt: systemPrompt,
|
|
343
|
-
tool_definitions: toolDefinitions,
|
|
344
|
-
};
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
/**
|
|
348
|
-
* Maximum serialized size of a trace the cloud will accept (it drops traces
|
|
349
|
-
* whose JSON exceeds ~256 KiB). Keep the daemon-side cap a touch under that so
|
|
350
|
-
* we never ship a trace the cloud will silently drop. A trace over the cap
|
|
351
|
-
* is omitted entirely (the trace-free turn row still flushes).
|
|
352
|
-
*/
|
|
353
|
-
export const MAX_TRACE_SERIALIZED_BYTES = 256 * 1024;
|
|
354
|
-
|
|
355
|
-
/**
|
|
356
|
-
* Assemble a turn trace and serialize it, returning the JSON-ready object only
|
|
357
|
-
* when it fits under {@link MAX_TRACE_SERIALIZED_BYTES}. Returns `null` (no
|
|
358
|
-
* trace) when assembly fails or the trace is too large — both fail-closed so a
|
|
359
|
-
* single oversized/broken turn never blocks the turn event from flushing.
|
|
360
|
-
*/
|
|
361
|
-
export function assembleBoundedTurnTrace(
|
|
362
|
-
boundary: TurnTraceBoundary,
|
|
363
|
-
): TurnTrace | null {
|
|
364
|
-
let trace: TurnTrace;
|
|
365
|
-
try {
|
|
366
|
-
trace = assembleTurnTrace(boundary);
|
|
367
|
-
} catch (err) {
|
|
368
|
-
log.warn(
|
|
369
|
-
{ err, conversationId: boundary.conversationId },
|
|
370
|
-
"Failed to assemble turn trace — omitting trace for this turn",
|
|
371
|
-
);
|
|
372
|
-
return null;
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
let serializedBytes: number;
|
|
376
|
-
try {
|
|
377
|
-
serializedBytes = Buffer.byteLength(JSON.stringify(trace), "utf8");
|
|
378
|
-
} catch (err) {
|
|
379
|
-
log.warn(
|
|
380
|
-
{ err, conversationId: boundary.conversationId },
|
|
381
|
-
"Failed to serialize turn trace — omitting trace for this turn",
|
|
382
|
-
);
|
|
383
|
-
return null;
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
if (serializedBytes > MAX_TRACE_SERIALIZED_BYTES) {
|
|
387
|
-
log.debug(
|
|
388
|
-
{
|
|
389
|
-
conversationId: boundary.conversationId,
|
|
390
|
-
serializedBytes,
|
|
391
|
-
cap: MAX_TRACE_SERIALIZED_BYTES,
|
|
392
|
-
},
|
|
393
|
-
"Turn trace exceeds size cap — omitting trace for this turn",
|
|
394
|
-
);
|
|
395
|
-
return null;
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
return trace;
|
|
399
|
-
}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { describe, expect, test } from "bun:test";
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
turnEventSample,
|
|
5
|
-
wireEventSamples,
|
|
6
|
-
} from "./__tests__/telemetry-event-fixtures.js";
|
|
7
|
-
import { telemetryEventSchema } from "./telemetry-wire.generated.js";
|
|
8
|
-
import type { TurnTelemetryEvent } from "./types.js";
|
|
9
|
-
|
|
10
|
-
// Runtime contract test: events constructed with the daemon's types (the
|
|
11
|
-
// shared fixtures are annotated with them) must parse against the generated
|
|
12
|
-
// wire schemas — the same validation the cloud's ingest serializers
|
|
13
|
-
// apply. A daemon type whose values can't round-trip through
|
|
14
|
-
// `telemetryEventSchema` produces events the server silently drops.
|
|
15
|
-
|
|
16
|
-
describe("daemon telemetry types against the wire contract", () => {
|
|
17
|
-
for (const sample of wireEventSamples) {
|
|
18
|
-
test(`daemon-typed ${sample.type} event parses against the wire schema`, () => {
|
|
19
|
-
const result = telemetryEventSchema.safeParse(sample);
|
|
20
|
-
expect(result.error).toBeUndefined();
|
|
21
|
-
expect(result.success).toBe(true);
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
test("turn client bag with a nested value fails the wire superRefine", () => {
|
|
26
|
-
// Structurally valid for the daemon's `TurnTelemetryClientInfo` (extra
|
|
27
|
-
// properties are allowed outside fresh-literal checks), but the wire
|
|
28
|
-
// schema mirrors the server's validate_client: nested objects in the
|
|
29
|
-
// `client` bag reject the event at ingest.
|
|
30
|
-
const nestedClient = { os: "macos", screen: { width: 1512, height: 982 } };
|
|
31
|
-
const invalidTurn: TurnTelemetryEvent = {
|
|
32
|
-
...turnEventSample,
|
|
33
|
-
client: nestedClient,
|
|
34
|
-
};
|
|
35
|
-
const result = telemetryEventSchema.safeParse(invalidTurn);
|
|
36
|
-
expect(result.success).toBe(false);
|
|
37
|
-
});
|
|
38
|
-
});
|