@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
|
@@ -14,23 +14,25 @@
|
|
|
14
14
|
* marker is wrapped around the assistant-role memory message we emit on
|
|
15
15
|
* successful compaction so those code paths keep working unchanged.
|
|
16
16
|
*/
|
|
17
|
-
import { getConfig } from "
|
|
18
|
-
import type { CompactionConfig } from "
|
|
19
|
-
import type { LLMCallSite } from "
|
|
20
|
-
import type { ContextWindowConfig } from "
|
|
17
|
+
import { getConfig } from "../../../config/loader.js";
|
|
18
|
+
import type { CompactionConfig } from "../../../config/schemas/compaction.js";
|
|
19
|
+
import type { LLMCallSite } from "../../../config/schemas/llm.js";
|
|
20
|
+
import type { ContextWindowConfig } from "../../../config/types.js";
|
|
21
|
+
import {
|
|
22
|
+
type CompactionRunArgs,
|
|
23
|
+
type CompactionRunResult,
|
|
24
|
+
runAssistantDrivenCompaction,
|
|
25
|
+
runEmergencyCompaction,
|
|
26
|
+
} from "../../../context/compactor.js";
|
|
27
|
+
import { estimatePromptTokens } from "../../../context/token-estimator.js";
|
|
21
28
|
import type {
|
|
22
29
|
ContentBlock,
|
|
23
30
|
Message,
|
|
24
31
|
Provider,
|
|
25
32
|
ToolDefinition,
|
|
26
|
-
} from "
|
|
27
|
-
import type { TrustClass } from "
|
|
28
|
-
import { getLogger } from "
|
|
29
|
-
import {
|
|
30
|
-
type CompactionRunArgs,
|
|
31
|
-
runAssistantDrivenCompaction,
|
|
32
|
-
} from "./compactor.js";
|
|
33
|
-
import { estimatePromptTokens } from "./token-estimator.js";
|
|
33
|
+
} from "../../../providers/types.js";
|
|
34
|
+
import type { TrustClass } from "../../../runtime/actor-trust-resolver.js";
|
|
35
|
+
import { getLogger } from "../../../util/logger.js";
|
|
34
36
|
|
|
35
37
|
const log = getLogger("context-window");
|
|
36
38
|
|
|
@@ -40,7 +42,8 @@ const INTERNAL_CONTEXT_SUMMARY_MESSAGES = new WeakSet<Message>();
|
|
|
40
42
|
|
|
41
43
|
// ---------------------------------------------------------------------------
|
|
42
44
|
// Public types — preserved for downstream consumers (agent loop, conversation,
|
|
43
|
-
// plugin
|
|
45
|
+
// default compaction plugin, applyCompactionResult,
|
|
46
|
+
// routes/playground/force-compact).
|
|
44
47
|
// ---------------------------------------------------------------------------
|
|
45
48
|
|
|
46
49
|
export interface ContextWindowResult {
|
|
@@ -117,6 +120,21 @@ export interface ContextWindowCompactOptions {
|
|
|
117
120
|
actorTrustClass?: TrustClass;
|
|
118
121
|
}
|
|
119
122
|
|
|
123
|
+
export interface EmergencyCompactOptions {
|
|
124
|
+
/**
|
|
125
|
+
* The provider-reported estimate at the overflow that triggered recovery.
|
|
126
|
+
* Sizing the emergency summary needs the actual rejected token count, not
|
|
127
|
+
* the manager's pre-send estimate (which under-counted, hence the
|
|
128
|
+
* rejection).
|
|
129
|
+
*/
|
|
130
|
+
previousEstimatedInputTokens: number;
|
|
131
|
+
/**
|
|
132
|
+
* Per-conversation inference-profile override forwarded to the summary
|
|
133
|
+
* call.
|
|
134
|
+
*/
|
|
135
|
+
overrideProfile?: string | null;
|
|
136
|
+
}
|
|
137
|
+
|
|
120
138
|
export interface ContextWindowManagerOptions {
|
|
121
139
|
provider: Provider;
|
|
122
140
|
systemPrompt: string | (() => string);
|
|
@@ -198,8 +216,7 @@ export class ContextWindowManager {
|
|
|
198
216
|
* `compactedMessages` so `compactedPersistedMessages` only reflects DB
|
|
199
217
|
* rows. Decremented after a successful compaction.
|
|
200
218
|
*/
|
|
201
|
-
|
|
202
|
-
summaryIsInjected = false;
|
|
219
|
+
private _nonPersistedPrefixCount = 0;
|
|
203
220
|
private _resolvedSystemPrompt: string | undefined;
|
|
204
221
|
|
|
205
222
|
constructor(options: ContextWindowManagerOptions) {
|
|
@@ -215,6 +232,21 @@ export class ContextWindowManager {
|
|
|
215
232
|
this.config = config;
|
|
216
233
|
}
|
|
217
234
|
|
|
235
|
+
/** Leading non-persisted inherited-context messages the compactor preserves. */
|
|
236
|
+
get nonPersistedPrefixCount(): number {
|
|
237
|
+
return this._nonPersistedPrefixCount;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Seed the non-persisted inherited-context prefix when a forked/sub
|
|
242
|
+
* conversation inherits its parent's in-memory context. The compactor folds
|
|
243
|
+
* this prefix into the summary and {@link consumeCompactionState} decrements
|
|
244
|
+
* it as the leading messages are compacted away.
|
|
245
|
+
*/
|
|
246
|
+
seedNonPersistedPrefix(count: number): void {
|
|
247
|
+
this._nonPersistedPrefixCount = count;
|
|
248
|
+
}
|
|
249
|
+
|
|
218
250
|
private get estimationProviderName(): string {
|
|
219
251
|
return this.provider.tokenEstimationProvider ?? this.provider.name;
|
|
220
252
|
}
|
|
@@ -352,7 +384,7 @@ export class ContextWindowManager {
|
|
|
352
384
|
signal,
|
|
353
385
|
overrideProfile: options?.overrideProfile ?? null,
|
|
354
386
|
actorTrustClass: options?.actorTrustClass,
|
|
355
|
-
nonPersistedPrefixCount: this.
|
|
387
|
+
nonPersistedPrefixCount: this._nonPersistedPrefixCount,
|
|
356
388
|
};
|
|
357
389
|
|
|
358
390
|
// Retry budget for the compactor itself. Lives here (not in the
|
|
@@ -390,7 +422,7 @@ export class ContextWindowManager {
|
|
|
390
422
|
...baseArgs,
|
|
391
423
|
messages: result.messages,
|
|
392
424
|
previousEstimatedInputTokens: previousEstimate,
|
|
393
|
-
nonPersistedPrefixCount: this.
|
|
425
|
+
nonPersistedPrefixCount: this._nonPersistedPrefixCount,
|
|
394
426
|
});
|
|
395
427
|
if (!nextResult.compacted) break;
|
|
396
428
|
const nextEstimate = this.recomputePostCompactionEstimate(
|
|
@@ -413,6 +445,45 @@ export class ContextWindowManager {
|
|
|
413
445
|
return { ...result, estimatedInputTokens, exhausted: true };
|
|
414
446
|
}
|
|
415
447
|
|
|
448
|
+
/**
|
|
449
|
+
* Emergency mid-turn compaction — summarize everything before the last
|
|
450
|
+
* tool_use/tool_result pair and let the agent continue with
|
|
451
|
+
* `[summary, last_tool_call, last_tool_result]`. Used as a recovery rung
|
|
452
|
+
* after the provider rejects a turn for context overflow. The manager
|
|
453
|
+
* supplies the provider, system prompt, token budget, conversation id, and
|
|
454
|
+
* non-persisted prefix count it already owns; the caller provides only the
|
|
455
|
+
* overflow-specific inputs.
|
|
456
|
+
*/
|
|
457
|
+
async emergencyCompact(
|
|
458
|
+
messages: Message[],
|
|
459
|
+
options: EmergencyCompactOptions,
|
|
460
|
+
signal?: AbortSignal,
|
|
461
|
+
): Promise<CompactionRunResult> {
|
|
462
|
+
if (this.conversationId == null) {
|
|
463
|
+
throw new Error(
|
|
464
|
+
"ContextWindowManager has no conversationId — cannot run emergency compaction",
|
|
465
|
+
);
|
|
466
|
+
}
|
|
467
|
+
try {
|
|
468
|
+
return await runEmergencyCompaction({
|
|
469
|
+
conversationId: this.conversationId,
|
|
470
|
+
messages,
|
|
471
|
+
provider: this.provider,
|
|
472
|
+
systemPrompt: this.systemPrompt,
|
|
473
|
+
tools: undefined,
|
|
474
|
+
compaction: this.resolveCompactionConfig(),
|
|
475
|
+
maxInputTokens: this.config.maxInputTokens,
|
|
476
|
+
previousEstimatedInputTokens: options.previousEstimatedInputTokens,
|
|
477
|
+
force: true,
|
|
478
|
+
signal,
|
|
479
|
+
overrideProfile: options.overrideProfile ?? null,
|
|
480
|
+
nonPersistedPrefixCount: this._nonPersistedPrefixCount,
|
|
481
|
+
});
|
|
482
|
+
} finally {
|
|
483
|
+
this.clearSystemPromptCache();
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
|
|
416
487
|
/**
|
|
417
488
|
* Recompute the prompt-token estimate against the post-compaction
|
|
418
489
|
* message array. The compactor returns a conservative placeholder; the
|
|
@@ -434,21 +505,20 @@ export class ContextWindowManager {
|
|
|
434
505
|
}
|
|
435
506
|
|
|
436
507
|
/**
|
|
437
|
-
* Decrement the non-persisted prefix bookkeeping
|
|
438
|
-
*
|
|
439
|
-
*
|
|
440
|
-
*
|
|
508
|
+
* Decrement the non-persisted prefix bookkeeping after a productive
|
|
509
|
+
* compaction. Called once per successful internal attempt so multi-attempt
|
|
510
|
+
* runs keep the count honest as the leading injected messages get folded
|
|
511
|
+
* into the summary.
|
|
441
512
|
*/
|
|
442
513
|
private consumeCompactionState(compactedMessages: number): void {
|
|
443
514
|
const compactedAway = Math.min(
|
|
444
|
-
this.
|
|
515
|
+
this._nonPersistedPrefixCount,
|
|
445
516
|
compactedMessages,
|
|
446
517
|
);
|
|
447
|
-
this.
|
|
518
|
+
this._nonPersistedPrefixCount = Math.max(
|
|
448
519
|
0,
|
|
449
|
-
this.
|
|
520
|
+
this._nonPersistedPrefixCount - compactedAway,
|
|
450
521
|
);
|
|
451
|
-
this.summaryIsInjected = false;
|
|
452
522
|
}
|
|
453
523
|
}
|
|
454
524
|
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* First-party default plugins — definitions and centralized registration.
|
|
3
3
|
*
|
|
4
|
-
* Each default
|
|
5
|
-
*
|
|
6
|
-
* and at test time, even when no
|
|
4
|
+
* Each default contributes the hooks for one of the assistant's built-in
|
|
5
|
+
* behaviors (history repair, title generation, tool-error coaching, …) so the
|
|
6
|
+
* lifecycle is always populated at boot and at test time, even when no
|
|
7
|
+
* third-party plugins are loaded. A `Plugin` is the manifest (name/version,
|
|
8
|
+
* sourced from the sibling `package.json`) plus its hook map; the hook
|
|
9
|
+
* implementations live in each `defaults/<name>/hooks/` directory.
|
|
7
10
|
*
|
|
8
11
|
* Consumers:
|
|
9
12
|
*
|
|
@@ -16,44 +19,171 @@
|
|
|
16
19
|
* production-parity state (e.g. `conversation-agent-loop.test.ts`); those
|
|
17
20
|
* call {@link resetPluginRegistryAndRegisterDefaults}.
|
|
18
21
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* every module has finished initializing, so importing this aggregator does no
|
|
23
|
-
* registration work.
|
|
22
|
+
* The plugin definitions below are plain `const`s, so importing this module
|
|
23
|
+
* does no registration work — registration is driven by
|
|
24
|
+
* {@link registerDefaultPlugins} at call time.
|
|
24
25
|
*/
|
|
25
26
|
|
|
26
27
|
import { registerPlugin, resetPluginRegistryForTests } from "../registry.js";
|
|
27
28
|
import { type Plugin, PluginExecutionError } from "../types.js";
|
|
28
|
-
import
|
|
29
|
-
import
|
|
30
|
-
import
|
|
31
|
-
import
|
|
32
|
-
import
|
|
33
|
-
import
|
|
34
|
-
import
|
|
35
|
-
import
|
|
29
|
+
import compactionPkg from "./compaction/package.json" with { type: "json" };
|
|
30
|
+
import emptyResponseStop from "./empty-response/hooks/stop.js";
|
|
31
|
+
import emptyResponsePkg from "./empty-response/package.json" with { type: "json" };
|
|
32
|
+
import historyRepairUserPromptSubmit from "./history-repair/hooks/user-prompt-submit.js";
|
|
33
|
+
import historyRepairPkg from "./history-repair/package.json" with { type: "json" };
|
|
34
|
+
import memoryRetrievalUserPromptSubmit from "./memory-retrieval/hooks/user-prompt-submit.js";
|
|
35
|
+
import memoryRetrievalPkg from "./memory-retrieval/package.json" with { type: "json" };
|
|
36
|
+
import memoryV3PostCompact from "./memory-v3-shadow/hooks/post-compact.js";
|
|
37
|
+
import memoryV3UserPromptSubmit from "./memory-v3-shadow/hooks/user-prompt-submit.js";
|
|
38
|
+
import memoryV3Pkg from "./memory-v3-shadow/package.json" with { type: "json" };
|
|
39
|
+
import titleGenerateStop from "./title-generate/hooks/stop.js";
|
|
40
|
+
import titleGenerateUserPromptSubmit from "./title-generate/hooks/user-prompt-submit.js";
|
|
41
|
+
import titleGeneratePkg from "./title-generate/package.json" with { type: "json" };
|
|
42
|
+
import toolErrorPostToolUse from "./tool-error/hooks/post-tool-use.js";
|
|
43
|
+
import toolErrorPkg from "./tool-error/package.json" with { type: "json" };
|
|
44
|
+
import toolResultTruncatePostToolUse from "./tool-result-truncate/hooks/post-tool-use.js";
|
|
45
|
+
import toolResultTruncatePkg from "./tool-result-truncate/package.json" with { type: "json" };
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* `compaction` — compaction is implemented in `compaction/compact.ts` as
|
|
49
|
+
* `defaultCompact`, which the agent loop calls directly. The plugin stays
|
|
50
|
+
* registered as a placeholder so it keeps a presence in the defaults list
|
|
51
|
+
* while we decide how plugins should surface compaction; it contributes no
|
|
52
|
+
* hooks today.
|
|
53
|
+
*/
|
|
54
|
+
export const defaultCompactionPlugin: Plugin = {
|
|
55
|
+
manifest: {
|
|
56
|
+
name: compactionPkg.name,
|
|
57
|
+
version: compactionPkg.version,
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* `empty-response` — a `stop` hook that re-queries the model when a turn
|
|
63
|
+
* yields with no tool calls but came back empty (or as a provider refusal).
|
|
64
|
+
*/
|
|
65
|
+
export const defaultEmptyResponsePlugin: Plugin = {
|
|
66
|
+
manifest: {
|
|
67
|
+
name: emptyResponsePkg.name,
|
|
68
|
+
version: emptyResponsePkg.version,
|
|
69
|
+
},
|
|
70
|
+
hooks: {
|
|
71
|
+
stop: emptyResponseStop,
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* `memory-retrieval` — a `user-prompt-submit` hook that runs memory-graph
|
|
77
|
+
* retrieval and assembles the turn's runtime injections (the unified
|
|
78
|
+
* `<turn_context>` block, Slack chronological transcript, NOW.md / PKB /
|
|
79
|
+
* memory-v2 / workspace blocks). Registered first in the chain so later
|
|
80
|
+
* `user-prompt-submit` hooks (history repair, title) see the fully
|
|
81
|
+
* memory-injected history.
|
|
82
|
+
*/
|
|
83
|
+
export const defaultMemoryRetrievalPlugin: Plugin = {
|
|
84
|
+
manifest: {
|
|
85
|
+
name: memoryRetrievalPkg.name,
|
|
86
|
+
version: memoryRetrievalPkg.version,
|
|
87
|
+
},
|
|
88
|
+
hooks: {
|
|
89
|
+
"user-prompt-submit": memoryRetrievalUserPromptSubmit,
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* `history-repair` — a `user-prompt-submit` hook that normalizes the working
|
|
95
|
+
* message history (tool-use/tool-result pairing, role alternation) before the
|
|
96
|
+
* agent loop hands it to the provider.
|
|
97
|
+
*/
|
|
98
|
+
export const defaultHistoryRepairPlugin: Plugin = {
|
|
99
|
+
manifest: {
|
|
100
|
+
name: historyRepairPkg.name,
|
|
101
|
+
version: historyRepairPkg.version,
|
|
102
|
+
},
|
|
103
|
+
hooks: {
|
|
104
|
+
"user-prompt-submit": historyRepairUserPromptSubmit,
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* `memory-v3-shadow` — houses the memory-v3 shadow/live orchestration engine
|
|
110
|
+
* (`memory-v3-shadow/`) and its injector. The `user-prompt-submit` /
|
|
111
|
+
* `post-compact` hooks are no-op scaffolding for the eventual convergence,
|
|
112
|
+
* when v3 injection moves off the loop-driven chain and into these hooks.
|
|
113
|
+
*/
|
|
114
|
+
export const memoryV3ShadowPlugin: Plugin = {
|
|
115
|
+
manifest: {
|
|
116
|
+
name: memoryV3Pkg.name,
|
|
117
|
+
version: memoryV3Pkg.version,
|
|
118
|
+
},
|
|
119
|
+
hooks: {
|
|
120
|
+
"user-prompt-submit": memoryV3UserPromptSubmit,
|
|
121
|
+
"post-compact": memoryV3PostCompact,
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* `title-generate` — two pure-trigger hooks that delegate the title work to
|
|
127
|
+
* the conversation-title service: `user-prompt-submit` (first-pass title) and
|
|
128
|
+
* `stop` (second-pass regeneration once the topic is established).
|
|
129
|
+
*/
|
|
130
|
+
export const defaultTitleGeneratePlugin: Plugin = {
|
|
131
|
+
manifest: {
|
|
132
|
+
name: titleGeneratePkg.name,
|
|
133
|
+
version: titleGeneratePkg.version,
|
|
134
|
+
},
|
|
135
|
+
hooks: {
|
|
136
|
+
"user-prompt-submit": titleGenerateUserPromptSubmit,
|
|
137
|
+
stop: titleGenerateStop,
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* `tool-error` — a `post-tool-use` hook that coaches the model to retry or
|
|
143
|
+
* report a failed tool call, bounded per tool. The coaching is surfaced via
|
|
144
|
+
* `additionalContext`, leaving the tool result's own content untouched.
|
|
145
|
+
*/
|
|
146
|
+
export const defaultToolErrorPlugin: Plugin = {
|
|
147
|
+
manifest: {
|
|
148
|
+
name: toolErrorPkg.name,
|
|
149
|
+
version: toolErrorPkg.version,
|
|
150
|
+
},
|
|
151
|
+
hooks: {
|
|
152
|
+
"post-tool-use": toolErrorPostToolUse,
|
|
153
|
+
},
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* `tool-result-truncate` — a `post-tool-use` hook that tail-drops an oversized
|
|
158
|
+
* tool result down to a character budget derived from the model's context
|
|
159
|
+
* window before the result is sent to the provider.
|
|
160
|
+
*/
|
|
161
|
+
export const defaultToolResultTruncatePlugin: Plugin = {
|
|
162
|
+
manifest: {
|
|
163
|
+
name: toolResultTruncatePkg.name,
|
|
164
|
+
version: toolResultTruncatePkg.version,
|
|
165
|
+
},
|
|
166
|
+
hooks: {
|
|
167
|
+
"post-tool-use": toolResultTruncatePostToolUse,
|
|
168
|
+
},
|
|
169
|
+
};
|
|
36
170
|
|
|
37
171
|
/**
|
|
38
172
|
* Full set of first-party default plugins. Used by
|
|
39
173
|
* {@link registerDefaultPlugins} to drive the registration loop; the array
|
|
40
|
-
* order is the registration order, which
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
* Returned by a function rather than a top-level `const` so the array
|
|
44
|
-
* contents are read at call time, after every imported plugin identifier is
|
|
45
|
-
* guaranteed initialized.
|
|
174
|
+
* order is the registration order, which fixes hook-chain order (defaults run
|
|
175
|
+
* ahead of any later-registered user plugins).
|
|
46
176
|
*/
|
|
47
177
|
function getAllDefaultPlugins(): readonly Plugin[] {
|
|
48
178
|
return [
|
|
179
|
+
defaultMemoryRetrievalPlugin,
|
|
49
180
|
defaultToolResultTruncatePlugin,
|
|
50
181
|
defaultEmptyResponsePlugin,
|
|
51
182
|
defaultToolErrorPlugin,
|
|
52
|
-
defaultOverflowReducePlugin,
|
|
53
183
|
defaultHistoryRepairPlugin,
|
|
54
184
|
defaultCompactionPlugin,
|
|
55
|
-
defaultCircuitBreakerPlugin,
|
|
56
185
|
defaultTitleGeneratePlugin,
|
|
186
|
+
memoryV3ShadowPlugin,
|
|
57
187
|
];
|
|
58
188
|
}
|
|
59
189
|
|
|
@@ -85,7 +215,7 @@ export function registerDefaultPlugins(): void {
|
|
|
85
215
|
* so integration tests that exercise the full agent loop have a
|
|
86
216
|
* production-parity plugin stack. Use this in `beforeEach` of tests that
|
|
87
217
|
* dispatch through pipelines with a terminal that assumes the default
|
|
88
|
-
* plugin handles every op (e.g.
|
|
218
|
+
* plugin handles every op (e.g. compaction).
|
|
89
219
|
*
|
|
90
220
|
* Tests that specifically need an empty registry (pipeline-unit tests, the
|
|
91
221
|
* plugin-registry tests themselves) should continue to call
|
|
@@ -10,82 +10,130 @@
|
|
|
10
10
|
* history (and the blocks it captured), with no dependency on the agent loop's
|
|
11
11
|
* closure state.
|
|
12
12
|
*
|
|
13
|
-
* It re-applies the runtime injections via {@link applyRuntimeInjections}
|
|
14
|
-
* re-tracks the memory graph's cached nodes against the re-injected history
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* expected to migrate here as the hook subsumes the loop's re-injection
|
|
19
|
-
* ceremony.
|
|
13
|
+
* It re-applies the runtime injections via {@link applyRuntimeInjections} and
|
|
14
|
+
* re-tracks the memory graph's cached nodes against the re-injected history.
|
|
15
|
+
* The remaining orchestrator-side step (the post-injection bookkeeping the
|
|
16
|
+
* loop records) is expected to migrate here as the hook subsumes the loop's
|
|
17
|
+
* re-injection ceremony.
|
|
20
18
|
*
|
|
21
19
|
* The memory graph handle is sourced internally from the plugin's own
|
|
22
20
|
* conversation-keyed registry ({@link getLiveGraphMemory}) rather than being
|
|
23
21
|
* threaded in by the loop — it is memory-retrieval-specific state, not
|
|
24
|
-
* something the generic loop
|
|
22
|
+
* something the generic loop should carry.
|
|
25
23
|
*/
|
|
26
24
|
|
|
27
25
|
import {
|
|
28
26
|
applyRuntimeInjections,
|
|
29
|
-
type
|
|
27
|
+
type InboundActorContext,
|
|
28
|
+
type InjectionMode,
|
|
30
29
|
type RuntimeInjectionResult,
|
|
31
30
|
} from "../../../../daemon/conversation-runtime-assembly.js";
|
|
32
|
-
import {
|
|
31
|
+
import {
|
|
32
|
+
resolveTrustClass,
|
|
33
|
+
type TrustContext,
|
|
34
|
+
} from "../../../../daemon/trust-context.js";
|
|
33
35
|
import { getLiveGraphMemory } from "../../../../memory/graph/conversation-graph-memory.js";
|
|
34
|
-
import type { PluginLogger } from "../../../../plugin-api/types.js";
|
|
35
36
|
import type { Message } from "../../../../providers/types.js";
|
|
36
|
-
import type { TurnContext } from "../../../types.js";
|
|
37
37
|
|
|
38
38
|
/**
|
|
39
|
-
*
|
|
40
|
-
* state. Re-injection inputs migrate loop-ward by growing this
|
|
41
|
-
* hands the hook an object of this shape
|
|
42
|
-
* {@link
|
|
39
|
+
* Everything the post-compaction hook needs, supplied by the agent loop from
|
|
40
|
+
* its own working state. Re-injection inputs migrate loop-ward by growing this
|
|
41
|
+
* type; the loop hands the hook an object of this shape when it calls
|
|
42
|
+
* {@link postCompact} directly.
|
|
43
|
+
*
|
|
44
|
+
* The turn-identity fields are flat here: `conversationId` is the key the
|
|
45
|
+
* re-injection resolves the live conversation through (and the only one that,
|
|
46
|
+
* together with `requestId` and `trust`, cannot be recovered from that live
|
|
47
|
+
* conversation), while `turnIndex` and `callSite` are intentionally omitted so
|
|
48
|
+
* {@link applyRuntimeInjections} self-resolves them from the live conversation.
|
|
49
|
+
* The memory graph handle is likewise sourced internally via
|
|
50
|
+
* {@link getLiveGraphMemory} rather than threaded in.
|
|
43
51
|
*/
|
|
44
|
-
export interface
|
|
52
|
+
export interface PostCompactContext {
|
|
45
53
|
/** Compacted message history to re-inject onto. */
|
|
46
54
|
history: Message[];
|
|
47
|
-
/**
|
|
48
|
-
|
|
55
|
+
/**
|
|
56
|
+
* Stable ID for the current request, forwarded onto the injector turn
|
|
57
|
+
* context. The one turn-identity field that cannot be recovered from the
|
|
58
|
+
* live conversation, so the loop supplies it.
|
|
59
|
+
*/
|
|
60
|
+
requestId: string | undefined;
|
|
61
|
+
/**
|
|
62
|
+
* Conversation the turn is scoped to. The key the re-injection resolves the
|
|
63
|
+
* live conversation (and its channel/trust/transcript state) through, so the
|
|
64
|
+
* loop always supplies it.
|
|
65
|
+
*/
|
|
66
|
+
conversationId: string;
|
|
67
|
+
/**
|
|
68
|
+
* Trust classification and channel identity for the inbound actor, forwarded
|
|
69
|
+
* onto the injector turn context and used to gate the memory-graph re-track.
|
|
70
|
+
* Supplied by the loop as the turn-start snapshot rather than re-resolved
|
|
71
|
+
* mid-turn.
|
|
72
|
+
*/
|
|
73
|
+
trust: TrustContext;
|
|
74
|
+
/**
|
|
75
|
+
* Whether the in-flight turn has no human present to answer clarification
|
|
76
|
+
* questions. Resolved once by the agent loop at turn start (from its
|
|
77
|
+
* `isInteractive` option, which can fall back to mutable client/headless
|
|
78
|
+
* state that flips mid-turn on SSE reconnect) and handed to the hook here, so
|
|
79
|
+
* re-injection uses the loop's turn-start snapshot rather than re-reading
|
|
80
|
+
* live conversation state.
|
|
81
|
+
*/
|
|
82
|
+
isNonInteractive: boolean;
|
|
83
|
+
/**
|
|
84
|
+
* Injection volume for the re-applied blocks. Owned by the agent loop, which
|
|
85
|
+
* drops to `"minimal"` when overflow reduction trims the prompt; handed to
|
|
86
|
+
* the hook here so re-injection matches the loop's committed decision instead
|
|
87
|
+
* of re-deriving it.
|
|
88
|
+
*/
|
|
89
|
+
mode: InjectionMode;
|
|
90
|
+
/**
|
|
91
|
+
* The `model_profile:` turn-context label, or `null` when the active
|
|
92
|
+
* inference profile is unchanged since the last notified one. The agent loop
|
|
93
|
+
* resolves it once at turn start from config and the turn's profile override,
|
|
94
|
+
* and notifies the model only on change — a decision that flips mid-turn once
|
|
95
|
+
* the notification is persisted, so it cannot be re-derived. Handed to the
|
|
96
|
+
* hook here so re-injection re-emits the loop's turn-start value.
|
|
97
|
+
*/
|
|
98
|
+
modelProfile: string | null;
|
|
99
|
+
/**
|
|
100
|
+
* Inbound actor identity and trust fields for the unified `<turn_context>`
|
|
101
|
+
* block, or `null` on guardian turns (which suppress the actor section). The
|
|
102
|
+
* agent loop resolves it once at turn start via the actor-trust resolver,
|
|
103
|
+
* whose contact/member registry inputs can be mutated mid-turn by contact
|
|
104
|
+
* tools, so it cannot be re-derived. Handed to the hook here so re-injection
|
|
105
|
+
* re-emits the loop's turn-start value.
|
|
106
|
+
*/
|
|
107
|
+
actorContext: InboundActorContext | null;
|
|
49
108
|
}
|
|
50
109
|
|
|
51
|
-
|
|
52
|
-
* Everything the hook needs in a single context: the loop-supplied
|
|
53
|
-
* {@link PostCompactionHookInput}, the resolved {@link RuntimeInjectionOptions}
|
|
54
|
-
* (spread top-level so each field stays individually addressable), and the
|
|
55
|
-
* conversation-scoped state the options bag cannot carry (actor trust and a
|
|
56
|
-
* turn-scoped logger). The memory graph handle is not part of this context —
|
|
57
|
-
* the hook sources it internally via {@link getLiveGraphMemory}.
|
|
58
|
-
*/
|
|
59
|
-
export interface PostCompactContext
|
|
60
|
-
extends RuntimeInjectionOptions, PostCompactionHookInput {
|
|
61
|
-
/** True when the actor for this turn is trusted (guardian-class). */
|
|
62
|
-
isTrustedActor: boolean;
|
|
63
|
-
/** Turn-scoped logger for diagnostics emitted while re-injecting. */
|
|
64
|
-
logger: PluginLogger;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
export default async function postCompactReinject(
|
|
110
|
+
export default async function postCompact(
|
|
68
111
|
ctx: PostCompactContext,
|
|
69
112
|
): Promise<RuntimeInjectionResult> {
|
|
70
|
-
const { history,
|
|
71
|
-
|
|
113
|
+
const { history, requestId, conversationId, trust, ...options } = ctx;
|
|
114
|
+
// The remaining `options` carry the non-identity injection inputs
|
|
115
|
+
// (`isNonInteractive`, `mode`, `modelProfile`, `actorContext`). Forward the
|
|
116
|
+
// turn-identity fields the live conversation can't supply (`requestId`,
|
|
117
|
+
// `conversationId`, `trust`); `turnIndex` and `callSite` self-resolve from
|
|
118
|
+
// the live conversation so the re-injection matches the turn's initial
|
|
119
|
+
// assembly.
|
|
120
|
+
const result = await applyRuntimeInjections(history, {
|
|
121
|
+
...options,
|
|
122
|
+
requestId,
|
|
123
|
+
conversationId,
|
|
124
|
+
trust,
|
|
125
|
+
});
|
|
72
126
|
// Re-track the nodes the memory graph last injected so they survive against
|
|
73
127
|
// the re-injected history. Untrusted actors and minimal-mode turns never
|
|
74
128
|
// received a memory-graph injection, so there is nothing to re-track. The
|
|
75
|
-
//
|
|
76
|
-
//
|
|
77
|
-
//
|
|
129
|
+
// actor's trust class is derived from the turn's own trust context (the same
|
|
130
|
+
// value the injector chain resolves). The live graph handle is looked up
|
|
131
|
+
// from the plugin's own registry by the turn's conversation id — the same
|
|
132
|
+
// instance the turn's retrieval mutated, so re-tracking sees the real
|
|
133
|
+
// cached-node state.
|
|
134
|
+
const isTrustedActor = resolveTrustClass(trust) === "guardian";
|
|
78
135
|
if (isTrustedActor && options.mode !== "minimal") {
|
|
79
|
-
getLiveGraphMemory(
|
|
80
|
-
options.turnContext?.conversationId,
|
|
81
|
-
)?.retrackCachedNodes();
|
|
82
|
-
}
|
|
83
|
-
const strip = stripHistoricalWebSearchResults(result.messages);
|
|
84
|
-
if (strip.stats.blocksStripped > 0) {
|
|
85
|
-
logger.info(
|
|
86
|
-
{ phase: "mid-loop-compact", ...strip.stats },
|
|
87
|
-
"Converted historical web_search_tool_result blocks to text summaries",
|
|
88
|
-
);
|
|
136
|
+
getLiveGraphMemory(conversationId)?.retrackCachedNodes();
|
|
89
137
|
}
|
|
90
|
-
return
|
|
138
|
+
return result;
|
|
91
139
|
}
|