@vellumai/assistant 0.8.8 → 0.8.9-dev.202606091926.ebb2d62
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/docs/activation-funnel-telemetry.md +310 -0
- 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 +273 -121
- package/package.json +2 -2
- package/scripts/sync-llm-catalog.ts +2 -0
- package/src/__tests__/activation-early-marking.test.ts +120 -0
- 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 +23 -8
- 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 +6 -5
- package/src/__tests__/approval-routes-http.test.ts +4 -1
- package/src/__tests__/background-workers-disk-pressure.test.ts +1 -1
- package/src/__tests__/build-persisted-content.test.ts +75 -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 +146 -0
- package/src/__tests__/compaction-events.test.ts +7 -7
- package/src/__tests__/compaction.benchmark.test.ts +1 -1
- package/src/__tests__/compactor-web-search-strip.test.ts +213 -0
- package/src/__tests__/config-managed-gemini-defaults.test.ts +2 -46
- package/src/__tests__/context-overflow-reducer.test.ts +265 -125
- package/src/__tests__/context-window-manager-compact-retry.test.ts +121 -15
- package/src/__tests__/conversation-abort-tool-results.test.ts +7 -5
- 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 +158 -234
- package/src/__tests__/conversation-agent-loop.test.ts +342 -623
- package/src/__tests__/conversation-clean-command.test.ts +5 -2
- package/src/__tests__/conversation-confirmation-signals.test.ts +6 -5
- package/src/__tests__/conversation-crud-inference-profile.test.ts +7 -9
- package/src/__tests__/conversation-error.test.ts +15 -1
- package/src/__tests__/conversation-history-web-search.test.ts +6 -1
- package/src/__tests__/conversation-media-retry.test.ts +1 -1
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +44 -4
- package/src/__tests__/conversation-process-callsite.test.ts +15 -15
- package/src/__tests__/conversation-provider-retry-repair.test.ts +66 -65
- package/src/__tests__/conversation-queue.test.ts +10 -10
- package/src/__tests__/conversation-runtime-assembly.test.ts +1059 -231
- package/src/__tests__/conversation-runtime-workspace.test.ts +115 -20
- package/src/__tests__/conversation-slash-queue.test.ts +7 -5
- package/src/__tests__/conversation-slash-unknown.test.ts +7 -5
- package/src/__tests__/conversation-speed-override.test.ts +11 -10
- package/src/__tests__/conversation-starter-routes.test.ts +14 -6
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +395 -0
- package/src/__tests__/conversation-surfaces-app-control.test.ts +48 -1
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +73 -4
- package/src/__tests__/conversation-undo.test.ts +2 -2
- package/src/__tests__/conversation-workspace-cache-state.test.ts +24 -21
- package/src/__tests__/conversation-workspace-injection.test.ts +69 -7
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +15 -12
- package/src/__tests__/conversations-import-system-filter.test.ts +101 -0
- package/src/__tests__/corrected-target.test.ts +93 -0
- package/src/__tests__/credential-execution-feature-gates.test.ts +5 -4
- package/src/__tests__/credential-security-invariants.test.ts +1 -0
- package/src/__tests__/cu-unified-flow.test.ts +36 -0
- package/src/__tests__/db-acp-history.test.ts +101 -0
- package/src/__tests__/dynamic-page-surface.test.ts +31 -0
- package/src/__tests__/embedding-managed-proxy-selection.test.ts +6 -40
- 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 +17 -2
- package/src/__tests__/guardian-grant-minting.test.ts +1 -1
- package/src/__tests__/guardian-routing-invariants.test.ts +93 -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 +5 -1
- package/src/__tests__/host-app-control-proxy.test.ts +45 -0
- 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__/llm-catalog-parity.test.ts +4 -0
- package/src/__tests__/llm-resolver.test.ts +73 -0
- package/src/__tests__/memory-retrieval-hook.test.ts +156 -38
- package/src/__tests__/memory-v2-static-injector.test.ts +86 -8
- package/src/__tests__/notification-decision-strategy.test.ts +3 -3
- package/src/__tests__/parallel-tool.benchmark.test.ts +35 -8
- package/src/__tests__/persist-unsendable-image-downscale.test.ts +145 -0
- package/src/__tests__/persist-unsendable-image.test.ts +97 -1
- package/src/__tests__/persistence-secret-redaction.test.ts +78 -0
- package/src/__tests__/plugin-api-shim.test.ts +6 -9
- package/src/__tests__/plugin-bootstrap.test.ts +91 -81
- package/src/__tests__/plugin-registry.test.ts +3 -49
- package/src/__tests__/plugin-skill-contribution.test.ts +15 -14
- package/src/__tests__/plugin-tool-contribution.test.ts +7 -4
- package/src/__tests__/plugin-types.test.ts +0 -70
- package/src/__tests__/post-turn-tool-result-truncation.test.ts +69 -0
- package/src/__tests__/pre-model-call-sanitize.test.ts +109 -0
- package/src/__tests__/published-app-updater.test.ts +138 -0
- package/src/__tests__/reaction-persistence.test.ts +1 -1
- package/src/__tests__/retry-thinking-adaptive-only.test.ts +245 -0
- package/src/__tests__/send-endpoint-busy.test.ts +4 -1
- package/src/__tests__/server-history-render.test.ts +39 -0
- package/src/__tests__/skill-feature-flags-integration.test.ts +31 -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 +5 -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__/tool-start-timestamp.test.ts +218 -0
- package/src/__tests__/user-plugin-loader.test.ts +54 -286
- package/src/__tests__/web-fetch.test.ts +45 -0
- 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-config-stub.ts +0 -2
- 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/prepare-agent-env.ts +80 -27
- package/src/acp/resolve-agent.test.ts +188 -28
- package/src/acp/resolve-agent.ts +119 -42
- 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 +403 -251
- package/src/api/events/tool-result.ts +9 -0
- package/src/api/events/tool-use-start.ts +7 -0
- package/src/api/responses/conversation-message.ts +72 -13
- package/src/api/responses/memory-v3-selection-log.ts +19 -10
- package/src/approvals/guardian-request-resolvers.ts +27 -1
- package/src/background-wake/next-wake.ts +1 -0
- package/src/cli/commands/__tests__/memory-v3.test.ts +191 -210
- package/src/cli/commands/channel-verification-sessions.ts +6 -6
- package/src/cli/commands/db/__tests__/repair.test.ts +3 -1
- package/src/cli/commands/memory-v3.ts +57 -199
- package/src/cli/commands/plugins.ts +43 -37
- package/src/cli/lib/__tests__/install-from-github.test.ts +790 -111
- package/src/cli/lib/__tests__/plugin-catalog-cache.test.ts +196 -0
- package/src/cli/lib/__tests__/plugin-details.test.ts +381 -0
- package/src/cli/lib/__tests__/plugin-marketplace.test.ts +270 -0
- package/src/cli/lib/__tests__/search-plugins.test.ts +233 -32
- package/src/cli/lib/install-from-github.ts +797 -60
- package/src/cli/lib/plugin-catalog-cache.ts +84 -0
- package/src/cli/lib/plugin-details.ts +416 -0
- package/src/cli/lib/plugin-marketplace.ts +215 -0
- package/src/cli/lib/search-plugins.ts +201 -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 +9 -3
- package/src/config/acp-schema.ts +1 -7
- package/src/config/bundled-skills/acp/SKILL.md +80 -41
- 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 -3
- package/src/config/feature-flag-registry.json +10 -56
- package/src/config/llm-resolver.ts +39 -7
- package/src/config/loader.ts +5 -22
- package/src/config/schemas/__tests__/memory-v3.test.ts +25 -9
- package/src/config/schemas/call-site-catalog.ts +0 -21
- package/src/config/schemas/heartbeat.ts +9 -0
- package/src/config/schemas/llm.ts +17 -3
- package/src/config/schemas/memory-v3.ts +58 -8
- package/src/config/seed-inference-profiles.ts +18 -0
- package/src/context/compactor.ts +22 -4
- package/src/context/post-turn-tool-result-truncation.ts +39 -1
- package/src/context/strip-injections.ts +8 -2
- package/src/daemon/conversation-agent-loop-handlers.ts +120 -42
- package/src/daemon/conversation-agent-loop.ts +308 -1297
- package/src/daemon/conversation-error.ts +31 -4
- package/src/daemon/conversation-history.ts +1 -1
- package/src/daemon/conversation-lifecycle.ts +11 -255
- package/src/daemon/conversation-media-retry.ts +19 -6
- package/src/daemon/conversation-messaging.ts +17 -0
- package/src/daemon/conversation-process.ts +22 -141
- package/src/daemon/conversation-queue-manager.ts +8 -0
- package/src/daemon/conversation-registry.ts +159 -0
- package/src/daemon/conversation-runtime-assembly.ts +361 -393
- package/src/daemon/conversation-store.ts +9 -90
- package/src/daemon/conversation-surfaces.ts +165 -11
- package/src/daemon/conversation-workspace.ts +17 -0
- package/src/daemon/conversation.ts +444 -62
- package/src/daemon/disk-pressure-policy.ts +0 -1
- package/src/daemon/external-plugins-bootstrap.ts +36 -46
- package/src/daemon/handlers/config-channels.ts +11 -2
- package/src/daemon/handlers/conversations.ts +3 -1
- package/src/daemon/handlers/shared.ts +9 -1
- package/src/daemon/handlers/skills.ts +4 -1
- package/src/daemon/host-app-control-proxy.ts +72 -57
- package/src/daemon/host-proxy-preactivation.ts +1 -3
- package/src/daemon/lifecycle.ts +21 -7
- package/src/daemon/persist-unsendable-image.ts +62 -25
- package/src/daemon/process-message.ts +1 -1
- package/src/daemon/server.ts +2 -0
- package/src/daemon/tool-side-effects.ts +15 -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__/activation-session-store.test.ts +41 -0
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +87 -0
- package/src/memory/__tests__/onboarding-events-store.test.ts +80 -0
- package/src/memory/activation-session-store.ts +43 -0
- package/src/memory/conversation-crud.ts +29 -19
- package/src/memory/conversation-starter-checkpoints.ts +1 -0
- package/src/memory/db-init.ts +6 -0
- package/src/memory/embedding-backend.ts +5 -22
- 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/273-onboarding-events-funnel-columns.ts +46 -0
- package/src/memory/migrations/274-create-activation-sessions.ts +15 -0
- package/src/memory/migrations/index.ts +3 -0
- package/src/memory/onboarding-events-store.ts +66 -18
- package/src/memory/schema/acp.ts +4 -0
- package/src/memory/schema/infrastructure.ts +13 -0
- package/src/memory/v2/__tests__/consolidation-job.test.ts +4 -97
- package/src/memory/v2/__tests__/page-store.test.ts +22 -0
- package/src/memory/v2/consolidation-job.ts +2 -63
- package/src/memory/v2/types.ts +5 -0
- package/src/messaging/providers/telegram-bot/api.ts +14 -5
- package/src/notifications/__tests__/copy-composer.test.ts +244 -0
- package/src/notifications/access-request-copy.ts +298 -0
- package/src/notifications/adapters/slack.ts +3 -3
- package/src/notifications/adapters/telegram.ts +9 -2
- package/src/notifications/copy-composer.ts +49 -267
- package/src/notifications/decision-engine.ts +16 -35
- package/src/notifications/home-feed-side-effect.ts +1 -6
- package/src/plugin-api/constants.ts +4 -0
- package/src/plugin-api/index.ts +40 -11
- package/src/plugin-api/types.ts +108 -0
- package/src/plugins/defaults/compaction/compact.ts +106 -0
- package/src/{daemon → plugins/defaults/compaction}/context-overflow-reducer.ts +250 -42
- package/src/plugins/defaults/compaction/corrected-target.ts +53 -0
- package/src/plugins/defaults/compaction/manager-store.ts +57 -0
- package/src/plugins/defaults/compaction/package.json +1 -2
- package/src/{context → plugins/defaults/compaction}/window-manager.ts +95 -25
- 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 +156 -26
- package/src/plugins/defaults/memory-retrieval/hooks/post-compact.ts +100 -52
- package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit.ts +285 -0
- 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/package.json +14 -0
- package/src/plugins/defaults/memory-retrieval/unified-turn-context.ts +223 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/capabilities.test.ts +71 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/dense.test.ts +181 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/edge.test.ts +247 -0
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/live-integration.test.ts +147 -134
- package/src/plugins/defaults/memory-v3-shadow/__tests__/maintain-job.test.ts +456 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/orchestrate.test.ts +662 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/pool-select.test.ts +306 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/render-injection.test.ts +91 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/section-dense-store.test.ts +402 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/section-needle.test.ts +135 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/sections.test.ts +125 -0
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/selection-log-store.test.ts +74 -19
- package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-integration.test.ts +446 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-plugin.test.ts +592 -0
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/types.test.ts +2 -24
- package/src/plugins/defaults/memory-v3-shadow/capabilities.ts +91 -0
- package/src/plugins/defaults/memory-v3-shadow/dense.ts +97 -0
- package/src/plugins/defaults/memory-v3-shadow/edge.ts +252 -0
- 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 +76 -0
- package/src/plugins/defaults/memory-v3-shadow/maintain-job.ts +555 -0
- package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +266 -0
- package/src/plugins/defaults/memory-v3-shadow/package.json +14 -0
- package/src/plugins/defaults/memory-v3-shadow/page-content.ts +71 -0
- package/src/plugins/defaults/memory-v3-shadow/pool-select.ts +204 -0
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/render-injection.ts +16 -8
- package/src/plugins/defaults/memory-v3-shadow/section-dense-store.ts +236 -0
- package/src/plugins/defaults/memory-v3-shadow/section-needle.ts +200 -0
- package/src/plugins/defaults/memory-v3-shadow/sections.ts +115 -0
- package/src/plugins/defaults/memory-v3-shadow/selection-log-store.ts +156 -0
- package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +382 -0
- package/src/plugins/defaults/memory-v3-shadow/types.ts +92 -0
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/working-set.ts +4 -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/external-api.ts +12 -2
- 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/system-prompt.ts +61 -10
- package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +71 -4
- package/src/providers/anthropic/client.ts +9 -10
- package/src/providers/inference/kimi-cjk-token-ids.ts +493 -0
- package/src/providers/inference/logit-bias.ts +55 -0
- package/src/providers/model-catalog.ts +57 -0
- package/src/providers/openai/__tests__/vision-not-supported.test.ts +75 -0
- package/src/providers/openai/chat-completions-provider.ts +44 -1
- package/src/providers/retry.ts +57 -7
- package/src/providers/types.ts +6 -0
- 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 +466 -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__/stt-routes.test.ts +112 -0
- 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 +185 -32
- package/src/runtime/routes/acp-routes.ts +328 -30
- package/src/runtime/routes/app-management-routes.ts +3 -0
- 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/channel-verification-routes.ts +14 -5
- 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 +30 -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/inbound-stages/acl-enforcement.ts +33 -34
- 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 +65 -305
- package/src/runtime/routes/playground/__tests__/force-compact.test.ts +1 -1
- package/src/runtime/routes/playground/helpers.ts +1 -1
- package/src/runtime/routes/plugins-routes.ts +337 -35
- package/src/runtime/routes/stt-routes.ts +45 -12
- package/src/runtime/routes/surface-conversation-resolver.ts +4 -3
- package/src/runtime/routes/work-items-routes.ts +2 -4
- package/src/runtime/routes/workspace-routes.ts +50 -15
- package/src/runtime/services/conversation-serializer.ts +1 -1
- package/src/runtime/verification-outbound-actions.ts +147 -2
- package/src/runtime/verification-templates.ts +29 -3
- package/src/services/published-app-updater.ts +30 -8
- package/src/signals/cancel.ts +2 -4
- package/src/subagent/manager.ts +21 -5
- package/src/telemetry/__tests__/activation-funnel.test.ts +95 -0
- package/src/telemetry/activation-funnel.ts +167 -0
- package/src/telemetry/types.ts +13 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +154 -0
- package/src/telemetry/usage-telemetry-reporter.ts +26 -1
- package/src/tools/acp/context.ts +20 -0
- package/src/tools/acp/list-agents.test.ts +9 -19
- package/src/tools/acp/list-agents.ts +3 -15
- package/src/tools/acp/spawn.test.ts +173 -202
- 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/browser/browser-execution.ts +12 -2
- package/src/tools/filesystem/write.ts +34 -0
- package/src/tools/network/web-fetch.ts +65 -24
- package/src/tools/skills/load.ts +1 -1
- package/src/tools/subagent/spawn.ts +2 -4
- package/src/tools/ui-surface/definitions.ts +32 -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/daemon/wake-target-adapter.ts +0 -253
- package/src/memory/v3/__tests__/assign.test.ts +0 -242
- package/src/memory/v3/__tests__/capabilities.test.ts +0 -118
- package/src/memory/v3/__tests__/core.test.ts +0 -39
- package/src/memory/v3/__tests__/health.test.ts +0 -219
- package/src/memory/v3/__tests__/maintain-job.test.ts +0 -288
- package/src/memory/v3/__tests__/needle.test.ts +0 -107
- package/src/memory/v3/__tests__/orchestrate.test.ts +0 -436
- package/src/memory/v3/__tests__/provider-blocks.test.ts +0 -13
- package/src/memory/v3/__tests__/reconcile.test.ts +0 -274
- package/src/memory/v3/__tests__/render-injection.test.ts +0 -61
- package/src/memory/v3/__tests__/router.test.ts +0 -332
- package/src/memory/v3/__tests__/selector.test.ts +0 -470
- package/src/memory/v3/__tests__/shadow-plugin.test.ts +0 -432
- package/src/memory/v3/__tests__/snapshot.test.ts +0 -168
- package/src/memory/v3/__tests__/tree.test.ts +0 -192
- package/src/memory/v3/assign.ts +0 -268
- package/src/memory/v3/capabilities.ts +0 -124
- package/src/memory/v3/core.ts +0 -26
- package/src/memory/v3/health.ts +0 -0
- package/src/memory/v3/maintain-job.ts +0 -314
- package/src/memory/v3/needle.ts +0 -115
- package/src/memory/v3/orchestrate.ts +0 -126
- package/src/memory/v3/page-content.ts +0 -34
- package/src/memory/v3/provider-blocks.ts +0 -26
- package/src/memory/v3/reconcile.ts +0 -523
- package/src/memory/v3/router.ts +0 -190
- package/src/memory/v3/selection-log-store.ts +0 -84
- package/src/memory/v3/selector.ts +0 -226
- package/src/memory/v3/shadow-plugin.ts +0 -411
- package/src/memory/v3/snapshot.ts +0 -209
- package/src/memory/v3/tree.ts +0 -174
- package/src/memory/v3/types.ts +0 -59
- package/src/notifications/__tests__/emit-signal-home-feed.test.ts +0 -187
- 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/memory-retrieval/hooks/user-prompt-submit-temp.ts +0 -216
- 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/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/util/map-limit.ts +0 -27
- /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__/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}/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}/llm-retry.ts +0 -0
package/src/acp/resolve-agent.ts
CHANGED
|
@@ -3,16 +3,26 @@
|
|
|
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
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* of truth and
|
|
6
|
+
* `claude` and `codex` Just Work with no per-user config required. Natural
|
|
7
|
+
* names ("claude code", "Gemini CLI") resolve via `AGENT_ID_ALIASES` when the
|
|
8
|
+
* raw id misses both maps. The result is a discriminated union covering every
|
|
9
|
+
* reason a spawn might fail before we even start the agent process: unknown
|
|
10
|
+
* agent id, or binary missing from PATH. Callers (acp_spawn, acp_list_agents,
|
|
11
|
+
* and the `/v1/acp/spawn` HTTP route) get a single source of truth and
|
|
12
|
+
* matching actionable hints.
|
|
13
|
+
*
|
|
14
|
+
* The resolver NEVER fetches or runs packages in the (untrusted) task cwd.
|
|
15
|
+
* When the adapter binary is missing, resolution simply fails with
|
|
16
|
+
* `binary_not_found`; the `resolveAgentWithAutoInstall` flow in
|
|
17
|
+
* `auto-install.ts` then performs a one-time sandboxed `bun` global install
|
|
18
|
+
* (clean temp cwd, secrets stripped from the installer env) and re-resolves.
|
|
19
|
+
* The resolved command is therefore ALWAYS the real adapter binary on PATH,
|
|
20
|
+
* so downstream gates (env injection, resume hints) key off the command
|
|
21
|
+
* basename directly.
|
|
12
22
|
*
|
|
13
23
|
* `listAcpAgents()` exposes the merged catalog with availability info for
|
|
14
24
|
* the `acp_list_agents` tool — same merge semantics, plus per-entry
|
|
15
|
-
* `available` / `setupHint` derived from
|
|
25
|
+
* `available` / `setupHint` derived from the same binary resolution.
|
|
16
26
|
*/
|
|
17
27
|
|
|
18
28
|
import {
|
|
@@ -29,9 +39,11 @@ import { getConfig } from "../config/loader.js";
|
|
|
29
39
|
*/
|
|
30
40
|
type AcpAgentSource = "config" | "default";
|
|
31
41
|
|
|
32
|
-
type ResolveAcpAgentResult =
|
|
42
|
+
export type ResolveAcpAgentResult =
|
|
33
43
|
| { ok: true; agent: AcpAgentConfig }
|
|
34
|
-
|
|
|
44
|
+
| ResolveAcpAgentFailure;
|
|
45
|
+
|
|
46
|
+
export type ResolveAcpAgentFailure =
|
|
35
47
|
| { ok: false; reason: "unknown_agent"; available: string[] }
|
|
36
48
|
| {
|
|
37
49
|
ok: false;
|
|
@@ -40,6 +52,31 @@ type ResolveAcpAgentResult =
|
|
|
40
52
|
command: string;
|
|
41
53
|
};
|
|
42
54
|
|
|
55
|
+
/**
|
|
56
|
+
* Single source of truth for the user-facing message of each resolver
|
|
57
|
+
* failure reason. Every caller that surfaces a resolve failure (acp_spawn
|
|
58
|
+
* tool, /v1/acp/spawn route, AcpSessionManager.resumeFromHistory) renders
|
|
59
|
+
* the same copy through this helper; only the transport wrapping (tool
|
|
60
|
+
* error result vs. HTTP error class vs. thrown Error) differs per caller.
|
|
61
|
+
*/
|
|
62
|
+
export function formatResolveFailure(
|
|
63
|
+
agentId: string,
|
|
64
|
+
failure: ResolveAcpAgentFailure,
|
|
65
|
+
): string {
|
|
66
|
+
switch (failure.reason) {
|
|
67
|
+
case "unknown_agent":
|
|
68
|
+
return `Unknown agent "${agentId}". Available: ${failure.available.join(", ")}.`;
|
|
69
|
+
case "binary_not_found":
|
|
70
|
+
return `${failure.command} is not on PATH. ${failure.hint}`;
|
|
71
|
+
default: {
|
|
72
|
+
const _exhaustive: never = failure;
|
|
73
|
+
throw new Error(
|
|
74
|
+
`Unexpected acp resolver reason: ${(_exhaustive as { reason: string }).reason}`,
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
43
80
|
interface AcpAgentEntry {
|
|
44
81
|
id: string;
|
|
45
82
|
command: string;
|
|
@@ -50,40 +87,89 @@ interface AcpAgentEntry {
|
|
|
50
87
|
setupHint?: string;
|
|
51
88
|
}
|
|
52
89
|
|
|
53
|
-
/**
|
|
54
|
-
* Single-source-of-truth hint for "ACP is disabled". Exported so any caller
|
|
55
|
-
* that surfaces a disabled-state message (resolver, list-agents tool) reads
|
|
56
|
-
* the same string instead of duplicating near-identical copy.
|
|
57
|
-
*/
|
|
58
|
-
export const ACP_DISABLED_HINT =
|
|
59
|
-
"Set 'acp.enabled': true in ~/.vellum/workspace/config.json (or via the runtime config endpoint).";
|
|
60
|
-
|
|
61
90
|
function installHintFor(command: string): string {
|
|
62
91
|
const pkg = DEFAULT_AGENT_NPM_PACKAGES[command];
|
|
63
92
|
return pkg
|
|
64
|
-
? `
|
|
93
|
+
? `bun add -g ${pkg}`
|
|
65
94
|
: `Install '${command}' and ensure it is on PATH.`;
|
|
66
95
|
}
|
|
67
96
|
|
|
68
97
|
/**
|
|
69
|
-
* Resolve
|
|
98
|
+
* Resolve a binary using the same PATH the spawn will see. `AcpAgentProcess`
|
|
70
99
|
* spawns with `{ ...process.env, ...config.env }`, so a per-agent `env.PATH`
|
|
71
|
-
* override wins over the
|
|
100
|
+
* override wins over the assistant's PATH. Mirror that here so a config that
|
|
72
101
|
* relies on a custom PATH to locate the binary doesn't fail preflight.
|
|
73
102
|
*/
|
|
74
|
-
function
|
|
103
|
+
function whichOnAgentPath(
|
|
104
|
+
agent: AcpAgentConfig,
|
|
105
|
+
command: string,
|
|
106
|
+
): string | null {
|
|
75
107
|
const PATH = agent.env?.PATH ?? process.env.PATH;
|
|
76
|
-
return Bun.which(
|
|
108
|
+
return Bun.which(command, PATH != null ? { PATH } : undefined);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Resolve an agent config to its runnable form, or `null` when its `command`
|
|
113
|
+
* is not on PATH. Resolution is pure preflight: the binary is used directly
|
|
114
|
+
* when present, and otherwise the agent cannot spawn (callers fall back to
|
|
115
|
+
* the sandboxed `bun` global install in `auto-install.ts`, then re-resolve).
|
|
116
|
+
*
|
|
117
|
+
* Crucially, this never fetches or executes anything in the task cwd: a
|
|
118
|
+
* missing binary returns `null` rather than running a package manager from
|
|
119
|
+
* the (untrusted) project directory.
|
|
120
|
+
*/
|
|
121
|
+
function resolveRunnableAgent(agent: AcpAgentConfig): AcpAgentConfig | null {
|
|
122
|
+
return whichOnAgentPath(agent, agent.command) ? agent : null;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Natural-name aliases for the bundled agent ids, keyed by normalized form
|
|
127
|
+
* (see `normalizeAgentId`). Resolution sugar only: aliases are consulted as a
|
|
128
|
+
* last-resort fallback in `lookupAgent` and never appear in the
|
|
129
|
+
* `listAcpAgents` catalog.
|
|
130
|
+
*/
|
|
131
|
+
const AGENT_ID_ALIASES: Record<string, string> = {
|
|
132
|
+
claudecode: "claude",
|
|
133
|
+
codexcli: "codex",
|
|
134
|
+
openaicodex: "codex",
|
|
135
|
+
geminicli: "gemini",
|
|
136
|
+
googlegemini: "gemini",
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Normalize a raw agent id for alias matching: lowercase and strip spaces,
|
|
141
|
+
* underscores, and hyphens so "Claude Code", "claude-code", and
|
|
142
|
+
* "claude_code" all hit the same alias entry.
|
|
143
|
+
*/
|
|
144
|
+
function normalizeAgentId(id: string): string {
|
|
145
|
+
return id.toLowerCase().replace(/[\s_-]/g, "");
|
|
77
146
|
}
|
|
78
147
|
|
|
79
148
|
/**
|
|
80
149
|
* Resolve an id against user config first, then bundled defaults. Returns the
|
|
81
150
|
* resolved entry plus a `source` label so callers can surface "user override
|
|
82
151
|
* vs bundled default" without re-deriving it.
|
|
152
|
+
*
|
|
153
|
+
* When the raw id misses both maps, fall back to `AGENT_ID_ALIASES` so
|
|
154
|
+
* natural names like "claude code" or "Gemini CLI" resolve to the canonical
|
|
155
|
+
* id. The alias is consulted ONLY after both direct lookups miss, so a user
|
|
156
|
+
* config entry literally keyed "claude code" always wins over the alias.
|
|
83
157
|
*/
|
|
84
158
|
function lookupAgent(
|
|
85
159
|
userAgents: Record<string, AcpAgentConfig>,
|
|
86
160
|
id: string,
|
|
161
|
+
): { agent: AcpAgentConfig; source: AcpAgentSource } | undefined {
|
|
162
|
+
const direct = directLookup(userAgents, id);
|
|
163
|
+
if (direct) return direct;
|
|
164
|
+
const canonicalId = AGENT_ID_ALIASES[normalizeAgentId(id)];
|
|
165
|
+
return canonicalId !== undefined
|
|
166
|
+
? directLookup(userAgents, canonicalId)
|
|
167
|
+
: undefined;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
function directLookup(
|
|
171
|
+
userAgents: Record<string, AcpAgentConfig>,
|
|
172
|
+
id: string,
|
|
87
173
|
): { agent: AcpAgentConfig; source: AcpAgentSource } | undefined {
|
|
88
174
|
const userAgent = userAgents[id];
|
|
89
175
|
if (userAgent) return { agent: userAgent, source: "config" };
|
|
@@ -109,19 +195,15 @@ function mergedAgentIds(userAgents: Record<string, AcpAgentConfig>): string[] {
|
|
|
109
195
|
* Resolve an ACP agent id to its config + binary preflight result.
|
|
110
196
|
*
|
|
111
197
|
* Order of checks:
|
|
112
|
-
* 1.
|
|
113
|
-
* 2. The
|
|
114
|
-
*
|
|
198
|
+
* 1. The id must resolve to an agent (user config wins; falls back to defaults).
|
|
199
|
+
* 2. The agent must be runnable: its `command` on PATH (see
|
|
200
|
+
* `resolveRunnableAgent`).
|
|
115
201
|
*
|
|
116
202
|
* Each failure mode carries an actionable hint so callers can surface a
|
|
117
203
|
* single user-facing message without re-deriving the remediation.
|
|
118
204
|
*/
|
|
119
205
|
export function resolveAcpAgent(id: string): ResolveAcpAgentResult {
|
|
120
206
|
const config = getConfig();
|
|
121
|
-
if (!config.acp.enabled) {
|
|
122
|
-
return { ok: false, reason: "acp_disabled", hint: ACP_DISABLED_HINT };
|
|
123
|
-
}
|
|
124
|
-
|
|
125
207
|
const userAgents = config.acp.agents;
|
|
126
208
|
const found = lookupAgent(userAgents, id);
|
|
127
209
|
if (!found) {
|
|
@@ -133,7 +215,8 @@ export function resolveAcpAgent(id: string): ResolveAcpAgentResult {
|
|
|
133
215
|
}
|
|
134
216
|
|
|
135
217
|
const { agent } = found;
|
|
136
|
-
|
|
218
|
+
const runnable = resolveRunnableAgent(agent);
|
|
219
|
+
if (!runnable) {
|
|
137
220
|
return {
|
|
138
221
|
ok: false,
|
|
139
222
|
reason: "binary_not_found",
|
|
@@ -142,7 +225,7 @@ export function resolveAcpAgent(id: string): ResolveAcpAgentResult {
|
|
|
142
225
|
};
|
|
143
226
|
}
|
|
144
227
|
|
|
145
|
-
return { ok: true, agent };
|
|
228
|
+
return { ok: true, agent: runnable };
|
|
146
229
|
}
|
|
147
230
|
|
|
148
231
|
/**
|
|
@@ -150,25 +233,19 @@ export function resolveAcpAgent(id: string): ResolveAcpAgentResult {
|
|
|
150
233
|
* plus any user-only entries — with per-entry availability info. Used by the
|
|
151
234
|
* `acp_list_agents` tool to render setup steps when an agent's binary isn't
|
|
152
235
|
* installed yet.
|
|
153
|
-
*
|
|
154
|
-
* `enabled: false` short-circuits and returns an empty catalog so the tool
|
|
155
|
-
* can render a single "ACP is disabled" hint instead of advertising agents
|
|
156
|
-
* the user can't actually run.
|
|
157
236
|
*/
|
|
158
237
|
export function listAcpAgents(): {
|
|
159
|
-
enabled: boolean;
|
|
160
238
|
agents: AcpAgentEntry[];
|
|
161
239
|
} {
|
|
162
240
|
const config = getConfig();
|
|
163
|
-
if (!config.acp.enabled) {
|
|
164
|
-
return { enabled: false, agents: [] };
|
|
165
|
-
}
|
|
166
|
-
|
|
167
241
|
const userAgents = config.acp.agents;
|
|
168
242
|
const agents: AcpAgentEntry[] = mergedAgentIds(userAgents).map((id) => {
|
|
169
243
|
// Non-null: ids come from `mergedAgentIds` so the lookup always resolves.
|
|
170
244
|
const { agent, source } = lookupAgent(userAgents, id)!;
|
|
171
|
-
|
|
245
|
+
// Same binary preflight as `resolveAcpAgent`: available iff the command
|
|
246
|
+
// is on PATH. A missing binary is auto-installed at spawn time, but the
|
|
247
|
+
// catalog reflects what is runnable right now.
|
|
248
|
+
const available = resolveRunnableAgent(agent) !== null;
|
|
172
249
|
const entry: AcpAgentEntry = {
|
|
173
250
|
id,
|
|
174
251
|
command: agent.command,
|
|
@@ -183,5 +260,5 @@ export function listAcpAgents(): {
|
|
|
183
260
|
return entry;
|
|
184
261
|
});
|
|
185
262
|
|
|
186
|
-
return {
|
|
263
|
+
return { agents };
|
|
187
264
|
}
|
|
@@ -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
|
+
}
|