@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,5 +1,6 @@
|
|
|
1
1
|
import { beforeEach, describe, expect, mock, test } from "bun:test";
|
|
2
2
|
|
|
3
|
+
import { setCloudAssistantId } from "../config/env.js";
|
|
3
4
|
import { useFaultableSecureKeyMap } from "./helpers/secure-keys.js";
|
|
4
5
|
|
|
5
6
|
// ── Mutable state for mocks ──────────────────────────────────────────
|
|
@@ -266,6 +267,7 @@ describe("credential-health-service", () => {
|
|
|
266
267
|
managedPingOutcome = { kind: "status", status: 200 };
|
|
267
268
|
assistantKeyVerdict = "valid";
|
|
268
269
|
cloudClientAvailable = true;
|
|
270
|
+
setCloudAssistantId(undefined);
|
|
269
271
|
});
|
|
270
272
|
|
|
271
273
|
test("returns empty report when no providers exist", async () => {
|
|
@@ -780,13 +782,20 @@ describe("credential-health-service", () => {
|
|
|
780
782
|
// carries the repair.
|
|
781
783
|
const assistantKeyResult = checkAssistantApiKey;
|
|
782
784
|
|
|
783
|
-
test("is
|
|
785
|
+
test("is not reported when the workspace was never connected", async () => {
|
|
786
|
+
expect(await assistantKeyResult()).toBeNull();
|
|
787
|
+
});
|
|
788
|
+
|
|
789
|
+
test("is missing_token when a cloud identity exists without a key", async () => {
|
|
790
|
+
setCloudAssistantId("11111111-2222-4333-8444-555555555555");
|
|
791
|
+
|
|
784
792
|
const result = await assistantKeyResult();
|
|
785
793
|
expect(result!.status).toBe("missing_token");
|
|
786
794
|
expect(result!.canAutoRecover).toBe(true);
|
|
787
795
|
});
|
|
788
796
|
|
|
789
797
|
test("is healthy when the cloud accepts the stored key", async () => {
|
|
798
|
+
setCloudAssistantId("11111111-2222-4333-8444-555555555555");
|
|
790
799
|
secureKeyValues.set(KEY, "stored-key");
|
|
791
800
|
assistantKeyVerdict = "valid";
|
|
792
801
|
|
|
@@ -794,6 +803,7 @@ describe("credential-health-service", () => {
|
|
|
794
803
|
});
|
|
795
804
|
|
|
796
805
|
test("is revoked when the cloud rejects the stored key", async () => {
|
|
806
|
+
setCloudAssistantId("11111111-2222-4333-8444-555555555555");
|
|
797
807
|
secureKeyValues.set(KEY, "stored-key");
|
|
798
808
|
assistantKeyVerdict = "rejected";
|
|
799
809
|
|
|
@@ -809,6 +819,7 @@ describe("credential-health-service", () => {
|
|
|
809
819
|
// error, transport failure) must degrade to `unreachable`, which the
|
|
810
820
|
// heartbeat drops before notifying.
|
|
811
821
|
test("an unsettled platform answer is unreachable, never revoked", async () => {
|
|
822
|
+
setCloudAssistantId("11111111-2222-4333-8444-555555555555");
|
|
812
823
|
secureKeyValues.set(KEY, "stored-key");
|
|
813
824
|
assistantKeyVerdict = "unknown";
|
|
814
825
|
|
|
@@ -816,12 +827,14 @@ describe("credential-health-service", () => {
|
|
|
816
827
|
});
|
|
817
828
|
|
|
818
829
|
test("an unreadable credential store is unreachable, never revoked", async () => {
|
|
830
|
+
setCloudAssistantId("11111111-2222-4333-8444-555555555555");
|
|
819
831
|
markUnreachable(KEY);
|
|
820
832
|
|
|
821
833
|
expect((await assistantKeyResult())!.status).toBe("unreachable");
|
|
822
834
|
});
|
|
823
835
|
|
|
824
836
|
test("is unreachable when the cloud client cannot be built", async () => {
|
|
837
|
+
setCloudAssistantId("11111111-2222-4333-8444-555555555555");
|
|
825
838
|
secureKeyValues.set(KEY, "stored-key");
|
|
826
839
|
cloudClientAvailable = false;
|
|
827
840
|
|
|
@@ -21,7 +21,7 @@ import {
|
|
|
21
21
|
setCredentialRecordBackend,
|
|
22
22
|
upsertCredentialMetadata,
|
|
23
23
|
} from "../tools/credentials/metadata-store.js";
|
|
24
|
-
import { getDataDir } from "../util/
|
|
24
|
+
import { getDataDir } from "../util/layout.js";
|
|
25
25
|
|
|
26
26
|
function leftoverPath(): string {
|
|
27
27
|
return join(getDataDir(), "credentials", "metadata.json");
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
setCredentialRecordBackend,
|
|
12
12
|
upsertCredentialMetadata,
|
|
13
13
|
} from "../tools/credentials/metadata-store.js";
|
|
14
|
-
import { getDataDir } from "../util/
|
|
14
|
+
import { getDataDir } from "../util/layout.js";
|
|
15
15
|
|
|
16
16
|
function makeBackend(): CredentialRecordBackend & {
|
|
17
17
|
store: Map<string, CredentialRecord>;
|
|
@@ -142,151 +142,6 @@ describe("Invariant 2: no generic plaintext secret read API", () => {
|
|
|
142
142
|
);
|
|
143
143
|
expect(browserSrc).not.toContain("getCredentialValue");
|
|
144
144
|
});
|
|
145
|
-
|
|
146
|
-
test("secure-keys is only imported by authorized modules", () => {
|
|
147
|
-
// Hard boundary: only these production files may import from secure-keys.
|
|
148
|
-
// Any new import must be reviewed for secret-leak risk and added here.
|
|
149
|
-
const ALLOWED_IMPORTERS = new Set([
|
|
150
|
-
"credential-execution/prompted-credential.ts", // shared prompt-action persistence (stores secret via setSecureKeyAsync)
|
|
151
|
-
"daemon/chat-credential-redaction.ts", // chat sentinel enrichment — scoped read ONLY of credentials a `credentials reveal` command in the same turn already printed to stdout; value byte-compared at persist and discarded, never persisted or logged
|
|
152
|
-
|
|
153
|
-
"tools/credentials/broker.ts", // brokered credential access
|
|
154
|
-
"tools/network/web-search.ts", // web search API key lookup
|
|
155
|
-
"tools/network/web-fetch.ts", // web fetch provider (Firecrawl) API key lookup
|
|
156
|
-
"daemon/handlers/config-telegram.ts", // Telegram bot token management
|
|
157
|
-
"daemon/handlers/config-vercel.ts", // Vercel API token management
|
|
158
|
-
"runtime/routes/integrations/twilio.ts", // Twilio credential management (HTTP control-plane)
|
|
159
|
-
"security/token-manager.ts", // OAuth token refresh flow
|
|
160
|
-
"tools/network/script-proxy/session-manager.ts", // proxy credential injection at runtime
|
|
161
|
-
"calls/call-domain.ts", // caller identity resolution (user phone number lookup)
|
|
162
|
-
"calls/twilio-config.ts", // call infrastructure credential lookup
|
|
163
|
-
"calls/twilio-provider.ts", // call infrastructure credential lookup
|
|
164
|
-
"calls/twilio-rest.ts", // Twilio REST API credential lookup
|
|
165
|
-
"calls/fish-audio-client.ts", // Fish Audio TTS API key lookup
|
|
166
|
-
"runtime/channel-invite-transports/telegram.ts", // Telegram invite transport bot token lookup
|
|
167
|
-
"cli/lib/daemon-credential-client.ts", // CLI-to-daemon credential routing intermediary
|
|
168
|
-
"messaging/providers/telegram-bot/adapter.ts", // Telegram bot token lookup for connectivity check
|
|
169
|
-
"messaging/providers/slack/api.ts", // Slack Web API client (bot token for direct sends)
|
|
170
|
-
"messaging/providers/telegram-bot/api.ts", // Telegram Bot API client (bot token for direct sends)
|
|
171
|
-
"messaging/providers/discord/api.ts", // Discord REST client (bot token for direct sends)
|
|
172
|
-
"runtime/channel-readiness-service.ts", // channel readiness probes for Telegram connectivity
|
|
173
|
-
"telegram/webhook-health.ts", // Telegram webhook health sweep — reads bot_token to call getWebhookInfo (Bot API authenticates via the token in the URL path) and checks webhook_secret for existence only; neither value is logged, persisted, or returned
|
|
174
|
-
"messaging/providers/whatsapp/adapter.ts", // WhatsApp credential lookup for connectivity check
|
|
175
|
-
"messaging/providers/whatsapp/api.ts", // WhatsApp Cloud API client (bot token for direct sends)
|
|
176
|
-
"messaging/providers/slack/adapter.ts", // Slack bot token lookup for Socket Mode connectivity check
|
|
177
|
-
"credential-health/credential-health-service.ts", // proactive credential health monitoring
|
|
178
|
-
"providers/inference/credential-slot-repair.ts", // boot repair: copies the shared openai-compatible slot value into per-connection slots (get/set of provider API keys only; values never logged or returned)
|
|
179
|
-
"runtime/routes/inference-provider-connection-routes.ts", // connection delete removes its dedicated per-connection key slot (deleteSecureKeyAsync only; no reads)
|
|
180
|
-
"daemon/handlers/config-slack-channel.ts", // Slack channel config credential management
|
|
181
|
-
"daemon/handlers/config-discord-channel.ts", // Discord channel bot token management
|
|
182
|
-
"providers/cloud-proxy/context.ts", // cloud proxy API key lookup for provider initialization
|
|
183
|
-
"cloud/client.ts", // cloud client credential store fallback for standalone CLI auth
|
|
184
|
-
"mcp/mcp-header-store.ts", // MCP static auth header persistence (credential store CRUD + legacy migration)
|
|
185
|
-
"mcp/mcp-oauth-provider.ts", // MCP OAuth token/client/discovery persistence
|
|
186
|
-
"messaging/providers/slack/auth.ts", // canonical Slack auth resolver (bot/user token lookup for adapter + routes)
|
|
187
|
-
"mcp/client.ts", // MCP client cached-token lookup
|
|
188
|
-
"oauth/token-persistence.ts", // OAuth token persistence (set/delete tokens)
|
|
189
|
-
"oauth/credential-token-resolver.ts", // centralized access-token key resolution for OAuth and manual-token providers
|
|
190
|
-
"oauth/connection-resolver.ts", // resolve OAuthConnection from oauth-store (access_token lookup)
|
|
191
|
-
"runtime/routes/secret-routes.ts", // HTTP secret management routes (set/delete secrets)
|
|
192
|
-
"acp/acp-claude-oauth.ts", // Connect Claude OAuth token vault-store helper (stores access token plus broker-owned refresh/expiry companions via setSecureKeyAsync)
|
|
193
|
-
"runtime/routes/acp-claude-auth-routes.ts", // Connect Claude Code daemon OAuth flow (stores OAuth token in vault)
|
|
194
|
-
"runtime/routes/migration-routes.ts", // migration import credential restore
|
|
195
|
-
"daemon/conversation-messaging.ts", // credential storage during session messaging
|
|
196
|
-
"runtime/routes/settings-routes.ts", // settings routes OAuth credential lookup (client_secret)
|
|
197
|
-
"oauth/oauth-store.ts", // OAuth provider disconnect (delete stored tokens)
|
|
198
|
-
"oauth/manual-token-connection.ts", // manual-token provider backfill (credential store existence check)
|
|
199
|
-
"workspace/provider-commit-message-generator.ts", // commit message generation provider key lookup
|
|
200
|
-
"cli/commands/image-generation.ts", // CLI image-generation command API key lookup
|
|
201
|
-
"config/bundled-skills/image-studio/tools/media-generate-image.ts", // image generation tool API key lookup
|
|
202
|
-
"config/bundled-skills/media-processing/tools/analyze-keyframes.ts", // keyframe analysis tool API key lookup
|
|
203
|
-
"providers/registry.ts", // provider registry API key lookup for initialization
|
|
204
|
-
"providers/inference/resolve-auth.ts", // provider_connection auth resolver (api_key path reads vault, mirrors registry.ts)
|
|
205
|
-
"providers/inference/codex-token-refresh.ts", // Codex OAuth token refresh (reads/writes access_token, refresh_token, expires_at)
|
|
206
|
-
"providers/inference/service-account-token.ts", // Google service-account JWT exchange (reads service-account JSON, writes token_cache blob)
|
|
207
|
-
"providers/inference/chatgpt-subscription-credentials.ts", // ChatGPT subscription sign-in token storage, shared by the daemon routes and the CLI (setSecureKeyAsync only; no reads)
|
|
208
|
-
"providers/provider-availability.ts", // provider availability API key check
|
|
209
|
-
"media/image-credentials.ts", // shared image-gen credential resolver (provider API key lookup)
|
|
210
|
-
"persistence/embeddings/embedding-backend.ts", // embedding backend API key lookup
|
|
211
|
-
"persistence/llm-request-log-source-clickhouse.ts", // ClickHouse read source — lazy lookup of clickhouse:url + clickhouse:password + cadet:platform_assistant_id for self-scoped mirror reads
|
|
212
|
-
"persistence/llm-request-log-sink-clickhouse.ts", // ClickHouse write sink — lazy lookup of clickhouse:url + clickhouse:password + cadet:platform_assistant_id for self-scoped log writes
|
|
213
|
-
"persistence/compaction-log-store-clickhouse.ts", // ClickHouse compaction log writer — lazy lookup of clickhouse:url + clickhouse:password + cadet:platform_assistant_id for self-scoped event writes
|
|
214
|
-
"config/cloud-identity.ts", // assistant API key lookup for platform identity validate
|
|
215
|
-
"config/cloud-rehydration.ts", // startup rehydration of platform base URL from the credential store and ids from platform validate
|
|
216
|
-
"workspace/migrations/006-services-config.ts", // services config migration reads provider API keys
|
|
217
|
-
"workspace/migrations/018-rekey-compound-credential-keys.ts", // re-key compound credential storage keys
|
|
218
|
-
"daemon/conversation-process.ts", // masked provider key display
|
|
219
|
-
"daemon/handlers/config-model.ts", // masked provider key display
|
|
220
|
-
"providers/speech-to-text/resolve.ts", // STT provider API key lookup
|
|
221
|
-
"calls/telephony-tts-capability.ts", // TTS provider API key availability check (presence only)
|
|
222
|
-
"credential-execution/ces-runtime.ts", // CES runtime owns the daemon CES connection (setCesClient/onCesClientChanged/reconnect wiring at startup)
|
|
223
|
-
"runtime/routes/credential-prompt-routes.ts", // Route for secure credential prompt (stores secret via setSecureKeyAsync)
|
|
224
|
-
"runtime/routes/credential-routes.ts", // CLI credential management routes (CLI-migrated to IPC)
|
|
225
|
-
"runtime/routes/sanity-routes.ts", // Sanity connect/discover routes (reads stored api_token from credential store)
|
|
226
|
-
"runtime/routes/cloud-routes.ts", // CLI platform connect/disconnect/status routes (CLI-migrated to IPC)
|
|
227
|
-
"runtime/routes/roadmap-routes.ts", // signs public-roadmap calls with the assistant API key (outbound Authorization header only; the value never reaches a response, a log, or the CLI process)
|
|
228
|
-
"inbound/cloud-callback-registration.ts", // managed API key lookup for callback registration
|
|
229
|
-
"tts/providers/elevenlabs-provider.ts", // ElevenLabs TTS API key lookup
|
|
230
|
-
"tts/providers/deepgram-provider.ts", // Deepgram TTS API key lookup
|
|
231
|
-
"tts/providers/xai-provider.ts", // xAI TTS API key lookup
|
|
232
|
-
"credential-health/credential-health-service.ts", // credential health check reads access tokens for liveness pings
|
|
233
|
-
"cli/commands/keys.ts", // CLI provider key management
|
|
234
|
-
"cli/commands/oauth/connect.ts", // CLI OAuth connect stored-secret verification
|
|
235
|
-
"runtime/routes/identity-routes.ts", // health/readyz endpoint checks CES connectivity via getCesClient
|
|
236
|
-
"tools/executor.ts", // CES approval bridge resolves the CES RPC client via getCesClient
|
|
237
|
-
"tools/network/web-fetch.ts", // Firecrawl /scrape BYOK fetch provider API key lookup (firecrawl provider key)
|
|
238
|
-
"workspace/default-provider-ensure.ts", // legacy anthropic echo disambiguation (vault key presence check)
|
|
239
|
-
"providers/inference/connection-availability.ts", // shared (provider, connection) availability status (credential presence check only; value never leaves the helper)
|
|
240
|
-
"plugin-api/resolve-credential.ts", // plugin-facing resolveCredential: reveal-equivalent plaintext read, scoped to the in-context plugin's own service
|
|
241
|
-
"tools/credentials/store.ts", // shared credential write path (setSecureKeyAsync only; no reads) behind credentials/set and plugin-facing storeCredential
|
|
242
|
-
"email/byo-email-credential.ts", // BYO email provider configuration check (credential presence only; value never leaves the helper)
|
|
243
|
-
]);
|
|
244
|
-
|
|
245
|
-
const thisDir = dirname(fileURLToPath(import.meta.url));
|
|
246
|
-
const srcDir = resolve(thisDir, "..");
|
|
247
|
-
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
248
|
-
const { readdirSync, statSync } = require("node:fs");
|
|
249
|
-
|
|
250
|
-
// Recursively collect all .ts files in src/ (excluding __tests__)
|
|
251
|
-
function collectTsFiles(dir: string, files: string[] = []): string[] {
|
|
252
|
-
for (const entry of readdirSync(dir)) {
|
|
253
|
-
const full = join(dir, entry);
|
|
254
|
-
if (entry === "__tests__" || entry === "node_modules") {
|
|
255
|
-
continue;
|
|
256
|
-
}
|
|
257
|
-
const s = statSync(full);
|
|
258
|
-
if (s.isDirectory()) {
|
|
259
|
-
collectTsFiles(full, files);
|
|
260
|
-
} else if (
|
|
261
|
-
entry.endsWith(".ts") &&
|
|
262
|
-
!entry.endsWith(".d.ts") &&
|
|
263
|
-
!entry.endsWith(".test.ts")
|
|
264
|
-
) {
|
|
265
|
-
files.push(full);
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
return files;
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
const allFiles = collectTsFiles(srcDir);
|
|
272
|
-
const unauthorizedImporters: string[] = [];
|
|
273
|
-
|
|
274
|
-
for (const filePath of allFiles) {
|
|
275
|
-
const content = readFileSync(filePath, "utf-8");
|
|
276
|
-
// Check for any import from the secure-keys module (static import, dynamic import(), or require())
|
|
277
|
-
if (
|
|
278
|
-
content.match(/from\s+['"].*secure-keys/) ||
|
|
279
|
-
content.match(/(?:import|require)\s*\(\s*['"].*secure-keys/)
|
|
280
|
-
) {
|
|
281
|
-
const relative = filePath.slice(srcDir.length + 1);
|
|
282
|
-
if (!ALLOWED_IMPORTERS.has(relative)) {
|
|
283
|
-
unauthorizedImporters.push(relative);
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
expect(unauthorizedImporters).toEqual([]);
|
|
289
|
-
});
|
|
290
145
|
});
|
|
291
146
|
|
|
292
147
|
// ---------------------------------------------------------------------------
|
|
@@ -110,7 +110,7 @@ describe("ensureCompleteCustomProfiles", () => {
|
|
|
110
110
|
llm: {
|
|
111
111
|
default: distinctiveDefault,
|
|
112
112
|
profiles: {
|
|
113
|
-
balanced: {
|
|
113
|
+
balanced: { provider: "cadet", status: "disabled" },
|
|
114
114
|
ab: {
|
|
115
115
|
source: "user",
|
|
116
116
|
mix: [
|
|
@@ -25,7 +25,6 @@ import {
|
|
|
25
25
|
getEffectiveProfile,
|
|
26
26
|
getEffectiveProfiles,
|
|
27
27
|
getEffectiveProfilesForProvider,
|
|
28
|
-
INVARIANT_PROFILE_NAMES,
|
|
29
28
|
MANAGED_PROFILE_NAMES,
|
|
30
29
|
MANAGED_PROFILE_TEMPLATES,
|
|
31
30
|
PROFILE_IMPLS,
|
|
@@ -51,7 +50,6 @@ describe("fallbackProfile pointers on the cadet column", () => {
|
|
|
51
50
|
const backup = CODE_DEFAULT_PROFILE_ENTRIES[FALLBACK_PROFILE_BY_KEY[key]];
|
|
52
51
|
expect(backup).toBeDefined();
|
|
53
52
|
expect(backup.provider).toBe("cadet");
|
|
54
|
-
expect(backup.source).toBe("managed");
|
|
55
53
|
// Single hop: a backup never declares a fallback of its own.
|
|
56
54
|
expect(backup.fallbackProfile).toBeUndefined();
|
|
57
55
|
}
|
|
@@ -106,7 +104,6 @@ describe("managed-column-only scoping", () => {
|
|
|
106
104
|
for (const key of BACKUP_PROFILE_KEYS) {
|
|
107
105
|
expect(effective[key]).toBeDefined();
|
|
108
106
|
expect(effective[key]?.provider).toBe("cadet");
|
|
109
|
-
expect(effective[key]?.source).toBe("managed");
|
|
110
107
|
}
|
|
111
108
|
// The seeder inserts missing managed keys in MANAGED_PROFILE_TEMPLATES
|
|
112
109
|
// order, which is what places backups after the primaries in
|
|
@@ -161,13 +158,13 @@ describe("managed-column-only scoping", () => {
|
|
|
161
158
|
test("a persisted managed stub does not resurrect a backup off the cloud column", () => {
|
|
162
159
|
// A `config get` -> `config set` round-trip on a cloud install can
|
|
163
160
|
// leave a thin managed stub for a backup in `llm.profiles`
|
|
164
|
-
//
|
|
161
|
+
// The stub is the workspace's slot for
|
|
165
162
|
// a code-owned body, not a profile, so once the column has no body behind
|
|
166
163
|
// it the name must stop being listed rather than resolve to a
|
|
167
164
|
// providerless entry the pickers would offer and `LLMSchema` would
|
|
168
165
|
// reject.
|
|
169
166
|
const workspace: Record<string, ProfileEntry> = {
|
|
170
|
-
"balanced-backup": {
|
|
167
|
+
"balanced-backup": { provider: "cadet" },
|
|
171
168
|
};
|
|
172
169
|
for (const provider of ["anthropic", "chatgpt"] as const) {
|
|
173
170
|
const effective = getEffectiveProfilesForProvider(
|
|
@@ -196,7 +193,6 @@ describe("managed-column-only scoping", () => {
|
|
|
196
193
|
// that name and keeps its own body.
|
|
197
194
|
const workspace: Record<string, ProfileEntry> = {
|
|
198
195
|
"balanced-backup": {
|
|
199
|
-
source: "user",
|
|
200
196
|
provider: "anthropic",
|
|
201
197
|
model: "claude-opus-4-7",
|
|
202
198
|
},
|
|
@@ -237,15 +233,14 @@ describe("effective-profile machinery", () => {
|
|
|
237
233
|
// label/status/topP whitelist from a cloud stub, and not a user-owned
|
|
238
234
|
// shadow. Disabling a backup through a hand-edited config would strand
|
|
239
235
|
// the primary's fallback exactly when it is needed.
|
|
240
|
-
|
|
236
|
+
{
|
|
241
237
|
const workspace: Record<string, ProfileEntry> = {
|
|
242
238
|
"balanced-backup": {
|
|
243
|
-
|
|
239
|
+
provider: "cadet",
|
|
244
240
|
label: "My Backup",
|
|
245
241
|
status: "disabled",
|
|
246
242
|
topP: 0.7,
|
|
247
243
|
// Stale content drift on disk must lose to the code default body.
|
|
248
|
-
provider: "anthropic",
|
|
249
244
|
model: "claude-sonnet-4-6",
|
|
250
245
|
maxTokens: 1,
|
|
251
246
|
},
|
|
@@ -261,14 +256,9 @@ describe("effective-profile machinery", () => {
|
|
|
261
256
|
}
|
|
262
257
|
});
|
|
263
258
|
|
|
264
|
-
test("backup
|
|
265
|
-
// Membership in these sets is what wires the route-level deletion
|
|
266
|
-
// rejection (`rejectCloudProfileDeletion`, `handleCreateProfile`) and
|
|
267
|
-
// the commitConfigWrite invariant guard
|
|
268
|
-
// (`assertInvariantProfilesPreserved`).
|
|
259
|
+
test("backup names are reserved like the other managed defaults", () => {
|
|
269
260
|
for (const key of BACKUP_PROFILE_KEYS) {
|
|
270
261
|
expect(MANAGED_PROFILE_NAMES.has(key)).toBe(true);
|
|
271
|
-
expect(INVARIANT_PROFILE_NAMES.has(key)).toBe(true);
|
|
272
262
|
}
|
|
273
263
|
});
|
|
274
264
|
});
|
|
@@ -150,7 +150,6 @@ describe("Call session mode metadata", () => {
|
|
|
150
150
|
|
|
151
151
|
const { conversationId } = getOrCreateConversation("test-conv-mode");
|
|
152
152
|
const session = createCallSession({
|
|
153
|
-
direction: "inbound",
|
|
154
153
|
conversationId,
|
|
155
154
|
provider: "twilio",
|
|
156
155
|
fromNumber: "+15551234567",
|
|
@@ -179,7 +178,6 @@ describe("Call session mode metadata", () => {
|
|
|
179
178
|
"test-conv-mode-default",
|
|
180
179
|
);
|
|
181
180
|
const session = createCallSession({
|
|
182
|
-
direction: "inbound",
|
|
183
181
|
conversationId,
|
|
184
182
|
provider: "twilio",
|
|
185
183
|
fromNumber: "+15551234567",
|
|
@@ -4,7 +4,7 @@ import { join } from "node:path";
|
|
|
4
4
|
import { afterEach, beforeEach, describe, expect, test } from "bun:test";
|
|
5
5
|
|
|
6
6
|
import {
|
|
7
|
-
|
|
7
|
+
getConfig,
|
|
8
8
|
resetCache,
|
|
9
9
|
resolveProfile,
|
|
10
10
|
setStorePathOverride,
|
|
@@ -34,17 +34,17 @@ function writeConfig(config: unknown): void {
|
|
|
34
34
|
writeFileSync(testFilePath, JSON.stringify(config, null, 2));
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
describe("
|
|
37
|
+
describe("getConfig", () => {
|
|
38
38
|
test("returns default config when file is missing or malformed", () => {
|
|
39
39
|
// Missing file
|
|
40
|
-
let config =
|
|
40
|
+
let config = getConfig();
|
|
41
41
|
expect(config.profiles).toHaveLength(1);
|
|
42
42
|
expect(config.profiles[0].id).toBe("general");
|
|
43
43
|
|
|
44
44
|
// Malformed JSON
|
|
45
45
|
resetCache();
|
|
46
46
|
writeFileSync(testFilePath, "not json");
|
|
47
|
-
config =
|
|
47
|
+
config = getConfig();
|
|
48
48
|
expect(config.profiles[0].id).toBe("general");
|
|
49
49
|
});
|
|
50
50
|
|
|
@@ -57,7 +57,7 @@ describe("loadConfig", () => {
|
|
|
57
57
|
{ id: "casual", name: "Casual" },
|
|
58
58
|
],
|
|
59
59
|
});
|
|
60
|
-
const config =
|
|
60
|
+
const config = getConfig();
|
|
61
61
|
expect(config.profiles).toHaveLength(2);
|
|
62
62
|
expect(config.defaultProfileId).toBe("work");
|
|
63
63
|
});
|
|
@@ -81,7 +81,7 @@ describe("loadConfig", () => {
|
|
|
81
81
|
},
|
|
82
82
|
],
|
|
83
83
|
});
|
|
84
|
-
const config =
|
|
84
|
+
const config = getConfig();
|
|
85
85
|
expect(config.profiles[0].stylePrompt!.length).toBe(2000);
|
|
86
86
|
expect(config.profiles[0].dictionary).toHaveLength(1);
|
|
87
87
|
expect(config.profiles[0].snippets).toHaveLength(1);
|
|
@@ -1,40 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
existsSync,
|
|
4
|
-
mkdtempSync,
|
|
5
|
-
rmSync,
|
|
6
|
-
statfsSync,
|
|
7
|
-
writeFileSync,
|
|
8
|
-
} from "node:fs";
|
|
9
|
-
import { join } from "node:path";
|
|
10
|
-
import { promisify } from "node:util";
|
|
1
|
+
import { statfsSync } from "node:fs";
|
|
11
2
|
import { afterAll, beforeEach, describe, expect, test } from "bun:test";
|
|
12
3
|
|
|
13
|
-
// Captured at module scope: the preload cleans up its env var between suites.
|
|
14
4
|
const PRELOAD_WS = process.env.CADET_WORKSPACE_DIR!;
|
|
15
|
-
|
|
16
5
|
const MIB = 1024 * 1024;
|
|
17
6
|
const round2 = (b: number) => Math.round((b / MIB) * 100) / 100;
|
|
18
7
|
|
|
19
|
-
const execFileAsync = promisify(execFile);
|
|
20
|
-
|
|
21
|
-
/** Same measurement the module under test performs, done for real. */
|
|
22
|
-
async function duBytes(paths: string[]): Promise<number> {
|
|
23
|
-
const existing = paths.filter((p) => existsSync(p));
|
|
24
|
-
if (existing.length === 0) {
|
|
25
|
-
return 0;
|
|
26
|
-
}
|
|
27
|
-
const { stdout } = await execFileAsync("du", ["-sb", ...existing]);
|
|
28
|
-
let total = 0;
|
|
29
|
-
for (const line of stdout.trim().split("\n")) {
|
|
30
|
-
const size = parseInt(line.split("\t")[0], 10);
|
|
31
|
-
if (!isNaN(size) && size > 0) {
|
|
32
|
-
total += size;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
return total;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
8
|
interface StatfsSnapshot {
|
|
39
9
|
total: number;
|
|
40
10
|
free: number;
|
|
@@ -81,171 +51,65 @@ function expectWithinStatfsWindow(
|
|
|
81
51
|
expect(usage.usedMb).toBeLessThanOrEqual(usedHi);
|
|
82
52
|
}
|
|
83
53
|
|
|
84
|
-
const {
|
|
54
|
+
const { getDiskUsageInfo, parseK8sMemoryBytes } =
|
|
85
55
|
await import("../util/disk-usage.js");
|
|
86
56
|
|
|
87
|
-
// Env knobs the sampler reads at call time; no module mocking needed.
|
|
88
57
|
const ENV_VARS = [
|
|
89
58
|
"CADET_MINIKUBE_STORAGE_SIZE",
|
|
90
59
|
"IS_CONTAINERIZED",
|
|
91
60
|
"IS_CLOUD",
|
|
92
61
|
] as const;
|
|
93
62
|
|
|
94
|
-
|
|
95
|
-
for (const
|
|
96
|
-
delete process.env[
|
|
63
|
+
function clearEnvironment(): void {
|
|
64
|
+
for (const name of ENV_VARS) {
|
|
65
|
+
delete process.env[name];
|
|
97
66
|
}
|
|
98
|
-
|
|
67
|
+
process.env.CADET_WORKSPACE_DIR = PRELOAD_WS;
|
|
68
|
+
}
|
|
99
69
|
|
|
100
|
-
|
|
101
|
-
// unmeasurable — seed real bytes so the du-backed branches have data.
|
|
102
|
-
const PAYLOAD = join(PRELOAD_WS, "bulk.bin");
|
|
70
|
+
afterAll(clearEnvironment);
|
|
103
71
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
__resetDiskUsageCacheForTests();
|
|
112
|
-
});
|
|
72
|
+
async function expectFilesystemUsage(): Promise<void> {
|
|
73
|
+
const before = statfsSnapshot(PRELOAD_WS);
|
|
74
|
+
const usage = await getDiskUsageInfo();
|
|
75
|
+
const after = statfsSnapshot(PRELOAD_WS);
|
|
76
|
+
expect(usage).not.toBeNull();
|
|
77
|
+
expectWithinStatfsWindow(usage!, PRELOAD_WS, before, after);
|
|
78
|
+
}
|
|
113
79
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
const usage = await getDiskUsageInfo();
|
|
117
|
-
const after = statfsSnapshot(PRELOAD_WS);
|
|
80
|
+
describe("disk usage sampler", () => {
|
|
81
|
+
beforeEach(clearEnvironment);
|
|
118
82
|
|
|
119
|
-
|
|
120
|
-
expectWithinStatfsWindow(usage!, PRELOAD_WS, before, after);
|
|
121
|
-
});
|
|
83
|
+
test("reports real filesystem usage", expectFilesystemUsage);
|
|
122
84
|
|
|
123
85
|
test("falls back to root when the workspace path does not exist", async () => {
|
|
124
86
|
process.env.CADET_WORKSPACE_DIR = "/tmp/does-not-exist-disk-usage-test";
|
|
125
87
|
try {
|
|
126
|
-
|
|
127
|
-
expect(usage?.path).toBe("/");
|
|
88
|
+
expect((await getDiskUsageInfo())?.path).toBe("/");
|
|
128
89
|
} finally {
|
|
129
|
-
// Restore rather than delete: the sampler reads the workspace at call
|
|
130
|
-
// time and later tests still need the preload's workspace.
|
|
131
90
|
process.env.CADET_WORKSPACE_DIR = PRELOAD_WS;
|
|
132
91
|
}
|
|
133
92
|
});
|
|
134
93
|
|
|
135
|
-
test("
|
|
136
|
-
// A 1MiB PVC is always smaller than the real host filesystem, so the
|
|
137
|
-
// hostPath detection fires and capacity is the quota, usage is `du`.
|
|
94
|
+
test("reports the backing filesystem rather than a minikube quota", async () => {
|
|
138
95
|
process.env.CADET_MINIKUBE_STORAGE_SIZE = "1Mi";
|
|
139
|
-
|
|
140
|
-
const before = statfsSnapshot(PRELOAD_WS);
|
|
141
|
-
const usage = await getDiskUsageInfo();
|
|
142
|
-
const after = statfsSnapshot(PRELOAD_WS);
|
|
143
|
-
|
|
144
|
-
// totalMb === 1 is the fixed-cap branch signature (the sampler's du ran).
|
|
145
|
-
// A failed du spawn under CI load is a legal statfs fallback — asserted
|
|
146
|
-
// with the window instead of failing the run.
|
|
147
|
-
if (usage!.totalMb === 1) {
|
|
148
|
-
// The 512KiB payload must show up in the measurement.
|
|
149
|
-
expect(usage!.usedMb).toBeGreaterThanOrEqual(0.49);
|
|
150
|
-
expect(
|
|
151
|
-
Math.abs(usage!.freeMb - Math.max(0, 1 - usage!.usedMb)),
|
|
152
|
-
).toBeLessThanOrEqual(0.02);
|
|
153
|
-
} else {
|
|
154
|
-
expectWithinStatfsWindow(usage!, PRELOAD_WS, before, after);
|
|
155
|
-
}
|
|
96
|
+
await expectFilesystemUsage();
|
|
156
97
|
});
|
|
157
98
|
|
|
158
|
-
test("
|
|
159
|
-
process.env.CADET_MINIKUBE_STORAGE_SIZE = "1Mi";
|
|
160
|
-
const workspaceOnly = round2(await duBytes([PRELOAD_WS]));
|
|
161
|
-
|
|
162
|
-
const before = statfsSnapshot(PRELOAD_WS);
|
|
163
|
-
const usage = await getDiskUsageInfo();
|
|
164
|
-
const after = statfsSnapshot(PRELOAD_WS);
|
|
165
|
-
|
|
166
|
-
if (usage!.totalMb !== 1) {
|
|
167
|
-
// Sampler's du spawn failed under load → legal statfs fallback.
|
|
168
|
-
expectWithinStatfsWindow(usage!, PRELOAD_WS, before, after);
|
|
169
|
-
return;
|
|
170
|
-
}
|
|
171
|
-
// The impl's path set is workspace + /data (when /data exists). It can
|
|
172
|
-
// only be >= the workspace-only floor; equality holds on machines
|
|
173
|
-
// without /data.
|
|
174
|
-
expect(usage!.usedMb).toBeGreaterThanOrEqual(workspaceOnly);
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
test("a PVC at least as large as the filesystem reports statfs directly", async () => {
|
|
178
|
-
// 1TiB is larger than any test filesystem: the hostPath detection must
|
|
179
|
-
// NOT fire, so the sampler trusts statfs instead of `du`.
|
|
180
|
-
process.env.CADET_MINIKUBE_STORAGE_SIZE = "1Ti";
|
|
181
|
-
const before = statfsSnapshot(PRELOAD_WS);
|
|
182
|
-
const usage = await getDiskUsageInfo();
|
|
183
|
-
const after = statfsSnapshot(PRELOAD_WS);
|
|
184
|
-
|
|
185
|
-
expect(usage).not.toBeNull();
|
|
186
|
-
expectWithinStatfsWindow(usage!, PRELOAD_WS, before, after);
|
|
187
|
-
});
|
|
188
|
-
|
|
189
|
-
test("measures workspace du usage on a local Docker hatch", async () => {
|
|
99
|
+
test("reports the backing filesystem for local Docker volumes", async () => {
|
|
190
100
|
process.env.IS_CONTAINERIZED = "1";
|
|
191
|
-
|
|
192
|
-
const before = statfsSnapshot(PRELOAD_WS);
|
|
193
|
-
const usage = await getDiskUsageInfo();
|
|
194
|
-
const after = statfsSnapshot(PRELOAD_WS);
|
|
195
|
-
|
|
196
|
-
expect(usage).not.toBeNull();
|
|
197
|
-
expect(usage!.path).toBe(PRELOAD_WS);
|
|
198
|
-
// The 512KiB payload must show up whether usage came from du or (if the
|
|
199
|
-
// du spawn failed under load) the statfs fallback — both exceed it.
|
|
200
|
-
expect(usage!.usedMb).toBeGreaterThanOrEqual(0.49);
|
|
201
|
-
// host-free consistency: capacity is usage + free in both branches.
|
|
202
|
-
expect(
|
|
203
|
-
Math.abs(usage!.totalMb - (usage!.usedMb + usage!.freeMb)),
|
|
204
|
-
).toBeLessThanOrEqual(0.02);
|
|
205
|
-
// Free space is the host's own statfs number in both branches.
|
|
206
|
-
expect(usage!.freeMb).toBeGreaterThanOrEqual(
|
|
207
|
-
round2(Math.min(before.free, after.free)) - 0.01,
|
|
208
|
-
);
|
|
209
|
-
expect(usage!.freeMb).toBeLessThanOrEqual(
|
|
210
|
-
round2(Math.max(before.free, after.free)) + 0.01,
|
|
211
|
-
);
|
|
101
|
+
await expectFilesystemUsage();
|
|
212
102
|
});
|
|
213
103
|
|
|
214
|
-
test("
|
|
104
|
+
test("reports filesystem usage for cloud-managed containers", async () => {
|
|
215
105
|
process.env.IS_CONTAINERIZED = "1";
|
|
216
106
|
process.env.IS_CLOUD = "1";
|
|
217
|
-
|
|
218
|
-
const usage = await getDiskUsageInfo();
|
|
219
|
-
const after = statfsSnapshot(PRELOAD_WS);
|
|
220
|
-
|
|
221
|
-
// CSI-backed PVCs report the volume accurately: pure statfs numbers.
|
|
222
|
-
expect(usage).not.toBeNull();
|
|
223
|
-
expectWithinStatfsWindow(usage!, PRELOAD_WS, before, after);
|
|
224
|
-
});
|
|
225
|
-
|
|
226
|
-
test("falls back to statfs when du has nothing to measure", async () => {
|
|
227
|
-
// An empty workspace du's to 0, which the sampler cannot report as usage.
|
|
228
|
-
const emptyWs = mkdtempSync(join("/tmp", "disk-usage-empty-"));
|
|
229
|
-
process.env.IS_CONTAINERIZED = "1";
|
|
230
|
-
process.env.CADET_WORKSPACE_DIR = emptyWs;
|
|
231
|
-
try {
|
|
232
|
-
const before = statfsSnapshot(emptyWs);
|
|
233
|
-
const usage = await getDiskUsageInfo();
|
|
234
|
-
const after = statfsSnapshot(emptyWs);
|
|
235
|
-
|
|
236
|
-
expect(usage).not.toBeNull();
|
|
237
|
-
expectWithinStatfsWindow(usage!, emptyWs, before, after);
|
|
238
|
-
} finally {
|
|
239
|
-
process.env.CADET_WORKSPACE_DIR = PRELOAD_WS;
|
|
240
|
-
rmSync(emptyWs, { recursive: true, force: true });
|
|
241
|
-
}
|
|
107
|
+
await expectFilesystemUsage();
|
|
242
108
|
});
|
|
243
109
|
|
|
244
110
|
test("returns null for malformed Kubernetes memory strings", () => {
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
expect(parseK8sMemoryBytes("-1Gi")).toBeNull();
|
|
249
|
-
expect(parseK8sMemoryBytes("0Gi")).toBeNull();
|
|
111
|
+
for (const value of ["", "abc", "12Zi", "-1Gi", "0Gi"]) {
|
|
112
|
+
expect(parseK8sMemoryBytes(value)).toBeNull();
|
|
113
|
+
}
|
|
250
114
|
});
|
|
251
115
|
});
|
|
@@ -23,7 +23,7 @@ const {
|
|
|
23
23
|
_resetSigningKeyForTesting,
|
|
24
24
|
} = await import("../runtime/auth/token-service.js");
|
|
25
25
|
const { CURRENT_POLICY_EPOCH } = await import("../runtime/auth/policy.js");
|
|
26
|
-
const { getDeprecatedDir } = await import("../util/
|
|
26
|
+
const { getDeprecatedDir } = await import("../util/layout.js");
|
|
27
27
|
|
|
28
28
|
const VALID_HEX_KEY = "ab".repeat(32); // 64 hex chars = 32 bytes
|
|
29
29
|
|