@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,50 +1,19 @@
|
|
|
1
1
|
import { beforeEach, describe, expect, mock, test } from "bun:test";
|
|
2
2
|
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
let shareAnalytics: boolean | "unknown" = true;
|
|
6
|
-
|
|
7
|
-
mock.module("../cloud/consent-cache.js", () => ({
|
|
8
|
-
getRawShareAnalytics: () => shareAnalytics,
|
|
9
|
-
}));
|
|
10
|
-
|
|
11
|
-
// Capture the audit rows the terminals would insert, and the lifecycle events
|
|
12
|
-
// they would record, without touching the database.
|
|
3
|
+
// Capture the audit rows the terminals would insert, without touching the
|
|
4
|
+
// database.
|
|
13
5
|
const records: Array<Record<string, unknown>> = [];
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
attributes: Record<string, unknown>;
|
|
17
|
-
}> = [];
|
|
18
|
-
const lifecycleEventNames = (): string[] =>
|
|
19
|
-
lifecycleEvents.map((event) => event.eventName);
|
|
20
|
-
// Simulates the telemetry store failing (degraded DB) for the one test that
|
|
21
|
-
// asserts the terminals swallow it.
|
|
22
|
-
let lifecycleRecorderThrows = false;
|
|
23
|
-
|
|
24
|
-
mock.module("../telemetry/tool-usage-store.js", () => ({
|
|
6
|
+
|
|
7
|
+
mock.module("../persistence/tool-usage-store.js", () => ({
|
|
25
8
|
recordToolInvocation: (record: Record<string, unknown>) =>
|
|
26
9
|
records.push(record),
|
|
27
10
|
}));
|
|
28
11
|
|
|
29
|
-
mock.module("../persistence/lifecycle-events-store.js", () => ({
|
|
30
|
-
recordLifecycleEvent: (
|
|
31
|
-
eventName: string,
|
|
32
|
-
attributes: Record<string, unknown> = {},
|
|
33
|
-
) => {
|
|
34
|
-
if (lifecycleRecorderThrows) {
|
|
35
|
-
throw new Error("telemetry db down");
|
|
36
|
-
}
|
|
37
|
-
lifecycleEvents.push({ eventName, attributes });
|
|
38
|
-
},
|
|
39
|
-
}));
|
|
40
|
-
|
|
41
12
|
import {
|
|
42
13
|
recordToolDenied,
|
|
43
14
|
recordToolError,
|
|
44
15
|
recordToolExecuted,
|
|
45
|
-
|
|
46
|
-
recordToolPermissionPrompted,
|
|
47
|
-
} from "../telemetry/tool-audit.js";
|
|
16
|
+
} from "../persistence/tool-audit.js";
|
|
48
17
|
import {
|
|
49
18
|
OPENAI_PROJECT_KEY_REDACTION_MARKER,
|
|
50
19
|
SYNTHETIC_OPENAI_PROJECT_KEY,
|
|
@@ -64,10 +33,7 @@ const ATTRIBUTION = {
|
|
|
64
33
|
|
|
65
34
|
describe("tool audit terminals", () => {
|
|
66
35
|
beforeEach(() => {
|
|
67
|
-
shareAnalytics = true;
|
|
68
|
-
lifecycleRecorderThrows = false;
|
|
69
36
|
records.length = 0;
|
|
70
|
-
lifecycleEvents.length = 0;
|
|
71
37
|
});
|
|
72
38
|
|
|
73
39
|
test("records executed rows with truncated output", () => {
|
|
@@ -333,87 +299,6 @@ describe("tool audit terminals", () => {
|
|
|
333
299
|
);
|
|
334
300
|
});
|
|
335
301
|
|
|
336
|
-
test("persists NULL telemetry columns when share_analytics is opted out", () => {
|
|
337
|
-
shareAnalytics = false;
|
|
338
|
-
|
|
339
|
-
recordToolExecuted({
|
|
340
|
-
conversationId: "conv-opt-out",
|
|
341
|
-
toolName: "file_read",
|
|
342
|
-
input: { path: "/tmp/a" },
|
|
343
|
-
resultContent: "ok",
|
|
344
|
-
resultBytes: 99,
|
|
345
|
-
decision: "allow",
|
|
346
|
-
riskLevel: "low",
|
|
347
|
-
durationMs: 12,
|
|
348
|
-
attribution: ATTRIBUTION,
|
|
349
|
-
});
|
|
350
|
-
recordToolError({
|
|
351
|
-
conversationId: "conv-opt-out",
|
|
352
|
-
toolName: "file_read",
|
|
353
|
-
input: { path: "/tmp/b" },
|
|
354
|
-
errorMessage: "boom",
|
|
355
|
-
isExpected: false,
|
|
356
|
-
riskLevel: "low",
|
|
357
|
-
durationMs: 9,
|
|
358
|
-
attribution: ATTRIBUTION,
|
|
359
|
-
});
|
|
360
|
-
|
|
361
|
-
// Telemetry columns are NULL — the tool_executed projection's
|
|
362
|
-
// arg_bytes IS NOT NULL filter makes these rows permanently unreportable.
|
|
363
|
-
expect(records).toHaveLength(2);
|
|
364
|
-
for (const record of records) {
|
|
365
|
-
expect(record.argBytes).toBeNull();
|
|
366
|
-
expect(record.resultBytes).toBeNull();
|
|
367
|
-
expect(record.provider).toBeNull();
|
|
368
|
-
expect(record.model).toBeNull();
|
|
369
|
-
expect(record.inferenceProfile).toBeNull();
|
|
370
|
-
expect(record.inferenceProfileSource).toBeNull();
|
|
371
|
-
}
|
|
372
|
-
// The audit row itself is unaffected by the opt-out.
|
|
373
|
-
expect(records[0]).toMatchObject({
|
|
374
|
-
conversationId: "conv-opt-out",
|
|
375
|
-
toolName: "file_read",
|
|
376
|
-
input: JSON.stringify({ path: "/tmp/a" }),
|
|
377
|
-
result: "ok",
|
|
378
|
-
decision: "allow",
|
|
379
|
-
durationMs: 12,
|
|
380
|
-
});
|
|
381
|
-
expect(records[1]).toMatchObject({
|
|
382
|
-
result: "error: boom",
|
|
383
|
-
decision: "error",
|
|
384
|
-
durationMs: 9,
|
|
385
|
-
});
|
|
386
|
-
});
|
|
387
|
-
|
|
388
|
-
test("populates telemetry columns under unknown consent (cold cache)", () => {
|
|
389
|
-
// NULL columns are permanently excluded by the projection's
|
|
390
|
-
// arg_bytes IS NOT NULL filter, so only a CONFIRMED opt-out may NULL
|
|
391
|
-
// them — unknown records, and flush-time consent gating decides later.
|
|
392
|
-
shareAnalytics = "unknown";
|
|
393
|
-
|
|
394
|
-
recordToolExecuted({
|
|
395
|
-
conversationId: "conv-unknown",
|
|
396
|
-
toolName: "file_read",
|
|
397
|
-
input: { path: "/tmp/a" },
|
|
398
|
-
resultContent: "ok",
|
|
399
|
-
resultBytes: 99,
|
|
400
|
-
decision: "allow",
|
|
401
|
-
riskLevel: "low",
|
|
402
|
-
durationMs: 12,
|
|
403
|
-
attribution: ATTRIBUTION,
|
|
404
|
-
});
|
|
405
|
-
|
|
406
|
-
expect(records).toHaveLength(1);
|
|
407
|
-
expect(records[0]).toMatchObject({
|
|
408
|
-
argBytes: Buffer.byteLength(JSON.stringify({ path: "/tmp/a" }), "utf8"),
|
|
409
|
-
resultBytes: 99,
|
|
410
|
-
provider: "anthropic",
|
|
411
|
-
model: "model-a",
|
|
412
|
-
inferenceProfile: "balanced",
|
|
413
|
-
inferenceProfileSource: "active",
|
|
414
|
-
});
|
|
415
|
-
});
|
|
416
|
-
|
|
417
302
|
test("maps attribution onto executed rows and leaves denied rows null", () => {
|
|
418
303
|
recordToolExecuted({
|
|
419
304
|
conversationId: "conv-attr",
|
|
@@ -463,119 +348,4 @@ describe("tool audit terminals", () => {
|
|
|
463
348
|
expect(records[2].argBytes).toBeUndefined();
|
|
464
349
|
expect(records[2].resultBytes).toBeUndefined();
|
|
465
350
|
});
|
|
466
|
-
|
|
467
|
-
test("audit terminals record no permission lifecycle telemetry", () => {
|
|
468
|
-
recordToolExecuted({
|
|
469
|
-
conversationId: "conv-prompt",
|
|
470
|
-
toolName: "bash",
|
|
471
|
-
input: { command: "ls" },
|
|
472
|
-
resultContent: "ok",
|
|
473
|
-
resultBytes: 2,
|
|
474
|
-
decision: "allow",
|
|
475
|
-
riskLevel: "high",
|
|
476
|
-
durationMs: 3,
|
|
477
|
-
attribution: null,
|
|
478
|
-
});
|
|
479
|
-
recordToolDenied({
|
|
480
|
-
conversationId: "conv-prompt",
|
|
481
|
-
toolName: "bash",
|
|
482
|
-
input: { command: "rm -rf /" },
|
|
483
|
-
reason: "Permission denied by user",
|
|
484
|
-
riskLevel: "high",
|
|
485
|
-
durationMs: 1,
|
|
486
|
-
});
|
|
487
|
-
|
|
488
|
-
expect(lifecycleEvents).toEqual([]);
|
|
489
|
-
});
|
|
490
|
-
|
|
491
|
-
test("prompt and decision carry the same grouping dimensions", () => {
|
|
492
|
-
const prompt = {
|
|
493
|
-
toolName: "bash",
|
|
494
|
-
riskLevel: "high",
|
|
495
|
-
riskThreshold: "low",
|
|
496
|
-
surface: "slack",
|
|
497
|
-
conversationId: "conv-prompt",
|
|
498
|
-
};
|
|
499
|
-
|
|
500
|
-
recordToolPermissionPrompted(prompt);
|
|
501
|
-
recordToolPermissionDecided(prompt, "deny");
|
|
502
|
-
|
|
503
|
-
expect(lifecycleEventNames()).toEqual([
|
|
504
|
-
"permission_prompt:bash",
|
|
505
|
-
"permission_decided:bash:deny",
|
|
506
|
-
]);
|
|
507
|
-
for (const event of lifecycleEvents) {
|
|
508
|
-
expect(event.attributes).toEqual({
|
|
509
|
-
toolName: "bash",
|
|
510
|
-
riskLevel: "high",
|
|
511
|
-
riskThreshold: "low",
|
|
512
|
-
surface: "slack",
|
|
513
|
-
conversationId: "conv-prompt",
|
|
514
|
-
});
|
|
515
|
-
}
|
|
516
|
-
});
|
|
517
|
-
|
|
518
|
-
test("optional grouping dimensions are left unset when unknown", () => {
|
|
519
|
-
recordToolPermissionPrompted({ toolName: "file_read", riskLevel: "low" });
|
|
520
|
-
|
|
521
|
-
const attributes = lifecycleEvents[0]!.attributes;
|
|
522
|
-
expect(attributes.toolName).toBe("file_read");
|
|
523
|
-
expect(attributes.riskLevel).toBe("low");
|
|
524
|
-
expect(attributes.riskThreshold).toBeUndefined();
|
|
525
|
-
expect(attributes.surface).toBeUndefined();
|
|
526
|
-
expect(attributes.conversationId).toBeUndefined();
|
|
527
|
-
});
|
|
528
|
-
|
|
529
|
-
test("records an abandoned decision distinctly from a user denial", () => {
|
|
530
|
-
const prompt = { toolName: "bash", riskLevel: "medium" };
|
|
531
|
-
|
|
532
|
-
recordToolPermissionPrompted(prompt);
|
|
533
|
-
recordToolPermissionDecided(prompt, "abandoned");
|
|
534
|
-
|
|
535
|
-
expect(lifecycleEventNames()).toEqual([
|
|
536
|
-
"permission_prompt:bash",
|
|
537
|
-
"permission_decided:bash:abandoned",
|
|
538
|
-
]);
|
|
539
|
-
});
|
|
540
|
-
|
|
541
|
-
test("truncates a long tool name to the wire event-name bound", () => {
|
|
542
|
-
const toolName = `mcp__${"a".repeat(80)}__run`;
|
|
543
|
-
const prompt = { toolName, riskLevel: "high" };
|
|
544
|
-
|
|
545
|
-
recordToolPermissionPrompted(prompt);
|
|
546
|
-
recordToolPermissionDecided(prompt, "abandoned");
|
|
547
|
-
|
|
548
|
-
for (const event of lifecycleEvents) {
|
|
549
|
-
expect(event.eventName.length).toBeLessThanOrEqual(64);
|
|
550
|
-
// The full name still joins the pair.
|
|
551
|
-
expect(event.attributes.toolName).toBe(toolName);
|
|
552
|
-
}
|
|
553
|
-
expect(lifecycleEvents[1]!.eventName.endsWith(":abandoned")).toBe(true);
|
|
554
|
-
});
|
|
555
|
-
|
|
556
|
-
test("clamps a tool name past the wire tool_name bound", () => {
|
|
557
|
-
// A field over its bound fails validation, and a failed event is acked and
|
|
558
|
-
// discarded rather than retried.
|
|
559
|
-
const toolName = `mcp__${"a".repeat(300)}__run`;
|
|
560
|
-
|
|
561
|
-
recordToolPermissionPrompted({ toolName, riskLevel: "high" });
|
|
562
|
-
|
|
563
|
-
expect(lifecycleEvents[0]!.attributes.toolName).toBe(
|
|
564
|
-
toolName.slice(0, 255),
|
|
565
|
-
);
|
|
566
|
-
});
|
|
567
|
-
|
|
568
|
-
test("a failing lifecycle recorder never propagates out of the terminals", () => {
|
|
569
|
-
lifecycleRecorderThrows = true;
|
|
570
|
-
|
|
571
|
-
expect(() =>
|
|
572
|
-
recordToolPermissionPrompted({ toolName: "bash", riskLevel: "high" }),
|
|
573
|
-
).not.toThrow();
|
|
574
|
-
expect(() =>
|
|
575
|
-
recordToolPermissionDecided(
|
|
576
|
-
{ toolName: "bash", riskLevel: "high" },
|
|
577
|
-
"abandoned",
|
|
578
|
-
),
|
|
579
|
-
).not.toThrow();
|
|
580
|
-
});
|
|
581
351
|
});
|
|
@@ -16,7 +16,7 @@ let abortDuringCheck: AbortController | null = null;
|
|
|
16
16
|
// ── audit-terminal captures ───────────────────────────────
|
|
17
17
|
// The executor and its permission/approval collaborators no longer emit
|
|
18
18
|
// lifecycle events through a context callback; they call direct terminal
|
|
19
|
-
// functions in `../
|
|
19
|
+
// functions in `../persistence/tool-audit.js`. Mock those terminals here
|
|
20
20
|
// (declared before importing the ToolExecutor so the mock intercepts the
|
|
21
21
|
// executor's static import) and capture each call into an array. Every test
|
|
22
22
|
// below asserts against these captures instead of an emitted-event stream.
|
|
@@ -59,28 +59,19 @@ interface DeniedCapture {
|
|
|
59
59
|
durationMs: number;
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
-
interface PromptTelemetryCapture {
|
|
63
|
-
toolName: string;
|
|
64
|
-
riskLevel: string;
|
|
65
|
-
riskThreshold?: string;
|
|
66
|
-
surface?: string;
|
|
67
|
-
conversationId?: string;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
62
|
const executedCaptures: ExecutedCapture[] = [];
|
|
71
63
|
const errorCaptures: ErrorCapture[] = [];
|
|
72
64
|
const deniedCaptures: DeniedCapture[] = [];
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
65
|
+
// The permission-prompt telemetry pair (recordToolPermissionPrompted/Decided)
|
|
66
|
+
// died with the telemetry removal; whether a prompt was surfaced is observed
|
|
67
|
+
// through the fake prompter instead (see makePrompter below).
|
|
68
|
+
const promptCalls: Array<{
|
|
69
|
+
toolName: string;
|
|
70
|
+
riskLevel: string;
|
|
71
|
+
conversationId?: string;
|
|
77
72
|
}> = [];
|
|
78
|
-
const promptedToolNames = (): string[] =>
|
|
79
|
-
promptedCaptures.map((entry) => entry.toolName);
|
|
80
|
-
const decidedOutcomes = (): string[] =>
|
|
81
|
-
decidedCaptures.map((decided) => decided.outcome);
|
|
82
73
|
|
|
83
|
-
mock.module("../
|
|
74
|
+
mock.module("../persistence/tool-audit.js", () => ({
|
|
84
75
|
recordToolExecuted: (entry: ExecutedCapture) => {
|
|
85
76
|
executedCaptures.push(entry);
|
|
86
77
|
},
|
|
@@ -90,15 +81,6 @@ mock.module("../telemetry/tool-audit.js", () => ({
|
|
|
90
81
|
recordToolDenied: (entry: DeniedCapture) => {
|
|
91
82
|
deniedCaptures.push(entry);
|
|
92
83
|
},
|
|
93
|
-
recordToolPermissionPrompted: (entry: PromptTelemetryCapture) => {
|
|
94
|
-
promptedCaptures.push(entry);
|
|
95
|
-
},
|
|
96
|
-
recordToolPermissionDecided: (
|
|
97
|
-
entry: PromptTelemetryCapture,
|
|
98
|
-
outcome: string,
|
|
99
|
-
) => {
|
|
100
|
-
decidedCaptures.push({ entry, outcome });
|
|
101
|
-
},
|
|
102
84
|
}));
|
|
103
85
|
|
|
104
86
|
// Analytics consent is granted so any consent-gated telemetry path the audit
|
|
@@ -156,8 +138,8 @@ mock.module("../persistence/conversation-crud.js", () => ({
|
|
|
156
138
|
}));
|
|
157
139
|
|
|
158
140
|
// Mock every export so downstream test files that dynamically import modules
|
|
159
|
-
// with a static `from "../
|
|
160
|
-
mock.module("../
|
|
141
|
+
// with a static `from "../persistence/tool-usage-store.js"` still see all symbols.
|
|
142
|
+
mock.module("../persistence/tool-usage-store.js", () => ({
|
|
161
143
|
recordToolInvocation: () => {},
|
|
162
144
|
getRecentInvocations: () => [],
|
|
163
145
|
rotateToolInvocations: async () => 0,
|
|
@@ -302,7 +284,21 @@ function makePrompter(
|
|
|
302
284
|
}>,
|
|
303
285
|
) {
|
|
304
286
|
return {
|
|
305
|
-
prompt:
|
|
287
|
+
prompt: async (
|
|
288
|
+
toolName: string,
|
|
289
|
+
_input: unknown,
|
|
290
|
+
riskLevel: string,
|
|
291
|
+
_allowlistOptions: unknown,
|
|
292
|
+
_scopeOptions: unknown,
|
|
293
|
+
_previewDiff: unknown,
|
|
294
|
+
conversationId?: string,
|
|
295
|
+
) => {
|
|
296
|
+
// Record that a prompt was actually surfaced (with the risk and
|
|
297
|
+
// conversation the checker resolved) — the telemetry "prompted" half is
|
|
298
|
+
// gone, so the surfaced-prompt observation lives here now.
|
|
299
|
+
promptCalls.push({ toolName, riskLevel, conversationId });
|
|
300
|
+
return promptImpl ? promptImpl() : { decision: promptDecision };
|
|
301
|
+
},
|
|
306
302
|
resolveConfirmation: () => {},
|
|
307
303
|
updateSender: () => {},
|
|
308
304
|
dispose: () => {},
|
|
@@ -323,8 +319,7 @@ describe("ToolExecutor audit terminals", () => {
|
|
|
323
319
|
executedCaptures.length = 0;
|
|
324
320
|
errorCaptures.length = 0;
|
|
325
321
|
deniedCaptures.length = 0;
|
|
326
|
-
|
|
327
|
-
decidedCaptures.length = 0;
|
|
322
|
+
promptCalls.length = 0;
|
|
328
323
|
});
|
|
329
324
|
|
|
330
325
|
test("records executed terminal for allowed execution", async () => {
|
|
@@ -356,7 +351,7 @@ describe("ToolExecutor audit terminals", () => {
|
|
|
356
351
|
test("records permission telemetry per-invocation, not from the turn-level flag", async () => {
|
|
357
352
|
// A prior tool this turn was interactively approved (turn-level
|
|
358
353
|
// `approvedViaPrompt` already true), but THIS call is auto-approved, so it
|
|
359
|
-
// surfaces no prompt and
|
|
354
|
+
// surfaces no prompt and lands directly on the executed terminal.
|
|
360
355
|
const executor = new ToolExecutor(makePrompter());
|
|
361
356
|
|
|
362
357
|
const result = await executor.execute(
|
|
@@ -367,8 +362,7 @@ describe("ToolExecutor audit terminals", () => {
|
|
|
367
362
|
|
|
368
363
|
expect(result).toMatchObject({ isError: false });
|
|
369
364
|
expect(executedCaptures).toHaveLength(1);
|
|
370
|
-
expect(
|
|
371
|
-
expect(decidedCaptures).toHaveLength(0);
|
|
365
|
+
expect(promptCalls).toHaveLength(0);
|
|
372
366
|
});
|
|
373
367
|
|
|
374
368
|
test("records denied terminal when user denies prompt", async () => {
|
|
@@ -389,8 +383,7 @@ describe("ToolExecutor audit terminals", () => {
|
|
|
389
383
|
expect(result.content).toContain("Permission denied");
|
|
390
384
|
|
|
391
385
|
// A prompt was surfaced, then the user's denial recorded a denied terminal.
|
|
392
|
-
expect(
|
|
393
|
-
expect(decidedOutcomes()).toEqual(["deny"]);
|
|
386
|
+
expect(promptCalls.map((c) => c.toolName)).toEqual(["bash"]);
|
|
394
387
|
expect(executedCaptures).toHaveLength(0);
|
|
395
388
|
expect(deniedCaptures).toHaveLength(1);
|
|
396
389
|
const denied = deniedCaptures[0];
|
|
@@ -399,7 +392,7 @@ describe("ToolExecutor audit terminals", () => {
|
|
|
399
392
|
expect(denied.reason).toBe("Permission denied by user");
|
|
400
393
|
});
|
|
401
394
|
|
|
402
|
-
test("
|
|
395
|
+
test("runs the tool when the user approves the prompt", async () => {
|
|
403
396
|
checkerDecision = "prompt";
|
|
404
397
|
checkerReason = "medium risk: requires approval";
|
|
405
398
|
checkerRisk = "medium";
|
|
@@ -413,11 +406,12 @@ describe("ToolExecutor audit terminals", () => {
|
|
|
413
406
|
makeContext({ forcePromptSideEffects: true }),
|
|
414
407
|
);
|
|
415
408
|
|
|
416
|
-
expect(
|
|
417
|
-
expect(
|
|
409
|
+
expect(promptCalls.map((c) => c.toolName)).toEqual(["bash"]);
|
|
410
|
+
expect(executedCaptures).toHaveLength(1);
|
|
411
|
+
expect(deniedCaptures).toHaveLength(0);
|
|
418
412
|
});
|
|
419
413
|
|
|
420
|
-
test("carries risk level and
|
|
414
|
+
test("carries risk level and conversation onto the prompt request", async () => {
|
|
421
415
|
checkerDecision = "prompt";
|
|
422
416
|
checkerReason = "high risk: requires approval";
|
|
423
417
|
checkerRisk = "high";
|
|
@@ -434,14 +428,10 @@ describe("ToolExecutor audit terminals", () => {
|
|
|
434
428
|
const expected = {
|
|
435
429
|
toolName: "bash",
|
|
436
430
|
riskLevel: "high",
|
|
437
|
-
// The gateway is unreachable under test, so the reader falls back to the
|
|
438
|
-
// strict preset. What matters is that the resolved value is recorded.
|
|
439
|
-
riskThreshold: "none",
|
|
440
|
-
surface: "slack",
|
|
441
431
|
conversationId: "conversation-1",
|
|
442
432
|
};
|
|
443
|
-
expect(
|
|
444
|
-
expect(
|
|
433
|
+
expect(promptCalls[0]).toMatchObject(expected);
|
|
434
|
+
expect(deniedCaptures).toHaveLength(1);
|
|
445
435
|
});
|
|
446
436
|
|
|
447
437
|
// ── abandoned prompts ───────────────────────────────
|
|
@@ -470,8 +460,8 @@ describe("ToolExecutor audit terminals", () => {
|
|
|
470
460
|
);
|
|
471
461
|
|
|
472
462
|
expect(result.isError).toBe(true);
|
|
473
|
-
expect(
|
|
474
|
-
expect(
|
|
463
|
+
expect(promptCalls.map((c) => c.toolName)).toEqual(["bash"]);
|
|
464
|
+
expect(deniedCaptures).toHaveLength(1);
|
|
475
465
|
},
|
|
476
466
|
);
|
|
477
467
|
|
|
@@ -496,14 +486,12 @@ describe("ToolExecutor audit terminals", () => {
|
|
|
496
486
|
);
|
|
497
487
|
|
|
498
488
|
expect(result.isError).toBe(true);
|
|
499
|
-
// The invocation did reach the prompt branch and was denied there
|
|
500
|
-
//
|
|
489
|
+
// The invocation did reach the prompt branch and was denied there — the
|
|
490
|
+
// deny is the guard working, not the branch being skipped.
|
|
501
491
|
expect(deniedCaptures).toHaveLength(1);
|
|
502
|
-
expect(promptedCaptures).toHaveLength(0);
|
|
503
|
-
expect(decidedCaptures).toHaveLength(0);
|
|
504
492
|
});
|
|
505
493
|
|
|
506
|
-
test("records an
|
|
494
|
+
test("records an error terminal when the prompter is disposed mid-prompt", async () => {
|
|
507
495
|
checkerDecision = "prompt";
|
|
508
496
|
checkerReason = "medium risk: requires approval";
|
|
509
497
|
checkerRisk = "medium";
|
|
@@ -521,61 +509,13 @@ describe("ToolExecutor audit terminals", () => {
|
|
|
521
509
|
);
|
|
522
510
|
|
|
523
511
|
expect(result.isError).toBe(true);
|
|
524
|
-
expect(
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
checkerRisk = "medium";
|
|
532
|
-
|
|
533
|
-
// One of each terminal shape a prompted invocation can reach: approved and
|
|
534
|
-
// the tool runs, approved and the tool throws, denied, and abandoned.
|
|
535
|
-
const runs: Array<() => Promise<unknown>> = [
|
|
536
|
-
async () => {
|
|
537
|
-
promptDecision = "allow";
|
|
538
|
-
toolThrow = null;
|
|
539
|
-
return new ToolExecutor(makePrompter()).execute(
|
|
540
|
-
"bash",
|
|
541
|
-
{ command: "ls" },
|
|
542
|
-
makeContext({ forcePromptSideEffects: true }),
|
|
543
|
-
);
|
|
544
|
-
},
|
|
545
|
-
async () => {
|
|
546
|
-
promptDecision = "allow";
|
|
547
|
-
toolThrow = new Error("boom");
|
|
548
|
-
return new ToolExecutor(makePrompter()).execute(
|
|
549
|
-
"bash",
|
|
550
|
-
{ command: "ls" },
|
|
551
|
-
makeContext({ forcePromptSideEffects: true }),
|
|
552
|
-
);
|
|
553
|
-
},
|
|
554
|
-
async () => {
|
|
555
|
-
promptDecision = "deny";
|
|
556
|
-
toolThrow = null;
|
|
557
|
-
return new ToolExecutor(makePrompter()).execute(
|
|
558
|
-
"bash",
|
|
559
|
-
{ command: "ls" },
|
|
560
|
-
makeContext({ forcePromptSideEffects: true }),
|
|
561
|
-
);
|
|
562
|
-
},
|
|
563
|
-
async () =>
|
|
564
|
-
new ToolExecutor(
|
|
565
|
-
makePrompter(async () => ({ decision: "deny", wasTimeout: true })),
|
|
566
|
-
).execute(
|
|
567
|
-
"bash",
|
|
568
|
-
{ command: "ls" },
|
|
569
|
-
makeContext({ forcePromptSideEffects: true }),
|
|
570
|
-
),
|
|
571
|
-
];
|
|
572
|
-
for (const run of runs) {
|
|
573
|
-
await run();
|
|
574
|
-
}
|
|
575
|
-
|
|
576
|
-
expect(promptedCaptures).toHaveLength(runs.length);
|
|
577
|
-
expect(decidedCaptures).toHaveLength(runs.length);
|
|
578
|
-
expect(decidedOutcomes()).toEqual(["allow", "allow", "deny", "abandoned"]);
|
|
512
|
+
expect(promptCalls.map((c) => c.toolName)).toEqual(["bash"]);
|
|
513
|
+
// The prompter rejected rather than resolved: the throw rides the
|
|
514
|
+
// executor's generic error path to an unexpected-error terminal, not a
|
|
515
|
+
// denied one.
|
|
516
|
+
expect(errorCaptures).toHaveLength(1);
|
|
517
|
+
expect(errorCaptures[0].errorMessage).toBe("Prompter disposed");
|
|
518
|
+
expect(errorCaptures[0].isExpected).toBe(false);
|
|
579
519
|
});
|
|
580
520
|
|
|
581
521
|
test("uses contextual deny messaging when provided by prompter", async () => {
|
|
@@ -644,7 +584,7 @@ describe("ToolExecutor audit terminals", () => {
|
|
|
644
584
|
isError: true,
|
|
645
585
|
});
|
|
646
586
|
// A deterministic deny rule blocks without prompting.
|
|
647
|
-
expect(
|
|
587
|
+
expect(promptCalls).toHaveLength(0);
|
|
648
588
|
expect(deniedCaptures).toHaveLength(1);
|
|
649
589
|
expect(deniedCaptures[0].reason).toBe("Blocked by deny rule: rm *");
|
|
650
590
|
});
|
|
@@ -977,7 +917,7 @@ describe("ToolExecutor audit terminals", () => {
|
|
|
977
917
|
);
|
|
978
918
|
|
|
979
919
|
// forcePromptSideEffects promotes the auto-allow to an interactive prompt.
|
|
980
|
-
expect(
|
|
920
|
+
expect(promptCalls.map((c) => c.toolName)).toEqual(["bash"]);
|
|
981
921
|
expect(executedCaptures).toHaveLength(1);
|
|
982
922
|
expect(executedCaptures[0].toolName).toBe("bash");
|
|
983
923
|
});
|
|
@@ -995,8 +935,8 @@ describe("ToolExecutor audit terminals", () => {
|
|
|
995
935
|
makeContext({ forcePromptSideEffects: true }),
|
|
996
936
|
);
|
|
997
937
|
|
|
998
|
-
// file_read is not a side-effect tool, so no prompt
|
|
999
|
-
expect(
|
|
938
|
+
// file_read is not a side-effect tool, so no prompt is surfaced.
|
|
939
|
+
expect(promptCalls).toHaveLength(0);
|
|
1000
940
|
expect(executedCaptures).toHaveLength(1);
|
|
1001
941
|
expect(executedCaptures[0].toolName).toBe("file_read");
|
|
1002
942
|
});
|
|
@@ -1022,7 +962,7 @@ describe("ToolExecutor audit terminals", () => {
|
|
|
1022
962
|
);
|
|
1023
963
|
|
|
1024
964
|
expect(result).toMatchObject({ content: "ok", isError: false });
|
|
1025
|
-
expect(
|
|
965
|
+
expect(promptCalls.map((c) => c.toolName)).toEqual(["file_edit"]);
|
|
1026
966
|
expect(executedCaptures).toHaveLength(1);
|
|
1027
967
|
expect(executedCaptures[0].toolName).toBe("file_edit");
|
|
1028
968
|
});
|
|
@@ -28,7 +28,7 @@ import {
|
|
|
28
28
|
registerWorkspaceTools,
|
|
29
29
|
} from "../tools/registry.js";
|
|
30
30
|
import type { Tool, ToolContext, ToolExecutionResult } from "../tools/types.js";
|
|
31
|
-
import { getWorkspacePluginsDir } from "../util/
|
|
31
|
+
import { getWorkspacePluginsDir } from "../util/layout.js";
|
|
32
32
|
|
|
33
33
|
interface ToolListEntry {
|
|
34
34
|
name: string;
|
|
@@ -109,37 +109,6 @@ describe("resolveUsageAttribution", () => {
|
|
|
109
109
|
expectResolvedProviderModelMatchesResolver("mainAgent", "pinned");
|
|
110
110
|
});
|
|
111
111
|
|
|
112
|
-
test("reports an override the Auto router chose as the auto source", () => {
|
|
113
|
-
setLlmConfig({
|
|
114
|
-
profiles: {
|
|
115
|
-
active: { provider: "openai", model: "gpt-5.4" },
|
|
116
|
-
routed: { provider: "gemini", model: "gemini-3-pro" },
|
|
117
|
-
},
|
|
118
|
-
activeProfile: "active",
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
const snapshot = resolveUsageAttribution({
|
|
122
|
-
callSite: "mainAgent",
|
|
123
|
-
overrideProfile: "routed",
|
|
124
|
-
overrideProfileOrigin: "auto",
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
expect(snapshot).toMatchObject({
|
|
128
|
-
appliedProfile: "routed",
|
|
129
|
-
profileSource: "auto",
|
|
130
|
-
resolvedProvider: "gemini",
|
|
131
|
-
resolvedModel: "gemini-3-pro",
|
|
132
|
-
});
|
|
133
|
-
// The origin only relabels an override that actually won.
|
|
134
|
-
expect(
|
|
135
|
-
resolveUsageAttribution({
|
|
136
|
-
callSite: "mainAgent",
|
|
137
|
-
overrideProfile: "missing",
|
|
138
|
-
overrideProfileOrigin: "auto",
|
|
139
|
-
}).profileSource,
|
|
140
|
-
).toBe("active");
|
|
141
|
-
});
|
|
142
|
-
|
|
143
112
|
test("resolves call-site profile attribution", () => {
|
|
144
113
|
setLlmConfig({
|
|
145
114
|
profiles: {
|
|
@@ -29,8 +29,8 @@ mock.module("../persistence/conversation-crud.js", () => ({
|
|
|
29
29
|
}));
|
|
30
30
|
|
|
31
31
|
// Mock every export so downstream test files that dynamically import modules
|
|
32
|
-
// with a static `from "../
|
|
33
|
-
mock.module("../
|
|
32
|
+
// with a static `from "../persistence/tool-usage-store.js"` still see all symbols.
|
|
33
|
+
mock.module("../persistence/tool-usage-store.js", () => ({
|
|
34
34
|
recordToolInvocation: () => {},
|
|
35
35
|
getRecentInvocations: () => [],
|
|
36
36
|
rotateToolInvocations: async () => 0,
|
|
@@ -42,24 +42,17 @@ const auditCalls = {
|
|
|
42
42
|
denied: [] as any[],
|
|
43
43
|
error: [] as any[],
|
|
44
44
|
executed: [] as any[],
|
|
45
|
-
prompted: [] as any[],
|
|
46
|
-
decided: [] as any[],
|
|
47
45
|
};
|
|
48
|
-
mock.module("../
|
|
46
|
+
mock.module("../persistence/tool-audit.js", () => ({
|
|
49
47
|
recordToolDenied: (e: any) => auditCalls.denied.push(e),
|
|
50
48
|
recordToolError: (e: any) => auditCalls.error.push(e),
|
|
51
49
|
recordToolExecuted: (e: any) => auditCalls.executed.push(e),
|
|
52
|
-
recordToolPermissionPrompted: (e: any) => auditCalls.prompted.push(e),
|
|
53
|
-
recordToolPermissionDecided: (e: any, outcome: string) =>
|
|
54
|
-
auditCalls.decided.push({ entry: e, outcome }),
|
|
55
50
|
}));
|
|
56
51
|
|
|
57
52
|
function resetAuditCalls(): void {
|
|
58
53
|
auditCalls.denied.length = 0;
|
|
59
54
|
auditCalls.error.length = 0;
|
|
60
55
|
auditCalls.executed.length = 0;
|
|
61
|
-
auditCalls.prompted.length = 0;
|
|
62
|
-
auditCalls.decided.length = 0;
|
|
63
56
|
}
|
|
64
57
|
|
|
65
58
|
mock.module("../tools/registry.js", () => ({
|