@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
|
@@ -52,7 +52,6 @@ import { registerToolTraceListener } from "../events/tool-trace-listener.js";
|
|
|
52
52
|
import { resolveCanonicalGuardianRequest } from "../memory/canonical-guardian-store.js";
|
|
53
53
|
import {
|
|
54
54
|
getConversation,
|
|
55
|
-
getConversationOriginChannel,
|
|
56
55
|
getConversationOverrideProfileFromRow,
|
|
57
56
|
setConversationHistoryStrippedAt,
|
|
58
57
|
} from "../memory/conversation-crud.js";
|
|
@@ -68,6 +67,7 @@ import type { TrustClass } from "../runtime/actor-trust-resolver.js";
|
|
|
68
67
|
import { broadcastMessage } from "../runtime/assistant-event-hub.js";
|
|
69
68
|
import type { AuthContext } from "../runtime/auth/types.js";
|
|
70
69
|
import type { InteractiveUiResult } from "../runtime/interactive-ui.js";
|
|
70
|
+
import { publishSyncInvalidation } from "../runtime/sync/sync-publisher.js";
|
|
71
71
|
import { ToolExecutor } from "../tools/executor.js";
|
|
72
72
|
import { getAllToolDefinitions } from "../tools/registry.js";
|
|
73
73
|
import type { ToolLifecycleEvent } from "../tools/types.js";
|
|
@@ -127,9 +127,7 @@ import type { ToolSetupContext } from "./conversation-tool-setup.js";
|
|
|
127
127
|
import {
|
|
128
128
|
createResolveToolsCallback,
|
|
129
129
|
createToolExecutor,
|
|
130
|
-
resolveTrustClass,
|
|
131
130
|
} from "./conversation-tool-setup.js";
|
|
132
|
-
import { refreshWorkspaceTopLevelContextIfNeeded as refreshWorkspaceImpl } from "./conversation-workspace.js";
|
|
133
131
|
import { canonicalizeTimeZone } from "./date-context.js";
|
|
134
132
|
import { HostAppControlProxy } from "./host-app-control-proxy.js";
|
|
135
133
|
import { HostCuProxy } from "./host-cu-proxy.js";
|
|
@@ -143,6 +141,7 @@ import type {
|
|
|
143
141
|
import type { ConversationTransportMetadata } from "./message-types/conversations.js";
|
|
144
142
|
import { isHostProxyTransport } from "./message-types/conversations.js";
|
|
145
143
|
import type { ConfirmationStateChanged } from "./message-types/messages.js";
|
|
144
|
+
import { conversationMetadataSyncTag } from "./message-types/sync.js";
|
|
146
145
|
import { TraceEmitter } from "./trace-emitter.js";
|
|
147
146
|
|
|
148
147
|
const log = getLogger("conversation");
|
|
@@ -159,7 +158,7 @@ export type {
|
|
|
159
158
|
QueueDrainReason,
|
|
160
159
|
QueuePolicy,
|
|
161
160
|
} from "./conversation-queue-manager.js";
|
|
162
|
-
import type
|
|
161
|
+
import { resolveTrustClass, type TrustContext } from "./trust-context.js";
|
|
163
162
|
|
|
164
163
|
export interface ConversationConstructorOptions {
|
|
165
164
|
maxTokens?: number;
|
|
@@ -174,7 +173,7 @@ export class Conversation {
|
|
|
174
173
|
/** @internal */ provider: Provider;
|
|
175
174
|
/** @internal */ messages: Message[] = [];
|
|
176
175
|
/** @internal */ agentLoop: AgentLoop;
|
|
177
|
-
|
|
176
|
+
private _processing = false;
|
|
178
177
|
private stale = false;
|
|
179
178
|
/** @internal */ abortController: AbortController | null = null;
|
|
180
179
|
/** @internal */ prompter: PermissionPrompter;
|
|
@@ -733,7 +732,30 @@ export class Conversation {
|
|
|
733
732
|
}
|
|
734
733
|
|
|
735
734
|
isProcessing(): boolean {
|
|
736
|
-
return this.
|
|
735
|
+
return this._processing;
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
/**
|
|
739
|
+
* Mutate the server-authoritative `processing` flag. Web/Capacitor/CLI
|
|
740
|
+
* caches treat this flag as the source of truth for the avatar streaming
|
|
741
|
+
* ring and thinking indicator, so the `true → false` clear must announce
|
|
742
|
+
* itself: the daemon flips it in the agent-loop `finally` (after an awaited
|
|
743
|
+
* turn-boundary commit), which is later than the user-visible terminal SSE
|
|
744
|
+
* events, and a racing metadata refetch can otherwise re-read the
|
|
745
|
+
* not-yet-cleared `true` and clobber the client's optimistic `false`.
|
|
746
|
+
*
|
|
747
|
+
* Emitting a metadata invalidation on the clear lets every client GET the
|
|
748
|
+
* authoritative `false`, per the multi-client-sync contract in AGENTS.md
|
|
749
|
+
* ("emit the invalidation after the canonical state write succeeds").
|
|
750
|
+
*/
|
|
751
|
+
setProcessing(value: boolean): void {
|
|
752
|
+
const wasProcessing = this._processing;
|
|
753
|
+
this._processing = value;
|
|
754
|
+
if (wasProcessing && !value) {
|
|
755
|
+
void publishSyncInvalidation([
|
|
756
|
+
conversationMetadataSyncTag(this.conversationId),
|
|
757
|
+
]);
|
|
758
|
+
}
|
|
737
759
|
}
|
|
738
760
|
|
|
739
761
|
markStale(): void {
|
|
@@ -795,6 +817,7 @@ export class Conversation {
|
|
|
795
817
|
this.cesClient = undefined;
|
|
796
818
|
this.activeContextNodeIds = this.graphMemory.tracker.getActiveNodeIds();
|
|
797
819
|
this.graphMemory.persistState();
|
|
820
|
+
this.graphMemory.dispose();
|
|
798
821
|
disposeConversation(this);
|
|
799
822
|
}
|
|
800
823
|
|
|
@@ -836,7 +859,7 @@ export class Conversation {
|
|
|
836
859
|
}
|
|
837
860
|
|
|
838
861
|
canHandoffAtCheckpoint(): boolean {
|
|
839
|
-
return this.
|
|
862
|
+
return this._processing && this.hasQueuedMessages();
|
|
840
863
|
}
|
|
841
864
|
|
|
842
865
|
hasPendingConfirmation(requestId: string): boolean {
|
|
@@ -1020,9 +1043,7 @@ export class Conversation {
|
|
|
1020
1043
|
}
|
|
1021
1044
|
}
|
|
1022
1045
|
|
|
1023
|
-
async forceCompact(
|
|
1024
|
-
targetInputTokensOverride?: number;
|
|
1025
|
-
}): Promise<ContextWindowResult> {
|
|
1046
|
+
async forceCompact(): Promise<ContextWindowResult> {
|
|
1026
1047
|
const conversationRow = getConversation(this.conversationId);
|
|
1027
1048
|
const overrideProfile =
|
|
1028
1049
|
getConversationOverrideProfileFromRow(conversationRow) ?? null;
|
|
@@ -1066,11 +1087,7 @@ export class Conversation {
|
|
|
1066
1087
|
this.abortController?.signal ?? undefined,
|
|
1067
1088
|
{
|
|
1068
1089
|
force: true,
|
|
1069
|
-
lastCompactedAt: this.contextCompactedAt ?? undefined,
|
|
1070
|
-
conversationOriginChannel:
|
|
1071
|
-
getConversationOriginChannel(this.conversationId) ?? undefined,
|
|
1072
1090
|
overrideProfile,
|
|
1073
|
-
targetInputTokensOverride: options?.targetInputTokensOverride,
|
|
1074
1091
|
actorTrustClass: this.trustContext?.trustClass,
|
|
1075
1092
|
},
|
|
1076
1093
|
);
|
|
@@ -1081,7 +1098,6 @@ export class Conversation {
|
|
|
1081
1098
|
// etc.) — skip those so they don't silently reset the counter.
|
|
1082
1099
|
if (result.summaryFailed !== undefined) {
|
|
1083
1100
|
await this.agentLoop.compactionCircuit.recordOutcome(
|
|
1084
|
-
this,
|
|
1085
1101
|
result.summaryFailed,
|
|
1086
1102
|
this.sendToClient,
|
|
1087
1103
|
);
|
|
@@ -1251,7 +1267,7 @@ export class Conversation {
|
|
|
1251
1267
|
async persistUserMessage(
|
|
1252
1268
|
options: PersistMessageOptions,
|
|
1253
1269
|
): Promise<{ id: string; deduplicated: boolean }> {
|
|
1254
|
-
if (!this.
|
|
1270
|
+
if (!this._processing) {
|
|
1255
1271
|
await this.ensureActorScopedHistory();
|
|
1256
1272
|
}
|
|
1257
1273
|
return persistUserMessageImpl(this, options);
|
|
@@ -1328,10 +1344,6 @@ export class Conversation {
|
|
|
1328
1344
|
|
|
1329
1345
|
// ── Workspace ────────────────────────────────────────────────────
|
|
1330
1346
|
|
|
1331
|
-
refreshWorkspaceTopLevelContextIfNeeded(): void {
|
|
1332
|
-
refreshWorkspaceImpl(this);
|
|
1333
|
-
}
|
|
1334
|
-
|
|
1335
1347
|
markWorkspaceTopLevelDirty(): void {
|
|
1336
1348
|
this.workspaceTopLevelDirty = true;
|
|
1337
1349
|
}
|
|
@@ -2,23 +2,23 @@
|
|
|
2
2
|
* Plugin bootstrap — runs every registered plugin's `init()` hook once during
|
|
3
3
|
* daemon startup.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
5
|
+
* The registry is populated before this runs: first-party defaults are
|
|
6
|
+
* registered explicitly (step 1 below), user plugins are registered by the
|
|
7
|
+
* user-plugin loader from the workspace `plugins/` directory, and hot-reload
|
|
8
|
+
* registers at runtime. By the time {@link bootstrapPlugins} runs, the
|
|
9
|
+
* registry has been fully populated for this boot cycle. This function:
|
|
9
10
|
*
|
|
10
11
|
* 1. Registers the canonical first-party default plugins via
|
|
11
|
-
* {@link registerDefaultPlugins}
|
|
12
|
-
*
|
|
12
|
+
* {@link registerDefaultPlugins}. Registration is idempotent so repeat
|
|
13
|
+
* calls (e.g. during integration tests) do not throw.
|
|
13
14
|
* 2. Walks {@link getRegisteredPlugins} in registration order.
|
|
14
15
|
* 3. For each plugin, consults `manifest.requiresFlag` against
|
|
15
16
|
* {@link isAssistantFeatureFlagEnabled}. If any listed flag is disabled,
|
|
16
17
|
* the plugin is skipped wholesale — no `init()`, no tool/route/skill
|
|
17
18
|
* contributions, no entry in the shutdown hook, and the plugin is also
|
|
18
|
-
* dropped from the registry via {@link unregisterPlugin} so its
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* plugins behind a feature flag.
|
|
19
|
+
* dropped from the registry via {@link unregisterPlugin} so none of its
|
|
20
|
+
* hooks participate in the turn lifecycle. This is the primary mechanism for
|
|
21
|
+
* shipping experimental plugins behind a feature flag.
|
|
22
22
|
* 4. Resolves the plugin's `manifest.requiresCredential` entries via the
|
|
23
23
|
* credential store helper ({@link getSecureKeyAsync}). In Docker mode
|
|
24
24
|
* that helper goes through the CES HTTP API transparently; in local mode
|
|
@@ -190,8 +190,8 @@ function getDisabledPluginFlag(
|
|
|
190
190
|
* 1. Install the `globalThis.__vellumPluginRuntime` bridge so plugins can touch
|
|
191
191
|
* it from their module body (see `plugins/external-api.ts` — compiled-binary
|
|
192
192
|
* module identity).
|
|
193
|
-
* 2. Register the first-party defaults so their middleware
|
|
194
|
-
*
|
|
193
|
+
* 2. Register the first-party defaults so their middleware composes innermost,
|
|
194
|
+
* ahead of any user plugins.
|
|
195
195
|
* 3. Load user plugins from `<workspaceDir>/plugins/*`. A failing user plugin is
|
|
196
196
|
* logged and skipped; `loadUserPlugins()` closes the registration window
|
|
197
197
|
* when it returns, so the defaults must already be registered by then.
|
|
@@ -228,7 +228,7 @@ export async function initializePlugins(): Promise<void> {
|
|
|
228
228
|
*/
|
|
229
229
|
export async function bootstrapPlugins(): Promise<void> {
|
|
230
230
|
// Register first-party default plugins. Each default wraps one of the
|
|
231
|
-
// assistant's canonical pipelines (`
|
|
231
|
+
// assistant's canonical pipelines (`compaction`, `persistence`, ...) with a
|
|
232
232
|
// passthrough so the pipeline shape is explicit at boot even when no
|
|
233
233
|
// third-party plugins are loaded. Registration is idempotent via the
|
|
234
234
|
// already-registered guard so repeated calls (e.g. during integration
|
|
@@ -237,8 +237,8 @@ export async function bootstrapPlugins(): Promise<void> {
|
|
|
237
237
|
|
|
238
238
|
const plugins = getRegisteredPlugins();
|
|
239
239
|
if (plugins.length === 0) {
|
|
240
|
-
// No-op fast path. The default
|
|
241
|
-
//
|
|
240
|
+
// No-op fast path. The default plugins normally populate the registry, so
|
|
241
|
+
// this branch is primarily for tests that call
|
|
242
242
|
// `resetPluginRegistryForTests()` and stub the default registration.
|
|
243
243
|
log.debug("bootstrapPlugins: registry empty — skipping");
|
|
244
244
|
return;
|
|
@@ -262,9 +262,8 @@ export async function bootstrapPlugins(): Promise<void> {
|
|
|
262
262
|
// Tear down a plugin's contributions AND remove it from the registry. The
|
|
263
263
|
// two steps always move together on the bootstrap failure path: the former
|
|
264
264
|
// clears tools/routes/skills (so they stop appearing to the model/HTTP
|
|
265
|
-
// server), the latter drops the plugin's entry from the Map (so
|
|
266
|
-
//
|
|
267
|
-
// plugin on the next pipeline invocation).
|
|
265
|
+
// server), the latter drops the plugin's entry from the Map (so the registry
|
|
266
|
+
// doesn't expose an uninitialized plugin's hooks).
|
|
268
267
|
// Shutdown context is identical for every plugin in this boot — construct
|
|
269
268
|
// once and reuse across the bootstrap-failure rollback and the normal
|
|
270
269
|
// shutdown hook below. Only `assistantVersion` is exposed today; future
|
|
@@ -10,6 +10,8 @@
|
|
|
10
10
|
* - acceptA2AInvite() — self-hosted broker: orchestrate complete + redeem across daemons
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
+
import { z } from "zod";
|
|
14
|
+
|
|
13
15
|
import {
|
|
14
16
|
getConfig,
|
|
15
17
|
invalidateConfigCache,
|
|
@@ -38,42 +40,55 @@ const log = getLogger("config-a2a");
|
|
|
38
40
|
|
|
39
41
|
// ── Result types ────────────────────────────────────────────────────
|
|
40
42
|
|
|
41
|
-
export
|
|
42
|
-
success: boolean
|
|
43
|
-
enabled: boolean
|
|
44
|
-
activeConnections: number
|
|
45
|
-
error
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
export
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
export
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
43
|
+
export const A2AConfigResultSchema = z.object({
|
|
44
|
+
success: z.boolean(),
|
|
45
|
+
enabled: z.boolean(),
|
|
46
|
+
activeConnections: z.number(),
|
|
47
|
+
error: z.string().optional(),
|
|
48
|
+
});
|
|
49
|
+
export type A2AConfigResult = z.infer<typeof A2AConfigResultSchema>;
|
|
50
|
+
|
|
51
|
+
export const CreateA2AInviteResultSchema = z.object({
|
|
52
|
+
success: z.boolean(),
|
|
53
|
+
inviteId: z.string().optional(),
|
|
54
|
+
token: z.string().optional(),
|
|
55
|
+
expiresAt: z.number().optional(),
|
|
56
|
+
senderGatewayUrl: z.string().optional(),
|
|
57
|
+
error: z.string().optional(),
|
|
58
|
+
});
|
|
59
|
+
export type CreateA2AInviteResult = z.infer<typeof CreateA2AInviteResultSchema>;
|
|
60
|
+
|
|
61
|
+
export const CompleteA2AInviteResultSchema = z.object({
|
|
62
|
+
success: z.boolean(),
|
|
63
|
+
sender: z
|
|
64
|
+
.object({
|
|
65
|
+
assistantId: z.string(),
|
|
66
|
+
displayName: z.string(),
|
|
67
|
+
gatewayUrl: z.string(),
|
|
68
|
+
})
|
|
69
|
+
.optional(),
|
|
70
|
+
error: z.string().optional(),
|
|
71
|
+
});
|
|
72
|
+
export type CompleteA2AInviteResult = z.infer<
|
|
73
|
+
typeof CompleteA2AInviteResultSchema
|
|
74
|
+
>;
|
|
75
|
+
|
|
76
|
+
export const RedeemA2AInviteResultSchema = z.object({
|
|
77
|
+
success: z.boolean(),
|
|
78
|
+
contactId: z.string().optional(),
|
|
79
|
+
alreadyConnected: z.boolean().optional(),
|
|
80
|
+
error: z.string().optional(),
|
|
81
|
+
});
|
|
82
|
+
export type RedeemA2AInviteResult = z.infer<typeof RedeemA2AInviteResultSchema>;
|
|
83
|
+
|
|
84
|
+
export const AcceptA2AInviteResultSchema = z.object({
|
|
85
|
+
success: z.boolean(),
|
|
86
|
+
contactId: z.string().optional(),
|
|
87
|
+
alreadyConnected: z.boolean().optional(),
|
|
88
|
+
error: z.string().optional(),
|
|
89
|
+
errorCode: z.string().optional(),
|
|
90
|
+
});
|
|
91
|
+
export type AcceptA2AInviteResult = z.infer<typeof AcceptA2AInviteResultSchema>;
|
|
77
92
|
|
|
78
93
|
// ── Config operations ───────────────────────────────────────────────
|
|
79
94
|
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
1
3
|
import {
|
|
2
4
|
getConfig,
|
|
3
5
|
invalidateConfigCache,
|
|
@@ -26,20 +28,24 @@ import { log as _log } from "./shared.js";
|
|
|
26
28
|
|
|
27
29
|
// -- Result type --
|
|
28
30
|
|
|
29
|
-
export
|
|
30
|
-
success: boolean
|
|
31
|
-
hasBotToken: boolean
|
|
32
|
-
hasAppToken: boolean
|
|
33
|
-
hasUserToken: boolean
|
|
34
|
-
connected: boolean
|
|
35
|
-
teamId
|
|
36
|
-
teamName
|
|
37
|
-
teamUrl
|
|
38
|
-
botUserId
|
|
39
|
-
botUsername
|
|
40
|
-
error
|
|
41
|
-
warning
|
|
42
|
-
}
|
|
31
|
+
export const SlackChannelConfigResultSchema = z.object({
|
|
32
|
+
success: z.boolean(),
|
|
33
|
+
hasBotToken: z.boolean(),
|
|
34
|
+
hasAppToken: z.boolean(),
|
|
35
|
+
hasUserToken: z.boolean(),
|
|
36
|
+
connected: z.boolean(),
|
|
37
|
+
teamId: z.string().optional(),
|
|
38
|
+
teamName: z.string().optional(),
|
|
39
|
+
teamUrl: z.string().optional(),
|
|
40
|
+
botUserId: z.string().optional(),
|
|
41
|
+
botUsername: z.string().optional(),
|
|
42
|
+
error: z.string().optional(),
|
|
43
|
+
warning: z.string().optional(),
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
export type SlackChannelConfigResult = z.infer<
|
|
47
|
+
typeof SlackChannelConfigResultSchema
|
|
48
|
+
>;
|
|
43
49
|
|
|
44
50
|
// -- Helpers --
|
|
45
51
|
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
1
3
|
import { getIsPlatform } from "../../config/env-registry.js";
|
|
2
4
|
import {
|
|
3
5
|
invalidateConfigCache,
|
|
@@ -26,7 +28,6 @@ import {
|
|
|
26
28
|
deleteCredentialMetadata,
|
|
27
29
|
upsertCredentialMetadata,
|
|
28
30
|
} from "../../tools/credentials/metadata-store.js";
|
|
29
|
-
import type { TelegramConfigResponse } from "../message-protocol.js";
|
|
30
31
|
import { log } from "./shared.js";
|
|
31
32
|
|
|
32
33
|
const TELEGRAM_BOT_TOKEN_IN_URL_PATTERN =
|
|
@@ -60,7 +61,20 @@ function summarizeTelegramError(err: unknown): string {
|
|
|
60
61
|
|
|
61
62
|
// -- Transport-agnostic result type (omits the `type` discriminant) --
|
|
62
63
|
|
|
63
|
-
export
|
|
64
|
+
export const TelegramConfigResultSchema = z.object({
|
|
65
|
+
success: z.boolean(),
|
|
66
|
+
hasBotToken: z.boolean(),
|
|
67
|
+
botId: z.string().optional(),
|
|
68
|
+
botUsername: z.string().optional(),
|
|
69
|
+
connected: z.boolean(),
|
|
70
|
+
hasWebhookSecret: z.boolean(),
|
|
71
|
+
lastError: z.string().optional(),
|
|
72
|
+
error: z.string().optional(),
|
|
73
|
+
commandsRegistered: z.array(z.string()).optional(),
|
|
74
|
+
warning: z.string().optional(),
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
export type TelegramConfigResult = z.infer<typeof TelegramConfigResultSchema>;
|
|
64
78
|
|
|
65
79
|
// -- Extracted business logic functions --
|
|
66
80
|
|
|
@@ -8,9 +8,11 @@ import { createAbortReason } from "../../util/abort-reasons.js";
|
|
|
8
8
|
import { truncate } from "../../util/truncate.js";
|
|
9
9
|
import { regenerate } from "../conversation-history.js";
|
|
10
10
|
import {
|
|
11
|
-
clearAllActiveConversations,
|
|
12
11
|
conversationEntries,
|
|
13
12
|
findConversation,
|
|
13
|
+
} from "../conversation-registry.js";
|
|
14
|
+
import {
|
|
15
|
+
clearAllActiveConversations,
|
|
14
16
|
getOrCreateConversation,
|
|
15
17
|
touchConversation,
|
|
16
18
|
} from "../conversation-store.js";
|