@mycadet/assistant 0.12.9 → 0.12.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Dockerfile +0 -8
- package/eslint-rules/__tests__/cli-no-daemon-internals.test.ts +1 -1
- package/openapi.yaml +62 -910
- package/package.json +3 -7
- package/scripts/build-test-fixtures.ts +1 -1
- package/scripts/generate-openapi.ts +22 -6
- package/scripts/postinstall.ts +4 -10
- package/scripts/run-tests.ts +0 -21
- package/src/__tests__/adaptive-thinking-repair.test.ts +19 -57
- package/src/__tests__/agent-loop.test.ts +0 -76
- package/src/__tests__/anthropic-provider.test.ts +6 -6
- package/src/__tests__/assert-not-live-db.ts +1 -1
- package/src/__tests__/assistant-id-boundary-guard.test.ts +3 -3
- package/src/__tests__/attachments-store-heic-normalize.test.ts +1 -1
- package/src/__tests__/attachments-store.test.ts +1 -1
- package/src/__tests__/audit-log-rotation.test.ts +1 -1
- package/src/__tests__/btw-routes.test.ts +1 -1
- package/src/__tests__/byok-default-profile-ensure.test.ts +21 -27
- package/src/__tests__/call-conversation-messages.test.ts +0 -5
- package/src/__tests__/call-recovery.test.ts +2 -7
- package/src/__tests__/call-routes-http.test.ts +0 -12
- package/src/__tests__/call-store.test.ts +2 -7
- package/src/__tests__/catalog-files.test.ts +7 -5
- package/src/__tests__/checker.test.ts +1 -1
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +4 -4
- package/src/__tests__/cloud-client-verify-credential.test.ts +0 -4
- package/src/__tests__/cloud-credential-catalog-cli.test.ts +14 -14
- package/src/__tests__/cloud-profile-guard.test.ts +48 -401
- package/src/__tests__/compaction-events.test.ts +2 -2
- package/src/__tests__/config-loader-backfill.test.ts +74 -163
- package/src/__tests__/config-loader-cloud-defaults.test.ts +11 -11
- package/src/__tests__/config-loader-corrupt.test.ts +10 -10
- package/src/__tests__/config-loader-quarantine-notice.test.ts +7 -7
- package/src/__tests__/config-loader-validation-reset-notice.test.ts +11 -11
- package/src/__tests__/config-schema.test.ts +26 -27
- package/src/__tests__/config-set-route.test.ts +2 -6
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +28 -300
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +39 -246
- package/src/__tests__/conversation-agent-loop.test.ts +2 -58
- package/src/__tests__/conversation-clear-safety.test.ts +0 -30
- package/src/__tests__/conversation-inference-profile-route.test.ts +1 -1
- package/src/__tests__/conversation-queue.test.ts +1 -1
- package/src/__tests__/conversation-runtime-assembly.test.ts +1 -1
- package/src/__tests__/conversation-skill-tools.test.ts +4 -444
- package/src/__tests__/conversation-slash-commands.test.ts +1 -1
- package/src/__tests__/conversation-store.test.ts +1 -84
- package/src/__tests__/conversation-surface-state.test.ts +0 -16
- package/src/__tests__/credential-health-service.test.ts +14 -1
- package/src/__tests__/credential-record-retire.test.ts +1 -1
- package/src/__tests__/credential-record-write-through.test.ts +1 -1
- package/src/__tests__/credential-security-invariants.test.ts +0 -145
- package/src/__tests__/custom-profile-ensure.test.ts +1 -1
- package/src/__tests__/default-profile-catalog-fallback.test.ts +5 -15
- package/src/__tests__/deterministic-verification-control-plane.test.ts +0 -2
- package/src/__tests__/dictation-profile-store.test.ts +6 -6
- package/src/__tests__/disk-usage.test.ts +28 -164
- package/src/__tests__/docker-signing-key-bootstrap.test.ts +1 -1
- package/src/__tests__/embedding-cloud-proxy-selection.test.ts +1 -1
- package/src/__tests__/emit-event-signal.test.ts +1 -1
- package/src/__tests__/gateway-client-cloud-outbound.test.ts +3 -3
- package/src/__tests__/gateway-only-enforcement.test.ts +1 -1
- package/src/__tests__/guardian-dispatch.test.ts +0 -13
- package/src/__tests__/helpers/seed-app.ts +1 -1
- package/src/__tests__/host-cu-routes-targeted.test.ts +1 -1
- package/src/__tests__/host-shell-tool.test.ts +1 -1
- package/src/__tests__/identity-routes.test.ts +1 -1
- package/src/__tests__/inference-profile-session-handler.test.ts +1 -1
- package/src/__tests__/inference-profile-session-ipc.test.ts +1 -1
- package/src/__tests__/injector-chain.test.ts +1 -1
- package/src/__tests__/injector-config-quarantine-notice.test.ts +1 -1
- package/src/__tests__/injector-config-validation-reset-notice.test.ts +1 -1
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +1 -1
- package/src/__tests__/{platform.test.ts → layout.test.ts} +1 -1
- package/src/__tests__/list-all-apps.test.ts +1 -1
- package/src/__tests__/live-workspace-guard.test.ts +2 -2
- package/src/__tests__/llm-resolver-override-or-default.test.ts +5 -6
- package/src/__tests__/llm-resolver.test.ts +7 -7
- package/src/__tests__/llm-schema-fallback-profile.test.ts +9 -10
- package/src/__tests__/llm-usage-store.test.ts +0 -495
- package/src/__tests__/log-export-routes.test.ts +1 -1
- package/src/__tests__/mcp-config-secret-boundary.test.ts +12 -53
- package/src/__tests__/mcp-list-plugin-servers.test.ts +1 -1
- package/src/__tests__/memory-config-file-parity.test.ts +1 -1
- package/src/__tests__/memory-v2-static-injector.test.ts +1 -1
- package/src/__tests__/messages-read-boundary-guard.test.ts +0 -2
- package/src/__tests__/notification-guardian-path.test.ts +0 -7
- package/src/__tests__/onboarding-persona-write.test.ts +1 -1
- package/src/__tests__/openai-provider.test.ts +8 -8
- package/src/__tests__/path-policy.test.ts +1 -1
- package/src/__tests__/persona-resolver.test.ts +1 -1
- package/src/__tests__/plugin-app-serve-routes.test.ts +1 -1
- package/src/__tests__/plugin-effective-enabled-set.test.ts +1 -1
- package/src/__tests__/plugin-import-boundary-guard.test.ts +4 -6
- package/src/__tests__/plugin-import-boundary-reverse-guard.test.ts +0 -3
- package/src/__tests__/provider-cloud-proxy-integration.test.ts +1 -5
- package/src/__tests__/provider-connections-backfill.test.ts +10 -10
- package/src/__tests__/prune-old-conversations-job.test.ts +6 -31
- package/src/__tests__/resolve-app.test.ts +1 -1
- package/src/__tests__/run-due-schedules.test.ts +1 -1
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +0 -53
- package/src/__tests__/schedule-routes.test.ts +1 -1
- package/src/__tests__/schedule-store.test.ts +1 -1
- package/src/__tests__/secret-routes-cloud-proxy.test.ts +1 -1
- package/src/__tests__/skill-load-plugin-scope.test.ts +1 -1
- package/src/__tests__/surface-completion-compaction-boundary.test.ts +1 -1
- package/src/__tests__/tool-approval-handler.test.ts +1 -1
- package/src/__tests__/tool-audit.test.ts +5 -235
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +54 -114
- package/src/__tests__/tools-get-route.test.ts +1 -1
- package/src/__tests__/turn-outcome-read.test.ts +1 -1
- package/src/__tests__/twilio-routes.test.ts +0 -1
- package/src/__tests__/usage-attribution.test.ts +0 -31
- package/src/__tests__/verification-control-plane-policy.test.ts +3 -10
- package/src/__tests__/visible-app-context.test.ts +1 -1
- package/src/__tests__/voice-ingress-preflight.test.ts +1 -1
- package/src/__tests__/workspace-git-service.test.ts +1 -1
- package/src/__tests__/workspace-greetings.test.ts +1 -1
- package/src/acp/__tests__/helpers/acp-config-stub.ts +1 -1
- package/src/activation/progress-store.ts +1 -1
- package/src/activation/turn-hooks.ts +1 -1
- package/src/agent/loop.ts +0 -51
- package/src/apps/app-store.ts +1 -1
- package/src/avatar/__tests__/avatar-store.test.ts +2 -172
- package/src/avatar/accent-backfill.ts +1 -1
- package/src/avatar/avatar-manifest.ts +1 -1
- package/src/avatar/avatar-store.ts +10 -69
- package/src/avatar/ensure-raster.ts +1 -1
- package/src/avatar/identity-avatar.ts +1 -1
- package/src/avatar/sync-avatar.ts +1 -1
- package/src/avatar/traits-png-sync.ts +1 -1
- package/src/bundler/compiler-tools.ts +1 -1
- package/src/bundler/package-resolver.ts +1 -1
- package/src/calls/__tests__/call-controller.test.ts +25 -27
- package/src/calls/active-call-lease.ts +1 -1
- package/src/calls/call-controller.ts +3 -3
- package/src/calls/call-domain.ts +4 -8
- package/src/calls/call-store.ts +2 -76
- package/src/calls/resolve-call-tts-provider.ts +3 -3
- package/src/calls/twilio-config.ts +3 -3
- package/src/calls/twilio-rest.ts +2 -2
- package/src/calls/voice-ingress-preflight.ts +2 -2
- package/src/cli/bundled-modules.ts +0 -2
- package/src/cli/commands/__tests__/apps.test.ts +1 -1
- package/src/cli/commands/__tests__/plugins.test.ts +9 -66
- package/src/cli/commands/__tests__/ps.test.ts +67 -0
- package/src/cli/commands/auth.help.ts +2 -2
- package/src/cli/commands/avatar.ts +1 -1
- package/src/cli/commands/changelog.ts +1 -1
- package/src/cli/commands/cloud/__tests__/subscription.test.ts +2 -2
- package/src/cli/commands/cloud/index.help.ts +1 -1
- package/src/cli/commands/cloud/index.ts +2 -2
- package/src/cli/commands/db/refresh.ts +1 -1
- package/src/cli/commands/db/repair-step-conversation-backfill.ts +1 -1
- package/src/cli/commands/db/repair.ts +1 -1
- package/src/cli/commands/db/status.ts +1 -1
- package/src/cli/commands/inference-profiles.ts +1 -12
- package/src/cli/commands/memory/__tests__/memory-v3.test.ts +1 -116
- package/src/cli/commands/memory/index.help.ts +1 -43
- package/src/cli/commands/memory/memory-v3.ts +0 -64
- package/src/cli/commands/plugins.ts +54 -205
- package/src/cli/commands/ps.ts +5 -2
- package/src/cli/commands/status.ts +1 -1
- package/src/cli/index.help.ts +0 -2
- package/src/cli/lib/__tests__/inspect-plugin.test.ts +36 -66
- package/src/cli/lib/__tests__/install-from-cloud.test.ts +1 -1
- package/src/cli/lib/__tests__/install-from-github.test.ts +41 -117
- package/src/cli/lib/__tests__/plugin-catalog-cache.test.ts +2 -185
- package/src/cli/lib/__tests__/plugin-catalog-resolve.test.ts +36 -66
- package/src/cli/lib/__tests__/plugin-catalog-visibility.test.ts +4 -6
- package/src/cli/lib/__tests__/plugin-details.test.ts +113 -96
- package/src/cli/lib/__tests__/search-plugins.test.ts +9 -16
- package/src/cli/lib/__tests__/uninstall-plugin.test.ts +1 -1
- package/src/cli/lib/__tests__/upgrade-plugin.test.ts +38 -15
- package/src/cli/lib/diff-plugin.ts +1 -1
- package/src/cli/lib/inspect-plugin.ts +13 -97
- package/src/cli/lib/install-from-cloud.ts +1 -1
- package/src/cli/lib/install-from-github.ts +75 -154
- package/src/cli/lib/install-plugin-dependencies.ts +1 -1
- package/src/cli/lib/list-installed-plugins.ts +1 -1
- package/src/cli/lib/open-browser.ts +1 -1
- package/src/cli/lib/plugin-catalog-cache.ts +8 -51
- package/src/cli/lib/plugin-catalog-resolve.ts +3 -22
- package/src/cli/lib/plugin-details.ts +5 -27
- package/src/cli/lib/plugin-marketplace.ts +18 -266
- package/src/cli/lib/search-plugins.ts +23 -43
- package/src/cli/lib/toggle-plugin.ts +1 -1
- package/src/cli/lib/uninstall-plugin.ts +1 -1
- package/src/cli/lib/upgrade-plugin.ts +3 -49
- package/src/cli/program.ts +1 -3
- package/src/cli.ts +1 -1
- package/src/cloud/client.ts +0 -6
- package/src/cloud/consent-cache.test.ts +22 -201
- package/src/cloud/consent-cache.ts +16 -111
- package/src/cloud/sync-identity.ts +1 -1
- package/src/config/__tests__/chat-settings.test.ts +1 -1
- package/src/config/__tests__/cloud-identity.test.ts +15 -2
- package/src/config/__tests__/default-plugin-skill-discovery.test.ts +1 -1
- package/src/config/__tests__/default-profile-catalog.test.ts +12 -51
- package/src/config/__tests__/deployment-context-defaults.test.ts +13 -13
- package/src/config/__tests__/loader-callsite-strip-fallback.test.ts +4 -4
- package/src/config/__tests__/loader-last-known-good.test.ts +9 -9
- package/src/config/__tests__/loader-sparse-array-cleanup.test.ts +7 -7
- package/src/config/__tests__/plugin-resident-skill-discovery.test.ts +1 -1
- package/src/config/__tests__/profile-materialization.test.ts +2 -4
- package/src/config/__tests__/sync-gated-profiles.test.ts +1 -106
- package/src/config/acp-agent-write.ts +1 -1
- package/src/config/bundled-skills/settings/tools/open-system-settings.test.ts +1 -1
- package/src/config/bundled-skills/settings/tools/open-system-settings.ts +1 -1
- package/src/config/call-site-defaults.ts +0 -6
- package/src/config/cloud-identity.ts +12 -5
- package/src/config/composer-preferences.ts +1 -1
- package/src/config/default-profile-catalog.ts +8 -75
- package/src/config/default-profile-names.ts +2 -25
- package/src/config/env-registry.ts +1 -14
- package/src/config/env.ts +8 -6
- package/src/config/llm-resolver.ts +1 -2
- package/src/config/loader.ts +13 -17
- package/src/config/profile-materialization.ts +1 -1
- package/src/config/schema.ts +1 -7
- package/src/config/schemas/call-site-catalog.ts +0 -7
- package/src/config/schemas/llm.ts +22 -27
- package/src/config/seed-inference-profiles.ts +16 -17
- package/src/config/skills.ts +2 -2
- package/src/config/sync-gated-profiles.ts +6 -24
- package/src/credential-health/credential-health-service.ts +10 -3
- package/src/daemon/approval-generators.ts +3 -3
- package/src/daemon/config-watcher.ts +2 -2
- package/src/daemon/conversation-agent-loop-handlers.ts +0 -18
- package/src/daemon/conversation-agent-loop.ts +6 -97
- package/src/daemon/conversation-process.ts +1 -1
- package/src/daemon/conversation-skill-tools.ts +4 -72
- package/src/daemon/conversation-store.ts +1 -1
- package/src/daemon/conversation-surface-state.ts +0 -33
- package/src/daemon/conversation-surfaces.ts +1 -86
- package/src/daemon/conversation-tool-setup.test.ts +1 -1
- package/src/daemon/conversation-tool-setup.ts +0 -23
- package/src/daemon/conversation.ts +3 -5
- package/src/daemon/daemon-control.ts +3 -3
- package/src/daemon/dictation-profile-store.ts +3 -3
- package/src/daemon/event-loop-watchdog.test.ts +2 -198
- package/src/daemon/event-loop-watchdog.ts +0 -185
- package/src/daemon/external-plugins-bootstrap.ts +1 -1
- package/src/daemon/first-greeting.ts +1 -1
- package/src/daemon/handlers/skills.ts +1 -1
- package/src/daemon/host-app-control-proxy.ts +1 -1
- package/src/daemon/host-cu-proxy.ts +2 -2
- package/src/daemon/identity-helpers.ts +1 -1
- package/src/daemon/lifecycle.ts +11 -15
- package/src/daemon/main.ts +1 -1
- package/src/daemon/now-scratchpad.ts +1 -1
- package/src/daemon/process-message.ts +4 -4
- package/src/daemon/profiler-run-store.ts +2 -2
- package/src/daemon/providers-setup.ts +2 -2
- package/src/daemon/shutdown-handlers.ts +0 -10
- package/src/daemon/sqlite-corruption-watchdog.test.ts +2 -142
- package/src/daemon/sqlite-corruption-watchdog.ts +17 -81
- package/src/daemon/tool-side-effects.ts +1 -1
- package/src/desktop/desktop-session-manager.ts +1 -1
- package/src/desktop/desktop-wallpaper-renderer.ts +1 -1
- package/src/heartbeat/heartbeat-service.ts +1 -1
- package/src/home/feed-writer.ts +1 -1
- package/src/home/home-greeting-cache.ts +1 -1
- package/src/home/relationship-state-writer.ts +2 -2
- package/src/hooks/__tests__/hook-live-reload.test.ts +1 -1
- package/src/hooks/hook-loader.ts +2 -2
- package/src/inbound/__tests__/oauth-callback-url.test.ts +2 -2
- package/src/inbound/oauth-callback-url.ts +3 -3
- package/src/ipc/__tests__/attachment-ipc.test.ts +1 -1
- package/src/ipc/socket-path.ts +1 -1
- package/src/live-voice/__tests__/live-voice-archive.test.ts +1 -1
- package/src/live-voice/__tests__/live-voice-vad.test.ts +1 -1
- package/src/live-voice/live-voice-session.ts +3 -66
- package/src/mcp/__tests__/effective-config.test.ts +1 -1
- package/src/mcp/__tests__/mcp-oauth-client-registration.test.ts +2 -2
- package/src/mcp/__tests__/mcp-oauth-provider.test.ts +2 -3
- package/src/mcp/__tests__/reload-signal-emission.test.ts +1 -1
- package/src/mcp/__tests__/reload-signal.test.ts +1 -1
- package/src/mcp/__tests__/workspace-mcp-config.test.ts +19 -21
- package/src/mcp/reload-signal.ts +1 -1
- package/src/mcp/workspace-mcp-config.ts +1 -23
- package/src/messaging/draft-store.ts +1 -1
- package/src/monitoring/__tests__/active-conversations.test.ts +1 -1
- package/src/monitoring/__tests__/page-cache.test.ts +1 -1
- package/src/monitoring/__tests__/stall-capture.test.ts +1 -1
- package/src/monitoring/__tests__/workspace-git-heartbeat.test.ts +1 -1
- package/src/monitoring/active-conversations.ts +1 -1
- package/src/monitoring/control.ts +1 -1
- package/src/monitoring/daemon-boot-time.ts +1 -1
- package/src/monitoring/daemon-heartbeat.ts +1 -1
- package/src/monitoring/page-cache.ts +1 -1
- package/src/monitoring/plugin-auto-update.ts +1 -7
- package/src/monitoring/plugin-source-watch.ts +1 -1
- package/src/monitoring/recovery/db.ts +1 -1
- package/src/monitoring/recovery/inflight-content.ts +1 -1
- package/src/monitoring/resource-sampler.ts +3 -14
- package/src/monitoring/stall-capture.ts +1 -1
- package/src/monitoring/worker.ts +9 -76
- package/src/monitoring/workspace-git-heartbeat.ts +1 -1
- package/src/oauth/connect-orchestrator.ts +4 -4
- package/src/permissions/checker.ts +1 -1
- package/src/permissions/workspace-policy.ts +1 -1
- package/src/persistence/__tests__/main-db-readonly-probe.ts +27 -52
- package/src/persistence/__tests__/message-content-file.test.ts +1 -1
- package/src/persistence/__tests__/slow-sync-log.test.ts +0 -2
- package/src/persistence/attachments-store.ts +1 -1
- package/src/persistence/conversation-crud.ts +1 -38
- package/src/persistence/conversation-directories.ts +1 -1
- package/src/persistence/conversation-types.ts +0 -8
- package/src/persistence/db-async-query.ts +1 -1
- package/src/persistence/db-connection.ts +11 -1
- package/src/persistence/db-init.ts +1 -1
- package/src/persistence/db-maintenance.ts +1 -1
- package/src/persistence/embeddings/__tests__/embedding-local-lifecycle.test.ts +1 -1
- package/src/persistence/embeddings/embedding-local.ts +4 -4
- package/src/persistence/embeddings/embedding-runtime-manager.ts +1 -1
- package/src/persistence/embeddings/qdrant-client.ts +1 -1
- package/src/persistence/embeddings/qdrant-manager.ts +1 -1
- package/src/persistence/job-handlers/__tests__/message-lexical-backfill.test.ts +1 -1
- package/src/persistence/job-handlers/__tests__/message-lexical-enqueue.test.ts +1 -1
- package/src/persistence/job-handlers/cleanup.ts +8 -17
- package/src/persistence/llm-usage-store.ts +2 -229
- package/src/persistence/message-content-file.ts +1 -1
- package/src/persistence/migrations/209-strip-thinking-from-consolidated.ts +1 -1
- package/src/persistence/migrations/222-strip-placeholder-sentinels-from-messages.ts +1 -1
- package/src/persistence/migrations/296-rewrite-balanced-economy-profile-pins.test.ts +1 -1
- package/src/persistence/migrations/306-rewrite-frontier-profile-pins.test.ts +1 -1
- package/src/persistence/migrations/329-move-onboarding-events-to-telemetry-db.test.ts +13 -0
- package/src/persistence/migrations/330-move-auth-fallback-events-to-telemetry-db.test.ts +13 -0
- package/src/persistence/migrations/331-move-lifecycle-events-to-telemetry-db.test.ts +13 -0
- package/src/persistence/migrations/332-move-skill-loaded-events-to-telemetry-db.test.ts +13 -0
- package/src/persistence/migrations/333-create-telemetry-events-table.test.ts +7 -4
- package/src/persistence/migrations/334-backfill-telemetry-events-outbox.test.ts +13 -0
- package/src/persistence/migrations/387-drop-telemetry-tables.ts +51 -0
- package/src/persistence/migrations/__tests__/327-create-flush-checkpoints.test.ts +9 -1
- package/src/persistence/migrations/__tests__/387-drop-telemetry-tables.test.ts +79 -0
- package/src/persistence/migrations/helpers/relocation.ts +1 -1
- package/src/persistence/migrations/run-migrations.ts +1 -1
- package/src/persistence/migrations/validate-migration-state.ts +1 -1
- package/src/persistence/raw-query.ts +1 -29
- package/src/persistence/slow-sync-log.ts +0 -23
- package/src/persistence/steps.ts +2 -0
- package/src/{telemetry → persistence}/tool-audit.ts +6 -121
- package/src/plugin-api/index.ts +1 -1
- package/src/plugin-api/plugin-name-env.ts +1 -1
- package/src/plugins/__tests__/installed-plugin-dirs.test.ts +1 -1
- package/src/plugins/collect-source-versions.ts +1 -1
- package/src/plugins/defaults/channel/package.json +1 -1
- package/src/plugins/defaults/cloud-hosted/package.json +1 -1
- package/src/plugins/defaults/compaction/package.json +1 -1
- package/src/plugins/defaults/documents/package.json +1 -1
- package/src/plugins/defaults/empty-response/package.json +1 -1
- package/src/plugins/defaults/exploration-drift/package.json +1 -1
- package/src/plugins/defaults/image-fallback/package.json +1 -1
- package/src/plugins/defaults/image-recovery/package.json +1 -1
- package/src/plugins/defaults/max-tokens-continue/package.json +1 -1
- package/src/plugins/defaults/memory/__tests__/db-async-query.test.ts +1 -1
- package/src/plugins/defaults/memory/__tests__/db-maintenance.test.ts +1 -1
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +0 -82
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-skill-card.test.ts +0 -41
- package/src/plugins/defaults/memory/__tests__/memory-tier-boundary-guard.test.ts +0 -2
- package/src/plugins/defaults/memory/memory-retrospective-job.ts +3 -52
- package/src/plugins/defaults/memory/memory-retrospective-skill-card.ts +0 -18
- package/src/plugins/defaults/memory/package.json +1 -1
- package/src/plugins/defaults/memory/paths.ts +4 -4
- package/src/plugins/defaults/memory/src/__tests__/memory-worker-routes.test.ts +1 -1
- package/src/plugins/defaults/memory/src/memory-v2-routes.ts +5 -5
- package/src/plugins/defaults/memory/src/memory-v3-routes.ts +0 -207
- package/src/plugins/defaults/memory/src/memory-worker-routes.ts +1 -1
- package/src/plugins/defaults/memory/startup.ts +1 -22
- package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +2 -253
- package/src/plugins/defaults/memory/v3/orchestrate.ts +5 -129
- package/src/plugins/defaults/memory/worker-control.ts +1 -1
- package/src/plugins/defaults/memory/worker.ts +2 -2
- package/src/plugins/defaults/session/package.json +1 -1
- package/src/plugins/defaults/surface-completion-nudge/package.json +1 -1
- package/src/plugins/defaults/task-progress/package.json +1 -1
- package/src/plugins/defaults/task-progress-nudge/package.json +1 -1
- package/src/plugins/defaults/title-generate/package.json +1 -1
- package/src/plugins/defaults/tool-error/package.json +1 -1
- package/src/plugins/defaults/tool-result-truncate/package.json +1 -1
- package/src/plugins/defaults/turn-context/package.json +1 -1
- package/src/plugins/defaults/workspace/injectors.ts +1 -1
- package/src/plugins/defaults/workspace/package.json +1 -1
- package/src/plugins/disabled-state.ts +1 -1
- package/src/plugins/ensure-plugin-api-shim.ts +1 -1
- package/src/plugins/ensure-shared-dep-links.ts +1 -1
- package/src/plugins/installed-plugin-dirs.ts +1 -1
- package/src/plugins/mcp-servers.ts +7 -9
- package/src/plugins/mtime-cache.ts +2 -2
- package/src/plugins/source-versions.ts +1 -1
- package/src/prompts/bootstrap-cleanup.ts +1 -1
- package/src/prompts/persona-resolver.ts +1 -1
- package/src/prompts/sections.ts +2 -2
- package/src/prompts/system-prompt.ts +10 -42
- package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +0 -37
- package/src/providers/__tests__/cadet-connection-routing.test.ts +2 -2
- package/src/providers/cadet/client.ts +1 -1
- package/src/providers/inference/__tests__/base-url-route-validation.test.ts +1 -1
- package/src/providers/inference/adapter-factory.ts +1 -1
- package/src/providers/inference/backfill.ts +3 -10
- package/src/providers/inference/profile-probe.ts +1 -1
- package/src/providers/retry.ts +0 -2
- package/src/providers/types.ts +0 -7
- package/src/providers/usage-tracking.ts +1 -1
- package/src/routes/__tests__/route-host.test.ts +1 -1
- package/src/routes/control.ts +1 -1
- package/src/routes/route-host-client.ts +1 -1
- package/src/routes/worker.ts +2 -2
- package/src/runtime/agent-wake.ts +1 -1
- package/src/runtime/assistant-stream-state.ts +1 -1
- package/src/runtime/auth/token-service.ts +1 -1
- package/src/runtime/background-job-runner.ts +1 -1
- package/src/runtime/middleware/twilio-validation.ts +2 -2
- package/src/runtime/routes/__tests__/app-pin-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/apps-refresh-route.test.ts +1 -1
- package/src/runtime/routes/__tests__/avatar-state-routes.test.ts +3 -33
- package/src/runtime/routes/__tests__/cloud-credits-routes.test.ts +5 -4
- package/src/runtime/routes/__tests__/cloud-invoice-routes.test.ts +4 -3
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +59 -287
- package/src/runtime/routes/__tests__/default-plugin-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/deprecated-route-context.test.ts +15 -62
- package/src/runtime/routes/__tests__/inference-profiles-routes.test.ts +105 -12
- package/src/runtime/routes/__tests__/ingress-status-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/monitoring-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +47 -211
- package/src/runtime/routes/__tests__/route-host-worker-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/schedule-routes-disarm-reason.test.ts +1 -1
- package/src/runtime/routes/__tests__/schedule-worker-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/user-route-dispatcher-host.test.ts +1 -1
- package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +1 -1
- package/src/runtime/routes/__tests__/user-routes-cli.test.ts +1 -1
- package/src/runtime/routes/__tests__/user-routes-notices.test.ts +1 -1
- package/src/runtime/routes/__tests__/user-routes-request.test.ts +1 -1
- package/src/runtime/routes/app-management-routes.ts +1 -1
- package/src/runtime/routes/attachment-routes.ts +1 -1
- package/src/runtime/routes/audit-routes.ts +1 -1
- package/src/runtime/routes/avatar-routes.ts +3 -10
- package/src/runtime/routes/cloud-routes.ts +3 -3
- package/src/runtime/routes/content-source-routes.ts +1 -1
- package/src/runtime/routes/conversation-query-routes.ts +60 -621
- package/src/runtime/routes/conversation-routes.ts +1 -38
- package/src/runtime/routes/debug-routes.ts +1 -1
- package/src/runtime/routes/deprecated-route-context.ts +5 -61
- package/src/runtime/routes/heartbeat-routes.ts +1 -1
- package/src/runtime/routes/identity-routes.ts +1 -1
- package/src/runtime/routes/index.ts +0 -6
- package/src/runtime/routes/inference-profile-session-handler.ts +3 -3
- package/src/runtime/routes/inference-profiles-routes.ts +48 -21
- package/src/runtime/routes/inference-provider-connection-routes.ts +0 -1
- package/src/runtime/routes/llm-call-sites-routes.ts +3 -3
- package/src/runtime/routes/log-export/__tests__/installed-inventory.test.ts +1 -1
- package/src/runtime/routes/log-export/__tests__/workspace-allowlist-error-contract.test.ts +1 -1
- package/src/runtime/routes/log-export/__tests__/workspace-allowlist.test.ts +1 -1
- package/src/runtime/routes/log-export/workspace-allowlist.ts +1 -1
- package/src/runtime/routes/log-export-routes.ts +17 -15
- package/src/runtime/routes/migration-rollback-routes.ts +1 -1
- package/src/runtime/routes/migration-routes.ts +2 -3
- package/src/runtime/routes/monitoring-routes.ts +2 -2
- package/src/runtime/routes/oauth-providers.ts +5 -5
- package/src/runtime/routes/plugins-routes.ts +38 -163
- package/src/runtime/routes/profiler-routes.ts +1 -1
- package/src/runtime/routes/route-host-worker-routes.ts +1 -1
- package/src/runtime/routes/sanity-routes.ts +1 -1
- package/src/runtime/routes/schedule-routes.ts +1 -1
- package/src/runtime/routes/schedule-worker-routes.ts +1 -1
- package/src/runtime/routes/settings-routes.ts +1 -1
- package/src/runtime/routes/sounds-config-routes.ts +1 -1
- package/src/runtime/routes/surface-conversation-resolver.ts +1 -7
- package/src/runtime/routes/user-route-dispatcher.ts +1 -3
- package/src/runtime/routes/user-route-import.ts +1 -1
- package/src/runtime/routes/user-route-resolution.ts +1 -1
- package/src/runtime/routes/user-routes-cli.ts +1 -1
- package/src/runtime/routes/workspace-commit-routes.ts +1 -1
- package/src/runtime/routes/workspace-greetings.ts +1 -1
- package/src/runtime/routes/workspace-routes.ts +1 -1
- package/src/runtime/routes/workspace-utils.ts +1 -1
- package/src/runtime/sync/resource-sync-events.ts +1 -1
- package/src/schedule/__tests__/plugin-schedule-declarations.test.ts +1 -1
- package/src/schedule/__tests__/plugin-schedule-reconciler.test.ts +1 -1
- package/src/schedule/plugin-schedule-availability.ts +1 -1
- package/src/schedule/plugin-schedule-declarations.ts +1 -1
- package/src/schedule/run-script.ts +1 -1
- package/src/schedule/scheduler.ts +1 -11
- package/src/schedule/worker-control.ts +1 -1
- package/src/schedule/worker.ts +3 -3
- package/src/security/oauth2.ts +2 -2
- package/src/security/secret-allowlist.ts +1 -1
- package/src/signals/cancel.ts +1 -1
- package/src/signals/conversation-undo.ts +1 -1
- package/src/signals/emit-event.ts +1 -1
- package/src/signals/event-stream.ts +1 -1
- package/src/signals/user-message.ts +1 -1
- package/src/skills/catalog-install.ts +2 -1
- package/src/skills/clawhub.ts +1 -1
- package/src/skills/cloud-store.ts +1 -1
- package/src/skills/path-classifier.ts +1 -1
- package/src/skills/skill-history.ts +1 -1
- package/src/skills/skillssh-registry.ts +1 -1
- package/src/skills/uninstall.ts +1 -1
- package/src/skills/workspace-skill-md-signature.ts +1 -1
- package/src/subagent/manager.ts +1 -1
- package/src/theme/workspace-theme.ts +1 -1
- package/src/tools/browser/auth-cache.ts +1 -1
- package/src/tools/browser/browser-manager.ts +1 -1
- package/src/tools/browser/runtime-check.ts +1 -1
- package/src/tools/executor.ts +4 -4
- package/src/tools/filesystem/write.ts +1 -1
- package/src/tools/permission-checker.ts +2 -51
- package/src/tools/run-standalone.ts +1 -1
- package/src/tools/skills/format-input-schema.ts +1 -1
- package/src/tools/skills/load.ts +1 -1
- package/src/tools/skills/scaffold-cloud.ts +0 -32
- package/src/tools/terminal/safe-env.ts +1 -2
- package/src/tools/terminal/sanitized-bash.ts +1 -1
- package/src/tools/terminal/shell.ts +1 -1
- package/src/tools/tool-approval-handler.ts +4 -1
- package/src/tools/workflows/manage-workflows.ts +2 -2
- package/src/tools/workflows/run-workflow.test.ts +1 -1
- package/src/tools/workspace-tools/loader.ts +1 -1
- package/src/tts/synthesis-stream.ts +2 -2
- package/src/usage/attribution.ts +1 -11
- package/src/util/browser.ts +1 -1
- package/src/util/bun-runtime.ts +2 -1
- package/src/util/device-id.ts +1 -1
- package/src/util/disk-usage.ts +4 -139
- package/src/util/layout.ts +3 -3
- package/src/util/logger.ts +1 -1
- package/src/util/logs-db-path.ts +1 -1
- package/src/util/memory-db-path.ts +1 -1
- package/src/util/{platform.ts → os.ts} +5 -30
- package/src/util/process-tree.ts +19 -0
- package/src/util/sqlite3-runtime.ts +1 -1
- package/src/util/telemetry-db-path.ts +1 -1
- package/src/watcher/__tests__/engine.test.ts +0 -23
- package/src/watcher/engine.ts +0 -7
- package/src/windows-compiled-cli.ts +0 -4
- package/src/windows-compiled-worker-entry.ts +0 -6
- package/src/workflows/leaf-runner.test.ts +1 -1
- package/src/workflows/leaf-runner.ts +1 -1
- package/src/workflows/library.ts +1 -1
- package/src/workspace/adaptive-thinking-repair.ts +5 -24
- package/src/workspace/byok-default-profile-ensure.ts +24 -26
- package/src/workspace/custom-profile-ensure.ts +2 -2
- package/src/workspace/git-service.ts +1 -1
- package/src/workspace/hatched-date.ts +1 -1
- package/src/workspace/migrations/038-unify-llm-callsite-configs.ts +2 -2
- package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +1 -1
- package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +1 -1
- package/src/workspace/migrations/077-seed-memory-router-callsite.ts +1 -1
- package/src/workspace/migrations/registry.ts +0 -4
- package/src/workspace/turn-commit.ts +1 -1
- package/docs/activation-funnel-telemetry.md +0 -324
- package/scripts/bundled-plugin-packages.ts +0 -154
- package/scripts/generate-bundled-plugin-packages.ts +0 -29
- package/src/__tests__/activation-early-marking.test.ts +0 -114
- package/src/__tests__/auth-fallback-events-store.test.ts +0 -99
- package/src/__tests__/config-get-vision-flag.test.ts +0 -139
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +0 -400
- package/src/__tests__/internal-telemetry-routes.test.ts +0 -213
- package/src/__tests__/telemetry-routes.test.ts +0 -182
- package/src/__tests__/turn-events-store.test.ts +0 -376
- package/src/__tests__/ui-channel-variants.test.ts +0 -53
- package/src/avatar/__tests__/avatar-changed-telemetry.test.ts +0 -217
- package/src/avatar/avatar-changed-telemetry.ts +0 -128
- package/src/calls/__tests__/call-funnel-telemetry.test.ts +0 -204
- package/src/cli/commands/telemetry.help.ts +0 -27
- package/src/cli/commands/telemetry.ts +0 -83
- package/src/cli/lib/__tests__/local-plugin-upgrade.test.ts +0 -251
- package/src/cli/lib/__tests__/plugin-catalog-local.test.ts +0 -113
- package/src/cli/lib/__tests__/plugin-marketplace.test.ts +0 -384
- package/src/cli/lib/__tests__/plugin-pin-history.test.ts +0 -164
- package/src/cli/lib/__tests__/plugins-install-offline.test.ts +0 -228
- package/src/cli/lib/bundled-marketplace.json +0 -1575
- package/src/cli/lib/bundled-plugin-packages.json +0 -827
- package/src/cli/lib/bundled-plugin-packages.ts +0 -87
- package/src/cli/lib/plugin-catalog-local.ts +0 -94
- package/src/cli/lib/plugin-pin-history.ts +0 -276
- package/src/cloud/feature-gate.ts +0 -8
- package/src/config/__tests__/cloud-rehydration.test.ts +0 -180
- package/src/config/cloud-rehydration.ts +0 -35
- package/src/daemon/__tests__/auto-profile-router.test.ts +0 -380
- package/src/daemon/auto-profile-router.ts +0 -428
- package/src/live-voice/__tests__/live-voice-session-telemetry.test.ts +0 -391
- package/src/monitoring/__tests__/db-integrity-sample.test.ts +0 -113
- package/src/monitoring/__tests__/oom-kill-reporter.test.ts +0 -374
- package/src/monitoring/db-integrity-check.ts +0 -163
- package/src/monitoring/db-integrity-sample.ts +0 -176
- package/src/monitoring/oom-kill-reporter.ts +0 -469
- package/src/onboarding/__tests__/onboarding-events-store.test.ts +0 -158
- package/src/onboarding/onboarding-events-store.ts +0 -296
- package/src/persistence/__tests__/raw-query-telemetry.test.ts +0 -76
- package/src/persistence/lifecycle-events-store.test.ts +0 -134
- package/src/persistence/lifecycle-events-store.ts +0 -110
- package/src/plugins/defaults/memory/__tests__/activation-session-store.test.ts +0 -76
- package/src/plugins/defaults/memory/activation-session-store.ts +0 -50
- package/src/plugins/defaults/memory/src/__tests__/memory-v3-gate-stats.test.ts +0 -281
- package/src/runtime/routes/auto-profile-routes.ts +0 -83
- package/src/runtime/routes/internal-telemetry-routes.ts +0 -142
- package/src/runtime/routes/telemetry-routes.ts +0 -274
- package/src/security/auth-fallback-events-store.ts +0 -57
- package/src/telemetry/__tests__/activation-funnel.test.ts +0 -95
- package/src/telemetry/__tests__/config-setting-events-store.test.ts +0 -63
- package/src/telemetry/__tests__/config-setting-snapshot.test.ts +0 -143
- package/src/telemetry/__tests__/flush-checkpoints.test.ts +0 -56
- package/src/telemetry/__tests__/live-voice-funnel.test.ts +0 -174
- package/src/telemetry/__tests__/outbox-test-harness.ts +0 -85
- package/src/telemetry/__tests__/phone-call-funnel.test.ts +0 -72
- package/src/telemetry/__tests__/telemetry-event-fixtures.ts +0 -282
- package/src/telemetry/__tests__/watchdog-events-store.test.ts +0 -71
- package/src/telemetry/activation-funnel.ts +0 -172
- package/src/telemetry/config-setting-events-store.ts +0 -40
- package/src/telemetry/config-setting-snapshot.ts +0 -170
- package/src/telemetry/flush-checkpoints.ts +0 -70
- package/src/telemetry/live-voice-funnel.ts +0 -185
- package/src/telemetry/memory-corpus-size.test.ts +0 -120
- package/src/telemetry/memory-corpus-size.ts +0 -184
- package/src/telemetry/memory-tier-reporter.test.ts +0 -195
- package/src/telemetry/memory-tier-reporter.ts +0 -130
- package/src/telemetry/phone-call-funnel.ts +0 -144
- package/src/telemetry/skill-loaded-events-store.test.ts +0 -93
- package/src/telemetry/skill-loaded-events-store.ts +0 -39
- package/src/telemetry/telemetry-event-sources.test.ts +0 -223
- package/src/telemetry/telemetry-event-sources.ts +0 -597
- package/src/telemetry/telemetry-events-outbox.test.ts +0 -375
- package/src/telemetry/telemetry-events-outbox.ts +0 -237
- package/src/telemetry/telemetry-main-db.ts +0 -48
- package/src/telemetry/telemetry-wire-source.json +0 -4
- package/src/telemetry/telemetry-wire-validation.test.ts +0 -157
- package/src/telemetry/telemetry-wire-validation.ts +0 -162
- package/src/telemetry/telemetry-wire.generated.ts +0 -483
- package/src/telemetry/tool-executed-events-store.test.ts +0 -210
- package/src/telemetry/tool-executed-events-store.ts +0 -102
- package/src/telemetry/trace-collection-policy.test.ts +0 -28
- package/src/telemetry/trace-collection-policy.ts +0 -30
- package/src/telemetry/turn-events-store.ts +0 -216
- package/src/telemetry/turn-trace-store.test.ts +0 -884
- package/src/telemetry/turn-trace-store.ts +0 -399
- package/src/telemetry/types.test.ts +0 -38
- package/src/telemetry/types.ts +0 -780
- package/src/telemetry/usage-telemetry-reporter.test.ts +0 -3445
- package/src/telemetry/usage-telemetry-reporter.ts +0 -566
- package/src/telemetry/watchdog-direct-emit.test.ts +0 -112
- package/src/telemetry/watchdog-direct-emit.ts +0 -104
- package/src/telemetry/watchdog-events-store.ts +0 -31
- package/src/tools/ui-surface/channel-variants.ts +0 -52
- package/src/watcher/__tests__/telemetry.test.ts +0 -178
- package/src/watcher/telemetry.ts +0 -93
- package/src/workspace/migrations/097-enable-adaptive-thinking-managed-profiles.ts +0 -165
- package/src/workspace/migrations/104-recheck-adaptive-thinking-model-implied-anthropic.ts +0 -151
- /package/src/{telemetry → persistence}/tool-usage-store.ts +0 -0
- /package/src/{telemetry → persistence}/turn-outcome.ts +0 -0
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Internal telemetry routes — receive operational signals forwarded from the
|
|
3
|
-
* gateway over the internal (service-token) transport.
|
|
4
|
-
*
|
|
5
|
-
* POST /v1/internal/telemetry/auth-fallback — record aggregated counts of
|
|
6
|
-
* requests served via the legacy loopback auth fallback. The gateway counts
|
|
7
|
-
* fallbacks in memory and flushes them here per window; the usage telemetry
|
|
8
|
-
* reporter ships the persisted rows to the cloud.
|
|
9
|
-
*
|
|
10
|
-
* POST /v1/internal/telemetry/watchdog — relay a gateway-origin watchdog
|
|
11
|
-
* event straight to platform ingest via the direct (unbuffered) emit path,
|
|
12
|
-
* bypassing the SQLite watchdog buffer. Used for integrity alarms (e.g.
|
|
13
|
-
* `gateway_guardian_missing`) that must not depend on the state they report
|
|
14
|
-
* on. Consent/platform gating happens inside the direct emit.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import { z } from "zod";
|
|
18
|
-
|
|
19
|
-
import { getRawShareAnalytics } from "../../cloud/consent-cache.js";
|
|
20
|
-
import {
|
|
21
|
-
type AuthFallbackCount,
|
|
22
|
-
recordAuthFallbackCounts,
|
|
23
|
-
} from "../../security/auth-fallback-events-store.js";
|
|
24
|
-
import { emitWatchdogEventDirect } from "../../telemetry/watchdog-direct-emit.js";
|
|
25
|
-
import { getLogger } from "../../util/logger.js";
|
|
26
|
-
import { GATEWAY_PRINCIPALS } from "../auth/route-policy.js";
|
|
27
|
-
import { BadRequestError, ServiceUnavailableError } from "./errors.js";
|
|
28
|
-
import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
|
|
29
|
-
|
|
30
|
-
const log = getLogger("internal-telemetry-routes");
|
|
31
|
-
|
|
32
|
-
const authFallbackBody = z.object({
|
|
33
|
-
window_start: z.number().int().nonnegative(),
|
|
34
|
-
window_end: z.number().int().nonnegative(),
|
|
35
|
-
counts: z
|
|
36
|
-
.array(
|
|
37
|
-
z.object({
|
|
38
|
-
guard: z.string().min(1),
|
|
39
|
-
path: z.string().min(1),
|
|
40
|
-
failure_kind: z.string().min(1),
|
|
41
|
-
count: z.number().int().positive(),
|
|
42
|
-
}),
|
|
43
|
-
)
|
|
44
|
-
.min(1),
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
function handleRecordAuthFallback({ body }: RouteHandlerArgs) {
|
|
48
|
-
const parsed = authFallbackBody.safeParse(body);
|
|
49
|
-
if (!parsed.success) {
|
|
50
|
-
throw new BadRequestError(
|
|
51
|
-
`Invalid auth-fallback payload: ${parsed.error.message}`,
|
|
52
|
-
);
|
|
53
|
-
}
|
|
54
|
-
const { window_start, window_end, counts } = parsed.data;
|
|
55
|
-
const mapped: AuthFallbackCount[] = counts.map((c) => ({
|
|
56
|
-
guard: c.guard,
|
|
57
|
-
path: c.path,
|
|
58
|
-
failureKind: c.failure_kind,
|
|
59
|
-
count: c.count,
|
|
60
|
-
}));
|
|
61
|
-
|
|
62
|
-
const recorded = recordAuthFallbackCounts(window_start, window_end, mapped);
|
|
63
|
-
if (recorded === 0) {
|
|
64
|
-
if (getRawShareAnalytics() !== false) {
|
|
65
|
-
// Consent is not a confirmed opt-out but nothing was recorded (the
|
|
66
|
-
// body guarantees counts), so the telemetry DB is unavailable. Fail so
|
|
67
|
-
// the gateway's reporter merges the batch back and retries next flush
|
|
68
|
-
// instead of losing it.
|
|
69
|
-
throw new ServiceUnavailableError(
|
|
70
|
-
"Telemetry database unavailable; retry the auth-fallback batch",
|
|
71
|
-
);
|
|
72
|
-
}
|
|
73
|
-
// Confirmed share_analytics opt-out: drop the counts to honor it.
|
|
74
|
-
return { skipped: true };
|
|
75
|
-
}
|
|
76
|
-
log.debug({ recorded }, "Recorded auth-fallback counts");
|
|
77
|
-
return { recorded };
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
const watchdogRelayBody = z.object({
|
|
81
|
-
check_name: z.string().min(1).max(128),
|
|
82
|
-
detail: z.record(z.string(), z.unknown()).nullable().optional(),
|
|
83
|
-
value: z.number().nullable().optional(),
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
async function handleRelayWatchdogEvent({ body }: RouteHandlerArgs) {
|
|
87
|
-
const parsed = watchdogRelayBody.safeParse(body);
|
|
88
|
-
if (!parsed.success) {
|
|
89
|
-
throw new BadRequestError(
|
|
90
|
-
`Invalid watchdog payload: ${parsed.error.message}`,
|
|
91
|
-
);
|
|
92
|
-
}
|
|
93
|
-
const { check_name, detail, value } = parsed.data;
|
|
94
|
-
// Never throws; opt-out and platform gates are enforced inside.
|
|
95
|
-
await emitWatchdogEventDirect(check_name, detail ?? null, value ?? null);
|
|
96
|
-
return { ok: true as const };
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
export const ROUTES: RouteDefinition[] = [
|
|
100
|
-
{
|
|
101
|
-
operationId: "internal_telemetry_auth_fallback",
|
|
102
|
-
endpoint: "internal/telemetry/auth-fallback",
|
|
103
|
-
method: "POST",
|
|
104
|
-
policy: {
|
|
105
|
-
requiredScopes: ["internal.write"],
|
|
106
|
-
allowedPrincipalTypes: GATEWAY_PRINCIPALS,
|
|
107
|
-
},
|
|
108
|
-
summary: "Record auth-fallback counts",
|
|
109
|
-
description:
|
|
110
|
-
"Receives aggregated legacy-loopback auth-fallback counts forwarded by " +
|
|
111
|
-
"the gateway and persists them for telemetry reporting.",
|
|
112
|
-
tags: ["internal", "telemetry"],
|
|
113
|
-
requestBody: authFallbackBody,
|
|
114
|
-
responseBody: z.union([
|
|
115
|
-
z.object({ recorded: z.number().int().nonnegative() }),
|
|
116
|
-
z.object({
|
|
117
|
-
skipped: z
|
|
118
|
-
.literal(true)
|
|
119
|
-
.describe("Counts dropped because usage data collection is disabled"),
|
|
120
|
-
}),
|
|
121
|
-
]),
|
|
122
|
-
handler: handleRecordAuthFallback,
|
|
123
|
-
},
|
|
124
|
-
{
|
|
125
|
-
operationId: "internal_telemetry_watchdog",
|
|
126
|
-
endpoint: "internal/telemetry/watchdog",
|
|
127
|
-
method: "POST",
|
|
128
|
-
policy: {
|
|
129
|
-
requiredScopes: ["internal.write"],
|
|
130
|
-
allowedPrincipalTypes: GATEWAY_PRINCIPALS,
|
|
131
|
-
},
|
|
132
|
-
summary: "Relay a watchdog telemetry event",
|
|
133
|
-
description:
|
|
134
|
-
"Emits a gateway-origin watchdog telemetry event directly to platform " +
|
|
135
|
-
"ingest, bypassing the SQLite watchdog buffer, so integrity alarms " +
|
|
136
|
-
"never depend on the state they report on.",
|
|
137
|
-
tags: ["internal", "telemetry"],
|
|
138
|
-
requestBody: watchdogRelayBody,
|
|
139
|
-
responseBody: z.object({ ok: z.literal(true) }),
|
|
140
|
-
handler: handleRelayWatchdogEvent,
|
|
141
|
-
},
|
|
142
|
-
];
|
|
@@ -1,274 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Route handlers for telemetry lifecycle events.
|
|
3
|
-
*
|
|
4
|
-
* POST /v1/telemetry/lifecycle — record a lifecycle event (app_open, hatch).
|
|
5
|
-
* POST /v1/telemetry/ingest — record any outbox-backed telemetry event by its
|
|
6
|
-
* wire `type` + `fields`.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { z } from "zod";
|
|
10
|
-
|
|
11
|
-
import { recordLifecycleEvent } from "../../persistence/lifecycle-events-store.js";
|
|
12
|
-
import { recordTelemetryOutboxEvent } from "../../telemetry/telemetry-events-outbox.js";
|
|
13
|
-
import {
|
|
14
|
-
getWireFieldsSchema,
|
|
15
|
-
getWireSchemaForType,
|
|
16
|
-
} from "../../telemetry/telemetry-wire-validation.js";
|
|
17
|
-
import type {
|
|
18
|
-
OutboxTelemetryEventName,
|
|
19
|
-
TelemetryEvent,
|
|
20
|
-
} from "../../telemetry/types.js";
|
|
21
|
-
import { OUTBOX_TELEMETRY_EVENT_NAMES } from "../../telemetry/types.js";
|
|
22
|
-
import { getUsageTelemetryReporter } from "../../telemetry/usage-telemetry-reporter.js";
|
|
23
|
-
import { getLogger } from "../../util/logger.js";
|
|
24
|
-
import { APP_VERSION } from "../../version.js";
|
|
25
|
-
import { ACTOR_PRINCIPALS } from "../auth/route-policy.js";
|
|
26
|
-
import { BadRequestError } from "./errors.js";
|
|
27
|
-
import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
|
|
28
|
-
|
|
29
|
-
const log = getLogger("telemetry-routes");
|
|
30
|
-
|
|
31
|
-
const VALID_EVENT_NAMES = new Set(["app_open", "hatch"]);
|
|
32
|
-
|
|
33
|
-
const ingestDaemonEventIdSchema = z
|
|
34
|
-
.string()
|
|
35
|
-
.min(1)
|
|
36
|
-
.max(128)
|
|
37
|
-
.optional()
|
|
38
|
-
.describe(
|
|
39
|
-
"Optional collapse key: rows sharing an id collapse downstream " +
|
|
40
|
-
"(e.g. a retried report). Defaults to a fresh per-row id.",
|
|
41
|
-
);
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* One request variant per outbox-backed type: `{ type, fields, daemon_event_id? }`
|
|
45
|
-
* where `fields` is the wire schema for that type minus the daemon-stamped base
|
|
46
|
-
* fields. Throws at module load if an outbox name has no wire schema (an
|
|
47
|
-
* impossible drift between the outbox name list and the wire contract).
|
|
48
|
-
*/
|
|
49
|
-
function buildIngestVariant(name: OutboxTelemetryEventName) {
|
|
50
|
-
const fields = getWireFieldsSchema(name);
|
|
51
|
-
if (!fields) {
|
|
52
|
-
throw new Error(`No wire schema for outbox telemetry type "${name}".`);
|
|
53
|
-
}
|
|
54
|
-
return z.object({
|
|
55
|
-
type: z.literal(name),
|
|
56
|
-
fields: fields.describe(
|
|
57
|
-
"Wire event fields, excluding the daemon-stamped base fields " +
|
|
58
|
-
"(type, daemon_event_id, recorded_at, assistant_version).",
|
|
59
|
-
),
|
|
60
|
-
daemon_event_id: ingestDaemonEventIdSchema,
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* Request shape for `POST /v1/telemetry/ingest`: a discriminated union over
|
|
66
|
-
* every outbox-backed event type, each carrying that type's wire `fields`.
|
|
67
|
-
* Derived from the wire contract, so the generated SDK body is strongly typed
|
|
68
|
-
* and stays in sync as the wire schemas evolve.
|
|
69
|
-
*/
|
|
70
|
-
const telemetryIngestRequestSchema = z.discriminatedUnion(
|
|
71
|
-
"type",
|
|
72
|
-
// `.map` widens to `ZodObject[]`, but `discriminatedUnion` wants a non-empty
|
|
73
|
-
// tuple. The outbox name list is non-empty, and the RUNTIME schema (not this
|
|
74
|
-
// static type) is what codegen introspects, so the cast doesn't affect the
|
|
75
|
-
// emitted OpenAPI/SDK types.
|
|
76
|
-
OUTBOX_TELEMETRY_EVENT_NAMES.map(buildIngestVariant) as [
|
|
77
|
-
ReturnType<typeof buildIngestVariant>,
|
|
78
|
-
...ReturnType<typeof buildIngestVariant>[],
|
|
79
|
-
],
|
|
80
|
-
);
|
|
81
|
-
|
|
82
|
-
/** Placeholder id satisfying the wire schema's `daemon_event_id` bound during
|
|
83
|
-
* the up-front validation pass; the real id is stamped at record time. */
|
|
84
|
-
const VALIDATION_PROBE_DAEMON_EVENT_ID = "validation-probe";
|
|
85
|
-
|
|
86
|
-
function handleRecordLifecycleEvent({ body }: RouteHandlerArgs) {
|
|
87
|
-
const eventName = body?.event_name as string | undefined;
|
|
88
|
-
if (!eventName || !VALID_EVENT_NAMES.has(eventName)) {
|
|
89
|
-
throw new BadRequestError(
|
|
90
|
-
`event_name must be one of: ${[...VALID_EVENT_NAMES].join(", ")}`,
|
|
91
|
-
);
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
const event = recordLifecycleEvent(eventName);
|
|
95
|
-
if (!event) {
|
|
96
|
-
return { skipped: true };
|
|
97
|
-
}
|
|
98
|
-
log.info({ eventName, eventId: event.id }, "Recorded lifecycle event");
|
|
99
|
-
|
|
100
|
-
return { id: event.id, event_name: event.eventName };
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
async function handleTelemetryFlush() {
|
|
104
|
-
const reporter = getUsageTelemetryReporter();
|
|
105
|
-
if (!reporter) {
|
|
106
|
-
return { flushed: false, reason: "disabled" };
|
|
107
|
-
}
|
|
108
|
-
return reporter.flush();
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/**
|
|
112
|
-
* Record any outbox-backed telemetry event reported by a client. This is the
|
|
113
|
-
* generic bridge that exposes the daemon's in-process `recordTelemetryEvent`
|
|
114
|
-
* recorder to clients over HTTP/IPC — for events the client observes and the
|
|
115
|
-
* daemon can't detect on its own (e.g. `onboarding_research`).
|
|
116
|
-
*
|
|
117
|
-
* Three guarantees before a row lands:
|
|
118
|
-
* 1. `type` must be an outbox-backed event and `fields` must match that
|
|
119
|
-
* type's wire shape — both enforced by the discriminated-union parse. The
|
|
120
|
-
* watermark types (`turn`, `llm_usage`, `tool_executed`) are excluded
|
|
121
|
-
* structurally: they aren't outbox-backed, so they have no variant.
|
|
122
|
-
* 2. The assembled event must additionally pass the full wire schema for the
|
|
123
|
-
* byte-bound superRefines the request `fields` schema drops (oversize
|
|
124
|
-
* claims/suggestions).
|
|
125
|
-
* 3. Consent is enforced by {@link recordTelemetryOutboxEvent} (the
|
|
126
|
-
* `share_analytics` gate), same as every daemon-internal emitter.
|
|
127
|
-
*
|
|
128
|
-
* An optional `daemon_event_id` lets the client supply a collapse key (e.g. a
|
|
129
|
-
* refresh-retried report reusing a conversation-scoped id); it defaults to the
|
|
130
|
-
* fresh row id. A `conversation_id` field on the event is threaded into the
|
|
131
|
-
* outbox row's dedicated column so pending rows redact on conversation deletion
|
|
132
|
-
* via the indexed delete.
|
|
133
|
-
*/
|
|
134
|
-
function handleTelemetryIngest({ body }: RouteHandlerArgs) {
|
|
135
|
-
const parsed = telemetryIngestRequestSchema.safeParse(body);
|
|
136
|
-
if (!parsed.success) {
|
|
137
|
-
throw new BadRequestError(parsed.error.message);
|
|
138
|
-
}
|
|
139
|
-
const { type, fields, daemon_event_id: daemonEventId } = parsed.data;
|
|
140
|
-
|
|
141
|
-
// `type` matched a union variant (an outbox-backed event), so a wire schema
|
|
142
|
-
// is guaranteed — its absence is an invariant breach, not a client error.
|
|
143
|
-
const wireSchema = getWireSchemaForType(type);
|
|
144
|
-
if (!wireSchema) {
|
|
145
|
-
throw new Error(`No wire schema registered for outbox type "${type}".`);
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
// Re-validate the assembled event against the full wire schema for the
|
|
149
|
-
// byte-bound superRefines the request `fields` schema drops. Up front (with
|
|
150
|
-
// placeholder base values) so an oversize payload 400s regardless of consent.
|
|
151
|
-
// The `.trim()`-transformed parse output is discarded: `fields` are recorded
|
|
152
|
-
// verbatim, matching pre-flush validation's non-mutating contract.
|
|
153
|
-
const validation = wireSchema.safeParse({
|
|
154
|
-
...fields,
|
|
155
|
-
type,
|
|
156
|
-
daemon_event_id: daemonEventId ?? VALIDATION_PROBE_DAEMON_EVENT_ID,
|
|
157
|
-
recorded_at: 0,
|
|
158
|
-
assistant_version: APP_VERSION,
|
|
159
|
-
});
|
|
160
|
-
if (!validation.success) {
|
|
161
|
-
throw new BadRequestError(validation.error.message);
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
const conversationId =
|
|
165
|
-
"conversation_id" in fields && typeof fields.conversation_id === "string"
|
|
166
|
-
? fields.conversation_id
|
|
167
|
-
: null;
|
|
168
|
-
|
|
169
|
-
const event = recordTelemetryOutboxEvent(
|
|
170
|
-
type,
|
|
171
|
-
(id, createdAt): TelemetryEvent =>
|
|
172
|
-
// Base fields stamped after the spread so a `fields` payload carrying a
|
|
173
|
-
// base key can never override the daemon's stamp.
|
|
174
|
-
({
|
|
175
|
-
...fields,
|
|
176
|
-
type,
|
|
177
|
-
daemon_event_id: daemonEventId ?? id,
|
|
178
|
-
recorded_at: createdAt,
|
|
179
|
-
assistant_version: APP_VERSION,
|
|
180
|
-
}) as TelemetryEvent,
|
|
181
|
-
{ conversationId },
|
|
182
|
-
);
|
|
183
|
-
if (!event) {
|
|
184
|
-
return { skipped: true };
|
|
185
|
-
}
|
|
186
|
-
log.info({ type, eventId: event.id }, "Recorded client telemetry event");
|
|
187
|
-
|
|
188
|
-
return { id: event.id };
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
export const ROUTES: RouteDefinition[] = [
|
|
192
|
-
{
|
|
193
|
-
operationId: "telemetry_lifecycle",
|
|
194
|
-
endpoint: "telemetry/lifecycle",
|
|
195
|
-
method: "POST",
|
|
196
|
-
policy: {
|
|
197
|
-
requiredScopes: ["settings.write"],
|
|
198
|
-
allowedPrincipalTypes: ACTOR_PRINCIPALS,
|
|
199
|
-
},
|
|
200
|
-
summary: "Record lifecycle event",
|
|
201
|
-
description: "Record a telemetry lifecycle event (app_open, hatch).",
|
|
202
|
-
tags: ["telemetry"],
|
|
203
|
-
requestBody: z.object({
|
|
204
|
-
event_name: z.string().describe("Event name: app_open or hatch"),
|
|
205
|
-
}),
|
|
206
|
-
responseBody: z.union([
|
|
207
|
-
z.object({
|
|
208
|
-
id: z.string().describe("Event ID"),
|
|
209
|
-
event_name: z.string(),
|
|
210
|
-
}),
|
|
211
|
-
z.object({
|
|
212
|
-
skipped: z
|
|
213
|
-
.literal(true)
|
|
214
|
-
.describe(
|
|
215
|
-
"Event skipped due to usage data collection being disabled",
|
|
216
|
-
),
|
|
217
|
-
}),
|
|
218
|
-
]),
|
|
219
|
-
handler: handleRecordLifecycleEvent,
|
|
220
|
-
},
|
|
221
|
-
{
|
|
222
|
-
operationId: "telemetry_flush",
|
|
223
|
-
endpoint: "telemetry/flush",
|
|
224
|
-
method: "POST",
|
|
225
|
-
policy: {
|
|
226
|
-
requiredScopes: ["settings.write"],
|
|
227
|
-
allowedPrincipalTypes: ACTOR_PRINCIPALS,
|
|
228
|
-
},
|
|
229
|
-
summary: "Flush pending telemetry events",
|
|
230
|
-
description:
|
|
231
|
-
"Force-flush the telemetry events owned by the assistant process (turn events) to the cloud. Other event types are flushed on their own cycle by the resource monitor process.",
|
|
232
|
-
tags: ["telemetry"],
|
|
233
|
-
responseBody: z.union([
|
|
234
|
-
z.object({
|
|
235
|
-
flushed: z.literal(true),
|
|
236
|
-
sent: z.number().describe("Events POSTed to the cloud"),
|
|
237
|
-
persisted: z.number().describe("Events the cloud confirmed written"),
|
|
238
|
-
dropped: z
|
|
239
|
-
.number()
|
|
240
|
-
.describe("Events that did not land (sent - persisted)"),
|
|
241
|
-
}),
|
|
242
|
-
z.object({
|
|
243
|
-
flushed: z.literal(false),
|
|
244
|
-
reason: z.string(),
|
|
245
|
-
}),
|
|
246
|
-
]),
|
|
247
|
-
handler: handleTelemetryFlush,
|
|
248
|
-
},
|
|
249
|
-
{
|
|
250
|
-
operationId: "telemetry_ingest",
|
|
251
|
-
endpoint: "telemetry/ingest",
|
|
252
|
-
method: "POST",
|
|
253
|
-
policy: {
|
|
254
|
-
requiredScopes: ["settings.write"],
|
|
255
|
-
allowedPrincipalTypes: ACTOR_PRINCIPALS,
|
|
256
|
-
},
|
|
257
|
-
summary: "Record an outbox-backed telemetry event",
|
|
258
|
-
description:
|
|
259
|
-
"Record any outbox-backed telemetry event by its wire `type` + `fields`. For events a client observes and the daemon can't detect on its own (e.g. onboarding_research). The type must be an outbox-backed event — the watermark types (turn, llm_usage, tool_executed) have no variant — and the payload must pass the cloud wire schema. Gated on share_analytics consent like every other outbox-backed event; the cloud re-checks the owner's consent server-side at ingest.",
|
|
260
|
-
tags: ["telemetry"],
|
|
261
|
-
requestBody: telemetryIngestRequestSchema,
|
|
262
|
-
responseBody: z.union([
|
|
263
|
-
z.object({ id: z.string().describe("Event ID") }),
|
|
264
|
-
z.object({
|
|
265
|
-
skipped: z
|
|
266
|
-
.literal(true)
|
|
267
|
-
.describe(
|
|
268
|
-
"Event skipped: usage data collection is disabled or the telemetry database is unavailable",
|
|
269
|
-
),
|
|
270
|
-
}),
|
|
271
|
-
]),
|
|
272
|
-
handler: handleTelemetryIngest,
|
|
273
|
-
},
|
|
274
|
-
];
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import { v4 as uuid } from "uuid";
|
|
2
|
-
|
|
3
|
-
import { getRawShareAnalytics } from "../cloud/consent-cache.js";
|
|
4
|
-
import { insertTelemetryOutboxEvents } from "../telemetry/telemetry-events-outbox.js";
|
|
5
|
-
import type { AuthFallbackTelemetryEvent } from "../telemetry/types.js";
|
|
6
|
-
import { APP_VERSION } from "../version.js";
|
|
7
|
-
|
|
8
|
-
/** A single aggregated auth-fallback count for one (guard, path, failure_kind). */
|
|
9
|
-
export interface AuthFallbackCount {
|
|
10
|
-
guard: string;
|
|
11
|
-
path: string;
|
|
12
|
-
failureKind: string;
|
|
13
|
-
count: number;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Record a batch of aggregated auth-fallback counts forwarded by the gateway —
|
|
18
|
-
* one `telemetry_events` outbox row per count entry, all sharing the same
|
|
19
|
-
* flush window, each carrying its full wire event built at record time. The
|
|
20
|
-
* whole batch inserts atomically, so a failure never leaves a partial batch
|
|
21
|
-
* committed (the gateway retries the full batch on `recorded === 0`). Returns
|
|
22
|
-
* the number of rows recorded, or 0 when `share_analytics` is a confirmed
|
|
23
|
-
* opt-out (the counts are dropped to honor it, matching the rest of
|
|
24
|
-
* telemetry — an unknown consent state records) or the telemetry database is
|
|
25
|
-
* unavailable (degraded mode). Callers that must tell those apart check
|
|
26
|
-
* `getRawShareAnalytics()` themselves.
|
|
27
|
-
*/
|
|
28
|
-
export function recordAuthFallbackCounts(
|
|
29
|
-
windowStart: number,
|
|
30
|
-
windowEnd: number,
|
|
31
|
-
counts: AuthFallbackCount[],
|
|
32
|
-
): number {
|
|
33
|
-
if (getRawShareAnalytics() === false) {
|
|
34
|
-
return 0;
|
|
35
|
-
}
|
|
36
|
-
if (counts.length === 0) {
|
|
37
|
-
return 0;
|
|
38
|
-
}
|
|
39
|
-
const createdAt = Date.now();
|
|
40
|
-
const rows = counts.map((c) => {
|
|
41
|
-
const id = uuid();
|
|
42
|
-
const event: AuthFallbackTelemetryEvent = {
|
|
43
|
-
type: "auth_fallback",
|
|
44
|
-
daemon_event_id: id,
|
|
45
|
-
recorded_at: createdAt,
|
|
46
|
-
guard: c.guard,
|
|
47
|
-
path: c.path,
|
|
48
|
-
failure_kind: c.failureKind,
|
|
49
|
-
count: c.count,
|
|
50
|
-
window_start: windowStart,
|
|
51
|
-
window_end: windowEnd,
|
|
52
|
-
assistant_version: APP_VERSION,
|
|
53
|
-
};
|
|
54
|
-
return { id, name: "auth_fallback", createdAt, event };
|
|
55
|
-
});
|
|
56
|
-
return insertTelemetryOutboxEvents(rows) ? rows.length : 0;
|
|
57
|
-
}
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
import { describe, expect, test } from "bun:test";
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
ACTIVATION_MOMENT_PARAMS,
|
|
5
|
-
ACTIVATION_STEPS,
|
|
6
|
-
activationStepIndex,
|
|
7
|
-
activationStepNameForMomentParam,
|
|
8
|
-
buildActivationDaemonEventId,
|
|
9
|
-
isActivationMomentParam,
|
|
10
|
-
isActivationStepName,
|
|
11
|
-
} from "../activation-funnel.js";
|
|
12
|
-
|
|
13
|
-
const ALL_STEP_NAMES = Object.values(ACTIVATION_STEPS).map((s) => s.stepName);
|
|
14
|
-
|
|
15
|
-
describe("activation funnel vocabulary", () => {
|
|
16
|
-
test("step indices are 1-5 and unique", () => {
|
|
17
|
-
const indices = Object.values(ACTIVATION_STEPS).map((s) => s.stepIndex);
|
|
18
|
-
expect([...indices].sort((a, b) => a - b)).toEqual([1, 2, 3, 4, 5]);
|
|
19
|
-
expect(new Set(indices).size).toBe(indices.length);
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
test("activationStepIndex resolves index from name", () => {
|
|
23
|
-
for (const { stepName, stepIndex } of Object.values(ACTIVATION_STEPS)) {
|
|
24
|
-
expect(activationStepIndex(stepName)).toBe(stepIndex);
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
test("isActivationStepName accepts all five step names", () => {
|
|
29
|
-
expect(ALL_STEP_NAMES).toHaveLength(5);
|
|
30
|
-
for (const stepName of ALL_STEP_NAMES) {
|
|
31
|
-
expect(isActivationStepName(stepName)).toBe(true);
|
|
32
|
-
}
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
test("isActivationStepName rejects unknown names", () => {
|
|
36
|
-
expect(isActivationStepName("bogus")).toBe(false);
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
test("buildActivationDaemonEventId is deterministic", () => {
|
|
40
|
-
expect(
|
|
41
|
-
buildActivationDaemonEventId("conv-abc", "activation_moment_1_complete"),
|
|
42
|
-
).toBe("activation_v1_2026_06:conv-abc:activation_moment_1_complete");
|
|
43
|
-
});
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
describe("activation moment param (model-facing tag)", () => {
|
|
47
|
-
test("ACTIVATION_MOMENT_PARAMS lists the five tokens in step order", () => {
|
|
48
|
-
expect(ACTIVATION_MOMENT_PARAMS).toEqual([
|
|
49
|
-
"moment_1",
|
|
50
|
-
"moment_2",
|
|
51
|
-
"moment_3",
|
|
52
|
-
"first_wow_executed",
|
|
53
|
-
"first_wow_interacted",
|
|
54
|
-
]);
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
test("isActivationMomentParam accepts all five tokens", () => {
|
|
58
|
-
for (const param of ACTIVATION_MOMENT_PARAMS) {
|
|
59
|
-
expect(isActivationMomentParam(param)).toBe(true);
|
|
60
|
-
}
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
test("isActivationMomentParam rejects unknown tokens (incl. wire step names)", () => {
|
|
64
|
-
expect(isActivationMomentParam("bogus")).toBe(false);
|
|
65
|
-
// The wire step name is NOT a valid model-facing token.
|
|
66
|
-
expect(isActivationMomentParam("activation_moment_1_complete")).toBe(false);
|
|
67
|
-
expect(isActivationMomentParam("moment_4")).toBe(false);
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
test("activationStepNameForMomentParam maps each token to its step name", () => {
|
|
71
|
-
expect(activationStepNameForMomentParam("moment_1")).toBe(
|
|
72
|
-
ACTIVATION_STEPS.moment1.stepName,
|
|
73
|
-
);
|
|
74
|
-
expect(activationStepNameForMomentParam("moment_2")).toBe(
|
|
75
|
-
ACTIVATION_STEPS.moment2.stepName,
|
|
76
|
-
);
|
|
77
|
-
expect(activationStepNameForMomentParam("moment_3")).toBe(
|
|
78
|
-
ACTIVATION_STEPS.moment3.stepName,
|
|
79
|
-
);
|
|
80
|
-
expect(activationStepNameForMomentParam("first_wow_executed")).toBe(
|
|
81
|
-
ACTIVATION_STEPS.firstWowExecuted.stepName,
|
|
82
|
-
);
|
|
83
|
-
expect(activationStepNameForMomentParam("first_wow_interacted")).toBe(
|
|
84
|
-
ACTIVATION_STEPS.firstWowInteracted.stepName,
|
|
85
|
-
);
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
test("every moment param maps to a valid wire step name", () => {
|
|
89
|
-
for (const param of ACTIVATION_MOMENT_PARAMS) {
|
|
90
|
-
expect(
|
|
91
|
-
isActivationStepName(activationStepNameForMomentParam(param)),
|
|
92
|
-
).toBe(true);
|
|
93
|
-
}
|
|
94
|
-
});
|
|
95
|
-
});
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import { beforeEach, describe, expect, test } from "bun:test";
|
|
2
|
-
|
|
3
|
-
import { APP_VERSION } from "../../version.js";
|
|
4
|
-
import { recordConfigSettingEvent } from "../config-setting-events-store.js";
|
|
5
|
-
import {
|
|
6
|
-
pendingOutboxPayloads,
|
|
7
|
-
pendingOutboxRows,
|
|
8
|
-
resetOutboxTable,
|
|
9
|
-
setShareAnalytics,
|
|
10
|
-
} from "./outbox-test-harness.js";
|
|
11
|
-
|
|
12
|
-
describe("config-setting-events-store", () => {
|
|
13
|
-
beforeEach(() => {
|
|
14
|
-
setShareAnalytics(true);
|
|
15
|
-
resetOutboxTable();
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
test("honors the share_analytics opt-out (records nothing, returns false)", () => {
|
|
19
|
-
setShareAnalytics(false);
|
|
20
|
-
expect(
|
|
21
|
-
recordConfigSettingEvent({
|
|
22
|
-
configKey: "memory.enabled",
|
|
23
|
-
configValue: "true",
|
|
24
|
-
}),
|
|
25
|
-
).toBe(false);
|
|
26
|
-
expect(pendingOutboxRows("config_setting", 10)).toHaveLength(0);
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
test("records the full wire event and returns true", () => {
|
|
30
|
-
expect(
|
|
31
|
-
recordConfigSettingEvent({
|
|
32
|
-
configKey: "memory.v2.enabled",
|
|
33
|
-
configValue: "false",
|
|
34
|
-
}),
|
|
35
|
-
).toBe(true);
|
|
36
|
-
|
|
37
|
-
const rows = pendingOutboxRows("config_setting", 10);
|
|
38
|
-
expect(rows).toHaveLength(1);
|
|
39
|
-
const row = rows[0]!;
|
|
40
|
-
expect(row.id).toBeString();
|
|
41
|
-
expect(row.createdAt).toBeGreaterThan(0);
|
|
42
|
-
expect(JSON.parse(row.payload)).toEqual({
|
|
43
|
-
type: "config_setting",
|
|
44
|
-
daemon_event_id: row.id,
|
|
45
|
-
recorded_at: row.createdAt,
|
|
46
|
-
config_key: "memory.v2.enabled",
|
|
47
|
-
config_value: "false",
|
|
48
|
-
assistant_version: APP_VERSION,
|
|
49
|
-
});
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
test("clamps oversize key and value to the cloud bounds", () => {
|
|
53
|
-
recordConfigSettingEvent({
|
|
54
|
-
configKey: "k".repeat(200),
|
|
55
|
-
configValue: "v".repeat(300),
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
const payloads = pendingOutboxPayloads("config_setting");
|
|
59
|
-
expect(payloads).toHaveLength(1);
|
|
60
|
-
expect(payloads[0]!.config_key).toBe("k".repeat(128));
|
|
61
|
-
expect(payloads[0]!.config_value).toBe("v".repeat(256));
|
|
62
|
-
});
|
|
63
|
-
});
|