@vellumai/assistant 0.7.1 → 0.7.3
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/ARCHITECTURE.md +48 -50
- package/Dockerfile +1 -0
- package/README.md +1 -2
- package/__tests__/permissions/gateway-threshold-reader.test.ts +9 -3
- package/bun.lock +26 -26
- package/docs/architecture/memory.md +5 -2
- package/docs/architecture/security.md +20 -0
- package/docs/plugins.md +7 -9
- package/knip.json +1 -0
- package/node_modules/@vellumai/gateway-client/src/index.ts +1 -0
- package/node_modules/@vellumai/gateway-client/src/ipc-client.ts +52 -5
- package/node_modules/@vellumai/gateway-client/src/types.ts +11 -0
- package/node_modules/@vellumai/service-contracts/package.json +2 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/contracts.test.ts +4 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/ingress.test.ts +107 -0
- package/node_modules/@vellumai/service-contracts/src/index.ts +5 -1
- package/node_modules/@vellumai/service-contracts/src/ingress.ts +24 -0
- package/node_modules/@vellumai/service-contracts/src/twilio-ingress.ts +84 -0
- package/node_modules/@vellumai/slack-text/src/index.test.ts +18 -35
- package/node_modules/@vellumai/slack-text/src/index.ts +2 -48
- package/node_modules/@vellumai/twilio-client/bun.lock +24 -0
- package/node_modules/@vellumai/twilio-client/package.json +18 -0
- package/node_modules/@vellumai/twilio-client/src/__tests__/twilio-client.test.ts +128 -0
- package/node_modules/@vellumai/twilio-client/src/index.ts +179 -0
- package/node_modules/@vellumai/twilio-client/tsconfig.json +20 -0
- package/openapi.yaml +1020 -40
- package/package.json +6 -3
- package/src/__tests__/app-builder-tool-scripts.test.ts +3 -3
- package/src/__tests__/app-bundler.test.ts +170 -1
- package/src/__tests__/app-control-flow.test.ts +384 -0
- package/src/__tests__/app-control-no-global-cgevent.test.ts +98 -0
- package/src/__tests__/app-control-tool-schemas.test.ts +621 -0
- package/src/__tests__/app-executors.test.ts +30 -43
- package/src/__tests__/approval-routes-http.test.ts +23 -6
- package/src/__tests__/assistant-event-hub-machine-name.test.ts +146 -0
- package/src/__tests__/assistant-event-hub-targeted.test.ts +257 -0
- package/src/__tests__/assistant-event-hub.test.ts +157 -2
- package/src/__tests__/assistant-feature-flags-integration.test.ts +29 -7
- package/src/__tests__/auto-analysis-end-to-end.test.ts +62 -1
- package/src/__tests__/background-shell-host-bash.test.ts +14 -15
- package/src/__tests__/background-workers-disk-pressure.test.ts +268 -0
- package/src/__tests__/bootstrap-turn-cleanup.test.ts +44 -0
- package/src/__tests__/btw-routes.test.ts +13 -4
- package/src/__tests__/call-controller.test.ts +49 -1
- package/src/__tests__/call-conversation-messages.test.ts +8 -2
- package/src/__tests__/call-domain.test.ts +0 -2
- package/src/__tests__/call-routes-http.test.ts +0 -2
- package/src/__tests__/channel-inbound-disk-pressure.test.ts +537 -0
- package/src/__tests__/channel-readiness-service.test.ts +62 -2
- package/src/__tests__/checker.test.ts +3 -4
- package/src/__tests__/config-loader-backfill.test.ts +461 -147
- package/src/__tests__/config-loader-platform-defaults.test.ts +196 -0
- package/src/__tests__/config-schema-cmd.test.ts +0 -1
- package/src/__tests__/config-schema.test.ts +1 -0
- package/src/__tests__/config-set-platform-guard.test.ts +48 -4
- package/src/__tests__/config-watcher-cleanup-throttle.test.ts +20 -11
- package/src/__tests__/config-watcher.test.ts +142 -71
- package/src/__tests__/context-search-agent-runner.test.ts +61 -3
- package/src/__tests__/context-search-conversations-source.test.ts +0 -24
- package/src/__tests__/context-search-fanout.test.ts +0 -1
- package/src/__tests__/context-search-memory-source.test.ts +3 -7
- package/src/__tests__/context-search-memory-v2-source.test.ts +0 -2
- package/src/__tests__/context-search-pkb-source.test.ts +0 -1
- package/src/__tests__/context-search-workspace-source.test.ts +0 -1
- package/src/__tests__/conversation-abort-tool-results.test.ts +6 -0
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +223 -0
- package/src/__tests__/conversation-agent-loop.test.ts +454 -5
- package/src/__tests__/conversation-app-control-instantiation.test.ts +392 -0
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +237 -0
- package/src/__tests__/conversation-error.test.ts +150 -3
- package/src/__tests__/conversation-init.benchmark.test.ts +0 -2
- package/src/__tests__/conversation-lifecycle.test.ts +36 -0
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +283 -0
- package/src/__tests__/conversation-process-callsite.test.ts +43 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +6 -0
- package/src/__tests__/conversation-routes-disk-view.test.ts +6 -0
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +120 -72
- package/src/__tests__/conversation-routes-slash-commands.test.ts +1 -0
- package/src/__tests__/conversation-runtime-assembly.test.ts +65 -0
- package/src/__tests__/conversation-slash-commands.test.ts +0 -4
- package/src/__tests__/conversation-slash-unknown.test.ts +6 -0
- package/src/__tests__/conversation-speed-override.test.ts +0 -3
- package/src/__tests__/conversation-store.test.ts +0 -18
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +202 -0
- package/src/__tests__/conversation-surfaces-app-control.test.ts +328 -0
- package/src/__tests__/conversation-surfaces-data-persist.test.ts +404 -0
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +2 -5
- package/src/__tests__/conversation-workspace-injection.test.ts +6 -0
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +6 -0
- package/src/__tests__/credential-execution-feature-gates.test.ts +5 -12
- package/src/__tests__/credential-execution-managed-contract.test.ts +3 -131
- package/src/__tests__/credentials-cli.test.ts +12 -12
- package/src/__tests__/cu-unified-flow.test.ts +351 -23
- package/src/__tests__/daemon-credential-client.test.ts +101 -19
- package/src/__tests__/date-context.test.ts +164 -2
- package/src/__tests__/db-schedule-syntax-migration.test.ts +2 -0
- package/src/__tests__/disk-pressure-guard.test.ts +262 -0
- package/src/__tests__/disk-pressure-lifecycle.test.ts +168 -0
- package/src/__tests__/disk-pressure-policy.test.ts +241 -0
- package/src/__tests__/disk-pressure-routes.test.ts +379 -0
- package/src/__tests__/disk-pressure-tools.test.ts +277 -0
- package/src/__tests__/disk-usage.test.ts +150 -0
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
- package/src/__tests__/events-client-registration.test.ts +52 -0
- package/src/__tests__/events-dev-bypass-actor.test.ts +162 -0
- package/src/__tests__/file-write-tool.test.ts +4 -10
- package/src/__tests__/filing-service.test.ts +3 -4
- package/src/__tests__/gateway-only-enforcement.test.ts +0 -1
- package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -2
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +0 -2
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +0 -1
- package/src/__tests__/heartbeat-disk-pressure.test.ts +183 -0
- package/src/__tests__/heartbeat-service.test.ts +968 -2
- package/src/__tests__/helpers/call-route-handler.ts +7 -1
- package/src/__tests__/host-app-control-proxy.test.ts +772 -0
- package/src/__tests__/host-app-control-routes.test.ts +263 -0
- package/src/__tests__/host-bash-proxy.test.ts +439 -47
- package/src/__tests__/host-bash-routes.test.ts +459 -0
- package/src/__tests__/host-browser-proxy.test.ts +24 -22
- package/src/__tests__/host-browser-routes.test.ts +39 -13
- package/src/__tests__/host-cu-proxy.test.ts +248 -52
- package/src/__tests__/host-cu-routes-targeted.test.ts +429 -0
- package/src/__tests__/host-file-edit-tool.test.ts +47 -1
- package/src/__tests__/host-file-proxy-targeted.test.ts +378 -0
- package/src/__tests__/host-file-proxy.test.ts +301 -45
- package/src/__tests__/host-file-read-tool.test.ts +17 -0
- package/src/__tests__/host-file-routes-targeted.test.ts +420 -0
- package/src/__tests__/host-file-write-tool.test.ts +42 -1
- package/src/__tests__/host-proxy-base.test.ts +312 -0
- package/src/__tests__/host-shell-tool.test.ts +22 -4
- package/src/__tests__/host-transfer-proxy-targeted.test.ts +932 -0
- package/src/__tests__/host-transfer-proxy.test.ts +121 -22
- package/src/__tests__/host-transfer-routes-targeted.test.ts +662 -0
- package/src/__tests__/http-user-message-parity.test.ts +108 -1
- package/src/__tests__/identity-intro-cache.test.ts +29 -0
- package/src/__tests__/identity-routes.test.ts +103 -1
- package/src/__tests__/init-feature-flag-overrides.test.ts +26 -3
- package/src/__tests__/injector-chain.test.ts +18 -6
- package/src/__tests__/injector-disk-pressure.test.ts +224 -0
- package/src/__tests__/inline-command-runner.test.ts +0 -1
- package/src/__tests__/inline-skill-load-permissions.test.ts +5 -11
- package/src/__tests__/integration-status.test.ts +85 -5
- package/src/__tests__/intent-routing.test.ts +0 -1
- package/src/__tests__/jobs-store-qdrant-breaker.test.ts +95 -5
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +17 -0
- package/src/__tests__/managed-profile-guard.test.ts +18 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +0 -1
- package/src/__tests__/mcp-abort-signal.test.ts +130 -0
- package/src/__tests__/mcp-auth-routes.test.ts +197 -0
- package/src/__tests__/mcp-cli.test.ts +338 -2
- package/src/__tests__/memory-admin-recall.test.ts +3 -11
- package/src/__tests__/memory-jobs-worker-lanes.test.ts +188 -0
- package/src/__tests__/memory-retrieval-pipeline.test.ts +22 -1
- package/src/__tests__/migration-import-commit-http.test.ts +108 -2
- package/src/__tests__/mock-gateway-ipc.ts +1 -0
- package/src/__tests__/normalize-onboarding.test.ts +180 -0
- package/src/__tests__/oauth-cli.test.ts +0 -2
- package/src/__tests__/oauth-connect-routes.test.ts +316 -0
- package/src/__tests__/oauth-provider-seed-logos.test.ts +24 -2
- package/src/__tests__/oauth2-gateway-transport.test.ts +0 -1
- package/src/__tests__/onboarding-persona-write.test.ts +308 -0
- package/src/__tests__/openai-provider.test.ts +45 -8
- package/src/__tests__/persist-onboarding-artifacts.test.ts +44 -64
- package/src/__tests__/persistence-secret-redaction.test.ts +299 -0
- package/src/__tests__/platform-bash-auto-approve.test.ts +5 -9
- package/src/__tests__/platform-callback-registration.test.ts +21 -4
- package/src/__tests__/platform.test.ts +2 -1
- package/src/__tests__/playbook-execution.test.ts +0 -43
- package/src/__tests__/plugin-tool-contribution.test.ts +47 -0
- package/src/__tests__/prechat-onboarding-contract.test.ts +214 -25
- package/src/__tests__/process-message-background-slack.test.ts +2 -0
- package/src/__tests__/provider-commit-message-generator.test.ts +0 -1
- package/src/__tests__/provider-tool-name.test.ts +23 -0
- package/src/__tests__/public-ingress-urls.test.ts +97 -0
- package/src/__tests__/relay-server.test.ts +15 -4
- package/src/__tests__/require-fresh-approval.test.ts +0 -1
- package/src/__tests__/retry-backoff.test.ts +87 -0
- package/src/__tests__/runtime-events-sse.test.ts +2 -2
- package/src/__tests__/sanitize-config-for-transfer.test.ts +24 -2
- package/src/__tests__/schedule-retry.test.ts +715 -0
- package/src/__tests__/scheduler-disk-pressure.test.ts +148 -0
- package/src/__tests__/script-proxy-mitm-handler.test.ts +1 -1
- package/src/__tests__/secret-ingress-http.test.ts +1 -1
- package/src/__tests__/send-endpoint-busy.test.ts +3 -0
- package/src/__tests__/shell-tool-proxy-mode.test.ts +0 -1
- package/src/__tests__/skill-feature-flags.test.ts +43 -41
- package/src/__tests__/skill-load-feature-flag.test.ts +13 -14
- package/src/__tests__/skill-load-inline-command.test.ts +0 -51
- package/src/__tests__/skill-load-inline-includes.test.ts +0 -43
- package/src/__tests__/skill-projection.benchmark.test.ts +0 -1
- package/src/__tests__/skill-script-runner-sandbox.test.ts +0 -1
- package/src/__tests__/slack-channel-config.test.ts +9 -14
- package/src/__tests__/suggestion-routes.test.ts +46 -0
- package/src/__tests__/system-prompt-ask-mode.test.ts +0 -1
- package/src/__tests__/system-prompt.test.ts +0 -1
- package/src/__tests__/telegram-config.test.ts +0 -1
- package/src/__tests__/test-preload.ts +8 -0
- package/src/__tests__/tool-approval-handler.test.ts +3 -4
- package/src/__tests__/tool-audit-listener.test.ts +48 -0
- package/src/__tests__/tool-execute-pipeline.test.ts +0 -1
- package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -1
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +0 -1
- package/src/__tests__/tool-executor.test.ts +0 -1
- package/src/__tests__/twilio-config.test.ts +3 -16
- package/src/__tests__/twilio-routes.test.ts +3 -5
- package/src/__tests__/twilio-validation.test.ts +93 -0
- package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +1 -4
- package/src/__tests__/verification-control-plane-policy.test.ts +2 -4
- package/src/__tests__/voice-ingress-preflight.test.ts +19 -0
- package/src/__tests__/workspace-migration-006-services-config.test.ts +3 -2
- package/src/__tests__/workspace-migration-065-bump-stale-heartbeat-interval.test.ts +122 -0
- package/src/__tests__/workspace-migration-066-seed-heartbeat-callsite-cost-default.test.ts +285 -0
- package/src/__tests__/workspace-migration-068-release-notes-local-timezone.test.ts +90 -0
- package/src/__tests__/workspace-migration-backfill-installation-id.test.ts +1 -5
- package/src/__tests__/workspace-migration-down-functions.test.ts +8 -8
- package/src/__tests__/workspace-migration-safe-storage-limits-release.test.ts +90 -0
- package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +10 -6
- package/src/approvals/guardian-decision-primitive.ts +13 -0
- package/src/approvals/guardian-request-resolvers.ts +16 -17
- package/src/backup/__tests__/paths.test.ts +0 -22
- package/src/backup/__tests__/restore.test.ts +51 -151
- package/src/backup/paths.ts +2 -18
- package/src/backup/restore.ts +107 -231
- package/src/backup/snapshot-lock.ts +2 -27
- package/src/bundler/app-bundler.ts +51 -3
- package/src/bundler/compiler-tools.ts +3 -2
- package/src/calls/call-conversation-messages.ts +46 -10
- package/src/calls/relay-server.ts +4 -44
- package/src/calls/twilio-config.ts +2 -17
- package/src/calls/twilio-rest.ts +33 -105
- package/src/calls/twilio-routes.ts +11 -12
- package/src/channels/types.ts +8 -7
- package/src/cli/commands/__tests__/backup.test.ts +6 -277
- package/src/cli/commands/__tests__/gateway.test.ts +288 -0
- package/src/cli/commands/__tests__/memory-v2.test.ts +4 -0
- package/src/cli/commands/__tests__/webhooks.test.ts +0 -5
- package/src/cli/commands/backup.ts +6 -331
- package/src/cli/commands/bash.ts +35 -108
- package/src/cli/commands/clients.ts +36 -37
- package/src/cli/commands/contacts.ts +137 -25
- package/src/cli/commands/conversations.ts +2 -5
- package/src/cli/commands/credentials.ts +71 -7
- package/src/cli/commands/domain.ts +66 -15
- package/src/cli/commands/gateway.ts +183 -0
- package/src/cli/commands/keys.ts +9 -6
- package/src/cli/commands/mcp.ts +116 -156
- package/src/cli/commands/memory-v2.ts +303 -7
- package/src/cli/commands/oauth/__tests__/connect.test.ts +437 -1
- package/src/cli/commands/oauth/connect.ts +127 -1
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +0 -4
- package/src/cli/commands/platform/__tests__/connect.test.ts +7 -3
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +7 -3
- package/src/cli/commands/platform/__tests__/status.test.ts +116 -21
- package/src/cli/commands/platform/disconnect.ts +5 -4
- package/src/cli/commands/platform/index.ts +16 -25
- package/src/cli/commands/status.ts +57 -0
- package/src/cli/lib/daemon-credential-client.ts +110 -28
- package/src/cli/program.ts +6 -2
- package/src/config/assistant-feature-flags.ts +79 -12
- package/src/config/bundled-skills/acp/SKILL.md +6 -0
- package/src/config/bundled-skills/acp/TOOLS.json +1 -22
- package/src/config/bundled-skills/app-builder/SKILL.md +14 -109
- package/src/config/bundled-skills/app-builder/TOOLS.json +1 -28
- package/src/config/bundled-skills/app-builder/tools/app-create.ts +1 -10
- package/src/config/bundled-skills/app-control/SKILL.md +75 -0
- package/src/config/bundled-skills/app-control/TOOLS.json +299 -0
- package/src/config/bundled-skills/app-control/tools/app-control-click.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-combo.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-drag.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-observe.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-press.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-sequence.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-start.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-stop.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-type.ts +12 -0
- package/src/config/bundled-skills/computer-use/SKILL.md +6 -0
- package/src/config/bundled-skills/computer-use/TOOLS.json +67 -43
- package/src/config/bundled-skills/contacts/TOOLS.json +0 -16
- package/src/config/bundled-skills/document/TOOLS.json +0 -8
- package/src/config/bundled-skills/followups/TOOLS.json +0 -12
- package/src/config/bundled-skills/image-studio/SKILL.md +4 -0
- package/src/config/bundled-skills/image-studio/TOOLS.json +0 -4
- package/src/config/bundled-skills/media-processing/TOOLS.json +0 -24
- package/src/config/bundled-skills/messaging/TOOLS.json +0 -40
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +4 -3
- package/src/config/bundled-skills/phone-calls/TOOLS.json +0 -12
- package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +25 -4
- package/src/config/bundled-skills/playbooks/TOOLS.json +0 -16
- package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +2 -2
- package/src/config/bundled-skills/playbooks/tools/playbook-delete.ts +2 -2
- package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +2 -2
- package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +2 -2
- package/src/config/bundled-skills/schedule/TOOLS.json +14 -14
- package/src/config/bundled-skills/sequences/TOOLS.json +0 -36
- package/src/config/bundled-skills/settings/SKILL.md +4 -0
- package/src/config/bundled-skills/settings/TOOLS.json +0 -12
- package/src/config/bundled-skills/skill-management/SKILL.md +6 -0
- package/src/config/bundled-skills/skill-management/TOOLS.json +0 -8
- package/src/config/bundled-skills/subagent/SKILL.md +6 -2
- package/src/config/bundled-skills/subagent/TOOLS.json +0 -20
- package/src/config/bundled-skills/transcribe/SKILL.md +4 -0
- package/src/config/bundled-skills/transcribe/TOOLS.json +0 -4
- package/src/config/bundled-tool-registry.ts +21 -0
- package/src/config/env-registry.ts +0 -2
- package/src/config/env.ts +19 -20
- package/src/config/feature-flag-registry.json +47 -135
- package/src/config/loader.ts +197 -104
- package/src/config/sanitize-for-transfer.ts +2 -0
- package/src/config/schemas/__tests__/memory-lifecycle.test.ts +80 -0
- package/src/config/schemas/__tests__/memory-v2.test.ts +17 -9
- package/src/config/schemas/call-site-catalog.ts +14 -0
- package/src/config/schemas/calls.ts +0 -9
- package/src/config/schemas/channels.ts +0 -5
- package/src/config/schemas/heartbeat.ts +64 -1
- package/src/config/schemas/ingress.ts +10 -6
- package/src/config/schemas/llm.ts +7 -10
- package/src/config/schemas/memory-lifecycle.ts +90 -24
- package/src/config/schemas/memory-v2.ts +121 -13
- package/src/config/schemas/platform.ts +49 -3
- package/src/config/schemas/services.ts +29 -15
- package/src/config/schemas/skills.ts +0 -6
- package/src/config/seed-inference-profiles.ts +230 -33
- package/src/contacts/contact-store.ts +0 -55
- package/src/contacts/contacts-write.ts +0 -27
- package/src/context/window-manager.ts +1 -2
- package/src/credential-execution/feature-gates.ts +10 -10
- package/src/credential-execution/process-manager.ts +12 -41
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +187 -5
- package/src/daemon/assistant-attachments.ts +4 -4
- package/src/daemon/bootstrap-turn-cleanup.ts +45 -0
- package/src/daemon/config-watcher.ts +89 -60
- package/src/daemon/conversation-agent-loop-handlers.ts +27 -3
- package/src/daemon/conversation-agent-loop.ts +202 -61
- package/src/daemon/conversation-error.ts +87 -15
- package/src/daemon/conversation-lifecycle.ts +9 -4
- package/src/daemon/conversation-process.ts +24 -11
- package/src/daemon/conversation-runtime-assembly.ts +28 -2
- package/src/daemon/conversation-store.ts +2 -2
- package/src/daemon/conversation-surfaces.ts +305 -4
- package/src/daemon/conversation-tool-setup.ts +66 -62
- package/src/daemon/conversation.ts +38 -24
- package/src/daemon/date-context.ts +71 -22
- package/src/daemon/disk-pressure-background-gate.ts +73 -0
- package/src/daemon/disk-pressure-guard.ts +343 -0
- package/src/daemon/disk-pressure-policy.ts +163 -0
- package/src/daemon/doordash-steps.ts +1 -1
- package/src/daemon/handlers/shared.ts +4 -2
- package/src/daemon/handlers/skills.ts +3 -4
- package/src/daemon/host-app-control-proxy.ts +389 -0
- package/src/daemon/host-bash-proxy.ts +117 -82
- package/src/daemon/host-browser-proxy.ts +67 -82
- package/src/daemon/host-cu-proxy.ts +127 -86
- package/src/daemon/host-file-proxy.ts +129 -69
- package/src/daemon/host-proxy-base.ts +294 -0
- package/src/daemon/host-proxy-preactivation.ts +82 -0
- package/src/daemon/host-transfer-proxy.ts +338 -129
- package/src/daemon/lifecycle.ts +194 -145
- package/src/daemon/meet-host-supervisor.ts +4 -4
- package/src/daemon/meet-manifest-loader.ts +0 -1
- package/src/daemon/memory-v2-startup.ts +14 -4
- package/src/daemon/message-protocol.ts +6 -8
- package/src/daemon/message-types/contacts.ts +23 -1
- package/src/daemon/message-types/conversations.ts +15 -8
- package/src/daemon/message-types/disk-pressure.ts +9 -0
- package/src/daemon/message-types/host-app-control.ts +150 -0
- package/src/daemon/message-types/host-bash.ts +4 -0
- package/src/daemon/message-types/host-cu.ts +2 -0
- package/src/daemon/message-types/host-file.ts +4 -0
- package/src/daemon/message-types/host-transfer.ts +3 -0
- package/src/daemon/message-types/messages.ts +3 -0
- package/src/daemon/message-types/schedules.ts +8 -3
- package/src/daemon/message-types/skills.ts +2 -2
- package/src/daemon/process-message.ts +18 -1
- package/src/daemon/profiler-run-store.ts +5 -5
- package/src/daemon/shutdown-handlers.ts +0 -3
- package/src/daemon/tool-setup-types.ts +51 -0
- package/src/daemon/tool-side-effects.ts +1 -1
- package/src/documents/document-store.ts +85 -0
- package/src/events/tool-audit-listener.ts +2 -1
- package/src/filing/filing-service.ts +30 -5
- package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +24 -23
- package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +252 -0
- package/src/heartbeat/heartbeat-run-store.ts +249 -0
- package/src/heartbeat/heartbeat-service.ts +459 -54
- package/src/home/__tests__/post-connect-feed.test.ts +99 -0
- package/src/home/__tests__/relationship-state-writer.test.ts +11 -9
- package/src/home/__tests__/suggested-prompts.test.ts +89 -0
- package/src/home/feed-scheduler.ts +18 -0
- package/src/home/post-connect-feed.ts +68 -0
- package/src/home/relationship-state-writer.ts +17 -92
- package/src/home/suggested-prompts.ts +46 -10
- package/src/inbound/platform-callback-registration.ts +8 -15
- package/src/inbound/public-ingress-urls.ts +32 -34
- package/src/ipc/__tests__/clients-list-ipc.test.ts +169 -0
- package/src/ipc/__tests__/route-error-envelope.test.ts +80 -0
- package/src/ipc/assistant-server.ts +70 -3
- package/src/ipc/cli-client.ts +32 -1
- package/src/ipc/gateway-client.ts +37 -3
- package/src/live-voice/live-voice-archive.ts +4 -4
- package/src/live-voice/live-voice-metrics.ts +10 -10
- package/src/live-voice/protocol.ts +5 -7
- package/src/mcp/__tests__/mcp-auth-orchestrator.test.ts +304 -0
- package/src/mcp/mcp-auth-orchestrator.ts +213 -0
- package/src/mcp/mcp-auth-state.ts +133 -0
- package/src/mcp/mcp-oauth-provider.ts +19 -0
- package/src/media/image-service.ts +1 -7
- package/src/memory/__tests__/fixtures/memory-v2-activation-fixtures.ts +21 -13
- package/src/memory/__tests__/jobs-store-job-classes.test.ts +24 -0
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +52 -22
- package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +0 -6
- package/src/memory/__tests__/memory-v2-concept-frequency.test.ts +272 -0
- package/src/memory/__tests__/qdrant-client-sentinel.test.ts +49 -0
- package/src/memory/__tests__/sparse-tokenize.test.ts +66 -0
- package/src/memory/admin.ts +5 -9
- package/src/memory/anisotropy.test.ts +247 -0
- package/src/memory/anisotropy.ts +443 -0
- package/src/memory/auto-analysis-constants.ts +17 -0
- package/src/memory/auto-analysis-guard.ts +5 -15
- package/src/memory/canonical-guardian-store.ts +7 -7
- package/src/memory/context-search/__tests__/agent-runner-redaction.test.ts +122 -0
- package/src/memory/context-search/agent-protocol.ts +6 -6
- package/src/memory/context-search/agent-runner.ts +51 -9
- package/src/memory/context-search/sources/conversations.ts +2 -11
- package/src/memory/context-search/sources/memory-v2.ts +22 -9
- package/src/memory/context-search/sources/memory.ts +0 -1
- package/src/memory/context-search/types.ts +0 -1
- package/src/memory/conversation-crud.ts +5 -13
- package/src/memory/conversation-key-store.ts +2 -15
- package/src/memory/db-init.ts +6 -0
- package/src/memory/embedding-backend.ts +9 -21
- package/src/memory/embedding-runtime-manager.ts +119 -5
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +81 -25
- package/src/memory/graph/conversation-graph-memory.ts +43 -78
- package/src/memory/graph/extraction.ts +1 -3
- package/src/memory/graph/graph-search.test.ts +10 -67
- package/src/memory/graph/graph-search.ts +9 -20
- package/src/memory/graph/retriever.test.ts +6 -0
- package/src/memory/graph/retriever.ts +34 -10
- package/src/memory/graph/tools.ts +1 -1
- package/src/memory/indexer.ts +54 -45
- package/src/memory/job-handlers/backfill.ts +2 -11
- package/src/memory/job-handlers/cleanup.ts +43 -0
- package/src/memory/job-handlers/embedding.ts +6 -8
- package/src/memory/job-handlers/summarization.ts +2 -7
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +8 -2
- package/src/memory/jobs/embed-concept-page.ts +28 -2
- package/src/memory/jobs/embed-pkb-file.test.ts +2 -2
- package/src/memory/jobs-store.ts +114 -22
- package/src/memory/jobs-worker.ts +193 -106
- package/src/memory/memory-v2-activation-log-store.ts +33 -15
- package/src/memory/memory-v2-concept-frequency.ts +169 -0
- package/src/memory/migrations/237-heartbeat-runs.ts +45 -0
- package/src/memory/migrations/238-schedule-retry-policy.ts +20 -0
- package/src/memory/migrations/239-trace-events-created-at-index.ts +18 -0
- package/src/memory/migrations/index.ts +6 -0
- package/src/memory/migrations/registry.ts +8 -0
- package/src/memory/pkb/pkb-search.test.ts +6 -0
- package/src/memory/pkb/pkb-search.ts +7 -0
- package/src/memory/qdrant-client.ts +49 -32
- package/src/memory/rerank-local.ts +374 -0
- package/src/memory/schema/infrastructure.ts +15 -0
- package/src/memory/search/semantic.ts +13 -67
- package/src/memory/sparse-tokenize.ts +49 -0
- package/src/memory/trace-event-store.ts +1 -17
- package/src/memory/v2/__tests__/activation.test.ts +387 -344
- package/src/memory/v2/__tests__/consolidation-job.test.ts +40 -8
- package/src/memory/v2/__tests__/injection.test.ts +181 -169
- package/src/memory/v2/__tests__/prompts-consolidation.test.ts +61 -2
- package/src/memory/v2/__tests__/qdrant.test.ts +16 -0
- package/src/memory/v2/__tests__/reranker.test.ts +338 -0
- package/src/memory/v2/__tests__/sim.test.ts +154 -188
- package/src/memory/v2/__tests__/skill-store.test.ts +71 -65
- package/src/memory/v2/__tests__/sparse-bm25.test.ts +292 -0
- package/src/memory/v2/__tests__/static-context.test.ts +76 -2
- package/src/memory/v2/activation.ts +213 -239
- package/src/memory/v2/consolidation-job.ts +65 -17
- package/src/memory/v2/constants.ts +7 -0
- package/src/memory/v2/injection.ts +123 -103
- package/src/memory/v2/prompts/consolidation.ts +348 -92
- package/src/memory/v2/qdrant.ts +198 -1
- package/src/memory/v2/reranker.ts +177 -0
- package/src/memory/v2/sim.ts +113 -77
- package/src/memory/v2/skill-content.ts +4 -3
- package/src/memory/v2/skill-store.ts +91 -53
- package/src/memory/v2/sparse-bm25.ts +245 -0
- package/src/memory/v2/static-context.ts +28 -5
- package/src/memory/v2/types.ts +10 -10
- package/src/messaging/providers/gmail/types.ts +0 -49
- package/src/messaging/providers/slack/adapter.ts +1 -31
- package/src/messaging/providers/slack/types.ts +0 -32
- package/src/notifications/README.md +10 -10
- package/src/notifications/broadcaster.ts +1 -1
- package/src/notifications/copy-composer.ts +13 -0
- package/src/notifications/guardian-question-mode.ts +5 -5
- package/src/notifications/signal.ts +4 -0
- package/src/oauth/AGENTS.md +3 -1
- package/src/oauth/__tests__/oauth-connect-state.test.ts +137 -0
- package/src/oauth/connect-orchestrator.ts +6 -0
- package/src/oauth/connection-resolver.test.ts +66 -1
- package/src/oauth/connection-resolver.ts +55 -1
- package/src/oauth/credential-token-resolver.ts +1 -3
- package/src/oauth/manual-token-connection.ts +0 -4
- package/src/oauth/oauth-connect-state.ts +77 -0
- package/src/oauth/seed-providers.ts +58 -1
- package/src/outbound-proxy/index.ts +1 -37
- package/src/outbound-proxy/logging.ts +1 -1
- package/src/outbound-proxy/policy.ts +6 -5
- package/src/outbound-proxy/router.ts +2 -1
- package/src/permissions/approval-policy.test.ts +6 -275
- package/src/permissions/approval-policy.ts +0 -51
- package/src/permissions/checker.test.ts +0 -1
- package/src/permissions/checker.ts +3 -17
- package/src/permissions/gateway-threshold-reader.ts +2 -0
- package/src/permissions/prompter.ts +34 -1
- package/src/permissions/secret-prompter.ts +6 -2
- package/src/plugins/defaults/injectors.ts +35 -2
- package/src/plugins/defaults/memory-retrieval.ts +5 -6
- package/src/plugins/types.ts +7 -0
- package/src/proactive-artifact/aux-message-injector.ts +74 -0
- package/src/proactive-artifact/decision.test.ts +226 -0
- package/src/proactive-artifact/decision.ts +165 -0
- package/src/proactive-artifact/index.ts +7 -0
- package/src/proactive-artifact/job.test.ts +867 -0
- package/src/proactive-artifact/job.ts +352 -0
- package/src/proactive-artifact/message-copy.ts +41 -0
- package/src/proactive-artifact/trigger-state.test.ts +277 -0
- package/src/proactive-artifact/trigger-state.ts +119 -0
- package/src/prompts/bootstrap-cleanup.ts +27 -0
- package/src/prompts/normalize-onboarding.ts +80 -0
- package/src/prompts/persona-resolver.ts +101 -9
- package/src/prompts/system-prompt.ts +23 -24
- package/src/prompts/templates/BOOTSTRAP.md +13 -5
- package/src/prompts/templates/SOUL.md +13 -1
- package/src/providers/__tests__/retry-callsite.test.ts +222 -1
- package/src/providers/model-intents.ts +7 -0
- package/src/providers/openrouter/client.ts +8 -0
- package/src/providers/retry.ts +50 -0
- package/src/providers/speech-to-text/provider-catalog.ts +7 -8
- package/src/providers/types.ts +1 -0
- package/src/runtime/__tests__/agent-wake.test.ts +456 -3
- package/src/runtime/agent-wake.ts +238 -100
- package/src/runtime/assistant-event-hub.ts +151 -99
- package/src/runtime/auth/__tests__/middleware.test.ts +11 -56
- package/src/runtime/auth/__tests__/route-policy.test.ts +64 -0
- package/src/runtime/auth/middleware.ts +0 -96
- package/src/runtime/auth/route-policy.ts +32 -0
- package/src/runtime/auth/same-actor.ts +216 -0
- package/src/runtime/btw-sidechain.ts +2 -3
- package/src/runtime/channel-invite-transport.ts +2 -48
- package/src/runtime/channel-invite-transports/email.ts +1 -1
- package/src/runtime/channel-invite-transports/slack.ts +1 -1
- package/src/runtime/channel-invite-transports/telegram.ts +1 -1
- package/src/runtime/channel-invite-transports/voice.ts +1 -1
- package/src/runtime/channel-invite-transports/whatsapp.ts +1 -1
- package/src/runtime/channel-invite-types.ts +54 -0
- package/src/runtime/channel-readiness-service.ts +32 -13
- package/src/runtime/channel-retry-sweep.ts +65 -1
- package/src/runtime/guardian-reply-router.ts +10 -0
- package/src/runtime/http-server.ts +3 -329
- package/src/runtime/http-types.ts +0 -5
- package/src/runtime/local-actor-identity.ts +52 -11
- package/src/runtime/migrations/__tests__/vbundle-import-parity.test.ts +413 -0
- package/src/runtime/migrations/__tests__/vbundle-import-policy.test.ts +260 -0
- package/src/runtime/migrations/__tests__/vbundle-import-version-compat.test.ts +189 -0
- package/src/runtime/migrations/__tests__/vbundle-streaming-importer.test.ts +153 -1
- package/src/runtime/migrations/__tests__/vbundle-symlink-importer.test.ts +451 -0
- package/src/runtime/migrations/__tests__/vbundle-symlink-streaming-importer.test.ts +0 -0
- package/src/runtime/migrations/__tests__/vbundle-symlink-streaming.test.ts +515 -0
- package/src/runtime/migrations/__tests__/vbundle-symlink-tar.test.ts +437 -0
- package/src/runtime/migrations/__tests__/vbundle-symlink-walker.test.ts +319 -0
- package/src/runtime/migrations/__tests__/vbundle-validator-v1-schema.test.ts +51 -1
- package/src/runtime/migrations/migration-transport.ts +7 -7
- package/src/runtime/migrations/vbundle-builder.ts +327 -60
- package/src/runtime/migrations/vbundle-import-analyzer.ts +4 -4
- package/src/runtime/migrations/vbundle-import-policy.ts +172 -0
- package/src/runtime/migrations/vbundle-importer.ts +245 -68
- package/src/runtime/migrations/vbundle-streaming-importer.ts +326 -35
- package/src/runtime/migrations/vbundle-streaming-validator.ts +157 -4
- package/src/runtime/migrations/vbundle-tar-stream.ts +15 -6
- package/src/runtime/migrations/vbundle-validator.ts +114 -0
- package/src/runtime/pending-interactions.ts +43 -9
- package/src/runtime/routes/__tests__/backup-routes.test.ts +22 -150
- package/src/runtime/routes/__tests__/client-routes.test.ts +155 -0
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +98 -5
- package/src/runtime/routes/__tests__/gateway-log-routes.test.ts +242 -0
- package/src/runtime/routes/__tests__/heartbeat-routes.test.ts +112 -0
- package/src/runtime/routes/approval-interception-types.ts +13 -0
- package/src/runtime/routes/approval-strategies/guardian-text-engine-strategy.ts +1 -1
- package/src/runtime/routes/backup-routes.ts +15 -38
- package/src/runtime/routes/btw-routes.ts +14 -37
- package/src/runtime/routes/client-routes.ts +21 -2
- package/src/runtime/routes/contact-prompt-routes.ts +183 -0
- package/src/runtime/routes/contact-routes.ts +0 -25
- package/src/runtime/routes/conversation-query-routes.ts +36 -1
- package/src/runtime/routes/conversation-routes.ts +65 -39
- package/src/runtime/routes/debug-bash-routes.ts +163 -0
- package/src/runtime/routes/disk-pressure-routes.ts +121 -0
- package/src/runtime/routes/document-pdf-renderer.ts +169 -0
- package/src/runtime/routes/documents-routes.ts +32 -75
- package/src/runtime/routes/errors.ts +19 -4
- package/src/runtime/routes/events-routes.ts +38 -0
- package/src/runtime/routes/gateway-log-routes.ts +79 -0
- package/src/runtime/routes/guardian-approval-interception.ts +2 -8
- package/src/runtime/routes/heartbeat-routes.ts +103 -38
- package/src/runtime/routes/host-app-control-routes.ts +134 -0
- package/src/runtime/routes/host-bash-routes.ts +56 -6
- package/src/runtime/routes/host-browser-routes.ts +108 -13
- package/src/runtime/routes/host-cu-routes.ts +66 -9
- package/src/runtime/routes/host-file-routes.ts +54 -5
- package/src/runtime/routes/host-transfer-routes.ts +122 -19
- package/src/runtime/routes/http-adapter.ts +1 -0
- package/src/runtime/routes/identity-intro-cache.ts +30 -0
- package/src/runtime/routes/identity-routes.ts +21 -180
- package/src/runtime/routes/inbound-message-handler.ts +78 -21
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +0 -7
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +0 -8
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +3 -0
- package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +0 -20
- package/src/runtime/routes/inbound-stages/transcribe-audio.ts +5 -13
- package/src/runtime/routes/index.ts +14 -0
- package/src/runtime/routes/mcp-auth-routes.ts +132 -0
- package/src/runtime/routes/memory-item-routes.test.ts +41 -15
- package/src/runtime/routes/memory-item-routes.ts +10 -12
- package/src/runtime/routes/memory-v2-routes.ts +474 -1
- package/src/runtime/routes/migration-routes.ts +96 -0
- package/src/runtime/routes/oauth-connect-routes.ts +153 -0
- package/src/runtime/routes/schedule-routes.ts +7 -0
- package/src/runtime/verification-outbound-actions.ts +4 -4
- package/src/runtime/verification-templates.ts +4 -7
- package/src/schedule/integration-status.ts +66 -2
- package/src/schedule/recurrence-engine.ts +4 -1
- package/src/schedule/retry-backoff.ts +18 -0
- package/src/schedule/retry-policy.ts +82 -0
- package/src/schedule/run-script.ts +37 -5
- package/src/schedule/schedule-recovery.ts +64 -0
- package/src/schedule/schedule-store.ts +106 -2
- package/src/schedule/scheduler-types.ts +25 -0
- package/src/schedule/scheduler.ts +83 -39
- package/src/security/encrypted-store.ts +2 -0
- package/src/security/oauth-callback-registry.ts +8 -0
- package/src/security/secure-keys.ts +55 -0
- package/src/sequence/analytics.ts +5 -5
- package/src/sequence/engine.ts +1 -1
- package/src/skills/catalog-files.ts +2 -8
- package/src/skills/include-graph.ts +5 -5
- package/src/skills/remote-skill-policy.ts +10 -16
- package/src/skills/skill-file-provider.ts +1 -1
- package/src/skills/skill-file-types.ts +13 -0
- package/src/skills/skillssh-audit-types.ts +28 -0
- package/src/skills/skillssh-registry.ts +8 -21
- package/src/subagent/index.ts +1 -7
- package/src/subagent/manager.ts +1 -15
- package/src/tasks/task-runner.ts +0 -1
- package/src/tasks/task-store.ts +0 -3
- package/src/telemetry/types.ts +2 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +21 -0
- package/src/telemetry/usage-telemetry-reporter.ts +1 -0
- package/src/tools/app-control/skill-proxy-bridge.ts +28 -0
- package/src/tools/apps/executors.ts +56 -69
- package/src/tools/background-tool-registry.ts +17 -3
- package/src/tools/browser/__tests__/browser-status.test.ts +21 -18
- package/src/tools/browser/browser-execution.ts +2 -2
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +55 -4
- package/src/tools/browser/cdp-client/cdp-inspect/__tests__/ws-transport.test.ts +12 -6
- package/src/tools/browser/cdp-client/factory.ts +23 -24
- package/src/tools/browser/cdp-client/index.ts +1 -14
- package/src/tools/computer-use/definitions.ts +42 -20
- package/src/tools/executor.ts +2 -0
- package/src/tools/host-filesystem/edit.test.ts +151 -0
- package/src/tools/host-filesystem/edit.ts +68 -0
- package/src/tools/host-filesystem/read.test.ts +129 -0
- package/src/tools/host-filesystem/read.ts +68 -0
- package/src/tools/host-filesystem/transfer.test.ts +127 -2
- package/src/tools/host-filesystem/transfer.ts +78 -3
- package/src/tools/host-filesystem/write.test.ts +134 -0
- package/src/tools/host-filesystem/write.ts +68 -0
- package/src/tools/host-terminal/host-shell.ts +66 -1
- package/src/tools/mcp/mcp-tool-factory.ts +2 -1
- package/src/tools/memory/register.test.ts +12 -9
- package/src/tools/memory/register.ts +1 -2
- package/src/tools/provider-tool-name.ts +28 -0
- package/src/tools/registry.ts +30 -9
- package/src/tools/schedule/create.ts +6 -0
- package/src/tools/schedule/list.ts +2 -0
- package/src/tools/schedule/update.ts +10 -0
- package/src/tools/shared/filesystem/file-ops-service.ts +2 -0
- package/src/tools/shared/filesystem/path-policy.ts +25 -1
- package/src/tools/skills/load.ts +0 -32
- package/src/tools/terminal/shell.ts +9 -1
- package/src/tools/tool-approval-handler.ts +32 -11
- package/src/tools/types.ts +28 -2
- package/src/tts/provider-catalog.ts +3 -5
- package/src/usage/pricing.ts +1 -1
- package/src/util/disk-usage.ts +138 -0
- package/src/util/platform.ts +21 -11
- package/src/util/process-liveness.ts +26 -0
- package/src/workspace/hatched-date.ts +86 -0
- package/src/workspace/heartbeat-service.ts +19 -0
- package/src/workspace/migrations/003-seed-device-id.ts +1 -1
- package/src/workspace/migrations/006-services-config.ts +8 -5
- package/src/workspace/migrations/016-extract-feature-flags-to-protected.ts +3 -9
- package/src/workspace/migrations/021-move-signals-to-workspace.ts +4 -10
- package/src/workspace/migrations/022-move-hooks-to-workspace.ts +4 -10
- package/src/workspace/migrations/023-move-config-files-to-workspace.ts +4 -11
- package/src/workspace/migrations/024-move-runtime-files-to-workspace.ts +3 -10
- package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +3 -2
- package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +2 -1
- package/src/workspace/migrations/059-move-pid-to-workspace.ts +3 -8
- package/src/workspace/migrations/061-move-backup-key-to-workspace.ts +3 -8
- package/src/workspace/migrations/065-bump-stale-heartbeat-interval.ts +60 -0
- package/src/workspace/migrations/066-seed-heartbeat-callsite-cost-default.ts +146 -0
- package/src/workspace/migrations/067-release-notes-safe-storage-limits.ts +72 -0
- package/src/workspace/migrations/068-release-notes-local-timezone.ts +65 -0
- package/src/workspace/migrations/AGENTS.md +1 -1
- package/src/workspace/migrations/migrate-to-workspace-volume.ts +4 -10
- package/src/workspace/migrations/registry.ts +8 -0
- package/src/workspace/migrations/utils.ts +21 -0
- package/src/__tests__/conversation-tool-setup-memory-scope.test.ts +0 -167
- package/src/__tests__/host-browser-e2e-cloud.test.ts +0 -443
- package/src/__tests__/host-browser-e2e-self-hosted-capability.test.ts +0 -226
- package/src/__tests__/host-browser-ws-events-e2e.test.ts +0 -427
- package/src/__tests__/twilio-rest.test.ts +0 -34
- package/src/backup/__tests__/backup-key.test.ts +0 -152
- package/src/backup/__tests__/backup-worker.test.ts +0 -782
- package/src/backup/__tests__/offsite-writer.test.ts +0 -641
- package/src/backup/__tests__/stream-crypt.test.ts +0 -228
- package/src/backup/backup-key.ts +0 -137
- package/src/backup/backup-worker.ts +0 -472
- package/src/backup/offsite-writer.ts +0 -222
- package/src/backup/stream-crypt.ts +0 -263
- package/src/daemon/message-types/pairing.ts +0 -58
- package/src/memory/v2/__tests__/skill-qdrant.test.ts +0 -657
- package/src/memory/v2/skill-qdrant.ts +0 -395
- package/src/outbound-proxy/config.ts +0 -20
- package/src/outbound-proxy/health.ts +0 -18
- package/src/outbound-proxy/types.ts +0 -150
- package/src/runtime/capability-tokens.ts +0 -190
- package/src/signals/bash.ts +0 -198
- package/src/signals/mcp-reload.ts +0 -18
|
@@ -29,10 +29,19 @@ mock.module("../util/logger.js", () => ({
|
|
|
29
29
|
}));
|
|
30
30
|
|
|
31
31
|
// ---------------------------------------------------------------------------
|
|
32
|
-
// Capture fs.watch calls so we can simulate file system
|
|
32
|
+
// Capture fs.watch and fs.watchFile calls so we can simulate file system
|
|
33
|
+
// events deterministically. Bun's libuv-based fs.watchFile is too unreliable
|
|
34
|
+
// on Linux CI to test against directly: first-poll latency is ~5s and
|
|
35
|
+
// back-to-back changes to different files frequently miss events. Driving
|
|
36
|
+
// the captured listener bypasses libuv entirely while still exercising the
|
|
37
|
+
// real ConfigWatcher dispatch logic.
|
|
33
38
|
// ---------------------------------------------------------------------------
|
|
34
39
|
|
|
35
40
|
type WatchCallback = (eventType: string, filename: string | null) => void;
|
|
41
|
+
type WatchFileListener = (
|
|
42
|
+
curr: { ino: number; mtimeMs: number },
|
|
43
|
+
prev: { ino: number; mtimeMs: number },
|
|
44
|
+
) => void;
|
|
36
45
|
|
|
37
46
|
interface CapturedWatcher {
|
|
38
47
|
dir: string;
|
|
@@ -40,10 +49,17 @@ interface CapturedWatcher {
|
|
|
40
49
|
options?: { recursive?: boolean };
|
|
41
50
|
}
|
|
42
51
|
|
|
52
|
+
interface CapturedFileWatch {
|
|
53
|
+
filePath: string;
|
|
54
|
+
listener: WatchFileListener;
|
|
55
|
+
}
|
|
56
|
+
|
|
43
57
|
const capturedWatchers: CapturedWatcher[] = [];
|
|
58
|
+
const capturedFileWatches: CapturedFileWatch[] = [];
|
|
44
59
|
|
|
45
60
|
const fakeWatcher = {
|
|
46
61
|
close: () => {},
|
|
62
|
+
on: (_event: string, _handler: (...args: unknown[]) => void) => fakeWatcher,
|
|
47
63
|
};
|
|
48
64
|
|
|
49
65
|
mock.module("node:fs", () => {
|
|
@@ -65,6 +81,18 @@ mock.module("node:fs", () => {
|
|
|
65
81
|
capturedWatchers.push({ dir, callback, options });
|
|
66
82
|
return fakeWatcher;
|
|
67
83
|
},
|
|
84
|
+
watchFile: (filePath: string, ...args: unknown[]) => {
|
|
85
|
+
// Signature is `watchFile(path, [options], listener)` — skip the
|
|
86
|
+
// optional options arg so we always grab the listener.
|
|
87
|
+
const listener = (
|
|
88
|
+
typeof args[0] === "function" ? args[0] : args[1]
|
|
89
|
+
) as WatchFileListener;
|
|
90
|
+
capturedFileWatches.push({ filePath, listener });
|
|
91
|
+
},
|
|
92
|
+
unwatchFile: (filePath: string) => {
|
|
93
|
+
const idx = capturedFileWatches.findIndex((w) => w.filePath === filePath);
|
|
94
|
+
if (idx !== -1) capturedFileWatches.splice(idx, 1);
|
|
95
|
+
},
|
|
68
96
|
};
|
|
69
97
|
});
|
|
70
98
|
|
|
@@ -92,8 +120,8 @@ mock.module("../providers/registry.js", () => ({
|
|
|
92
120
|
initializeProviders: () => {},
|
|
93
121
|
}));
|
|
94
122
|
|
|
95
|
-
mock.module("../
|
|
96
|
-
|
|
123
|
+
mock.module("../daemon/mcp-reload-service.js", () => ({
|
|
124
|
+
reloadMcpServers: async () => {},
|
|
97
125
|
}));
|
|
98
126
|
|
|
99
127
|
mock.module("../signals/conversation-undo.js", () => ({
|
|
@@ -115,16 +143,52 @@ const { ConfigWatcher } = await import("../daemon/config-watcher.js");
|
|
|
115
143
|
// Helpers
|
|
116
144
|
// ---------------------------------------------------------------------------
|
|
117
145
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
146
|
+
const TEST_DEBOUNCE_MS = 10;
|
|
147
|
+
// Sleep budget to wait out the debouncer + any async handler work.
|
|
148
|
+
const WAIT_MS = TEST_DEBOUNCE_MS + 50;
|
|
149
|
+
|
|
150
|
+
function findWatcher(path: string): CapturedWatcher | undefined {
|
|
151
|
+
return capturedWatchers.find((w) => w.dir === path);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function findFileWatch(filePath: string): CapturedFileWatch | undefined {
|
|
155
|
+
return capturedFileWatches.find((w) => w.filePath === filePath);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const WORKSPACE_FILES = new Set(["config.json", "SOUL.md", "IDENTITY.md"]);
|
|
159
|
+
|
|
160
|
+
// Each call advances the inode + mtime so the listener's early-return guard
|
|
161
|
+
// (curr.ino === prev.ino && curr.mtimeMs === prev.mtimeMs) doesn't fire.
|
|
162
|
+
let mtimeCounter = 1_000;
|
|
163
|
+
const inoMap = new Map<string, number>();
|
|
164
|
+
|
|
165
|
+
function nextStat(filePath: string): { ino: number; mtimeMs: number } {
|
|
166
|
+
const ino = (inoMap.get(filePath) ?? 0) + 1;
|
|
167
|
+
inoMap.set(filePath, ino);
|
|
168
|
+
mtimeCounter += 1;
|
|
169
|
+
return { ino, mtimeMs: mtimeCounter };
|
|
121
170
|
}
|
|
122
171
|
|
|
123
|
-
/** Simulate a file change event and flush the debounce timer. */
|
|
124
172
|
function simulateFileChange(dir: string, filename: string): void {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
173
|
+
if (dir === WORKSPACE_DIR && WORKSPACE_FILES.has(filename)) {
|
|
174
|
+
const filePath = join(dir, filename);
|
|
175
|
+
const fw = findFileWatch(filePath);
|
|
176
|
+
if (!fw) {
|
|
177
|
+
throw new Error(`No watchFile subscription for ${filePath}`);
|
|
178
|
+
}
|
|
179
|
+
const prev = {
|
|
180
|
+
ino: inoMap.get(filePath) ?? 0,
|
|
181
|
+
mtimeMs: mtimeCounter,
|
|
182
|
+
};
|
|
183
|
+
const curr = nextStat(filePath);
|
|
184
|
+
fw.listener(curr, prev);
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
const dirWatcher = findWatcher(dir);
|
|
188
|
+
if (!dirWatcher) {
|
|
189
|
+
throw new Error(`No watcher found for directory ${dir}`);
|
|
190
|
+
}
|
|
191
|
+
dirWatcher.callback("change", filename);
|
|
128
192
|
}
|
|
129
193
|
|
|
130
194
|
// ---------------------------------------------------------------------------
|
|
@@ -143,8 +207,10 @@ const onConversationEvict = () => {
|
|
|
143
207
|
|
|
144
208
|
beforeEach(() => {
|
|
145
209
|
capturedWatchers.length = 0;
|
|
210
|
+
capturedFileWatches.length = 0;
|
|
211
|
+
inoMap.clear();
|
|
146
212
|
evictCallCount = 0;
|
|
147
|
-
watcher = new ConfigWatcher();
|
|
213
|
+
watcher = new ConfigWatcher(undefined, TEST_DEBOUNCE_MS);
|
|
148
214
|
});
|
|
149
215
|
|
|
150
216
|
afterEach(() => {
|
|
@@ -155,51 +221,44 @@ describe("ConfigWatcher workspace file handlers", () => {
|
|
|
155
221
|
test("SOUL.md change triggers onConversationEvict", async () => {
|
|
156
222
|
watcher.start(onConversationEvict);
|
|
157
223
|
simulateFileChange(WORKSPACE_DIR, "SOUL.md");
|
|
158
|
-
|
|
159
|
-
// Wait for the debounce timer to fire (default 200ms)
|
|
160
|
-
await new Promise((r) => setTimeout(r, 300));
|
|
224
|
+
await new Promise((r) => setTimeout(r, WAIT_MS));
|
|
161
225
|
expect(evictCallCount).toBe(1);
|
|
162
226
|
});
|
|
163
227
|
|
|
164
228
|
test("IDENTITY.md change triggers onConversationEvict", async () => {
|
|
165
229
|
watcher.start(onConversationEvict);
|
|
166
230
|
simulateFileChange(WORKSPACE_DIR, "IDENTITY.md");
|
|
167
|
-
|
|
168
|
-
await new Promise((r) => setTimeout(r, 300));
|
|
231
|
+
await new Promise((r) => setTimeout(r, WAIT_MS));
|
|
169
232
|
expect(evictCallCount).toBe(1);
|
|
170
233
|
});
|
|
171
234
|
|
|
172
|
-
test("UPDATES.md
|
|
235
|
+
test("UPDATES.md is not subscribed (only the registered handler set is)", () => {
|
|
173
236
|
watcher.start(onConversationEvict);
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
expect(
|
|
237
|
+
// Per-file watching only registers config.json, SOUL.md, IDENTITY.md.
|
|
238
|
+
// The whole workspace dir must not be watched either — that was the
|
|
239
|
+
// ENXIO-on-Unix-sockets bug.
|
|
240
|
+
expect(findFileWatch(join(WORKSPACE_DIR, "UPDATES.md"))).toBeUndefined();
|
|
241
|
+
expect(findWatcher(WORKSPACE_DIR)).toBeUndefined();
|
|
178
242
|
});
|
|
179
243
|
|
|
180
244
|
test("config.json change calls refreshConfigFromSources", async () => {
|
|
181
245
|
let refreshCalled = false;
|
|
182
246
|
watcher.refreshConfigFromSources = async () => {
|
|
183
247
|
refreshCalled = true;
|
|
184
|
-
return false;
|
|
248
|
+
return false;
|
|
185
249
|
};
|
|
186
|
-
|
|
187
250
|
watcher.start(onConversationEvict);
|
|
188
251
|
simulateFileChange(WORKSPACE_DIR, "config.json");
|
|
189
|
-
|
|
190
|
-
await new Promise((r) => setTimeout(r, 300));
|
|
252
|
+
await new Promise((r) => setTimeout(r, WAIT_MS));
|
|
191
253
|
expect(refreshCalled).toBe(true);
|
|
192
|
-
// Config didn't change (returned false), so no eviction
|
|
193
254
|
expect(evictCallCount).toBe(0);
|
|
194
255
|
});
|
|
195
256
|
|
|
196
257
|
test("config.json change triggers onConversationEvict when config actually changed", async () => {
|
|
197
258
|
watcher.refreshConfigFromSources = async () => true;
|
|
198
|
-
|
|
199
259
|
watcher.start(onConversationEvict);
|
|
200
260
|
simulateFileChange(WORKSPACE_DIR, "config.json");
|
|
201
|
-
|
|
202
|
-
await new Promise((r) => setTimeout(r, 300));
|
|
261
|
+
await new Promise((r) => setTimeout(r, WAIT_MS));
|
|
203
262
|
expect(evictCallCount).toBe(1);
|
|
204
263
|
});
|
|
205
264
|
|
|
@@ -209,77 +268,89 @@ describe("ConfigWatcher workspace file handlers", () => {
|
|
|
209
268
|
refreshCalled = true;
|
|
210
269
|
return true;
|
|
211
270
|
};
|
|
212
|
-
|
|
213
271
|
watcher.suppressConfigReload = true;
|
|
214
272
|
watcher.start(onConversationEvict);
|
|
215
273
|
simulateFileChange(WORKSPACE_DIR, "config.json");
|
|
216
|
-
|
|
217
|
-
await new Promise((r) => setTimeout(r, 300));
|
|
274
|
+
await new Promise((r) => setTimeout(r, WAIT_MS));
|
|
218
275
|
expect(refreshCalled).toBe(false);
|
|
219
276
|
expect(evictCallCount).toBe(0);
|
|
220
277
|
});
|
|
221
|
-
|
|
222
|
-
test("unknown file does not trigger any handler", async () => {
|
|
223
|
-
watcher.start(onConversationEvict);
|
|
224
|
-
simulateFileChange(WORKSPACE_DIR, "UNKNOWN.md");
|
|
225
|
-
|
|
226
|
-
await new Promise((r) => setTimeout(r, 300));
|
|
227
|
-
expect(evictCallCount).toBe(0);
|
|
228
|
-
});
|
|
229
|
-
|
|
230
|
-
test("null filename does not trigger any handler", async () => {
|
|
231
|
-
watcher.start(onConversationEvict);
|
|
232
|
-
const wsWatcher = findWatcher(WORKSPACE_DIR);
|
|
233
|
-
expect(wsWatcher).toBeDefined();
|
|
234
|
-
wsWatcher!.callback("change", null);
|
|
235
|
-
|
|
236
|
-
await new Promise((r) => setTimeout(r, 300));
|
|
237
|
-
expect(evictCallCount).toBe(0);
|
|
238
|
-
});
|
|
239
278
|
});
|
|
240
279
|
|
|
241
280
|
describe("ConfigWatcher watcher lifecycle", () => {
|
|
242
|
-
test("start
|
|
281
|
+
test("start does NOT subscribe to /workspace as a directory (regression: ENXIO on Unix sockets)", () => {
|
|
243
282
|
watcher.start(onConversationEvict);
|
|
244
|
-
|
|
245
|
-
|
|
283
|
+
expect(findWatcher(WORKSPACE_DIR)).toBeUndefined();
|
|
284
|
+
// The per-file watchFile subscriptions are tracked separately from
|
|
285
|
+
// capturedWatchers; assert the expected ones are present.
|
|
286
|
+
expect(findFileWatch(join(WORKSPACE_DIR, "config.json"))).toBeDefined();
|
|
287
|
+
expect(findFileWatch(join(WORKSPACE_DIR, "SOUL.md"))).toBeDefined();
|
|
288
|
+
expect(findFileWatch(join(WORKSPACE_DIR, "IDENTITY.md"))).toBeDefined();
|
|
246
289
|
});
|
|
247
290
|
|
|
248
|
-
test("stop cancels
|
|
291
|
+
test("stop cancels pending debounce work, no eviction fires after", async () => {
|
|
249
292
|
watcher.start(onConversationEvict);
|
|
250
|
-
// Trigger a file change but don't wait for the debounce
|
|
251
293
|
simulateFileChange(WORKSPACE_DIR, "SOUL.md");
|
|
252
294
|
watcher.stop();
|
|
253
|
-
|
|
254
|
-
// The debounce should have been cancelled, so no eviction
|
|
295
|
+
await new Promise((r) => setTimeout(r, WAIT_MS));
|
|
255
296
|
expect(evictCallCount).toBe(0);
|
|
256
297
|
});
|
|
257
298
|
|
|
258
|
-
test("multiple
|
|
299
|
+
test("multiple rapid changes to the same workspace file are coalesced to one eviction", async () => {
|
|
259
300
|
watcher.start(onConversationEvict);
|
|
260
|
-
|
|
261
|
-
// Rapid fire multiple changes to the same file
|
|
262
301
|
simulateFileChange(WORKSPACE_DIR, "SOUL.md");
|
|
263
302
|
simulateFileChange(WORKSPACE_DIR, "SOUL.md");
|
|
264
303
|
simulateFileChange(WORKSPACE_DIR, "SOUL.md");
|
|
265
|
-
|
|
266
|
-
await new Promise((r) => setTimeout(r, 300));
|
|
267
|
-
// Despite 3 events, debouncing should collapse them to 1 call
|
|
304
|
+
await new Promise((r) => setTimeout(r, WAIT_MS));
|
|
268
305
|
expect(evictCallCount).toBe(1);
|
|
269
306
|
});
|
|
270
307
|
|
|
271
308
|
test("changes to different files each trigger their own handler", async () => {
|
|
272
309
|
watcher.start(onConversationEvict);
|
|
273
|
-
|
|
274
310
|
simulateFileChange(WORKSPACE_DIR, "SOUL.md");
|
|
275
311
|
simulateFileChange(WORKSPACE_DIR, "IDENTITY.md");
|
|
276
|
-
|
|
277
|
-
await new Promise((r) => setTimeout(r, 300));
|
|
278
|
-
// Each file has its own debounce key, so both should fire
|
|
312
|
+
await new Promise((r) => setTimeout(r, WAIT_MS));
|
|
279
313
|
expect(evictCallCount).toBe(2);
|
|
280
314
|
});
|
|
281
315
|
});
|
|
282
316
|
|
|
317
|
+
describe("ConfigWatcher per-file polling listener", () => {
|
|
318
|
+
test("ino change is treated as a file change (atomic-rename shape)", async () => {
|
|
319
|
+
// Simulates `writeFile(tmp) + rename(tmp, target)`: the inode at the
|
|
320
|
+
// path is replaced. The listener should fire once per debounced window.
|
|
321
|
+
watcher.refreshConfigFromSources = async () => true;
|
|
322
|
+
watcher.start(onConversationEvict);
|
|
323
|
+
const fw = findFileWatch(join(WORKSPACE_DIR, "config.json"));
|
|
324
|
+
expect(fw).toBeDefined();
|
|
325
|
+
fw!.listener({ ino: 2, mtimeMs: 1_001 }, { ino: 1, mtimeMs: 1_000 });
|
|
326
|
+
await new Promise((r) => setTimeout(r, WAIT_MS));
|
|
327
|
+
expect(evictCallCount).toBe(1);
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
test("mtime change is treated as a file change (in-place edit)", async () => {
|
|
331
|
+
watcher.refreshConfigFromSources = async () => true;
|
|
332
|
+
watcher.start(onConversationEvict);
|
|
333
|
+
const fw = findFileWatch(join(WORKSPACE_DIR, "config.json"));
|
|
334
|
+
expect(fw).toBeDefined();
|
|
335
|
+
// Same inode, different mtime — what an `echo >> file` produces.
|
|
336
|
+
fw!.listener({ ino: 1, mtimeMs: 2_000 }, { ino: 1, mtimeMs: 1_000 });
|
|
337
|
+
await new Promise((r) => setTimeout(r, WAIT_MS));
|
|
338
|
+
expect(evictCallCount).toBe(1);
|
|
339
|
+
});
|
|
340
|
+
|
|
341
|
+
test("identical curr/prev does NOT fire (the early-return guard)", async () => {
|
|
342
|
+
// fs.watchFile sometimes invokes the listener with curr === prev
|
|
343
|
+
// (e.g. on initial subscription); the watcher must not re-fire in that case.
|
|
344
|
+
watcher.refreshConfigFromSources = async () => true;
|
|
345
|
+
watcher.start(onConversationEvict);
|
|
346
|
+
const fw = findFileWatch(join(WORKSPACE_DIR, "config.json"));
|
|
347
|
+
expect(fw).toBeDefined();
|
|
348
|
+
fw!.listener({ ino: 1, mtimeMs: 1_000 }, { ino: 1, mtimeMs: 1_000 });
|
|
349
|
+
await new Promise((r) => setTimeout(r, WAIT_MS));
|
|
350
|
+
expect(evictCallCount).toBe(0);
|
|
351
|
+
});
|
|
352
|
+
});
|
|
353
|
+
|
|
283
354
|
describe("ConfigWatcher users directory watcher", () => {
|
|
284
355
|
const USERS_DIR = join(WORKSPACE_DIR, "users");
|
|
285
356
|
|
|
@@ -287,7 +358,7 @@ describe("ConfigWatcher users directory watcher", () => {
|
|
|
287
358
|
watcher.start(onConversationEvict);
|
|
288
359
|
simulateFileChange(USERS_DIR, "alice.md");
|
|
289
360
|
|
|
290
|
-
await new Promise((r) => setTimeout(r,
|
|
361
|
+
await new Promise((r) => setTimeout(r, WAIT_MS));
|
|
291
362
|
expect(evictCallCount).toBe(1);
|
|
292
363
|
});
|
|
293
364
|
|
|
@@ -297,7 +368,7 @@ describe("ConfigWatcher users directory watcher", () => {
|
|
|
297
368
|
simulateFileChange(USERS_DIR, "notes.txt");
|
|
298
369
|
simulateFileChange(USERS_DIR, "README");
|
|
299
370
|
|
|
300
|
-
await new Promise((r) => setTimeout(r,
|
|
371
|
+
await new Promise((r) => setTimeout(r, WAIT_MS));
|
|
301
372
|
expect(evictCallCount).toBe(0);
|
|
302
373
|
});
|
|
303
374
|
|
|
@@ -307,7 +378,7 @@ describe("ConfigWatcher users directory watcher", () => {
|
|
|
307
378
|
expect(usersWatcher).toBeDefined();
|
|
308
379
|
usersWatcher!.callback("change", null);
|
|
309
380
|
|
|
310
|
-
await new Promise((r) => setTimeout(r,
|
|
381
|
+
await new Promise((r) => setTimeout(r, WAIT_MS));
|
|
311
382
|
expect(evictCallCount).toBe(0);
|
|
312
383
|
});
|
|
313
384
|
|
|
@@ -317,7 +388,7 @@ describe("ConfigWatcher users directory watcher", () => {
|
|
|
317
388
|
simulateFileChange(USERS_DIR, "bob.md");
|
|
318
389
|
simulateFileChange(USERS_DIR, "bob.md");
|
|
319
390
|
|
|
320
|
-
await new Promise((r) => setTimeout(r,
|
|
391
|
+
await new Promise((r) => setTimeout(r, WAIT_MS));
|
|
321
392
|
expect(evictCallCount).toBe(1);
|
|
322
393
|
});
|
|
323
394
|
});
|
|
@@ -65,7 +65,6 @@ function makeContext(
|
|
|
65
65
|
): RecallSearchContext {
|
|
66
66
|
return {
|
|
67
67
|
workingDir,
|
|
68
|
-
memoryScopeId: "scope-123",
|
|
69
68
|
conversationId: "conv-xyz",
|
|
70
69
|
config: {} as AssistantConfig,
|
|
71
70
|
...(signal ? { signal } : {}),
|
|
@@ -963,7 +962,14 @@ describe("runAgenticRecall", () => {
|
|
|
963
962
|
]);
|
|
964
963
|
});
|
|
965
964
|
|
|
966
|
-
test("routes provider calls through the recall call site with temperature zero", async () => {
|
|
965
|
+
test("routes provider calls through the recall call site with temperature zero and thinking disabled", async () => {
|
|
966
|
+
// `thinking: disabled` is required because the call hardcodes
|
|
967
|
+
// `temperature: 0`. Anthropic 400s on `temperature` ≠ 1 whenever
|
|
968
|
+
// thinking is enabled or in adaptive mode, so user profiles that
|
|
969
|
+
// resolve thinking-enabled (Opus 4.x at `effort: high|xhigh`, etc.)
|
|
970
|
+
// would fail without an explicit opt-out. Recall is tool-call-heavy
|
|
971
|
+
// reasoning where determinism (temp=0) matters more than extended
|
|
972
|
+
// chain-of-thought.
|
|
967
973
|
const providerCalls: unknown[][] = [];
|
|
968
974
|
configuredProvider = makeProvider(
|
|
969
975
|
[textResponse("not a tool call")],
|
|
@@ -992,7 +998,59 @@ describe("runAgenticRecall", () => {
|
|
|
992
998
|
expect(options.config).toEqual({
|
|
993
999
|
callSite: "recall",
|
|
994
1000
|
temperature: 0,
|
|
1001
|
+
thinking: { type: "disabled" },
|
|
1002
|
+
});
|
|
1003
|
+
});
|
|
1004
|
+
|
|
1005
|
+
test("final finish-only call also disables thinking", async () => {
|
|
1006
|
+
// Regression guard for the second `temperature: 0` call site in
|
|
1007
|
+
// `tryFinalFinishRecall`. Both recall provider calls (the agent loop
|
|
1008
|
+
// round and the fallback finalize) must opt out of thinking; otherwise
|
|
1009
|
+
// user profiles that resolve thinking-enabled trigger the Anthropic
|
|
1010
|
+
// 400 on `temperature` ≠ 1.
|
|
1011
|
+
const providerCalls: unknown[][] = [];
|
|
1012
|
+
configuredProvider = makeProvider(
|
|
1013
|
+
[
|
|
1014
|
+
// First call: agent loop round — emits a search_sources tool use
|
|
1015
|
+
// so the loop continues until the round budget is exhausted.
|
|
1016
|
+
toolResponse("search_sources", {
|
|
1017
|
+
query: "more notes",
|
|
1018
|
+
sources: ["workspace"],
|
|
1019
|
+
reason: "Need more.",
|
|
1020
|
+
}),
|
|
1021
|
+
// Second call: fallback finalize — handler we want to assert on.
|
|
1022
|
+
toolResponse("finish_recall", {
|
|
1023
|
+
answer: "Resolved.",
|
|
1024
|
+
confidence: "medium",
|
|
1025
|
+
citation_ids: ["workspace:more"],
|
|
1026
|
+
}),
|
|
1027
|
+
],
|
|
1028
|
+
providerCalls,
|
|
1029
|
+
);
|
|
1030
|
+
|
|
1031
|
+
await runAgenticRecall(
|
|
1032
|
+
{ query: "launch notes", sources: ["workspace"], depth: "fast" },
|
|
1033
|
+
makeContext(),
|
|
1034
|
+
{
|
|
1035
|
+
searchOptions: {
|
|
1036
|
+
adapters: [
|
|
1037
|
+
makeAdapter({
|
|
1038
|
+
"launch notes": [makeEvidence("workspace:seed")],
|
|
1039
|
+
"more notes": [makeEvidence("workspace:more")],
|
|
1040
|
+
}),
|
|
1041
|
+
],
|
|
1042
|
+
},
|
|
1043
|
+
},
|
|
1044
|
+
);
|
|
1045
|
+
|
|
1046
|
+
expect(providerCalls).toHaveLength(2);
|
|
1047
|
+
const finalizeOptions = providerCalls[1]?.[3] as {
|
|
1048
|
+
config?: Record<string, unknown>;
|
|
1049
|
+
};
|
|
1050
|
+
expect(finalizeOptions.config).toEqual({
|
|
1051
|
+
callSite: "recall",
|
|
1052
|
+
temperature: 0,
|
|
1053
|
+
thinking: { type: "disabled" },
|
|
995
1054
|
});
|
|
996
|
-
expect(options.config).not.toHaveProperty("thinking");
|
|
997
1055
|
});
|
|
998
1056
|
});
|
|
@@ -68,29 +68,6 @@ describe("searchConversationSource", () => {
|
|
|
68
68
|
]);
|
|
69
69
|
});
|
|
70
70
|
|
|
71
|
-
test("filters results to the requested memory scope", async () => {
|
|
72
|
-
const inScope = await seedConversation({
|
|
73
|
-
title: "In-scope conversation",
|
|
74
|
-
memoryScopeId: "scope-a",
|
|
75
|
-
content: "sharedtoken belongs to scope A.",
|
|
76
|
-
});
|
|
77
|
-
await seedConversation({
|
|
78
|
-
title: "Out-of-scope conversation",
|
|
79
|
-
memoryScopeId: "scope-b",
|
|
80
|
-
content: "sharedtoken belongs to scope B.",
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
const result = await searchConversationSource(
|
|
84
|
-
"sharedtoken",
|
|
85
|
-
makeContext({ memoryScopeId: "scope-a" }),
|
|
86
|
-
10,
|
|
87
|
-
);
|
|
88
|
-
|
|
89
|
-
expect(result.evidence.map((item) => item.locator)).toEqual([
|
|
90
|
-
`${inScope.conversation.id}#${inScope.message.id}`,
|
|
91
|
-
]);
|
|
92
|
-
});
|
|
93
|
-
|
|
94
71
|
test("does not return derived subagent or auto-analysis conversations", async () => {
|
|
95
72
|
const visible = await seedConversation({
|
|
96
73
|
title: "User conversation",
|
|
@@ -312,7 +289,6 @@ function makeContext(
|
|
|
312
289
|
): RecallSearchContext {
|
|
313
290
|
return {
|
|
314
291
|
workingDir: "/tmp/example-workspace",
|
|
315
|
-
memoryScopeId: "default",
|
|
316
292
|
conversationId: "current-conversation",
|
|
317
293
|
config: {} as RecallSearchContext["config"],
|
|
318
294
|
...overrides,
|
|
@@ -69,7 +69,6 @@ mock.module(embeddingBackendModule, () => ({
|
|
|
69
69
|
type SearchCall = {
|
|
70
70
|
vector: number[];
|
|
71
71
|
limit: number;
|
|
72
|
-
scopeIds?: string[];
|
|
73
72
|
sparseVector?: { indices: number[]; values: number[] };
|
|
74
73
|
};
|
|
75
74
|
|
|
@@ -81,10 +80,9 @@ mock.module(graphSearchModule, () => ({
|
|
|
81
80
|
searchGraphNodes: async (
|
|
82
81
|
vector: number[],
|
|
83
82
|
limit: number,
|
|
84
|
-
scopeIds?: string[],
|
|
85
83
|
sparseVector?: { indices: number[]; values: number[] },
|
|
86
84
|
) => {
|
|
87
|
-
searchCalls.push({ vector, limit,
|
|
85
|
+
searchCalls.push({ vector, limit, sparseVector });
|
|
88
86
|
if (searchShouldThrow) {
|
|
89
87
|
throw new Error("qdrant unavailable");
|
|
90
88
|
}
|
|
@@ -205,13 +203,13 @@ describe("searchMemorySource", () => {
|
|
|
205
203
|
expect(second.lastAccessed).toBe(222);
|
|
206
204
|
});
|
|
207
205
|
|
|
208
|
-
test("forwards
|
|
206
|
+
test("forwards abort signal to graph search dependencies", async () => {
|
|
209
207
|
const controller = new AbortController();
|
|
210
208
|
searchHits = [];
|
|
211
209
|
|
|
212
210
|
await searchMemorySource(
|
|
213
211
|
"deployment checklist",
|
|
214
|
-
makeContext({
|
|
212
|
+
makeContext({ signal: controller.signal }),
|
|
215
213
|
3,
|
|
216
214
|
);
|
|
217
215
|
|
|
@@ -226,7 +224,6 @@ describe("searchMemorySource", () => {
|
|
|
226
224
|
expect(searchCalls[0]).toMatchObject({
|
|
227
225
|
vector: [0.1, 0.2, 0.3],
|
|
228
226
|
limit: 3,
|
|
229
|
-
scopeIds: ["scope-abc"],
|
|
230
227
|
});
|
|
231
228
|
expect(searchCalls[0]?.sparseVector?.indices.length).toBeGreaterThan(0);
|
|
232
229
|
});
|
|
@@ -389,7 +386,6 @@ function makeContext(
|
|
|
389
386
|
): RecallSearchContext {
|
|
390
387
|
return {
|
|
391
388
|
workingDir: "/tmp/example-workspace",
|
|
392
|
-
memoryScopeId: "scope-default",
|
|
393
389
|
conversationId: "conv-123",
|
|
394
390
|
config: {} as AssistantConfig,
|
|
395
391
|
...overrides,
|
|
@@ -148,7 +148,6 @@ function makeConfig(): AssistantConfig {
|
|
|
148
148
|
c_assistant: 0.5,
|
|
149
149
|
c_now: 0.5,
|
|
150
150
|
top_k: 8,
|
|
151
|
-
top_k_skills: 0,
|
|
152
151
|
},
|
|
153
152
|
},
|
|
154
153
|
} as unknown as AssistantConfig;
|
|
@@ -157,7 +156,6 @@ function makeConfig(): AssistantConfig {
|
|
|
157
156
|
function makeContext(workingDir: string): RecallSearchContext {
|
|
158
157
|
return {
|
|
159
158
|
workingDir,
|
|
160
|
-
memoryScopeId: "scope-default",
|
|
161
159
|
conversationId: "conv-test",
|
|
162
160
|
config: makeConfig(),
|
|
163
161
|
};
|
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
import { describe, expect, mock, test } from "bun:test";
|
|
2
2
|
|
|
3
3
|
import type { AgentEvent } from "../agent/loop.js";
|
|
4
|
+
import { _setOverridesForTesting } from "../config/assistant-feature-flags.js";
|
|
4
5
|
import type {
|
|
5
6
|
ContentBlock,
|
|
6
7
|
Message,
|
|
7
8
|
ProviderResponse,
|
|
8
9
|
} from "../providers/types.js";
|
|
9
10
|
|
|
11
|
+
// This test exercises v1 conversation routing. The `memory-v2-enabled` flag
|
|
12
|
+
// (registry default `true`) flips memory routing to v2 — disable it here so
|
|
13
|
+
// the v1 paths under test stay active.
|
|
14
|
+
_setOverridesForTesting({ "memory-v2-enabled": false });
|
|
15
|
+
|
|
10
16
|
mock.module("../util/logger.js", () => ({
|
|
11
17
|
getLogger: () =>
|
|
12
18
|
new Proxy({} as Record<string, unknown>, { get: () => () => {} }),
|