@vellumai/assistant 0.10.1 → 0.10.2-dev.202606241651.2d2b40d
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/docs/workspace-tools.md +42 -33
- package/eslint-rules/cli-no-daemon-internals.js +6 -0
- package/node_modules/@vellumai/gateway-client/src/__tests__/guardian-delivery-contract.test.ts +91 -0
- package/node_modules/@vellumai/gateway-client/src/__tests__/trust-verdict-contract.test.ts +31 -0
- package/node_modules/@vellumai/gateway-client/src/guardian-delivery-contract.ts +48 -0
- package/node_modules/@vellumai/gateway-client/src/index.ts +14 -0
- package/node_modules/@vellumai/gateway-client/src/trust-verdict-contract.ts +17 -0
- package/openapi.yaml +74 -1
- package/package.json +1 -1
- package/scripts/test.sh +36 -15
- package/src/__tests__/actor-token-service.test.ts +36 -14
- package/src/__tests__/agent-loop-override-profile.test.ts +1 -0
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +2 -0
- package/src/__tests__/agent-wake-override-profile.test.ts +2 -0
- package/src/__tests__/annotate-activity-metadata.test.ts +2 -0
- package/src/__tests__/annotate-risk-options.test.ts +2 -0
- package/src/__tests__/approval-cascade.test.ts +2 -0
- package/src/__tests__/background-workers-disk-pressure.test.ts +2 -0
- package/src/__tests__/btw-routes.test.ts +2 -0
- package/src/__tests__/build-persisted-content.test.ts +2 -0
- package/src/__tests__/call-controller.test.ts +19 -0
- package/src/__tests__/channel-guardian.test.ts +94 -58
- package/src/__tests__/channel-reply-delivery.test.ts +2 -0
- package/src/__tests__/compaction-events.test.ts +2 -0
- package/src/__tests__/compaction.benchmark.test.ts +2 -0
- package/src/__tests__/compactor-call-site-logging.test.ts +2 -0
- package/src/__tests__/compactor-low-watermark-cut.test.ts +2 -0
- package/src/__tests__/compactor-preserved-tail-count.test.ts +2 -0
- package/src/__tests__/compactor-summary-call-truncation.test.ts +2 -0
- package/src/__tests__/compactor-web-search-strip.test.ts +2 -0
- package/src/__tests__/computer-use-tools.test.ts +13 -0
- package/src/__tests__/config-loader-backfill.test.ts +5 -1
- package/src/__tests__/config-schema.test.ts +1 -0
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +31 -29
- package/src/__tests__/contacts-relay-reads.test.ts +13 -15
- package/src/__tests__/conversation-abort-tool-results.test.ts +2 -0
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +2 -0
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +2 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +2 -0
- package/src/__tests__/conversation-agent-loop.test.ts +7 -0
- package/src/__tests__/conversation-analysis-routes.test.ts +2 -0
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +2 -0
- package/src/__tests__/conversation-confirmation-signals.test.ts +2 -0
- package/src/__tests__/conversation-history-web-search.test.ts +2 -0
- package/src/__tests__/conversation-load-history-repair.test.ts +2 -0
- package/src/__tests__/conversation-load-history-stripped.test.ts +2 -0
- package/src/__tests__/conversation-pairing.test.ts +2 -0
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +2 -0
- package/src/__tests__/conversation-process-callsite.test.ts +2 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +2 -0
- package/src/__tests__/conversation-queue.test.ts +91 -0
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +14 -0
- package/src/__tests__/conversation-routes-slash-commands.test.ts +14 -0
- package/src/__tests__/conversation-slash-queue.test.ts +2 -0
- package/src/__tests__/conversation-slash-unknown.test.ts +2 -0
- package/src/__tests__/conversation-speed-override.test.ts +2 -0
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +65 -0
- package/src/__tests__/conversation-title-service.test.ts +2 -0
- package/src/__tests__/conversation-tool-setup-attribution.test.ts +47 -0
- package/src/__tests__/conversation-usage.test.ts +2 -0
- package/src/__tests__/conversation-workspace-cache-state.test.ts +2 -0
- package/src/__tests__/conversation-workspace-injection.test.ts +2 -0
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +2 -0
- package/src/__tests__/credential-security-invariants.test.ts +0 -1
- package/src/__tests__/db-migration-rollback.test.ts +205 -171
- package/src/__tests__/db-test-helpers.ts +5 -4
- package/src/__tests__/deterministic-verification-control-plane.test.ts +4 -2
- package/src/__tests__/disk-pressure-guard.test.ts +41 -0
- package/src/__tests__/dm-persistence.test.ts +2 -0
- package/src/__tests__/emit-signal-routing-intent.test.ts +10 -5
- package/src/__tests__/events-dev-bypass-actor.test.ts +7 -1
- package/src/__tests__/filing-service.test.ts +2 -0
- package/src/__tests__/guardian-binding-drift-heal.test.ts +75 -10
- package/src/__tests__/guardian-dispatch.test.ts +95 -1
- package/src/__tests__/guardian-outbound-http.test.ts +13 -0
- package/src/__tests__/heartbeat-disk-pressure.test.ts +2 -0
- package/src/__tests__/heartbeat-service.test.ts +2 -0
- package/src/__tests__/helpers/channel-test-adapter.ts +1 -7
- package/src/__tests__/host-app-control-routes.test.ts +24 -30
- package/src/__tests__/host-bash-routes.test.ts +31 -41
- package/src/__tests__/host-browser-routes.test.ts +26 -32
- package/src/__tests__/host-cu-proxy.test.ts +299 -0
- package/src/__tests__/host-cu-routes-targeted.test.ts +25 -33
- package/src/__tests__/host-file-routes-targeted.test.ts +40 -52
- package/src/__tests__/host-transfer-routes-targeted.test.ts +31 -43
- package/src/__tests__/http-user-message-parity.test.ts +167 -8
- package/src/__tests__/inbound-slack-persistence.test.ts +2 -0
- package/src/__tests__/invite-redemption-service.test.ts +43 -0
- package/src/__tests__/llm-context-normalization.test.ts +105 -0
- package/src/__tests__/llm-usage-store.test.ts +25 -0
- package/src/__tests__/media-stream-server-integration.test.ts +127 -0
- package/src/__tests__/memory-retrieval-hook.test.ts +2 -0
- package/src/__tests__/messaging-send-tool.test.ts +2 -0
- package/src/__tests__/migration-import-from-url.test.ts +2 -2
- package/src/__tests__/native-web-search.test.ts +2 -0
- package/src/__tests__/non-member-access-request.test.ts +189 -17
- package/src/__tests__/notification-broadcaster.test.ts +4 -0
- package/src/__tests__/notification-decision-recipient-context.test.ts +33 -32
- package/src/__tests__/notification-deep-link.test.ts +6 -0
- package/src/__tests__/notification-guardian-path.test.ts +19 -0
- package/src/__tests__/outbound-slack-persistence.test.ts +2 -0
- package/src/__tests__/pending-interactions-resolved-event.test.ts +7 -4
- package/src/__tests__/persistence-secret-redaction.test.ts +2 -0
- package/src/__tests__/plugin-bootstrap.test.ts +3 -73
- package/src/__tests__/plugin-route-contribution.test.ts +4 -17
- package/src/__tests__/plugin-tool-contribution.test.ts +3 -18
- package/src/__tests__/plugin-types.test.ts +0 -2
- package/src/__tests__/process-message-background-slack.test.ts +2 -0
- package/src/__tests__/process-message-display-content.test.ts +2 -0
- package/src/__tests__/provider-usage-tracking.test.ts +39 -0
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +2 -0
- package/src/__tests__/registry.test.ts +3 -0
- package/src/__tests__/relay-server.test.ts +694 -25
- package/src/__tests__/runtime-attachment-metadata.test.ts +0 -1
- package/src/__tests__/secret-ingress-http.test.ts +14 -0
- package/src/__tests__/send-endpoint-busy.test.ts +30 -8
- package/src/__tests__/skills.test.ts +44 -0
- package/src/__tests__/slack-inbound-verification.test.ts +47 -2
- package/src/__tests__/sse-actor-principal-guardian-source.test.ts +102 -0
- package/src/__tests__/steer-on-enqueue-question.test.ts +181 -0
- package/src/__tests__/stt-hints.test.ts +44 -13
- package/src/__tests__/subagent-detail.test.ts +27 -0
- package/src/__tests__/subagent-disposal.test.ts +65 -0
- package/src/__tests__/subagent-notify-parent.test.ts +2 -0
- package/src/__tests__/subagent-spawn-tool-fork.test.ts +2 -0
- package/src/__tests__/subagent-tools.test.ts +2 -0
- package/src/__tests__/suggestion-routes.test.ts +2 -0
- package/src/__tests__/title-generate-hook.test.ts +2 -0
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +2 -0
- package/src/__tests__/tool-executor.test.ts +16 -11
- package/src/__tests__/tool-preview-lifecycle.test.ts +2 -0
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +2 -0
- package/src/__tests__/tool-start-timestamp.test.ts +2 -0
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +10 -10
- package/src/__tests__/twilio-routes.test.ts +96 -0
- package/src/__tests__/verification-control-plane-policy.test.ts +2 -0
- package/src/__tests__/web-search-backend-failure.test.ts +2 -0
- package/src/__tests__/workspace-tool-loader.test.ts +195 -2
- package/src/agent/loop-exclusive-tool.test.ts +150 -0
- package/src/agent/loop.ts +56 -0
- package/src/api/constants/sse-replay.ts +41 -0
- package/src/api/index.ts +6 -0
- package/src/api/responses/llm-request-log-entry.ts +25 -0
- package/src/api/responses/subagent-detail.ts +17 -0
- package/src/calls/__tests__/relay-setup-router.test.ts +262 -4
- package/src/calls/call-domain.ts +3 -3
- package/src/calls/guardian-dispatch.ts +10 -8
- package/src/calls/inbound-trust-reader.ts +17 -1
- package/src/calls/media-stream-server.ts +21 -0
- package/src/calls/relay-server.ts +167 -50
- package/src/calls/relay-setup-router.ts +37 -7
- package/src/calls/relay-verification.ts +4 -4
- package/src/calls/stt-hints.ts +9 -12
- package/src/calls/twilio-routes.ts +14 -4
- package/src/cli/commands/__tests__/cache.test.ts +8 -1
- package/src/cli/commands/cache.ts +194 -181
- package/src/cli/commands/db/__tests__/repair.test.ts +6 -5
- package/src/cli/commands/db/status.ts +37 -1
- package/src/cli/commands/mcp.ts +252 -218
- package/src/cli/commands/memory/__tests__/worker.test.ts +302 -0
- package/src/cli/commands/memory/index.ts +2 -0
- package/src/cli/commands/memory/worker.ts +175 -0
- package/src/cli/commands/plugins.ts +75 -3
- package/src/cli/lib/__tests__/install-from-github.test.ts +102 -0
- package/src/cli/lib/__tests__/list-installed-plugins.test.ts +160 -1
- package/src/cli/lib/list-installed-plugins.ts +179 -1
- package/src/config/__tests__/loader-callsite-strip-fallback.test.ts +143 -0
- package/src/config/bundled-skills/computer-use/TOOLS.json +6 -1
- package/src/config/bundled-skills/contacts/tools/contact-merge.ts +27 -17
- package/src/config/bundled-skills/contacts/tools/contact-search.ts +13 -3
- package/src/config/feature-flag-registry.json +0 -8
- package/src/config/loader.ts +36 -5
- package/src/config/schemas/__tests__/memory-v3.test.ts +1 -0
- package/src/config/schemas/memory-lifecycle.ts +12 -0
- package/src/config/schemas/memory-v3.ts +7 -0
- package/src/config/schemas/memory.ts +4 -0
- package/src/config/schemas/timeouts.ts +8 -0
- package/src/config/seed-inference-profiles.ts +14 -5
- package/src/config/skills.ts +27 -5
- package/src/contacts/__tests__/guardian-delivery-reader.test.ts +312 -0
- package/src/contacts/contacts-write.ts +3 -0
- package/src/contacts/guardian-delivery-reader.ts +223 -0
- package/src/daemon/conversation-agent-loop.ts +9 -0
- package/src/daemon/conversation-process.ts +39 -17
- package/src/daemon/conversation-surfaces.ts +8 -0
- package/src/daemon/conversation-tool-setup.ts +49 -16
- package/src/daemon/conversation.ts +21 -2
- package/src/daemon/disk-pressure-guard.ts +12 -2
- package/src/daemon/event-loop-watchdog.ts +28 -1
- package/src/daemon/external-plugins-bootstrap.ts +4 -34
- package/src/daemon/handlers/__tests__/config-a2a-redeem.test.ts +25 -0
- package/src/daemon/handlers/__tests__/config-channels.test.ts +225 -0
- package/src/daemon/handlers/config-a2a.ts +6 -14
- package/src/daemon/handlers/config-channels.ts +78 -22
- package/src/daemon/handlers/conversations.ts +77 -0
- package/src/daemon/host-cu-proxy.ts +102 -11
- package/src/daemon/lifecycle.ts +4 -0
- package/src/daemon/memory-v2-startup.test.ts +72 -0
- package/src/daemon/memory-v2-startup.ts +87 -19
- package/src/daemon/server.ts +0 -4
- package/src/daemon/shutdown-handlers.ts +20 -0
- package/src/daemon/tool-setup-types.ts +9 -0
- package/src/ipc/__tests__/clients-list-ipc.test.ts +1 -1
- package/src/ipc/assistant-server.ts +2 -2
- package/src/memory/__tests__/301-create-watchdog-events.test.ts +110 -0
- package/src/memory/__tests__/memory-retrospective-job.test.ts +8 -0
- package/src/memory/__tests__/prompt-override.test.ts +192 -0
- package/src/memory/__tests__/watchdog-events-store.test.ts +161 -0
- package/src/memory/conversation-crud.ts +38 -0
- package/src/memory/db-connection.ts +22 -3
- package/src/memory/db-init.ts +36 -502
- package/src/memory/db-singleton.ts +6 -4
- package/src/memory/jobs-worker.ts +58 -0
- package/src/memory/llm-usage-store.ts +48 -20
- package/src/memory/memory-retrospective-job.ts +9 -8
- package/src/memory/migrations/014-backfill-inbox-thread-state.ts +13 -3
- package/src/memory/migrations/136-drop-assistant-id-columns.ts +52 -27
- package/src/memory/migrations/209-strip-thinking-from-consolidated.ts +130 -56
- package/src/memory/migrations/300-add-processing-started-at.ts +30 -0
- package/src/memory/migrations/301-create-watchdog-events.ts +45 -0
- package/src/memory/migrations/__tests__/014-backfill-inbox-thread-state.test.ts +108 -0
- package/src/memory/migrations/__tests__/136-drop-assistant-id-columns.test.ts +82 -0
- package/src/memory/migrations/__tests__/209-strip-thinking-from-consolidated.test.ts +224 -0
- package/src/memory/migrations/__tests__/run-migrations.test.ts +2 -2
- package/src/memory/migrations/run-migrations.ts +90 -6
- package/src/memory/migrations/schema-introspection.ts +14 -0
- package/src/memory/migrations/validate-migration-state.ts +101 -66
- package/src/memory/prompt-override.ts +129 -0
- package/src/memory/schema/conversations.ts +9 -0
- package/src/memory/schema/infrastructure.ts +20 -0
- package/src/memory/steps.ts +573 -0
- package/src/memory/v2/__tests__/cli-command-store.test.ts +25 -0
- package/src/memory/v2/__tests__/skill-store.test.ts +80 -0
- package/src/memory/v2/cli-command-store.ts +75 -38
- package/src/memory/v2/prompts/consolidation.ts +13 -82
- package/src/memory/v2/prompts/router.ts +21 -93
- package/src/memory/v2/skill-store.ts +68 -31
- package/src/memory/watchdog-events-store.ts +87 -0
- package/src/memory/worker-control.ts +118 -0
- package/src/memory/worker-process.ts +72 -0
- package/src/notifications/__tests__/broadcaster.test.ts +16 -8
- package/src/notifications/__tests__/connected-channels.test.ts +114 -0
- package/src/notifications/__tests__/decision-engine.test.ts +78 -9
- package/src/notifications/__tests__/destination-resolver.test.ts +256 -0
- package/src/notifications/broadcaster.ts +8 -1
- package/src/notifications/decision-engine.ts +15 -7
- package/src/notifications/destination-resolver.ts +68 -24
- package/src/notifications/emit-signal.ts +39 -14
- package/src/onboarding/checkin-event.test.ts +220 -0
- package/src/onboarding/checkin-event.ts +321 -0
- package/src/onboarding/schedule-checkin.ts +190 -0
- package/src/permissions/question-prompter.test.ts +1 -1
- package/src/permissions/question-prompter.ts +7 -4
- package/src/plugin-api/index.ts +6 -6
- package/src/plugin-api/types.ts +3 -5
- package/src/plugin-api/vision-support.test.ts +28 -4
- package/src/plugin-api/vision-support.ts +66 -31
- package/src/plugins/defaults/advisor/__tests__/consult.test.ts +161 -0
- package/src/plugins/defaults/advisor/__tests__/context-pack-gating.test.ts +106 -0
- package/src/plugins/defaults/advisor/__tests__/context-pack.test.ts +60 -0
- package/src/plugins/defaults/advisor/consult.ts +110 -6
- package/src/plugins/defaults/advisor/context-pack.ts +288 -0
- package/src/plugins/defaults/advisor/steering.ts +14 -2
- package/src/plugins/defaults/advisor/tools/advisor.ts +32 -5
- package/src/plugins/defaults/image-fallback/__tests__/image-fallback.test.ts +47 -7
- package/src/plugins/defaults/image-fallback/hooks/post-tool-use.ts +10 -11
- package/src/plugins/defaults/image-fallback/hooks/user-prompt-submit.ts +12 -20
- package/src/plugins/defaults/image-fallback/src/caption-blocks.ts +42 -11
- package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +11 -2
- package/src/plugins/defaults/memory-v3-shadow/pool-select.test.ts +146 -0
- package/src/plugins/defaults/memory-v3-shadow/pool-select.ts +29 -1
- package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +8 -1
- package/src/plugins/mtime-cache.ts +7 -2
- package/src/plugins/types.ts +0 -2
- package/src/providers/anthropic/client.ts +5 -0
- package/src/providers/call-site-routing.ts +4 -0
- package/src/providers/model-catalog.ts +16 -0
- package/src/providers/openai/responses-provider.ts +5 -0
- package/src/providers/openrouter/client.ts +5 -0
- package/src/providers/provider-send-message.ts +4 -0
- package/src/providers/ratelimit.ts +4 -0
- package/src/providers/retry.ts +4 -0
- package/src/providers/types.ts +9 -0
- package/src/providers/usage-tracking.ts +4 -0
- package/src/runtime/__tests__/channel-verification-service.test.ts +133 -0
- package/src/runtime/__tests__/guardian-vellum-migration.test.ts +181 -0
- package/src/runtime/__tests__/is-guardian-bound-for-channel.test.ts +66 -0
- package/src/runtime/__tests__/local-principal-trust.test.ts +164 -0
- package/src/runtime/__tests__/trust-verdict-consumer.test.ts +335 -3
- package/src/runtime/access-request-helper.ts +19 -39
- package/src/runtime/actor-trust-resolver.ts +2 -2
- package/src/runtime/anchored-guardian.test.ts +156 -0
- package/src/runtime/anchored-guardian.ts +135 -0
- package/src/runtime/assistant-event-hub.ts +1 -1
- package/src/runtime/assistant-stream-state.ts +9 -2
- package/src/runtime/auth/__tests__/require-bound-guardian.test.ts +99 -0
- package/src/runtime/auth/require-bound-guardian.ts +21 -11
- package/src/runtime/channel-verification-service.ts +56 -31
- package/src/runtime/confirmation-request-guardian-bridge.ts +3 -3
- package/src/runtime/guardian-vellum-migration.ts +66 -7
- package/src/runtime/invite-redemption-service.ts +50 -18
- package/src/runtime/local-actor-identity.ts +76 -11
- package/src/runtime/local-principal-trust.ts +52 -0
- package/src/runtime/pending-interactions.ts +11 -1
- package/src/runtime/routes/__tests__/channel-verification-revoke.test.ts +56 -5
- package/src/runtime/routes/__tests__/channel-verification-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/contact-routes.test.ts +212 -0
- package/src/runtime/routes/__tests__/global-search-routes.test.ts +93 -0
- package/src/runtime/routes/__tests__/surface-action-routes.test.ts +215 -1
- package/src/runtime/routes/browser-routes.ts +1 -1
- package/src/runtime/routes/channel-verification-routes.ts +3 -3
- package/src/runtime/routes/contact-routes.ts +8 -32
- package/src/runtime/routes/conversation-cli-routes.ts +4 -5
- package/src/runtime/routes/conversation-list-routes.ts +4 -7
- package/src/runtime/routes/conversation-routes.ts +74 -81
- package/src/runtime/routes/events-routes.ts +2 -2
- package/src/runtime/routes/global-search-routes.ts +3 -1
- package/src/runtime/routes/guardian-action-routes.ts +4 -5
- package/src/runtime/routes/host-app-control-routes.ts +5 -4
- package/src/runtime/routes/host-bash-routes.ts +5 -4
- package/src/runtime/routes/host-browser-routes.ts +9 -11
- package/src/runtime/routes/host-cu-routes.ts +5 -4
- package/src/runtime/routes/host-file-routes.ts +5 -4
- package/src/runtime/routes/host-transfer-routes.ts +6 -6
- package/src/runtime/routes/http-adapter.ts +1 -1
- package/src/runtime/routes/identity-routes.ts +3 -2
- package/src/runtime/routes/inbound-message-handler.ts +5 -5
- package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +97 -5
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +61 -49
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +16 -4
- package/src/runtime/routes/inbound-stages/escalation-intercept.ts +7 -7
- package/src/runtime/routes/inbound-stages/guardian-activation-intercept.test.ts +21 -8
- package/src/runtime/routes/inbound-stages/guardian-activation-intercept.ts +14 -3
- package/src/runtime/routes/index.ts +2 -0
- package/src/runtime/routes/llm-context-normalization.ts +71 -0
- package/src/runtime/routes/mcp-auth-routes.ts +38 -15
- package/src/runtime/routes/migration-rollback-routes.ts +4 -3
- package/src/runtime/routes/migration-routes.ts +4 -1
- package/src/runtime/routes/onboarding-checkin-routes.ts +86 -0
- package/src/runtime/routes/subagents-routes.ts +5 -0
- package/src/runtime/routes/surface-action-routes.ts +51 -55
- package/src/runtime/services/__tests__/conversation-serializer.test.ts +1 -0
- package/src/runtime/services/conversation-serializer.ts +7 -9
- package/src/runtime/tool-grant-request-helper.ts +3 -3
- package/src/runtime/trust-verdict-consumer.ts +85 -9
- package/src/runtime/verification-outbound-actions.ts +18 -18
- package/src/signals/user-message.ts +16 -0
- package/src/subagent/manager.ts +9 -0
- package/src/telemetry/types.ts +34 -1
- package/src/telemetry/usage-telemetry-reporter.test.ts +3 -2
- package/src/telemetry/usage-telemetry-reporter.ts +87 -3
- package/src/tools/ask-question/ask-question-tool.test.ts +29 -0
- package/src/tools/ask-question/ask-question-tool.ts +13 -0
- package/src/tools/computer-use/definitions.ts +8 -2
- package/src/tools/executor.ts +4 -4
- package/src/tools/registry.ts +18 -0
- package/src/tools/tool-approval-handler.ts +1 -1
- package/src/tools/tool-defaults.ts +9 -2
- package/src/tools/types.ts +17 -2
- package/src/tools/workspace-tools/loader.ts +348 -244
- package/src/util/platform.ts +5 -0
- package/src/util/telemetry-db-path.ts +24 -0
- package/src/workspace/migrations/017-seed-persona-dirs.ts +3 -34
- package/src/workspace/migrations/019-scope-journal-to-guardian.ts +3 -24
- package/src/__tests__/workspace-tools-watcher-flag.test.ts +0 -70
- package/src/daemon/workspace-tools-watcher.ts +0 -328
- package/src/memory/migrations/registry.ts +0 -573
package/src/cli/commands/mcp.ts
CHANGED
|
@@ -109,10 +109,9 @@ export function registerMcpCommand(program: Command): void {
|
|
|
109
109
|
transport: "ipc",
|
|
110
110
|
description: "Manage MCP (Model Context Protocol) servers",
|
|
111
111
|
build: (mcp) => {
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
`
|
|
112
|
+
mcp.addHelpText(
|
|
113
|
+
"after",
|
|
114
|
+
`
|
|
116
115
|
MCP servers extend the assistant's capabilities with external tools. Servers
|
|
117
116
|
are configured in the assistant's config.json under the mcp.servers key. Each
|
|
118
117
|
server uses one of three transport types:
|
|
@@ -129,15 +128,15 @@ Examples:
|
|
|
129
128
|
$ assistant mcp add my-server -t stdio -c npx -a my-mcp-server
|
|
130
129
|
$ assistant mcp auth my-server
|
|
131
130
|
$ assistant mcp remove my-server`,
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
131
|
+
);
|
|
132
|
+
|
|
133
|
+
mcp
|
|
134
|
+
.command("list")
|
|
135
|
+
.description("List configured MCP servers and their status")
|
|
136
|
+
.option("--json", "Output as JSON")
|
|
137
|
+
.addHelpText(
|
|
138
|
+
"after",
|
|
139
|
+
`
|
|
141
140
|
Shows each configured MCP server with its current status and configuration:
|
|
142
141
|
|
|
143
142
|
Name The server identifier used in config.json
|
|
@@ -157,49 +156,49 @@ list including health status.
|
|
|
157
156
|
Examples:
|
|
158
157
|
$ assistant mcp list
|
|
159
158
|
$ assistant mcp list --json`,
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
159
|
+
)
|
|
160
|
+
.action(async (opts: { json?: boolean }) => {
|
|
161
|
+
const result = await cliIpcCall<{ servers: McpServerEntry[] }>(
|
|
162
|
+
"internal_mcp_list",
|
|
163
|
+
);
|
|
165
164
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
165
|
+
if (!result.ok) {
|
|
166
|
+
return exitFromIpcResult({
|
|
167
|
+
ok: false,
|
|
168
|
+
error: result.error,
|
|
169
|
+
statusCode: result.statusCode,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
const servers = result.result?.servers ?? [];
|
|
174
|
+
|
|
175
|
+
if (servers.length === 0) {
|
|
176
|
+
if (opts.json) {
|
|
177
|
+
process.stdout.write(JSON.stringify([], null, 2) + "\n");
|
|
178
|
+
} else {
|
|
179
|
+
log.info("No MCP servers configured.");
|
|
180
|
+
}
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
if (opts.json) {
|
|
185
|
+
process.stdout.write(JSON.stringify(servers, null, 2) + "\n");
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
log.info(`${servers.length} MCP server(s) configured:\n`);
|
|
190
|
+
|
|
191
|
+
for (const entry of servers) {
|
|
192
|
+
printServerEntry(entry);
|
|
193
|
+
}
|
|
171
194
|
});
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
} else {
|
|
180
|
-
log.info("No MCP servers configured.");
|
|
181
|
-
}
|
|
182
|
-
return;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
if (opts.json) {
|
|
186
|
-
process.stdout.write(JSON.stringify(servers, null, 2) + "\n");
|
|
187
|
-
return;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
log.info(`${servers.length} MCP server(s) configured:\n`);
|
|
191
|
-
|
|
192
|
-
for (const entry of servers) {
|
|
193
|
-
printServerEntry(entry);
|
|
194
|
-
}
|
|
195
|
-
});
|
|
196
|
-
|
|
197
|
-
mcp
|
|
198
|
-
.command("reload")
|
|
199
|
-
.description("Reload MCP server connections in the running assistant")
|
|
200
|
-
.addHelpText(
|
|
201
|
-
"after",
|
|
202
|
-
`
|
|
195
|
+
|
|
196
|
+
mcp
|
|
197
|
+
.command("reload")
|
|
198
|
+
.description("Reload MCP server connections in the running assistant")
|
|
199
|
+
.addHelpText(
|
|
200
|
+
"after",
|
|
201
|
+
`
|
|
203
202
|
Signals the running assistant to disconnect and reconnect all MCP servers
|
|
204
203
|
using the current configuration from disk. Active sessions pick up new tools
|
|
205
204
|
on their next turn automatically. The assistant must be running.
|
|
@@ -208,40 +207,49 @@ Examples:
|
|
|
208
207
|
$ vellum mcp reload
|
|
209
208
|
$ vellum mcp reload # after editing config.json to add a new server
|
|
210
209
|
$ vellum mcp reload # after running "vellum mcp auth <server>"`,
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
210
|
+
)
|
|
211
|
+
.action(async () => {
|
|
212
|
+
const result = await cliIpcCall("internal_mcp_reload", { body: {} });
|
|
213
|
+
if (!result.ok) {
|
|
214
|
+
log.warn(
|
|
215
|
+
`Could not signal reload: ${result.error}. ` +
|
|
216
|
+
`Run 'assistant mcp reload' once the assistant is up.`,
|
|
217
|
+
);
|
|
218
|
+
} else {
|
|
219
|
+
log.info(
|
|
220
|
+
"MCP reload signal sent. The running assistant will reconnect servers shortly.",
|
|
221
|
+
);
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
mcp
|
|
226
|
+
.command("add <name>")
|
|
227
|
+
.description("Add an MCP server configuration")
|
|
228
|
+
.requiredOption(
|
|
229
|
+
"-t, --transport-type <type>",
|
|
230
|
+
"Transport type: stdio, sse, or streamable-http",
|
|
231
|
+
)
|
|
232
|
+
.option("-u, --url <url>", "Server URL (for sse/streamable-http)")
|
|
233
|
+
.option("-c, --command <cmd>", "Command to run (for stdio)")
|
|
234
|
+
.option("-a, --args <args...>", "Command arguments (for stdio)")
|
|
235
|
+
.option(
|
|
236
|
+
"-r, --risk <level>",
|
|
237
|
+
"Default risk level: low, medium, or high",
|
|
238
|
+
"high",
|
|
239
|
+
)
|
|
240
|
+
.option(
|
|
241
|
+
"-H, --header <key:value>",
|
|
242
|
+
"Custom HTTP header (repeatable, for sse/streamable-http). E.g. -H 'Authorization: Bearer tok123'",
|
|
243
|
+
(val: string, acc: string[]) => {
|
|
244
|
+
acc.push(val);
|
|
245
|
+
return acc;
|
|
246
|
+
},
|
|
247
|
+
[] as string[],
|
|
248
|
+
)
|
|
249
|
+
.option("--disabled", "Add as disabled")
|
|
250
|
+
.addHelpText(
|
|
251
|
+
"after",
|
|
252
|
+
`
|
|
245
253
|
Arguments:
|
|
246
254
|
name Unique identifier for the server (used as the key in config.json)
|
|
247
255
|
|
|
@@ -254,58 +262,84 @@ The --risk flag sets the default risk level for all tools from this server
|
|
|
254
262
|
(defaults to "high" if not specified). The server starts enabled unless
|
|
255
263
|
--disabled is passed.
|
|
256
264
|
|
|
265
|
+
The --header (-H) flag adds custom HTTP headers to sse/streamable-http
|
|
266
|
+
transports. Use it for Bearer Token or API Key authentication. The flag
|
|
267
|
+
is repeatable — pass multiple -H flags for multiple headers.
|
|
268
|
+
|
|
257
269
|
If a server with the same name already exists, the command fails. Remove the
|
|
258
270
|
existing server first with "assistant mcp remove <name>".
|
|
259
271
|
|
|
260
272
|
Examples:
|
|
261
273
|
$ assistant mcp add my-server -t stdio -c npx -a my-mcp-server
|
|
262
274
|
$ assistant mcp add remote-api -t streamable-http -u https://api.example.com/mcp -r medium
|
|
263
|
-
$ assistant mcp add legacy-sse -t sse -u https://old.example.com/events --disabled
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
"internal_mcp_add",
|
|
279
|
-
{
|
|
280
|
-
body: {
|
|
281
|
-
name,
|
|
282
|
-
transportType: opts.transportType,
|
|
283
|
-
url: opts.url,
|
|
284
|
-
command: opts.command,
|
|
285
|
-
args: opts.args,
|
|
286
|
-
risk: opts.risk,
|
|
287
|
-
disabled: opts.disabled,
|
|
275
|
+
$ assistant mcp add legacy-sse -t sse -u https://old.example.com/events --disabled
|
|
276
|
+
$ assistant mcp add authed-api -t sse -u https://api.example.com/mcp -H 'Authorization: Bearer tok123'
|
|
277
|
+
$ assistant mcp add apikey-srv -t streamable-http -u https://srv.example.com/mcp -H 'X-API-Key: sk_live_abc'`,
|
|
278
|
+
)
|
|
279
|
+
.action(
|
|
280
|
+
async (
|
|
281
|
+
name: string,
|
|
282
|
+
opts: {
|
|
283
|
+
transportType: string;
|
|
284
|
+
url?: string;
|
|
285
|
+
command?: string;
|
|
286
|
+
args?: string[];
|
|
287
|
+
risk: string;
|
|
288
|
+
header: string[];
|
|
289
|
+
disabled?: boolean;
|
|
288
290
|
},
|
|
291
|
+
) => {
|
|
292
|
+
let headers: Record<string, string> | undefined;
|
|
293
|
+
if (opts.header.length > 0) {
|
|
294
|
+
headers = {};
|
|
295
|
+
for (const h of opts.header) {
|
|
296
|
+
const colonIdx = h.indexOf(":");
|
|
297
|
+
if (colonIdx === -1) {
|
|
298
|
+
log.error(
|
|
299
|
+
`Invalid header format: "${h}". Expected "Key: Value".`,
|
|
300
|
+
);
|
|
301
|
+
process.exitCode = 1;
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
headers[h.slice(0, colonIdx).trim()] = h
|
|
305
|
+
.slice(colonIdx + 1)
|
|
306
|
+
.trim();
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
const result = await cliIpcCall<{ added: true }>(
|
|
311
|
+
"internal_mcp_add",
|
|
312
|
+
{
|
|
313
|
+
body: {
|
|
314
|
+
name,
|
|
315
|
+
transportType: opts.transportType,
|
|
316
|
+
url: opts.url,
|
|
317
|
+
command: opts.command,
|
|
318
|
+
args: opts.args,
|
|
319
|
+
risk: opts.risk,
|
|
320
|
+
disabled: opts.disabled,
|
|
321
|
+
headers,
|
|
322
|
+
},
|
|
323
|
+
},
|
|
324
|
+
);
|
|
325
|
+
|
|
326
|
+
if (!result.ok) {
|
|
327
|
+
log.error(result.error ?? "Failed to add MCP server");
|
|
328
|
+
process.exitCode = 1;
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
log.info(`Added MCP server "${name}" (${opts.transportType})`);
|
|
333
|
+
log.info("The running assistant is reloading MCP servers now.");
|
|
289
334
|
},
|
|
290
335
|
);
|
|
291
336
|
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
log.info(`Added MCP server "${name}" (${opts.transportType})`);
|
|
299
|
-
log.info("The running assistant is reloading MCP servers now.");
|
|
300
|
-
},
|
|
301
|
-
);
|
|
302
|
-
|
|
303
|
-
mcp
|
|
304
|
-
.command("auth <name>")
|
|
305
|
-
.description("Authenticate with an MCP server via OAuth")
|
|
306
|
-
.addHelpText(
|
|
307
|
-
"after",
|
|
308
|
-
`
|
|
337
|
+
mcp
|
|
338
|
+
.command("auth <name>")
|
|
339
|
+
.description("Authenticate with an MCP server via OAuth")
|
|
340
|
+
.addHelpText(
|
|
341
|
+
"after",
|
|
342
|
+
`
|
|
309
343
|
Arguments:
|
|
310
344
|
name Name of a configured MCP server to authenticate with
|
|
311
345
|
|
|
@@ -324,79 +358,79 @@ automatically. You can also run 'vellum mcp reload' to apply immediately.
|
|
|
324
358
|
Examples:
|
|
325
359
|
$ assistant mcp auth my-server
|
|
326
360
|
$ assistant mcp auth remote-api`,
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
361
|
+
)
|
|
362
|
+
.action(async (name: string) => {
|
|
363
|
+
// IPC-first path — attempt daemon-orchestrated flow (works on hosted assistants)
|
|
364
|
+
const startResult = await cliIpcCall<{
|
|
365
|
+
auth_url: string;
|
|
366
|
+
state: string;
|
|
367
|
+
already_authenticated?: boolean;
|
|
368
|
+
}>("internal_mcp_auth_start", { body: { serverId: name } });
|
|
369
|
+
|
|
370
|
+
if (startResult.ok && startResult.result?.already_authenticated) {
|
|
371
|
+
log.info(`Server "${name}" is already authenticated.`);
|
|
372
|
+
process.exit(0);
|
|
373
|
+
return;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
if (startResult.ok && startResult.result?.auth_url) {
|
|
377
|
+
const authUrl = startResult.result.auth_url;
|
|
378
|
+
log.info(`Opening browser for "${name}" OAuth authorization...`);
|
|
379
|
+
openInHostBrowser(authUrl);
|
|
380
|
+
log.info(`If the browser did not open, visit:\n${authUrl}`);
|
|
381
|
+
log.info(
|
|
382
|
+
"Waiting for authorization in browser... (press Ctrl+C to cancel)",
|
|
383
|
+
);
|
|
384
|
+
|
|
385
|
+
const finalStatus = await pollMcpAuthStatus(name, {
|
|
386
|
+
intervalMs: 2_000,
|
|
387
|
+
timeoutMs: 150_000, // matches existing OAUTH_TIMEOUT_MS
|
|
388
|
+
});
|
|
389
|
+
|
|
390
|
+
if (finalStatus.status === "complete") {
|
|
391
|
+
log.info(`Authentication successful for "${name}".`);
|
|
392
|
+
log.info(
|
|
393
|
+
"The running assistant has picked up this change automatically.",
|
|
394
|
+
);
|
|
395
|
+
process.exit(0);
|
|
396
|
+
return;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
const errMsg = finalStatus.error ?? "Unknown error";
|
|
400
|
+
if (errMsg.includes("denied") || errMsg.includes("cancelled")) {
|
|
401
|
+
log.error(`Authorization cancelled for "${name}".`);
|
|
402
|
+
} else if (errMsg.includes("timed out")) {
|
|
403
|
+
log.error(
|
|
404
|
+
`Authorization timed out for "${name}". Try again with: assistant mcp auth ${name}`,
|
|
405
|
+
);
|
|
406
|
+
} else {
|
|
407
|
+
log.error(`OAuth failed for "${name}": ${errMsg}`);
|
|
408
|
+
}
|
|
409
|
+
process.exitCode = 1;
|
|
410
|
+
return;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
// Any !startResult.ok case: surface error and exit 1
|
|
414
|
+
const ipcErrMsg = startResult.error ?? "Unknown error";
|
|
415
|
+
if (
|
|
416
|
+
ipcErrMsg.startsWith("Could not connect to assistant daemon") ||
|
|
417
|
+
ipcErrMsg.startsWith("Unknown method:")
|
|
418
|
+
) {
|
|
419
|
+
log.error(
|
|
420
|
+
`MCP OAuth requires the assistant to be running. Is it running?`,
|
|
421
|
+
);
|
|
422
|
+
} else {
|
|
423
|
+
log.error(`MCP OAuth failed via assistant: ${ipcErrMsg}`);
|
|
424
|
+
}
|
|
425
|
+
process.exitCode = 1;
|
|
354
426
|
});
|
|
355
427
|
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
return;
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
const errMsg = finalStatus.error ?? "Unknown error";
|
|
366
|
-
if (errMsg.includes("denied") || errMsg.includes("cancelled")) {
|
|
367
|
-
log.error(`Authorization cancelled for "${name}".`);
|
|
368
|
-
} else if (errMsg.includes("timed out")) {
|
|
369
|
-
log.error(
|
|
370
|
-
`Authorization timed out for "${name}". Try again with: assistant mcp auth ${name}`,
|
|
371
|
-
);
|
|
372
|
-
} else {
|
|
373
|
-
log.error(`OAuth failed for "${name}": ${errMsg}`);
|
|
374
|
-
}
|
|
375
|
-
process.exitCode = 1;
|
|
376
|
-
return;
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
// Any !startResult.ok case: surface error and exit 1
|
|
380
|
-
const ipcErrMsg = startResult.error ?? "Unknown error";
|
|
381
|
-
if (
|
|
382
|
-
ipcErrMsg.startsWith("Could not connect to assistant daemon") ||
|
|
383
|
-
ipcErrMsg.startsWith("Unknown method:")
|
|
384
|
-
) {
|
|
385
|
-
log.error(
|
|
386
|
-
`MCP OAuth requires the assistant to be running. Is it running?`,
|
|
387
|
-
);
|
|
388
|
-
} else {
|
|
389
|
-
log.error(`MCP OAuth failed via assistant: ${ipcErrMsg}`);
|
|
390
|
-
}
|
|
391
|
-
process.exitCode = 1;
|
|
392
|
-
});
|
|
393
|
-
|
|
394
|
-
mcp
|
|
395
|
-
.command("remove <name>")
|
|
396
|
-
.description("Remove an MCP server configuration")
|
|
397
|
-
.addHelpText(
|
|
398
|
-
"after",
|
|
399
|
-
`
|
|
428
|
+
mcp
|
|
429
|
+
.command("remove <name>")
|
|
430
|
+
.description("Remove an MCP server configuration")
|
|
431
|
+
.addHelpText(
|
|
432
|
+
"after",
|
|
433
|
+
`
|
|
400
434
|
Arguments:
|
|
401
435
|
name Name of the MCP server to remove
|
|
402
436
|
|
|
@@ -411,25 +445,25 @@ can also run 'vellum mcp reload' to apply immediately.
|
|
|
411
445
|
Examples:
|
|
412
446
|
$ assistant mcp remove my-server
|
|
413
447
|
$ assistant mcp remove legacy-sse`,
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
448
|
+
)
|
|
449
|
+
.action(async (name: string) => {
|
|
450
|
+
const result = await cliIpcCall<{ removed: true }>(
|
|
451
|
+
"internal_mcp_remove",
|
|
452
|
+
{ body: { name } },
|
|
453
|
+
);
|
|
420
454
|
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
455
|
+
if (!result.ok) {
|
|
456
|
+
log.error(result.error ?? `Failed to remove MCP server "${name}".`);
|
|
457
|
+
process.exitCode = 1;
|
|
458
|
+
return;
|
|
459
|
+
}
|
|
426
460
|
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
461
|
+
log.info(`Removed MCP server "${name}".`);
|
|
462
|
+
log.info(
|
|
463
|
+
"The running assistant will pick up this change automatically. " +
|
|
464
|
+
"Or run 'vellum mcp reload' to apply now.",
|
|
465
|
+
);
|
|
466
|
+
});
|
|
433
467
|
},
|
|
434
468
|
});
|
|
435
469
|
}
|