@vellumai/assistant 0.10.2-dev.202606250318.5e7cfb0 → 0.10.2
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/bun.lock +0 -20
- package/docs/workspace-tools.md +33 -42
- package/eslint-rules/cli-no-daemon-internals.js +0 -6
- package/node_modules/@vellumai/gateway-client/src/__tests__/trust-verdict-contract.test.ts +0 -31
- package/node_modules/@vellumai/gateway-client/src/gateway-ipc-contracts.ts +0 -44
- package/node_modules/@vellumai/gateway-client/src/index.ts +0 -14
- package/node_modules/@vellumai/gateway-client/src/trust-verdict-contract.ts +0 -17
- package/node_modules/@vellumai/service-contracts/package.json +0 -1
- package/node_modules/@vellumai/service-contracts/src/index.ts +0 -1
- package/openapi.yaml +0 -155
- package/package.json +1 -4
- package/scripts/test.sh +15 -36
- package/src/__tests__/actor-token-service.test.ts +14 -36
- package/src/__tests__/agent-loop-override-profile.test.ts +0 -1
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +0 -2
- package/src/__tests__/agent-wake-override-profile.test.ts +0 -2
- package/src/__tests__/annotate-activity-metadata.test.ts +0 -2
- package/src/__tests__/annotate-risk-options.test.ts +0 -2
- package/src/__tests__/approval-cascade.test.ts +0 -2
- package/src/__tests__/assistant-attachments.test.ts +0 -42
- package/src/__tests__/background-workers-disk-pressure.test.ts +0 -2
- package/src/__tests__/btw-routes.test.ts +0 -2
- package/src/__tests__/build-persisted-content.test.ts +0 -2
- package/src/__tests__/call-controller.test.ts +0 -19
- package/src/__tests__/channel-guardian.test.ts +58 -94
- package/src/__tests__/channel-reply-delivery.test.ts +0 -2
- package/src/__tests__/compaction-events.test.ts +0 -2
- package/src/__tests__/compaction.benchmark.test.ts +0 -2
- package/src/__tests__/compactor-call-site-logging.test.ts +0 -2
- package/src/__tests__/compactor-low-watermark-cut.test.ts +0 -2
- package/src/__tests__/compactor-preserved-tail-count.test.ts +0 -2
- package/src/__tests__/compactor-summary-call-truncation.test.ts +0 -2
- package/src/__tests__/compactor-web-search-strip.test.ts +0 -2
- package/src/__tests__/config-loader-backfill.test.ts +10 -123
- package/src/__tests__/config-schema.test.ts +0 -1
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +29 -31
- package/src/__tests__/contacts-relay-reads.test.ts +15 -13
- package/src/__tests__/conversation-abort-tool-results.test.ts +0 -2
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +0 -2
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +0 -2
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +0 -2
- package/src/__tests__/conversation-agent-loop.test.ts +0 -134
- package/src/__tests__/conversation-analysis-routes.test.ts +0 -2
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +0 -2
- package/src/__tests__/conversation-confirmation-signals.test.ts +0 -2
- package/src/__tests__/conversation-history-web-search.test.ts +0 -2
- package/src/__tests__/conversation-load-history-repair.test.ts +0 -2
- package/src/__tests__/conversation-load-history-stripped.test.ts +0 -2
- package/src/__tests__/conversation-pairing.test.ts +0 -2
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +0 -2
- package/src/__tests__/conversation-process-callsite.test.ts +0 -2
- package/src/__tests__/conversation-provider-retry-repair.test.ts +0 -2
- package/src/__tests__/conversation-queue.test.ts +0 -91
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +0 -14
- package/src/__tests__/conversation-routes-slash-commands.test.ts +0 -14
- package/src/__tests__/conversation-slash-queue.test.ts +0 -2
- package/src/__tests__/conversation-slash-unknown.test.ts +0 -2
- package/src/__tests__/conversation-speed-override.test.ts +0 -2
- package/src/__tests__/conversation-surfaces-task-progress.test.ts +0 -29
- package/src/__tests__/conversation-title-service.test.ts +0 -2
- package/src/__tests__/conversation-tool-setup-attribution.test.ts +0 -47
- package/src/__tests__/conversation-usage.test.ts +0 -2
- package/src/__tests__/conversation-workspace-cache-state.test.ts +0 -2
- package/src/__tests__/conversation-workspace-injection.test.ts +0 -2
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +0 -2
- package/src/__tests__/credential-security-invariants.test.ts +1 -1
- package/src/__tests__/db-migration-rollback.test.ts +171 -205
- package/src/__tests__/db-test-helpers.ts +4 -5
- package/src/__tests__/deterministic-verification-control-plane.test.ts +2 -4
- package/src/__tests__/disk-pressure-guard.test.ts +0 -41
- package/src/__tests__/dm-persistence.test.ts +0 -2
- package/src/__tests__/emit-signal-routing-intent.test.ts +5 -10
- package/src/__tests__/events-dev-bypass-actor.test.ts +1 -7
- package/src/__tests__/exploration-drift-hook.test.ts +2 -3
- package/src/__tests__/filing-service.test.ts +0 -2
- package/src/__tests__/guardian-binding-drift-heal.test.ts +10 -75
- package/src/__tests__/guardian-dispatch.test.ts +1 -95
- package/src/__tests__/guardian-outbound-http.test.ts +0 -13
- package/src/__tests__/heartbeat-disk-pressure.test.ts +0 -2
- package/src/__tests__/heartbeat-service.test.ts +0 -2
- package/src/__tests__/helpers/channel-test-adapter.ts +7 -1
- package/src/__tests__/host-app-control-routes.test.ts +30 -24
- package/src/__tests__/host-bash-routes.test.ts +41 -31
- package/src/__tests__/host-browser-routes.test.ts +32 -26
- package/src/__tests__/host-cu-routes-targeted.test.ts +33 -25
- package/src/__tests__/host-file-routes-targeted.test.ts +52 -40
- package/src/__tests__/host-transfer-routes-targeted.test.ts +43 -31
- package/src/__tests__/http-user-message-parity.test.ts +8 -290
- package/src/__tests__/inbound-invite-redemption.test.ts +0 -28
- package/src/__tests__/inbound-slack-persistence.test.ts +0 -2
- package/src/__tests__/invite-redemption-service.test.ts +0 -198
- package/src/__tests__/llm-context-normalization.test.ts +0 -105
- package/src/__tests__/llm-request-log-error-payload.test.ts +9 -71
- package/src/__tests__/llm-usage-store.test.ts +0 -25
- package/src/__tests__/mcp-health-check.test.ts +1 -2
- package/src/__tests__/media-stream-server-integration.test.ts +0 -127
- package/src/__tests__/memory-retrieval-hook.test.ts +0 -2
- package/src/__tests__/messaging-send-tool.test.ts +0 -2
- package/src/__tests__/migration-import-from-url.test.ts +2 -2
- package/src/__tests__/mtime-cache.test.ts +5 -146
- package/src/__tests__/native-web-search.test.ts +0 -2
- package/src/__tests__/non-member-access-request.test.ts +17 -189
- package/src/__tests__/notification-broadcaster.test.ts +0 -4
- package/src/__tests__/notification-decision-recipient-context.test.ts +32 -33
- package/src/__tests__/notification-deep-link.test.ts +0 -6
- package/src/__tests__/notification-guardian-path.test.ts +0 -19
- package/src/__tests__/openai-provider.test.ts +12 -22
- package/src/__tests__/openai-responses-provider.test.ts +2 -12
- package/src/__tests__/outbound-slack-persistence.test.ts +0 -2
- package/src/__tests__/pending-interactions-resolved-event.test.ts +4 -7
- package/src/__tests__/persistence-secret-redaction.test.ts +0 -2
- package/src/__tests__/plugin-bootstrap.test.ts +73 -3
- package/src/__tests__/plugin-route-contribution.test.ts +17 -4
- package/src/__tests__/plugin-tool-contribution.test.ts +18 -3
- package/src/__tests__/plugin-types.test.ts +2 -0
- package/src/__tests__/process-message-background-slack.test.ts +0 -2
- package/src/__tests__/process-message-display-content.test.ts +0 -2
- package/src/__tests__/provider-error-scenarios.test.ts +4 -5
- package/src/__tests__/provider-usage-tracking.test.ts +0 -39
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +0 -2
- package/src/__tests__/registry.test.ts +1 -4
- package/src/__tests__/relay-server.test.ts +25 -694
- package/src/__tests__/runtime-attachment-metadata.test.ts +1 -0
- package/src/__tests__/secret-ingress-http.test.ts +0 -14
- package/src/__tests__/send-endpoint-busy.test.ts +8 -30
- package/src/__tests__/skills.test.ts +0 -44
- package/src/__tests__/slack-inbound-verification.test.ts +2 -47
- package/src/__tests__/stt-hints.test.ts +13 -44
- package/src/__tests__/subagent-detail.test.ts +0 -27
- package/src/__tests__/subagent-disposal.test.ts +0 -65
- package/src/__tests__/subagent-notify-parent.test.ts +0 -2
- package/src/__tests__/subagent-role-registry.test.ts +2 -7
- package/src/__tests__/subagent-spawn-tool-fork.test.ts +0 -2
- package/src/__tests__/subagent-tools.test.ts +0 -2
- package/src/__tests__/suggestion-routes.test.ts +0 -2
- package/src/__tests__/title-generate-hook.test.ts +0 -2
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +0 -2
- package/src/__tests__/tool-executor.test.ts +11 -16
- package/src/__tests__/tool-preview-lifecycle.test.ts +0 -2
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +0 -2
- package/src/__tests__/tool-start-timestamp.test.ts +0 -2
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +10 -10
- package/src/__tests__/twilio-routes.test.ts +0 -96
- package/src/__tests__/ui-file-upload-surface.test.ts +0 -86
- package/src/__tests__/verification-control-plane-policy.test.ts +0 -2
- package/src/__tests__/voice-invite-redemption.test.ts +0 -33
- package/src/__tests__/web-search-backend-failure.test.ts +0 -2
- package/src/__tests__/workspace-migration-remove-hooks.test.ts +35 -14
- package/src/__tests__/workspace-tool-loader.test.ts +2 -195
- package/src/__tests__/workspace-tools-watcher-flag.test.ts +70 -0
- package/src/agent/loop.ts +0 -56
- package/src/api/index.ts +1 -19
- package/src/api/responses/llm-request-log-entry.ts +0 -29
- package/src/api/responses/subagent-detail.ts +0 -17
- package/src/api/surfaces.ts +3 -39
- package/src/approvals/guardian-request-resolvers.ts +11 -1
- package/src/calls/__tests__/relay-setup-router.test.ts +4 -262
- package/src/calls/call-domain.ts +3 -3
- package/src/calls/guardian-dispatch.ts +8 -10
- package/src/calls/inbound-trust-reader.ts +1 -17
- package/src/calls/media-stream-server.ts +0 -21
- package/src/calls/relay-server.ts +50 -167
- package/src/calls/relay-setup-router.ts +7 -37
- package/src/calls/relay-verification.ts +4 -4
- package/src/calls/stt-hints.ts +12 -9
- package/src/calls/twilio-routes.ts +4 -14
- package/src/channels/types.ts +20 -10
- package/src/cli/commands/__tests__/cache.test.ts +1 -8
- package/src/cli/commands/cache.ts +181 -194
- package/src/cli/commands/db/__tests__/repair.test.ts +5 -6
- package/src/cli/commands/db/status.ts +1 -37
- package/src/cli/commands/mcp.ts +218 -252
- package/src/cli/commands/memory/index.ts +0 -2
- package/src/cli/commands/plugins.ts +3 -75
- package/src/cli/lib/__tests__/install-from-github.test.ts +0 -102
- package/src/cli/lib/__tests__/list-installed-plugins.test.ts +1 -160
- package/src/cli/lib/list-installed-plugins.ts +1 -179
- package/src/config/__tests__/sync-gated-profiles.test.ts +3 -11
- package/src/config/bundled-skills/contacts/tools/contact-merge.ts +17 -27
- package/src/config/bundled-skills/contacts/tools/contact-search.ts +3 -13
- package/src/config/bundled-skills/subagent/SKILL.md +1 -1
- package/src/config/bundled-skills/subagent/TOOLS.json +1 -1
- package/src/config/feature-flag-registry.json +13 -5
- package/src/config/loader.ts +5 -38
- package/src/config/schemas/__tests__/memory-v3.test.ts +0 -1
- package/src/config/schemas/memory-lifecycle.ts +0 -12
- package/src/config/schemas/memory-v3.ts +0 -7
- package/src/config/schemas/memory.ts +0 -4
- package/src/config/schemas/timeouts.ts +0 -8
- package/src/config/seed-inference-profiles.ts +11 -21
- package/src/config/skills.ts +5 -27
- package/src/config/sync-gated-profiles.ts +13 -12
- package/src/contacts/contacts-write.ts +0 -3
- package/src/daemon/assistant-attachments.ts +4 -27
- package/src/daemon/conversation-agent-loop.ts +0 -28
- package/src/daemon/conversation-process.ts +16 -35
- package/src/daemon/conversation-surfaces.ts +38 -111
- package/src/daemon/conversation-tool-setup.ts +16 -50
- package/src/daemon/conversation.ts +1 -13
- package/src/daemon/disk-pressure-guard.ts +2 -12
- package/src/daemon/event-loop-watchdog.ts +1 -28
- package/src/daemon/external-plugins-bootstrap.ts +34 -4
- package/src/daemon/handlers/__tests__/config-a2a-redeem.test.ts +0 -25
- package/src/daemon/handlers/config-a2a.ts +14 -6
- package/src/daemon/handlers/config-channels.ts +22 -78
- package/src/daemon/handlers/conversations.ts +0 -77
- package/src/daemon/lifecycle.ts +0 -4
- package/src/daemon/mcp-reload-service.ts +0 -10
- package/src/daemon/memory-v2-startup.test.ts +0 -72
- package/src/daemon/memory-v2-startup.ts +19 -87
- package/src/daemon/message-types/conversations.ts +0 -2
- package/src/daemon/message-types/surfaces.ts +12 -12
- package/src/daemon/server.ts +4 -0
- package/src/daemon/shutdown-handlers.ts +0 -20
- package/src/daemon/tool-setup-types.ts +0 -9
- package/src/daemon/workspace-tools-watcher.ts +328 -0
- package/src/ipc/__tests__/clients-list-ipc.test.ts +1 -1
- package/src/ipc/assistant-server.ts +2 -2
- package/src/mcp/__tests__/mcp-auth-orchestrator.test.ts +0 -1
- package/src/mcp/client.ts +1 -15
- package/src/mcp/mcp-auth-orchestrator.ts +1 -6
- package/src/mcp/mcp-oauth-provider.ts +8 -19
- package/src/memory/__tests__/memory-retrospective-job.test.ts +0 -8
- package/src/memory/conversation-crud.ts +0 -38
- package/src/memory/db-connection.ts +3 -22
- package/src/memory/db-init.ts +502 -36
- package/src/memory/db-singleton.ts +4 -6
- package/src/memory/jobs-worker.ts +0 -58
- package/src/memory/llm-request-log-store.ts +1 -26
- package/src/memory/llm-usage-store.ts +20 -48
- package/src/memory/memory-retrospective-job.ts +8 -9
- package/src/memory/migrations/209-strip-thinking-from-consolidated.ts +56 -130
- package/src/memory/migrations/__tests__/run-migrations.test.ts +2 -2
- package/src/memory/migrations/registry.ts +573 -0
- package/src/memory/migrations/run-migrations.ts +6 -90
- package/src/memory/migrations/validate-migration-state.ts +66 -101
- package/src/memory/schema/conversations.ts +0 -9
- package/src/memory/schema/infrastructure.ts +0 -20
- package/src/memory/v2/__tests__/cli-command-store.test.ts +0 -25
- package/src/memory/v2/__tests__/skill-store.test.ts +0 -80
- package/src/memory/v2/cli-command-store.ts +38 -75
- package/src/memory/v2/prompts/consolidation.ts +82 -13
- package/src/memory/v2/prompts/router.ts +93 -21
- package/src/memory/v2/skill-store.ts +31 -68
- package/src/notifications/__tests__/broadcaster.test.ts +8 -16
- package/src/notifications/__tests__/decision-engine.test.ts +9 -78
- package/src/notifications/broadcaster.ts +1 -8
- package/src/notifications/decision-engine.ts +7 -15
- package/src/notifications/destination-resolver.ts +24 -68
- package/src/notifications/emit-signal.ts +14 -39
- package/src/permissions/question-prompter.test.ts +1 -1
- package/src/permissions/question-prompter.ts +4 -7
- package/src/plugin-api/index.ts +6 -6
- package/src/plugin-api/types.ts +5 -3
- package/src/plugin-api/vision-support.test.ts +4 -28
- package/src/plugin-api/vision-support.ts +31 -66
- package/src/plugins/defaults/advisor/__tests__/consult.test.ts +0 -161
- package/src/plugins/defaults/advisor/consult.ts +6 -110
- package/src/plugins/defaults/advisor/steering.ts +2 -14
- package/src/plugins/defaults/advisor/tools/advisor.ts +5 -32
- package/src/plugins/defaults/exploration-drift/hooks/post-tool-use.ts +1 -2
- package/src/plugins/defaults/image-fallback/__tests__/image-fallback.test.ts +7 -47
- package/src/plugins/defaults/image-fallback/hooks/post-tool-use.ts +11 -10
- package/src/plugins/defaults/image-fallback/hooks/user-prompt-submit.ts +20 -12
- package/src/plugins/defaults/image-fallback/src/caption-blocks.ts +11 -42
- package/src/plugins/defaults/memory-v3-shadow/__tests__/injection.test.ts +3 -33
- package/src/plugins/defaults/memory-v3-shadow/__tests__/pool-select.test.ts +4 -48
- package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-plugin.test.ts +8 -4
- package/src/plugins/defaults/memory-v3-shadow/injector.ts +15 -43
- package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +2 -11
- package/src/plugins/defaults/memory-v3-shadow/pool-select.ts +13 -77
- package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +11 -12
- package/src/plugins/mtime-cache.ts +291 -76
- package/src/plugins/pipeline.ts +13 -111
- package/src/plugins/types.ts +2 -0
- package/src/providers/anthropic/client.ts +0 -5
- package/src/providers/call-site-routing.ts +0 -4
- package/src/providers/model-catalog.ts +0 -16
- package/src/providers/openai/__tests__/api-error-detail.test.ts +120 -0
- package/src/providers/openai/chat-completions-provider.ts +83 -37
- package/src/providers/openai/responses-provider.ts +46 -50
- package/src/providers/openrouter/client.ts +0 -5
- package/src/providers/provider-send-message.ts +0 -4
- package/src/providers/ratelimit.ts +0 -4
- package/src/providers/retry.ts +0 -4
- package/src/providers/types.ts +0 -9
- package/src/providers/usage-tracking.ts +0 -4
- package/src/runtime/__tests__/trust-verdict-consumer.test.ts +3 -335
- package/src/runtime/access-request-helper.ts +39 -19
- package/src/runtime/actor-trust-resolver.ts +2 -2
- package/src/runtime/assistant-event-hub.ts +1 -1
- package/src/runtime/assistant-stream-state.ts +2 -9
- package/src/runtime/auth/require-bound-guardian.ts +11 -21
- package/src/runtime/channel-verification-service.ts +31 -56
- package/src/runtime/confirmation-request-guardian-bridge.ts +3 -3
- package/src/runtime/guardian-vellum-migration.ts +7 -66
- package/src/runtime/invite-redemption-service.ts +187 -198
- package/src/runtime/local-actor-identity.ts +11 -76
- package/src/runtime/pending-interactions.ts +1 -11
- package/src/runtime/routes/__tests__/channel-verification-revoke.test.ts +5 -56
- package/src/runtime/routes/__tests__/channel-verification-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/surface-action-routes.test.ts +0 -187
- package/src/runtime/routes/browser-routes.ts +1 -1
- package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +5 -13
- package/src/runtime/routes/channel-verification-routes.ts +3 -3
- package/src/runtime/routes/contact-routes.ts +32 -8
- package/src/runtime/routes/conversation-cli-routes.ts +5 -4
- package/src/runtime/routes/conversation-list-routes.ts +7 -4
- package/src/runtime/routes/conversation-query-routes.ts +0 -72
- package/src/runtime/routes/conversation-routes.ts +85 -84
- package/src/runtime/routes/events-routes.ts +2 -2
- package/src/runtime/routes/global-search-routes.ts +1 -3
- package/src/runtime/routes/guardian-action-routes.ts +5 -4
- package/src/runtime/routes/host-app-control-routes.ts +4 -5
- package/src/runtime/routes/host-bash-routes.ts +4 -5
- package/src/runtime/routes/host-browser-routes.ts +11 -9
- package/src/runtime/routes/host-cu-routes.ts +4 -5
- package/src/runtime/routes/host-file-routes.ts +4 -5
- 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 +2 -3
- package/src/runtime/routes/inbound-message-handler.ts +5 -5
- package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +5 -97
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +49 -61
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +4 -16
- package/src/runtime/routes/inbound-stages/escalation-intercept.ts +7 -7
- package/src/runtime/routes/inbound-stages/guardian-activation-intercept.test.ts +8 -21
- package/src/runtime/routes/inbound-stages/guardian-activation-intercept.ts +3 -14
- package/src/runtime/routes/index.ts +0 -2
- package/src/runtime/routes/llm-context-normalization.ts +0 -83
- package/src/runtime/routes/mcp-auth-routes.ts +19 -171
- package/src/runtime/routes/migration-rollback-routes.ts +3 -4
- package/src/runtime/routes/migration-routes.ts +1 -4
- package/src/runtime/routes/subagents-routes.ts +0 -5
- package/src/runtime/routes/surface-action-routes.ts +56 -42
- package/src/runtime/services/__tests__/conversation-serializer.test.ts +0 -1
- package/src/runtime/services/conversation-serializer.ts +9 -7
- package/src/runtime/tool-grant-request-helper.ts +3 -3
- package/src/runtime/trust-verdict-consumer.ts +9 -85
- package/src/runtime/verification-outbound-actions.ts +18 -18
- package/src/signals/user-message.ts +0 -16
- package/src/subagent/manager.ts +0 -9
- package/src/subagent/types.ts +3 -3
- package/src/telemetry/types.ts +1 -34
- package/src/telemetry/usage-telemetry-reporter.test.ts +2 -3
- package/src/telemetry/usage-telemetry-reporter.ts +3 -87
- package/src/tools/ask-question/ask-question-tool.test.ts +0 -29
- package/src/tools/ask-question/ask-question-tool.ts +0 -13
- package/src/tools/executor.ts +4 -4
- package/src/tools/registry.ts +0 -18
- package/src/tools/shared/filesystem/path-policy.ts +5 -12
- package/src/tools/tool-approval-handler.ts +1 -1
- package/src/tools/tool-defaults.ts +2 -9
- package/src/tools/tool-manifest.ts +0 -3
- package/src/tools/types.ts +2 -17
- package/src/tools/workspace-tools/loader.ts +244 -348
- package/src/util/errors.ts +1 -26
- package/src/util/platform.ts +0 -5
- package/src/workflows/library.test.ts +0 -140
- package/src/workflows/library.ts +28 -82
- package/src/workspace/migrations/017-seed-persona-dirs.ts +34 -3
- package/src/workspace/migrations/019-scope-journal-to-guardian.ts +24 -3
- package/src/workspace/migrations/048-remove-workspace-hooks.ts +66 -14
- package/src/workspace/migrations/registry.ts +0 -2
- package/node_modules/@vellumai/gateway-client/src/__tests__/guardian-delivery-contract.test.ts +0 -91
- package/node_modules/@vellumai/gateway-client/src/guardian-delivery-contract.ts +0 -48
- package/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +0 -28
- package/node_modules/@vellumai/service-contracts/src/channels.ts +0 -41
- package/src/__tests__/code-search-tool.test.ts +0 -585
- package/src/__tests__/guardian-expiry-notifier.test.ts +0 -282
- package/src/__tests__/mcp-config-secret-boundary.test.ts +0 -390
- package/src/__tests__/plugin-pipeline.test.ts +0 -96
- package/src/__tests__/sse-actor-principal-guardian-source.test.ts +0 -102
- package/src/__tests__/steer-on-enqueue-question.test.ts +0 -181
- package/src/__tests__/workspace-migration-111-prune-seeded-callsite-defaults.test.ts +0 -208
- package/src/agent/loop-exclusive-tool.test.ts +0 -150
- package/src/api/constants/sse-replay.ts +0 -41
- package/src/api/events/conversation-notice.ts +0 -26
- package/src/approvals/guardian-channel-delivery.ts +0 -30
- package/src/approvals/guardian-expiry-notifier.ts +0 -148
- package/src/cli/commands/memory/__tests__/worker.test.ts +0 -302
- package/src/cli/commands/memory/worker.ts +0 -175
- package/src/config/__tests__/loader-callsite-strip-fallback.test.ts +0 -143
- package/src/config/prune-seeded-callsite-defaults.ts +0 -110
- package/src/contacts/__tests__/contacts-write-revoke-relay.test.ts +0 -129
- package/src/contacts/__tests__/guardian-delivery-reader.test.ts +0 -312
- package/src/contacts/__tests__/member-write-relay.test.ts +0 -202
- package/src/contacts/guardian-delivery-reader.ts +0 -223
- package/src/contacts/member-write-relay.ts +0 -189
- package/src/daemon/conversation-notices.ts +0 -60
- package/src/daemon/handlers/__tests__/config-channels.test.ts +0 -225
- package/src/hooks/hook-loader.ts +0 -341
- package/src/mcp/mcp-header-store.ts +0 -134
- package/src/memory/__tests__/301-create-watchdog-events.test.ts +0 -110
- package/src/memory/__tests__/prompt-override.test.ts +0 -192
- package/src/memory/__tests__/watchdog-events-store.test.ts +0 -161
- package/src/memory/migrations/300-add-processing-started-at.ts +0 -30
- package/src/memory/migrations/301-create-watchdog-events.ts +0 -45
- package/src/memory/migrations/__tests__/209-strip-thinking-from-consolidated.test.ts +0 -224
- package/src/memory/prompt-override.ts +0 -129
- package/src/memory/steps.ts +0 -573
- package/src/memory/watchdog-events-store.ts +0 -87
- package/src/memory/worker-control.ts +0 -118
- package/src/memory/worker-process.ts +0 -72
- package/src/notifications/__tests__/connected-channels.test.ts +0 -114
- package/src/notifications/__tests__/destination-resolver.test.ts +0 -256
- package/src/onboarding/checkin-event.test.ts +0 -222
- package/src/onboarding/checkin-event.ts +0 -321
- package/src/onboarding/schedule-checkin.ts +0 -190
- package/src/plugins/defaults/advisor/__tests__/context-pack-gating.test.ts +0 -106
- package/src/plugins/defaults/advisor/__tests__/context-pack.test.ts +0 -60
- package/src/plugins/defaults/advisor/context-pack.ts +0 -288
- package/src/plugins/defaults/memory-v3-shadow/pool-select.test.ts +0 -146
- package/src/plugins/surface-import.ts +0 -121
- package/src/providers/openai/__tests__/api-error-normalization.test.ts +0 -321
- package/src/providers/openai/api-error-normalization.ts +0 -270
- package/src/runtime/__tests__/channel-verification-service.test.ts +0 -133
- package/src/runtime/__tests__/guardian-vellum-migration.test.ts +0 -181
- package/src/runtime/__tests__/is-guardian-bound-for-channel.test.ts +0 -66
- package/src/runtime/__tests__/local-principal-trust.test.ts +0 -164
- package/src/runtime/anchored-guardian.test.ts +0 -156
- package/src/runtime/anchored-guardian.ts +0 -135
- package/src/runtime/auth/__tests__/require-bound-guardian.test.ts +0 -99
- package/src/runtime/local-principal-trust.ts +0 -52
- package/src/runtime/routes/__tests__/contact-routes.test.ts +0 -212
- package/src/runtime/routes/__tests__/global-search-routes.test.ts +0 -93
- package/src/runtime/routes/onboarding-checkin-routes.ts +0 -86
- package/src/tools/filesystem/search.ts +0 -543
- package/src/util/telemetry-db-path.ts +0 -24
- package/src/workspace/migrations/111-prune-seeded-callsite-defaults.ts +0 -134
package/src/cli/commands/mcp.ts
CHANGED
|
@@ -109,9 +109,10 @@ 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
|
-
|
|
112
|
+
|
|
113
|
+
mcp.addHelpText(
|
|
114
|
+
"after",
|
|
115
|
+
`
|
|
115
116
|
MCP servers extend the assistant's capabilities with external tools. Servers
|
|
116
117
|
are configured in the assistant's config.json under the mcp.servers key. Each
|
|
117
118
|
server uses one of three transport types:
|
|
@@ -128,15 +129,15 @@ Examples:
|
|
|
128
129
|
$ assistant mcp add my-server -t stdio -c npx -a my-mcp-server
|
|
129
130
|
$ assistant mcp auth my-server
|
|
130
131
|
$ assistant mcp remove my-server`,
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
mcp
|
|
135
|
+
.command("list")
|
|
136
|
+
.description("List configured MCP servers and their status")
|
|
137
|
+
.option("--json", "Output as JSON")
|
|
138
|
+
.addHelpText(
|
|
139
|
+
"after",
|
|
140
|
+
`
|
|
140
141
|
Shows each configured MCP server with its current status and configuration:
|
|
141
142
|
|
|
142
143
|
Name The server identifier used in config.json
|
|
@@ -156,49 +157,49 @@ list including health status.
|
|
|
156
157
|
Examples:
|
|
157
158
|
$ assistant mcp list
|
|
158
159
|
$ assistant mcp list --json`,
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
160
|
+
)
|
|
161
|
+
.action(async (opts: { json?: boolean }) => {
|
|
162
|
+
const result = await cliIpcCall<{ servers: McpServerEntry[] }>(
|
|
163
|
+
"internal_mcp_list",
|
|
164
|
+
);
|
|
164
165
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
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
|
-
}
|
|
166
|
+
if (!result.ok) {
|
|
167
|
+
return exitFromIpcResult({
|
|
168
|
+
ok: false,
|
|
169
|
+
error: result.error,
|
|
170
|
+
statusCode: result.statusCode,
|
|
194
171
|
});
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
const servers = result.result?.servers ?? [];
|
|
175
|
+
|
|
176
|
+
if (servers.length === 0) {
|
|
177
|
+
if (opts.json) {
|
|
178
|
+
process.stdout.write(JSON.stringify([], null, 2) + "\n");
|
|
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
|
+
`
|
|
202
203
|
Signals the running assistant to disconnect and reconnect all MCP servers
|
|
203
204
|
using the current configuration from disk. Active sessions pick up new tools
|
|
204
205
|
on their next turn automatically. The assistant must be running.
|
|
@@ -207,49 +208,40 @@ Examples:
|
|
|
207
208
|
$ vellum mcp reload
|
|
208
209
|
$ vellum mcp reload # after editing config.json to add a new server
|
|
209
210
|
$ vellum mcp reload # after running "vellum mcp auth <server>"`,
|
|
210
|
-
|
|
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
|
-
acc.push(val);
|
|
245
|
-
return acc;
|
|
246
|
-
},
|
|
247
|
-
[] as string[],
|
|
248
|
-
)
|
|
249
|
-
.option("--disabled", "Add as disabled")
|
|
250
|
-
.addHelpText(
|
|
251
|
-
"after",
|
|
252
|
-
`
|
|
211
|
+
)
|
|
212
|
+
.action(async () => {
|
|
213
|
+
const result = await cliIpcCall("internal_mcp_reload", { body: {} });
|
|
214
|
+
if (!result.ok) {
|
|
215
|
+
log.warn(
|
|
216
|
+
`Could not signal reload: ${result.error}. ` +
|
|
217
|
+
`Run 'assistant mcp reload' once the assistant is up.`,
|
|
218
|
+
);
|
|
219
|
+
} else {
|
|
220
|
+
log.info(
|
|
221
|
+
"MCP reload signal sent. The running assistant will reconnect servers shortly.",
|
|
222
|
+
);
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
mcp
|
|
227
|
+
.command("add <name>")
|
|
228
|
+
.description("Add an MCP server configuration")
|
|
229
|
+
.requiredOption(
|
|
230
|
+
"-t, --transport-type <type>",
|
|
231
|
+
"Transport type: stdio, sse, or streamable-http",
|
|
232
|
+
)
|
|
233
|
+
.option("-u, --url <url>", "Server URL (for sse/streamable-http)")
|
|
234
|
+
.option("-c, --command <cmd>", "Command to run (for stdio)")
|
|
235
|
+
.option("-a, --args <args...>", "Command arguments (for stdio)")
|
|
236
|
+
.option(
|
|
237
|
+
"-r, --risk <level>",
|
|
238
|
+
"Default risk level: low, medium, or high",
|
|
239
|
+
"high",
|
|
240
|
+
)
|
|
241
|
+
.option("--disabled", "Add as disabled")
|
|
242
|
+
.addHelpText(
|
|
243
|
+
"after",
|
|
244
|
+
`
|
|
253
245
|
Arguments:
|
|
254
246
|
name Unique identifier for the server (used as the key in config.json)
|
|
255
247
|
|
|
@@ -262,84 +254,58 @@ The --risk flag sets the default risk level for all tools from this server
|
|
|
262
254
|
(defaults to "high" if not specified). The server starts enabled unless
|
|
263
255
|
--disabled is passed.
|
|
264
256
|
|
|
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
|
-
|
|
269
257
|
If a server with the same name already exists, the command fails. Remove the
|
|
270
258
|
existing server first with "assistant mcp remove <name>".
|
|
271
259
|
|
|
272
260
|
Examples:
|
|
273
261
|
$ assistant mcp add my-server -t stdio -c npx -a my-mcp-server
|
|
274
262
|
$ assistant mcp add remote-api -t streamable-http -u https://api.example.com/mcp -r medium
|
|
275
|
-
$ assistant mcp add legacy-sse -t sse -u https://old.example.com/events --disabled
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
263
|
+
$ assistant mcp add legacy-sse -t sse -u https://old.example.com/events --disabled`,
|
|
264
|
+
)
|
|
265
|
+
.action(
|
|
266
|
+
async (
|
|
267
|
+
name: string,
|
|
268
|
+
opts: {
|
|
269
|
+
transportType: string;
|
|
270
|
+
url?: string;
|
|
271
|
+
command?: string;
|
|
272
|
+
args?: string[];
|
|
273
|
+
risk: string;
|
|
274
|
+
disabled?: boolean;
|
|
275
|
+
},
|
|
276
|
+
) => {
|
|
277
|
+
const result = await cliIpcCall<{ added: true }>(
|
|
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,
|
|
290
288
|
},
|
|
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.");
|
|
334
289
|
},
|
|
335
290
|
);
|
|
336
291
|
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
292
|
+
if (!result.ok) {
|
|
293
|
+
log.error(result.error ?? "Failed to add MCP server");
|
|
294
|
+
process.exitCode = 1;
|
|
295
|
+
return;
|
|
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
|
+
`
|
|
343
309
|
Arguments:
|
|
344
310
|
name Name of a configured MCP server to authenticate with
|
|
345
311
|
|
|
@@ -358,79 +324,79 @@ automatically. You can also run 'vellum mcp reload' to apply immediately.
|
|
|
358
324
|
Examples:
|
|
359
325
|
$ assistant mcp auth my-server
|
|
360
326
|
$ assistant mcp auth remote-api`,
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
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;
|
|
327
|
+
)
|
|
328
|
+
.action(async (name: string) => {
|
|
329
|
+
// IPC-first path — attempt daemon-orchestrated flow (works on hosted assistants)
|
|
330
|
+
const startResult = await cliIpcCall<{
|
|
331
|
+
auth_url: string;
|
|
332
|
+
state: string;
|
|
333
|
+
already_authenticated?: boolean;
|
|
334
|
+
}>("internal_mcp_auth_start", { body: { serverId: name } });
|
|
335
|
+
|
|
336
|
+
if (startResult.ok && startResult.result?.already_authenticated) {
|
|
337
|
+
log.info(`Server "${name}" is already authenticated.`);
|
|
338
|
+
process.exit(0);
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
if (startResult.ok && startResult.result?.auth_url) {
|
|
343
|
+
const authUrl = startResult.result.auth_url;
|
|
344
|
+
log.info(`Opening browser for "${name}" OAuth authorization...`);
|
|
345
|
+
openInHostBrowser(authUrl);
|
|
346
|
+
log.info(`If the browser did not open, visit:\n${authUrl}`);
|
|
347
|
+
log.info(
|
|
348
|
+
"Waiting for authorization in browser... (press Ctrl+C to cancel)",
|
|
349
|
+
);
|
|
350
|
+
|
|
351
|
+
const finalStatus = await pollMcpAuthStatus(name, {
|
|
352
|
+
intervalMs: 2_000,
|
|
353
|
+
timeoutMs: 150_000, // matches existing OAUTH_TIMEOUT_MS
|
|
426
354
|
});
|
|
427
355
|
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
356
|
+
if (finalStatus.status === "complete") {
|
|
357
|
+
log.info(`Authentication successful for "${name}".`);
|
|
358
|
+
log.info(
|
|
359
|
+
"The running assistant has picked up this change automatically.",
|
|
360
|
+
);
|
|
361
|
+
process.exit(0);
|
|
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
|
+
`
|
|
434
400
|
Arguments:
|
|
435
401
|
name Name of the MCP server to remove
|
|
436
402
|
|
|
@@ -445,25 +411,25 @@ can also run 'vellum mcp reload' to apply immediately.
|
|
|
445
411
|
Examples:
|
|
446
412
|
$ assistant mcp remove my-server
|
|
447
413
|
$ assistant mcp remove legacy-sse`,
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
414
|
+
)
|
|
415
|
+
.action(async (name: string) => {
|
|
416
|
+
const result = await cliIpcCall<{ removed: true }>(
|
|
417
|
+
"internal_mcp_remove",
|
|
418
|
+
{ body: { name } },
|
|
419
|
+
);
|
|
454
420
|
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
421
|
+
if (!result.ok) {
|
|
422
|
+
log.error(result.error ?? `Failed to remove MCP server "${name}".`);
|
|
423
|
+
process.exitCode = 1;
|
|
424
|
+
return;
|
|
425
|
+
}
|
|
460
426
|
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
427
|
+
log.info(`Removed MCP server "${name}".`);
|
|
428
|
+
log.info(
|
|
429
|
+
"The running assistant will pick up this change automatically. " +
|
|
430
|
+
"Or run 'vellum mcp reload' to apply now.",
|
|
431
|
+
);
|
|
432
|
+
});
|
|
467
433
|
},
|
|
468
434
|
});
|
|
469
435
|
}
|
|
@@ -4,7 +4,6 @@ import { registerCommand } from "../../lib/register-command.js";
|
|
|
4
4
|
import { registerMemoryRetrospectiveCommand } from "./memory-retrospective.js";
|
|
5
5
|
import { registerMemoryV2Command } from "./memory-v2.js";
|
|
6
6
|
import { registerMemoryV3Command } from "./memory-v3.js";
|
|
7
|
-
import { registerMemoryWorkerCommand } from "./worker.js";
|
|
8
7
|
|
|
9
8
|
export function registerMemoryCommand(program: Command): void {
|
|
10
9
|
registerCommand(program, {
|
|
@@ -28,7 +27,6 @@ Examples:
|
|
|
28
27
|
registerMemoryV2Command(memory);
|
|
29
28
|
registerMemoryV3Command(memory);
|
|
30
29
|
registerMemoryRetrospectiveCommand(memory);
|
|
31
|
-
registerMemoryWorkerCommand(memory);
|
|
32
30
|
},
|
|
33
31
|
});
|
|
34
32
|
}
|
|
@@ -29,11 +29,7 @@ import {
|
|
|
29
29
|
PluginAlreadyInstalledError,
|
|
30
30
|
PluginNotFoundError,
|
|
31
31
|
} from "../lib/install-from-github.js";
|
|
32
|
-
import {
|
|
33
|
-
type AllPluginInfo,
|
|
34
|
-
listAllPlugins,
|
|
35
|
-
listInstalledPlugins,
|
|
36
|
-
} from "../lib/list-installed-plugins.js";
|
|
32
|
+
import { listInstalledPlugins } from "../lib/list-installed-plugins.js";
|
|
37
33
|
import type { FingerprintComparison } from "../lib/plugin-fingerprint.js";
|
|
38
34
|
import {
|
|
39
35
|
DEFAULT_PIN_HISTORY_LIMIT,
|
|
@@ -89,8 +85,6 @@ Examples:
|
|
|
89
85
|
$ assistant plugins install example --pin <sha> --force
|
|
90
86
|
$ assistant plugins list
|
|
91
87
|
$ assistant plugins list --json
|
|
92
|
-
$ assistant plugins list --all
|
|
93
|
-
$ assistant plugins list --all --json
|
|
94
88
|
$ assistant plugins inspect example
|
|
95
89
|
$ assistant plugins inspect example --json
|
|
96
90
|
$ assistant plugins diff example
|
|
@@ -245,63 +239,9 @@ Examples:
|
|
|
245
239
|
|
|
246
240
|
plugins
|
|
247
241
|
.command("list")
|
|
248
|
-
.description(
|
|
249
|
-
"List plugins installed in your workspace.",
|
|
250
|
-
)
|
|
242
|
+
.description("List plugins installed under <workspaceDir>/plugins/")
|
|
251
243
|
.option("--json", "Emit machine-readable JSON instead of a table")
|
|
252
|
-
.
|
|
253
|
-
"--all",
|
|
254
|
-
"Include first-party default plugins and disabled plugins in the listing",
|
|
255
|
-
)
|
|
256
|
-
.action((opts: { json?: boolean; all?: boolean }) => {
|
|
257
|
-
if (opts.all) {
|
|
258
|
-
const all = listAllPlugins();
|
|
259
|
-
|
|
260
|
-
if (opts.json) {
|
|
261
|
-
process.stdout.write(JSON.stringify(all, null, 2) + "\n");
|
|
262
|
-
return;
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
if (all.length === 0) {
|
|
266
|
-
console.log("No plugins found.");
|
|
267
|
-
return;
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
const rows = all.map((p) => ({
|
|
271
|
-
name: p.name,
|
|
272
|
-
version: p.packageJson?.version ?? "—",
|
|
273
|
-
source: p.source,
|
|
274
|
-
status: formatAllPluginStatus(p),
|
|
275
|
-
}));
|
|
276
|
-
const nameW = Math.max(4, ...rows.map((r) => r.name.length));
|
|
277
|
-
const versionW = Math.max(7, ...rows.map((r) => r.version.length));
|
|
278
|
-
const sourceW = Math.max(6, ...rows.map((r) => r.source.length));
|
|
279
|
-
const pad = (s: string, w: number) =>
|
|
280
|
-
s + " ".repeat(w - s.length);
|
|
281
|
-
console.log(
|
|
282
|
-
`${pad("NAME", nameW)} ${pad("VERSION", versionW)} ${pad("SOURCE", sourceW)} STATUS`,
|
|
283
|
-
);
|
|
284
|
-
for (const r of rows) {
|
|
285
|
-
console.log(
|
|
286
|
-
`${pad(r.name, nameW)} ${pad(r.version, versionW)} ${pad(r.source, sourceW)} ${r.status}`,
|
|
287
|
-
);
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
const userCount = all.filter((p) => p.source === "user").length;
|
|
291
|
-
const defaultCount = all.length - userCount;
|
|
292
|
-
const disabledCount = all.filter((p) => p.disabled).length;
|
|
293
|
-
console.log("");
|
|
294
|
-
console.log(
|
|
295
|
-
`${all.length} plugin${all.length === 1 ? "" : "s"} ` +
|
|
296
|
-
`(${userCount} user, ${defaultCount} default` +
|
|
297
|
-
(disabledCount > 0
|
|
298
|
-
? `, ${disabledCount} disabled`
|
|
299
|
-
: "") +
|
|
300
|
-
`).`,
|
|
301
|
-
);
|
|
302
|
-
return;
|
|
303
|
-
}
|
|
304
|
-
|
|
244
|
+
.action((opts: { json?: boolean }) => {
|
|
305
245
|
const installed = listInstalledPlugins();
|
|
306
246
|
|
|
307
247
|
if (opts.json) {
|
|
@@ -817,18 +757,6 @@ function formatTimestamp(iso: string | null): string {
|
|
|
817
757
|
return new Date(ms).toISOString().slice(0, 19);
|
|
818
758
|
}
|
|
819
759
|
|
|
820
|
-
/**
|
|
821
|
-
* Build a human-readable status string for a plugin in the `--all` listing.
|
|
822
|
-
* Combines disabled state with any structural issues.
|
|
823
|
-
*/
|
|
824
|
-
function formatAllPluginStatus(p: AllPluginInfo): string {
|
|
825
|
-
const parts: string[] = [];
|
|
826
|
-
if (p.disabled) parts.push("disabled");
|
|
827
|
-
if (p.issues.length > 0) parts.push(p.issues.join("; "));
|
|
828
|
-
if (parts.length === 0) parts.push("enabled");
|
|
829
|
-
return parts.join(", ");
|
|
830
|
-
}
|
|
831
|
-
|
|
832
760
|
/** Human-readable status line for an inspection result. The from/to revisions
|
|
833
761
|
* now live in the installed/remote blocks, so the status itself is just words. */
|
|
834
762
|
function statusLine(status: PluginInspection["status"]): string {
|