@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
|
@@ -12,7 +12,6 @@ import {
|
|
|
12
12
|
findContactChannel,
|
|
13
13
|
findGuardianForChannel,
|
|
14
14
|
} from "../../../contacts/contact-store.js";
|
|
15
|
-
import { touchChannelLastSeen } from "../../../contacts/contacts-write.js";
|
|
16
15
|
import type {
|
|
17
16
|
ChannelStatus,
|
|
18
17
|
ContactChannel,
|
|
@@ -689,12 +688,6 @@ export async function enforceIngressAcl(
|
|
|
689
688
|
};
|
|
690
689
|
}
|
|
691
690
|
|
|
692
|
-
// 'allow' or 'escalate' — update last seen timestamp.
|
|
693
|
-
// touchContactInteraction is intentionally NOT called here because
|
|
694
|
-
// duplicate detection hasn't run yet. It's called in
|
|
695
|
-
// inbound-message-handler.ts after dedup so webhook retries don't
|
|
696
|
-
// inflate interaction counts.
|
|
697
|
-
touchChannelLastSeen(resolvedMember.channel.id);
|
|
698
691
|
}
|
|
699
692
|
}
|
|
700
693
|
|
|
@@ -15,7 +15,6 @@
|
|
|
15
15
|
* focused on orchestration.
|
|
16
16
|
*/
|
|
17
17
|
import type { ChannelId } from "../../../channels/types.js";
|
|
18
|
-
import { touchContactInteraction } from "../../../contacts/contacts-write.js";
|
|
19
18
|
import {
|
|
20
19
|
getMessageById,
|
|
21
20
|
updateMessageContent,
|
|
@@ -65,7 +64,6 @@ export async function handleEditIntercept(
|
|
|
65
64
|
canonicalAssistantId,
|
|
66
65
|
assistantId,
|
|
67
66
|
content,
|
|
68
|
-
channelId,
|
|
69
67
|
} = params;
|
|
70
68
|
|
|
71
69
|
// Dedup the edit event itself (retried edited_message webhooks)
|
|
@@ -84,12 +82,6 @@ export async function handleEditIntercept(
|
|
|
84
82
|
});
|
|
85
83
|
}
|
|
86
84
|
|
|
87
|
-
// Track contact interaction only for genuinely new edit events (not webhook
|
|
88
|
-
// retries), matching the pattern used for the normal message path.
|
|
89
|
-
if (channelId) {
|
|
90
|
-
touchContactInteraction(channelId);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
85
|
// Retry lookup a few times -- the original message may still be processing
|
|
94
86
|
// (linkMessage hasn't been called yet). Short backoff avoids losing edits
|
|
95
87
|
// that arrive while the original agent loop is in progress.
|
|
@@ -174,6 +174,9 @@ export async function handleGuardianReplyIntercept(
|
|
|
174
174
|
eventId,
|
|
175
175
|
canonicalRouter: routerResult.type,
|
|
176
176
|
requestId: routerResult.requestId,
|
|
177
|
+
...(routerResult.activatedContact
|
|
178
|
+
? { activatedContact: routerResult.activatedContact }
|
|
179
|
+
: {}),
|
|
177
180
|
}),
|
|
178
181
|
skipApprovalInterception: false,
|
|
179
182
|
};
|
|
@@ -7,7 +7,6 @@ import { SttError } from "../../../stt/types.js";
|
|
|
7
7
|
// Mocks — must be set up before importing the module under test
|
|
8
8
|
// ---------------------------------------------------------------------------
|
|
9
9
|
|
|
10
|
-
let mockFeatureFlagEnabled = true;
|
|
11
10
|
let mockAttachments: Array<{
|
|
12
11
|
id: string;
|
|
13
12
|
mimeType: string;
|
|
@@ -20,14 +19,6 @@ let mockAttachments: Array<{
|
|
|
20
19
|
}> = [];
|
|
21
20
|
let mockTranscriber: BatchTranscriber | null = null;
|
|
22
21
|
|
|
23
|
-
mock.module("../../../config/assistant-feature-flags.js", () => ({
|
|
24
|
-
isAssistantFeatureFlagEnabled: () => mockFeatureFlagEnabled,
|
|
25
|
-
}));
|
|
26
|
-
|
|
27
|
-
mock.module("../../../config/loader.js", () => ({
|
|
28
|
-
getConfig: () => ({}),
|
|
29
|
-
}));
|
|
30
|
-
|
|
31
22
|
mock.module("../../../memory/attachments-store.js", () => ({
|
|
32
23
|
getAttachmentsByIds: (ids: string[]) =>
|
|
33
24
|
mockAttachments.filter((a) => ids.includes(a.id)),
|
|
@@ -115,7 +106,6 @@ function makeImageAttachment(id: string) {
|
|
|
115
106
|
|
|
116
107
|
describe("tryTranscribeAudioAttachments", () => {
|
|
117
108
|
beforeEach(() => {
|
|
118
|
-
mockFeatureFlagEnabled = true;
|
|
119
109
|
mockAttachments = [];
|
|
120
110
|
mockTranscriber = null;
|
|
121
111
|
});
|
|
@@ -189,16 +179,6 @@ describe("tryTranscribeAudioAttachments", () => {
|
|
|
189
179
|
);
|
|
190
180
|
});
|
|
191
181
|
|
|
192
|
-
test("feature flag disabled returns disabled", async () => {
|
|
193
|
-
mockFeatureFlagEnabled = false;
|
|
194
|
-
const audio = makeAudioAttachment("a1");
|
|
195
|
-
mockAttachments = [audio];
|
|
196
|
-
|
|
197
|
-
const result = await tryTranscribeAudioAttachments(["a1"]);
|
|
198
|
-
|
|
199
|
-
expect(result).toEqual({ status: "disabled" });
|
|
200
|
-
});
|
|
201
|
-
|
|
202
182
|
test("30-second timeout fires and returns error without blocking", async () => {
|
|
203
183
|
const audio = makeAudioAttachment("a1");
|
|
204
184
|
mockAttachments = [audio];
|
|
@@ -2,22 +2,21 @@
|
|
|
2
2
|
* Auto-transcribe audio attachments from channel inbound messages.
|
|
3
3
|
*
|
|
4
4
|
* Returns a discriminated result type so callers can handle each outcome
|
|
5
|
-
* (transcribed, no audio,
|
|
5
|
+
* (transcribed, no audio, no provider, error) without exceptions.
|
|
6
6
|
* Never throws — failures are represented as result variants so that message
|
|
7
7
|
* delivery is never blocked by transcription issues.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
import {
|
|
11
|
+
getAttachmentById,
|
|
12
|
+
getAttachmentsByIds,
|
|
13
|
+
} from "../../../memory/attachments-store.js";
|
|
13
14
|
import { resolveBatchTranscriber } from "../../../providers/speech-to-text/resolve.js";
|
|
14
15
|
import { normalizeSttError } from "../../../stt/daemon-batch-transcriber.js";
|
|
15
16
|
import { getLogger } from "../../../util/logger.js";
|
|
16
17
|
|
|
17
18
|
const log = getLogger("transcribe-audio");
|
|
18
19
|
|
|
19
|
-
const VOICE_TRANSCRIPTION_FLAG_KEY = "channel-voice-transcription" as const;
|
|
20
|
-
|
|
21
20
|
/** Timeout for the entire transcription pipeline (all attachments). */
|
|
22
21
|
const TRANSCRIPTION_TIMEOUT_MS = 30_000;
|
|
23
22
|
|
|
@@ -28,7 +27,6 @@ const TRANSCRIPTION_TIMEOUT_MS = 30_000;
|
|
|
28
27
|
export type TranscribeResult =
|
|
29
28
|
| { status: "transcribed"; text: string }
|
|
30
29
|
| { status: "no_audio" }
|
|
31
|
-
| { status: "disabled" }
|
|
32
30
|
| { status: "no_provider"; reason: string }
|
|
33
31
|
| { status: "error"; reason: string };
|
|
34
32
|
|
|
@@ -40,12 +38,6 @@ export async function tryTranscribeAudioAttachments(
|
|
|
40
38
|
attachmentIds: string[],
|
|
41
39
|
): Promise<TranscribeResult> {
|
|
42
40
|
try {
|
|
43
|
-
// Check feature flag
|
|
44
|
-
const config = getConfig();
|
|
45
|
-
if (!isAssistantFeatureFlagEnabled(VOICE_TRANSCRIPTION_FLAG_KEY, config)) {
|
|
46
|
-
return { status: "disabled" };
|
|
47
|
-
}
|
|
48
|
-
|
|
49
41
|
// Look up attachments and filter to audio MIME types
|
|
50
42
|
const resolved = getAttachmentsByIds(attachmentIds);
|
|
51
43
|
const audioAttachments = resolved.filter((a) =>
|
|
@@ -27,6 +27,7 @@ import { CHANNEL_ROUTES } from "./channel-route-definitions.js";
|
|
|
27
27
|
import { ROUTES as CHANNEL_VERIFICATION_ROUTES } from "./channel-verification-routes.js";
|
|
28
28
|
import { ROUTES as CLIENT_ROUTES } from "./client-routes.js";
|
|
29
29
|
import { ROUTES as CONSOLIDATION_ROUTES } from "./consolidation-routes.js";
|
|
30
|
+
import { CONTACT_PROMPT_ROUTES } from "./contact-prompt-routes.js";
|
|
30
31
|
import { ROUTES as CONTACT_ROUTES } from "./contact-routes.js";
|
|
31
32
|
import { ROUTES as CONVERSATION_ANALYSIS_ROUTES } from "./conversation-analysis-routes.js";
|
|
32
33
|
import { ROUTES as CONVERSATION_ATTENTION_ROUTES } from "./conversation-attention-routes.js";
|
|
@@ -36,18 +37,22 @@ import { ROUTES as CONVERSATION_QUERY_ROUTES } from "./conversation-query-routes
|
|
|
36
37
|
import { ROUTES as CONVERSATION_MESSAGE_ROUTES } from "./conversation-routes.js";
|
|
37
38
|
import { ROUTES as CONVERSATION_STARTER_ROUTES } from "./conversation-starter-routes.js";
|
|
38
39
|
import { ROUTES as CREDENTIAL_PROMPT_ROUTES } from "./credential-prompt-routes.js";
|
|
40
|
+
import { ROUTES as DEBUG_BASH_ROUTES } from "./debug-bash-routes.js";
|
|
39
41
|
import { ROUTES as DEBUG_ROUTES } from "./debug-routes.js";
|
|
40
42
|
import { ROUTES as DEFER_ROUTES } from "./defer-routes.js";
|
|
41
43
|
import { ROUTES as DIAGNOSTICS_ROUTES } from "./diagnostics-routes.js";
|
|
44
|
+
import { ROUTES as DISK_PRESSURE_ROUTES } from "./disk-pressure-routes.js";
|
|
42
45
|
import { ROUTES as DOCUMENT_ROUTES } from "./documents-routes.js";
|
|
43
46
|
import { ROUTES as EVENTS_ROUTES } from "./events-routes.js";
|
|
44
47
|
import { ROUTES as FILING_ROUTES } from "./filing-routes.js";
|
|
48
|
+
import { ROUTES as GATEWAY_LOG_ROUTES } from "./gateway-log-routes.js";
|
|
45
49
|
import { ROUTES as GLOBAL_SEARCH_ROUTES } from "./global-search-routes.js";
|
|
46
50
|
import { ROUTES as GROUP_ROUTES } from "./group-routes.js";
|
|
47
51
|
import { ROUTES as GUARDIAN_ACTION_ROUTES } from "./guardian-action-routes.js";
|
|
48
52
|
import { ROUTES as HEARTBEAT_ROUTES } from "./heartbeat-routes.js";
|
|
49
53
|
import { ROUTES as HOME_FEED_ROUTES } from "./home-feed-routes.js";
|
|
50
54
|
import { ROUTES as HOME_STATE_ROUTES } from "./home-state-routes.js";
|
|
55
|
+
import { ROUTES as HOST_APP_CONTROL_ROUTES } from "./host-app-control-routes.js";
|
|
51
56
|
import { ROUTES as HOST_BASH_ROUTES } from "./host-bash-routes.js";
|
|
52
57
|
import { ROUTES as HOST_BROWSER_ROUTES } from "./host-browser-routes.js";
|
|
53
58
|
import { ROUTES as HOST_CU_ROUTES } from "./host-cu-routes.js";
|
|
@@ -64,12 +69,14 @@ import { ROUTES as INTERNAL_OAUTH_ROUTES } from "./internal-oauth-routes.js";
|
|
|
64
69
|
import { ROUTES as INTERNAL_TWILIO_ROUTES } from "./internal-twilio-routes.js";
|
|
65
70
|
import { ROUTES as LLM_CALL_SITES_ROUTES } from "./llm-call-sites-routes.js";
|
|
66
71
|
import { ROUTES as LOG_EXPORT_ROUTES } from "./log-export-routes.js";
|
|
72
|
+
import { ROUTES as MCP_AUTH_ROUTES } from "./mcp-auth-routes.js";
|
|
67
73
|
import { ROUTES as MEMORY_ITEM_ROUTES } from "./memory-item-routes.js";
|
|
68
74
|
import { ROUTES as MEMORY_V2_ROUTES } from "./memory-v2-routes.js";
|
|
69
75
|
import { ROUTES as MIGRATION_ROLLBACK_ROUTES } from "./migration-rollback-routes.js";
|
|
70
76
|
import { ROUTES as MIGRATION_ROUTES } from "./migration-routes.js";
|
|
71
77
|
import { ROUTES as NOTIFICATION_ROUTES } from "./notification-routes.js";
|
|
72
78
|
import { ROUTES as OAUTH_APPS_ROUTES } from "./oauth-apps.js";
|
|
79
|
+
import { ROUTES as OAUTH_CONNECT_ROUTES } from "./oauth-connect-routes.js";
|
|
73
80
|
import { ROUTES as OAUTH_PROVIDERS_ROUTES } from "./oauth-providers.js";
|
|
74
81
|
import { ROUTES as PLAYGROUND_ROUTES } from "./playground/index.js";
|
|
75
82
|
import { ROUTES as PROFILER_ROUTES } from "./profiler-routes.js";
|
|
@@ -121,6 +128,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
121
128
|
...BTW_ROUTES,
|
|
122
129
|
...BRAIN_GRAPH_ROUTES,
|
|
123
130
|
...CLIENT_ROUTES,
|
|
131
|
+
...CONTACT_PROMPT_ROUTES,
|
|
124
132
|
...CONTACT_ROUTES,
|
|
125
133
|
...CONVERSATION_ANALYSIS_ROUTES,
|
|
126
134
|
...CONVERSATION_ATTENTION_ROUTES,
|
|
@@ -132,17 +140,21 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
132
140
|
...DEFER_ROUTES,
|
|
133
141
|
...CONVERSATION_QUERY_ROUTES,
|
|
134
142
|
...CONVERSATION_STARTER_ROUTES,
|
|
143
|
+
...DEBUG_BASH_ROUTES,
|
|
135
144
|
...DEBUG_ROUTES,
|
|
136
145
|
...DIAGNOSTICS_ROUTES,
|
|
146
|
+
...DISK_PRESSURE_ROUTES,
|
|
137
147
|
...DOCUMENT_ROUTES,
|
|
138
148
|
...EVENTS_ROUTES,
|
|
139
149
|
...FILING_ROUTES,
|
|
150
|
+
...GATEWAY_LOG_ROUTES,
|
|
140
151
|
...GLOBAL_SEARCH_ROUTES,
|
|
141
152
|
...GROUP_ROUTES,
|
|
142
153
|
...GUARDIAN_ACTION_ROUTES,
|
|
143
154
|
...HEARTBEAT_ROUTES,
|
|
144
155
|
...HOME_FEED_ROUTES,
|
|
145
156
|
...HOME_STATE_ROUTES,
|
|
157
|
+
...HOST_APP_CONTROL_ROUTES,
|
|
146
158
|
...HOST_BASH_ROUTES,
|
|
147
159
|
...HOST_BROWSER_ROUTES,
|
|
148
160
|
...HOST_CU_ROUTES,
|
|
@@ -151,6 +163,8 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
151
163
|
...IDENTITY_ROUTES,
|
|
152
164
|
...INTERFACE_ROUTES,
|
|
153
165
|
...INTERNAL_OAUTH_ROUTES,
|
|
166
|
+
...MCP_AUTH_ROUTES,
|
|
167
|
+
...OAUTH_CONNECT_ROUTES,
|
|
154
168
|
...INTERNAL_TWILIO_ROUTES,
|
|
155
169
|
...LOG_EXPORT_ROUTES,
|
|
156
170
|
...LLM_CALL_SITES_ROUTES,
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal routes for daemon-owned MCP OAuth flows.
|
|
3
|
+
*
|
|
4
|
+
* POST internal/mcp/auth/start — kicks off the OAuth flow in the daemon
|
|
5
|
+
* and returns the authorization URL
|
|
6
|
+
* GET internal/mcp/auth/status/:serverId — polls current flow status
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { z } from "zod";
|
|
10
|
+
|
|
11
|
+
import { loadRawConfig } from "../../config/loader.js";
|
|
12
|
+
import type { McpConfig } from "../../config/schemas/mcp.js";
|
|
13
|
+
import { reloadMcpServers } from "../../daemon/mcp-reload-service.js";
|
|
14
|
+
import { orchestrateMcpOAuthConnect } from "../../mcp/mcp-auth-orchestrator.js";
|
|
15
|
+
import { getMcpAuthState } from "../../mcp/mcp-auth-state.js";
|
|
16
|
+
import { getLogger } from "../../util/logger.js";
|
|
17
|
+
import { BadRequestError, InternalError, NotFoundError } from "./errors.js";
|
|
18
|
+
import type { RouteDefinition } from "./types.js";
|
|
19
|
+
|
|
20
|
+
const log = getLogger("mcp-auth-routes");
|
|
21
|
+
|
|
22
|
+
async function handleMcpAuthStart({
|
|
23
|
+
body,
|
|
24
|
+
}: {
|
|
25
|
+
body?: Record<string, unknown>;
|
|
26
|
+
}): Promise<{ auth_url: string; state: string; already_authenticated?: boolean }> {
|
|
27
|
+
const { serverId } = body as { serverId: string };
|
|
28
|
+
|
|
29
|
+
const raw = loadRawConfig();
|
|
30
|
+
const servers =
|
|
31
|
+
(raw.mcp as Partial<McpConfig> | undefined)?.servers ?? {};
|
|
32
|
+
const serverConfig = servers[serverId];
|
|
33
|
+
|
|
34
|
+
if (!serverConfig) {
|
|
35
|
+
throw new BadRequestError(`MCP server "${serverId}" not configured`);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const transport = serverConfig.transport;
|
|
39
|
+
if (transport.type !== "sse" && transport.type !== "streamable-http") {
|
|
40
|
+
throw new BadRequestError(
|
|
41
|
+
`OAuth only supported for sse/streamable-http transports (server "${serverId}" uses ${transport.type})`,
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
let result: { auth_url: string; already_authenticated?: boolean };
|
|
46
|
+
try {
|
|
47
|
+
result = await orchestrateMcpOAuthConnect({
|
|
48
|
+
serverId,
|
|
49
|
+
transport: {
|
|
50
|
+
url: transport.url,
|
|
51
|
+
type: transport.type,
|
|
52
|
+
headers: transport.headers,
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
} catch (err) {
|
|
56
|
+
throw new InternalError(err instanceof Error ? err.message : String(err));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return { auth_url: result.auth_url, state: serverId, already_authenticated: result.already_authenticated };
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function handleMcpAuthStatus({
|
|
63
|
+
pathParams,
|
|
64
|
+
}: {
|
|
65
|
+
pathParams?: Record<string, string>;
|
|
66
|
+
}):
|
|
67
|
+
| { status: "pending"; auth_url: string }
|
|
68
|
+
| { status: "complete" }
|
|
69
|
+
| { status: "error"; error: string } {
|
|
70
|
+
const { serverId } = pathParams as { serverId: string };
|
|
71
|
+
const state = getMcpAuthState(serverId);
|
|
72
|
+
|
|
73
|
+
if (state === null) {
|
|
74
|
+
throw new NotFoundError(`No active OAuth flow for server "${serverId}"`);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (state.status === "pending") return { status: "pending", auth_url: state.authUrl };
|
|
78
|
+
if (state.status === "complete") return { status: "complete" };
|
|
79
|
+
return { status: "error", error: state.error };
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function handleMcpReload(_args: {
|
|
83
|
+
body?: Record<string, unknown>;
|
|
84
|
+
}): { ok: true } {
|
|
85
|
+
// Fire-and-forget: reloadMcpServers() has its own reloadInProgress mutex,
|
|
86
|
+
// so concurrent calls coalesce.
|
|
87
|
+
void reloadMcpServers().catch((err) => {
|
|
88
|
+
log.warn(
|
|
89
|
+
{ err: err instanceof Error ? err.message : String(err) },
|
|
90
|
+
"internal_mcp_reload background reload failed",
|
|
91
|
+
);
|
|
92
|
+
});
|
|
93
|
+
return { ok: true };
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export const ROUTES: RouteDefinition[] = [
|
|
97
|
+
{
|
|
98
|
+
operationId: "internal_mcp_auth_start",
|
|
99
|
+
endpoint: "internal/mcp/auth/start",
|
|
100
|
+
method: "POST",
|
|
101
|
+
summary: "Start MCP OAuth flow",
|
|
102
|
+
description:
|
|
103
|
+
"Starts a daemon-owned MCP OAuth flow and returns the authorization URL for the CLI to open in the browser.",
|
|
104
|
+
tags: ["internal"],
|
|
105
|
+
requestBody: z.object({ serverId: z.string() }),
|
|
106
|
+
handler: handleMcpAuthStart,
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
operationId: "internal_mcp_auth_status",
|
|
110
|
+
endpoint: "internal/mcp/auth/status/:serverId",
|
|
111
|
+
method: "GET",
|
|
112
|
+
summary: "Poll MCP OAuth flow status",
|
|
113
|
+
description:
|
|
114
|
+
"Returns the current status of an in-flight MCP OAuth flow (pending/complete/error).",
|
|
115
|
+
tags: ["internal"],
|
|
116
|
+
pathParams: [{ name: "serverId" }],
|
|
117
|
+
additionalResponses: {
|
|
118
|
+
"404": { description: "No active OAuth flow for the given serverId" },
|
|
119
|
+
},
|
|
120
|
+
handler: handleMcpAuthStatus,
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
operationId: "internal_mcp_reload",
|
|
124
|
+
endpoint: "internal/mcp/reload",
|
|
125
|
+
method: "POST",
|
|
126
|
+
summary: "Trigger MCP server reload",
|
|
127
|
+
description:
|
|
128
|
+
"Kicks off reloadMcpServers() async on the daemon. Returns immediately.",
|
|
129
|
+
tags: ["internal"],
|
|
130
|
+
handler: handleMcpReload,
|
|
131
|
+
},
|
|
132
|
+
];
|
|
@@ -6,6 +6,13 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { beforeAll, beforeEach, describe, expect, mock, test } from "bun:test";
|
|
8
8
|
|
|
9
|
+
import { _setOverridesForTesting } from "../../config/assistant-feature-flags.js";
|
|
10
|
+
|
|
11
|
+
// This test exercises v1 memory CRUD routes. 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
|
+
|
|
9
16
|
mock.module("../../util/logger.js", () => ({
|
|
10
17
|
getLogger: () =>
|
|
11
18
|
new Proxy({} as Record<string, unknown>, {
|
|
@@ -68,11 +75,7 @@ import { eq } from "drizzle-orm";
|
|
|
68
75
|
import { getDb } from "../../memory/db-connection.js";
|
|
69
76
|
import { initializeDb } from "../../memory/db-init.js";
|
|
70
77
|
import { memoryGraphNodes, memoryJobs } from "../../memory/schema.js";
|
|
71
|
-
import {
|
|
72
|
-
BadRequestError,
|
|
73
|
-
ConflictError,
|
|
74
|
-
NotFoundError,
|
|
75
|
-
} from "./errors.js";
|
|
78
|
+
import { BadRequestError, ConflictError, NotFoundError } from "./errors.js";
|
|
76
79
|
import { ROUTES } from "./memory-item-routes.js";
|
|
77
80
|
import type { RouteDefinition } from "./types.js";
|
|
78
81
|
|
|
@@ -269,7 +272,9 @@ describe("Memory Item Routes", () => {
|
|
|
269
272
|
content: "s2\nst2",
|
|
270
273
|
});
|
|
271
274
|
|
|
272
|
-
const res = await callHandler(route, {
|
|
275
|
+
const res = await callHandler(route, {
|
|
276
|
+
queryParams: { kind: "semantic" },
|
|
277
|
+
});
|
|
273
278
|
const body = (await res.json()) as {
|
|
274
279
|
items: Array<{ id: string }>;
|
|
275
280
|
total: number;
|
|
@@ -319,7 +324,9 @@ describe("Memory Item Routes", () => {
|
|
|
319
324
|
lastAccessed: 3000,
|
|
320
325
|
});
|
|
321
326
|
|
|
322
|
-
const res = await callHandler(route, {
|
|
327
|
+
const res = await callHandler(route, {
|
|
328
|
+
queryParams: { limit: "1", offset: "1" },
|
|
329
|
+
});
|
|
323
330
|
const body = (await res.json()) as {
|
|
324
331
|
items: Array<{ id: string }>;
|
|
325
332
|
total: number;
|
|
@@ -344,7 +351,9 @@ describe("Memory Item Routes", () => {
|
|
|
344
351
|
created: 1000,
|
|
345
352
|
});
|
|
346
353
|
|
|
347
|
-
const res = await callHandler(route, {
|
|
354
|
+
const res = await callHandler(route, {
|
|
355
|
+
queryParams: { sort: "firstSeenAt", order: "asc" },
|
|
356
|
+
});
|
|
348
357
|
const body = (await res.json()) as {
|
|
349
358
|
items: Array<{ id: string }>;
|
|
350
359
|
};
|
|
@@ -366,7 +375,9 @@ describe("Memory Item Routes", () => {
|
|
|
366
375
|
significance: 0.9,
|
|
367
376
|
});
|
|
368
377
|
|
|
369
|
-
const res = await callHandler(route, {
|
|
378
|
+
const res = await callHandler(route, {
|
|
379
|
+
queryParams: { sort: "importance", order: "desc" },
|
|
380
|
+
});
|
|
370
381
|
const body = (await res.json()) as {
|
|
371
382
|
items: Array<{ id: string }>;
|
|
372
383
|
};
|
|
@@ -418,7 +429,9 @@ describe("Memory Item Routes", () => {
|
|
|
418
429
|
},
|
|
419
430
|
];
|
|
420
431
|
|
|
421
|
-
const res = await callHandler(route, {
|
|
432
|
+
const res = await callHandler(route, {
|
|
433
|
+
queryParams: { search: "alice" },
|
|
434
|
+
});
|
|
422
435
|
const body = (await res.json()) as {
|
|
423
436
|
items: Array<{ id: string }>;
|
|
424
437
|
total: number;
|
|
@@ -503,7 +516,9 @@ describe("Memory Item Routes", () => {
|
|
|
503
516
|
];
|
|
504
517
|
|
|
505
518
|
// Request page 2 (offset=1, limit=1)
|
|
506
|
-
const res = await callHandler(route, {
|
|
519
|
+
const res = await callHandler(route, {
|
|
520
|
+
queryParams: { search: "item", limit: "1", offset: "1" },
|
|
521
|
+
});
|
|
507
522
|
const body = (await res.json()) as {
|
|
508
523
|
items: Array<{ id: string }>;
|
|
509
524
|
total: number;
|
|
@@ -563,7 +578,10 @@ describe("Memory Item Routes", () => {
|
|
|
563
578
|
content: "dark mode\nPrefers dark mode",
|
|
564
579
|
});
|
|
565
580
|
|
|
566
|
-
const res = await callHandler(route, {
|
|
581
|
+
const res = await callHandler(route, {
|
|
582
|
+
queryParams: {},
|
|
583
|
+
pathParams: { id: "i1" },
|
|
584
|
+
});
|
|
567
585
|
expect(res.status).toBe(200);
|
|
568
586
|
const body = (await res.json()) as {
|
|
569
587
|
item: { id: string; subject: string };
|
|
@@ -573,7 +591,10 @@ describe("Memory Item Routes", () => {
|
|
|
573
591
|
});
|
|
574
592
|
|
|
575
593
|
test("returns 404 for non-existent item", async () => {
|
|
576
|
-
const res = await callHandler(route, {
|
|
594
|
+
const res = await callHandler(route, {
|
|
595
|
+
queryParams: {},
|
|
596
|
+
pathParams: { id: "nonexistent" },
|
|
597
|
+
});
|
|
577
598
|
expect(res.status).toBe(404);
|
|
578
599
|
});
|
|
579
600
|
|
|
@@ -584,7 +605,10 @@ describe("Memory Item Routes", () => {
|
|
|
584
605
|
content: "some content\nsome statement",
|
|
585
606
|
});
|
|
586
607
|
|
|
587
|
-
const res = await callHandler(route, {
|
|
608
|
+
const res = await callHandler(route, {
|
|
609
|
+
queryParams: {},
|
|
610
|
+
pathParams: { id: "i1" },
|
|
611
|
+
});
|
|
588
612
|
const body = (await res.json()) as {
|
|
589
613
|
item: { supersedes: unknown; supersededBy: unknown };
|
|
590
614
|
};
|
|
@@ -862,7 +886,9 @@ describe("Memory Item Routes", () => {
|
|
|
862
886
|
});
|
|
863
887
|
|
|
864
888
|
test("returns 404 for non-existent item", async () => {
|
|
865
|
-
const res = await callHandler(route, {
|
|
889
|
+
const res = await callHandler(route, {
|
|
890
|
+
pathParams: { id: "nonexistent" },
|
|
891
|
+
});
|
|
866
892
|
expect(res.status).toBe(404);
|
|
867
893
|
});
|
|
868
894
|
|
|
@@ -25,6 +25,7 @@ import {
|
|
|
25
25
|
import { z } from "zod";
|
|
26
26
|
|
|
27
27
|
import { getConfig } from "../../config/loader.js";
|
|
28
|
+
import { isMemoryV2ReadActive } from "../../memory/context-search/sources/memory-v2.js";
|
|
28
29
|
import { getDb } from "../../memory/db-connection.js";
|
|
29
30
|
import {
|
|
30
31
|
embedWithBackend,
|
|
@@ -49,11 +50,7 @@ import { withQdrantBreaker } from "../../memory/qdrant-circuit-breaker.js";
|
|
|
49
50
|
import { getQdrantClient } from "../../memory/qdrant-client.js";
|
|
50
51
|
import { memoryGraphNodes } from "../../memory/schema.js";
|
|
51
52
|
import { getLogger } from "../../util/logger.js";
|
|
52
|
-
import {
|
|
53
|
-
BadRequestError,
|
|
54
|
-
ConflictError,
|
|
55
|
-
NotFoundError,
|
|
56
|
-
} from "./errors.js";
|
|
53
|
+
import { BadRequestError, ConflictError, NotFoundError } from "./errors.js";
|
|
57
54
|
import type { RouteDefinition } from "./types.js";
|
|
58
55
|
|
|
59
56
|
const log = getLogger("memory-item-routes");
|
|
@@ -179,6 +176,11 @@ async function searchNodesSemantic(
|
|
|
179
176
|
): Promise<{ ids: string[]; total: number } | null> {
|
|
180
177
|
try {
|
|
181
178
|
const config = getConfig();
|
|
179
|
+
// v2 owns the read path when both gates are on. Fall back to SQL search
|
|
180
|
+
// (the caller's `null` branch) instead of querying the v1 collection,
|
|
181
|
+
// which is in active retirement and a corrupted sparse segment can
|
|
182
|
+
// OOM-crash the shared Qdrant process.
|
|
183
|
+
if (isMemoryV2ReadActive(config)) return null;
|
|
182
184
|
const backendStatus = await getMemoryBackendStatus(config);
|
|
183
185
|
if (!backendStatus.provider) return null;
|
|
184
186
|
|
|
@@ -249,9 +251,7 @@ function rowToNode(row: typeof memoryGraphNodes.$inferSelect): MemoryNode {
|
|
|
249
251
|
| "told-by-other",
|
|
250
252
|
narrativeRole: row.narrativeRole as MemoryNode["narrativeRole"],
|
|
251
253
|
partOfStory: row.partOfStory,
|
|
252
|
-
imageRefs: row.imageRefs
|
|
253
|
-
? (JSON.parse(row.imageRefs) as ImageRef[])
|
|
254
|
-
: null,
|
|
254
|
+
imageRefs: row.imageRefs ? (JSON.parse(row.imageRefs) as ImageRef[]) : null,
|
|
255
255
|
scopeId: row.scopeId ?? "default",
|
|
256
256
|
};
|
|
257
257
|
}
|
|
@@ -555,8 +555,7 @@ async function handleUpdateMemoryItem(
|
|
|
555
555
|
// Rebuild content if subject or statement changed
|
|
556
556
|
const { subject: existingSubject, statement: existingStatement } =
|
|
557
557
|
splitContent(existing.content);
|
|
558
|
-
const newSubject =
|
|
559
|
-
subject !== undefined ? subject.trim() : existingSubject;
|
|
558
|
+
const newSubject = subject !== undefined ? subject.trim() : existingSubject;
|
|
560
559
|
const newStatement =
|
|
561
560
|
statement !== undefined ? statement.trim() : existingStatement;
|
|
562
561
|
|
|
@@ -702,8 +701,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
702
701
|
items: z.array(z.unknown()).describe("Memory item objects"),
|
|
703
702
|
total: z.number(),
|
|
704
703
|
}),
|
|
705
|
-
handler: ({ queryParams }) =>
|
|
706
|
-
handleListMemoryItems(queryParams ?? {}),
|
|
704
|
+
handler: ({ queryParams }) => handleListMemoryItems(queryParams ?? {}),
|
|
707
705
|
},
|
|
708
706
|
|
|
709
707
|
{
|