@vellumai/assistant 0.8.7 → 0.8.8
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/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/docs/plugins.md +75 -79
- package/examples/plugins/echo/README.md +6 -12
- package/examples/plugins/echo/register.ts +0 -41
- package/node_modules/@vellumai/skill-host-contracts/src/server-message.ts +3 -3
- package/openapi.yaml +3381 -348
- package/package.json +1 -1
- package/scripts/generate-openapi.ts +68 -41
- package/src/__tests__/agent-loop-exit-reason.test.ts +34 -39
- 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__/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__/clawhub-files.test.ts +1 -1
- package/src/__tests__/compaction-pipeline.test.ts +1 -1
- 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 -2
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +10 -4
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +313 -1136
- package/src/__tests__/conversation-agent-loop.test.ts +596 -1616
- package/src/__tests__/conversation-analysis-routes.test.ts +6 -0
- 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 +26 -5
- 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 +170 -229
- package/src/__tests__/conversation-runtime-workspace.test.ts +3 -24
- package/src/__tests__/conversation-slash-commands.test.ts +8 -42
- package/src/__tests__/conversation-slash-queue.test.ts +6 -1
- 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-injection.test.ts +6 -1
- package/src/__tests__/cross-provider-web-search.test.ts +214 -1
- package/src/__tests__/db-schedule-syntax-migration.test.ts +5 -0
- package/src/__tests__/dm-persistence.test.ts +5 -1
- package/src/__tests__/empty-response-hook.test.ts +304 -0
- package/src/__tests__/feature-flag-test-helpers.ts +2 -2
- package/src/__tests__/gemini-image-service.test.ts +13 -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__/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 +2 -8
- package/src/__tests__/injector-chain.test.ts +106 -270
- package/src/__tests__/injector-disk-pressure.test.ts +3 -12
- package/src/__tests__/injector-document-comments.test.ts +2 -2
- 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-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__/persist-unsendable-image.test.ts +215 -0
- package/src/__tests__/persistence-secret-redaction.test.ts +1 -0
- package/src/__tests__/pipeline-runner.test.ts +29 -39
- package/src/__tests__/pkb-autoinject.test.ts +2 -5
- package/src/__tests__/plugin-bootstrap.test.ts +13 -28
- package/src/__tests__/plugin-registry.test.ts +0 -27
- package/src/__tests__/plugin-types.test.ts +2 -125
- package/src/__tests__/process-message-display-content.test.ts +6 -2
- 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__/server-history-render.test.ts +314 -1
- package/src/__tests__/skillssh-files.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 +2 -2
- package/src/__tests__/voice-session-bridge.test.ts +6 -3
- package/src/__tests__/web-search-backend-failure.test.ts +166 -0
- package/src/agent/loop.ts +346 -442
- 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 +368 -0
- package/src/avatar/__tests__/avatar-store.test.ts +34 -29
- package/src/cli/commands/__tests__/notifications.test.ts +58 -14
- package/src/cli/commands/notifications.ts +112 -60
- package/src/config/assistant-feature-flags.ts +22 -11
- package/src/config/bundled-skills/app-builder/SKILL.md +3 -20
- 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/document-editor/SKILL.md +1 -1
- package/src/config/bundled-skills/messaging/SKILL.md +0 -7
- package/src/config/feature-flag-cache.ts +3 -3
- package/src/config/feature-flag-registry.json +35 -3
- 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/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 +122 -0
- package/src/context/token-estimator.ts +23 -0
- package/src/context/tool-result-truncation.ts +0 -23
- package/src/context/window-manager.ts +3 -6
- 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 +605 -153
- package/src/daemon/conversation-agent-loop.ts +281 -760
- 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-runtime-assembly.ts +130 -347
- package/src/daemon/conversation-slash.ts +6 -25
- package/src/daemon/conversation-surfaces.ts +222 -4
- package/src/daemon/conversation-tool-setup.ts +2 -29
- package/src/daemon/conversation.ts +32 -14
- package/src/daemon/external-plugins-bootstrap.ts +9 -10
- 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/shared.ts +156 -84
- package/src/daemon/handlers/skills.ts +39 -10
- package/src/daemon/lifecycle.ts +4 -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/persist-unsendable-image.ts +117 -0
- package/src/daemon/process-message.ts +1 -3
- 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/home/home-greeting-cache.ts +24 -1
- package/src/ipc/gateway-client.test.ts +2 -2
- package/src/ipc/gateway-client.ts +3 -3
- 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-title-service.ts +65 -41
- package/src/memory/db-init.ts +4 -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/jobs-store.ts +33 -0
- package/src/memory/jobs-worker.ts +31 -4
- 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/index.ts +2 -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/infrastructure.ts +16 -0
- package/src/memory/usage-grouped-buckets.ts +6 -1
- package/src/memory/v2/__tests__/consolidation-job.test.ts +1 -1
- package/src/memory/v2/consolidation-job.ts +1 -1
- package/src/memory/v3/__tests__/health.test.ts +16 -0
- package/src/memory/v3/__tests__/orchestrate.test.ts +45 -9
- package/src/memory/v3/__tests__/provider-blocks.test.ts +13 -0
- package/src/memory/v3/__tests__/router.test.ts +101 -29
- package/src/memory/v3/__tests__/selector.test.ts +93 -27
- package/src/memory/v3/__tests__/shadow-plugin.test.ts +23 -5
- package/src/memory/v3/health.ts +0 -0
- package/src/memory/v3/llm-retry.ts +32 -0
- package/src/memory/v3/orchestrate.ts +26 -14
- package/src/memory/v3/provider-blocks.ts +15 -5
- package/src/memory/v3/router.ts +48 -42
- package/src/memory/v3/selector.ts +57 -42
- package/src/memory/v3/shadow-plugin.ts +47 -15
- package/src/memory/v3/types.ts +8 -0
- 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 +8 -1
- package/src/plugin-api/types.ts +151 -1
- 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 +1 -15
- package/src/plugins/defaults/injectors/register.ts +243 -74
- package/src/plugins/defaults/memory-retrieval/hooks/post-compact.ts +91 -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/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/pipeline.ts +6 -18
- package/src/plugins/registry.ts +8 -25
- package/src/plugins/types.ts +43 -474
- package/src/proactive-artifact/aux-message-injector.ts +3 -3
- package/src/proactive-artifact/job.test.ts +7 -12
- package/src/prompts/__tests__/system-prompt.test.ts +36 -0
- package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +62 -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 +5 -1
- package/src/runtime/agent-wake.ts +2 -2
- package/src/runtime/assistant-event-hub.ts +36 -6
- package/src/runtime/{conversation-stream-state.ts → assistant-stream-state.ts} +132 -58
- package/src/runtime/http-router.ts +16 -21
- package/src/runtime/http-types.ts +16 -70
- package/src/runtime/pending-interactions.ts +1 -0
- package/src/runtime/routes/__tests__/consolidation-routes.test.ts +265 -2
- 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__/tts-routes.test.ts +6 -2
- package/src/runtime/routes/app-management-routes.ts +6 -117
- package/src/runtime/routes/app-routes.ts +13 -15
- package/src/runtime/routes/attachment-routes.ts +26 -15
- package/src/runtime/routes/avatar-routes.ts +26 -0
- package/src/runtime/routes/btw-routes.ts +29 -23
- package/src/runtime/routes/consolidation-routes.ts +120 -20
- package/src/runtime/routes/conversation-query-routes.ts +2 -0
- package/src/runtime/routes/conversation-routes.ts +358 -184
- 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/identity-intro-cache.ts +11 -34
- package/src/runtime/routes/identity-routes.ts +208 -17
- package/src/runtime/routes/image-generation-routes.ts +40 -2
- 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 +50 -28
- 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/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/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/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/schedule/schedule-store.ts +20 -1
- package/src/schedule/schedule-usage-store.ts +83 -0
- package/src/schedule/scheduler.ts +12 -5
- 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/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/executor.ts +1 -53
- 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/terminal/safe-env.ts +10 -1
- package/src/tools/ui-surface/definitions.ts +9 -1
- 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/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 +93 -0
- package/src/workspace/migrations/registry.ts +6 -0
- package/src/__tests__/bootstrap-turn-cleanup.test.ts +0 -44
- 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__/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/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/package.json +0 -15
- 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/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/Dockerfile
CHANGED
|
@@ -77,6 +77,7 @@ RUN apt-get update && apt-get install -y \
|
|
|
77
77
|
debootstrap \
|
|
78
78
|
debian-archive-keyring \
|
|
79
79
|
debconf \
|
|
80
|
+
e2fsprogs \
|
|
80
81
|
ffmpeg \
|
|
81
82
|
fonts-freefont-ttf \
|
|
82
83
|
g++ \
|
|
@@ -113,11 +114,13 @@ RUN apt-get update && apt-get install -y \
|
|
|
113
114
|
libxtst6 \
|
|
114
115
|
lsof \
|
|
115
116
|
make \
|
|
117
|
+
mount \
|
|
116
118
|
openssl \
|
|
117
119
|
procps \
|
|
118
120
|
python3 \
|
|
119
121
|
sqlite3 \
|
|
120
122
|
sudo \
|
|
123
|
+
util-linux \
|
|
121
124
|
unzip \
|
|
122
125
|
uuid-runtime \
|
|
123
126
|
vim \
|
|
@@ -180,7 +183,8 @@ RUN printf '%s\n' \
|
|
|
180
183
|
RUN printf '%s\n' \
|
|
181
184
|
'#!/usr/bin/env sh' \
|
|
182
185
|
'set -eu' \
|
|
183
|
-
'
|
|
186
|
+
'. /app/assistant/docker-kata-runtime-family.sh' \
|
|
187
|
+
'if ! vellum_is_kata_family_runtime; then' \
|
|
184
188
|
' exec /usr/bin/apt-get "$@"' \
|
|
185
189
|
'fi' \
|
|
186
190
|
'export DEBIAN_FRONTEND=noninteractive' \
|
|
@@ -195,7 +199,8 @@ RUN printf '%s\n' \
|
|
|
195
199
|
printf '%s\n' \
|
|
196
200
|
'#!/usr/bin/env sh' \
|
|
197
201
|
'set -eu' \
|
|
198
|
-
'
|
|
202
|
+
'. /app/assistant/docker-kata-runtime-family.sh' \
|
|
203
|
+
'if ! vellum_is_kata_family_runtime; then' \
|
|
199
204
|
' exec /usr/bin/apt "$@"' \
|
|
200
205
|
'fi' \
|
|
201
206
|
'export DEBIAN_FRONTEND=noninteractive' \
|
|
@@ -210,7 +215,8 @@ RUN printf '%s\n' \
|
|
|
210
215
|
printf '%s\n' \
|
|
211
216
|
'#!/usr/bin/env sh' \
|
|
212
217
|
'set -eu' \
|
|
213
|
-
'
|
|
218
|
+
'. /app/assistant/docker-kata-runtime-family.sh' \
|
|
219
|
+
'if ! vellum_is_kata_family_runtime; then' \
|
|
214
220
|
' exec /usr/bin/dpkg "$@"' \
|
|
215
221
|
'fi' \
|
|
216
222
|
'DATA_ROOT="${VELLUM_APT_DATA_ROOT:-/data/system}"' \
|
|
@@ -236,7 +242,17 @@ ENV IS_CONTAINERIZED=true
|
|
|
236
242
|
# and the generated meet-join manifest from the builder stage.
|
|
237
243
|
COPY --from=builder /app /app
|
|
238
244
|
|
|
239
|
-
|
|
245
|
+
COPY packages/block-volume-bootstrap/scripts/*.sh /usr/local/bin/
|
|
246
|
+
|
|
247
|
+
RUN chmod +x \
|
|
248
|
+
/app/assistant/docker-entrypoint.sh \
|
|
249
|
+
/app/assistant/docker-init-apt-root.sh \
|
|
250
|
+
/app/assistant/docker-kata-apt-env.sh \
|
|
251
|
+
/app/assistant/docker-kata-runtime-family.sh \
|
|
252
|
+
/usr/local/bin/vellum-block-volume-common.sh \
|
|
253
|
+
/usr/local/bin/vellum-block-volume-init.sh \
|
|
254
|
+
/usr/local/bin/vellum-block-volume-mount.sh \
|
|
255
|
+
/usr/local/bin/vellum-block-volume-resize.sh
|
|
240
256
|
|
|
241
257
|
# Run the daemon + http server
|
|
242
258
|
CMD ["/app/assistant/docker-entrypoint.sh"]
|
package/docker-entrypoint.sh
CHANGED
|
@@ -6,9 +6,11 @@ set -eu
|
|
|
6
6
|
chmod 1777 /tmp 2>/dev/null || true
|
|
7
7
|
|
|
8
8
|
KATA_APT_INIT_PID=""
|
|
9
|
-
|
|
9
|
+
. /app/assistant/docker-kata-runtime-family.sh
|
|
10
|
+
|
|
11
|
+
if vellum_is_kata_family_runtime && [ -x /app/assistant/docker-init-apt-root.sh ]; then
|
|
10
12
|
export VELLUM_APT_DATA_ROOT="${VELLUM_APT_DATA_ROOT:-/data/system}"
|
|
11
|
-
# Warm the chroot used by
|
|
13
|
+
# Warm the chroot used by Kata-family apt wrappers without blocking assistant readiness.
|
|
12
14
|
/app/assistant/docker-init-apt-root.sh &
|
|
13
15
|
KATA_APT_INIT_PID="$!"
|
|
14
16
|
fi
|
package/docker-init-apt-root.sh
CHANGED
|
@@ -10,7 +10,9 @@ LOCK_DIR="${DATA_ROOT}.rootfs-init.lock"
|
|
|
10
10
|
LOCK_PID="${LOCK_DIR}/pid"
|
|
11
11
|
HOST_PATH="/usr/sbin:/usr/bin:/sbin:/bin"
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
. /app/assistant/docker-kata-runtime-family.sh
|
|
14
|
+
|
|
15
|
+
if ! vellum_is_kata_family_runtime; then
|
|
14
16
|
exit 0
|
|
15
17
|
fi
|
|
16
18
|
|
package/docker-kata-apt-env.sh
CHANGED
|
@@ -244,7 +244,7 @@ graph TB
|
|
|
244
244
|
|
|
245
245
|
Normal context compaction (the "Context Window Management" subgraph above) runs proactively as the conversation approaches the token limit, using cooldown guards and a severity-pressure override to balance compaction frequency against cost. This is the primary defense against context overflow.
|
|
246
246
|
|
|
247
|
-
When compaction alone is insufficient — either because the conversation grew too fast between turns or because a single turn contains extremely large payloads — the overflow recovery pipeline takes over. The pipeline's first tier (forced compaction) reuses the same `maybeCompact()` summarization machinery but with emergency parameters: `force: true` bypasses cooldown guards
|
|
247
|
+
When compaction alone is insufficient — either because the conversation grew too fast between turns or because a single turn contains extremely large payloads — the overflow recovery pipeline takes over. The pipeline's first tier (forced compaction) reuses the same `maybeCompact()` summarization machinery but with emergency parameters: `force: true` bypasses cooldown guards and `minKeepRecentUserTurns: 0` allows summarizing even the most recent history. The reducer drives convergence toward a tighter budget by re-invoking each tier until the estimated tokens fall under its `targetTokens` ceiling. Subsequent tiers (tool-result truncation, media stubbing, injection downgrade) apply progressively more aggressive payload reduction without involving the summarizer.
|
|
248
248
|
|
|
249
249
|
If all four reducer tiers are exhausted, the overflow policy resolver determines whether to compress the latest user turn. All sessions — interactive and non-interactive alike — auto-compress the latest turn without prompting. The only explicit opt-out is setting `contextWindow.overflowRecovery.interactiveLatestTurnCompression` (or `nonInteractiveLatestTurnCompression`) to `"drop"`, which short-circuits to a graceful failure instead. Disabling overflow recovery entirely (`contextWindow.overflowRecovery.enabled: false`) also yields a graceful failure.
|
|
250
250
|
|
package/docs/plugins.md
CHANGED
|
@@ -27,6 +27,7 @@ wired surface.
|
|
|
27
27
|
- [Manifest](#manifest)
|
|
28
28
|
- [Registration](#registration)
|
|
29
29
|
- [Middleware patterns](#middleware-patterns)
|
|
30
|
+
- [Hooks](#hooks)
|
|
30
31
|
- [Pipeline reference](#pipeline-reference)
|
|
31
32
|
- [Timeouts](#timeouts)
|
|
32
33
|
- [Strict-fail semantics](#strict-fail-semantics)
|
|
@@ -49,14 +50,14 @@ wired surface.
|
|
|
49
50
|
|
|
50
51
|
## What a plugin can contribute today
|
|
51
52
|
|
|
52
|
-
| Surface
|
|
53
|
-
|
|
|
54
|
-
| Pipeline middleware
|
|
55
|
-
| Model-visible tools
|
|
56
|
-
| HTTP routes
|
|
57
|
-
| Skills
|
|
58
|
-
| System-prompt injectors
|
|
59
|
-
| Lifecycle
|
|
53
|
+
| Surface | Where | Discovery |
|
|
54
|
+
| -------------------------- | ------------------- | ------------------------------------------------- |
|
|
55
|
+
| Pipeline middleware | `plugin.middleware` | keyed by pipeline name in `PipelineMiddlewareMap` |
|
|
56
|
+
| Model-visible tools | `plugin.tools` | each `PluginToolRegistration` |
|
|
57
|
+
| HTTP routes | `plugin.routes` | each `PluginRouteRegistration` |
|
|
58
|
+
| Skills | `plugin.skills` | each `PluginSkillRegistration` |
|
|
59
|
+
| System-prompt injectors | `plugin.injectors` | each `Injector` |
|
|
60
|
+
| Lifecycle & per-turn hooks | `plugin.hooks` | keyed by hook name (`init`, `shutdown`, …) |
|
|
60
61
|
|
|
61
62
|
The modern schema wires only **hooks** and **tools**; the middleware
|
|
62
63
|
pipelines, routes, skills, and injectors above are the surfaces that still
|
|
@@ -85,9 +86,8 @@ The `Plugin` shape is declared in
|
|
|
85
86
|
```typescript
|
|
86
87
|
export interface Plugin {
|
|
87
88
|
manifest: PluginManifest;
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
tools?: PluginToolRegistration[];
|
|
89
|
+
hooks?: PluginHooks;
|
|
90
|
+
tools?: Tool[];
|
|
91
91
|
routes?: PluginRouteRegistration[];
|
|
92
92
|
skills?: PluginSkillRegistration[];
|
|
93
93
|
injectors?: Injector[];
|
|
@@ -96,8 +96,9 @@ export interface Plugin {
|
|
|
96
96
|
```
|
|
97
97
|
|
|
98
98
|
Every field except `manifest` is optional. A plugin that only contributes
|
|
99
|
-
|
|
100
|
-
skill can omit
|
|
99
|
+
a hook doesn't need tools or routes; a plugin that only contributes a
|
|
100
|
+
skill can omit everything else. Lifecycle and per-turn behavior live under
|
|
101
|
+
`hooks` (see [Hooks](#hooks)).
|
|
101
102
|
|
|
102
103
|
## Where plugins live
|
|
103
104
|
|
|
@@ -310,7 +311,7 @@ terminal runs at the innermost layer. See
|
|
|
310
311
|
[`assistant/src/plugins/pipeline.ts`](../src/plugins/pipeline.ts) for the
|
|
311
312
|
composition algorithm.
|
|
312
313
|
|
|
313
|
-
|
|
314
|
+
Five common patterns emerge from that signature:
|
|
314
315
|
|
|
315
316
|
### Observe-only
|
|
316
317
|
|
|
@@ -319,8 +320,8 @@ return the result unchanged. Wrap the call in `try`/`finally` so your
|
|
|
319
320
|
observer runs on both success and failure paths.
|
|
320
321
|
|
|
321
322
|
```typescript
|
|
322
|
-
const observer: Middleware<
|
|
323
|
-
async function
|
|
323
|
+
const observer: Middleware<MemoryArgs, MemoryResult> =
|
|
324
|
+
async function observeRetrieval(args, next, ctx) {
|
|
324
325
|
const start = performance.now();
|
|
325
326
|
let outcome: "success" | "error" = "success";
|
|
326
327
|
try {
|
|
@@ -330,27 +331,22 @@ const observer: Middleware<ToolExecuteArgs, ToolExecuteResult> =
|
|
|
330
331
|
throw err;
|
|
331
332
|
} finally {
|
|
332
333
|
const ms = Math.round(performance.now() - start);
|
|
333
|
-
console.error(
|
|
334
|
+
console.error(
|
|
335
|
+
JSON.stringify({ conversationId: args.conversationId, ms, outcome }),
|
|
336
|
+
);
|
|
334
337
|
}
|
|
335
338
|
};
|
|
336
339
|
```
|
|
337
340
|
|
|
338
341
|
### Transform input
|
|
339
342
|
|
|
340
|
-
Rewrite `args` before calling downstream. Useful for
|
|
341
|
-
(
|
|
343
|
+
Rewrite `args` before calling downstream. Useful for reshaping the inputs
|
|
344
|
+
(forcing an untrusted read, narrowing the turn the retriever sees).
|
|
342
345
|
|
|
343
346
|
```typescript
|
|
344
|
-
const
|
|
345
|
-
async function
|
|
346
|
-
|
|
347
|
-
...args,
|
|
348
|
-
options: {
|
|
349
|
-
...args.options,
|
|
350
|
-
config: { ...args.options?.config, requestId: ctx.requestId },
|
|
351
|
-
},
|
|
352
|
-
};
|
|
353
|
-
return next(tagged);
|
|
347
|
+
const untrustedRead: Middleware<MemoryArgs, MemoryResult> =
|
|
348
|
+
async function untrustedRead(args, next, ctx) {
|
|
349
|
+
return next({ ...args, trustContext: undefined });
|
|
354
350
|
};
|
|
355
351
|
```
|
|
356
352
|
|
|
@@ -359,14 +355,14 @@ const addHeader: Middleware<LLMCallArgs, LLMCallResult> =
|
|
|
359
355
|
Call `next(args)` first, then modify the result before returning.
|
|
360
356
|
|
|
361
357
|
```typescript
|
|
362
|
-
const
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
358
|
+
const dropNow: Middleware<MemoryArgs, MemoryResult> = async function dropNow(
|
|
359
|
+
args,
|
|
360
|
+
next,
|
|
361
|
+
ctx,
|
|
362
|
+
) {
|
|
363
|
+
const result = await next(args);
|
|
364
|
+
return { ...result, nowContent: null };
|
|
365
|
+
};
|
|
370
366
|
```
|
|
371
367
|
|
|
372
368
|
### Short-circuit
|
|
@@ -376,10 +372,11 @@ terminal and any inner middleware are skipped. Use this to stub, cache,
|
|
|
376
372
|
or mock a pipeline.
|
|
377
373
|
|
|
378
374
|
```typescript
|
|
379
|
-
const
|
|
380
|
-
async function
|
|
381
|
-
|
|
382
|
-
|
|
375
|
+
const skipUntrusted: Middleware<MemoryArgs, MemoryResult> =
|
|
376
|
+
async function skipUntrusted(args, next, ctx) {
|
|
377
|
+
if (!isTrusted(ctx.trust)) {
|
|
378
|
+
return { pkbContent: null, nowContent: null, graphResult: null };
|
|
379
|
+
}
|
|
383
380
|
return next(args);
|
|
384
381
|
};
|
|
385
382
|
```
|
|
@@ -391,10 +388,10 @@ through any outer middleware unchanged — there is no internal
|
|
|
391
388
|
`try`/`catch` around user middleware.
|
|
392
389
|
|
|
393
390
|
```typescript
|
|
394
|
-
const
|
|
395
|
-
async function
|
|
396
|
-
if (!
|
|
397
|
-
throw new Error(`
|
|
391
|
+
const denyIfUntrusted: Middleware<CompactionArgs, CompactionResult> =
|
|
392
|
+
async function denyIfUntrusted(args, next, ctx) {
|
|
393
|
+
if (!isTrusted(ctx.trust)) {
|
|
394
|
+
throw new Error(`compaction denied by policy`);
|
|
398
395
|
}
|
|
399
396
|
return next(args);
|
|
400
397
|
};
|
|
@@ -407,30 +404,40 @@ pipeline runner pulls `Function.name` into its `chain` log field so
|
|
|
407
404
|
operators can see the registered chain at a glance:
|
|
408
405
|
|
|
409
406
|
```
|
|
410
|
-
plugin.pipeline pipeline=
|
|
407
|
+
plugin.pipeline pipeline=compaction chain=["observeCompaction","defaultCompaction"] durationMs=1840 outcome=success
|
|
411
408
|
```
|
|
412
409
|
|
|
410
|
+
## Hooks
|
|
411
|
+
|
|
412
|
+
Hooks are the **modern** lifecycle surface: a plugin contributes one
|
|
413
|
+
function per phase under `plugin.hooks`, keyed by hook name. The wired
|
|
414
|
+
hook names live in [`HOOKS`](../src/plugin-api/constants.ts); the context
|
|
415
|
+
shapes and a full authoring walkthrough live in the
|
|
416
|
+
[experimental plugin guide](../../experimental/plugins/README.md#hooks).
|
|
417
|
+
|
|
418
|
+
Every hook implements `PluginHookFn` — it receives a context and either
|
|
419
|
+
mutates it in place (returning `void`) or returns a replacement. Hooks
|
|
420
|
+
from multiple plugins chain in registration order, and defaults register
|
|
421
|
+
first.
|
|
422
|
+
|
|
423
|
+
| Hook | Fires | Context |
|
|
424
|
+
| -------------------- | ----------------------------------------------------------------- | ------------------------- |
|
|
425
|
+
| `init` | Once when the plugin is registered. | `PluginInitContext` |
|
|
426
|
+
| `shutdown` | Once when the plugin is torn down. | `PluginShutdownContext` |
|
|
427
|
+
| `user-prompt-submit` | Once per user turn, before the agent loop receives the messages. | `UserPromptSubmitContext` |
|
|
428
|
+
| `post-tool-use` | Once per tool result, before it joins the provider-bound history. | `PostToolUseContext` |
|
|
429
|
+
| `stop` | Once per run when the model yields a turn with no tool calls. | `StopContext` |
|
|
430
|
+
|
|
413
431
|
## Pipeline reference
|
|
414
432
|
|
|
415
433
|
Every pipeline slot and its purpose. Type details live in
|
|
416
434
|
[`types.ts`](../src/plugins/types.ts).
|
|
417
435
|
|
|
418
|
-
| Pipeline
|
|
419
|
-
|
|
|
420
|
-
| `
|
|
421
|
-
| `
|
|
422
|
-
| `
|
|
423
|
-
| `memoryRetrieval` | PKB, NOW.md, and memory-graph retrieval for a turn. Output is a merged `MemoryResult`. |
|
|
424
|
-
| `historyRepair` | The pre-run repair pass on the message history. Wraps `repairHistory`. |
|
|
425
|
-
| `tokenEstimate` | The token-count estimate used for budgeting. Wraps `estimatePromptTokensRaw`. |
|
|
426
|
-
| `compaction` | The conversation-compaction step. Wraps `ContextWindowManager.maybeCompact`. |
|
|
427
|
-
| `overflowReduce` | The reducer tier loop invoked when a turn blows the context budget. |
|
|
428
|
-
| `persistence` | Every message CRUD op (`add` / `update` / `delete`). Discriminated by `args.op`. |
|
|
429
|
-
| `titleGenerate` | Conversation title generation. Fire-and-forget by default. |
|
|
430
|
-
| `toolResultTruncate` | The per-tool-result truncation step that fits a tool's output into the context window. |
|
|
431
|
-
| `emptyResponse` | The decision about what to do when the model returns an empty turn (nudge / accept / error). |
|
|
432
|
-
| `toolError` | The decision about what to do when one or more tool calls errored on a turn. |
|
|
433
|
-
| `circuitBreaker` | The compaction circuit breaker. Tracks consecutive-failure state, decides whether to open the circuit. |
|
|
436
|
+
| Pipeline | Purpose |
|
|
437
|
+
| ---------------- | ------------------------------------------------------------------------------------------------------ |
|
|
438
|
+
| `compaction` | The conversation-compaction step. Wraps `ContextWindowManager.maybeCompact`. |
|
|
439
|
+
| `overflowReduce` | The reducer tier loop invoked when a turn blows the context budget. |
|
|
440
|
+
| `circuitBreaker` | The compaction circuit breaker. Tracks consecutive-failure state, decides whether to open the circuit. |
|
|
434
441
|
|
|
435
442
|
## Timeouts
|
|
436
443
|
|
|
@@ -441,22 +448,11 @@ duration. See
|
|
|
441
448
|
[`assistant/src/plugins/pipeline.ts`](../src/plugins/pipeline.ts) for the
|
|
442
449
|
current values.
|
|
443
450
|
|
|
444
|
-
| Pipeline
|
|
445
|
-
|
|
|
446
|
-
| `
|
|
447
|
-
| `
|
|
448
|
-
| `
|
|
449
|
-
| `memoryRetrieval` | 5000 ms | Memory reads may hit Qdrant and disk; 5 s leaves slack for cold caches without blocking the turn indefinitely. |
|
|
450
|
-
| `historyRepair` | 1000 ms | CPU-bound list walk — should finish in a few ms. |
|
|
451
|
-
| `tokenEstimate` | 1000 ms | Same — CPU-bound, should return instantly. |
|
|
452
|
-
| `compaction` | 30000 ms | Summarization involves a provider call; mirrors the pipeline-level budget for LLM-backed operations. |
|
|
453
|
-
| `overflowReduce` | 30000 ms | Iterative compaction; matches the `compaction` budget since each tier step may invoke it. |
|
|
454
|
-
| `persistence` | 10000 ms | SQLite writes, Qdrant deletes, and disk syncs. 10 s is generous for the slowest op (batched segment inserts). |
|
|
455
|
-
| `titleGenerate` | 30000 ms | Provider-backed. Fire-and-forget, but the budget exists so a stuck call doesn't leak forever. |
|
|
456
|
-
| `toolResultTruncate` | 1000 ms | Pure string op. |
|
|
457
|
-
| `emptyResponse` | 500 ms | Decision logic only — must be near-instant. |
|
|
458
|
-
| `toolError` | 500 ms | Decision logic only — must be near-instant. |
|
|
459
|
-
| `circuitBreaker` | 500 ms | Numeric state update — must be near-instant. |
|
|
451
|
+
| Pipeline | Timeout | Rationale |
|
|
452
|
+
| ---------------- | -------- | ---------------------------------------------------------------------------------------------------- |
|
|
453
|
+
| `compaction` | 30000 ms | Summarization involves a provider call; mirrors the pipeline-level budget for LLM-backed operations. |
|
|
454
|
+
| `overflowReduce` | 30000 ms | Iterative compaction; matches the `compaction` budget since each tier step may invoke it. |
|
|
455
|
+
| `circuitBreaker` | 500 ms | Numeric state update — must be near-instant. |
|
|
460
456
|
|
|
461
457
|
`null` timeouts skip the timer entirely. Finite timeouts arm a
|
|
462
458
|
`setTimeout` that races the pipeline via `Promise.race`.
|
|
@@ -793,7 +789,7 @@ Every pipeline invocation emits one structured line tagged
|
|
|
793
789
|
|
|
794
790
|
| Field | Meaning |
|
|
795
791
|
| ------------------------------------------ | ----------------------------------------------------------------------- |
|
|
796
|
-
| `pipeline` | Pipeline name (`
|
|
792
|
+
| `pipeline` | Pipeline name (`compaction`, `overflowReduce`, …). |
|
|
797
793
|
| `chain` | Ordered list of middleware function names, outermost first. |
|
|
798
794
|
| `durationMs` | Total time spent in the composed chain. |
|
|
799
795
|
| `outcome` | `"success"`, `"error"`, or `"timeout"`. |
|
|
@@ -4,8 +4,8 @@ Minimal example plugin. Observes every assistant pipeline and logs one JSON
|
|
|
4
4
|
line per invocation to `stderr`:
|
|
5
5
|
|
|
6
6
|
```json
|
|
7
|
-
{"plugin":"echo","pipeline":"
|
|
8
|
-
{"plugin":"echo","pipeline":"
|
|
7
|
+
{"plugin":"echo","pipeline":"compaction","durationMs":1590,"outcome":"success"}
|
|
8
|
+
{"plugin":"echo","pipeline":"overflowReduce","durationMs":42,"outcome":"success"}
|
|
9
9
|
```
|
|
10
10
|
|
|
11
11
|
Use this as a starting point for writing your own plugin, or as a quick way
|
|
@@ -18,10 +18,8 @@ For the full plugin authoring guide, see
|
|
|
18
18
|
## What it does
|
|
19
19
|
|
|
20
20
|
- Registers one observer middleware per slot in
|
|
21
|
-
`PipelineMiddlewareMap` — `
|
|
22
|
-
`
|
|
23
|
-
`overflowReduce`, `persistence`, `titleGenerate`, `toolResultTruncate`,
|
|
24
|
-
`emptyResponse`, `toolError`, and `circuitBreaker`.
|
|
21
|
+
`PipelineMiddlewareMap` — `compaction`, `overflowReduce`, and
|
|
22
|
+
`circuitBreaker`.
|
|
25
23
|
- Each middleware calls `next(args)` to pass the request through unchanged,
|
|
26
24
|
measures wall-clock duration, and emits one line to `stderr` whether the
|
|
27
25
|
downstream succeeded or threw.
|
|
@@ -96,12 +94,8 @@ tail -f ~/.vellum/daemon.log
|
|
|
96
94
|
You should see one line per pipeline invocation, similar to:
|
|
97
95
|
|
|
98
96
|
```json
|
|
99
|
-
{"plugin":"echo","pipeline":"
|
|
100
|
-
{"plugin":"echo","pipeline":"
|
|
101
|
-
{"plugin":"echo","pipeline":"memoryRetrieval","durationMs":64,"outcome":"success"}
|
|
102
|
-
{"plugin":"echo","pipeline":"historyRepair","durationMs":0,"outcome":"success"}
|
|
103
|
-
{"plugin":"echo","pipeline":"llmCall","durationMs":1520,"outcome":"success"}
|
|
104
|
-
{"plugin":"echo","pipeline":"turn","durationMs":1590,"outcome":"success"}
|
|
97
|
+
{"plugin":"echo","pipeline":"compaction","durationMs":1590,"outcome":"success"}
|
|
98
|
+
{"plugin":"echo","pipeline":"overflowReduce","durationMs":42,"outcome":"success"}
|
|
105
99
|
```
|
|
106
100
|
|
|
107
101
|
If a pipeline throws (for example, a tool that errors out), you'll see a
|
|
@@ -40,37 +40,15 @@
|
|
|
40
40
|
* user-plugin-loader contract (see `assistant/src/plugins/user-loader.ts`).
|
|
41
41
|
*/
|
|
42
42
|
|
|
43
|
-
import type {
|
|
44
|
-
ToolResultTruncateArgs,
|
|
45
|
-
ToolResultTruncateResult,
|
|
46
|
-
} from "../../../src/plugins/defaults/tool-result-truncate/types.js";
|
|
47
43
|
import type { VellumPluginRuntime } from "../../../src/plugins/external-api.js";
|
|
48
44
|
import type {
|
|
49
45
|
CircuitBreakerArgs,
|
|
50
46
|
CircuitBreakerResult,
|
|
51
47
|
CompactionArgs,
|
|
52
48
|
CompactionResult,
|
|
53
|
-
EmptyResponseArgs,
|
|
54
|
-
EmptyResponseResult,
|
|
55
|
-
LLMCallArgs,
|
|
56
|
-
LLMCallResult,
|
|
57
|
-
MemoryArgs,
|
|
58
|
-
MemoryResult,
|
|
59
49
|
OverflowReduceArgs,
|
|
60
50
|
OverflowReduceResult,
|
|
61
|
-
PersistArgs,
|
|
62
|
-
PersistResult,
|
|
63
51
|
Plugin,
|
|
64
|
-
TitleArgs,
|
|
65
|
-
TitleResult,
|
|
66
|
-
TokenEstimateArgs,
|
|
67
|
-
TokenEstimateResult,
|
|
68
|
-
ToolErrorArgs,
|
|
69
|
-
ToolErrorResult,
|
|
70
|
-
ToolExecuteArgs,
|
|
71
|
-
ToolExecuteResult,
|
|
72
|
-
TurnArgs,
|
|
73
|
-
TurnResult,
|
|
74
52
|
} from "../../../src/plugins/types.js";
|
|
75
53
|
|
|
76
54
|
const runtime = (globalThis as { __vellumPluginRuntime?: VellumPluginRuntime })
|
|
@@ -150,29 +128,10 @@ const echoPlugin: Plugin = {
|
|
|
150
128
|
version: "0.1.0",
|
|
151
129
|
},
|
|
152
130
|
middleware: {
|
|
153
|
-
turn: makeObserver<TurnArgs, TurnResult>("turn"),
|
|
154
|
-
llmCall: makeObserver<LLMCallArgs, LLMCallResult>("llmCall"),
|
|
155
|
-
toolExecute: makeObserver<ToolExecuteArgs, ToolExecuteResult>(
|
|
156
|
-
"toolExecute",
|
|
157
|
-
),
|
|
158
|
-
memoryRetrieval: makeObserver<MemoryArgs, MemoryResult>("memoryRetrieval"),
|
|
159
|
-
tokenEstimate: makeObserver<TokenEstimateArgs, TokenEstimateResult>(
|
|
160
|
-
"tokenEstimate",
|
|
161
|
-
),
|
|
162
131
|
compaction: makeObserver<CompactionArgs, CompactionResult>("compaction"),
|
|
163
132
|
overflowReduce: makeObserver<OverflowReduceArgs, OverflowReduceResult>(
|
|
164
133
|
"overflowReduce",
|
|
165
134
|
),
|
|
166
|
-
persistence: makeObserver<PersistArgs, PersistResult>("persistence"),
|
|
167
|
-
titleGenerate: makeObserver<TitleArgs, TitleResult>("titleGenerate"),
|
|
168
|
-
toolResultTruncate: makeObserver<
|
|
169
|
-
ToolResultTruncateArgs,
|
|
170
|
-
ToolResultTruncateResult
|
|
171
|
-
>("toolResultTruncate"),
|
|
172
|
-
emptyResponse: makeObserver<EmptyResponseArgs, EmptyResponseResult>(
|
|
173
|
-
"emptyResponse",
|
|
174
|
-
),
|
|
175
|
-
toolError: makeObserver<ToolErrorArgs, ToolErrorResult>("toolError"),
|
|
176
135
|
circuitBreaker: makeObserver<CircuitBreakerArgs, CircuitBreakerResult>(
|
|
177
136
|
"circuitBreaker",
|
|
178
137
|
),
|
|
@@ -16,9 +16,9 @@
|
|
|
16
16
|
* Moving the fully typed discriminated union into this package would
|
|
17
17
|
* require relocating `assistant/src/daemon/message-types/` and its
|
|
18
18
|
* cross-file type dependencies (`channels/types.ts`,
|
|
19
|
-
* `skills/skillssh-registry.ts`, `runtime/guardian-decision-types.ts
|
|
20
|
-
*
|
|
21
|
-
*
|
|
19
|
+
* `skills/skillssh-registry.ts`, `runtime/guardian-decision-types.ts`).
|
|
20
|
+
* That is out of scope for PR 3 of the skill-isolation plan and is
|
|
21
|
+
* tracked for later iteration.
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
24
|
/**
|