@vellumai/assistant 0.8.8 → 0.8.9-dev.202606091853.fbaa2ae
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 +263 -121
- package/package.json +2 -2
- 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__/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__/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-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__/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-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__/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__/send-endpoint-busy.test.ts +4 -1
- 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__/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/responses/conversation-message.ts +22 -2
- 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 -16
- package/src/config/llm-resolver.ts +39 -7
- 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 +18 -36
- 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/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/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 +34 -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 +22 -0
- 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
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Default `compaction` behavior: summarizes conversation history when the
|
|
3
|
-
* context window fills up.
|
|
4
|
-
*
|
|
5
|
-
* This module is side-effect free: importing it does not register any plugin.
|
|
6
|
-
*
|
|
7
|
-
* Delegates to the orchestrator's existing {@link ContextWindowManager}
|
|
8
|
-
* instance, read from `ctx.contextWindowManager` on the {@link TurnContext} as
|
|
9
|
-
* a typed optional field. The orchestrator is responsible for attaching that
|
|
10
|
-
* handle to the per-turn context. If the handle is missing, this throws a
|
|
11
|
-
* {@link PluginExecutionError} so the bug surfaces with clear attribution
|
|
12
|
-
* instead of a late `undefined.maybeCompact is not a function`.
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
import type {
|
|
16
|
-
ContextWindowCompactOptions,
|
|
17
|
-
ContextWindowManager,
|
|
18
|
-
ContextWindowResult,
|
|
19
|
-
} from "../../../context/window-manager.js";
|
|
20
|
-
import type { Message } from "../../../providers/types.js";
|
|
21
|
-
import {
|
|
22
|
-
type CompactionArgs,
|
|
23
|
-
type CompactionResult,
|
|
24
|
-
PluginExecutionError,
|
|
25
|
-
type TurnContext,
|
|
26
|
-
} from "../../types.js";
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Name under which the default plugin registers. Exposed so tests and later
|
|
30
|
-
* plugins can assert registration order or override the default via
|
|
31
|
-
* composition.
|
|
32
|
-
*/
|
|
33
|
-
export const DEFAULT_COMPACTION_PLUGIN_NAME = "default-compaction";
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Read `contextWindowManager` off the turn context. Throws
|
|
37
|
-
* {@link PluginExecutionError} when absent so the failure attributes cleanly
|
|
38
|
-
* to the default plugin instead of manifesting as a later NPE.
|
|
39
|
-
*/
|
|
40
|
-
function extractManager(ctx: TurnContext): ContextWindowManager {
|
|
41
|
-
const manager = ctx.contextWindowManager;
|
|
42
|
-
if (
|
|
43
|
-
manager == null ||
|
|
44
|
-
typeof manager !== "object" ||
|
|
45
|
-
typeof (manager as { maybeCompact?: unknown }).maybeCompact !== "function"
|
|
46
|
-
) {
|
|
47
|
-
throw new PluginExecutionError(
|
|
48
|
-
"default-compaction: ctx.contextWindowManager is missing — orchestrator must attach it before invoking compaction",
|
|
49
|
-
DEFAULT_COMPACTION_PLUGIN_NAME,
|
|
50
|
-
);
|
|
51
|
-
}
|
|
52
|
-
return manager;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Run compaction for the turn: reads the context window manager off the turn
|
|
57
|
-
* context and returns the (possibly summarized) message history from
|
|
58
|
-
* `maybeCompact`.
|
|
59
|
-
*/
|
|
60
|
-
export async function defaultCompactionTerminal(
|
|
61
|
-
args: CompactionArgs,
|
|
62
|
-
ctx: TurnContext,
|
|
63
|
-
): Promise<CompactionResult> {
|
|
64
|
-
const manager = extractManager(ctx);
|
|
65
|
-
const messages = args.messages as Message[];
|
|
66
|
-
const options = args.options as ContextWindowCompactOptions | undefined;
|
|
67
|
-
const result: ContextWindowResult = await manager.maybeCompact(
|
|
68
|
-
messages,
|
|
69
|
-
args.signal,
|
|
70
|
-
options,
|
|
71
|
-
);
|
|
72
|
-
return result;
|
|
73
|
-
}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Default `empty-response` plugin.
|
|
3
|
-
*
|
|
4
|
-
* Contributes a `stop` hook that re-queries the model when a turn yields with
|
|
5
|
-
* no tool calls but came back empty (or as a provider refusal). The decision
|
|
6
|
-
* logic lives in `./hooks/stop.ts`. Defaults register before user plugins, so
|
|
7
|
-
* this runs at the front of the `stop` hook chain.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { type Plugin } from "../../types.js";
|
|
11
|
-
import stop from "./hooks/stop.js";
|
|
12
|
-
import pkg from "./package.json" with { type: "json" };
|
|
13
|
-
|
|
14
|
-
/** Singleton plugin — the registry rejects duplicate registrations by name. */
|
|
15
|
-
export const defaultEmptyResponsePlugin: Plugin = {
|
|
16
|
-
manifest: {
|
|
17
|
-
name: pkg.name,
|
|
18
|
-
version: pkg.version,
|
|
19
|
-
},
|
|
20
|
-
hooks: {
|
|
21
|
-
stop,
|
|
22
|
-
},
|
|
23
|
-
};
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Default `history-repair` plugin.
|
|
3
|
-
*
|
|
4
|
-
* Contributes a `user-prompt-submit` hook that normalizes the working message
|
|
5
|
-
* history (tool-use/tool-result pairing, role alternation) before the agent
|
|
6
|
-
* loop hands it to the provider. The repair implementation lives in
|
|
7
|
-
* `./terminal.ts`; the hook in `./hooks/user-prompt-submit.ts` wires it into
|
|
8
|
-
* the lifecycle. Defaults register before user plugins, so this normalization
|
|
9
|
-
* runs at the front of the hook chain.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import { type Plugin } from "../../types.js";
|
|
13
|
-
import userPromptSubmit from "./hooks/user-prompt-submit.js";
|
|
14
|
-
import pkg from "./package.json" with { type: "json" };
|
|
15
|
-
|
|
16
|
-
export const defaultHistoryRepairPlugin: Plugin = {
|
|
17
|
-
manifest: {
|
|
18
|
-
name: pkg.name,
|
|
19
|
-
version: pkg.version,
|
|
20
|
-
},
|
|
21
|
-
hooks: {
|
|
22
|
-
"user-prompt-submit": userPromptSubmit,
|
|
23
|
-
},
|
|
24
|
-
};
|
|
@@ -1,216 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Default `user-prompt-submit-temp` hook: runs the memory-graph retrieval the
|
|
3
|
-
* agent loop needs before building a turn's runtime-injection block.
|
|
4
|
-
*
|
|
5
|
-
* **Memory graph** via {@link ConversationGraphMemory.prepareMemory} —
|
|
6
|
-
* dispatches to context-load or per-turn retrieval depending on initialization
|
|
7
|
-
* state; gated on the actor being trusted (guardian).
|
|
8
|
-
*
|
|
9
|
-
* The hook also owns the retrieval's side effects — persisting the injected
|
|
10
|
-
* block onto the user message's metadata, writing the recall log, and emitting
|
|
11
|
-
* the `memory_recalled` event — so the loop only consumes the turn-scoped
|
|
12
|
-
* `latestMessages` written back onto the context. The PKB query-vector pair is
|
|
13
|
-
* recorded on the conversation's graph handle for the PKB-reminder injector to
|
|
14
|
-
* read back. PKB context and NOW.md are sourced directly by their injectors
|
|
15
|
-
* (gated on block presence), not produced here.
|
|
16
|
-
*
|
|
17
|
-
* This fires at the early "prompt submitted, before context assembly" moment,
|
|
18
|
-
* distinct from the canonical late `user-prompt-submit` hook (history repair,
|
|
19
|
-
* title): memory's outputs feed the injection and overflow-reduction transforms
|
|
20
|
-
* that run between the two moments. The `-temp` suffix marks this as a
|
|
21
|
-
* transitional staging point that folds into `user-prompt-submit` once
|
|
22
|
-
* compaction is cleared from the gap between the two call sites.
|
|
23
|
-
*/
|
|
24
|
-
|
|
25
|
-
import type { PluginHookFn } from "@vellumai/plugin-api";
|
|
26
|
-
import type { Logger } from "pino";
|
|
27
|
-
|
|
28
|
-
import type { AssistantConfig } from "../../../../config/schema.js";
|
|
29
|
-
import type { ServerMessage } from "../../../../daemon/message-protocol.js";
|
|
30
|
-
import type { MemoryRecalled } from "../../../../daemon/message-types/memory.js";
|
|
31
|
-
import { updateMessageMetadata } from "../../../../memory/conversation-crud.js";
|
|
32
|
-
import type { ConversationGraphMemory } from "../../../../memory/graph/conversation-graph-memory.js";
|
|
33
|
-
import { recordMemoryRecallLog } from "../../../../memory/memory-recall-log-store.js";
|
|
34
|
-
import type { Message } from "../../../../providers/types.js";
|
|
35
|
-
import type { GraphMemoryResult } from "../../../types.js";
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Context threaded through the `user-prompt-submit-temp` hook. The readonly
|
|
39
|
-
* fields carry the conversation-scoped state the retriever needs (graph
|
|
40
|
-
* handle, event sink, abort signal); the output fields are populated by the
|
|
41
|
-
* hook and read back by the agent loop. `latestMessages` straddles both: the
|
|
42
|
-
* loop seeds it with the pre-injection array and the hook overwrites it with
|
|
43
|
-
* the injected result.
|
|
44
|
-
*/
|
|
45
|
-
export interface MemoryRetrievalHookContext {
|
|
46
|
-
/** Per-conversation memory graph handle. */
|
|
47
|
-
readonly graphMemory: ConversationGraphMemory;
|
|
48
|
-
/** Assistant config snapshot. */
|
|
49
|
-
readonly config: AssistantConfig;
|
|
50
|
-
/** Event sink used by the graph retriever and `memory_recalled` emission. */
|
|
51
|
-
readonly onEvent: (msg: ServerMessage) => void;
|
|
52
|
-
/** True when the actor for this turn is trusted (guardian-class). */
|
|
53
|
-
readonly isTrustedActor: boolean;
|
|
54
|
-
/** Conversation the turn belongs to — keys the recall-log row. */
|
|
55
|
-
readonly conversationId: string;
|
|
56
|
-
/** User message the injected memory block is persisted onto. */
|
|
57
|
-
readonly userMessageId: string;
|
|
58
|
-
/** Turn-scoped logger for non-fatal persistence warnings. */
|
|
59
|
-
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
|
-
/**
|
|
66
|
-
* Working message list for the turn. Seeded by the loop with the
|
|
67
|
-
* pre-injection messages and consumed as the retrieval input; the hook
|
|
68
|
-
* overwrites it with the memory-graph block injected, or leaves it
|
|
69
|
-
* unchanged when no graph retrieval ran (untrusted actor, or a no-op
|
|
70
|
-
* retrieval). Read back by the loop.
|
|
71
|
-
*/
|
|
72
|
-
latestMessages: Message[];
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* Persist and broadcast the retrieval's side effects: the injected block on
|
|
77
|
-
* the user message's metadata (so it survives reloads), a recall-log row, and
|
|
78
|
-
* the `memory_recalled` debug event. All three are best-effort — a failure to
|
|
79
|
-
* persist must not abort the turn.
|
|
80
|
-
*/
|
|
81
|
-
function recordRecallSideEffects(
|
|
82
|
-
graphResult: GraphMemoryResult,
|
|
83
|
-
ctx: MemoryRetrievalHookContext,
|
|
84
|
-
): void {
|
|
85
|
-
// Persist the injected block text in message metadata so it survives
|
|
86
|
-
// conversation reloads (eviction, restart, fork). loadFromDb re-injects
|
|
87
|
-
// from metadata.
|
|
88
|
-
if (graphResult.injectedBlockText) {
|
|
89
|
-
try {
|
|
90
|
-
updateMessageMetadata(ctx.userMessageId, {
|
|
91
|
-
memoryInjectedBlock: graphResult.injectedBlockText,
|
|
92
|
-
});
|
|
93
|
-
} catch (err) {
|
|
94
|
-
ctx.logger.warn(
|
|
95
|
-
{ err },
|
|
96
|
-
"Failed to persist memory injection to metadata (non-fatal)",
|
|
97
|
-
);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
const m = graphResult.metrics;
|
|
102
|
-
|
|
103
|
-
try {
|
|
104
|
-
recordMemoryRecallLog({
|
|
105
|
-
conversationId: ctx.conversationId,
|
|
106
|
-
enabled: true,
|
|
107
|
-
degraded: false,
|
|
108
|
-
provider: m?.embeddingProvider ?? undefined,
|
|
109
|
-
model: m?.embeddingModel ?? undefined,
|
|
110
|
-
semanticHits: m?.semanticHits ?? 0,
|
|
111
|
-
mergedCount: m?.mergedCount ?? 0,
|
|
112
|
-
selectedCount: m?.selectedCount ?? 0,
|
|
113
|
-
tier1Count: m?.tier1Count ?? 0,
|
|
114
|
-
tier2Count: m?.tier2Count ?? 0,
|
|
115
|
-
hybridSearchLatencyMs: m?.hybridSearchLatencyMs ?? 0,
|
|
116
|
-
sparseVectorUsed: m?.sparseVectorUsed ?? false,
|
|
117
|
-
injectedTokens: graphResult.injectedTokens,
|
|
118
|
-
latencyMs: graphResult.latencyMs,
|
|
119
|
-
topCandidatesJson: (m?.topCandidates ?? []).map((c) => ({
|
|
120
|
-
key: c.nodeId,
|
|
121
|
-
type: c.type,
|
|
122
|
-
kind: "graph",
|
|
123
|
-
finalScore: c.score,
|
|
124
|
-
semantic: c.semanticSimilarity,
|
|
125
|
-
recency: c.recencyBoost,
|
|
126
|
-
})),
|
|
127
|
-
injectedText: graphResult.injectedBlockText ?? undefined,
|
|
128
|
-
reason: `graph:${graphResult.mode}`,
|
|
129
|
-
queryContext: m?.queryContext ?? undefined,
|
|
130
|
-
});
|
|
131
|
-
} catch (err) {
|
|
132
|
-
ctx.logger.warn({ err }, "Failed to persist memory recall log (non-fatal)");
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
if (m) {
|
|
136
|
-
const memoryRecalledEvent: MemoryRecalled = {
|
|
137
|
-
type: "memory_recalled",
|
|
138
|
-
provider: m.embeddingProvider ?? "unknown",
|
|
139
|
-
model: m.embeddingModel ?? "unknown",
|
|
140
|
-
semanticHits: m.semanticHits,
|
|
141
|
-
mergedCount: m.mergedCount,
|
|
142
|
-
selectedCount: m.selectedCount,
|
|
143
|
-
tier1Count: m.tier1Count,
|
|
144
|
-
tier2Count: m.tier2Count,
|
|
145
|
-
hybridSearchLatencyMs: m.hybridSearchLatencyMs,
|
|
146
|
-
sparseVectorUsed: m.sparseVectorUsed,
|
|
147
|
-
injectedTokens: graphResult.injectedTokens,
|
|
148
|
-
latencyMs: graphResult.latencyMs,
|
|
149
|
-
topCandidates: m.topCandidates.map((c) => ({
|
|
150
|
-
key: c.nodeId,
|
|
151
|
-
type: c.type,
|
|
152
|
-
kind: "graph",
|
|
153
|
-
finalScore: c.score,
|
|
154
|
-
semantic: c.semanticSimilarity,
|
|
155
|
-
recency: c.recencyBoost,
|
|
156
|
-
})),
|
|
157
|
-
};
|
|
158
|
-
ctx.onEvent(memoryRecalledEvent);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
/**
|
|
163
|
-
* Run the default retrieval, writing `latestMessages` back onto the context and
|
|
164
|
-
* recording the PKB query-vector pair on the graph handle. Skips the
|
|
165
|
-
* memory-graph call entirely (leaving `latestMessages` as the seeded input
|
|
166
|
-
* messages and no query pair recorded) when the actor is not trusted.
|
|
167
|
-
*
|
|
168
|
-
* Memory retrieval blocks the turn — there is no soft timeout here. Memory is
|
|
169
|
-
* critical context, and silently dropping it produces a worse outcome than a
|
|
170
|
-
* slower turn. Cancellation still works via `ctx.signal`, which is threaded
|
|
171
|
-
* into `prepareMemory`.
|
|
172
|
-
*/
|
|
173
|
-
const userPromptSubmitMemoryRetrieval: PluginHookFn<
|
|
174
|
-
MemoryRetrievalHookContext
|
|
175
|
-
> = async (ctx) => {
|
|
176
|
-
if (!ctx.isTrustedActor) {
|
|
177
|
-
// Untrusted actors skip memory-graph retrieval entirely.
|
|
178
|
-
return;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
const graphResult = await ctx.graphMemory.prepareMemory(
|
|
182
|
-
ctx.latestMessages,
|
|
183
|
-
ctx.config,
|
|
184
|
-
ctx.signal,
|
|
185
|
-
ctx.onEvent,
|
|
186
|
-
);
|
|
187
|
-
|
|
188
|
-
recordRecallSideEffects(graphResult, ctx);
|
|
189
|
-
|
|
190
|
-
ctx.latestMessages = graphResult.runMessages;
|
|
191
|
-
// Select dense+sparse as a matched pair so RRF fusion combines two signals
|
|
192
|
-
// aligned to the same query text:
|
|
193
|
-
// 1. Context-load with a user query: user-query dense + user-query sparse
|
|
194
|
-
// — the cleanest pairing.
|
|
195
|
-
// 2. Otherwise (context-load without a user query, or per-turn): whatever
|
|
196
|
-
// `queryVector` / `sparseVector` the retriever produced, which are
|
|
197
|
-
// themselves co-aligned (both summary-derived in context-load, both
|
|
198
|
-
// user-last-message-derived in per-turn).
|
|
199
|
-
// Never pair a user-query dense with a summary-aligned sparse.
|
|
200
|
-
// The PKB-reminder injector reads this pair back off the same graph handle
|
|
201
|
-
// (looked up by conversation id) rather than receiving it threaded through
|
|
202
|
-
// the agent loop.
|
|
203
|
-
if (graphResult.userQueryVector) {
|
|
204
|
-
ctx.graphMemory.recordPkbQueryVectors(
|
|
205
|
-
graphResult.userQueryVector,
|
|
206
|
-
graphResult.userQuerySparseVector,
|
|
207
|
-
);
|
|
208
|
-
} else {
|
|
209
|
-
ctx.graphMemory.recordPkbQueryVectors(
|
|
210
|
-
graphResult.queryVector,
|
|
211
|
-
graphResult.sparseVector,
|
|
212
|
-
);
|
|
213
|
-
}
|
|
214
|
-
};
|
|
215
|
-
|
|
216
|
-
export default userPromptSubmitMemoryRetrieval;
|
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
import type { ContextWindowCompactOptions } from "../../../../context/window-manager.js";
|
|
2
|
-
import {
|
|
3
|
-
createInitialReducerState,
|
|
4
|
-
reduceContextOverflow,
|
|
5
|
-
type ReducerState,
|
|
6
|
-
} from "../../../../daemon/context-overflow-reducer.js";
|
|
7
|
-
import type {
|
|
8
|
-
Middleware,
|
|
9
|
-
OverflowReduceArgs,
|
|
10
|
-
OverflowReduceResult,
|
|
11
|
-
} from "../../../types.js";
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Default middleware for the `overflowReduce` pipeline — implements the
|
|
15
|
-
* historical tier-loop semantics (forced compaction, tool-result truncation,
|
|
16
|
-
* media stubbing, injection downgrade) plus the post-step re-injection /
|
|
17
|
-
* re-estimation dance.
|
|
18
|
-
*
|
|
19
|
-
* The middleware intentionally ignores `next`. Overflow reduction is a
|
|
20
|
-
* *terminal* behavior: there is no downstream implementation to defer to when
|
|
21
|
-
* a user-supplied middleware short-circuits. Later plugins may still wrap this
|
|
22
|
-
* one (outer middleware can observe each reduction iteration via their own
|
|
23
|
-
* `next` callback) but the default never delegates to a hypothetical base
|
|
24
|
-
* handler — the inline loop was the base.
|
|
25
|
-
*/
|
|
26
|
-
const defaultOverflowReduceMiddleware: Middleware<
|
|
27
|
-
OverflowReduceArgs,
|
|
28
|
-
OverflowReduceResult
|
|
29
|
-
> = async function defaultOverflowReduceMiddleware(args, _next, _ctx) {
|
|
30
|
-
let messages = args.messages;
|
|
31
|
-
let runMessages = args.runMessages;
|
|
32
|
-
let injectionMode: "full" | "minimal" = "full";
|
|
33
|
-
let reducerState: ReducerState = createInitialReducerState();
|
|
34
|
-
let reducerCompacted = false;
|
|
35
|
-
let attempts = 0;
|
|
36
|
-
|
|
37
|
-
while (attempts < args.maxAttempts && !reducerState.exhausted) {
|
|
38
|
-
// Abort check at the top of every iteration. When the pipeline runner
|
|
39
|
-
// arms a timeout (or the caller aborts externally), `args.abortSignal`
|
|
40
|
-
// is linked to that trigger via `linkAbortSignal`, so this check lets
|
|
41
|
-
// us bail out BETWEEN iterations rather than letting another round of
|
|
42
|
-
// compaction / re-injection mutate `ctx.messages` after the turn has
|
|
43
|
-
// already failed. Individual `reduceContextOverflow` calls also honor
|
|
44
|
-
// the signal, but without this gate a fresh iteration could still
|
|
45
|
-
// start after the signal fires, since the previous one returned
|
|
46
|
-
// normally before the abort propagated.
|
|
47
|
-
args.abortSignal?.throwIfAborted();
|
|
48
|
-
|
|
49
|
-
attempts++;
|
|
50
|
-
args.emitActivityState();
|
|
51
|
-
|
|
52
|
-
const basisMessages = messages;
|
|
53
|
-
const step = await reduceContextOverflow(
|
|
54
|
-
basisMessages,
|
|
55
|
-
{
|
|
56
|
-
providerName: args.providerName,
|
|
57
|
-
systemPrompt: args.systemPrompt,
|
|
58
|
-
contextWindow: args.contextWindow,
|
|
59
|
-
targetTokens: args.preflightBudget,
|
|
60
|
-
toolTokenBudget: args.toolTokenBudget,
|
|
61
|
-
},
|
|
62
|
-
reducerState,
|
|
63
|
-
(msgs, signal, opts: ContextWindowCompactOptions) =>
|
|
64
|
-
args.compactFn(msgs, signal, opts),
|
|
65
|
-
args.abortSignal,
|
|
66
|
-
);
|
|
67
|
-
|
|
68
|
-
reducerState = step.state;
|
|
69
|
-
messages = step.messages;
|
|
70
|
-
injectionMode = step.state.injectionMode;
|
|
71
|
-
|
|
72
|
-
// Per-iteration compaction flag: whether THIS step just produced a
|
|
73
|
-
// fresh compaction. PKB / NOW re-injection is gated on this — see the
|
|
74
|
-
// reinjectForMode JSDoc for why the two signals differ.
|
|
75
|
-
const stepCompacted = step.compactionResult?.compacted === true;
|
|
76
|
-
|
|
77
|
-
// Let the orchestrator apply compaction side effects (circuit-breaker
|
|
78
|
-
// tracking, event emission, ctx mutation) before we re-inject.
|
|
79
|
-
if (step.compactionResult) {
|
|
80
|
-
await args.onCompactionResult(step.compactionResult, basisMessages);
|
|
81
|
-
if (stepCompacted) {
|
|
82
|
-
reducerCompacted = true;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
// Second abort gate — if the side effects or the step itself took us
|
|
87
|
-
// past the deadline, don't rebuild runMessages or iterate again.
|
|
88
|
-
args.abortSignal?.throwIfAborted();
|
|
89
|
-
|
|
90
|
-
// Rebuild runMessages via the orchestrator-supplied helper (which
|
|
91
|
-
// re-runs `applyRuntimeInjections` with potentially downgraded mode
|
|
92
|
-
// and freshly re-hydrated PKB/NOW blocks after compaction). We pass
|
|
93
|
-
// the current reduced `messages` explicitly so the orchestrator never
|
|
94
|
-
// has to read from mutable shared state to rebuild runMessages — a
|
|
95
|
-
// tier that doesn't trigger compaction (tool-result truncation, media
|
|
96
|
-
// stubbing) won't update `ctx.messages` on its own.
|
|
97
|
-
//
|
|
98
|
-
// `stepCompacted` and `reducerCompacted` are both passed so the
|
|
99
|
-
// orchestrator can gate PKB / NOW re-injection per-iteration while
|
|
100
|
-
// keeping `slackChronologicalMessages` suppressed once any iteration
|
|
101
|
-
// has compacted.
|
|
102
|
-
runMessages = await args.reinjectForMode(
|
|
103
|
-
messages,
|
|
104
|
-
injectionMode,
|
|
105
|
-
stepCompacted,
|
|
106
|
-
reducerCompacted,
|
|
107
|
-
);
|
|
108
|
-
|
|
109
|
-
// Re-estimate with injections included — `step.estimatedTokens` was
|
|
110
|
-
// computed on bare history and doesn't account for tokens added by
|
|
111
|
-
// runtime injections.
|
|
112
|
-
const postInjectionTokens = args.estimatePostInjection(runMessages);
|
|
113
|
-
if (postInjectionTokens <= args.preflightBudget) break;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
return {
|
|
117
|
-
messages,
|
|
118
|
-
runMessages,
|
|
119
|
-
injectionMode,
|
|
120
|
-
reducerState,
|
|
121
|
-
reducerCompacted,
|
|
122
|
-
attempts,
|
|
123
|
-
};
|
|
124
|
-
};
|
|
125
|
-
|
|
126
|
-
export default defaultOverflowReduceMiddleware;
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "default-overflow-reduce",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"description": "First-party default plugin wrapping the assistant's built-in overflow-reduce pipeline with a passthrough implementation.",
|
|
5
|
-
"private": true,
|
|
6
|
-
"license": "MIT",
|
|
7
|
-
"type": "module",
|
|
8
|
-
"main": "./register.ts",
|
|
9
|
-
"engines": {
|
|
10
|
-
"node": ">=20.12.0"
|
|
11
|
-
},
|
|
12
|
-
"peerDependencies": {
|
|
13
|
-
"@vellumai/plugin-api": "^0.8.0"
|
|
14
|
-
}
|
|
15
|
-
}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Default `overflowReduce` plugin — extracted verbatim from the inline
|
|
3
|
-
* preflight reducer loop that previously lived in
|
|
4
|
-
* `daemon/conversation-agent-loop.ts` (the `while (preflightAttempts < …)`
|
|
5
|
-
* block around lines 1045–1156 before PR 23).
|
|
6
|
-
*
|
|
7
|
-
* The plugin owns the reducer tier-loop (forced compaction, tool-result
|
|
8
|
-
* truncation, media stubbing, injection downgrade) and the post-step
|
|
9
|
-
* re-injection / re-estimation dance. Orchestrator-specific coupling
|
|
10
|
-
* (activity emission, circuit-breaker tracking, compaction-result
|
|
11
|
-
* application, runtime injection reassembly) is threaded in through the
|
|
12
|
-
* callbacks carried on {@link OverflowReduceArgs}; the plugin itself has no
|
|
13
|
-
* access to the agent-loop context object.
|
|
14
|
-
*
|
|
15
|
-
* The forced-compaction tier runs through the orchestrator-supplied
|
|
16
|
-
* `compactFn`, which routes into the `compaction` plugin pipeline so
|
|
17
|
-
* registered compaction middleware observes reducer-initiated invocations
|
|
18
|
-
* alongside the orchestrator-owned call sites. Non-compaction tiers
|
|
19
|
-
* (tool-result truncation, media stubbing, injection downgrade) remain
|
|
20
|
-
* in-process: they mutate message arrays directly without crossing a
|
|
21
|
-
* pipeline boundary. The reducer itself runs under the `overflowReduce`
|
|
22
|
-
* pipeline, so the full layering is `overflowReduce` → reducer tier loop
|
|
23
|
-
* → (for the forced-compaction tier only) nested `compaction` pipeline.
|
|
24
|
-
*/
|
|
25
|
-
|
|
26
|
-
import { type Plugin } from "../../types.js";
|
|
27
|
-
import defaultOverflowReduceMiddleware from "./middlewares/overflowReduce.js";
|
|
28
|
-
import pkg from "./package.json" with { type: "json" };
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* The default plugin registered at bootstrap. No `init`/`onShutdown` —
|
|
32
|
-
* registering the middleware is the only behavior.
|
|
33
|
-
*/
|
|
34
|
-
export const defaultOverflowReducePlugin: Plugin = {
|
|
35
|
-
manifest: {
|
|
36
|
-
name: pkg.name,
|
|
37
|
-
version: pkg.version,
|
|
38
|
-
},
|
|
39
|
-
middleware: {
|
|
40
|
-
overflowReduce: defaultOverflowReduceMiddleware,
|
|
41
|
-
},
|
|
42
|
-
};
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Default `title-generate` plugin.
|
|
3
|
-
*
|
|
4
|
-
* Contributes two hooks, both pure triggers that delegate the title work to
|
|
5
|
-
* the service (`memory/conversation-title-service.ts`):
|
|
6
|
-
*
|
|
7
|
-
* - `user-prompt-submit` (`./hooks/user-prompt-submit.ts`) — first-pass title
|
|
8
|
-
* generation from the submitted prompt.
|
|
9
|
-
* - `stop` (`./hooks/stop.ts`) — second-pass regeneration once the
|
|
10
|
-
* conversation reaches its third user turn, for a title that reflects the
|
|
11
|
-
* established topic.
|
|
12
|
-
*
|
|
13
|
-
* Persistence and the resulting `conversation_title_updated` / `sync_changed`
|
|
14
|
-
* broadcast are owned by the title service.
|
|
15
|
-
*
|
|
16
|
-
* Registered via a side-effect import from
|
|
17
|
-
* `daemon/external-plugins-bootstrap.ts` so it is present in the registry
|
|
18
|
-
* by the time {@link bootstrapPlugins} runs.
|
|
19
|
-
*/
|
|
20
|
-
|
|
21
|
-
import { type Plugin } from "../../types.js";
|
|
22
|
-
import stop from "./hooks/stop.js";
|
|
23
|
-
import userPromptSubmit from "./hooks/user-prompt-submit.js";
|
|
24
|
-
import pkg from "./package.json" with { type: "json" };
|
|
25
|
-
|
|
26
|
-
export const defaultTitleGeneratePlugin: Plugin = {
|
|
27
|
-
manifest: {
|
|
28
|
-
name: pkg.name,
|
|
29
|
-
version: pkg.version,
|
|
30
|
-
},
|
|
31
|
-
hooks: {
|
|
32
|
-
"user-prompt-submit": userPromptSubmit,
|
|
33
|
-
stop,
|
|
34
|
-
},
|
|
35
|
-
};
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Default `tool-error` plugin.
|
|
3
|
-
*
|
|
4
|
-
* Contributes a `post-tool-use` hook that coaches the model to retry or report
|
|
5
|
-
* a failed tool call, bounded per tool so an unrecoverable error doesn't churn.
|
|
6
|
-
* The coaching is surfaced via `additionalContext` (a separate provider-only
|
|
7
|
-
* block), leaving the tool result's own content untouched. The decision logic
|
|
8
|
-
* lives in `./hooks/post-tool-use.ts`.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { type Plugin } from "../../types.js";
|
|
12
|
-
import postToolUse from "./hooks/post-tool-use.js";
|
|
13
|
-
import pkg from "./package.json" with { type: "json" };
|
|
14
|
-
|
|
15
|
-
export const defaultToolErrorPlugin: Plugin = {
|
|
16
|
-
manifest: {
|
|
17
|
-
name: pkg.name,
|
|
18
|
-
version: pkg.version,
|
|
19
|
-
},
|
|
20
|
-
hooks: {
|
|
21
|
-
"post-tool-use": postToolUse,
|
|
22
|
-
},
|
|
23
|
-
};
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Default `tool-result-truncate` plugin.
|
|
3
|
-
*
|
|
4
|
-
* Contributes a `post-tool-use` hook that tail-drops an oversized tool result
|
|
5
|
-
* down to a character budget derived from the model's context window before
|
|
6
|
-
* the result is sent to the provider. The truncation implementation lives in
|
|
7
|
-
* `./terminal.ts`; the hook in `./hooks/post-tool-use.ts` wires it into the
|
|
8
|
-
* lifecycle. Defaults register before user plugins, so this runs at the front
|
|
9
|
-
* of the hook chain.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import { type Plugin } from "../../types.js";
|
|
13
|
-
import postToolUse from "./hooks/post-tool-use.js";
|
|
14
|
-
import pkg from "./package.json" with { type: "json" };
|
|
15
|
-
|
|
16
|
-
export const defaultToolResultTruncatePlugin: Plugin = {
|
|
17
|
-
manifest: {
|
|
18
|
-
name: pkg.name,
|
|
19
|
-
version: pkg.version,
|
|
20
|
-
},
|
|
21
|
-
hooks: {
|
|
22
|
-
"post-tool-use": postToolUse,
|
|
23
|
-
},
|
|
24
|
-
};
|