@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,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
|
-
};
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* External plugin runtime — `globalThis.__vellumPluginRuntime` bridge.
|
|
3
|
-
*
|
|
4
|
-
* Workspace-local plugins (`<workspaceDir>/plugins/*`) get dynamic-imported by
|
|
5
|
-
* {@link loadUserPlugins}. They need to call `registerPlugin()` from their
|
|
6
|
-
* module body and they typically also want to read secrets, subscribe to
|
|
7
|
-
* runtime events, etc.
|
|
8
|
-
*
|
|
9
|
-
* Importing those symbols by absolute path
|
|
10
|
-
* (`/abs/path/to/assistant/src/plugins/registry.js`) works when the daemon is
|
|
11
|
-
* running from source — both the daemon and the dynamic-imported plugin
|
|
12
|
-
* resolve the same on-disk file and share module identity. It DOES NOT work
|
|
13
|
-
* when the daemon is a `bun --compile` binary: the daemon's modules are baked
|
|
14
|
-
* into the executable, and any absolute-path import re-loads a fresh disk
|
|
15
|
-
* copy. `registerPlugin()` then writes into a disjoint registry instance and
|
|
16
|
-
* the daemon never sees the plugin.
|
|
17
|
-
*
|
|
18
|
-
* The fix is to expose a single, stable handle on `globalThis` that plugins
|
|
19
|
-
* read at module-load time. The daemon's bundled modules attach themselves
|
|
20
|
-
* here once at startup; plugins consume the same instance regardless of how
|
|
21
|
-
* the daemon was built.
|
|
22
|
-
*
|
|
23
|
-
* Plugins use the bridge like this:
|
|
24
|
-
*
|
|
25
|
-
* const runtime = (globalThis as { __vellumPluginRuntime?: ... })
|
|
26
|
-
* .__vellumPluginRuntime;
|
|
27
|
-
* if (!runtime || runtime.version !== 1) throw new Error("...");
|
|
28
|
-
* const { registerPlugin, assistantEventHub, getSecureKeyAsync } = runtime;
|
|
29
|
-
*
|
|
30
|
-
* Type-only imports (`import type { Plugin } from "..."`) remain free to use
|
|
31
|
-
* absolute paths or workspace-local copies — the TypeScript compiler erases
|
|
32
|
-
* them and they have no module-identity effect at runtime.
|
|
33
|
-
*
|
|
34
|
-
* See `assistant/docs/plugins.md` for the full authoring contract and
|
|
35
|
-
* `assistant/examples/plugins/echo/register.ts` for a worked example.
|
|
36
|
-
*/
|
|
37
|
-
|
|
38
|
-
import { assistantEventHub } from "../runtime/assistant-event-hub.js";
|
|
39
|
-
import { getSecureKeyAsync } from "../security/secure-keys.js";
|
|
40
|
-
import { registerPlugin } from "./registry.js";
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* The handle plugins read from `globalThis.__vellumPluginRuntime`.
|
|
44
|
-
*
|
|
45
|
-
* `version` is the contract version. Plugins should assert against the
|
|
46
|
-
* version they were authored against and refuse to register if they see a
|
|
47
|
-
* different one — bumping it is a breaking change to the plugin surface.
|
|
48
|
-
*
|
|
49
|
-
* The field set is intentionally small: the most-commonly-needed symbols
|
|
50
|
-
* across both static (module-load-time) and dynamic (init-time) plugin
|
|
51
|
-
* lifecycle. Plugins that need richer runtime state can still receive it
|
|
52
|
-
* through {@link PluginInitContext} during `init()`.
|
|
53
|
-
*/
|
|
54
|
-
export interface VellumPluginRuntime {
|
|
55
|
-
readonly version: 1;
|
|
56
|
-
readonly registerPlugin: typeof registerPlugin;
|
|
57
|
-
readonly assistantEventHub: typeof assistantEventHub;
|
|
58
|
-
readonly getSecureKeyAsync: typeof getSecureKeyAsync;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/** Stable globalThis key. Don't rename — plugins reference it by string. */
|
|
62
|
-
const RUNTIME_GLOBAL_KEY = "__vellumPluginRuntime" as const;
|
|
63
|
-
|
|
64
|
-
interface GlobalWithRuntime {
|
|
65
|
-
[RUNTIME_GLOBAL_KEY]?: VellumPluginRuntime;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Install the plugin runtime bridge on `globalThis`. Idempotent — repeat
|
|
70
|
-
* calls are no-ops, so it's safe to invoke from tests that also touch the
|
|
71
|
-
* lifecycle path.
|
|
72
|
-
*
|
|
73
|
-
* Must be called BEFORE {@link loadUserPlugins} runs, otherwise plugins that
|
|
74
|
-
* touch `globalThis.__vellumPluginRuntime` in their module body will throw.
|
|
75
|
-
*/
|
|
76
|
-
export function installPluginRuntime(): void {
|
|
77
|
-
const g = globalThis as GlobalWithRuntime;
|
|
78
|
-
if (g[RUNTIME_GLOBAL_KEY]) return;
|
|
79
|
-
g[RUNTIME_GLOBAL_KEY] = {
|
|
80
|
-
version: 1,
|
|
81
|
-
registerPlugin,
|
|
82
|
-
assistantEventHub,
|
|
83
|
-
getSecureKeyAsync,
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Read the installed runtime. Returns `undefined` if {@link installPluginRuntime}
|
|
89
|
-
* hasn't been called yet — plugins should treat this as a fatal error.
|
|
90
|
-
*
|
|
91
|
-
* Exposed mainly for tests and for the rare in-process consumer that wants
|
|
92
|
-
* to read the bridge from the same module graph that installed it.
|
|
93
|
-
*/
|
|
94
|
-
export function getPluginRuntime(): VellumPluginRuntime | undefined {
|
|
95
|
-
return (globalThis as GlobalWithRuntime)[RUNTIME_GLOBAL_KEY];
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Tear down the runtime handle. Test-only — production code never uninstalls
|
|
100
|
-
* because the runtime lifetime is the daemon lifetime.
|
|
101
|
-
*/
|
|
102
|
-
export function uninstallPluginRuntimeForTests(): void {
|
|
103
|
-
delete (globalThis as GlobalWithRuntime)[RUNTIME_GLOBAL_KEY];
|
|
104
|
-
}
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Auxiliary message injection for proactive artifacts.
|
|
3
|
-
*
|
|
4
|
-
* Injects an assistant message into a conversation without going through
|
|
5
|
-
* the normal agent loop. Defers injection while the conversation is
|
|
6
|
-
* actively processing to preserve chronological message ordering.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { createAssistantMessage } from "../agent/message-types.js";
|
|
10
|
-
import { findConversation } from "../daemon/conversation-store.js";
|
|
11
|
-
import {
|
|
12
|
-
conversationMessagesSyncTag,
|
|
13
|
-
SYNC_TAGS,
|
|
14
|
-
} from "../daemon/message-types/sync.js";
|
|
15
|
-
import { addMessage } from "../memory/conversation-crud.js";
|
|
16
|
-
import type { BroadcastFn } from "../notifications/adapters/macos.js";
|
|
17
|
-
import { getLogger } from "../util/logger.js";
|
|
18
|
-
|
|
19
|
-
const log = getLogger("aux-message-injector");
|
|
20
|
-
const IDLE_POLL_MS = 200;
|
|
21
|
-
const IDLE_TIMEOUT_MS = 60_000;
|
|
22
|
-
|
|
23
|
-
async function waitForIdle(conversationId: string): Promise<boolean> {
|
|
24
|
-
const start = Date.now();
|
|
25
|
-
while (Date.now() - start < IDLE_TIMEOUT_MS) {
|
|
26
|
-
const conv = findConversation(conversationId);
|
|
27
|
-
if (!conv || !conv.isProcessing()) return true;
|
|
28
|
-
await new Promise((resolve) => setTimeout(resolve, IDLE_POLL_MS));
|
|
29
|
-
}
|
|
30
|
-
return false;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export async function injectAuxAssistantMessage(params: {
|
|
34
|
-
conversationId: string;
|
|
35
|
-
text: string;
|
|
36
|
-
broadcastMessage: BroadcastFn;
|
|
37
|
-
}): Promise<void> {
|
|
38
|
-
const conv = findConversation(params.conversationId);
|
|
39
|
-
if (conv?.isProcessing()) {
|
|
40
|
-
const reachedIdle = await waitForIdle(params.conversationId);
|
|
41
|
-
if (!reachedIdle) {
|
|
42
|
-
log.warn(
|
|
43
|
-
{ conversationId: params.conversationId },
|
|
44
|
-
"Timed out waiting for conversation idle; injecting anyway",
|
|
45
|
-
);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
const msg = await addMessage(
|
|
50
|
-
params.conversationId,
|
|
51
|
-
"assistant",
|
|
52
|
-
JSON.stringify([{ type: "text", text: params.text }]),
|
|
53
|
-
{ skipIndexing: true },
|
|
54
|
-
);
|
|
55
|
-
|
|
56
|
-
const current = findConversation(params.conversationId);
|
|
57
|
-
if (current && !current.isProcessing()) {
|
|
58
|
-
current.getMessages().push(createAssistantMessage(params.text));
|
|
59
|
-
|
|
60
|
-
params.broadcastMessage({
|
|
61
|
-
type: "assistant_text_delta",
|
|
62
|
-
text: params.text,
|
|
63
|
-
conversationId: params.conversationId,
|
|
64
|
-
});
|
|
65
|
-
params.broadcastMessage({
|
|
66
|
-
type: "message_complete",
|
|
67
|
-
conversationId: params.conversationId,
|
|
68
|
-
messageId: msg.id,
|
|
69
|
-
source: "aux",
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// The injected aux message bumps `lastMessageAt`, which can move the
|
|
74
|
-
// row in the paginated sidebar window — that's a shape change. macOS
|
|
75
|
-
// refreshes its full list on `conversation_list_invalidated`; web
|
|
76
|
-
// refreshes via the paired `sync_changed` `conversationsList` tag.
|
|
77
|
-
//
|
|
78
|
-
// TODO(electron-cutover): drop the `conversation_list_invalidated`
|
|
79
|
-
// emission once macOS migrates to the Electron client and consumes
|
|
80
|
-
// `sync_changed` directly. See `runtime/sync/resource-sync-events.ts`
|
|
81
|
-
// for the symmetric helper used by route handlers.
|
|
82
|
-
params.broadcastMessage(
|
|
83
|
-
{
|
|
84
|
-
type: "conversation_list_invalidated",
|
|
85
|
-
reason: "reordered",
|
|
86
|
-
},
|
|
87
|
-
undefined,
|
|
88
|
-
{ targetInterfaceId: "macos" },
|
|
89
|
-
);
|
|
90
|
-
params.broadcastMessage({
|
|
91
|
-
type: "sync_changed",
|
|
92
|
-
tags: [
|
|
93
|
-
SYNC_TAGS.conversationsList,
|
|
94
|
-
conversationMessagesSyncTag(params.conversationId),
|
|
95
|
-
],
|
|
96
|
-
});
|
|
97
|
-
}
|