@vellumai/assistant 0.8.8 → 0.8.9-staging.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/ARCHITECTURE.md +6 -6
- package/bun.lock +2 -2
- package/examples/plugins/echo/README.md +61 -60
- package/examples/plugins/echo/hooks/post-tool-use.ts +18 -0
- package/examples/plugins/echo/hooks/stop.ts +16 -0
- package/examples/plugins/echo/hooks/user-prompt-submit.ts +18 -0
- package/examples/plugins/echo/package.json +1 -2
- package/examples/plugins/echo/src/emit.ts +19 -0
- package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +7 -6
- package/openapi.yaml +235 -6
- package/package.json +2 -2
- package/src/__tests__/agent-loop-callsite-precedence.test.ts +69 -14
- package/src/__tests__/agent-loop-exit-reason.test.ts +204 -144
- package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +50 -35
- package/src/__tests__/agent-loop-output-hooks.test.ts +357 -0
- package/src/__tests__/agent-loop-override-profile.test.ts +25 -6
- package/src/__tests__/agent-loop-provider-error-recording.test.ts +41 -21
- package/src/__tests__/agent-loop-thinking.test.ts +36 -20
- package/src/__tests__/agent-loop.test.ts +441 -96
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +14 -14
- package/src/__tests__/agent-wake-override-profile.test.ts +17 -21
- package/src/__tests__/anthropic-provider.test.ts +1 -1
- package/src/__tests__/app-builder-tool-scripts.test.ts +21 -0
- package/src/__tests__/app-control-flow.test.ts +1 -1
- package/src/__tests__/app-dir-path-guard.test.ts +1 -0
- package/src/__tests__/app-executors.test.ts +132 -0
- package/src/__tests__/approval-cascade.test.ts +5 -4
- package/src/__tests__/approval-routes-http.test.ts +4 -1
- package/src/__tests__/background-workers-disk-pressure.test.ts +1 -1
- package/src/__tests__/channel-approval-routes.test.ts +1 -1
- package/src/__tests__/channel-approvals.test.ts +1 -1
- package/src/__tests__/compaction-circuit.test.ts +258 -0
- package/src/__tests__/compaction-direct.test.ts +132 -0
- package/src/__tests__/compaction-events.test.ts +5 -5
- package/src/__tests__/compactor-web-search-strip.test.ts +213 -0
- package/src/__tests__/context-overflow-reducer.test.ts +1 -1
- package/src/__tests__/conversation-abort-tool-results.test.ts +6 -4
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +7 -10
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +78 -119
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +142 -218
- package/src/__tests__/conversation-agent-loop.test.ts +297 -586
- package/src/__tests__/conversation-clean-command.test.ts +5 -2
- package/src/__tests__/conversation-confirmation-signals.test.ts +5 -4
- package/src/__tests__/conversation-crud-inference-profile.test.ts +7 -9
- package/src/__tests__/conversation-history-web-search.test.ts +1 -1
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +4 -4
- package/src/__tests__/conversation-process-callsite.test.ts +14 -14
- package/src/__tests__/conversation-provider-retry-repair.test.ts +70 -65
- package/src/__tests__/conversation-queue.test.ts +9 -9
- package/src/__tests__/conversation-runtime-assembly.test.ts +923 -231
- package/src/__tests__/conversation-runtime-workspace.test.ts +115 -20
- package/src/__tests__/conversation-slash-queue.test.ts +6 -4
- package/src/__tests__/conversation-slash-unknown.test.ts +6 -4
- package/src/__tests__/conversation-speed-override.test.ts +10 -9
- package/src/__tests__/conversation-starter-routes.test.ts +14 -6
- package/src/__tests__/conversation-workspace-cache-state.test.ts +23 -20
- package/src/__tests__/conversation-workspace-injection.test.ts +68 -6
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +14 -11
- package/src/__tests__/conversations-import-system-filter.test.ts +101 -0
- package/src/__tests__/credential-security-invariants.test.ts +0 -1
- package/src/__tests__/db-acp-history.test.ts +101 -0
- package/src/__tests__/dynamic-page-surface.test.ts +31 -0
- package/src/__tests__/empty-response-hook.test.ts +1 -1
- package/src/__tests__/file-write-tool.test.ts +63 -0
- package/src/__tests__/gateway-only-guard.test.ts +12 -2
- package/src/__tests__/guardian-grant-minting.test.ts +1 -1
- package/src/__tests__/guardian-routing-invariants.test.ts +2 -4
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +1 -1
- package/src/__tests__/heartbeat-disk-pressure.test.ts +1 -0
- package/src/__tests__/heartbeat-service.test.ts +1 -0
- package/src/__tests__/history-repair-hook.test.ts +1 -1
- package/src/__tests__/host-app-control-routes.test.ts +1 -1
- package/src/__tests__/host-cu-routes-targeted.test.ts +3 -3
- package/src/__tests__/inference-profile-reaper.test.ts +62 -0
- package/src/__tests__/inference-profile-session-handler.test.ts +86 -0
- package/src/__tests__/injector-background-turn.test.ts +13 -23
- package/src/__tests__/injector-chain.test.ts +268 -44
- package/src/__tests__/injector-disk-pressure.test.ts +210 -52
- package/src/__tests__/injector-document-comments.test.ts +97 -114
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +2 -2
- package/src/__tests__/injector-v3-suppression.test.ts +4 -4
- package/src/__tests__/list-messages-client-message-id.test.ts +91 -0
- package/src/__tests__/list-messages-hidden-metadata.test.ts +38 -0
- package/src/__tests__/memory-retrieval-hook.test.ts +131 -26
- package/src/__tests__/memory-v2-static-injector.test.ts +86 -8
- package/src/__tests__/parallel-tool.benchmark.test.ts +35 -8
- package/src/__tests__/plugin-api-shim.test.ts +6 -9
- package/src/__tests__/plugin-bootstrap.test.ts +12 -23
- package/src/__tests__/plugin-registry.test.ts +3 -49
- package/src/__tests__/plugin-types.test.ts +0 -70
- package/src/__tests__/pre-model-call-sanitize.test.ts +109 -0
- package/src/__tests__/reaction-persistence.test.ts +1 -1
- package/src/__tests__/send-endpoint-busy.test.ts +4 -1
- package/src/__tests__/skill-feature-flags-integration.test.ts +33 -0
- package/src/__tests__/steer-tool-repair.test.ts +1 -1
- package/src/__tests__/subagent-call-site-routing.test.ts +1 -1
- package/src/__tests__/subagent-detail.test.ts +25 -7
- package/src/__tests__/subagent-fork-notifications.test.ts +1 -3
- package/src/__tests__/subagent-fork-spawn.test.ts +1 -1
- package/src/__tests__/subagent-manager-notify.test.ts +1 -3
- package/src/__tests__/subagent-notify-parent.test.ts +1 -3
- package/src/__tests__/subagent-spawn-tool-fork.test.ts +1 -1
- package/src/__tests__/title-generate-hook.test.ts +1 -1
- package/src/__tests__/tool-error-hook.test.ts +1 -1
- package/src/__tests__/tool-result-truncate-hook.test.ts +1 -1
- package/src/__tests__/user-plugin-loader.test.ts +54 -286
- package/src/acp/__tests__/agent-process.test.ts +161 -0
- package/src/acp/__tests__/client-handler.test.ts +40 -0
- package/src/acp/__tests__/helpers/acp-history-db.ts +82 -0
- package/src/acp/__tests__/helpers/exec-file-stub.ts +106 -0
- package/src/acp/__tests__/prepare-agent-env.test.ts +97 -0
- package/src/acp/__tests__/session-manager-persistence.test.ts +95 -28
- package/src/acp/__tests__/session-manager-resume.test.ts +888 -0
- package/src/acp/agent-process.ts +61 -1
- package/src/acp/auto-install.test.ts +280 -0
- package/src/acp/auto-install.ts +232 -0
- package/src/acp/client-handler.ts +31 -0
- package/src/acp/feature-gate.test.ts +48 -0
- package/src/acp/feature-gate.ts +34 -0
- package/src/acp/prepare-agent-env.ts +80 -27
- package/src/acp/resolve-agent.test.ts +225 -9
- package/src/acp/resolve-agent.ts +122 -17
- package/src/acp/resume-hint.ts +23 -0
- package/src/acp/session-manager.ts +507 -73
- package/src/agent/compaction-circuit.ts +60 -102
- package/src/agent/loop.ts +414 -248
- package/src/api/responses/conversation-message.ts +14 -1
- package/src/approvals/guardian-request-resolvers.ts +1 -1
- package/src/background-wake/next-wake.ts +1 -0
- package/src/cli/commands/db/__tests__/repair.test.ts +3 -1
- package/src/cli/commands/plugins.ts +43 -37
- package/src/cli/lib/__tests__/install-from-github.test.ts +429 -111
- package/src/cli/lib/__tests__/plugin-catalog-cache.test.ts +196 -0
- package/src/cli/lib/__tests__/plugin-details.test.ts +372 -0
- package/src/cli/lib/__tests__/plugin-marketplace.test.ts +220 -0
- package/src/cli/lib/__tests__/search-plugins.test.ts +226 -32
- package/src/cli/lib/install-from-github.ts +464 -55
- package/src/cli/lib/plugin-catalog-cache.ts +84 -0
- package/src/cli/lib/plugin-details.ts +409 -0
- package/src/cli/lib/plugin-marketplace.ts +197 -0
- package/src/cli/lib/search-plugins.ts +195 -29
- package/src/config/__tests__/feature-flag-registry-guard.test.ts +2 -2
- package/src/config/acp-defaults.test.ts +10 -0
- package/src/config/acp-defaults.ts +6 -0
- package/src/config/bundled-skills/acp/SKILL.md +85 -33
- package/src/config/bundled-skills/acp/TOOLS.json +4 -4
- package/src/config/bundled-skills/app-builder/SKILL.md +224 -381
- package/src/config/bundled-skills/app-builder/TOOLS.json +72 -2
- package/src/config/bundled-skills/app-builder/references/DESIGN_SYSTEM.md +48 -0
- package/src/config/bundled-skills/app-builder/references/RESPONSIVE.md +57 -0
- package/src/config/bundled-skills/app-builder/references/SLIDES.md +38 -0
- package/src/config/bundled-skills/app-builder/tools/app-list.ts +62 -0
- package/src/config/bundled-skills/app-builder/tools/app-update.ts +18 -0
- package/src/config/bundled-skills/document-editor/SKILL.md +28 -23
- package/src/config/bundled-skills/document-editor/TOOLS.json +1 -1
- package/src/config/bundled-tool-registry.ts +4 -0
- package/src/config/call-site-defaults.ts +0 -2
- package/src/config/feature-flag-registry.json +15 -6
- package/src/config/schemas/call-site-catalog.ts +0 -14
- package/src/config/schemas/heartbeat.ts +9 -0
- package/src/config/schemas/llm.ts +0 -2
- package/src/context/compactor.ts +22 -4
- package/src/context/strip-injections.ts +8 -2
- package/src/context/window-manager.ts +27 -13
- package/src/daemon/conversation-agent-loop-handlers.ts +10 -35
- package/src/daemon/conversation-agent-loop.ts +175 -1055
- package/src/daemon/conversation-lifecycle.ts +11 -255
- package/src/daemon/conversation-process.ts +8 -136
- package/src/daemon/conversation-registry.ts +159 -0
- package/src/daemon/conversation-runtime-assembly.ts +293 -392
- package/src/daemon/conversation-store.ts +9 -90
- package/src/daemon/conversation-surfaces.ts +24 -8
- package/src/daemon/conversation-workspace.ts +17 -0
- package/src/daemon/conversation.ts +404 -57
- package/src/daemon/disk-pressure-policy.ts +0 -1
- package/src/daemon/external-plugins-bootstrap.ts +14 -19
- package/src/daemon/handlers/conversations.ts +3 -1
- package/src/daemon/handlers/skills.ts +4 -1
- package/src/daemon/host-proxy-preactivation.ts +1 -3
- package/src/daemon/lifecycle.ts +21 -7
- package/src/daemon/server.ts +2 -0
- package/src/daemon/wake-conversation-ops.ts +269 -0
- package/src/embedded/plugin-api.ts +2 -2
- package/src/export/__tests__/transcript-formatter.test.ts +5 -0
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +3 -0
- package/src/heartbeat/heartbeat-run-store.ts +23 -1
- package/src/heartbeat/heartbeat-service.ts +26 -0
- package/src/ipc/__tests__/browser-ipc.test.ts +1 -1
- package/src/ipc/__tests__/ui-request-route.test.ts +3 -3
- package/src/ipc/skill-routes/__tests__/memory.test.ts +15 -0
- package/src/ipc/skill-routes/memory.ts +4 -2
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +87 -0
- package/src/memory/conversation-crud.ts +29 -19
- package/src/memory/conversation-starter-checkpoints.ts +1 -0
- package/src/memory/db-init.ts +2 -0
- package/src/memory/job-handlers/conversation-starters.ts +13 -2
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +5 -4
- package/src/memory/jobs-worker.ts +25 -1
- package/src/memory/migrations/272-acp-session-history-cwd.ts +36 -0
- package/src/memory/migrations/index.ts +1 -0
- package/src/memory/schema/acp.ts +4 -0
- package/src/memory/v2/__tests__/consolidation-job.test.ts +3 -3
- package/src/memory/v2/consolidation-job.ts +13 -4
- package/src/plugin-api/constants.ts +4 -0
- package/src/plugin-api/index.ts +6 -5
- package/src/plugin-api/types.ts +75 -0
- package/src/plugins/defaults/compaction/compact.ts +59 -0
- package/src/{daemon → plugins/defaults/compaction}/context-overflow-reducer.ts +7 -7
- package/src/plugins/defaults/compaction/manager-store.ts +57 -0
- package/src/plugins/defaults/compaction/package.json +1 -2
- package/src/plugins/defaults/empty-response/package.json +0 -1
- package/src/plugins/defaults/history-repair/package.json +0 -1
- package/src/plugins/defaults/index.ts +135 -26
- package/src/plugins/defaults/memory-retrieval/hooks/post-compact.ts +100 -52
- package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit-temp.ts +184 -74
- package/src/plugins/defaults/memory-retrieval/injector-chain.ts +2 -2
- package/src/plugins/defaults/{injectors/register.ts → memory-retrieval/injectors.ts} +148 -73
- package/src/plugins/defaults/memory-retrieval/unified-turn-context.ts +223 -0
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/assign.test.ts +4 -4
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/live-integration.test.ts +9 -6
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/maintain-job.test.ts +5 -5
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/orchestrate.test.ts +8 -5
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/reconcile.test.ts +2 -2
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/render-injection.test.ts +1 -1
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/router.test.ts +10 -5
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/selection-log-store.test.ts +8 -8
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/selector.test.ts +5 -5
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/shadow-plugin.test.ts +16 -17
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/types.test.ts +2 -2
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/assign.ts +9 -5
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/capabilities.ts +5 -2
- package/src/plugins/defaults/memory-v3-shadow/hooks/post-compact.ts +14 -0
- package/src/plugins/defaults/memory-v3-shadow/hooks/user-prompt-submit.ts +19 -0
- package/src/plugins/defaults/memory-v3-shadow/injector.ts +75 -0
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/maintain-job.ts +15 -8
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/orchestrate.ts +2 -2
- package/src/plugins/defaults/memory-v3-shadow/package.json +14 -0
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/page-content.ts +2 -2
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/provider-blocks.ts +1 -1
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/reconcile.ts +7 -3
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/render-injection.ts +1 -1
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/router.ts +5 -5
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/selection-log-store.ts +4 -4
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/selector.ts +7 -7
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/shadow-plugin.ts +32 -94
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/tree.ts +1 -1
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/types.ts +1 -1
- package/src/plugins/defaults/title-generate/package.json +0 -1
- package/src/plugins/defaults/tool-error/package.json +0 -1
- package/src/plugins/defaults/tool-result-truncate/package.json +0 -1
- package/src/plugins/pipeline.ts +6 -293
- package/src/plugins/registry.ts +9 -37
- package/src/plugins/types.ts +76 -381
- package/src/plugins/user-loader.ts +30 -127
- package/src/prompts/__tests__/system-prompt.test.ts +6 -0
- package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +35 -3
- package/src/runtime/__tests__/agent-wake.test.ts +555 -691
- package/src/runtime/__tests__/interactive-ui.test.ts +1 -1
- package/src/runtime/agent-wake.ts +108 -209
- package/src/runtime/assistant-event-hub.ts +1 -1
- package/src/runtime/channel-approvals.ts +1 -1
- package/src/runtime/interactive-ui.ts +1 -1
- package/src/runtime/routes/__tests__/acp-routes.test.ts +315 -55
- package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +423 -73
- package/src/runtime/routes/__tests__/surface-action-routes.test.ts +5 -4
- package/src/runtime/routes/__tests__/surface-content-routes.test.ts +4 -1
- package/src/runtime/routes/acp-routes.test.ts +89 -25
- package/src/runtime/routes/acp-routes.ts +81 -29
- package/src/runtime/routes/approval-routes.ts +1 -1
- package/src/runtime/routes/browser-routes.ts +1 -1
- package/src/runtime/routes/browser-tabs-routes.ts +6 -10
- package/src/runtime/routes/conversation-cli-routes.ts +1 -1
- package/src/runtime/routes/conversation-list-routes.ts +1 -1
- package/src/runtime/routes/conversation-query-routes.ts +1 -1
- package/src/runtime/routes/conversation-routes.ts +28 -2
- package/src/runtime/routes/conversation-starter-routes.ts +13 -7
- package/src/runtime/routes/conversations-import-routes.ts +24 -7
- package/src/runtime/routes/host-app-control-routes.ts +1 -1
- package/src/runtime/routes/host-cu-routes.ts +1 -1
- package/src/runtime/routes/identity-routes.ts +18 -3
- package/src/runtime/routes/inbound-message-handler.ts +1 -1
- package/src/runtime/routes/inference-profile-session-handler.ts +11 -0
- package/src/runtime/routes/inference-profile-session-reaper.ts +6 -0
- package/src/runtime/routes/memory-v3-routes.ts +16 -6
- package/src/runtime/routes/playground/helpers.ts +1 -1
- package/src/runtime/routes/plugins-routes.ts +337 -35
- package/src/runtime/routes/surface-conversation-resolver.ts +4 -3
- package/src/runtime/routes/work-items-routes.ts +2 -4
- package/src/runtime/services/conversation-serializer.ts +1 -1
- package/src/signals/cancel.ts +2 -4
- package/src/subagent/manager.ts +21 -5
- package/src/tools/acp/context.ts +20 -0
- package/src/tools/acp/list-agents.test.ts +8 -2
- package/src/tools/acp/spawn.test.ts +176 -195
- package/src/tools/acp/spawn.ts +37 -172
- package/src/tools/acp/steer.test.ts +105 -8
- package/src/tools/acp/steer.ts +48 -17
- package/src/tools/apps/executors.ts +166 -50
- package/src/tools/filesystem/write.ts +34 -0
- package/src/tools/subagent/spawn.ts +2 -4
- package/src/tools/ui-surface/definitions.ts +25 -5
- package/src/workspace/migrations/051-seed-conversation-summarization-callsite.ts +4 -5
- package/src/workspace/migrations/097-enable-adaptive-thinking-managed-profiles.ts +69 -45
- package/docs/plugins.md +0 -832
- package/examples/plugins/echo/register.ts +0 -143
- package/src/__tests__/circuit-breaker-pipeline.test.ts +0 -405
- package/src/__tests__/compaction-pipeline.test.ts +0 -210
- package/src/__tests__/compaction-timeout-recovery.test.ts +0 -251
- package/src/__tests__/overflow-reduce-pipeline.test.ts +0 -667
- package/src/__tests__/pipeline-runner.test.ts +0 -554
- package/src/__tests__/plugin-external-api.test.ts +0 -68
- package/src/daemon/wake-target-adapter.ts +0 -253
- package/src/plugins/defaults/circuit-breaker/middlewares/circuitBreaker.ts +0 -93
- package/src/plugins/defaults/circuit-breaker/package.json +0 -15
- package/src/plugins/defaults/circuit-breaker/register.ts +0 -39
- package/src/plugins/defaults/compaction/middlewares/compaction.ts +0 -25
- package/src/plugins/defaults/compaction/register.ts +0 -35
- package/src/plugins/defaults/compaction/terminal.ts +0 -73
- package/src/plugins/defaults/empty-response/register.ts +0 -23
- package/src/plugins/defaults/history-repair/register.ts +0 -24
- package/src/plugins/defaults/overflow-reduce/middlewares/overflowReduce.ts +0 -126
- package/src/plugins/defaults/overflow-reduce/package.json +0 -15
- package/src/plugins/defaults/overflow-reduce/register.ts +0 -42
- package/src/plugins/defaults/title-generate/register.ts +0 -35
- package/src/plugins/defaults/tool-error/register.ts +0 -23
- package/src/plugins/defaults/tool-result-truncate/register.ts +0 -24
- package/src/plugins/external-api.ts +0 -104
- package/src/proactive-artifact/aux-message-injector.ts +0 -97
- package/src/proactive-artifact/decision.test.ts +0 -226
- package/src/proactive-artifact/decision.ts +0 -165
- package/src/proactive-artifact/index.ts +0 -7
- package/src/proactive-artifact/job.test.ts +0 -962
- package/src/proactive-artifact/job.ts +0 -372
- package/src/proactive-artifact/message-copy.ts +0 -58
- package/src/proactive-artifact/trigger-state.test.ts +0 -286
- package/src/proactive-artifact/trigger-state.ts +0 -123
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/capabilities.test.ts +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/core.test.ts +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/fixtures/eval-turns.json +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/fixtures/live-turns.json +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/health.test.ts +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/needle.test.ts +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/provider-blocks.test.ts +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/snapshot.test.ts +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/tree.test.ts +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/working-set-eviction.test.ts +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/working-set-skeleton.test.ts +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/core.ts +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/README.md +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/assignments.json +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/core.json +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/leaves/domain-a/topic-x.md +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/leaves/domain-a/topic-y.md +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/leaves/domain-b/topic-z.md +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/health.ts +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/llm-retry.ts +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/needle.ts +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/snapshot.ts +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/working-set.ts +0 -0
package/src/acp/resolve-agent.ts
CHANGED
|
@@ -3,16 +3,28 @@
|
|
|
3
3
|
*
|
|
4
4
|
* `resolveAcpAgent(id)` merges user-provided `config.acp.agents[id]` (wins on
|
|
5
5
|
* overlap) with the bundled `DEFAULT_ACP_AGENT_PROFILES` so common agents like
|
|
6
|
-
* `claude` and `codex` Just Work whenever
|
|
7
|
-
*
|
|
6
|
+
* `claude` and `codex` Just Work whenever ACP is enabled (the `acp` feature
|
|
7
|
+
* flag or `acp.enabled: true`; see `feature-gate.ts`), with no per-user
|
|
8
|
+
* config required. Natural names ("claude code", "Gemini CLI") resolve via
|
|
9
|
+
* `AGENT_ID_ALIASES` when the raw id misses both maps. The result is a
|
|
10
|
+
* discriminated union covering every reason
|
|
8
11
|
* a spawn might fail before we even start the agent process: ACP disabled,
|
|
9
12
|
* unknown agent id, or binary missing from PATH. Callers (acp_spawn,
|
|
10
13
|
* acp_list_agents, and the `/v1/acp/spawn` HTTP route) get a single source
|
|
11
14
|
* of truth and matching actionable hints.
|
|
12
15
|
*
|
|
16
|
+
* The resolver NEVER fetches or runs packages in the (untrusted) task cwd.
|
|
17
|
+
* When the adapter binary is missing, resolution simply fails with
|
|
18
|
+
* `binary_not_found`; the `resolveAgentWithAutoInstall` flow in
|
|
19
|
+
* `auto-install.ts` then performs a one-time sandboxed `bun` global install
|
|
20
|
+
* (clean temp cwd, secrets stripped from the installer env) and re-resolves.
|
|
21
|
+
* The resolved command is therefore ALWAYS the real adapter binary on PATH,
|
|
22
|
+
* so downstream gates (env injection, resume hints) key off the command
|
|
23
|
+
* basename directly.
|
|
24
|
+
*
|
|
13
25
|
* `listAcpAgents()` exposes the merged catalog with availability info for
|
|
14
26
|
* the `acp_list_agents` tool — same merge semantics, plus per-entry
|
|
15
|
-
* `available` / `setupHint` derived from
|
|
27
|
+
* `available` / `setupHint` derived from the same binary resolution.
|
|
16
28
|
*/
|
|
17
29
|
|
|
18
30
|
import {
|
|
@@ -21,6 +33,7 @@ import {
|
|
|
21
33
|
} from "../config/acp-defaults.js";
|
|
22
34
|
import type { AcpAgentConfig } from "../config/acp-schema.js";
|
|
23
35
|
import { getConfig } from "../config/loader.js";
|
|
36
|
+
import { isAcpEnabled } from "./feature-gate.js";
|
|
24
37
|
|
|
25
38
|
/**
|
|
26
39
|
* Whether this agent's entry came from user config (wins over default) or
|
|
@@ -29,8 +42,11 @@ import { getConfig } from "../config/loader.js";
|
|
|
29
42
|
*/
|
|
30
43
|
type AcpAgentSource = "config" | "default";
|
|
31
44
|
|
|
32
|
-
type ResolveAcpAgentResult =
|
|
45
|
+
export type ResolveAcpAgentResult =
|
|
33
46
|
| { ok: true; agent: AcpAgentConfig }
|
|
47
|
+
| ResolveAcpAgentFailure;
|
|
48
|
+
|
|
49
|
+
export type ResolveAcpAgentFailure =
|
|
34
50
|
| { ok: false; reason: "acp_disabled"; hint: string }
|
|
35
51
|
| { ok: false; reason: "unknown_agent"; available: string[] }
|
|
36
52
|
| {
|
|
@@ -40,6 +56,33 @@ type ResolveAcpAgentResult =
|
|
|
40
56
|
command: string;
|
|
41
57
|
};
|
|
42
58
|
|
|
59
|
+
/**
|
|
60
|
+
* Single source of truth for the user-facing message of each resolver
|
|
61
|
+
* failure reason. Every caller that surfaces a resolve failure (acp_spawn
|
|
62
|
+
* tool, /v1/acp/spawn route, AcpSessionManager.resumeFromHistory) renders
|
|
63
|
+
* the same copy through this helper; only the transport wrapping (tool
|
|
64
|
+
* error result vs. HTTP error class vs. thrown Error) differs per caller.
|
|
65
|
+
*/
|
|
66
|
+
export function formatResolveFailure(
|
|
67
|
+
agentId: string,
|
|
68
|
+
failure: ResolveAcpAgentFailure,
|
|
69
|
+
): string {
|
|
70
|
+
switch (failure.reason) {
|
|
71
|
+
case "acp_disabled":
|
|
72
|
+
return failure.hint;
|
|
73
|
+
case "unknown_agent":
|
|
74
|
+
return `Unknown agent "${agentId}". Available: ${failure.available.join(", ")}.`;
|
|
75
|
+
case "binary_not_found":
|
|
76
|
+
return `${failure.command} is not on PATH. ${failure.hint}`;
|
|
77
|
+
default: {
|
|
78
|
+
const _exhaustive: never = failure;
|
|
79
|
+
throw new Error(
|
|
80
|
+
`Unexpected acp resolver reason: ${(_exhaustive as { reason: string }).reason}`,
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
43
86
|
interface AcpAgentEntry {
|
|
44
87
|
id: string;
|
|
45
88
|
command: string;
|
|
@@ -56,34 +99,91 @@ interface AcpAgentEntry {
|
|
|
56
99
|
* the same string instead of duplicating near-identical copy.
|
|
57
100
|
*/
|
|
58
101
|
export const ACP_DISABLED_HINT =
|
|
59
|
-
"
|
|
102
|
+
"Enable the \"ACP Coding Agents\" feature flag in the client's feature flags UI (or set 'acp.enabled': true in ~/.vellum/workspace/config.json).";
|
|
60
103
|
|
|
61
104
|
function installHintFor(command: string): string {
|
|
62
105
|
const pkg = DEFAULT_AGENT_NPM_PACKAGES[command];
|
|
63
106
|
return pkg
|
|
64
|
-
? `
|
|
107
|
+
? `bun add -g ${pkg}`
|
|
65
108
|
: `Install '${command}' and ensure it is on PATH.`;
|
|
66
109
|
}
|
|
67
110
|
|
|
68
111
|
/**
|
|
69
|
-
* Resolve
|
|
112
|
+
* Resolve a binary using the same PATH the spawn will see. `AcpAgentProcess`
|
|
70
113
|
* spawns with `{ ...process.env, ...config.env }`, so a per-agent `env.PATH`
|
|
71
|
-
* override wins over the
|
|
114
|
+
* override wins over the assistant's PATH. Mirror that here so a config that
|
|
72
115
|
* relies on a custom PATH to locate the binary doesn't fail preflight.
|
|
73
116
|
*/
|
|
74
|
-
function
|
|
117
|
+
function whichOnAgentPath(
|
|
118
|
+
agent: AcpAgentConfig,
|
|
119
|
+
command: string,
|
|
120
|
+
): string | null {
|
|
75
121
|
const PATH = agent.env?.PATH ?? process.env.PATH;
|
|
76
|
-
return Bun.which(
|
|
122
|
+
return Bun.which(command, PATH != null ? { PATH } : undefined);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Resolve an agent config to its runnable form, or `null` when its `command`
|
|
127
|
+
* is not on PATH. Resolution is pure preflight: the binary is used directly
|
|
128
|
+
* when present, and otherwise the agent cannot spawn (callers fall back to
|
|
129
|
+
* the sandboxed `bun` global install in `auto-install.ts`, then re-resolve).
|
|
130
|
+
*
|
|
131
|
+
* Crucially, this never fetches or executes anything in the task cwd: a
|
|
132
|
+
* missing binary returns `null` rather than running a package manager from
|
|
133
|
+
* the (untrusted) project directory.
|
|
134
|
+
*/
|
|
135
|
+
function resolveRunnableAgent(agent: AcpAgentConfig): AcpAgentConfig | null {
|
|
136
|
+
return whichOnAgentPath(agent, agent.command) ? agent : null;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Natural-name aliases for the bundled agent ids, keyed by normalized form
|
|
141
|
+
* (see `normalizeAgentId`). Resolution sugar only: aliases are consulted as a
|
|
142
|
+
* last-resort fallback in `lookupAgent` and never appear in the
|
|
143
|
+
* `listAcpAgents` catalog.
|
|
144
|
+
*/
|
|
145
|
+
const AGENT_ID_ALIASES: Record<string, string> = {
|
|
146
|
+
claudecode: "claude",
|
|
147
|
+
codexcli: "codex",
|
|
148
|
+
openaicodex: "codex",
|
|
149
|
+
geminicli: "gemini",
|
|
150
|
+
googlegemini: "gemini",
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Normalize a raw agent id for alias matching: lowercase and strip spaces,
|
|
155
|
+
* underscores, and hyphens so "Claude Code", "claude-code", and
|
|
156
|
+
* "claude_code" all hit the same alias entry.
|
|
157
|
+
*/
|
|
158
|
+
function normalizeAgentId(id: string): string {
|
|
159
|
+
return id.toLowerCase().replace(/[\s_-]/g, "");
|
|
77
160
|
}
|
|
78
161
|
|
|
79
162
|
/**
|
|
80
163
|
* Resolve an id against user config first, then bundled defaults. Returns the
|
|
81
164
|
* resolved entry plus a `source` label so callers can surface "user override
|
|
82
165
|
* vs bundled default" without re-deriving it.
|
|
166
|
+
*
|
|
167
|
+
* When the raw id misses both maps, fall back to `AGENT_ID_ALIASES` so
|
|
168
|
+
* natural names like "claude code" or "Gemini CLI" resolve to the canonical
|
|
169
|
+
* id. The alias is consulted ONLY after both direct lookups miss, so a user
|
|
170
|
+
* config entry literally keyed "claude code" always wins over the alias.
|
|
83
171
|
*/
|
|
84
172
|
function lookupAgent(
|
|
85
173
|
userAgents: Record<string, AcpAgentConfig>,
|
|
86
174
|
id: string,
|
|
175
|
+
): { agent: AcpAgentConfig; source: AcpAgentSource } | undefined {
|
|
176
|
+
const direct = directLookup(userAgents, id);
|
|
177
|
+
if (direct) return direct;
|
|
178
|
+
const canonicalId = AGENT_ID_ALIASES[normalizeAgentId(id)];
|
|
179
|
+
return canonicalId !== undefined
|
|
180
|
+
? directLookup(userAgents, canonicalId)
|
|
181
|
+
: undefined;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function directLookup(
|
|
185
|
+
userAgents: Record<string, AcpAgentConfig>,
|
|
186
|
+
id: string,
|
|
87
187
|
): { agent: AcpAgentConfig; source: AcpAgentSource } | undefined {
|
|
88
188
|
const userAgent = userAgents[id];
|
|
89
189
|
if (userAgent) return { agent: userAgent, source: "config" };
|
|
@@ -109,16 +209,17 @@ function mergedAgentIds(userAgents: Record<string, AcpAgentConfig>): string[] {
|
|
|
109
209
|
* Resolve an ACP agent id to its config + binary preflight result.
|
|
110
210
|
*
|
|
111
211
|
* Order of checks:
|
|
112
|
-
* 1. ACP must be enabled
|
|
212
|
+
* 1. ACP must be enabled (feature flag or config; see `isAcpEnabled`).
|
|
113
213
|
* 2. The id must resolve to an agent (user config wins; falls back to defaults).
|
|
114
|
-
* 3. The agent
|
|
214
|
+
* 3. The agent must be runnable: its `command` on PATH (see
|
|
215
|
+
* `resolveRunnableAgent`).
|
|
115
216
|
*
|
|
116
217
|
* Each failure mode carries an actionable hint so callers can surface a
|
|
117
218
|
* single user-facing message without re-deriving the remediation.
|
|
118
219
|
*/
|
|
119
220
|
export function resolveAcpAgent(id: string): ResolveAcpAgentResult {
|
|
120
221
|
const config = getConfig();
|
|
121
|
-
if (!config
|
|
222
|
+
if (!isAcpEnabled(config)) {
|
|
122
223
|
return { ok: false, reason: "acp_disabled", hint: ACP_DISABLED_HINT };
|
|
123
224
|
}
|
|
124
225
|
|
|
@@ -133,7 +234,8 @@ export function resolveAcpAgent(id: string): ResolveAcpAgentResult {
|
|
|
133
234
|
}
|
|
134
235
|
|
|
135
236
|
const { agent } = found;
|
|
136
|
-
|
|
237
|
+
const runnable = resolveRunnableAgent(agent);
|
|
238
|
+
if (!runnable) {
|
|
137
239
|
return {
|
|
138
240
|
ok: false,
|
|
139
241
|
reason: "binary_not_found",
|
|
@@ -142,7 +244,7 @@ export function resolveAcpAgent(id: string): ResolveAcpAgentResult {
|
|
|
142
244
|
};
|
|
143
245
|
}
|
|
144
246
|
|
|
145
|
-
return { ok: true, agent };
|
|
247
|
+
return { ok: true, agent: runnable };
|
|
146
248
|
}
|
|
147
249
|
|
|
148
250
|
/**
|
|
@@ -160,7 +262,7 @@ export function listAcpAgents(): {
|
|
|
160
262
|
agents: AcpAgentEntry[];
|
|
161
263
|
} {
|
|
162
264
|
const config = getConfig();
|
|
163
|
-
if (!config
|
|
265
|
+
if (!isAcpEnabled(config)) {
|
|
164
266
|
return { enabled: false, agents: [] };
|
|
165
267
|
}
|
|
166
268
|
|
|
@@ -168,7 +270,10 @@ export function listAcpAgents(): {
|
|
|
168
270
|
const agents: AcpAgentEntry[] = mergedAgentIds(userAgents).map((id) => {
|
|
169
271
|
// Non-null: ids come from `mergedAgentIds` so the lookup always resolves.
|
|
170
272
|
const { agent, source } = lookupAgent(userAgents, id)!;
|
|
171
|
-
|
|
273
|
+
// Same binary preflight as `resolveAcpAgent`: available iff the command
|
|
274
|
+
// is on PATH. A missing binary is auto-installed at spawn time, but the
|
|
275
|
+
// catalog reflects what is runnable right now.
|
|
276
|
+
const available = resolveRunnableAgent(agent) !== null;
|
|
172
277
|
const entry: AcpAgentEntry = {
|
|
173
278
|
id,
|
|
174
279
|
command: agent.command,
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared `claude --resume` hint for ACP sessions.
|
|
3
|
+
*
|
|
4
|
+
* `claude --resume <id>` is Claude Code-specific (the claude-agent-acp
|
|
5
|
+
* adapter binary). Other adapters resume differently or not at all, so the
|
|
6
|
+
* hint is gated by the resolved adapter, not the agent id - this stays
|
|
7
|
+
* correct when a user aliases an id to a different binary. Callers pass the
|
|
8
|
+
* resolved command basename, which is always the real adapter binary.
|
|
9
|
+
*
|
|
10
|
+
* Used by the `acp_spawn` tool's success payload and the session manager's
|
|
11
|
+
* completion notification so both surfaces render identical copy. Returns
|
|
12
|
+
* an empty string for non-claude adapters; callers add their own
|
|
13
|
+
* surrounding separators.
|
|
14
|
+
*/
|
|
15
|
+
export function claudeResumeHint(
|
|
16
|
+
command: string,
|
|
17
|
+
cwd: string,
|
|
18
|
+
sessionId: string,
|
|
19
|
+
): string {
|
|
20
|
+
return command === "claude-agent-acp"
|
|
21
|
+
? `To resume: cd ${cwd} && claude --resume ${sessionId}`
|
|
22
|
+
: "";
|
|
23
|
+
}
|