@vellumai/assistant 0.8.7 → 0.8.8-dev.202606052332.17fc8ea
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/Dockerfile +20 -4
- package/bun.lock +2 -2
- package/docker-entrypoint.sh +4 -2
- package/docker-init-apt-root.sh +3 -1
- package/docker-kata-apt-env.sh +3 -1
- package/docker-kata-runtime-family.sh +12 -0
- package/docs/architecture/memory.md +1 -1
- package/examples/plugins/echo/README.md +61 -66
- 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/server-message.ts +3 -3
- package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +7 -6
- package/openapi.yaml +3378 -335
- package/package.json +2 -2
- package/scripts/generate-openapi.ts +68 -41
- package/src/__tests__/agent-loop-exit-reason.test.ts +35 -93
- package/src/__tests__/agent-loop-provider-error-recording.test.ts +1 -1
- package/src/__tests__/agent-loop.test.ts +37 -87
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +2 -0
- package/src/__tests__/annotate-activity-metadata.test.ts +262 -0
- package/src/__tests__/annotate-risk-options.test.ts +2 -3
- package/src/__tests__/anthropic-provider.test.ts +95 -2
- package/src/__tests__/app-control-flow.test.ts +1 -1
- package/src/__tests__/app-dir-path-guard.test.ts +1 -0
- package/src/__tests__/approval-routes-http.test.ts +4 -1
- package/src/__tests__/assistant-event-hub.test.ts +25 -0
- package/src/__tests__/assistant-events-sse-shed.test.ts +8 -0
- package/src/__tests__/{conversation-stream-state.test.ts → assistant-stream-state.test.ts} +252 -91
- package/src/__tests__/auth-fallback-events-store.test.ts +116 -0
- package/src/__tests__/background-workers-disk-pressure.test.ts +6 -0
- package/src/__tests__/btw-routes.test.ts +62 -3
- package/src/__tests__/build-persisted-content.test.ts +184 -0
- package/src/__tests__/catalog-files.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__/clawhub-files.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.benchmark.test.ts +0 -30
- package/src/__tests__/config-watcher.test.ts +1 -1
- package/src/__tests__/conversation-abort-tool-results.test.ts +57 -19
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +6 -5
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +10 -7
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +316 -1143
- package/src/__tests__/conversation-agent-loop.test.ts +638 -1655
- package/src/__tests__/conversation-analysis-routes.test.ts +6 -0
- package/src/__tests__/conversation-clean-command.test.ts +5 -2
- package/src/__tests__/conversation-history-web-search.test.ts +11 -1
- package/src/__tests__/conversation-pairing.test.ts +4 -31
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +6 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +30 -10
- package/src/__tests__/conversation-queue.test.ts +2 -0
- package/src/__tests__/conversation-routes-disk-view.test.ts +3 -0
- package/src/__tests__/conversation-routes-slash-commands.test.ts +6 -5
- package/src/__tests__/conversation-runtime-assembly.test.ts +310 -300
- package/src/__tests__/conversation-runtime-workspace.test.ts +105 -45
- package/src/__tests__/conversation-slash-commands.test.ts +8 -42
- package/src/__tests__/conversation-slash-queue.test.ts +6 -1
- package/src/__tests__/conversation-starter-routes.test.ts +14 -6
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +84 -0
- package/src/__tests__/conversation-sync-tags.test.ts +27 -15
- package/src/__tests__/conversation-title-service.test.ts +135 -2
- package/src/__tests__/conversation-workspace-cache-state.test.ts +17 -16
- package/src/__tests__/conversation-workspace-injection.test.ts +67 -2
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +7 -6
- package/src/__tests__/conversations-import-system-filter.test.ts +101 -0
- package/src/__tests__/cross-provider-web-search.test.ts +214 -1
- package/src/__tests__/db-acp-history.test.ts +101 -0
- package/src/__tests__/db-schedule-syntax-migration.test.ts +5 -0
- package/src/__tests__/dm-persistence.test.ts +5 -1
- package/src/__tests__/dynamic-page-surface.test.ts +31 -0
- package/src/__tests__/empty-response-hook.test.ts +304 -0
- package/src/__tests__/feature-flag-test-helpers.ts +2 -2
- package/src/__tests__/file-write-tool.test.ts +63 -0
- package/src/__tests__/gateway-only-guard.test.ts +12 -2
- package/src/__tests__/gemini-image-service.test.ts +13 -0
- 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__/helpers/mock-provider.ts +110 -0
- package/src/__tests__/helpers/native-web-search-harness.ts +129 -0
- package/src/__tests__/history-repair-hook.test.ts +1 -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__/identity-intro-cache.test.ts +12 -100
- package/src/__tests__/identity-routes.test.ts +248 -7
- package/src/__tests__/inbound-slack-persistence.test.ts +5 -1
- package/src/__tests__/injector-background-turn.test.ts +3 -9
- package/src/__tests__/injector-chain.test.ts +139 -275
- package/src/__tests__/injector-disk-pressure.test.ts +75 -41
- package/src/__tests__/injector-document-comments.test.ts +3 -3
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +30 -22
- package/src/__tests__/injector-v3-suppression.test.ts +31 -37
- package/src/__tests__/internal-telemetry-routes.test.ts +109 -0
- package/src/__tests__/list-messages-hidden-metadata.test.ts +38 -0
- package/src/__tests__/list-messages-page-latest.test.ts +60 -0
- package/src/__tests__/list-messages-tool-merge.test.ts +20 -0
- package/src/__tests__/llm-usage-store.test.ts +223 -1
- package/src/__tests__/memory-retrieval-hook.test.ts +297 -0
- package/src/__tests__/memory-v2-static-injector.test.ts +103 -35
- package/src/__tests__/native-web-search.test.ts +191 -0
- package/src/__tests__/onboarding-template-contract.test.ts +2 -0
- package/src/__tests__/openai-image-service.test.ts +17 -0
- package/src/__tests__/openai-provider.test.ts +31 -1
- package/src/__tests__/{overflow-reduce-pipeline.test.ts → overflow-reduction-loop.test.ts} +64 -284
- package/src/__tests__/persist-unsendable-image.test.ts +215 -0
- package/src/__tests__/persistence-secret-redaction.test.ts +1 -0
- package/src/__tests__/pkb-autoinject.test.ts +2 -5
- package/src/__tests__/plugin-api-shim.test.ts +3 -6
- package/src/__tests__/plugin-bootstrap.test.ts +14 -40
- package/src/__tests__/plugin-registry.test.ts +3 -76
- package/src/__tests__/plugin-types.test.ts +0 -193
- package/src/__tests__/process-message-display-content.test.ts +6 -2
- package/src/__tests__/reaction-persistence.test.ts +1 -1
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +5 -1
- package/src/__tests__/resolve-trust-class.test.ts +4 -4
- package/src/__tests__/runtime-events-sse-reconnect.test.ts +60 -23
- package/src/__tests__/schedule-routes.test.ts +603 -2
- package/src/__tests__/schedule-store.test.ts +41 -0
- package/src/__tests__/schedule-tools.test.ts +35 -0
- package/src/__tests__/send-endpoint-busy.test.ts +4 -1
- package/src/__tests__/server-history-render.test.ts +314 -1
- package/src/__tests__/skill-feature-flags-integration.test.ts +33 -0
- package/src/__tests__/skillssh-files.test.ts +1 -1
- package/src/__tests__/subagent-call-site-routing.test.ts +1 -1
- 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__/system-prompt.test.ts +20 -0
- package/src/__tests__/task-scheduler.test.ts +162 -1
- package/src/__tests__/terminal-tools.test.ts +6 -1
- package/src/__tests__/title-generate-hook.test.ts +319 -0
- package/src/__tests__/tool-error-hook.test.ts +278 -0
- package/src/__tests__/tool-preview-lifecycle.test.ts +468 -5
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +1 -0
- package/src/__tests__/tool-result-truncate-hook.test.ts +127 -0
- package/src/__tests__/tool-result-truncation.test.ts +0 -2
- package/src/__tests__/ui-choice-copy-surfaces.test.ts +254 -0
- package/src/__tests__/ui-work-result-surface.test.ts +159 -0
- package/src/__tests__/usage-routes.test.ts +285 -1
- package/src/__tests__/user-plugin-loader.test.ts +54 -286
- package/src/__tests__/voice-session-bridge.test.ts +6 -3
- package/src/__tests__/web-search-backend-failure.test.ts +166 -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-history-db.ts +82 -0
- package/src/acp/__tests__/helpers/exec-file-stub.ts +101 -0
- package/src/acp/__tests__/prepare-agent-env.test.ts +137 -0
- package/src/acp/__tests__/session-manager-persistence.test.ts +95 -28
- package/src/acp/__tests__/session-manager-resume.test.ts +736 -0
- package/src/acp/agent-process.ts +61 -1
- package/src/acp/auto-install.test.ts +196 -0
- package/src/acp/auto-install.ts +177 -0
- package/src/acp/client-handler.ts +31 -0
- package/src/acp/feature-gate.test.ts +48 -0
- package/src/acp/feature-gate.ts +34 -0
- package/src/acp/prepare-agent-env.ts +83 -29
- package/src/acp/resolve-agent.test.ts +320 -7
- package/src/acp/resolve-agent.ts +182 -18
- package/src/acp/resume-hint.ts +25 -0
- package/src/acp/session-manager.ts +495 -73
- package/src/acp/types.ts +8 -0
- package/src/agent/compaction-circuit.ts +60 -102
- package/src/agent/loop.ts +362 -485
- package/src/api/events/assistant-thinking-delta.ts +33 -0
- package/src/api/events/tool-output-chunk.ts +45 -0
- package/src/api/events/tool-use-preview-start.ts +32 -0
- package/src/api/events/trace-event.ts +69 -0
- package/src/api/index.ts +48 -13
- package/src/api/responses/conversation-message.ts +374 -0
- package/src/approvals/guardian-request-resolvers.ts +1 -1
- package/src/avatar/__tests__/avatar-store.test.ts +34 -29
- package/src/background-wake/next-wake.ts +1 -0
- package/src/cli/commands/__tests__/notifications.test.ts +58 -14
- package/src/cli/commands/notifications.ts +112 -60
- 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/assistant-feature-flags.ts +22 -11
- package/src/config/bundled-skills/acp/SKILL.md +83 -31
- package/src/config/bundled-skills/acp/TOOLS.json +4 -4
- package/src/config/bundled-skills/app-builder/SKILL.md +224 -398
- package/src/config/bundled-skills/app-builder/TOOLS.json +29 -0
- package/src/config/bundled-skills/app-builder/references/DESIGN_SYSTEM.md +48 -0
- package/src/config/bundled-skills/app-builder/references/RESPONSIVE.md +57 -0
- package/src/config/bundled-skills/app-builder/references/SLIDES.md +38 -0
- package/src/config/bundled-skills/app-builder/references/examples/README.md +17 -0
- package/src/config/bundled-skills/app-builder/references/examples/expense-tracker.md +515 -0
- package/src/config/bundled-skills/app-builder/references/examples/focus-timer.md +342 -0
- package/src/config/bundled-skills/app-builder/references/examples/habit-tracker.md +490 -0
- package/src/config/bundled-skills/app-builder/tools/app-list.ts +62 -0
- package/src/config/bundled-skills/document-editor/SKILL.md +28 -23
- package/src/config/bundled-skills/document-editor/TOOLS.json +1 -1
- package/src/config/bundled-skills/messaging/SKILL.md +0 -7
- package/src/config/bundled-tool-registry.ts +2 -0
- package/src/config/feature-flag-cache.ts +3 -3
- package/src/config/feature-flag-registry.json +48 -7
- package/src/config/schemas/__tests__/memory-v2.test.ts +1 -0
- package/src/config/schemas/__tests__/memory-v3.test.ts +25 -0
- package/src/config/schemas/heartbeat.ts +9 -0
- package/src/config/schemas/llm.ts +1 -0
- package/src/config/schemas/memory-v2.ts +8 -0
- package/src/config/schemas/memory-v3.ts +8 -0
- package/src/config/schemas/platform.ts +8 -0
- package/src/config/seed-inference-profiles.ts +2 -2
- package/src/config/skills.ts +13 -0
- package/src/context/compactor.ts +1 -1
- package/src/context/strip-injections.ts +128 -0
- package/src/context/token-estimator.ts +23 -0
- package/src/context/tool-result-truncation.ts +0 -23
- package/src/context/window-manager.ts +5 -7
- package/src/credential-execution/executable-discovery.ts +16 -0
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +6 -0
- package/src/daemon/__tests__/inference-profile-notification.test.ts +153 -0
- package/src/daemon/__tests__/native-web-search-metadata.test.ts +10 -8
- package/src/daemon/assistant-attachments.ts +1 -1
- package/src/daemon/config-watcher.ts +2 -2
- package/src/daemon/context-overflow-reducer.ts +0 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +594 -153
- package/src/daemon/conversation-agent-loop.ts +301 -997
- package/src/daemon/conversation-history.ts +5 -4
- package/src/daemon/conversation-lifecycle.ts +3 -4
- package/src/daemon/conversation-messaging.ts +7 -6
- package/src/daemon/conversation-process.ts +11 -16
- package/src/daemon/conversation-registry.ts +159 -0
- package/src/daemon/conversation-runtime-assembly.ts +218 -398
- package/src/daemon/conversation-slash.ts +6 -25
- package/src/daemon/conversation-store.ts +9 -90
- package/src/daemon/conversation-surfaces.ts +222 -4
- package/src/daemon/conversation-tool-setup.ts +2 -29
- package/src/daemon/conversation-workspace.ts +17 -0
- package/src/daemon/conversation.ts +32 -20
- package/src/daemon/external-plugins-bootstrap.ts +17 -18
- package/src/daemon/handlers/config-a2a.ts +51 -36
- package/src/daemon/handlers/config-slack-channel.ts +20 -14
- package/src/daemon/handlers/config-telegram.ts +16 -2
- package/src/daemon/handlers/conversations.ts +3 -1
- package/src/daemon/handlers/shared.ts +156 -84
- package/src/daemon/handlers/skills.ts +42 -10
- package/src/daemon/lifecycle.ts +25 -0
- package/src/daemon/message-types/apps.ts +1 -29
- package/src/daemon/message-types/messages.ts +9 -57
- package/src/daemon/message-types/skills.ts +2 -0
- package/src/daemon/message-types/surfaces.ts +136 -3
- package/src/daemon/now-scratchpad.ts +21 -0
- package/src/daemon/orphan-reaper.test.ts +210 -0
- package/src/daemon/orphan-reaper.ts +240 -0
- package/src/daemon/overflow-reduction-loop.ts +230 -0
- package/src/daemon/persist-unsendable-image.ts +117 -0
- package/src/daemon/process-message.ts +1 -3
- package/src/daemon/server.ts +2 -0
- package/src/daemon/trace-emitter.ts +6 -4
- package/src/daemon/trust-context.ts +19 -0
- package/src/daemon/wake-target-adapter.ts +3 -1
- 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/home/home-greeting-cache.ts +24 -1
- package/src/ipc/__tests__/browser-ipc.test.ts +1 -1
- package/src/ipc/__tests__/ui-request-route.test.ts +3 -3
- package/src/ipc/gateway-client.test.ts +2 -2
- package/src/ipc/gateway-client.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/media/gemini-image-service.ts +15 -0
- package/src/media/openai-image-service.ts +14 -0
- package/src/media/types.ts +34 -0
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +56 -0
- package/src/memory/auth-fallback-events-store.ts +94 -0
- package/src/memory/conversation-starter-checkpoints.ts +1 -0
- package/src/memory/conversation-title-service.ts +65 -41
- package/src/memory/db-init.ts +6 -0
- package/src/memory/graph/__tests__/conversation-graph-memory-registry.test.ts +119 -0
- package/src/memory/graph/conversation-graph-memory.ts +65 -0
- package/src/memory/job-handlers/conversation-starters.ts +13 -2
- package/src/memory/jobs-store.ts +33 -0
- package/src/memory/jobs-worker.ts +32 -5
- package/src/memory/llm-usage-store.ts +224 -50
- package/src/memory/migrations/222-strip-placeholder-sentinels-from-messages.ts +6 -5
- package/src/memory/migrations/270-schedule-source-conversation.ts +13 -0
- package/src/memory/migrations/271-create-auth-fallback-events.ts +21 -0
- package/src/memory/migrations/272-acp-session-history-cwd.ts +36 -0
- package/src/memory/migrations/index.ts +3 -0
- package/src/memory/pkb/autoinject.ts +61 -0
- package/src/memory/pkb/context.ts +50 -0
- package/src/memory/pkb/types.ts +14 -0
- package/src/memory/schedule-attribution-sql.ts +104 -0
- package/src/memory/schema/acp.ts +4 -0
- package/src/memory/schema/infrastructure.ts +16 -0
- package/src/memory/usage-grouped-buckets.ts +6 -1
- package/src/memory/v2/__tests__/consolidation-job.test.ts +4 -4
- package/src/memory/v2/consolidation-job.ts +14 -5
- package/src/notifications/conversation-pairing.ts +8 -15
- package/src/notifications/decision-engine.ts +6 -3
- package/src/notifications/home-feed-side-effect.ts +12 -1
- package/src/permissions/prompter.ts +4 -0
- package/src/plugin-api/constants.ts +4 -0
- package/src/plugin-api/index.ts +7 -5
- package/src/plugin-api/types.ts +151 -1
- package/src/plugins/defaults/compaction/compact.ts +59 -0
- package/src/plugins/defaults/compaction/package.json +1 -1
- package/src/plugins/defaults/compaction/register.ts +8 -19
- package/src/plugins/defaults/empty-response/hooks/stop.ts +126 -0
- package/src/plugins/defaults/empty-response/register.ts +8 -13
- package/src/plugins/defaults/index.ts +2 -18
- package/src/plugins/defaults/memory-retrieval/hooks/post-compact.ts +95 -0
- package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit-temp.ts +216 -0
- package/src/plugins/defaults/memory-retrieval/injector-chain.ts +35 -0
- package/src/plugins/defaults/{injectors/register.ts → memory-retrieval/injectors.ts} +288 -81
- 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__/health.test.ts +16 -0
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/live-integration.test.ts +4 -4
- 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 +48 -12
- package/src/plugins/defaults/memory-v3-shadow/__tests__/provider-blocks.test.ts +13 -0
- 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 +104 -32
- 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 +96 -30
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/shadow-plugin.test.ts +34 -16
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/assign.ts +5 -5
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/capabilities.ts +2 -2
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/health.ts +0 -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 +75 -0
- package/src/plugins/defaults/memory-v3-shadow/llm-retry.ts +32 -0
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/maintain-job.ts +8 -8
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/orchestrate.ts +26 -14
- package/src/plugins/defaults/{llm-call → memory-v3-shadow}/package.json +2 -2
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/page-content.ts +2 -2
- package/src/plugins/defaults/memory-v3-shadow/provider-blocks.ts +26 -0
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/reconcile.ts +3 -3
- package/src/plugins/defaults/memory-v3-shadow/register.ts +26 -0
- 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 +51 -45
- 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 +61 -46
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/shadow-plugin.ts +69 -99
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/tree.ts +1 -1
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/types.ts +8 -0
- package/src/plugins/defaults/title-generate/hooks/stop.ts +75 -0
- package/src/plugins/defaults/title-generate/hooks/user-prompt-submit.ts +35 -0
- package/src/plugins/defaults/title-generate/package.json +1 -1
- package/src/plugins/defaults/title-generate/register.ts +18 -18
- package/src/plugins/defaults/tool-error/hooks/post-tool-use.ts +118 -0
- package/src/plugins/defaults/tool-error/package.json +1 -1
- package/src/plugins/defaults/tool-error/register.ts +9 -21
- package/src/plugins/defaults/tool-result-truncate/hooks/post-tool-use.ts +32 -0
- package/src/plugins/defaults/tool-result-truncate/register.ts +10 -21
- package/src/plugins/defaults/tool-result-truncate/terminal.ts +37 -18
- package/src/plugins/external-api.ts +2 -2
- package/src/plugins/pipeline.ts +6 -305
- package/src/plugins/registry.ts +10 -55
- package/src/plugins/types.ts +62 -797
- package/src/plugins/user-loader.ts +30 -127
- package/src/proactive-artifact/aux-message-injector.ts +4 -4
- package/src/proactive-artifact/job.test.ts +8 -13
- package/src/prompts/__tests__/system-prompt.test.ts +42 -0
- package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +64 -0
- package/src/prompts/templates/BOOTSTRAP.md +2 -2
- package/src/prompts/templates/system-sections.ts +15 -0
- package/src/providers/anthropic/client.ts +37 -29
- package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +112 -0
- package/src/providers/openai/chat-completions-provider.ts +44 -0
- package/src/providers/openrouter/client.ts +1 -0
- package/src/providers/placeholder-sentinels.ts +35 -0
- package/src/runtime/__tests__/agent-wake.test.ts +10 -6
- package/src/runtime/__tests__/interactive-ui.test.ts +1 -1
- package/src/runtime/agent-wake.ts +2 -5
- package/src/runtime/assistant-event-hub.ts +37 -7
- package/src/runtime/{conversation-stream-state.ts → assistant-stream-state.ts} +132 -58
- package/src/runtime/channel-approvals.ts +1 -1
- package/src/runtime/http-router.ts +16 -21
- package/src/runtime/http-types.ts +16 -70
- package/src/runtime/interactive-ui.ts +1 -1
- package/src/runtime/pending-interactions.ts +1 -0
- package/src/runtime/routes/__tests__/acp-routes.test.ts +283 -55
- package/src/runtime/routes/__tests__/consolidation-routes.test.ts +265 -2
- package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +31 -1
- package/src/runtime/routes/__tests__/memory-v2-routes.test.ts +6 -2
- 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/__tests__/tts-routes.test.ts +6 -2
- package/src/runtime/routes/acp-routes.test.ts +89 -25
- package/src/runtime/routes/acp-routes.ts +81 -29
- package/src/runtime/routes/app-management-routes.ts +6 -117
- package/src/runtime/routes/app-routes.ts +13 -15
- package/src/runtime/routes/approval-routes.ts +1 -1
- package/src/runtime/routes/attachment-routes.ts +26 -15
- package/src/runtime/routes/avatar-routes.ts +26 -0
- package/src/runtime/routes/browser-routes.ts +1 -1
- package/src/runtime/routes/browser-tabs-routes.ts +6 -10
- package/src/runtime/routes/btw-routes.ts +29 -23
- package/src/runtime/routes/consolidation-routes.ts +120 -20
- 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 +3 -1
- package/src/runtime/routes/conversation-routes.ts +372 -185
- package/src/runtime/routes/conversation-starter-routes.ts +13 -7
- package/src/runtime/routes/conversations-import-routes.ts +24 -7
- package/src/runtime/routes/documents-routes.ts +4 -0
- package/src/runtime/routes/domain-routes.ts +51 -37
- package/src/runtime/routes/epoch-millis-range.ts +34 -0
- package/src/runtime/routes/events-routes.ts +28 -34
- package/src/runtime/routes/gateway-log-routes.ts +26 -4
- package/src/runtime/routes/heartbeat-routes.ts +32 -12
- 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-intro-cache.ts +11 -34
- package/src/runtime/routes/identity-routes.ts +224 -18
- package/src/runtime/routes/image-generation-routes.ts +40 -2
- package/src/runtime/routes/inbound-message-handler.ts +1 -1
- package/src/runtime/routes/index.ts +2 -0
- package/src/runtime/routes/integrations/a2a.ts +12 -10
- package/src/runtime/routes/integrations/slack/__tests__/channel.test.ts +16 -0
- package/src/runtime/routes/integrations/slack/channel.ts +4 -0
- package/src/runtime/routes/integrations/slack/share.ts +27 -6
- package/src/runtime/routes/integrations/telegram.ts +6 -0
- package/src/runtime/routes/integrations/twilio.ts +42 -0
- package/src/runtime/routes/internal-telemetry-routes.ts +88 -0
- package/src/runtime/routes/log-export-routes.ts +8 -0
- package/src/runtime/routes/memory-v2-routes.ts +15 -8
- package/src/runtime/routes/memory-v3-routes.ts +66 -34
- package/src/runtime/routes/oauth-apps.ts +66 -12
- package/src/runtime/routes/oauth-providers.ts +44 -5
- package/src/runtime/routes/platform-routes.ts +81 -5
- package/src/runtime/routes/playground/__tests__/force-compact.test.ts +6 -4
- package/src/runtime/routes/playground/force-compact.ts +1 -1
- package/src/runtime/routes/playground/helpers.ts +1 -1
- package/src/runtime/routes/rename-conversation-routes.ts +5 -0
- package/src/runtime/routes/schedule-routes.ts +152 -42
- package/src/runtime/routes/secret-routes.ts +14 -2
- package/src/runtime/routes/skills-routes.ts +43 -14
- package/src/runtime/routes/surface-conversation-resolver.ts +4 -3
- package/src/runtime/routes/tool-call-confirmation-enrichment.test.ts +161 -0
- package/src/runtime/routes/tool-call-confirmation-enrichment.ts +107 -0
- package/src/runtime/routes/trust-rules-routes.ts +26 -2
- package/src/runtime/routes/tts-routes.ts +35 -0
- package/src/runtime/routes/types.ts +66 -8
- package/src/runtime/routes/usage-routes.ts +47 -39
- package/src/runtime/routes/webhook-routes.ts +41 -2
- package/src/runtime/routes/work-items-routes.ts +2 -4
- package/src/runtime/routes/workspace-routes.ts +4 -0
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +6 -0
- package/src/runtime/services/analyze-conversation.ts +2 -2
- package/src/runtime/services/conversation-serializer.ts +1 -1
- package/src/schedule/schedule-store.ts +20 -1
- package/src/schedule/schedule-usage-store.ts +83 -0
- package/src/schedule/scheduler.ts +12 -5
- package/src/signals/cancel.ts +2 -4
- package/src/skills/catalog-files.ts +2 -2
- package/src/skills/catalog-install.ts +3 -0
- package/src/skills/categories-cache.ts +118 -0
- package/src/skills/clawhub-files.ts +1 -2
- package/src/skills/skillssh-files.ts +1 -2
- package/src/subagent/manager.ts +17 -5
- package/src/telemetry/types.ts +29 -1
- package/src/telemetry/usage-telemetry-reporter.test.ts +112 -3
- package/src/telemetry/usage-telemetry-reporter.ts +57 -2
- package/src/tools/acp/context.ts +20 -0
- package/src/tools/acp/list-agents.test.ts +7 -1
- package/src/tools/acp/spawn.test.ts +158 -55
- package/src/tools/acp/spawn.ts +47 -72
- package/src/tools/acp/steer.test.ts +105 -8
- package/src/tools/acp/steer.ts +48 -17
- package/src/tools/apps/executors.ts +13 -8
- package/src/tools/executor.ts +1 -53
- package/src/tools/filesystem/write.ts +34 -0
- package/src/tools/network/__tests__/web-search-metadata.test.ts +7 -1
- package/src/tools/network/__tests__/web-search.test.ts +11 -3
- package/src/tools/network/web-search-error.test.ts +248 -0
- package/src/tools/network/web-search-error.ts +267 -0
- package/src/tools/network/web-search.ts +207 -48
- package/src/tools/schedule/create.ts +2 -0
- package/src/tools/subagent/spawn.ts +2 -4
- package/src/tools/terminal/safe-env.ts +10 -1
- package/src/tools/ui-surface/definitions.ts +34 -5
- package/src/tts/__tests__/provider-catalog-consistency.test.ts +85 -1
- package/src/tts/provider-catalog.ts +76 -1
- package/src/util/mutex.ts +47 -0
- package/src/workspace/git-service.ts +1 -42
- package/src/workspace/migrations/051-seed-conversation-summarization-callsite.ts +4 -5
- package/src/workspace/migrations/095-bump-heartbeat-interval-30m-to-60m.ts +51 -0
- package/src/workspace/migrations/096-reduce-quality-profile-effort.ts +72 -0
- package/src/workspace/migrations/097-enable-adaptive-thinking-managed-profiles.ts +117 -0
- package/src/workspace/migrations/registry.ts +6 -0
- package/docs/plugins.md +0 -836
- package/examples/plugins/echo/register.ts +0 -184
- package/src/__tests__/bootstrap-turn-cleanup.test.ts +0 -44
- 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__/empty-response-pipeline.test.ts +0 -423
- package/src/__tests__/llm-call-pipeline.test.ts +0 -287
- package/src/__tests__/memory-retrieval-pipeline.test.ts +0 -418
- package/src/__tests__/persistence-pipeline.test.ts +0 -503
- package/src/__tests__/pipeline-runner.test.ts +0 -564
- package/src/__tests__/title-generate-pipeline.test.ts +0 -211
- package/src/__tests__/token-estimate-pipeline.test.ts +0 -479
- package/src/__tests__/tool-error-pipeline.test.ts +0 -241
- package/src/__tests__/tool-execute-pipeline.test.ts +0 -417
- package/src/__tests__/tool-result-truncate-pipeline.test.ts +0 -341
- package/src/daemon/bootstrap-turn-cleanup.ts +0 -45
- package/src/gallery/default-gallery.ts +0 -1359
- package/src/gallery/gallery-manifest.ts +0 -28
- package/src/home/feature-gate.ts +0 -22
- package/src/memory/v3/provider-blocks.ts +0 -16
- 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/terminal.ts +0 -73
- package/src/plugins/defaults/empty-response/middlewares/emptyResponse.ts +0 -22
- package/src/plugins/defaults/empty-response/terminal.ts +0 -106
- package/src/plugins/defaults/injectors/package.json +0 -15
- package/src/plugins/defaults/llm-call/middlewares/llmCall.ts +0 -17
- package/src/plugins/defaults/llm-call/register.ts +0 -45
- package/src/plugins/defaults/memory-retrieval/middlewares/memoryRetrieval.ts +0 -17
- package/src/plugins/defaults/memory-retrieval/package.json +0 -15
- package/src/plugins/defaults/memory-retrieval/register.ts +0 -181
- 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/persistence/middlewares/persistence.ts +0 -19
- package/src/plugins/defaults/persistence/package.json +0 -15
- package/src/plugins/defaults/persistence/register.ts +0 -38
- package/src/plugins/defaults/persistence/terminal.ts +0 -83
- package/src/plugins/defaults/title-generate/terminal.ts +0 -31
- package/src/plugins/defaults/token-estimate/middlewares/tokenEstimate.ts +0 -23
- package/src/plugins/defaults/token-estimate/package.json +0 -15
- package/src/plugins/defaults/token-estimate/register.ts +0 -34
- package/src/plugins/defaults/token-estimate/terminal.ts +0 -40
- package/src/plugins/defaults/tool-error/middlewares/toolError.ts +0 -21
- package/src/plugins/defaults/tool-error/terminal.ts +0 -47
- package/src/plugins/defaults/tool-execute/middlewares/toolExecute.ts +0 -23
- package/src/plugins/defaults/tool-execute/package.json +0 -15
- package/src/plugins/defaults/tool-execute/register.ts +0 -49
- package/src/plugins/defaults/tool-result-truncate/middlewares/toolResultTruncate.ts +0 -23
- package/src/plugins/defaults/tool-result-truncate/types.ts +0 -22
- package/src/skills/category-inference.ts +0 -111
- /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__/needle.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__/types.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}/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,181 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Default `memoryRetrieval` plugin.
|
|
3
|
-
*
|
|
4
|
-
* Encapsulates the three retrievals the agent loop performs before building
|
|
5
|
-
* the runtime-injection block for a turn:
|
|
6
|
-
*
|
|
7
|
-
* 1. **PKB context** via {@link readPkbContext} — always-loaded workspace
|
|
8
|
-
* notes (INDEX.md, essentials.md, …) that precede the user's message.
|
|
9
|
-
* 2. **NOW.md scratchpad** via {@link readNowScratchpad} — the short
|
|
10
|
-
* user-maintained note the assistant keeps up to date.
|
|
11
|
-
* 3. **Memory graph** via {@link ConversationGraphMemory.prepareMemory} —
|
|
12
|
-
* dispatches to context-load or per-turn retrieval depending on
|
|
13
|
-
* initialization state; gated on the actor being trusted (guardian).
|
|
14
|
-
*
|
|
15
|
-
* The default plugin registers a pass-through middleware so the pipeline
|
|
16
|
-
* runner always has at least one entry and downstream telemetry observes a
|
|
17
|
-
* deterministic chain. The actual retrieval runs in the terminal supplied
|
|
18
|
-
* by the agent loop; centralizing the helper here (as
|
|
19
|
-
* {@link runDefaultMemoryRetrieval}) makes it trivial for a plugin to
|
|
20
|
-
* fall back to the default behavior by calling this helper from its own
|
|
21
|
-
* middleware.
|
|
22
|
-
*
|
|
23
|
-
* See `.private/plans/agent-plugin-system.md` PR 20 for the containing
|
|
24
|
-
* milestone.
|
|
25
|
-
*/
|
|
26
|
-
|
|
27
|
-
import type { AssistantConfig } from "../../../config/schema.js";
|
|
28
|
-
import {
|
|
29
|
-
readNowScratchpad,
|
|
30
|
-
readPkbContext,
|
|
31
|
-
} from "../../../daemon/conversation-runtime-assembly.js";
|
|
32
|
-
import type { ServerMessage } from "../../../daemon/message-protocol.js";
|
|
33
|
-
import type { ConversationGraphMemory } from "../../../memory/graph/conversation-graph-memory.js";
|
|
34
|
-
import type { Message } from "../../../providers/types.js";
|
|
35
|
-
import {
|
|
36
|
-
type MemoryArgs,
|
|
37
|
-
type MemoryResult,
|
|
38
|
-
type Plugin,
|
|
39
|
-
} from "../../types.js";
|
|
40
|
-
import defaultMemoryRetrievalMiddleware from "./middlewares/memoryRetrieval.js";
|
|
41
|
-
import pkg from "./package.json" with { type: "json" };
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Discriminator the agent loop uses to narrow `MemoryResult.memoryGraphBlocks`
|
|
45
|
-
* back into the full {@link GraphMemoryPayload} shape. Plugins that substitute
|
|
46
|
-
* their own memory blocks without setting this marker will fall through the
|
|
47
|
-
* agent loop's graph-result consumption path — which is the intended escape
|
|
48
|
-
* hatch for custom retrievers.
|
|
49
|
-
*/
|
|
50
|
-
export const DEFAULT_MEMORY_GRAPH_KIND = "default.graph" as const;
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Shape of the single block the default memory-graph retriever emits.
|
|
54
|
-
*
|
|
55
|
-
* Mirrors the object returned by
|
|
56
|
-
* {@link ConversationGraphMemory.prepareMemory} — the agent loop consumes
|
|
57
|
-
* every field downstream (PKB query vectors, metrics persistence, memory
|
|
58
|
-
* event emission). Kept as a concrete type here so both the terminal and the
|
|
59
|
-
* agent loop can share one import.
|
|
60
|
-
*/
|
|
61
|
-
export interface GraphMemoryPayload {
|
|
62
|
-
readonly kind: typeof DEFAULT_MEMORY_GRAPH_KIND;
|
|
63
|
-
readonly result: Awaited<
|
|
64
|
-
ReturnType<ConversationGraphMemory["prepareMemory"]>
|
|
65
|
-
>;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* External state the default retriever needs but the pipeline args cannot
|
|
70
|
-
* carry (conversation-scoped graph handle, event sink, live message list).
|
|
71
|
-
* Passed as a second argument to {@link runDefaultMemoryRetrieval} rather
|
|
72
|
-
* than threaded through {@link MemoryArgs} to keep the plugin-facing
|
|
73
|
-
* pipeline surface minimal.
|
|
74
|
-
*/
|
|
75
|
-
export interface DefaultMemoryRetrievalDeps {
|
|
76
|
-
/** Live message list for this turn (pre-injection). */
|
|
77
|
-
readonly messages: Message[];
|
|
78
|
-
/** Per-conversation memory graph handle. */
|
|
79
|
-
readonly graphMemory: ConversationGraphMemory;
|
|
80
|
-
/** Assistant config snapshot. */
|
|
81
|
-
readonly config: AssistantConfig;
|
|
82
|
-
/** Event sink used by the graph retriever (memory_status events). */
|
|
83
|
-
readonly onEvent: (msg: ServerMessage) => void;
|
|
84
|
-
/** True when the actor for this turn is trusted (guardian-class). */
|
|
85
|
-
readonly isTrustedActor: boolean;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Run the default retrieval. Always returns a {@link MemoryResult}; skips
|
|
90
|
-
* the memory-graph call entirely when the actor is not trusted (matches the
|
|
91
|
-
* prior agent-loop gate).
|
|
92
|
-
*
|
|
93
|
-
* The returned `memoryGraphBlocks` is either empty (when the actor is not
|
|
94
|
-
* trusted) or a single {@link GraphMemoryPayload} wrapping the graph
|
|
95
|
-
* retriever's full output. The agent loop narrows via
|
|
96
|
-
* {@link DEFAULT_MEMORY_GRAPH_KIND} to consume it.
|
|
97
|
-
*
|
|
98
|
-
* Memory retrieval blocks the turn — there is no soft timeout here. Memory
|
|
99
|
-
* is critical context, and silently dropping it produces a worse outcome
|
|
100
|
-
* than a slower turn. Cancellation still works via `args.signal`, which is
|
|
101
|
-
* threaded into `prepareMemory`.
|
|
102
|
-
*/
|
|
103
|
-
export async function runDefaultMemoryRetrieval(
|
|
104
|
-
args: MemoryArgs,
|
|
105
|
-
deps: DefaultMemoryRetrievalDeps,
|
|
106
|
-
): Promise<MemoryResult> {
|
|
107
|
-
// NOW.md and PKB are read unconditionally — the agent loop decides
|
|
108
|
-
// whether to inject them based on first-turn / post-compaction gating.
|
|
109
|
-
const pkbContent = readPkbContext();
|
|
110
|
-
const nowContent = readNowScratchpad();
|
|
111
|
-
|
|
112
|
-
if (!deps.isTrustedActor) {
|
|
113
|
-
// Untrusted actors skip memory-graph retrieval entirely — preserves the
|
|
114
|
-
// pre-plugin gate that lived inline in `conversation-agent-loop.ts`.
|
|
115
|
-
return {
|
|
116
|
-
pkbContent,
|
|
117
|
-
nowContent,
|
|
118
|
-
memoryGraphBlocks: [],
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
const graphResult = await deps.graphMemory.prepareMemory(
|
|
123
|
-
deps.messages,
|
|
124
|
-
deps.config,
|
|
125
|
-
args.signal,
|
|
126
|
-
deps.onEvent,
|
|
127
|
-
);
|
|
128
|
-
|
|
129
|
-
const payload: GraphMemoryPayload = {
|
|
130
|
-
kind: DEFAULT_MEMORY_GRAPH_KIND,
|
|
131
|
-
result: graphResult,
|
|
132
|
-
};
|
|
133
|
-
|
|
134
|
-
return {
|
|
135
|
-
pkbContent,
|
|
136
|
-
nowContent,
|
|
137
|
-
memoryGraphBlocks: [payload],
|
|
138
|
-
};
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* Narrow a {@link MemoryResult} memory-graph block back into the full
|
|
143
|
-
* {@link GraphMemoryPayload} the default retriever emits. Returns `null` when
|
|
144
|
-
* the pipeline output came from a custom retriever (no blocks, or a block
|
|
145
|
-
* without the {@link DEFAULT_MEMORY_GRAPH_KIND} discriminator).
|
|
146
|
-
*
|
|
147
|
-
* The agent loop uses this helper to decide whether to run its downstream
|
|
148
|
-
* graph-result consumption path (query-vector propagation, metric
|
|
149
|
-
* persistence, memory-event emission). Custom retrievers that skip that
|
|
150
|
-
* path are expected to handle their own side effects inside their
|
|
151
|
-
* middleware.
|
|
152
|
-
*/
|
|
153
|
-
export function asDefaultGraphPayload(
|
|
154
|
-
blocks: ReadonlyArray<unknown>,
|
|
155
|
-
): GraphMemoryPayload | null {
|
|
156
|
-
const first = blocks[0];
|
|
157
|
-
if (
|
|
158
|
-
first != null &&
|
|
159
|
-
typeof first === "object" &&
|
|
160
|
-
"kind" in first &&
|
|
161
|
-
(first as { kind?: unknown }).kind === DEFAULT_MEMORY_GRAPH_KIND
|
|
162
|
-
) {
|
|
163
|
-
return first as GraphMemoryPayload;
|
|
164
|
-
}
|
|
165
|
-
return null;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
/**
|
|
169
|
-
* Default plugin exposing the `memoryRetrieval` pipeline slot. Registered
|
|
170
|
-
* by {@link registerDefaultMemoryRetrievalPlugin} from the plugin
|
|
171
|
-
* bootstrap wiring so ordering is deterministic across boots.
|
|
172
|
-
*/
|
|
173
|
-
export const defaultMemoryRetrievalPlugin: Plugin = {
|
|
174
|
-
manifest: {
|
|
175
|
-
name: pkg.name,
|
|
176
|
-
version: pkg.version,
|
|
177
|
-
},
|
|
178
|
-
middleware: {
|
|
179
|
-
memoryRetrieval: defaultMemoryRetrievalMiddleware,
|
|
180
|
-
},
|
|
181
|
-
};
|
|
@@ -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,19 +0,0 @@
|
|
|
1
|
-
import type { Middleware, PersistArgs, PersistResult } from "../../../types.js";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Passthrough middleware for the `persistence` pipeline. Forwards to
|
|
5
|
-
* `next(args)` unchanged; the actual dispatch lives in the terminal handler
|
|
6
|
-
* (`../terminal.ts`), wired in at the `runPipeline` call sites in
|
|
7
|
-
* `daemon/conversation-agent-loop.ts` and
|
|
8
|
-
* `daemon/conversation-agent-loop-handlers.ts`.
|
|
9
|
-
*
|
|
10
|
-
* Defaults register at the OUTERMOST onion position, so deciding here without
|
|
11
|
-
* calling `next` would shadow every later-registered plugin. Routing through
|
|
12
|
-
* `next(args)` lets user middleware participate normally.
|
|
13
|
-
*/
|
|
14
|
-
const passthrough: Middleware<PersistArgs, PersistResult> = async (
|
|
15
|
-
args,
|
|
16
|
-
next,
|
|
17
|
-
) => next(args);
|
|
18
|
-
|
|
19
|
-
export default passthrough;
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "default-persistence",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"description": "First-party default plugin wrapping the assistant's built-in persistence 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,38 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Default `persistence` plugin.
|
|
3
|
-
*
|
|
4
|
-
* The plugin's middleware is a passthrough — it calls `next(args)` and returns
|
|
5
|
-
* the result unchanged. The actual dispatch lives in the terminal handler in
|
|
6
|
-
* `./terminal.ts`, which is wired in as the pipeline's `terminal` argument by
|
|
7
|
-
* `runPipeline` call sites in `daemon/conversation-agent-loop.ts` and
|
|
8
|
-
* `daemon/conversation-agent-loop-handlers.ts`. This separation matters: the
|
|
9
|
-
* default plugin is registered before any user plugin (defaults load first in
|
|
10
|
-
* `bootstrapPlugins()`), which puts it at the OUTERMOST position of the onion
|
|
11
|
-
* chain. If the default middleware were to invoke the terminal directly
|
|
12
|
-
* without calling `next`, it would shadow every later-registered plugin.
|
|
13
|
-
* Routing through `next(args)` lets user middleware participate normally.
|
|
14
|
-
*
|
|
15
|
-
* Manifest declares `provides.persistence: "v1"` so other plugins can
|
|
16
|
-
* negotiate against the pipeline surface and `requires.pluginRuntime: "v1"`
|
|
17
|
-
* to satisfy the registry's mandatory capability check.
|
|
18
|
-
*
|
|
19
|
-
* Registered from `daemon/external-plugins-bootstrap.ts` via a side-effect
|
|
20
|
-
* import so the plugin is present in the registry before
|
|
21
|
-
* {@link bootstrapPlugins} walks it.
|
|
22
|
-
*
|
|
23
|
-
* Design doc: `.private/plans/agent-plugin-system.md` (PR 27).
|
|
24
|
-
*/
|
|
25
|
-
|
|
26
|
-
import { type Plugin } from "../../types.js";
|
|
27
|
-
import persistence from "./middlewares/persistence.js";
|
|
28
|
-
import pkg from "./package.json" with { type: "json" };
|
|
29
|
-
|
|
30
|
-
export const defaultPersistencePlugin: Plugin = {
|
|
31
|
-
manifest: {
|
|
32
|
-
name: pkg.name,
|
|
33
|
-
version: pkg.version,
|
|
34
|
-
},
|
|
35
|
-
middleware: {
|
|
36
|
-
persistence,
|
|
37
|
-
},
|
|
38
|
-
};
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Default `persistence` behavior: writes conversation messages to the database
|
|
3
|
-
* (and optionally the JSONL disk view).
|
|
4
|
-
*
|
|
5
|
-
* This module is side-effect free: importing it does not register any plugin.
|
|
6
|
-
*
|
|
7
|
-
* The handler dispatches on the discriminated {@link PersistArgs.op} field:
|
|
8
|
-
*
|
|
9
|
-
* - `add` → {@link addMessage}, optionally followed by
|
|
10
|
-
* {@link syncMessageToDisk} when `args.syncToDisk` is true.
|
|
11
|
-
* - `reserve` → {@link reserveMessage} — pre-allocates an empty row
|
|
12
|
-
* for assistant anchor stamping.
|
|
13
|
-
* - `updateContent` → {@link updateMessageContent} — overwrites an existing
|
|
14
|
-
* row's content (returns `void`, wrapped as
|
|
15
|
-
* `{ op: "updateContent" }`).
|
|
16
|
-
* - `update` → {@link updateMessageMetadata} (returns `void`, wrapped
|
|
17
|
-
* as `{ op: "update" }`).
|
|
18
|
-
* - `delete` → {@link deleteMessageById} (returns the segment/summary
|
|
19
|
-
* IDs the caller must clean up out-of-band).
|
|
20
|
-
*/
|
|
21
|
-
|
|
22
|
-
import {
|
|
23
|
-
addMessage,
|
|
24
|
-
deleteMessageById,
|
|
25
|
-
reserveMessage,
|
|
26
|
-
updateMessageContent,
|
|
27
|
-
updateMessageMetadata,
|
|
28
|
-
} from "../../../memory/conversation-crud.js";
|
|
29
|
-
import { syncMessageToDisk } from "../../../memory/conversation-disk-view.js";
|
|
30
|
-
import type { PersistArgs, PersistResult } from "../../types.js";
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Persist a message according to `args.op`. Exported so the agent-loop call
|
|
34
|
-
* sites can invoke it directly and tests can verify each op in isolation.
|
|
35
|
-
*/
|
|
36
|
-
export async function defaultPersistenceTerminal(
|
|
37
|
-
args: PersistArgs,
|
|
38
|
-
): Promise<PersistResult> {
|
|
39
|
-
switch (args.op) {
|
|
40
|
-
case "add": {
|
|
41
|
-
const message = await addMessage(
|
|
42
|
-
args.conversationId,
|
|
43
|
-
args.role,
|
|
44
|
-
args.content,
|
|
45
|
-
{
|
|
46
|
-
metadata: args.metadata,
|
|
47
|
-
...args.addOptions,
|
|
48
|
-
},
|
|
49
|
-
);
|
|
50
|
-
// Sync the just-persisted row to the JSONL disk view when the caller
|
|
51
|
-
// opted in. The handler that emits tool-result rows sets
|
|
52
|
-
// `syncToDisk: true` so the disk view stays in lockstep with the DB.
|
|
53
|
-
if (args.syncToDisk && args.createdAtMs !== undefined) {
|
|
54
|
-
syncMessageToDisk(args.conversationId, message.id, args.createdAtMs);
|
|
55
|
-
}
|
|
56
|
-
return { op: "add", message };
|
|
57
|
-
}
|
|
58
|
-
case "reserve": {
|
|
59
|
-
const message = await reserveMessage(
|
|
60
|
-
args.conversationId,
|
|
61
|
-
args.role,
|
|
62
|
-
args.metadata,
|
|
63
|
-
);
|
|
64
|
-
return { op: "reserve", message };
|
|
65
|
-
}
|
|
66
|
-
case "updateContent": {
|
|
67
|
-
updateMessageContent(args.messageId, args.content);
|
|
68
|
-
return { op: "updateContent" };
|
|
69
|
-
}
|
|
70
|
-
case "update": {
|
|
71
|
-
updateMessageMetadata(args.messageId, args.updates);
|
|
72
|
-
return { op: "update" };
|
|
73
|
-
}
|
|
74
|
-
case "delete": {
|
|
75
|
-
const deleted = deleteMessageById(args.messageId);
|
|
76
|
-
return {
|
|
77
|
-
op: "delete",
|
|
78
|
-
segmentIds: deleted.segmentIds,
|
|
79
|
-
deletedSummaryIds: deleted.deletedSummaryIds,
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Default `titleGenerate` behavior: kicks off conversation-title generation.
|
|
3
|
-
*
|
|
4
|
-
* This module is side-effect free: importing it does not register any plugin.
|
|
5
|
-
*
|
|
6
|
-
* Delegates to {@link queueGenerateConversationTitle}, which schedules title
|
|
7
|
-
* generation as fire-and-forget background work and falls back to a
|
|
8
|
-
* deterministic placeholder on failure.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { queueGenerateConversationTitle } from "../../../memory/conversation-title-service.js";
|
|
12
|
-
import type { TitleArgs, TitleResult } from "../../types.js";
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Invoke the title-generation service with the provided arguments. Exported
|
|
16
|
-
* for tests that want to exercise the default directly.
|
|
17
|
-
*
|
|
18
|
-
* Returns an empty result — the service is fire-and-forget and surfaces its
|
|
19
|
-
* output through `onTitleUpdated`.
|
|
20
|
-
*/
|
|
21
|
-
export async function defaultTitleGenerateTerminal(
|
|
22
|
-
args: TitleArgs,
|
|
23
|
-
): Promise<TitleResult> {
|
|
24
|
-
queueGenerateConversationTitle({
|
|
25
|
-
conversationId: args.conversationId,
|
|
26
|
-
provider: args.provider,
|
|
27
|
-
userMessage: args.userMessage,
|
|
28
|
-
onTitleUpdated: args.onTitleUpdated,
|
|
29
|
-
});
|
|
30
|
-
return {};
|
|
31
|
-
}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
EstimateArgs,
|
|
3
|
-
EstimateResult,
|
|
4
|
-
Middleware,
|
|
5
|
-
} from "../../../types.js";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Passthrough middleware for the `tokenEstimate` pipeline. Forwards to
|
|
9
|
-
* `next(args)` unchanged; the actual estimate lives in the terminal handler
|
|
10
|
-
* (`../terminal.ts`), wired in at the `runPipeline` call sites in
|
|
11
|
-
* `daemon/conversation-agent-loop.ts`.
|
|
12
|
-
*
|
|
13
|
-
* Defaults register at the OUTERMOST onion position, so deciding here without
|
|
14
|
-
* calling `next` would shadow every later-registered plugin. The passthrough
|
|
15
|
-
* lets user middleware that wraps the default (e.g. a doubler, a
|
|
16
|
-
* provider-native `countTokens` override) participate normally.
|
|
17
|
-
*/
|
|
18
|
-
const passthrough: Middleware<EstimateArgs, EstimateResult> = async (
|
|
19
|
-
args,
|
|
20
|
-
next,
|
|
21
|
-
) => next(args);
|
|
22
|
-
|
|
23
|
-
export default passthrough;
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "default-token-estimate",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"description": "First-party default plugin wrapping the assistant's built-in token-estimate 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,34 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Default `tokenEstimate` plugin.
|
|
3
|
-
*
|
|
4
|
-
* The plugin's middleware is a passthrough — it calls `next(args)` and returns
|
|
5
|
-
* the result unchanged. The actual estimate lives in the terminal handler in
|
|
6
|
-
* `./terminal.ts`, which is wired in as the pipeline's `terminal` argument by
|
|
7
|
-
* `runPipeline` call sites in `daemon/conversation-agent-loop.ts`. This
|
|
8
|
-
* separation matters: the default plugin is registered before any user plugin
|
|
9
|
-
* (defaults load first in `bootstrapPlugins()`), which puts it at the
|
|
10
|
-
* OUTERMOST position of the onion chain. If the default middleware were to
|
|
11
|
-
* invoke the terminal directly without calling `next`, it would shadow every
|
|
12
|
-
* later-registered plugin. The passthrough lets user middleware that wraps the
|
|
13
|
-
* default (e.g. a doubler, a provider-native `countTokens` override)
|
|
14
|
-
* participate normally.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import { type Plugin } from "../../types.js";
|
|
18
|
-
import tokenEstimate from "./middlewares/tokenEstimate.js";
|
|
19
|
-
import pkg from "./package.json" with { type: "json" };
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Default `tokenEstimate` plugin. Registered by
|
|
23
|
-
* {@link bootstrapPlugins} on daemon startup so the pipeline always has a
|
|
24
|
-
* terminal handler even when no other plugin contributes one.
|
|
25
|
-
*/
|
|
26
|
-
export const defaultTokenEstimatePlugin: Plugin = {
|
|
27
|
-
manifest: {
|
|
28
|
-
name: pkg.name,
|
|
29
|
-
version: pkg.version,
|
|
30
|
-
},
|
|
31
|
-
middleware: {
|
|
32
|
-
tokenEstimate,
|
|
33
|
-
},
|
|
34
|
-
};
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Default `tokenEstimate` behavior: estimates the prompt token count used by
|
|
3
|
-
* the overflow gate.
|
|
4
|
-
*
|
|
5
|
-
* This module is side-effect free: importing it does not register any plugin.
|
|
6
|
-
*
|
|
7
|
-
* Delegates to
|
|
8
|
-
* {@link estimatePromptTokens}, which applies the EWMA calibration correction
|
|
9
|
-
* recorded from past provider responses. Preflight + mid-loop checks must use
|
|
10
|
-
* the calibrated estimate — the calibrated value keeps the overflow gate
|
|
11
|
-
* consistent with the convergence path in the reducer. The pre-send
|
|
12
|
-
* calibration capture in `agent/loop.ts` still uses `estimatePromptTokensRaw`
|
|
13
|
-
* on purpose — the calibrator must learn against the raw estimate so the EWMA
|
|
14
|
-
* converges against provider ground truth rather than chasing its own
|
|
15
|
-
* corrected output. This path produces the user-facing estimate; calibration
|
|
16
|
-
* capture stays separate.
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
import {
|
|
20
|
-
estimatePromptTokens,
|
|
21
|
-
estimateToolsTokens,
|
|
22
|
-
} from "../../../context/token-estimator.js";
|
|
23
|
-
import type { EstimateArgs, EstimateResult } from "../../types.js";
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Compute the tool token budget from `args.tools` and delegate to
|
|
27
|
-
* {@link estimatePromptTokens} with the canonical provider key, applying the
|
|
28
|
-
* EWMA calibration correction. Exported so the agent loop can call it directly
|
|
29
|
-
* and tests can verify the default behavior.
|
|
30
|
-
*/
|
|
31
|
-
export const defaultTokenEstimateTerminal = async (
|
|
32
|
-
args: EstimateArgs,
|
|
33
|
-
): Promise<EstimateResult> => {
|
|
34
|
-
const toolTokenBudget =
|
|
35
|
-
args.tools.length > 0 ? estimateToolsTokens(args.tools) : 0;
|
|
36
|
-
return estimatePromptTokens(args.history, args.systemPrompt, {
|
|
37
|
-
providerName: args.providerName,
|
|
38
|
-
toolTokenBudget,
|
|
39
|
-
});
|
|
40
|
-
};
|