@vellumai/assistant 0.8.8 → 0.8.9-staging.1
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 +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 +236 -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 +185 -140
- 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-control-flow.test.ts +1 -1
- package/src/__tests__/app-dir-path-guard.test.ts +1 -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__/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 +59 -103
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +94 -189
- package/src/__tests__/conversation-agent-loop.test.ts +249 -490
- 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-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 +18 -16
- 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 +73 -6
- 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__/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 +101 -0
- package/src/acp/__tests__/prepare-agent-env.test.ts +137 -0
- package/src/acp/__tests__/session-manager-persistence.test.ts +95 -28
- package/src/acp/__tests__/session-manager-resume.test.ts +736 -0
- package/src/acp/agent-process.ts +61 -1
- package/src/acp/auto-install.test.ts +196 -0
- package/src/acp/auto-install.ts +177 -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 +83 -29
- package/src/acp/resolve-agent.test.ts +320 -7
- package/src/acp/resolve-agent.ts +182 -18
- package/src/acp/resume-hint.ts +25 -0
- package/src/acp/session-manager.ts +495 -73
- package/src/acp/types.ts +8 -0
- package/src/agent/compaction-circuit.ts +60 -102
- package/src/agent/loop.ts +390 -240
- 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 +83 -31
- 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 +29 -0
- 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/document-editor/SKILL.md +28 -23
- package/src/config/bundled-skills/document-editor/TOOLS.json +1 -1
- package/src/config/bundled-tool-registry.ts +2 -0
- package/src/config/feature-flag-registry.json +14 -5
- package/src/config/schemas/heartbeat.ts +9 -0
- 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 +167 -1005
- 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 +383 -56
- 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 -0
- 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/plugins/defaults/compaction/manager-store.ts +44 -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 +103 -38
- package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit-temp.ts +167 -56
- 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/proactive-artifact/aux-message-injector.ts +1 -1
- package/src/proactive-artifact/job.test.ts +1 -1
- 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 +283 -55
- package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +398 -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 +336 -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 +7 -1
- package/src/tools/acp/spawn.test.ts +158 -55
- package/src/tools/acp/spawn.ts +47 -72
- package/src/tools/acp/steer.test.ts +105 -8
- package/src/tools/acp/steer.ts +48 -17
- package/src/tools/apps/executors.ts +13 -8
- 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/{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
|
@@ -2,11 +2,11 @@ import { afterAll, beforeEach, describe, expect, mock, test } from "bun:test";
|
|
|
2
2
|
|
|
3
3
|
import { CompactionCircuit } from "../agent/compaction-circuit.js";
|
|
4
4
|
import type { AgentLoop } from "../agent/loop.js";
|
|
5
|
-
import type {
|
|
5
|
+
import type { Conversation } from "../daemon/conversation.js";
|
|
6
6
|
import type { DiskPressureStatus } from "../daemon/disk-pressure-guard.js";
|
|
7
7
|
import type { ServerMessage } from "../daemon/message-protocol.js";
|
|
8
8
|
|
|
9
|
-
type Context =
|
|
9
|
+
type Context = Conversation;
|
|
10
10
|
|
|
11
11
|
mock.module("../util/logger.js", () => ({
|
|
12
12
|
getLogger: () =>
|
|
@@ -96,7 +96,7 @@ mock.module("../memory/conversation-crud.js", () => ({
|
|
|
96
96
|
getMessageById: () => null,
|
|
97
97
|
getConversationOriginChannel: () => null,
|
|
98
98
|
getConversationOriginInterface: () => null,
|
|
99
|
-
|
|
99
|
+
resolveOverrideProfile: () => null,
|
|
100
100
|
provenanceFromTrustContext: () => ({}),
|
|
101
101
|
setConversationHistoryStrippedAt: () => {},
|
|
102
102
|
updateConversationContextWindow: () => {},
|
|
@@ -106,9 +106,7 @@ mock.module("../memory/conversation-crud.js", () => ({
|
|
|
106
106
|
|
|
107
107
|
import { runAgentLoopImpl } from "../daemon/conversation-agent-loop.js";
|
|
108
108
|
|
|
109
|
-
function makeCtx(
|
|
110
|
-
overrides: Partial<Context> = {},
|
|
111
|
-
): AgentLoopConversationContext {
|
|
109
|
+
function makeCtx(overrides: Partial<Context> = {}): Conversation {
|
|
112
110
|
let processing = true;
|
|
113
111
|
return {
|
|
114
112
|
conversationId: "conv-123",
|
|
@@ -137,6 +135,8 @@ function makeCtx(
|
|
|
137
135
|
} as unknown as Context["contextWindowManager"],
|
|
138
136
|
contextCompactedMessageCount: 0,
|
|
139
137
|
contextCompactedAt: null,
|
|
138
|
+
conversationType: "background",
|
|
139
|
+
source: "memory",
|
|
140
140
|
memoryPolicy: { scopeId: "default", includeDefaultFallback: true },
|
|
141
141
|
currentActiveSurfaceId: undefined,
|
|
142
142
|
currentPage: undefined,
|
|
@@ -145,8 +145,6 @@ function makeCtx(
|
|
|
145
145
|
surfaceActionRequestIds: new Set<string>(),
|
|
146
146
|
currentTurnSurfaces: [],
|
|
147
147
|
workingDir: "/tmp",
|
|
148
|
-
workspaceTopLevelContext: null,
|
|
149
|
-
workspaceTopLevelDirty: false,
|
|
150
148
|
channelCapabilities: undefined,
|
|
151
149
|
commandIntent: undefined,
|
|
152
150
|
trustContext: undefined,
|
|
@@ -172,7 +170,6 @@ function makeCtx(
|
|
|
172
170
|
hasNoClient: false,
|
|
173
171
|
prompter: {} as Context["prompter"],
|
|
174
172
|
queue: {} as Context["queue"],
|
|
175
|
-
refreshWorkspaceTopLevelContextIfNeeded: () => {},
|
|
176
173
|
markWorkspaceTopLevelDirty: () => {},
|
|
177
174
|
emitActivityState: () => {},
|
|
178
175
|
getQueueDepth: () => 0,
|
|
@@ -183,7 +180,7 @@ function makeCtx(
|
|
|
183
180
|
getTurnChannelContext: () => null,
|
|
184
181
|
graphMemory: {} as Context["graphMemory"],
|
|
185
182
|
...overrides,
|
|
186
|
-
} as
|
|
183
|
+
} as unknown as Conversation;
|
|
187
184
|
}
|
|
188
185
|
|
|
189
186
|
describe("runAgentLoopImpl disk pressure gate", () => {
|
|
@@ -15,7 +15,7 @@ import { createRequire } from "node:module";
|
|
|
15
15
|
import { afterAll, beforeEach, describe, expect, mock, test } from "bun:test";
|
|
16
16
|
|
|
17
17
|
import { CompactionCircuit } from "../agent/compaction-circuit.js";
|
|
18
|
-
import type {
|
|
18
|
+
import type { AgentLoopRunOptions } from "../agent/loop.js";
|
|
19
19
|
import type { LLMCallSite } from "../config/schemas/llm.js";
|
|
20
20
|
import { resetPluginRegistryAndRegisterDefaults } from "../plugins/defaults/index.js";
|
|
21
21
|
import type { Message, ToolDefinition } from "../providers/types.js";
|
|
@@ -150,12 +150,26 @@ mock.module("../memory/conversation-crud.js", () => ({
|
|
|
150
150
|
updateMessageMetadata: () => {},
|
|
151
151
|
getMessages: () => [],
|
|
152
152
|
getConversation: () => mockConversationRow,
|
|
153
|
-
|
|
154
|
-
|
|
153
|
+
resolveOverrideProfile: (
|
|
154
|
+
fields: {
|
|
155
|
+
conversationType?: string | null;
|
|
156
|
+
inferenceProfile?: string | null;
|
|
157
|
+
inferenceProfileExpiresAt?: number | null;
|
|
158
|
+
} | null,
|
|
155
159
|
) => {
|
|
156
|
-
if (
|
|
157
|
-
|
|
158
|
-
|
|
160
|
+
if (
|
|
161
|
+
fields?.conversationType === "background" ||
|
|
162
|
+
fields?.conversationType === "scheduled"
|
|
163
|
+
) {
|
|
164
|
+
return undefined;
|
|
165
|
+
}
|
|
166
|
+
if (
|
|
167
|
+
fields?.inferenceProfileExpiresAt != null &&
|
|
168
|
+
fields.inferenceProfileExpiresAt <= Date.now()
|
|
169
|
+
) {
|
|
170
|
+
return undefined;
|
|
171
|
+
}
|
|
172
|
+
return fields?.inferenceProfile ?? undefined;
|
|
159
173
|
},
|
|
160
174
|
provenanceFromTrustContext: () => ({
|
|
161
175
|
source: "user",
|
|
@@ -343,10 +357,8 @@ mock.module("../memory/llm-request-log-store.js", () => ({
|
|
|
343
357
|
|
|
344
358
|
// ── Imports (after mocks) ────────────────────────────────────────────
|
|
345
359
|
|
|
346
|
-
import {
|
|
347
|
-
|
|
348
|
-
runAgentLoopImpl,
|
|
349
|
-
} from "../daemon/conversation-agent-loop.js";
|
|
360
|
+
import type { Conversation } from "../daemon/conversation.js";
|
|
361
|
+
import { runAgentLoopImpl } from "../daemon/conversation-agent-loop.js";
|
|
350
362
|
|
|
351
363
|
// ── Test helpers ─────────────────────────────────────────────────────
|
|
352
364
|
|
|
@@ -362,22 +374,20 @@ let mutateBeforeResolveOverrideProfile: (() => void) | undefined;
|
|
|
362
374
|
|
|
363
375
|
function makeCtx(
|
|
364
376
|
captured: CapturedAgentLoopRun[],
|
|
365
|
-
overrides?: Partial<
|
|
366
|
-
):
|
|
377
|
+
overrides?: Partial<Conversation>,
|
|
378
|
+
): Conversation {
|
|
367
379
|
const agentLoopRun = async (
|
|
368
|
-
|
|
369
|
-
_onEvent: (event: AgentEvent) => void,
|
|
370
|
-
options?: AgentLoopRunOptions,
|
|
380
|
+
options: AgentLoopRunOptions,
|
|
371
381
|
): Promise<Message[]> => {
|
|
372
382
|
mutateBeforeResolveOverrideProfile?.();
|
|
373
383
|
captured.push({
|
|
374
|
-
callSite: options
|
|
375
|
-
overrideProfile: options
|
|
376
|
-
resolvedOverrideProfile: options
|
|
377
|
-
resolvedMaxInputTokens: options
|
|
384
|
+
callSite: options.callSite,
|
|
385
|
+
overrideProfile: options.overrideProfile,
|
|
386
|
+
resolvedOverrideProfile: options.resolveOverrideProfile?.(),
|
|
387
|
+
resolvedMaxInputTokens: options.resolveContextWindow?.().maxInputTokens,
|
|
378
388
|
});
|
|
379
389
|
return [
|
|
380
|
-
...messages,
|
|
390
|
+
...options.messages,
|
|
381
391
|
{
|
|
382
392
|
role: "assistant" as const,
|
|
383
393
|
content: [{ type: "text" as const, text: "response" }],
|
|
@@ -406,7 +416,7 @@ function makeCtx(
|
|
|
406
416
|
getResolvedTools: () => [] as ToolDefinition[],
|
|
407
417
|
getActiveModel: () => undefined,
|
|
408
418
|
compactionCircuit: new CompactionCircuit("test-conv"),
|
|
409
|
-
} as unknown as
|
|
419
|
+
} as unknown as Conversation["agentLoop"],
|
|
410
420
|
provider: {
|
|
411
421
|
name: "mock-provider",
|
|
412
422
|
sendMessage: async () => ({
|
|
@@ -415,13 +425,14 @@ function makeCtx(
|
|
|
415
425
|
usage: { inputTokens: 0, outputTokens: 0 },
|
|
416
426
|
stopReason: "end_turn",
|
|
417
427
|
}),
|
|
418
|
-
} as unknown as
|
|
428
|
+
} as unknown as Conversation["provider"],
|
|
419
429
|
systemPrompt: "system prompt",
|
|
420
430
|
|
|
421
431
|
contextWindowManager: {
|
|
432
|
+
updateConfig: () => {},
|
|
422
433
|
shouldCompact: () => ({ needed: false, estimatedTokens: 0 }),
|
|
423
434
|
maybeCompact: async () => ({ compacted: false }),
|
|
424
|
-
} as unknown as
|
|
435
|
+
} as unknown as Conversation["contextWindowManager"],
|
|
425
436
|
contextCompactedMessageCount: 0,
|
|
426
437
|
contextCompactedAt: null,
|
|
427
438
|
|
|
@@ -435,8 +446,6 @@ function makeCtx(
|
|
|
435
446
|
currentTurnSurfaces: [],
|
|
436
447
|
|
|
437
448
|
workingDir: "/tmp",
|
|
438
|
-
workspaceTopLevelContext: null,
|
|
439
|
-
workspaceTopLevelDirty: false,
|
|
440
449
|
channelCapabilities: undefined,
|
|
441
450
|
commandIntent: undefined,
|
|
442
451
|
trustContext: undefined,
|
|
@@ -446,15 +455,15 @@ function makeCtx(
|
|
|
446
455
|
preactivatedSkillIds: undefined,
|
|
447
456
|
skillProjectionState: new Map(),
|
|
448
457
|
skillProjectionCache:
|
|
449
|
-
new Map() as unknown as
|
|
458
|
+
new Map() as unknown as Conversation["skillProjectionCache"],
|
|
450
459
|
|
|
451
460
|
traceEmitter: {
|
|
452
461
|
emit: () => {},
|
|
453
|
-
} as unknown as
|
|
462
|
+
} as unknown as Conversation["traceEmitter"],
|
|
454
463
|
profiler: {
|
|
455
464
|
startRequest: () => {},
|
|
456
465
|
emitSummary: () => {},
|
|
457
|
-
} as unknown as
|
|
466
|
+
} as unknown as Conversation["profiler"],
|
|
458
467
|
usageStats: {
|
|
459
468
|
totalInputTokens: 0,
|
|
460
469
|
totalOutputTokens: 0,
|
|
@@ -467,13 +476,12 @@ function makeCtx(
|
|
|
467
476
|
lastAttachmentWarnings: [],
|
|
468
477
|
|
|
469
478
|
hasNoClient: false,
|
|
470
|
-
prompter: {} as unknown as
|
|
471
|
-
queue: {} as unknown as
|
|
479
|
+
prompter: {} as unknown as Conversation["prompter"],
|
|
480
|
+
queue: {} as unknown as Conversation["queue"],
|
|
472
481
|
|
|
473
482
|
getWorkspaceGitService: () => ({ ensureInitialized: async () => {} }),
|
|
474
483
|
commitTurnChanges: async () => {},
|
|
475
484
|
|
|
476
|
-
refreshWorkspaceTopLevelContextIfNeeded: () => {},
|
|
477
485
|
markWorkspaceTopLevelDirty: () => {},
|
|
478
486
|
emitActivityState: () => {},
|
|
479
487
|
getQueueDepth: () => 0,
|
|
@@ -500,10 +508,10 @@ function makeCtx(
|
|
|
500
508
|
}),
|
|
501
509
|
retrackCachedNodes: () => {},
|
|
502
510
|
recordPkbQueryVectors: () => {},
|
|
503
|
-
} as unknown as
|
|
511
|
+
} as unknown as Conversation["graphMemory"],
|
|
504
512
|
|
|
505
513
|
...overrides,
|
|
506
|
-
} as
|
|
514
|
+
} as unknown as Conversation;
|
|
507
515
|
}
|
|
508
516
|
|
|
509
517
|
// ── Tests ────────────────────────────────────────────────────────────
|
|
@@ -541,20 +549,11 @@ afterAll(() => {
|
|
|
541
549
|
|
|
542
550
|
describe("runAgentLoopImpl — per-conversation inferenceProfile", () => {
|
|
543
551
|
test("non-background conversation with inferenceProfile threads it through as overrideProfile", async () => {
|
|
544
|
-
|
|
545
|
-
|
|
552
|
+
const captured: CapturedAgentLoopRun[] = [];
|
|
553
|
+
const ctx = makeCtx(captured, {
|
|
546
554
|
conversationType: "standard",
|
|
547
555
|
inferenceProfile: "quality-optimized",
|
|
548
|
-
|
|
549
|
-
contextCompactedMessageCount: 0,
|
|
550
|
-
totalInputTokens: 0,
|
|
551
|
-
totalOutputTokens: 0,
|
|
552
|
-
totalEstimatedCost: 0,
|
|
553
|
-
title: null,
|
|
554
|
-
};
|
|
555
|
-
|
|
556
|
-
const captured: CapturedAgentLoopRun[] = [];
|
|
557
|
-
const ctx = makeCtx(captured);
|
|
556
|
+
});
|
|
558
557
|
|
|
559
558
|
await runAgentLoopImpl(ctx, "hello", "msg-1", () => {});
|
|
560
559
|
|
|
@@ -564,21 +563,12 @@ describe("runAgentLoopImpl — per-conversation inferenceProfile", () => {
|
|
|
564
563
|
}
|
|
565
564
|
});
|
|
566
565
|
|
|
567
|
-
test("background conversation ignores inferenceProfile
|
|
568
|
-
|
|
569
|
-
|
|
566
|
+
test("background conversation ignores inferenceProfile", async () => {
|
|
567
|
+
const captured: CapturedAgentLoopRun[] = [];
|
|
568
|
+
const ctx = makeCtx(captured, {
|
|
570
569
|
conversationType: "background",
|
|
571
570
|
inferenceProfile: "quality-optimized",
|
|
572
|
-
|
|
573
|
-
contextCompactedMessageCount: 0,
|
|
574
|
-
totalInputTokens: 0,
|
|
575
|
-
totalOutputTokens: 0,
|
|
576
|
-
totalEstimatedCost: 0,
|
|
577
|
-
title: null,
|
|
578
|
-
};
|
|
579
|
-
|
|
580
|
-
const captured: CapturedAgentLoopRun[] = [];
|
|
581
|
-
const ctx = makeCtx(captured);
|
|
571
|
+
});
|
|
582
572
|
|
|
583
573
|
await runAgentLoopImpl(ctx, "hello", "msg-1", () => {});
|
|
584
574
|
|
|
@@ -588,22 +578,9 @@ describe("runAgentLoopImpl — per-conversation inferenceProfile", () => {
|
|
|
588
578
|
}
|
|
589
579
|
});
|
|
590
580
|
|
|
591
|
-
test("absence of inferenceProfile
|
|
592
|
-
// `mockConversationRow` already defaults to inferenceProfile: null.
|
|
593
|
-
// Also explicitly cover the case where the column is missing entirely.
|
|
594
|
-
mockConversationRow = {
|
|
595
|
-
id: "conv-1",
|
|
596
|
-
conversationType: "standard",
|
|
597
|
-
contextSummary: null,
|
|
598
|
-
contextCompactedMessageCount: 0,
|
|
599
|
-
totalInputTokens: 0,
|
|
600
|
-
totalOutputTokens: 0,
|
|
601
|
-
totalEstimatedCost: 0,
|
|
602
|
-
title: null,
|
|
603
|
-
};
|
|
604
|
-
|
|
581
|
+
test("absence of inferenceProfile behaves identically to today (no override)", async () => {
|
|
605
582
|
const captured: CapturedAgentLoopRun[] = [];
|
|
606
|
-
const ctx = makeCtx(captured);
|
|
583
|
+
const ctx = makeCtx(captured, { conversationType: "standard" });
|
|
607
584
|
|
|
608
585
|
await runAgentLoopImpl(ctx, "hello", "msg-1", () => {});
|
|
609
586
|
|
|
@@ -613,26 +590,17 @@ describe("runAgentLoopImpl — per-conversation inferenceProfile", () => {
|
|
|
613
590
|
}
|
|
614
591
|
});
|
|
615
592
|
|
|
616
|
-
test("explicit options.overrideProfile takes precedence over the
|
|
593
|
+
test("explicit options.overrideProfile takes precedence over the conversation override", async () => {
|
|
617
594
|
// Subagent path: SubagentManager forwards the parent's pinned profile
|
|
618
595
|
// into the spawned (background) conversation's runAgentLoop call via
|
|
619
596
|
// `options.overrideProfile`. The agent loop must respect that even
|
|
620
|
-
// though the subagent's own conversation
|
|
597
|
+
// though the subagent's own conversation is `background` (which
|
|
621
598
|
// would otherwise zero out the override per the rule above).
|
|
622
|
-
|
|
623
|
-
|
|
599
|
+
const captured: CapturedAgentLoopRun[] = [];
|
|
600
|
+
const ctx = makeCtx(captured, {
|
|
624
601
|
conversationType: "background",
|
|
625
602
|
inferenceProfile: null,
|
|
626
|
-
|
|
627
|
-
contextCompactedMessageCount: 0,
|
|
628
|
-
totalInputTokens: 0,
|
|
629
|
-
totalOutputTokens: 0,
|
|
630
|
-
totalEstimatedCost: 0,
|
|
631
|
-
title: null,
|
|
632
|
-
};
|
|
633
|
-
|
|
634
|
-
const captured: CapturedAgentLoopRun[] = [];
|
|
635
|
-
const ctx = makeCtx(captured);
|
|
603
|
+
});
|
|
636
604
|
|
|
637
605
|
await runAgentLoopImpl(ctx, "hello", "msg-1", () => {}, {
|
|
638
606
|
overrideProfile: "fast",
|
|
@@ -645,27 +613,15 @@ describe("runAgentLoopImpl — per-conversation inferenceProfile", () => {
|
|
|
645
613
|
});
|
|
646
614
|
|
|
647
615
|
test("re-resolves inferenceProfile when a tool changes it mid-turn", async () => {
|
|
648
|
-
|
|
649
|
-
|
|
616
|
+
const captured: CapturedAgentLoopRun[] = [];
|
|
617
|
+
const ctx = makeCtx(captured, {
|
|
650
618
|
conversationType: "standard",
|
|
651
619
|
inferenceProfile: null,
|
|
652
|
-
|
|
653
|
-
contextCompactedMessageCount: 0,
|
|
654
|
-
totalInputTokens: 0,
|
|
655
|
-
totalOutputTokens: 0,
|
|
656
|
-
totalEstimatedCost: 0,
|
|
657
|
-
title: null,
|
|
658
|
-
};
|
|
620
|
+
});
|
|
659
621
|
mutateBeforeResolveOverrideProfile = () => {
|
|
660
|
-
|
|
661
|
-
...mockConversationRow!,
|
|
662
|
-
inferenceProfile: "quality-optimized",
|
|
663
|
-
};
|
|
622
|
+
ctx.inferenceProfile = "quality-optimized";
|
|
664
623
|
};
|
|
665
624
|
|
|
666
|
-
const captured: CapturedAgentLoopRun[] = [];
|
|
667
|
-
const ctx = makeCtx(captured);
|
|
668
|
-
|
|
669
625
|
await runAgentLoopImpl(ctx, "hello", "msg-1", () => {});
|
|
670
626
|
|
|
671
627
|
expect(captured.length).toBeGreaterThan(0);
|