@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
|
@@ -352,7 +352,8 @@ export interface HistoryConversationContext {
|
|
|
352
352
|
readonly traceEmitter: TraceEmitter;
|
|
353
353
|
/** @internal */ sendToClient: (msg: ServerMessage) => void;
|
|
354
354
|
messages: Message[];
|
|
355
|
-
|
|
355
|
+
isProcessing(): boolean;
|
|
356
|
+
setProcessing(value: boolean): void;
|
|
356
357
|
abortController: AbortController | null;
|
|
357
358
|
currentRequestId?: string;
|
|
358
359
|
runAgentLoop(
|
|
@@ -371,7 +372,7 @@ export interface HistoryConversationContext {
|
|
|
371
372
|
* Returns the number of messages removed.
|
|
372
373
|
*/
|
|
373
374
|
export function undo(conversation: HistoryConversationContext): number {
|
|
374
|
-
if (conversation.
|
|
375
|
+
if (conversation.isProcessing()) return 0;
|
|
375
376
|
|
|
376
377
|
const lastUserIdx = findLastUndoableUserMessageIndex(conversation.messages);
|
|
377
378
|
if (lastUserIdx === -1) return 0;
|
|
@@ -417,7 +418,7 @@ export async function regenerate(
|
|
|
417
418
|
conversation: HistoryConversationContext,
|
|
418
419
|
requestId?: string,
|
|
419
420
|
): Promise<void> {
|
|
420
|
-
if (conversation.
|
|
421
|
+
if (conversation.isProcessing()) {
|
|
421
422
|
conversation.sendToClient({
|
|
422
423
|
type: "error",
|
|
423
424
|
conversationId: conversation.conversationId,
|
|
@@ -571,7 +572,7 @@ export async function regenerate(
|
|
|
571
572
|
// Set up processing state manually and call runAgentLoop directly,
|
|
572
573
|
// bypassing processMessage to avoid duplicating the user message
|
|
573
574
|
// in both this.messages and the DB.
|
|
574
|
-
conversation.
|
|
575
|
+
conversation.setProcessing(true);
|
|
575
576
|
conversation.abortController = new AbortController();
|
|
576
577
|
const resolvedRequestId = requestId ?? uuid();
|
|
577
578
|
conversation.currentRequestId = resolvedRequestId;
|
|
@@ -30,14 +30,13 @@ import { unregisterCallNotifiers } from "./conversation-notifiers.js";
|
|
|
30
30
|
import type { MessageQueue } from "./conversation-queue-manager.js";
|
|
31
31
|
import { stripInjectionsForCompaction } from "./conversation-runtime-assembly.js";
|
|
32
32
|
import { resetSkillToolProjection } from "./conversation-skill-tools.js";
|
|
33
|
-
import { resolveTrustClass } from "./conversation-tool-setup.js";
|
|
34
33
|
import type {
|
|
35
34
|
SurfaceData,
|
|
36
35
|
SurfaceType,
|
|
37
36
|
UsageStats,
|
|
38
37
|
} from "./message-protocol.js";
|
|
39
38
|
import { filterMessagesForUntrustedActor } from "./message-provenance.js";
|
|
40
|
-
import type
|
|
39
|
+
import { resolveTrustClass, type TrustContext } from "./trust-context.js";
|
|
41
40
|
|
|
42
41
|
const log = getLogger("conversation-lifecycle");
|
|
43
42
|
|
|
@@ -89,7 +88,7 @@ export interface LoadFromDbContext {
|
|
|
89
88
|
|
|
90
89
|
export interface AbortContext {
|
|
91
90
|
readonly conversationId: string;
|
|
92
|
-
|
|
91
|
+
isProcessing(): boolean;
|
|
93
92
|
abortController: AbortController | null;
|
|
94
93
|
prompter: PermissionPrompter;
|
|
95
94
|
secretPrompter: SecretPrompter;
|
|
@@ -364,7 +363,7 @@ export function abortConversation(
|
|
|
364
363
|
ctx: AbortContext,
|
|
365
364
|
reason?: AbortReason,
|
|
366
365
|
): void {
|
|
367
|
-
if (ctx.
|
|
366
|
+
if (ctx.isProcessing()) {
|
|
368
367
|
const effectiveReason =
|
|
369
368
|
reason ??
|
|
370
369
|
createAbortReason(
|
|
@@ -187,7 +187,8 @@ function resolveIngressSecretTarget(
|
|
|
187
187
|
export interface MessagingConversationContext {
|
|
188
188
|
readonly conversationId: string;
|
|
189
189
|
messages: Message[];
|
|
190
|
-
|
|
190
|
+
isProcessing(): boolean;
|
|
191
|
+
setProcessing(value: boolean): void;
|
|
191
192
|
abortController: AbortController | null;
|
|
192
193
|
currentRequestId?: string;
|
|
193
194
|
readonly queue: MessageQueue;
|
|
@@ -323,7 +324,7 @@ export function enqueueMessage(
|
|
|
323
324
|
clientMessageId,
|
|
324
325
|
} = options;
|
|
325
326
|
|
|
326
|
-
if (!ctx.
|
|
327
|
+
if (!ctx.isProcessing()) {
|
|
327
328
|
return { queued: false, requestId };
|
|
328
329
|
}
|
|
329
330
|
|
|
@@ -384,7 +385,7 @@ export async function persistUserMessage(
|
|
|
384
385
|
): Promise<{ id: string; deduplicated: boolean }> {
|
|
385
386
|
const { content, attachments = [] } = options;
|
|
386
387
|
|
|
387
|
-
if (ctx.
|
|
388
|
+
if (ctx.isProcessing()) {
|
|
388
389
|
throw new Error("Conversation is already processing a message");
|
|
389
390
|
}
|
|
390
391
|
|
|
@@ -394,7 +395,7 @@ export async function persistUserMessage(
|
|
|
394
395
|
|
|
395
396
|
const reqId = options.requestId ?? uuid();
|
|
396
397
|
ctx.currentRequestId = reqId;
|
|
397
|
-
ctx.
|
|
398
|
+
ctx.setProcessing(true);
|
|
398
399
|
ctx.abortController = new AbortController();
|
|
399
400
|
|
|
400
401
|
try {
|
|
@@ -404,13 +405,13 @@ export async function persistUserMessage(
|
|
|
404
405
|
requestId: reqId,
|
|
405
406
|
});
|
|
406
407
|
if (result.deduplicated) {
|
|
407
|
-
ctx.
|
|
408
|
+
ctx.setProcessing(false);
|
|
408
409
|
ctx.abortController = null;
|
|
409
410
|
ctx.currentRequestId = undefined;
|
|
410
411
|
}
|
|
411
412
|
return result;
|
|
412
413
|
} catch (err) {
|
|
413
|
-
ctx.
|
|
414
|
+
ctx.setProcessing(false);
|
|
414
415
|
ctx.abortController = null;
|
|
415
416
|
ctx.currentRequestId = undefined;
|
|
416
417
|
throw err;
|
|
@@ -127,7 +127,8 @@ export function isModelSlashCommand(content: string): boolean {
|
|
|
127
127
|
export interface ProcessConversationContext {
|
|
128
128
|
readonly conversationId: string;
|
|
129
129
|
messages: Message[];
|
|
130
|
-
|
|
130
|
+
isProcessing(): boolean;
|
|
131
|
+
setProcessing(value: boolean): void;
|
|
131
132
|
abortController: AbortController | null;
|
|
132
133
|
currentRequestId?: string;
|
|
133
134
|
readonly queue: MessageQueue;
|
|
@@ -203,9 +204,7 @@ export interface ProcessConversationContext {
|
|
|
203
204
|
},
|
|
204
205
|
): void;
|
|
205
206
|
/** Force context compaction regardless of threshold/cooldown. */
|
|
206
|
-
forceCompact(
|
|
207
|
-
targetInputTokensOverride?: number;
|
|
208
|
-
}): Promise<ContextWindowResult>;
|
|
207
|
+
forceCompact(): Promise<ContextWindowResult>;
|
|
209
208
|
/** Strip runtime injections and reset memory-injection state. */
|
|
210
209
|
forceClean(): Promise<CleanResult>;
|
|
211
210
|
/** Set transport-derived hints for the conversation. */
|
|
@@ -757,9 +756,7 @@ async function drainSingleMessage(
|
|
|
757
756
|
conversation.emitActivityState("thinking", "context_compacting", {
|
|
758
757
|
requestId: next.requestId,
|
|
759
758
|
});
|
|
760
|
-
const result = await conversation.forceCompact(
|
|
761
|
-
targetInputTokensOverride: slashResult.targetInputTokensOverride,
|
|
762
|
-
});
|
|
759
|
+
const result = await conversation.forceCompact();
|
|
763
760
|
const responseText = formatCompactResult(result);
|
|
764
761
|
|
|
765
762
|
const assistantMsg = createAssistantMessage(responseText);
|
|
@@ -1022,7 +1019,7 @@ async function drainSingleMessage(
|
|
|
1022
1019
|
});
|
|
1023
1020
|
}
|
|
1024
1021
|
|
|
1025
|
-
// Fire-and-forget: persistUserMessage set
|
|
1022
|
+
// Fire-and-forget: persistUserMessage set the processing flag to true
|
|
1026
1023
|
// so subsequent messages will still be enqueued.
|
|
1027
1024
|
// runAgentLoop's finally block will call drainQueue when this run completes.
|
|
1028
1025
|
const drainLoopOptions: {
|
|
@@ -1215,7 +1212,7 @@ async function drainBatch(
|
|
|
1215
1212
|
// which were already shifted out of the queue by
|
|
1216
1213
|
// buildPassthroughBatch and would otherwise be stranded. Mirrors
|
|
1217
1214
|
// the head persist-failure recovery below.
|
|
1218
|
-
conversation.
|
|
1215
|
+
conversation.setProcessing(false);
|
|
1219
1216
|
conversation.abortController = null;
|
|
1220
1217
|
conversation.currentRequestId = undefined;
|
|
1221
1218
|
conversation.preactivatedSkillIds = undefined;
|
|
@@ -1732,7 +1729,7 @@ export async function processMessage(
|
|
|
1732
1729
|
|
|
1733
1730
|
// /compact — force context compaction, persist exchange, return message ID.
|
|
1734
1731
|
if (slashResult.kind === "compact") {
|
|
1735
|
-
conversation.
|
|
1732
|
+
conversation.setProcessing(true);
|
|
1736
1733
|
let persistedCompactMessage = false;
|
|
1737
1734
|
try {
|
|
1738
1735
|
const pmTurnCtx = conversation.getTurnChannelContext();
|
|
@@ -1773,9 +1770,7 @@ export async function processMessage(
|
|
|
1773
1770
|
conversation.emitActivityState("thinking", "context_compacting", {
|
|
1774
1771
|
requestId,
|
|
1775
1772
|
});
|
|
1776
|
-
const result = await conversation.forceCompact(
|
|
1777
|
-
targetInputTokensOverride: slashResult.targetInputTokensOverride,
|
|
1778
|
-
});
|
|
1773
|
+
const result = await conversation.forceCompact();
|
|
1779
1774
|
const responseText = formatCompactResult(result);
|
|
1780
1775
|
|
|
1781
1776
|
const assistantMsg = createAssistantMessage(responseText);
|
|
@@ -1809,14 +1804,14 @@ export async function processMessage(
|
|
|
1809
1804
|
}
|
|
1810
1805
|
throw err;
|
|
1811
1806
|
} finally {
|
|
1812
|
-
conversation.
|
|
1807
|
+
conversation.setProcessing(false);
|
|
1813
1808
|
await drainQueue(conversation);
|
|
1814
1809
|
}
|
|
1815
1810
|
}
|
|
1816
1811
|
|
|
1817
1812
|
// /clean — strip runtime injections, return message ID. No LLM call.
|
|
1818
1813
|
if (slashResult.kind === "clean") {
|
|
1819
|
-
conversation.
|
|
1814
|
+
conversation.setProcessing(true);
|
|
1820
1815
|
let persistedCleanMessage = false;
|
|
1821
1816
|
try {
|
|
1822
1817
|
const pmTurnCtx = conversation.getTurnChannelContext();
|
|
@@ -1888,7 +1883,7 @@ export async function processMessage(
|
|
|
1888
1883
|
}
|
|
1889
1884
|
throw err;
|
|
1890
1885
|
} finally {
|
|
1891
|
-
conversation.
|
|
1886
|
+
conversation.setProcessing(false);
|
|
1892
1887
|
await drainQueue(conversation);
|
|
1893
1888
|
}
|
|
1894
1889
|
}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory registry of active {@link Conversation} instances, keyed by
|
|
3
|
+
* conversation ID, plus the read/write accessors over it.
|
|
4
|
+
*
|
|
5
|
+
* This is a leaf module: it imports `Conversation` as a type only, so any
|
|
6
|
+
* layer — including the memory-retrieval plugin's injectors, which only know a
|
|
7
|
+
* conversation id — can look up the live conversation and read its state
|
|
8
|
+
* without pulling in the daemon-core creation graph (providers, system-prompt
|
|
9
|
+
* assembly, the `Conversation` class value) that `getOrCreateConversation` in
|
|
10
|
+
* `conversation-store` depends on. Keeping the registry free of those value
|
|
11
|
+
* imports is what lets the injector chain consume it without forming an import
|
|
12
|
+
* cycle (`injectors → store → conversation → agent-loop → runtime-assembly →
|
|
13
|
+
* injector-chain → injectors`).
|
|
14
|
+
*
|
|
15
|
+
* `conversation-store` owns the creation/reuse lifecycle and writes top-level
|
|
16
|
+
* conversations into this map via {@link setConversation}.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import type { Conversation } from "./conversation.js";
|
|
20
|
+
|
|
21
|
+
const conversations = new Map<string, Conversation>();
|
|
22
|
+
|
|
23
|
+
// ── Read helpers ───────────────────────────────────────────────────
|
|
24
|
+
|
|
25
|
+
export function findConversation(
|
|
26
|
+
conversationId: string | undefined,
|
|
27
|
+
): Conversation | undefined {
|
|
28
|
+
if (!conversationId) return undefined;
|
|
29
|
+
return conversations.get(conversationId);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function findConversationBySurfaceId(
|
|
33
|
+
surfaceId: string,
|
|
34
|
+
): Conversation | undefined {
|
|
35
|
+
// Fast path: exact surfaceId match in surfaceState
|
|
36
|
+
for (const c of conversations.values()) {
|
|
37
|
+
if (c.surfaceState.has(surfaceId)) return c;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Fallback: standalone app surfaces use "app-open-{appId}" IDs that
|
|
41
|
+
// were never part of any conversation. Extract the appId and find
|
|
42
|
+
// a conversation whose surfaceState has a surface for that app.
|
|
43
|
+
const appOpenPrefix = "app-open-";
|
|
44
|
+
if (surfaceId.startsWith(appOpenPrefix)) {
|
|
45
|
+
const appId = surfaceId.slice(appOpenPrefix.length);
|
|
46
|
+
for (const c of conversations.values()) {
|
|
47
|
+
for (const [, state] of c.surfaceState.entries()) {
|
|
48
|
+
const data = state.data as unknown as Record<string, unknown>;
|
|
49
|
+
if (data?.appId === appId) {
|
|
50
|
+
// Register this surfaceId so subsequent lookups are O(1)
|
|
51
|
+
c.surfaceState.set(surfaceId, state);
|
|
52
|
+
return c;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function conversationCount(): number {
|
|
62
|
+
return conversations.size;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** Iterate over all active conversations. */
|
|
66
|
+
export function allConversations(): IterableIterator<Conversation> {
|
|
67
|
+
return conversations.values();
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** Iterate over all [id, conversation] entries. */
|
|
71
|
+
export function conversationEntries(): IterableIterator<
|
|
72
|
+
[string, Conversation]
|
|
73
|
+
> {
|
|
74
|
+
return conversations.entries();
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** Iterate over all active conversation IDs. */
|
|
78
|
+
export function conversationIds(): IterableIterator<string> {
|
|
79
|
+
return conversations.keys();
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// ── Write helpers ──────────────────────────────────────────────────
|
|
83
|
+
|
|
84
|
+
export function setConversation(
|
|
85
|
+
conversationId: string,
|
|
86
|
+
conversation: Conversation,
|
|
87
|
+
): void {
|
|
88
|
+
conversations.set(conversationId, conversation);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export function deleteConversation(conversationId: string): boolean {
|
|
92
|
+
return conversations.delete(conversationId);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export function clearConversations(): void {
|
|
96
|
+
conversations.clear();
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// ── Underlying Map (for the evictor, which takes a mutable ref) ───
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Expose the raw Map for the {@link ConversationEvictor}, which needs
|
|
103
|
+
* a mutable reference to delete entries during sweeps. No other code
|
|
104
|
+
* should use this — prefer the named helpers above.
|
|
105
|
+
*/
|
|
106
|
+
export function getConversationMap(): Map<string, Conversation> {
|
|
107
|
+
return conversations;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// ── Subagent live-conversation index ───────────────────────────────
|
|
111
|
+
//
|
|
112
|
+
// Subagents run their own agent loop — and therefore the injector chain — but
|
|
113
|
+
// are owned by the `SubagentManager` rather than the daemon's eviction-managed
|
|
114
|
+
// store, so they are deliberately absent from `conversations` above. This
|
|
115
|
+
// point-lookup index lets the per-conversation injectors (workspace context,
|
|
116
|
+
// disk-pressure warning) resolve a subagent's live `Conversation` by id and
|
|
117
|
+
// read state off it. It is intentionally excluded from the iteration accessors
|
|
118
|
+
// and the evictor map so subagent lifecycle stays solely with the manager.
|
|
119
|
+
|
|
120
|
+
const subagentConversations = new Map<string, Conversation>();
|
|
121
|
+
|
|
122
|
+
/** Register a subagent's live conversation for point lookups. */
|
|
123
|
+
export function setSubagentConversation(
|
|
124
|
+
conversationId: string,
|
|
125
|
+
conversation: Conversation,
|
|
126
|
+
): void {
|
|
127
|
+
subagentConversations.set(conversationId, conversation);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Remove a subagent's conversation from the index. Guards against clobbering a
|
|
132
|
+
* newer registration for the same id by only deleting when the stored entry
|
|
133
|
+
* still points at this instance.
|
|
134
|
+
*/
|
|
135
|
+
export function removeSubagentConversation(
|
|
136
|
+
conversationId: string,
|
|
137
|
+
conversation: Conversation,
|
|
138
|
+
): void {
|
|
139
|
+
if (subagentConversations.get(conversationId) === conversation) {
|
|
140
|
+
subagentConversations.delete(conversationId);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Resolve a live `Conversation` by id, including subagent conversations.
|
|
146
|
+
* Top-level conversations are checked first, then subagents. Used by the
|
|
147
|
+
* per-conversation injectors, which run for subagent turns too; other callers
|
|
148
|
+
* should use {@link findConversation}, which is scoped to the eviction-managed
|
|
149
|
+
* top-level conversations.
|
|
150
|
+
*/
|
|
151
|
+
export function findConversationOrSubagent(
|
|
152
|
+
conversationId: string | undefined,
|
|
153
|
+
): Conversation | undefined {
|
|
154
|
+
if (!conversationId) return undefined;
|
|
155
|
+
return (
|
|
156
|
+
conversations.get(conversationId) ??
|
|
157
|
+
subagentConversations.get(conversationId)
|
|
158
|
+
);
|
|
159
|
+
}
|