@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
|
@@ -1,75 +1,107 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Default `user-prompt-submit-temp` hook:
|
|
3
|
-
*
|
|
2
|
+
* Default `user-prompt-submit-temp` hook: prepares a turn's prompt before the
|
|
3
|
+
* first provider call by running memory-graph retrieval and then applying the
|
|
4
|
+
* runtime injections that assemble the turn.
|
|
4
5
|
*
|
|
5
6
|
* **Memory graph** via {@link ConversationGraphMemory.prepareMemory} —
|
|
6
7
|
* dispatches to context-load or per-turn retrieval depending on initialization
|
|
7
|
-
* state; gated on the actor being trusted (guardian).
|
|
8
|
+
* state; gated on the actor being trusted (guardian). The hook owns the
|
|
9
|
+
* retrieval's side effects — persisting the injected block onto the user
|
|
10
|
+
* message's metadata, writing the recall log, and emitting the
|
|
11
|
+
* `memory_recalled` event. The PKB query-vector pair is recorded on the
|
|
12
|
+
* conversation's graph handle for the PKB-reminder injector to read back. PKB
|
|
13
|
+
* context and NOW.md are sourced directly by their injectors (gated on block
|
|
14
|
+
* presence), not produced here.
|
|
8
15
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
+
* **Runtime injection** via {@link applyRuntimeInjections} — runs for every
|
|
17
|
+
* actor (not just trusted ones) on the retrieved history, assembling the Slack
|
|
18
|
+
* chronological transcript, the unified `<turn_context>` block,
|
|
19
|
+
* channel/voice/transport hints, and the NOW.md / PKB / memory-v2 / workspace
|
|
20
|
+
* blocks, then persisting the assembled blocks onto the user message's metadata
|
|
21
|
+
* so they survive reloads. This is the first-call counterpart of the
|
|
22
|
+
* post-compaction hook, which re-applies the same injections after a mid-loop
|
|
23
|
+
* compaction.
|
|
16
24
|
*
|
|
17
25
|
* This fires at the early "prompt submitted, before context assembly" moment,
|
|
18
|
-
*
|
|
19
|
-
* title)
|
|
20
|
-
* that
|
|
21
|
-
* transitional staging point that folds into `user-prompt-submit` once
|
|
26
|
+
* ahead of the canonical late `user-prompt-submit` hook (history repair,
|
|
27
|
+
* title), which normalizes the assembled history after the overflow-reduction
|
|
28
|
+
* transform that runs between the two moments. The `-temp` suffix marks this as
|
|
29
|
+
* a transitional staging point that folds into `user-prompt-submit` once
|
|
22
30
|
* compaction is cleared from the gap between the two call sites.
|
|
23
31
|
*/
|
|
24
32
|
|
|
25
33
|
import type { PluginHookFn } from "@vellumai/plugin-api";
|
|
26
34
|
import type { Logger } from "pino";
|
|
27
35
|
|
|
28
|
-
import
|
|
36
|
+
import { getConfig } from "../../../../config/loader.js";
|
|
37
|
+
import { findConversationOrSubagent } from "../../../../daemon/conversation-registry.js";
|
|
38
|
+
import {
|
|
39
|
+
applyRuntimeInjections,
|
|
40
|
+
type InboundActorContext,
|
|
41
|
+
type InjectionMode,
|
|
42
|
+
type RuntimeInjectionResult,
|
|
43
|
+
} from "../../../../daemon/conversation-runtime-assembly.js";
|
|
29
44
|
import type { ServerMessage } from "../../../../daemon/message-protocol.js";
|
|
30
45
|
import type { MemoryRecalled } from "../../../../daemon/message-types/memory.js";
|
|
46
|
+
import { resolveTrustClass } from "../../../../daemon/trust-context.js";
|
|
31
47
|
import { updateMessageMetadata } from "../../../../memory/conversation-crud.js";
|
|
32
|
-
import type { ConversationGraphMemory } from "../../../../memory/graph/conversation-graph-memory.js";
|
|
33
48
|
import { recordMemoryRecallLog } from "../../../../memory/memory-recall-log-store.js";
|
|
34
49
|
import type { Message } from "../../../../providers/types.js";
|
|
35
50
|
import type { GraphMemoryResult } from "../../../types.js";
|
|
36
51
|
|
|
37
52
|
/**
|
|
38
|
-
* Context threaded through the `user-prompt-submit-temp` hook. The
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
* the injected result.
|
|
53
|
+
* Context threaded through the `user-prompt-submit-temp` hook. The
|
|
54
|
+
* conversation-scoped retrieval state (graph handle, abort signal, trust
|
|
55
|
+
* class) is self-resolved from the live conversation by id; the readonly
|
|
56
|
+
* fields here carry the event sink and the turn-start injection snapshot,
|
|
57
|
+
* while `latestMessages` straddles input and output — the loop seeds it with
|
|
58
|
+
* the pre-injection array and the hook overwrites it with the injected result.
|
|
44
59
|
*/
|
|
45
60
|
export interface MemoryRetrievalHookContext {
|
|
46
|
-
/** Per-conversation memory graph handle. */
|
|
47
|
-
readonly graphMemory: ConversationGraphMemory;
|
|
48
|
-
/** Assistant config snapshot. */
|
|
49
|
-
readonly config: AssistantConfig;
|
|
50
61
|
/** Event sink used by the graph retriever and `memory_recalled` emission. */
|
|
51
62
|
readonly onEvent: (msg: ServerMessage) => void;
|
|
52
|
-
/** True when the actor for this turn is trusted (guardian-class). */
|
|
53
|
-
readonly isTrustedActor: boolean;
|
|
54
63
|
/** Conversation the turn belongs to — keys the recall-log row. */
|
|
55
64
|
readonly conversationId: string;
|
|
56
65
|
/** User message the injected memory block is persisted onto. */
|
|
57
66
|
readonly userMessageId: string;
|
|
58
67
|
/** Turn-scoped logger for non-fatal persistence warnings. */
|
|
59
68
|
readonly logger: Logger;
|
|
60
|
-
/**
|
|
61
|
-
* Per-turn abort signal forwarded to `prepareMemory`. An external cancel
|
|
62
|
-
* aborts the underlying retrieval instead of letting it run to completion.
|
|
63
|
-
*/
|
|
64
|
-
readonly signal: AbortSignal;
|
|
65
69
|
/**
|
|
66
70
|
* Working message list for the turn. Seeded by the loop with the
|
|
67
71
|
* pre-injection messages and consumed as the retrieval input; the hook
|
|
68
|
-
* overwrites it with the memory-graph block
|
|
69
|
-
*
|
|
70
|
-
* retrieval). Read back by the loop.
|
|
72
|
+
* overwrites it with the fully injected result (the memory-graph block, when
|
|
73
|
+
* the actor is trusted, plus the runtime injections). Read back by the loop.
|
|
71
74
|
*/
|
|
72
75
|
latestMessages: Message[];
|
|
76
|
+
/**
|
|
77
|
+
* Stable ID for the current request, forwarded onto the injector turn
|
|
78
|
+
* context. The one turn-identity field the live conversation can't recover.
|
|
79
|
+
*/
|
|
80
|
+
readonly requestId: string | undefined;
|
|
81
|
+
/**
|
|
82
|
+
* Injection volume for the assembled blocks. `"full"` on the first call;
|
|
83
|
+
* overflow reduction downgrades subsequent re-injection, but the first-call
|
|
84
|
+
* assembly this hook performs runs at the loop's committed mode.
|
|
85
|
+
*/
|
|
86
|
+
readonly mode: InjectionMode;
|
|
87
|
+
/**
|
|
88
|
+
* Whether the in-flight turn has no human present to answer clarification
|
|
89
|
+
* questions. Resolved once at turn start and threaded in so injection uses
|
|
90
|
+
* the turn-start snapshot rather than live state that can flip mid-turn.
|
|
91
|
+
*/
|
|
92
|
+
readonly isNonInteractive: boolean;
|
|
93
|
+
/**
|
|
94
|
+
* The `model_profile:` turn-context label, or `null` when the active
|
|
95
|
+
* inference profile is unchanged since the last notified one. Resolved once
|
|
96
|
+
* at turn start, so it is threaded in rather than re-derived.
|
|
97
|
+
*/
|
|
98
|
+
readonly modelProfile: string | null;
|
|
99
|
+
/**
|
|
100
|
+
* Inbound actor identity and trust fields for the unified `<turn_context>`
|
|
101
|
+
* block, or `null` on guardian turns (which suppress the actor section).
|
|
102
|
+
* Resolved once at turn start from the actor-trust resolver and threaded in.
|
|
103
|
+
*/
|
|
104
|
+
readonly actorContext: InboundActorContext | null;
|
|
73
105
|
}
|
|
74
106
|
|
|
75
107
|
/**
|
|
@@ -160,10 +192,63 @@ function recordRecallSideEffects(
|
|
|
160
192
|
}
|
|
161
193
|
|
|
162
194
|
/**
|
|
163
|
-
*
|
|
164
|
-
*
|
|
165
|
-
*
|
|
166
|
-
*
|
|
195
|
+
* Persist the assembled runtime-injection blocks onto the user message's
|
|
196
|
+
* metadata so they survive conversation reloads (eviction, restart, fork) —
|
|
197
|
+
* loadFromDb re-injects from metadata. Only this first-call site persists: the
|
|
198
|
+
* mid-loop re-entry sites send identical bytes and their tail row may not
|
|
199
|
+
* correspond to `userMessageId`. All present blocks are written in a single
|
|
200
|
+
* update to avoid doubling SQLite SELECT+UPDATE work each turn. Best-effort — a
|
|
201
|
+
* persistence failure must not abort the turn.
|
|
202
|
+
*/
|
|
203
|
+
function persistInjectionBlocks(
|
|
204
|
+
blocks: RuntimeInjectionResult["blocks"],
|
|
205
|
+
ctx: MemoryRetrievalHookContext,
|
|
206
|
+
): void {
|
|
207
|
+
if (
|
|
208
|
+
!blocks.unifiedTurnContext &&
|
|
209
|
+
!blocks.pkbSystemReminder &&
|
|
210
|
+
!blocks.workspaceBlock &&
|
|
211
|
+
!blocks.nowScratchpadBlock &&
|
|
212
|
+
!blocks.pkbContextBlock &&
|
|
213
|
+
!blocks.memoryV2StaticBlock
|
|
214
|
+
) {
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
try {
|
|
218
|
+
const metadataUpdates: Record<string, unknown> = {};
|
|
219
|
+
if (blocks.unifiedTurnContext) {
|
|
220
|
+
metadataUpdates.turnContextBlock = blocks.unifiedTurnContext;
|
|
221
|
+
}
|
|
222
|
+
if (blocks.pkbSystemReminder) {
|
|
223
|
+
metadataUpdates.pkbSystemReminderBlock = blocks.pkbSystemReminder;
|
|
224
|
+
}
|
|
225
|
+
if (blocks.workspaceBlock) {
|
|
226
|
+
metadataUpdates.workspaceBlock = blocks.workspaceBlock;
|
|
227
|
+
}
|
|
228
|
+
if (blocks.nowScratchpadBlock) {
|
|
229
|
+
metadataUpdates.nowScratchpadBlock = blocks.nowScratchpadBlock;
|
|
230
|
+
}
|
|
231
|
+
if (blocks.pkbContextBlock) {
|
|
232
|
+
metadataUpdates.pkbContextBlock = blocks.pkbContextBlock;
|
|
233
|
+
}
|
|
234
|
+
if (blocks.memoryV2StaticBlock) {
|
|
235
|
+
metadataUpdates.memoryV2StaticBlock = blocks.memoryV2StaticBlock;
|
|
236
|
+
}
|
|
237
|
+
updateMessageMetadata(ctx.userMessageId, metadataUpdates);
|
|
238
|
+
} catch (err) {
|
|
239
|
+
ctx.logger.warn(
|
|
240
|
+
{ err },
|
|
241
|
+
"Failed to persist injection metadata (non-fatal)",
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Run the default retrieval and assemble the turn's prompt. Memory-graph
|
|
248
|
+
* retrieval is gated on the actor being trusted (guardian); untrusted actors
|
|
249
|
+
* skip it, leaving `latestMessages` as the seeded input. Runtime injection then
|
|
250
|
+
* runs for every actor, writing the fully injected result back onto
|
|
251
|
+
* `latestMessages` and persisting the assembled blocks.
|
|
167
252
|
*
|
|
168
253
|
* Memory retrieval blocks the turn — there is no soft timeout here. Memory is
|
|
169
254
|
* critical context, and silently dropping it produces a worse outcome than a
|
|
@@ -173,44 +258,69 @@ function recordRecallSideEffects(
|
|
|
173
258
|
const userPromptSubmitMemoryRetrieval: PluginHookFn<
|
|
174
259
|
MemoryRetrievalHookContext
|
|
175
260
|
> = async (ctx) => {
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
261
|
+
// The conversation-scoped retrieval state — graph handle, abort signal, and
|
|
262
|
+
// trust class — is resolved from the live conversation by id rather than
|
|
263
|
+
// threaded in, mirroring how `applyRuntimeInjections` self-resolves its
|
|
264
|
+
// per-turn inputs.
|
|
265
|
+
const conversation = findConversationOrSubagent(ctx.conversationId);
|
|
266
|
+
const abortSignal = conversation?.abortController?.signal;
|
|
267
|
+
const isTrustedActor =
|
|
268
|
+
resolveTrustClass(conversation?.trustContext) === "guardian";
|
|
180
269
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
270
|
+
if (conversation && isTrustedActor && abortSignal) {
|
|
271
|
+
const graphResult = await conversation.graphMemory.prepareMemory(
|
|
272
|
+
ctx.latestMessages,
|
|
273
|
+
getConfig(),
|
|
274
|
+
abortSignal,
|
|
275
|
+
ctx.onEvent,
|
|
276
|
+
);
|
|
187
277
|
|
|
188
|
-
|
|
278
|
+
recordRecallSideEffects(graphResult, ctx);
|
|
189
279
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
280
|
+
ctx.latestMessages = graphResult.runMessages;
|
|
281
|
+
// Select dense+sparse as a matched pair so RRF fusion combines two signals
|
|
282
|
+
// aligned to the same query text:
|
|
283
|
+
// 1. Context-load with a user query: user-query dense + user-query sparse
|
|
284
|
+
// — the cleanest pairing.
|
|
285
|
+
// 2. Otherwise (context-load without a user query, or per-turn): whatever
|
|
286
|
+
// `queryVector` / `sparseVector` the retriever produced, which are
|
|
287
|
+
// themselves co-aligned (both summary-derived in context-load, both
|
|
288
|
+
// user-last-message-derived in per-turn).
|
|
289
|
+
// Never pair a user-query dense with a summary-aligned sparse.
|
|
290
|
+
// The PKB-reminder injector reads this pair back off the same graph handle
|
|
291
|
+
// (looked up by conversation id) rather than receiving it threaded through
|
|
292
|
+
// the agent loop.
|
|
293
|
+
if (graphResult.userQueryVector) {
|
|
294
|
+
conversation.graphMemory.recordPkbQueryVectors(
|
|
295
|
+
graphResult.userQueryVector,
|
|
296
|
+
graphResult.userQuerySparseVector,
|
|
297
|
+
);
|
|
298
|
+
} else {
|
|
299
|
+
conversation.graphMemory.recordPkbQueryVectors(
|
|
300
|
+
graphResult.queryVector,
|
|
301
|
+
graphResult.sparseVector,
|
|
302
|
+
);
|
|
303
|
+
}
|
|
213
304
|
}
|
|
305
|
+
|
|
306
|
+
// Runtime injection assembles the turn's prompt onto the retrieved history.
|
|
307
|
+
// It runs for every actor (untrusted actors skip only the memory-graph step
|
|
308
|
+
// above). `applyRuntimeInjections` self-resolves every per-turn injection
|
|
309
|
+
// input — the Slack chronological transcript, the unified `<turn_context>`
|
|
310
|
+
// block, channel/voice/transport hints, and the turn's trust/index/call-site
|
|
311
|
+
// — from the live conversation, so we hand in only the request id and
|
|
312
|
+
// conversation id plus the fields resolved once at turn start (`mode`,
|
|
313
|
+
// `isNonInteractive`, `modelProfile`, `actorContext`).
|
|
314
|
+
const injection = await applyRuntimeInjections(ctx.latestMessages, {
|
|
315
|
+
isNonInteractive: ctx.isNonInteractive,
|
|
316
|
+
modelProfile: ctx.modelProfile,
|
|
317
|
+
actorContext: ctx.actorContext,
|
|
318
|
+
mode: ctx.mode,
|
|
319
|
+
requestId: ctx.requestId,
|
|
320
|
+
conversationId: ctx.conversationId,
|
|
321
|
+
});
|
|
322
|
+
ctx.latestMessages = injection.messages;
|
|
323
|
+
persistInjectionBlocks(injection.blocks, ctx);
|
|
214
324
|
};
|
|
215
325
|
|
|
216
326
|
export default userPromptSubmitMemoryRetrieval;
|
|
@@ -18,9 +18,9 @@
|
|
|
18
18
|
* ordering assumptions about when `defaultInjectors` finishes initializing.
|
|
19
19
|
*/
|
|
20
20
|
|
|
21
|
-
import { memoryV3Injector } from "../../../memory/v3/shadow-plugin.js";
|
|
22
21
|
import type { Injector } from "../../types.js";
|
|
23
|
-
import {
|
|
22
|
+
import { memoryV3Injector } from "../memory-v3-shadow/injector.js";
|
|
23
|
+
import { defaultInjectors } from "./injectors.js";
|
|
24
24
|
|
|
25
25
|
let cachedChain: Injector[] | null = null;
|
|
26
26
|
|