@vellumai/assistant 0.8.6 → 0.8.7-dev.202606052118.34cd356
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/AGENTS.md +4 -4
- package/Dockerfile +21 -4
- package/bun.lock +13 -4
- package/docker-entrypoint.sh +12 -8
- package/docker-init-apt-root.sh +3 -1
- package/docker-kata-apt-env.sh +3 -1
- package/docker-kata-runtime-family.sh +12 -0
- package/docs/architecture/memory.md +1 -1
- package/docs/plugins.md +110 -83
- package/examples/plugins/echo/README.md +13 -12
- package/examples/plugins/echo/register.ts +0 -54
- package/knip.json +1 -0
- package/node_modules/@vellumai/environments/bun.lock +24 -0
- package/node_modules/@vellumai/environments/package.json +18 -0
- package/node_modules/@vellumai/environments/src/__tests__/package-boundary.test.ts +95 -0
- package/node_modules/@vellumai/environments/src/index.ts +11 -0
- package/node_modules/@vellumai/environments/src/seeds.ts +73 -0
- package/node_modules/@vellumai/environments/src/types.ts +70 -0
- package/node_modules/@vellumai/environments/tsconfig.json +20 -0
- package/node_modules/@vellumai/skill-host-contracts/src/assistant-event.ts +11 -0
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +3 -4
- package/node_modules/@vellumai/skill-host-contracts/src/server-message.ts +3 -3
- package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +13 -8
- package/openapi.yaml +6964 -539
- package/package.json +8 -4
- package/scripts/generate-openapi.ts +88 -54
- package/src/__tests__/agent-loop-callsite-precedence.test.ts +42 -80
- package/src/__tests__/agent-loop-exit-reason.test.ts +188 -45
- package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +141 -0
- package/src/__tests__/agent-loop-override-profile.test.ts +19 -32
- package/src/__tests__/agent-loop-provider-error-recording.test.ts +7 -5
- package/src/__tests__/agent-loop-thinking.test.ts +17 -12
- package/src/__tests__/agent-loop.test.ts +238 -422
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +6 -2
- package/src/__tests__/agent-wake-override-profile.test.ts +22 -40
- 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 +296 -57
- package/src/__tests__/app-builder-skill-instructions.test.ts +22 -0
- package/src/__tests__/app-control-flow.test.ts +6 -1
- package/src/__tests__/app-dir-path-guard.test.ts +1 -0
- package/src/__tests__/approval-cascade.test.ts +4 -11
- package/src/__tests__/approval-routes-http.test.ts +8 -3
- package/src/__tests__/assistant-event-hub.test.ts +25 -0
- package/src/__tests__/assistant-event.test.ts +15 -0
- package/src/__tests__/assistant-events-sse-shed.test.ts +8 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +2 -2
- package/src/__tests__/assistant-stream-state.test.ts +645 -0
- package/src/__tests__/auth-fallback-events-store.test.ts +116 -0
- package/src/__tests__/avatar-e2e.test.ts +7 -37
- package/src/__tests__/avatar-generator.test.ts +12 -42
- package/src/__tests__/avatar-identity-sync.test.ts +28 -3
- package/src/__tests__/background-shell-bash.test.ts +3 -7
- package/src/__tests__/background-workers-disk-pressure.test.ts +6 -0
- package/src/__tests__/btw-routes.test.ts +69 -15
- package/src/__tests__/build-persisted-content.test.ts +184 -0
- package/src/__tests__/call-pointer-messages.test.ts +5 -3
- package/src/__tests__/call-site-routing-provider.test.ts +22 -40
- package/src/__tests__/catalog-files.test.ts +1 -0
- package/src/__tests__/channel-approval-routes.test.ts +49 -21
- package/src/__tests__/channel-approvals.test.ts +4 -2
- package/src/__tests__/channel-invite-transport.test.ts +1 -5
- package/src/__tests__/channel-readiness-routes.test.ts +0 -4
- package/src/__tests__/channel-readiness-slack-remote.test.ts +2 -7
- package/src/__tests__/channel-retry-sweep.test.ts +71 -79
- package/src/__tests__/clawhub-files.test.ts +1 -0
- package/src/__tests__/compaction-circuit.test.ts +258 -0
- package/src/__tests__/compaction-direct.test.ts +132 -0
- package/src/__tests__/compaction-events.test.ts +5 -17
- package/src/__tests__/compaction-trail-store.test.ts +1 -79
- package/src/__tests__/compaction.benchmark.test.ts +0 -30
- package/src/__tests__/compactor-image-manifest-trust.test.ts +112 -0
- package/src/__tests__/computer-use-tools.test.ts +2 -2
- package/src/__tests__/config-watcher.test.ts +28 -0
- package/src/__tests__/context-search-agent-runner.test.ts +6 -3
- package/src/__tests__/context-token-estimator.test.ts +34 -0
- package/src/__tests__/context-window-manager-compact-retry.test.ts +291 -0
- package/src/__tests__/conversation-abort-tool-results.test.ts +70 -25
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +9 -7
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +22 -34
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +476 -963
- package/src/__tests__/conversation-agent-loop.test.ts +823 -1321
- package/src/__tests__/conversation-analysis-routes.test.ts +7 -3
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +1 -1
- package/src/__tests__/conversation-clean-command.test.ts +5 -2
- package/src/__tests__/conversation-clear-safety.test.ts +20 -10
- package/src/__tests__/conversation-confirmation-signals.test.ts +15 -45
- package/src/__tests__/conversation-disk-view-integration.test.ts +2 -2
- package/src/__tests__/conversation-disk-view.test.ts +10 -17
- package/src/__tests__/conversation-fork-crud.test.ts +86 -172
- package/src/__tests__/conversation-fork-route.test.ts +16 -14
- package/src/__tests__/conversation-history-web-search.test.ts +11 -1
- package/src/__tests__/conversation-init.benchmark.test.ts +6 -6
- package/src/__tests__/conversation-lifecycle.test.ts +3 -2
- package/src/__tests__/conversation-load-history-repair.test.ts +3 -2
- package/src/__tests__/conversation-load-history-stripped.test.ts +1 -1
- package/src/__tests__/conversation-message-sync-tags.test.ts +3 -4
- package/src/__tests__/conversation-pairing.test.ts +10 -7
- package/src/__tests__/conversation-pre-run-repair.test.ts +1 -1
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +10 -0
- package/src/__tests__/conversation-process-callsite.test.ts +27 -30
- package/src/__tests__/conversation-provider-retry-repair.test.ts +80 -51
- package/src/__tests__/conversation-queue.test.ts +272 -164
- package/src/__tests__/conversation-routes-disk-view.test.ts +6 -2
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +2 -2
- package/src/__tests__/conversation-routes-slash-commands.test.ts +8 -7
- package/src/__tests__/conversation-runtime-assembly.test.ts +317 -313
- package/src/__tests__/conversation-runtime-workspace.test.ts +114 -36
- package/src/__tests__/conversation-slash-commands.test.ts +8 -42
- package/src/__tests__/conversation-slash-queue.test.ts +42 -31
- package/src/__tests__/conversation-slash-unknown.test.ts +13 -15
- package/src/__tests__/conversation-speed-override.test.ts +8 -22
- package/src/__tests__/conversation-starter-routes.test.ts +14 -6
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +90 -15
- package/src/__tests__/conversation-surfaces-app-control.test.ts +32 -4
- package/src/__tests__/conversation-surfaces-state-update.test.ts +5 -2
- package/src/__tests__/conversation-surfaces-table-action.test.ts +6 -15
- package/src/__tests__/conversation-sync-tags.test.ts +27 -15
- package/src/__tests__/conversation-title-service.test.ts +135 -2
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +23 -11
- package/src/__tests__/conversation-unread-route.test.ts +14 -2
- package/src/__tests__/conversation-usage.test.ts +0 -2
- package/src/__tests__/conversation-wipe.test.ts +1 -1
- package/src/__tests__/conversation-workspace-cache-state.test.ts +20 -17
- package/src/__tests__/conversation-workspace-injection.test.ts +114 -23
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +34 -13
- package/src/__tests__/conversations-import-system-filter.test.ts +101 -0
- package/src/__tests__/credential-execution-tools.test.ts +1 -2
- package/src/__tests__/credential-security-invariants.test.ts +0 -1
- package/src/__tests__/cross-provider-web-search.test.ts +220 -3
- package/src/__tests__/cu-unified-flow.test.ts +26 -1
- package/src/__tests__/db-acp-history.test.ts +101 -0
- package/src/__tests__/db-schedule-syntax-migration.test.ts +16 -0
- package/src/__tests__/disk-pressure-guard.test.ts +66 -0
- package/src/__tests__/disk-pressure-routes.test.ts +9 -2
- package/src/__tests__/dm-persistence.test.ts +12 -3
- package/src/__tests__/dynamic-page-surface.test.ts +99 -0
- package/src/__tests__/edit-propagation.test.ts +1 -2
- 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__/filing-service.test.ts +2 -2
- package/src/__tests__/first-greeting.test.ts +55 -14
- package/src/__tests__/gemini-image-service.test.ts +13 -0
- package/src/__tests__/gemini-inline-media.test.ts +78 -0
- package/src/__tests__/gemini-provider.test.ts +351 -28
- package/src/__tests__/guardian-grant-minting.test.ts +1 -1
- package/src/__tests__/guardian-routing-invariants.test.ts +2 -4
- package/src/__tests__/guardian-routing-state.test.ts +60 -71
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +10 -8
- package/src/__tests__/heartbeat-disk-pressure.test.ts +2 -0
- package/src/__tests__/heartbeat-service.test.ts +3 -1
- 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 +162 -0
- package/src/__tests__/history-repair-observability.test.ts +1 -1
- package/src/__tests__/history-repair.test.ts +2 -1
- package/src/__tests__/host-app-control-proxy.test.ts +2 -0
- package/src/__tests__/host-app-control-routes.test.ts +1 -1
- package/src/__tests__/host-cu-proxy.test.ts +2 -0
- package/src/__tests__/host-cu-routes-targeted.test.ts +3 -3
- package/src/__tests__/host-file-edit-tool.test.ts +4 -2
- package/src/__tests__/host-file-proxy.test.ts +31 -0
- package/src/__tests__/host-file-read-tool.test.ts +4 -2
- package/src/__tests__/host-file-write-tool.test.ts +9 -3
- package/src/__tests__/host-proxy-preactivation.test.ts +53 -14
- package/src/__tests__/host-shell-tool.test.ts +9 -4
- package/src/__tests__/http-user-message-parity.test.ts +2 -2
- package/src/__tests__/identity-intro-cache.test.ts +47 -114
- package/src/__tests__/identity-routes.test.ts +248 -7
- package/src/__tests__/inbound-slack-persistence.test.ts +12 -3
- 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 +214 -0
- package/src/__tests__/internal-telemetry-routes.test.ts +109 -0
- package/src/__tests__/list-messages-attachments.test.ts +7 -8
- package/src/__tests__/list-messages-hidden-metadata.test.ts +55 -15
- package/src/__tests__/list-messages-page-latest.test.ts +60 -1
- package/src/__tests__/list-messages-tool-merge.test.ts +56 -6
- package/src/__tests__/llm-request-log-turn-query.test.ts +42 -86
- package/src/__tests__/llm-resolver.test.ts +23 -47
- package/src/__tests__/llm-usage-store.test.ts +268 -1
- package/src/__tests__/log-export-routes.test.ts +59 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +1 -8
- package/src/__tests__/mcp-auth-routes.test.ts +15 -10
- package/src/__tests__/mcp-health-check.test.ts +18 -13
- package/src/__tests__/memory-retrieval-hook.test.ts +297 -0
- package/src/__tests__/memory-v2-static-injector.test.ts +103 -35
- package/src/__tests__/messaging-send-tool.test.ts +8 -4
- package/src/__tests__/migration-export-http.test.ts +12 -12
- package/src/__tests__/migration-import-commit-http.test.ts +8 -8
- package/src/__tests__/migration-import-preflight-http.test.ts +7 -7
- package/src/__tests__/migration-validate-http.test.ts +3 -3
- package/src/__tests__/native-web-search.test.ts +205 -20
- package/src/__tests__/notification-decision-identity.test.ts +9 -18
- package/src/__tests__/notification-decision-recipient-context.test.ts +3 -6
- package/src/__tests__/oauth-commands-routes.test.ts +1 -1
- package/src/__tests__/onboarding-template-contract.test.ts +12 -0
- package/src/__tests__/openai-image-service.test.ts +17 -0
- package/src/__tests__/openai-provider.test.ts +97 -71
- package/src/__tests__/openai-responses-provider.test.ts +21 -77
- package/src/__tests__/outbound-slack-persistence.test.ts +2 -1
- package/src/__tests__/{overflow-reduce-pipeline.test.ts → overflow-reduction-loop.test.ts} +64 -286
- package/src/__tests__/parallel-tool.benchmark.test.ts +24 -36
- package/src/__tests__/persist-unsendable-image.test.ts +215 -0
- package/src/__tests__/persistence-secret-redaction.test.ts +3 -1
- package/src/__tests__/pipeline-runner.test.ts +31 -43
- package/src/__tests__/pkb-autoinject.test.ts +2 -5
- package/src/__tests__/plugin-bootstrap.test.ts +62 -51
- package/src/__tests__/plugin-registry.test.ts +0 -27
- package/src/__tests__/plugin-route-contribution.test.ts +6 -16
- package/src/__tests__/plugin-skill-contribution.test.ts +7 -17
- package/src/__tests__/plugin-tool-contribution.test.ts +10 -26
- package/src/__tests__/plugin-types.test.ts +8 -173
- package/src/__tests__/prechat-onboarding-contract.test.ts +23 -0
- package/src/__tests__/process-message-background-slack.test.ts +17 -16
- package/src/__tests__/process-message-display-content.test.ts +36 -44
- package/src/__tests__/provider-commit-message-generator.test.ts +19 -14
- package/src/__tests__/provider-error-scenarios.test.ts +7 -6
- package/src/__tests__/provider-platform-proxy-integration.test.ts +3 -8
- package/src/__tests__/provider-send-message-override-profile.test.ts +9 -25
- package/src/__tests__/provider-streaming.benchmark.test.ts +12 -22
- package/src/__tests__/provider-usage-tracking.test.ts +0 -6
- package/src/__tests__/ratelimit.test.ts +9 -4
- package/src/__tests__/reaction-persistence.test.ts +1 -1
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +5 -1
- package/src/__tests__/relay-server.test.ts +20 -13
- package/src/__tests__/resolve-trust-class.test.ts +4 -4
- package/src/__tests__/retry-openrouter-only-normalization.test.ts +5 -8
- package/src/__tests__/retry-thinking-tool-choice.test.ts +10 -13
- package/src/__tests__/retry-verbosity-normalization.test.ts +5 -8
- package/src/__tests__/runtime-events-sse-reconnect.test.ts +390 -0
- package/src/__tests__/schedule-routes.test.ts +683 -12
- package/src/__tests__/schedule-store.test.ts +108 -0
- package/src/__tests__/schedule-tools.test.ts +160 -0
- package/src/__tests__/secret-ingress-http.test.ts +2 -2
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +11 -7
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +11 -9
- package/src/__tests__/secret-response-routing.test.ts +13 -11
- package/src/__tests__/send-endpoint-busy.test.ts +6 -2
- package/src/__tests__/server-history-render.test.ts +314 -1
- package/src/__tests__/shell-observability.test.ts +249 -0
- package/src/__tests__/skill-feature-flags-integration.test.ts +44 -11
- package/src/__tests__/skill-feature-flags.test.ts +6 -6
- package/src/__tests__/skill-load-feature-flag.test.ts +10 -10
- package/src/__tests__/skills-files-catalog-fallback.test.ts +10 -0
- package/src/__tests__/skillssh-files.test.ts +1 -0
- package/src/__tests__/starter-task-flow.test.ts +6 -6
- package/src/__tests__/strip-memory-injections.test.ts +102 -14
- package/src/__tests__/subagent-call-site-routing.test.ts +3 -3
- 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__/suggestion-routes.test.ts +3 -3
- package/src/__tests__/sync-message-contract.test.ts +19 -16
- package/src/__tests__/system-prompt.test.ts +74 -0
- package/src/__tests__/task-scheduler.test.ts +162 -1
- package/src/__tests__/terminal-tools.test.ts +9 -25
- package/src/__tests__/thread-backfill.test.ts +4 -9
- 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 +481 -16
- 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 +1 -1
- package/src/__tests__/tools-audio-read.test.ts +113 -0
- package/src/__tests__/turn-boundary-resolution.test.ts +44 -84
- package/src/__tests__/turn-events-store.test.ts +11 -7
- package/src/__tests__/ui-choice-copy-surfaces.test.ts +254 -0
- package/src/__tests__/ui-work-result-surface.test.ts +159 -0
- package/src/__tests__/usage-routes.test.ts +285 -1
- package/src/__tests__/user-plugin-loader.test.ts +2 -2
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +8 -6
- package/src/__tests__/voice-session-bridge.test.ts +19 -10
- 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 +143 -31
- package/src/acp/__tests__/session-manager-persistence.test.ts +95 -28
- package/src/acp/__tests__/session-manager-resume.test.ts +695 -0
- package/src/acp/agent-process.ts +61 -1
- package/src/acp/auto-install.test.ts +125 -0
- package/src/acp/auto-install.ts +174 -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 +52 -11
- package/src/acp/resolve-agent.test.ts +147 -6
- package/src/acp/resolve-agent.ts +81 -7
- package/src/acp/resume-hint.ts +22 -0
- package/src/acp/session-manager.ts +487 -71
- package/src/agent/compaction-circuit.ts +98 -0
- package/src/agent/loop.ts +651 -450
- package/src/api/README.md +19 -17
- package/src/api/constants/tool-execution.ts +21 -0
- package/src/api/events/assistant-activity-state.ts +75 -0
- package/src/api/events/assistant-outbound-attachment.ts +25 -27
- package/src/api/events/assistant-text-delta.ts +6 -8
- package/src/api/events/assistant-thinking-delta.ts +33 -0
- package/src/api/events/assistant-turn-start.ts +5 -7
- package/src/api/events/avatar-updated.ts +24 -0
- package/src/api/events/compaction-circuit-closed.ts +26 -0
- package/src/api/events/compaction-circuit-open.ts +28 -0
- package/src/api/events/confirmation-request.ts +114 -0
- package/src/api/events/contact-request.ts +33 -0
- package/src/api/events/conversation-error.ts +77 -0
- package/src/api/events/conversation-list-invalidated.ts +38 -0
- package/src/api/events/conversation-title-updated.ts +24 -0
- package/src/api/events/disk-pressure-status-changed.ts +61 -0
- package/src/api/events/document-comment-created.ts +24 -28
- package/src/api/events/document-comment-deleted.ts +6 -8
- package/src/api/events/document-comment-reopened.ts +6 -8
- package/src/api/events/document-comment-resolved.ts +8 -10
- package/src/api/events/document-editor-update.ts +27 -0
- package/src/api/events/error.ts +32 -0
- package/src/api/events/generation-cancelled.ts +4 -6
- package/src/api/events/generation-handoff.ts +13 -15
- package/src/api/events/home-feed-updated.ts +26 -0
- package/src/api/events/identity-changed.ts +32 -0
- package/src/api/events/interaction-resolved.ts +50 -0
- package/src/api/events/message-complete.ts +10 -12
- package/src/api/events/message-dequeued.ts +21 -0
- package/src/api/events/message-queued-deleted.ts +23 -0
- package/src/api/events/message-queued.ts +22 -0
- package/src/api/events/message-request-complete.ts +29 -0
- package/src/api/events/navigate-settings.ts +20 -0
- package/src/api/events/notification-intent.ts +33 -0
- package/src/api/events/open-url.ts +6 -8
- package/src/api/events/question-request.ts +67 -0
- package/src/api/events/relationship-state-updated.ts +4 -6
- package/src/api/events/secret-request.ts +42 -0
- package/src/api/events/subagent-event.ts +79 -0
- package/src/api/events/subagent-spawned.ts +40 -0
- package/src/api/events/subagent-status-changed.ts +65 -0
- package/src/api/events/sync-changed.ts +29 -0
- package/src/api/events/tool-output-chunk.ts +45 -0
- package/src/api/events/tool-result.ts +129 -0
- package/src/api/events/tool-use-preview-start.ts +32 -0
- package/src/api/events/tool-use-start.ts +8 -10
- package/src/api/events/trace-event.ts +69 -0
- package/src/api/events/turn-profile-auto-routed.ts +28 -0
- package/src/api/events/ui-surface-complete.ts +30 -0
- package/src/api/events/ui-surface-dismiss.ts +22 -0
- package/src/api/events/ui-surface-show.ts +67 -0
- package/src/api/events/ui-surface-update.ts +26 -0
- package/src/api/events/usage-update.ts +34 -0
- package/src/api/events/user-message-echo.ts +35 -0
- package/src/api/index.ts +389 -0
- package/src/api/requests/dictation.ts +45 -0
- package/src/api/responses/conversation-message.ts +374 -0
- package/src/api/responses/disk-pressure-status.ts +26 -0
- package/src/api/responses/home.ts +217 -0
- package/src/api/responses/llm-context-response.ts +2 -0
- package/src/api/responses/memory-v3-selection-log.ts +50 -0
- package/src/api/responses/subagent-detail.ts +48 -0
- package/src/approvals/guardian-decision-primitive.ts +7 -15
- package/src/approvals/guardian-request-resolvers.ts +7 -10
- package/src/avatar/__tests__/avatar-manifest.test.ts +236 -0
- package/src/avatar/__tests__/avatar-store.test.ts +198 -0
- package/src/avatar/avatar-manifest.ts +195 -0
- package/src/avatar/avatar-store.ts +113 -0
- package/src/avatar/traits-png-sync.ts +8 -2
- package/src/background-wake/next-wake.test.ts +31 -1
- package/src/background-wake/next-wake.ts +5 -1
- package/src/calls/call-conversation-messages.ts +6 -4
- package/src/calls/guardian-action-sweep.ts +6 -4
- package/src/calls/relay-server.ts +12 -8
- package/src/calls/voice-session-bridge.ts +13 -27
- package/src/cli/commands/__tests__/memory-v3.test.ts +245 -0
- package/src/cli/commands/__tests__/notifications.test.ts +58 -14
- package/src/cli/commands/avatar.ts +17 -11
- package/src/cli/commands/conversations.ts +15 -1
- package/src/cli/commands/db/__tests__/repair.test.ts +540 -0
- package/src/cli/commands/db/__tests__/status.test.ts +253 -0
- package/src/cli/commands/db/format.ts +48 -0
- package/src/cli/commands/db/index.ts +29 -0
- package/src/cli/commands/db/repair-step-conversation-backfill.ts +345 -0
- package/src/cli/commands/db/repair-step-integrity.ts +146 -0
- package/src/cli/commands/db/repair-steps.ts +164 -0
- package/src/cli/commands/db/repair.ts +141 -0
- package/src/cli/commands/db/status.ts +366 -0
- package/src/cli/commands/memory-v3.ts +159 -445
- package/src/cli/commands/notifications.ts +112 -60
- package/src/cli/lib/cli-colors.ts +24 -6
- package/src/cli/program.ts +4 -5
- package/src/config/__tests__/feature-flag-registry-guard.test.ts +4 -4
- package/src/config/acp-defaults.test.ts +10 -0
- package/src/config/acp-defaults.ts +6 -0
- package/src/config/assistant-feature-flags.ts +24 -13
- package/src/config/bundled-skills/acp/SKILL.md +64 -30
- package/src/config/bundled-skills/acp/TOOLS.json +4 -4
- package/src/config/bundled-skills/app-builder/SKILL.md +224 -387
- 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/media-processing/services/reduce.ts +6 -9
- package/src/config/bundled-skills/messaging/SKILL.md +0 -7
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +7 -2
- package/src/config/bundled-skills/schedule/SKILL.md +1 -1
- package/src/config/bundled-skills/schedule/TOOLS.json +8 -0
- package/src/config/bundled-tool-registry.ts +2 -0
- package/src/config/call-site-defaults.ts +2 -7
- package/src/config/feature-flag-cache.ts +3 -3
- package/src/config/feature-flag-registry.json +68 -12
- package/src/config/schemas/__tests__/memory-v2.test.ts +2 -226
- package/src/config/schemas/__tests__/memory-v3.test.ts +25 -0
- package/src/config/schemas/call-site-catalog.ts +8 -15
- package/src/config/schemas/heartbeat.ts +9 -0
- package/src/config/schemas/llm.ts +3 -3
- package/src/config/schemas/memory-lifecycle.ts +24 -0
- package/src/config/schemas/memory-v2.ts +8 -253
- package/src/config/schemas/memory-v3.ts +47 -0
- package/src/config/schemas/memory.ts +6 -1
- package/src/config/schemas/platform.ts +8 -0
- package/src/config/schemas/timeouts.ts +3 -1
- package/src/config/seed-inference-profiles.ts +2 -2
- package/src/config/skills.ts +13 -0
- package/src/context/compactor.ts +55 -32
- package/src/context/strip-injections.ts +128 -0
- package/src/context/token-estimator.ts +42 -0
- package/src/context/tool-result-truncation.ts +1 -66
- package/src/context/window-manager.ts +141 -26
- 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__/conversation-surfaces-launch.test.ts +2 -2
- 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/__tests__/web-search-status-text.test.ts +10 -6
- package/src/daemon/approval-generators.ts +4 -4
- package/src/daemon/assistant-attachments.ts +1 -1
- package/src/daemon/config-watcher.ts +7 -1
- package/src/daemon/context-overflow-reducer.ts +0 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +793 -215
- package/src/daemon/conversation-agent-loop.ts +487 -1478
- package/src/daemon/conversation-error.ts +7 -7
- package/src/daemon/conversation-history.ts +27 -10
- package/src/daemon/conversation-launch.ts +4 -8
- package/src/daemon/conversation-lifecycle.ts +13 -42
- package/src/daemon/conversation-messaging.ts +8 -9
- package/src/daemon/conversation-notifiers.ts +7 -5
- package/src/daemon/conversation-process.ts +109 -93
- package/src/daemon/conversation-registry.ts +159 -0
- package/src/daemon/conversation-runtime-assembly.ts +209 -382
- package/src/daemon/conversation-slash.ts +6 -25
- package/src/daemon/conversation-store.ts +15 -95
- package/src/daemon/conversation-surfaces.ts +277 -73
- package/src/daemon/conversation-tool-setup.ts +5 -29
- package/src/daemon/conversation-workspace.ts +17 -0
- package/src/daemon/conversation.ts +123 -146
- package/src/daemon/daemon-skill-host.ts +2 -6
- package/src/daemon/disk-pressure-guard.ts +35 -29
- package/src/daemon/external-plugins-bootstrap.ts +53 -32
- package/src/daemon/first-greeting.ts +26 -4
- package/src/daemon/guardian-action-generators.ts +2 -2
- 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 +9 -23
- package/src/daemon/handlers/shared.ts +158 -82
- package/src/daemon/handlers/skills.ts +53 -20
- package/src/daemon/host-app-control-proxy.ts +54 -1
- package/src/daemon/host-cu-proxy.ts +46 -22
- package/src/daemon/host-file-proxy.ts +25 -1
- package/src/daemon/host-proxy-preactivation.ts +25 -6
- package/src/daemon/lifecycle.ts +53 -55
- package/src/daemon/message-protocol.ts +2 -3
- package/src/daemon/message-provenance.ts +49 -0
- package/src/daemon/message-types/apps.ts +1 -29
- package/src/daemon/message-types/contacts.ts +3 -20
- package/src/daemon/message-types/conversations.ts +13 -111
- package/src/daemon/message-types/documents.ts +3 -9
- package/src/daemon/message-types/home.ts +4 -17
- package/src/daemon/message-types/integrations.ts +2 -6
- package/src/daemon/message-types/messages.ts +37 -400
- package/src/daemon/message-types/notifications.ts +2 -32
- package/src/daemon/message-types/settings.ts +3 -8
- package/src/daemon/message-types/skills.ts +4 -0
- package/src/daemon/message-types/surfaces.ts +138 -3
- package/src/daemon/message-types/sync.ts +12 -25
- package/src/daemon/message-types/workspace.ts +3 -11
- 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 +50 -49
- package/src/daemon/server.ts +14 -0
- package/src/daemon/tool-side-effects.ts +10 -7
- package/src/daemon/trace-emitter.ts +6 -4
- package/src/daemon/trust-context.ts +32 -0
- package/src/daemon/wake-target-adapter.ts +14 -2
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +6 -1
- package/src/heartbeat/heartbeat-run-store.ts +54 -1
- package/src/heartbeat/heartbeat-service.ts +42 -0
- package/src/home/feed-types.ts +36 -221
- package/src/home/home-greeting-cache.ts +24 -1
- package/src/ipc/__tests__/browser-ipc.test.ts +1 -1
- package/src/ipc/__tests__/email-ipc.test.ts +0 -9
- 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/routes/__tests__/route-adapter.test.ts +244 -0
- package/src/ipc/routes/route-adapter.ts +45 -6
- package/src/ipc/skill-routes/__tests__/memory.test.ts +33 -9
- package/src/ipc/skill-routes/__tests__/providers.test.ts +10 -10
- package/src/ipc/skill-routes/__tests__/registries.test.ts +28 -18
- package/src/ipc/skill-routes/memory.ts +29 -14
- package/src/ipc/skill-routes/providers.ts +5 -6
- package/src/ipc/skill-routes/registries.ts +13 -61
- package/src/live-voice/__tests__/live-voice-archive.test.ts +24 -11
- 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__/conversation-queries.test.ts +192 -8
- package/src/memory/__tests__/db-maintenance.test.ts +128 -0
- package/src/memory/__tests__/jobs-store-job-classes.test.ts +5 -4
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +56 -0
- package/src/memory/__tests__/memory-retrospective-job.test.ts +10 -6
- package/src/memory/__tests__/memory-v3-selections-migration.test.ts +103 -0
- package/src/memory/auth-fallback-events-store.ts +94 -0
- package/src/memory/context-search/agent-runner.ts +2 -4
- package/src/memory/conversation-crud.ts +39 -8
- package/src/memory/conversation-queries.ts +78 -22
- package/src/memory/conversation-starter-checkpoints.ts +1 -0
- package/src/memory/conversation-title-service.ts +65 -41
- package/src/memory/db-init.ts +14 -0
- package/src/memory/db-maintenance.ts +18 -2
- package/src/memory/graph/__tests__/conversation-graph-memory-registry.test.ts +119 -0
- package/src/memory/graph/consolidation.ts +8 -11
- package/src/memory/graph/conversation-graph-memory.ts +106 -8
- package/src/memory/graph/extraction.ts +6 -9
- package/src/memory/graph/narrative.ts +2 -2
- package/src/memory/graph/pattern-scan.ts +2 -2
- package/src/memory/graph/retriever.ts +20 -26
- package/src/memory/graph/tools.ts +4 -4
- package/src/memory/job-handlers/conversation-starters.ts +45 -34
- package/src/memory/job-handlers/summarization.ts +1 -2
- package/src/memory/jobs-store.ts +36 -1
- package/src/memory/jobs-worker.ts +82 -43
- package/src/memory/llm-request-log-source-clickhouse.ts +5 -31
- package/src/memory/llm-request-log-source-local.ts +0 -11
- package/src/memory/llm-request-log-source.ts +9 -25
- package/src/memory/llm-request-log-store.ts +0 -41
- package/src/memory/llm-usage-store.ts +234 -50
- package/src/memory/memory-marker.ts +17 -0
- package/src/memory/memory-retrospective-job.ts +6 -2
- package/src/memory/memory-v2-activation-log-store.ts +1 -83
- package/src/memory/migrations/222-strip-placeholder-sentinels-from-messages.ts +6 -5
- package/src/memory/migrations/267-llm-usage-events-add-assistant-version.ts +46 -0
- package/src/memory/migrations/268-add-memory-v3-selections.ts +28 -0
- package/src/memory/migrations/269-schedule-script-timeout.ts +11 -0
- package/src/memory/migrations/270-messages-role-created-at-index.ts +18 -0
- 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/__tests__/267-llm-usage-events-add-assistant-version.test.ts +117 -0
- package/src/memory/migrations/index.ts +7 -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 +27 -0
- package/src/memory/usage-grouped-buckets.ts +6 -1
- package/src/memory/v2/__tests__/consolidation-job.test.ts +125 -1
- package/src/memory/v2/__tests__/migration.test.ts +11 -3
- package/src/memory/v2/__tests__/page-index.test.ts +37 -1
- package/src/memory/v2/__tests__/router.test.ts +14 -4
- package/src/memory/v2/__tests__/sweep-job.test.ts +6 -5
- package/src/memory/v2/backfill-jobs.ts +6 -0
- package/src/memory/v2/consolidation-job.ts +99 -10
- package/src/memory/v2/migration.ts +5 -3
- package/src/memory/v2/page-index.ts +11 -0
- package/src/memory/v2/router.ts +8 -11
- package/src/memory/v2/sweep-job.ts +8 -11
- package/src/memory/v2/types.ts +1 -0
- package/src/messaging/providers/slack/render-transcript.test.ts +1 -1
- package/src/messaging/providers/slack/render-transcript.ts +2 -2
- package/src/messaging/style-analyzer.ts +8 -11
- package/src/notifications/conversation-pairing.ts +8 -13
- package/src/notifications/decision-engine.ts +16 -16
- package/src/notifications/home-feed-side-effect.ts +12 -1
- package/src/notifications/preference-extractor.ts +11 -14
- package/src/permissions/prompter.ts +46 -36
- package/src/permissions/question-prompter.test.ts +35 -26
- package/src/permissions/question-prompter.ts +6 -10
- package/src/plugin-api/constants.ts +4 -0
- package/src/plugin-api/index.ts +10 -1
- package/src/plugin-api/types.ts +176 -4
- package/src/plugins/defaults/compaction/compact.ts +59 -0
- package/src/plugins/defaults/compaction/package.json +15 -0
- package/src/plugins/defaults/compaction/register.ts +24 -0
- package/src/plugins/defaults/empty-response/hooks/stop.ts +126 -0
- package/src/plugins/defaults/empty-response/package.json +15 -0
- package/src/plugins/defaults/empty-response/register.ts +23 -0
- package/src/plugins/defaults/history-repair/hooks/user-prompt-submit.ts +35 -0
- package/src/plugins/defaults/history-repair/package.json +15 -0
- package/src/plugins/defaults/history-repair/register.ts +24 -0
- package/src/{daemon/history-repair.ts → plugins/defaults/history-repair/terminal.ts} +48 -35
- package/src/plugins/defaults/index.ts +22 -49
- 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.ts → memory-retrieval/injectors.ts} +295 -112
- package/src/plugins/defaults/memory-v3-shadow/__tests__/assign.test.ts +242 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/capabilities.test.ts +118 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/core.test.ts +39 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/fixtures/eval-turns.json +36 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/fixtures/live-turns.json +37 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/health.test.ts +219 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/live-integration.test.ts +330 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/maintain-job.test.ts +288 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/needle.test.ts +107 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/orchestrate.test.ts +436 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/provider-blocks.test.ts +13 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/reconcile.test.ts +274 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/render-injection.test.ts +61 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/router.test.ts +332 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/selection-log-store.test.ts +179 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/selector.test.ts +470 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-plugin.test.ts +432 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/snapshot.test.ts +168 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/tree.test.ts +192 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/types.test.ts +54 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/working-set-eviction.test.ts +106 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/working-set-skeleton.test.ts +44 -0
- package/src/plugins/defaults/memory-v3-shadow/assign.ts +268 -0
- package/src/plugins/defaults/memory-v3-shadow/capabilities.ts +124 -0
- package/src/plugins/defaults/memory-v3-shadow/core.ts +26 -0
- package/src/plugins/defaults/memory-v3-shadow/data/README.md +84 -0
- package/src/plugins/defaults/memory-v3-shadow/data/assignments.json +5 -0
- package/src/plugins/defaults/memory-v3-shadow/data/core.json +1 -0
- package/src/plugins/defaults/memory-v3-shadow/data/leaves/domain-a/topic-x.md +9 -0
- package/src/plugins/defaults/memory-v3-shadow/data/leaves/domain-a/topic-y.md +9 -0
- package/src/plugins/defaults/memory-v3-shadow/data/leaves/domain-b/topic-z.md +9 -0
- package/src/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/plugins/defaults/memory-v3-shadow/maintain-job.ts +314 -0
- package/src/plugins/defaults/memory-v3-shadow/needle.ts +115 -0
- package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +126 -0
- package/src/plugins/defaults/memory-v3-shadow/package.json +15 -0
- package/src/plugins/defaults/memory-v3-shadow/page-content.ts +34 -0
- package/src/plugins/defaults/memory-v3-shadow/provider-blocks.ts +26 -0
- package/src/plugins/defaults/memory-v3-shadow/reconcile.ts +523 -0
- package/src/plugins/defaults/memory-v3-shadow/register.ts +26 -0
- package/src/plugins/defaults/memory-v3-shadow/render-injection.ts +32 -0
- package/src/plugins/defaults/memory-v3-shadow/router.ts +190 -0
- package/src/plugins/defaults/memory-v3-shadow/selection-log-store.ts +84 -0
- package/src/plugins/defaults/memory-v3-shadow/selector.ts +226 -0
- package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +349 -0
- package/src/plugins/defaults/memory-v3-shadow/snapshot.ts +209 -0
- package/src/plugins/defaults/memory-v3-shadow/tree.ts +174 -0
- package/src/plugins/defaults/memory-v3-shadow/types.ts +59 -0
- package/src/plugins/defaults/memory-v3-shadow/working-set.ts +88 -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 +15 -0
- package/src/plugins/defaults/title-generate/register.ts +35 -0
- package/src/plugins/defaults/tool-error/hooks/post-tool-use.ts +118 -0
- package/src/plugins/defaults/tool-error/package.json +15 -0
- package/src/plugins/defaults/tool-error/register.ts +23 -0
- package/src/plugins/defaults/tool-result-truncate/hooks/post-tool-use.ts +32 -0
- package/src/plugins/defaults/tool-result-truncate/package.json +15 -0
- package/src/plugins/defaults/tool-result-truncate/register.ts +24 -0
- package/src/plugins/defaults/tool-result-truncate/terminal.ts +132 -0
- package/src/plugins/external-plugin-loader.ts +2 -2
- package/src/plugins/pipeline.ts +8 -35
- package/src/plugins/registry.ts +8 -25
- package/src/plugins/types.ts +62 -721
- package/src/plugins/user-loader.ts +4 -3
- package/src/proactive-artifact/aux-message-injector.ts +4 -5
- package/src/proactive-artifact/job.test.ts +28 -21
- package/src/proactive-artifact/job.ts +3 -1
- package/src/prompts/__tests__/system-prompt.test.ts +42 -0
- package/src/prompts/sections.ts +20 -7
- package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +64 -0
- package/src/prompts/templates/BOOTSTRAP-CONTENT-AUTOMATION.md +2 -2
- package/src/prompts/templates/BOOTSTRAP.md +7 -3
- package/src/prompts/templates/system-sections.ts +21 -0
- package/src/providers/__tests__/retry-callsite.test.ts +25 -25
- package/src/providers/__tests__/satellite-connection-routing.test.ts +7 -21
- package/src/providers/anthropic/client.ts +61 -34
- package/src/providers/call-site-routing.ts +1 -9
- package/src/providers/gemini/client.ts +152 -34
- package/src/providers/gemini/inline-media.ts +74 -0
- package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +112 -2
- package/src/providers/openai/chat-completions-provider.ts +45 -4
- package/src/providers/openai/responses-provider.ts +1 -4
- package/src/providers/openrouter/client.ts +2 -6
- package/src/providers/placeholder-sentinels.ts +35 -0
- package/src/providers/provider-send-message.ts +6 -6
- package/src/providers/ratelimit.ts +1 -9
- package/src/providers/retry.ts +0 -5
- package/src/providers/types.ts +11 -2
- package/src/providers/usage-tracking.ts +1 -9
- package/src/runtime/__tests__/agent-wake.test.ts +141 -32
- package/src/runtime/__tests__/background-job-runner.test.ts +1 -3
- package/src/runtime/__tests__/interactive-ui.test.ts +1 -1
- package/src/runtime/agent-wake.ts +95 -23
- package/src/runtime/assistant-event-hub.ts +38 -8
- package/src/runtime/assistant-stream-state.ts +368 -0
- package/src/runtime/auth/__tests__/guard-tests.test.ts +75 -109
- package/src/runtime/auth/__tests__/route-policy.test.ts +153 -170
- package/src/runtime/auth/route-policy.ts +42 -1079
- package/src/runtime/background-job-runner.ts +1 -4
- package/src/runtime/btw-sidechain.ts +3 -1
- package/src/runtime/channel-approvals.ts +4 -15
- package/src/runtime/channel-invite-transport.ts +5 -6
- package/src/runtime/channel-readiness-service.ts +2 -5
- package/src/runtime/channel-retry-sweep.ts +12 -16
- package/src/runtime/http-router.ts +35 -43
- package/src/runtime/http-types.ts +23 -71
- package/src/runtime/interactive-ui.ts +1 -1
- package/src/runtime/invite-instruction-generator.ts +3 -3
- package/src/runtime/pending-interactions.ts +3 -2
- package/src/runtime/routes/__tests__/acp-routes.test.ts +253 -55
- package/src/runtime/routes/__tests__/avatar-state-routes.test.ts +565 -0
- package/src/runtime/routes/__tests__/consolidation-routes.test.ts +265 -2
- package/src/runtime/routes/__tests__/content-source-routes.test.ts +4 -4
- package/src/runtime/routes/__tests__/conversation-compaction-routes.test.ts +62 -32
- package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +237 -0
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +31 -1
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +13 -22
- package/src/runtime/routes/__tests__/memory-v2-routes.test.ts +6 -2
- package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +7 -2
- package/src/runtime/routes/__tests__/sanity-routes.test.ts +6 -6
- package/src/runtime/routes/__tests__/stt-routes.test.ts +3 -3
- package/src/runtime/routes/__tests__/suggest-trust-rule-routes.test.ts +5 -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 +9 -5
- package/src/runtime/routes/acp-routes.test.ts +186 -100
- package/src/runtime/routes/acp-routes.ts +110 -35
- package/src/runtime/routes/app-management-routes.ts +93 -131
- package/src/runtime/routes/app-routes.ts +38 -20
- package/src/runtime/routes/approval-routes.ts +17 -5
- package/src/runtime/routes/attachment-routes.ts +51 -16
- package/src/runtime/routes/audio-routes.ts +1 -0
- package/src/runtime/routes/audit-routes.ts +5 -0
- package/src/runtime/routes/auth-routes.ts +5 -0
- package/src/runtime/routes/avatar-routes.ts +264 -59
- package/src/runtime/routes/background-tool-routes.ts +9 -0
- package/src/runtime/routes/background-wake-routes.ts +13 -3
- package/src/runtime/routes/backup-routes.ts +45 -0
- package/src/runtime/routes/bookmark-routes.ts +13 -0
- package/src/runtime/routes/brain-graph-routes.ts +9 -0
- package/src/runtime/routes/browser-routes.ts +6 -1
- package/src/runtime/routes/browser-tabs-routes.ts +11 -10
- package/src/runtime/routes/btw-routes.ts +34 -24
- package/src/runtime/routes/cache-routes.ts +13 -0
- package/src/runtime/routes/call-routes.ts +21 -10
- package/src/runtime/routes/channel-availability-routes.ts +5 -1
- package/src/runtime/routes/channel-readiness-routes.ts +37 -4
- package/src/runtime/routes/channel-route-definitions.ts +21 -0
- package/src/runtime/routes/channel-verification-routes.ts +21 -0
- package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +9 -2
- package/src/runtime/routes/client-routes.ts +9 -0
- package/src/runtime/routes/consolidation-routes.ts +133 -25
- package/src/runtime/routes/contact-prompt-routes.ts +9 -0
- package/src/runtime/routes/contact-routes.ts +90 -23
- package/src/runtime/routes/content-source-routes.ts +5 -1
- package/src/runtime/routes/conversation-analysis-routes.ts +5 -1
- package/src/runtime/routes/conversation-attention-routes.ts +5 -0
- package/src/runtime/routes/conversation-cli-routes.ts +54 -7
- package/src/runtime/routes/conversation-compaction-routes.ts +54 -25
- package/src/runtime/routes/conversation-list-routes.ts +81 -12
- package/src/runtime/routes/conversation-management-routes.ts +57 -14
- package/src/runtime/routes/conversation-query-routes.ts +90 -41
- package/src/runtime/routes/conversation-routes.ts +446 -204
- package/src/runtime/routes/conversation-starter-routes.ts +35 -20
- package/src/runtime/routes/conversations-import-routes.ts +30 -8
- package/src/runtime/routes/credential-prompt-routes.ts +5 -0
- package/src/runtime/routes/credential-routes.ts +25 -6
- package/src/runtime/routes/debug-bash-routes.ts +5 -0
- package/src/runtime/routes/debug-routes.ts +11 -2
- package/src/runtime/routes/defer-routes.ts +13 -0
- package/src/runtime/routes/diagnostics-routes.ts +37 -46
- package/src/runtime/routes/disk-pressure-routes.ts +17 -31
- package/src/runtime/routes/document-comments-routes.ts +46 -27
- package/src/runtime/routes/documents-routes.ts +25 -10
- package/src/runtime/routes/domain-routes.ts +98 -51
- package/src/runtime/routes/email-routes.ts +33 -0
- package/src/runtime/routes/epoch-millis-range.ts +34 -0
- package/src/runtime/routes/events-routes.ts +107 -8
- package/src/runtime/routes/filing-routes.ts +9 -4
- package/src/runtime/routes/gateway-log-routes.ts +31 -4
- package/src/runtime/routes/global-search-routes.ts +53 -50
- package/src/runtime/routes/group-routes.ts +21 -5
- package/src/runtime/routes/guardian-action-routes.ts +9 -0
- package/src/runtime/routes/guardian-approval-interception.ts +0 -31
- package/src/runtime/routes/heartbeat-routes.ts +57 -21
- package/src/runtime/routes/home-feed-routes.ts +23 -19
- package/src/runtime/routes/home-state-routes.ts +8 -40
- package/src/runtime/routes/host-app-control-routes.ts +6 -1
- package/src/runtime/routes/host-bash-routes.ts +5 -0
- package/src/runtime/routes/host-browser-routes.ts +13 -0
- package/src/runtime/routes/host-cu-routes.ts +6 -1
- package/src/runtime/routes/host-file-routes.ts +26 -6
- package/src/runtime/routes/host-transfer-routes.ts +13 -2
- package/src/runtime/routes/http-adapter.ts +1 -2
- package/src/runtime/routes/identity-intro-cache.ts +28 -40
- package/src/runtime/routes/identity-routes.ts +236 -20
- package/src/runtime/routes/image-generation-routes.ts +45 -2
- package/src/runtime/routes/inbound-message-handler.ts +16 -12
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +0 -12
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +15 -19
- package/src/runtime/routes/index.ts +2 -0
- package/src/runtime/routes/inference-profile-session-routes.ts +13 -3
- package/src/runtime/routes/inference-provider-connection-routes.ts +21 -5
- package/src/runtime/routes/inference-send-routes.ts +11 -11
- package/src/runtime/routes/integrations/a2a.ts +32 -7
- package/src/runtime/routes/integrations/slack/__tests__/channel.test.ts +16 -0
- package/src/runtime/routes/integrations/slack/channel.ts +23 -3
- package/src/runtime/routes/integrations/slack/share.ts +36 -8
- package/src/runtime/routes/integrations/telegram.ts +34 -9
- package/src/runtime/routes/integrations/twilio.ts +77 -7
- package/src/runtime/routes/integrations/vercel.ts +3 -3
- package/src/runtime/routes/internal-oauth-routes.ts +5 -0
- package/src/runtime/routes/internal-telemetry-routes.ts +88 -0
- package/src/runtime/routes/internal-twilio-routes.ts +13 -0
- package/src/runtime/routes/llm-call-sites-routes.ts +39 -4
- package/src/runtime/routes/log-export-routes.ts +36 -10
- package/src/runtime/routes/mcp-auth-routes.ts +25 -0
- package/src/runtime/routes/memory-item-routes.ts +21 -10
- package/src/runtime/routes/memory-v2-routes.ts +105 -44
- package/src/runtime/routes/memory-v3-routes.ts +306 -408
- package/src/runtime/routes/migration-rollback-routes.ts +5 -1
- package/src/runtime/routes/migration-routes.ts +29 -0
- package/src/runtime/routes/notification-routes.ts +17 -1
- package/src/runtime/routes/oauth-apps.ts +99 -23
- package/src/runtime/routes/oauth-commands-routes.ts +37 -14
- package/src/runtime/routes/oauth-connect-routes.ts +9 -0
- package/src/runtime/routes/oauth-lifecycle-routes.ts +5 -1
- package/src/runtime/routes/oauth-providers.ts +79 -15
- package/src/runtime/routes/platform-routes.ts +102 -5
- package/src/runtime/routes/playground/__tests__/force-compact.test.ts +9 -6
- package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +37 -16
- package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +7 -3
- package/src/runtime/routes/playground/__tests__/state.test.ts +10 -3
- package/src/runtime/routes/playground/force-compact.ts +2 -2
- package/src/runtime/routes/playground/helpers.ts +1 -2
- package/src/runtime/routes/playground/inject-failures.ts +13 -8
- package/src/runtime/routes/playground/reset-circuit.ts +14 -9
- package/src/runtime/routes/playground/seed-conversation.ts +1 -1
- package/src/runtime/routes/playground/seeded-conversations.ts +3 -3
- package/src/runtime/routes/playground/state.ts +4 -3
- package/src/runtime/routes/plugins-routes.ts +22 -19
- package/src/runtime/routes/profiler-routes.ts +17 -4
- package/src/runtime/routes/ps-routes.ts +5 -0
- package/src/runtime/routes/publish-routes.ts +13 -3
- package/src/runtime/routes/question-routes.ts +5 -0
- package/src/runtime/routes/recording-routes.ts +25 -12
- package/src/runtime/routes/rename-conversation-routes.ts +10 -0
- package/src/runtime/routes/sanity-routes.ts +9 -2
- package/src/runtime/routes/schedule-routes.ts +288 -88
- package/src/runtime/routes/secret-routes.ts +31 -6
- package/src/runtime/routes/sequence-routes.ts +33 -0
- package/src/runtime/routes/settings-routes.ts +65 -19
- package/src/runtime/routes/skills-routes.ts +166 -73
- package/src/runtime/routes/slack-channel-routes.ts +5 -0
- package/src/runtime/routes/stt-routes.ts +13 -6
- package/src/runtime/routes/subagents-routes.ts +24 -18
- package/src/runtime/routes/suggest-trust-rule-routes.ts +7 -2
- package/src/runtime/routes/surface-action-routes.ts +9 -0
- package/src/runtime/routes/surface-content-routes.ts +10 -2
- package/src/runtime/routes/surface-conversation-resolver.ts +4 -3
- package/src/runtime/routes/task-routes.ts +37 -0
- package/src/runtime/routes/telemetry-routes.ts +9 -0
- 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/trace-event-routes.ts +42 -1
- package/src/runtime/routes/trust-rules-routes.ts +31 -2
- package/src/runtime/routes/tts-routes.ts +48 -6
- package/src/runtime/routes/types.ts +83 -16
- package/src/runtime/routes/ui-request-routes.ts +5 -0
- package/src/runtime/routes/upgrade-broadcast-routes.ts +5 -0
- package/src/runtime/routes/usage-routes.ts +118 -42
- package/src/runtime/routes/user-routes-cli.ts +9 -0
- package/src/runtime/routes/user-routes.ts +5 -1
- package/src/runtime/routes/wake-conversation-routes.ts +5 -0
- package/src/runtime/routes/watcher-routes.ts +21 -0
- package/src/runtime/routes/webhook-routes.ts +50 -2
- package/src/runtime/routes/wipe-conversation-routes.ts +5 -0
- package/src/runtime/routes/work-items-routes.ts +49 -23
- package/src/runtime/routes/workspace-commit-routes.ts +5 -0
- package/src/runtime/routes/workspace-routes.test.ts +42 -0
- package/src/runtime/routes/workspace-routes.ts +124 -9
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +8 -4
- package/src/runtime/services/analyze-conversation.ts +5 -8
- package/src/runtime/services/conversation-serializer.ts +24 -2
- package/src/runtime/sync/resource-sync-events.ts +16 -2
- package/src/runtime/sync/sync-publisher.ts +2 -2
- package/src/schedule/run-script.ts +28 -3
- package/src/schedule/schedule-store.ts +28 -1
- package/src/schedule/schedule-usage-store.ts +83 -0
- package/src/schedule/scheduler.ts +15 -6
- package/src/signals/cancel.ts +2 -4
- package/src/signals/user-message.ts +5 -8
- package/src/skills/catalog-files.ts +4 -1
- package/src/skills/catalog-install.ts +3 -0
- package/src/skills/categories-cache.ts +118 -0
- package/src/skills/clawhub-files.ts +1 -0
- package/src/skills/skillssh-files.ts +1 -0
- package/src/subagent/manager.ts +20 -11
- package/src/telemetry/types.ts +55 -1
- package/src/telemetry/usage-telemetry-reporter.test.ts +250 -4
- package/src/telemetry/usage-telemetry-reporter.ts +88 -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 +198 -93
- package/src/tools/acp/spawn.ts +32 -70
- package/src/tools/acp/steer.test.ts +105 -8
- package/src/tools/acp/steer.ts +48 -17
- package/src/tools/apps/definitions.ts +8 -4
- package/src/tools/apps/executors.ts +13 -8
- package/src/tools/ask-question/ask-question-tool.test.ts +120 -105
- package/src/tools/ask-question/ask-question-tool.ts +85 -90
- package/src/tools/computer-use/definitions.ts +28 -24
- package/src/tools/credential-execution/make-authenticated-request.ts +56 -51
- package/src/tools/credential-execution/manage-secure-command-tool.ts +2 -2
- package/src/tools/credential-execution/run-authenticated-command.ts +82 -77
- package/src/tools/credentials/vault.ts +112 -111
- package/src/tools/execution-target.ts +1 -1
- package/src/tools/execution-timeout.ts +3 -4
- package/src/tools/executor.ts +1 -53
- package/src/tools/filesystem/edit.ts +45 -42
- package/src/tools/filesystem/list.ts +33 -30
- package/src/tools/filesystem/read.ts +54 -35
- package/src/tools/filesystem/write.ts +69 -32
- package/src/tools/host-filesystem/edit.ts +44 -42
- package/src/tools/host-filesystem/read.ts +49 -35
- package/src/tools/host-filesystem/transfer.ts +121 -108
- package/src/tools/host-filesystem/write.ts +33 -31
- package/src/tools/host-terminal/host-shell.ts +50 -48
- package/src/tools/memory/register.ts +23 -24
- 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-fetch.ts +49 -46
- 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 +223 -61
- package/src/tools/registry.ts +39 -16
- package/src/tools/schedule/create.ts +13 -0
- package/src/tools/schedule/update.ts +16 -0
- package/src/tools/shared/filesystem/audio-read.ts +122 -0
- package/src/tools/shared/filesystem/image-read.ts +1 -1
- package/src/tools/skills/execute.ts +34 -31
- package/src/tools/skills/load.ts +29 -23
- package/src/tools/subagent/notify-parent.ts +35 -32
- package/src/tools/subagent/spawn.ts +2 -4
- package/src/tools/system/avatar-generator.ts +13 -22
- package/src/tools/system/request-permission.ts +30 -27
- package/src/tools/terminal/safe-env.ts +10 -1
- package/src/tools/terminal/shell.ts +190 -61
- package/src/tools/tool-defaults.ts +20 -9
- package/src/tools/tool-manifest.ts +4 -4
- package/src/tools/types.ts +74 -23
- package/src/tools/ui-surface/definitions.ts +99 -10
- package/src/tts/__tests__/provider-catalog-consistency.test.ts +85 -1
- package/src/tts/provider-catalog.ts +76 -1
- package/src/usage/types.ts +10 -0
- package/src/util/errors.ts +2 -2
- package/src/util/map-limit.ts +27 -0
- package/src/util/mutex.ts +47 -0
- package/src/util/platform.ts +15 -12
- package/src/work-items/work-item-runner.ts +7 -2
- package/src/workspace/git-service.ts +1 -42
- package/src/workspace/migrations/028-recover-conversations-from-disk-view.ts +7 -20
- package/src/workspace/migrations/092-backfill-v3-leaves.ts +169 -0
- package/src/workspace/migrations/093-backfill-leaf-ids.ts +144 -0
- package/src/workspace/migrations/094-seed-avatar-manifest.ts +155 -0
- 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/__tests__/094-seed-avatar-manifest.test.ts +136 -0
- package/src/workspace/migrations/__tests__/backfill-leaf-ids.test.ts +175 -0
- package/src/workspace/migrations/__tests__/backfill-v3-leaves.test.ts +124 -0
- package/src/workspace/migrations/registry.ts +12 -0
- package/src/workspace/provider-commit-message-generator.ts +15 -17
- package/tsconfig.json +4 -1
- 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 -262
- package/src/__tests__/empty-response-pipeline.test.ts +0 -301
- package/src/__tests__/history-repair-pipeline.test.ts +0 -396
- package/src/__tests__/llm-call-pipeline.test.ts +0 -281
- package/src/__tests__/memory-retrieval-pipeline.test.ts +0 -418
- package/src/__tests__/persistence-pipeline.test.ts +0 -514
- package/src/__tests__/title-generate-pipeline.test.ts +0 -211
- package/src/__tests__/token-estimate-pipeline.test.ts +0 -481
- 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 -344
- package/src/cli/commands/__tests__/memory-v3-render.test.ts +0 -340
- package/src/cli/commands/memory-v3-render.ts +0 -491
- package/src/daemon/bootstrap-turn-cleanup.ts +0 -45
- package/src/daemon/message-types/disk-pressure.ts +0 -9
- package/src/email/feature-gate.ts +0 -23
- package/src/gallery/default-gallery.ts +0 -1359
- package/src/gallery/gallery-manifest.ts +0 -28
- package/src/memory/v3/__tests__/coactivation-store.test.ts +0 -422
- package/src/memory/v3/__tests__/consolidation-job.test.ts +0 -466
- package/src/memory/v3/__tests__/coretrieval-seed.test.ts +0 -270
- package/src/memory/v3/__tests__/edge-learning-job.test.ts +0 -324
- package/src/memory/v3/__tests__/edges.test.ts +0 -706
- package/src/memory/v3/__tests__/filter.test.ts +0 -560
- package/src/memory/v3/__tests__/gate.test.ts +0 -637
- package/src/memory/v3/__tests__/index-composition.test.ts +0 -291
- package/src/memory/v3/__tests__/loop.test.ts +0 -775
- package/src/memory/v3/__tests__/retriever.test.ts +0 -226
- package/src/memory/v3/__tests__/scouts.test.ts +0 -489
- package/src/memory/v3/__tests__/shadow-diff.test.ts +0 -225
- package/src/memory/v3/__tests__/shadow-middleware.test.ts +0 -398
- package/src/memory/v3/__tests__/system-prompts.test.ts +0 -154
- package/src/memory/v3/__tests__/traversal.test.ts +0 -508
- package/src/memory/v3/__tests__/tree-index.test.ts +0 -280
- package/src/memory/v3/__tests__/tree-store.test.ts +0 -529
- package/src/memory/v3/__tests__/tree-walk.test.ts +0 -784
- package/src/memory/v3/__tests__/validate.test.ts +0 -277
- package/src/memory/v3/auto-edges.ts +0 -223
- package/src/memory/v3/coactivation-store.ts +0 -124
- package/src/memory/v3/consolidation-job.ts +0 -323
- package/src/memory/v3/coretrieval-seed.ts +0 -240
- package/src/memory/v3/edge-learning-job.ts +0 -160
- package/src/memory/v3/edges.ts +0 -286
- package/src/memory/v3/filter.ts +0 -286
- package/src/memory/v3/gate.ts +0 -349
- package/src/memory/v3/index-composition.ts +0 -126
- package/src/memory/v3/llm-capture.ts +0 -46
- package/src/memory/v3/loop.ts +0 -430
- package/src/memory/v3/maintenance.ts +0 -144
- package/src/memory/v3/prompt-context.ts +0 -33
- package/src/memory/v3/prompts/consolidation.ts +0 -458
- package/src/memory/v3/prompts/system-prompts.ts +0 -196
- package/src/memory/v3/retriever.ts +0 -33
- package/src/memory/v3/scouts.ts +0 -431
- package/src/memory/v3/shadow-diff.ts +0 -287
- package/src/memory/v3/shadow-middleware.ts +0 -347
- package/src/memory/v3/traversal.ts +0 -211
- package/src/memory/v3/tree-index.ts +0 -237
- package/src/memory/v3/tree-store.ts +0 -394
- package/src/memory/v3/tree-walk.ts +0 -356
- package/src/memory/v3/types.ts +0 -65
- package/src/memory/v3/validate.ts +0 -323
- package/src/plugins/defaults/circuit-breaker.ts +0 -141
- package/src/plugins/defaults/compaction.ts +0 -141
- package/src/plugins/defaults/empty-response.ts +0 -124
- package/src/plugins/defaults/history-repair.ts +0 -83
- package/src/plugins/defaults/llm-call.ts +0 -77
- package/src/plugins/defaults/memory-retrieval.ts +0 -219
- package/src/plugins/defaults/overflow-reduce.ts +0 -185
- package/src/plugins/defaults/persistence.ts +0 -146
- package/src/plugins/defaults/title-generate.ts +0 -90
- package/src/plugins/defaults/token-estimate.ts +0 -101
- package/src/plugins/defaults/tool-error.ts +0 -119
- package/src/plugins/defaults/tool-execute.ts +0 -87
- package/src/plugins/defaults/tool-result-truncate.ts +0 -84
- package/src/runtime/routes/__tests__/memory-v3-simulate-params.test.ts +0 -35
- package/src/skills/category-inference.ts +0 -111
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Default `emptyResponse` plugin.
|
|
3
|
-
*
|
|
4
|
-
* The plugin's middleware is a passthrough — it calls `next(args)` and returns
|
|
5
|
-
* the result unchanged. The actual decision lives in
|
|
6
|
-
* {@link defaultEmptyResponseTerminal}, which is wired in as the pipeline's
|
|
7
|
-
* `terminal` argument by the `runPipeline` call site in `agent/loop.ts`. This
|
|
8
|
-
* separation matters: the default plugin is registered before any user plugin
|
|
9
|
-
* (defaults load first in `bootstrapPlugins()`), which puts it at the
|
|
10
|
-
* OUTERMOST position of the onion chain. If the default middleware were to
|
|
11
|
-
* decide directly without calling `next`, it would shadow every
|
|
12
|
-
* later-registered plugin. Routing through `next(args)` lets user middleware
|
|
13
|
-
* participate normally.
|
|
14
|
-
*
|
|
15
|
-
* Wiring the terminal at the call site (rather than relying on the plugin to
|
|
16
|
-
* be registered) also means the loop's nudge/accept/error behavior survives
|
|
17
|
-
* configurations that boot without the default plugin — e.g. unit tests that
|
|
18
|
-
* skip `bootstrapPlugins()`.
|
|
19
|
-
*
|
|
20
|
-
* The terminal inspects the turn snapshot and returns one of:
|
|
21
|
-
*
|
|
22
|
-
* 1. `"nudge"` — the turn produced no visible text, no tool calls, follows
|
|
23
|
-
* at least one prior tool-use turn, no earlier turn in this
|
|
24
|
-
* run() has already delivered visible text, AND the retry
|
|
25
|
-
* counter is below `maxEmptyResponseRetries`. The loop
|
|
26
|
-
* appends `nudgeText` (the `<system_notice>…` message below)
|
|
27
|
-
* as a `user` turn and re-queries the model.
|
|
28
|
-
* 2. `"accept"` — every other case. The turn either legitimately ended
|
|
29
|
-
* (model said its piece earlier), is still in progress
|
|
30
|
-
* (tool calls pending), or exhausted its retry budget. The
|
|
31
|
-
* loop pushes the assistant message and continues normally.
|
|
32
|
-
*
|
|
33
|
-
* The default never returns `"error"` — that action is an escape hatch for
|
|
34
|
-
* downstream plugins (e.g. a circuit breaker) that want to surface an
|
|
35
|
-
* explicit error instead of silently absorbing an empty turn.
|
|
36
|
-
*
|
|
37
|
-
* `MAX_EMPTY_RESPONSE_RETRIES` lives in `agent/loop.ts` and is threaded into
|
|
38
|
-
* the pipeline via `EmptyResponseArgs.maxEmptyResponseRetries` so the cap is
|
|
39
|
-
* declared in one place only.
|
|
40
|
-
*/
|
|
41
|
-
|
|
42
|
-
import { registerPlugin } from "../registry.js";
|
|
43
|
-
import {
|
|
44
|
-
type EmptyResponseArgs,
|
|
45
|
-
type EmptyResponseResult,
|
|
46
|
-
type Middleware,
|
|
47
|
-
type Plugin,
|
|
48
|
-
PluginExecutionError,
|
|
49
|
-
} from "../types.js";
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Canonical nudge text. Must stay verbatim so a plugin that wraps the
|
|
53
|
-
* default cannot accidentally see a different string.
|
|
54
|
-
*
|
|
55
|
-
* Wire-compat note: this is shown to the LLM, not the user. Edits here
|
|
56
|
-
* affect model behavior but not end-user UX directly.
|
|
57
|
-
*/
|
|
58
|
-
const NUDGE_TEXT =
|
|
59
|
-
"<system_notice>Your previous response was empty. You must respond to the user with a summary of what you found or did. Do not use any tools — just respond with text.</system_notice>";
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* Terminal handler for the `emptyResponse` pipeline. Exported so tests can
|
|
63
|
-
* verify default behavior directly without going through `runPipeline`, and
|
|
64
|
-
* so `agent/loop.ts` can pass it as the `terminal` argument to `runPipeline`.
|
|
65
|
-
*/
|
|
66
|
-
export function defaultEmptyResponseTerminal(
|
|
67
|
-
args: EmptyResponseArgs,
|
|
68
|
-
): EmptyResponseResult {
|
|
69
|
-
const hasVisibleText = args.responseContent.some(
|
|
70
|
-
(block) =>
|
|
71
|
-
block.type === "text" &&
|
|
72
|
-
typeof (block as { text?: unknown }).text === "string" &&
|
|
73
|
-
(block as { text: string }).text.trim().length > 0,
|
|
74
|
-
);
|
|
75
|
-
|
|
76
|
-
const isEmptyTurn =
|
|
77
|
-
!hasVisibleText &&
|
|
78
|
-
args.toolUseBlocksLength === 0 &&
|
|
79
|
-
args.toolUseTurns > 0 &&
|
|
80
|
-
!args.priorAssistantHadVisibleText;
|
|
81
|
-
|
|
82
|
-
if (isEmptyTurn && args.emptyResponseRetries < args.maxEmptyResponseRetries) {
|
|
83
|
-
return { action: "nudge", nudgeText: NUDGE_TEXT };
|
|
84
|
-
}
|
|
85
|
-
return { action: "accept" };
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
const passthrough: Middleware<EmptyResponseArgs, EmptyResponseResult> = async (
|
|
89
|
-
args,
|
|
90
|
-
next,
|
|
91
|
-
) => next(args);
|
|
92
|
-
|
|
93
|
-
/** Singleton plugin — the registry rejects duplicate registrations by name. */
|
|
94
|
-
export const defaultEmptyResponsePlugin: Plugin = {
|
|
95
|
-
manifest: {
|
|
96
|
-
name: "default-empty-response",
|
|
97
|
-
version: "1.0.0",
|
|
98
|
-
},
|
|
99
|
-
middleware: {
|
|
100
|
-
emptyResponse: passthrough,
|
|
101
|
-
},
|
|
102
|
-
};
|
|
103
|
-
|
|
104
|
-
// Module-load side effect: register this default at import time so
|
|
105
|
-
// downstream consumers (including tests that skip `bootstrapPlugins()`)
|
|
106
|
-
// observe a populated registry by default. Idempotent via the swallowed
|
|
107
|
-
// duplicate-name check. Kept local to this module (rather than iterating
|
|
108
|
-
// an array in `defaults/index.ts`) so the registration only references
|
|
109
|
-
// the already-initialized `defaultEmptyResponsePlugin` identifier —
|
|
110
|
-
// avoiding a TDZ crash when tests `mock.module(...)` a dependency of any
|
|
111
|
-
// other default plugin and directly import this file.
|
|
112
|
-
try {
|
|
113
|
-
registerPlugin(defaultEmptyResponsePlugin);
|
|
114
|
-
} catch (err) {
|
|
115
|
-
if (
|
|
116
|
-
err instanceof PluginExecutionError &&
|
|
117
|
-
err.message.includes("already registered")
|
|
118
|
-
) {
|
|
119
|
-
// already registered — expected when both index.ts and the direct
|
|
120
|
-
// file are imported in the same process
|
|
121
|
-
} else {
|
|
122
|
-
throw err;
|
|
123
|
-
}
|
|
124
|
-
}
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Default `historyRepair` plugin.
|
|
3
|
-
*
|
|
4
|
-
* The plugin's middleware is a passthrough — it calls `next(args)` and returns
|
|
5
|
-
* the result unchanged. The actual repair lives in
|
|
6
|
-
* {@link defaultHistoryRepairTerminal}, which is wired in as the pipeline's
|
|
7
|
-
* `terminal` argument by `runPipeline` call sites in
|
|
8
|
-
* `daemon/conversation-agent-loop.ts`. This separation matters: the default
|
|
9
|
-
* plugin is registered before any user plugin (defaults load first in
|
|
10
|
-
* `bootstrapPlugins()`), which puts it at the OUTERMOST position of the onion
|
|
11
|
-
* chain. If the default middleware were to invoke the terminal directly
|
|
12
|
-
* without calling `next`, it would shadow every later-registered plugin.
|
|
13
|
-
* Routing through `next(args)` lets user middleware participate normally.
|
|
14
|
-
*
|
|
15
|
-
* Plugins that override this middleware receive both `history` and `provider`
|
|
16
|
-
* so they can route behavior per provider (e.g. strip blocks a specific
|
|
17
|
-
* provider can't handle) without reaching into ambient state.
|
|
18
|
-
*
|
|
19
|
-
* Scope: this pipeline wraps only the standard pre-run repair (`repairHistory`).
|
|
20
|
-
* The orchestrator's one-shot deep-repair fallback (`deepRepairHistory`),
|
|
21
|
-
* invoked only after a provider ordering error, intentionally bypasses the
|
|
22
|
-
* pipeline today — see the design note at the `deepRepairHistory` call site
|
|
23
|
-
* in `daemon/conversation-agent-loop.ts`.
|
|
24
|
-
*/
|
|
25
|
-
|
|
26
|
-
import { repairHistory } from "../../daemon/history-repair.js";
|
|
27
|
-
import { registerPlugin } from "../registry.js";
|
|
28
|
-
import {
|
|
29
|
-
type HistoryRepairArgs,
|
|
30
|
-
type HistoryRepairResult,
|
|
31
|
-
type Middleware,
|
|
32
|
-
type Plugin,
|
|
33
|
-
PluginExecutionError,
|
|
34
|
-
} from "../types.js";
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Terminal handler for the `historyRepair` pipeline. Exported so tests can
|
|
38
|
-
* verify default behavior directly without going through `runPipeline`, and
|
|
39
|
-
* so `daemon/conversation-agent-loop.ts` can pass it as the `terminal`
|
|
40
|
-
* argument to `runPipeline`.
|
|
41
|
-
*/
|
|
42
|
-
export function defaultHistoryRepairTerminal(
|
|
43
|
-
args: HistoryRepairArgs,
|
|
44
|
-
): HistoryRepairResult {
|
|
45
|
-
return repairHistory(args.history);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
const passthrough: Middleware<HistoryRepairArgs, HistoryRepairResult> = async (
|
|
49
|
-
args,
|
|
50
|
-
next,
|
|
51
|
-
) => next(args);
|
|
52
|
-
|
|
53
|
-
export const defaultHistoryRepairPlugin: Plugin = {
|
|
54
|
-
manifest: {
|
|
55
|
-
name: "default-history-repair",
|
|
56
|
-
version: "1.0.0",
|
|
57
|
-
},
|
|
58
|
-
middleware: {
|
|
59
|
-
historyRepair: passthrough,
|
|
60
|
-
},
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
// Module-load side effect: register this default at import time so
|
|
64
|
-
// downstream consumers (including tests that skip `bootstrapPlugins()`)
|
|
65
|
-
// observe a populated registry by default. Idempotent via the swallowed
|
|
66
|
-
// duplicate-name check. Kept local to this module (rather than iterating
|
|
67
|
-
// an array in `defaults/index.ts`) so the registration only references
|
|
68
|
-
// the already-initialized `defaultHistoryRepairPlugin` identifier —
|
|
69
|
-
// avoiding a TDZ crash when tests `mock.module(...)` a dependency of any
|
|
70
|
-
// other default plugin and directly import this file.
|
|
71
|
-
try {
|
|
72
|
-
registerPlugin(defaultHistoryRepairPlugin);
|
|
73
|
-
} catch (err) {
|
|
74
|
-
if (
|
|
75
|
-
err instanceof PluginExecutionError &&
|
|
76
|
-
err.message.includes("already registered")
|
|
77
|
-
) {
|
|
78
|
-
// already registered — expected when both index.ts and the direct
|
|
79
|
-
// file are imported in the same process
|
|
80
|
-
} else {
|
|
81
|
-
throw err;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Default `llmCall` plugin — a passthrough that declares the pipeline
|
|
3
|
-
* surface and yields to downstream middleware.
|
|
4
|
-
*
|
|
5
|
-
* The plugin system wraps every LLM request in the `llmCall` pipeline. The
|
|
6
|
-
* actual call to {@link Provider.sendMessage} lives in the `runPipeline`
|
|
7
|
-
* terminal at the call site (`agent/loop.ts`); this default's only job is to
|
|
8
|
-
* contribute the manifest (`provides.llmCall: "v1"`) so other plugins can
|
|
9
|
-
* negotiate against the pipeline surface.
|
|
10
|
-
*
|
|
11
|
-
* This plugin registers at module load — before user plugins are loaded by
|
|
12
|
-
* `bootstrapPlugins()` — so it sits at the outermost layer in
|
|
13
|
-
* `composeMiddleware`'s onion ordering. To keep user-registered middleware
|
|
14
|
-
* reachable, the middleware forwards unconditionally via `next(args)`.
|
|
15
|
-
*
|
|
16
|
-
* Registered from `daemon/external-plugins-bootstrap.ts` via a side-effect
|
|
17
|
-
* import so the plugin is present in the registry before
|
|
18
|
-
* {@link bootstrapPlugins} walks it.
|
|
19
|
-
*
|
|
20
|
-
* Design doc: `.private/plans/agent-plugin-system.md` (PR 15).
|
|
21
|
-
*/
|
|
22
|
-
|
|
23
|
-
import { registerPlugin } from "../registry.js";
|
|
24
|
-
import {
|
|
25
|
-
type LLMCallArgs,
|
|
26
|
-
type LLMCallResult,
|
|
27
|
-
type Plugin,
|
|
28
|
-
PluginExecutionError,
|
|
29
|
-
} from "../types.js";
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* The default LLM-call plugin. Its `llmCall` middleware is a passthrough that
|
|
33
|
-
* forwards to `next(args)` unchanged so any user-registered middleware
|
|
34
|
-
* (registered later, inner in the onion) still runs and the terminal at the
|
|
35
|
-
* call site performs the actual `provider.sendMessage(...)` call.
|
|
36
|
-
*
|
|
37
|
-
* Manifest declares `provides.llmCall: "v1"` so other plugins can negotiate
|
|
38
|
-
* against the pipeline surface and `requires.pluginRuntime: "v1"` to satisfy
|
|
39
|
-
* the registry's mandatory capability check.
|
|
40
|
-
*/
|
|
41
|
-
export const defaultLlmCallPlugin: Plugin = {
|
|
42
|
-
manifest: {
|
|
43
|
-
name: "default-llm-call",
|
|
44
|
-
version: "1.0.0",
|
|
45
|
-
},
|
|
46
|
-
middleware: {
|
|
47
|
-
llmCall: async function defaultLlmCall(
|
|
48
|
-
args: LLMCallArgs,
|
|
49
|
-
next,
|
|
50
|
-
_ctx,
|
|
51
|
-
): Promise<LLMCallResult> {
|
|
52
|
-
return next(args);
|
|
53
|
-
},
|
|
54
|
-
},
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
// Module-load side effect: register this default at import time so
|
|
58
|
-
// downstream consumers (including tests that skip `bootstrapPlugins()`)
|
|
59
|
-
// observe a populated registry by default. Idempotent via the swallowed
|
|
60
|
-
// duplicate-name check. Kept local to this module (rather than iterating
|
|
61
|
-
// an array in `defaults/index.ts`) so the registration only references
|
|
62
|
-
// the already-initialized `defaultLlmCallPlugin` identifier —
|
|
63
|
-
// avoiding a TDZ crash when tests `mock.module(...)` a dependency of any
|
|
64
|
-
// other default plugin and directly import this file.
|
|
65
|
-
try {
|
|
66
|
-
registerPlugin(defaultLlmCallPlugin);
|
|
67
|
-
} catch (err) {
|
|
68
|
-
if (
|
|
69
|
-
err instanceof PluginExecutionError &&
|
|
70
|
-
err.message.includes("already registered")
|
|
71
|
-
) {
|
|
72
|
-
// already registered — expected when both index.ts and the direct
|
|
73
|
-
// file are imported in the same process
|
|
74
|
-
} else {
|
|
75
|
-
throw err;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
@@ -1,219 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Default `memoryRetrieval` plugin.
|
|
3
|
-
*
|
|
4
|
-
* Encapsulates the three retrievals the agent loop performs before building
|
|
5
|
-
* the runtime-injection block for a turn:
|
|
6
|
-
*
|
|
7
|
-
* 1. **PKB context** via {@link readPkbContext} — always-loaded workspace
|
|
8
|
-
* notes (INDEX.md, essentials.md, …) that precede the user's message.
|
|
9
|
-
* 2. **NOW.md scratchpad** via {@link readNowScratchpad} — the short
|
|
10
|
-
* user-maintained note the assistant keeps up to date.
|
|
11
|
-
* 3. **Memory graph** via {@link ConversationGraphMemory.prepareMemory} —
|
|
12
|
-
* dispatches to context-load or per-turn retrieval depending on
|
|
13
|
-
* initialization state; gated on the actor being trusted (guardian).
|
|
14
|
-
*
|
|
15
|
-
* The default plugin registers a pass-through middleware so the pipeline
|
|
16
|
-
* runner always has at least one entry and downstream telemetry observes a
|
|
17
|
-
* deterministic chain. The actual retrieval runs in the terminal supplied
|
|
18
|
-
* by the agent loop; centralizing the helper here (as
|
|
19
|
-
* {@link runDefaultMemoryRetrieval}) makes it trivial for a plugin to
|
|
20
|
-
* fall back to the default behavior by calling this helper from its own
|
|
21
|
-
* middleware.
|
|
22
|
-
*
|
|
23
|
-
* See `.private/plans/agent-plugin-system.md` PR 20 for the containing
|
|
24
|
-
* milestone.
|
|
25
|
-
*/
|
|
26
|
-
|
|
27
|
-
import type { AssistantConfig } from "../../config/schema.js";
|
|
28
|
-
import {
|
|
29
|
-
readNowScratchpad,
|
|
30
|
-
readPkbContext,
|
|
31
|
-
} from "../../daemon/conversation-runtime-assembly.js";
|
|
32
|
-
import type { ServerMessage } from "../../daemon/message-protocol.js";
|
|
33
|
-
import type { ConversationGraphMemory } from "../../memory/graph/conversation-graph-memory.js";
|
|
34
|
-
import type { Message } from "../../providers/types.js";
|
|
35
|
-
import { registerPlugin } from "../registry.js";
|
|
36
|
-
import {
|
|
37
|
-
type MemoryArgs,
|
|
38
|
-
type MemoryResult,
|
|
39
|
-
type Middleware,
|
|
40
|
-
type Plugin,
|
|
41
|
-
PluginExecutionError,
|
|
42
|
-
} from "../types.js";
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Discriminator the agent loop uses to narrow `MemoryResult.memoryGraphBlocks`
|
|
46
|
-
* back into the full {@link GraphMemoryPayload} shape. Plugins that substitute
|
|
47
|
-
* their own memory blocks without setting this marker will fall through the
|
|
48
|
-
* agent loop's graph-result consumption path — which is the intended escape
|
|
49
|
-
* hatch for custom retrievers.
|
|
50
|
-
*/
|
|
51
|
-
export const DEFAULT_MEMORY_GRAPH_KIND = "default.graph" as const;
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Shape of the single block the default memory-graph retriever emits.
|
|
55
|
-
*
|
|
56
|
-
* Mirrors the object returned by
|
|
57
|
-
* {@link ConversationGraphMemory.prepareMemory} — the agent loop consumes
|
|
58
|
-
* every field downstream (PKB query vectors, metrics persistence, memory
|
|
59
|
-
* event emission). Kept as a concrete type here so both the terminal and the
|
|
60
|
-
* agent loop can share one import.
|
|
61
|
-
*/
|
|
62
|
-
export interface GraphMemoryPayload {
|
|
63
|
-
readonly kind: typeof DEFAULT_MEMORY_GRAPH_KIND;
|
|
64
|
-
readonly result: Awaited<
|
|
65
|
-
ReturnType<ConversationGraphMemory["prepareMemory"]>
|
|
66
|
-
>;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* External state the default retriever needs but the pipeline args cannot
|
|
71
|
-
* carry (conversation-scoped graph handle, event sink, live message list).
|
|
72
|
-
* Passed as a second argument to {@link runDefaultMemoryRetrieval} rather
|
|
73
|
-
* than threaded through {@link MemoryArgs} to keep the plugin-facing
|
|
74
|
-
* pipeline surface minimal.
|
|
75
|
-
*/
|
|
76
|
-
export interface DefaultMemoryRetrievalDeps {
|
|
77
|
-
/** Live message list for this turn (pre-injection). */
|
|
78
|
-
readonly messages: Message[];
|
|
79
|
-
/** Per-conversation memory graph handle. */
|
|
80
|
-
readonly graphMemory: ConversationGraphMemory;
|
|
81
|
-
/** Assistant config snapshot. */
|
|
82
|
-
readonly config: AssistantConfig;
|
|
83
|
-
/** Event sink used by the graph retriever (memory_status events). */
|
|
84
|
-
readonly onEvent: (msg: ServerMessage) => void;
|
|
85
|
-
/** True when the actor for this turn is trusted (guardian-class). */
|
|
86
|
-
readonly isTrustedActor: boolean;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* Run the default retrieval. Always returns a {@link MemoryResult}; skips
|
|
91
|
-
* the memory-graph call entirely when the actor is not trusted (matches the
|
|
92
|
-
* prior agent-loop gate).
|
|
93
|
-
*
|
|
94
|
-
* The returned `memoryGraphBlocks` is either empty (when the actor is not
|
|
95
|
-
* trusted) or a single {@link GraphMemoryPayload} wrapping the graph
|
|
96
|
-
* retriever's full output. The agent loop narrows via
|
|
97
|
-
* {@link DEFAULT_MEMORY_GRAPH_KIND} to consume it.
|
|
98
|
-
*
|
|
99
|
-
* Memory retrieval blocks the turn — there is no soft timeout here. Memory
|
|
100
|
-
* is critical context, and silently dropping it produces a worse outcome
|
|
101
|
-
* than a slower turn. Cancellation still works via `args.signal`, which is
|
|
102
|
-
* threaded into `prepareMemory`.
|
|
103
|
-
*/
|
|
104
|
-
export async function runDefaultMemoryRetrieval(
|
|
105
|
-
args: MemoryArgs,
|
|
106
|
-
deps: DefaultMemoryRetrievalDeps,
|
|
107
|
-
): Promise<MemoryResult> {
|
|
108
|
-
// NOW.md and PKB are read unconditionally — the agent loop decides
|
|
109
|
-
// whether to inject them based on first-turn / post-compaction gating.
|
|
110
|
-
const pkbContent = readPkbContext();
|
|
111
|
-
const nowContent = readNowScratchpad();
|
|
112
|
-
|
|
113
|
-
if (!deps.isTrustedActor) {
|
|
114
|
-
// Untrusted actors skip memory-graph retrieval entirely — preserves the
|
|
115
|
-
// pre-plugin gate that lived inline in `conversation-agent-loop.ts`.
|
|
116
|
-
return {
|
|
117
|
-
pkbContent,
|
|
118
|
-
nowContent,
|
|
119
|
-
memoryGraphBlocks: [],
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
const graphResult = await deps.graphMemory.prepareMemory(
|
|
124
|
-
deps.messages,
|
|
125
|
-
deps.config,
|
|
126
|
-
args.signal,
|
|
127
|
-
deps.onEvent,
|
|
128
|
-
);
|
|
129
|
-
|
|
130
|
-
const payload: GraphMemoryPayload = {
|
|
131
|
-
kind: DEFAULT_MEMORY_GRAPH_KIND,
|
|
132
|
-
result: graphResult,
|
|
133
|
-
};
|
|
134
|
-
|
|
135
|
-
return {
|
|
136
|
-
pkbContent,
|
|
137
|
-
nowContent,
|
|
138
|
-
memoryGraphBlocks: [payload],
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
/**
|
|
143
|
-
* Narrow a {@link MemoryResult} memory-graph block back into the full
|
|
144
|
-
* {@link GraphMemoryPayload} the default retriever emits. Returns `null` when
|
|
145
|
-
* the pipeline output came from a custom retriever (no blocks, or a block
|
|
146
|
-
* without the {@link DEFAULT_MEMORY_GRAPH_KIND} discriminator).
|
|
147
|
-
*
|
|
148
|
-
* The agent loop uses this helper to decide whether to run its downstream
|
|
149
|
-
* graph-result consumption path (query-vector propagation, metric
|
|
150
|
-
* persistence, memory-event emission). Custom retrievers that skip that
|
|
151
|
-
* path are expected to handle their own side effects inside their
|
|
152
|
-
* middleware.
|
|
153
|
-
*/
|
|
154
|
-
export function asDefaultGraphPayload(
|
|
155
|
-
blocks: ReadonlyArray<unknown>,
|
|
156
|
-
): GraphMemoryPayload | null {
|
|
157
|
-
const first = blocks[0];
|
|
158
|
-
if (
|
|
159
|
-
first != null &&
|
|
160
|
-
typeof first === "object" &&
|
|
161
|
-
"kind" in first &&
|
|
162
|
-
(first as { kind?: unknown }).kind === DEFAULT_MEMORY_GRAPH_KIND
|
|
163
|
-
) {
|
|
164
|
-
return first as GraphMemoryPayload;
|
|
165
|
-
}
|
|
166
|
-
return null;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
/**
|
|
170
|
-
* Default `memoryRetrieval` middleware — a pure pass-through.
|
|
171
|
-
*
|
|
172
|
-
* Keeping a real middleware registered (rather than an empty list) makes
|
|
173
|
-
* the pipeline observable in `plugin.pipeline` logs with a non-empty
|
|
174
|
-
* `chain` field and lets third-party plugins rely on the default slot
|
|
175
|
-
* being present even when nothing is overriding it. The work happens in
|
|
176
|
-
* the terminal supplied by the agent loop, which calls
|
|
177
|
-
* {@link runDefaultMemoryRetrieval}.
|
|
178
|
-
*/
|
|
179
|
-
const defaultMemoryRetrievalMiddleware: Middleware<MemoryArgs, MemoryResult> =
|
|
180
|
-
async function defaultMemoryRetrieval(args, next) {
|
|
181
|
-
return next(args);
|
|
182
|
-
};
|
|
183
|
-
|
|
184
|
-
/**
|
|
185
|
-
* Default plugin exposing the `memoryRetrieval` pipeline slot. Registered
|
|
186
|
-
* by {@link registerDefaultMemoryRetrievalPlugin} from the plugin
|
|
187
|
-
* bootstrap wiring so ordering is deterministic across boots.
|
|
188
|
-
*/
|
|
189
|
-
export const defaultMemoryRetrievalPlugin: Plugin = {
|
|
190
|
-
manifest: {
|
|
191
|
-
name: "default-memory-retrieval",
|
|
192
|
-
version: "0.0.1",
|
|
193
|
-
},
|
|
194
|
-
middleware: {
|
|
195
|
-
memoryRetrieval: defaultMemoryRetrievalMiddleware,
|
|
196
|
-
},
|
|
197
|
-
};
|
|
198
|
-
|
|
199
|
-
// Module-load side effect: register this default at import time so
|
|
200
|
-
// downstream consumers (including tests that skip `bootstrapPlugins()`)
|
|
201
|
-
// observe a populated registry by default. Idempotent via the swallowed
|
|
202
|
-
// duplicate-name check. Kept local to this module (rather than iterating
|
|
203
|
-
// an array in `defaults/index.ts`) so the registration only references
|
|
204
|
-
// the already-initialized `defaultMemoryRetrievalPlugin` identifier —
|
|
205
|
-
// avoiding a TDZ crash when tests `mock.module(...)` a dependency of any
|
|
206
|
-
// other default plugin and directly import this file.
|
|
207
|
-
try {
|
|
208
|
-
registerPlugin(defaultMemoryRetrievalPlugin);
|
|
209
|
-
} catch (err) {
|
|
210
|
-
if (
|
|
211
|
-
err instanceof PluginExecutionError &&
|
|
212
|
-
err.message.includes("already registered")
|
|
213
|
-
) {
|
|
214
|
-
// already registered — expected when both index.ts and the direct
|
|
215
|
-
// file are imported in the same process
|
|
216
|
-
} else {
|
|
217
|
-
throw err;
|
|
218
|
-
}
|
|
219
|
-
}
|
|
@@ -1,185 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Default `overflowReduce` plugin — extracted verbatim from the inline
|
|
3
|
-
* preflight reducer loop that previously lived in
|
|
4
|
-
* `daemon/conversation-agent-loop.ts` (the `while (preflightAttempts < …)`
|
|
5
|
-
* block around lines 1045–1156 before PR 23).
|
|
6
|
-
*
|
|
7
|
-
* The plugin owns the reducer tier-loop (forced compaction, tool-result
|
|
8
|
-
* truncation, media stubbing, injection downgrade) and the post-step
|
|
9
|
-
* re-injection / re-estimation dance. Orchestrator-specific coupling
|
|
10
|
-
* (activity emission, circuit-breaker tracking, compaction-result
|
|
11
|
-
* application, runtime injection reassembly) is threaded in through the
|
|
12
|
-
* callbacks carried on {@link OverflowReduceArgs}; the plugin itself has no
|
|
13
|
-
* access to the agent-loop context object.
|
|
14
|
-
*
|
|
15
|
-
* The forced-compaction tier runs through the orchestrator-supplied
|
|
16
|
-
* `compactFn`, which routes into the `compaction` plugin pipeline so
|
|
17
|
-
* registered compaction middleware observes reducer-initiated invocations
|
|
18
|
-
* alongside the orchestrator-owned call sites. Non-compaction tiers
|
|
19
|
-
* (tool-result truncation, media stubbing, injection downgrade) remain
|
|
20
|
-
* in-process: they mutate message arrays directly without crossing a
|
|
21
|
-
* pipeline boundary. The reducer itself runs under the `overflowReduce`
|
|
22
|
-
* pipeline, so the full layering is `overflowReduce` → reducer tier loop
|
|
23
|
-
* → (for the forced-compaction tier only) nested `compaction` pipeline.
|
|
24
|
-
*/
|
|
25
|
-
|
|
26
|
-
import type { ContextWindowCompactOptions } from "../../context/window-manager.js";
|
|
27
|
-
import {
|
|
28
|
-
createInitialReducerState,
|
|
29
|
-
reduceContextOverflow,
|
|
30
|
-
type ReducerState,
|
|
31
|
-
} from "../../daemon/context-overflow-reducer.js";
|
|
32
|
-
import { registerPlugin } from "../registry.js";
|
|
33
|
-
import {
|
|
34
|
-
type Middleware,
|
|
35
|
-
type OverflowReduceArgs,
|
|
36
|
-
type OverflowReduceResult,
|
|
37
|
-
type Plugin,
|
|
38
|
-
PluginExecutionError,
|
|
39
|
-
} from "../types.js";
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Default middleware — implements the historical tier-loop semantics.
|
|
43
|
-
*
|
|
44
|
-
* The middleware intentionally ignores `next`. Overflow reduction is a
|
|
45
|
-
* *terminal* behavior: there is no downstream implementation to defer to
|
|
46
|
-
* when a user-supplied middleware short-circuits. Later plugins may still
|
|
47
|
-
* wrap this one (outer middleware can observe each reduction iteration via
|
|
48
|
-
* their own `next` callback) but the default never delegates to a
|
|
49
|
-
* hypothetical base handler — the inline loop was the base.
|
|
50
|
-
*/
|
|
51
|
-
export const defaultOverflowReduceMiddleware: Middleware<
|
|
52
|
-
OverflowReduceArgs,
|
|
53
|
-
OverflowReduceResult
|
|
54
|
-
> = async function defaultOverflowReduceMiddleware(args, _next, _ctx) {
|
|
55
|
-
let messages = args.messages;
|
|
56
|
-
let runMessages = args.runMessages;
|
|
57
|
-
let injectionMode: "full" | "minimal" = "full";
|
|
58
|
-
let reducerState: ReducerState = createInitialReducerState();
|
|
59
|
-
let reducerCompacted = false;
|
|
60
|
-
let attempts = 0;
|
|
61
|
-
|
|
62
|
-
while (attempts < args.maxAttempts && !reducerState.exhausted) {
|
|
63
|
-
// Abort check at the top of every iteration. When the pipeline runner
|
|
64
|
-
// arms a timeout (or the caller aborts externally), `args.abortSignal`
|
|
65
|
-
// is linked to that trigger via `linkAbortSignal`, so this check lets
|
|
66
|
-
// us bail out BETWEEN iterations rather than letting another round of
|
|
67
|
-
// compaction / re-injection mutate `ctx.messages` after the turn has
|
|
68
|
-
// already failed. Individual `reduceContextOverflow` calls also honor
|
|
69
|
-
// the signal, but without this gate a fresh iteration could still
|
|
70
|
-
// start after the signal fires, since the previous one returned
|
|
71
|
-
// normally before the abort propagated.
|
|
72
|
-
args.abortSignal?.throwIfAborted();
|
|
73
|
-
|
|
74
|
-
attempts++;
|
|
75
|
-
args.emitActivityState();
|
|
76
|
-
|
|
77
|
-
const basisMessages = messages;
|
|
78
|
-
const step = await reduceContextOverflow(
|
|
79
|
-
basisMessages,
|
|
80
|
-
{
|
|
81
|
-
providerName: args.providerName,
|
|
82
|
-
systemPrompt: args.systemPrompt,
|
|
83
|
-
contextWindow: args.contextWindow,
|
|
84
|
-
targetTokens: args.preflightBudget,
|
|
85
|
-
toolTokenBudget: args.toolTokenBudget,
|
|
86
|
-
},
|
|
87
|
-
reducerState,
|
|
88
|
-
(msgs, signal, opts: ContextWindowCompactOptions) =>
|
|
89
|
-
args.compactFn(msgs, signal, opts),
|
|
90
|
-
args.abortSignal,
|
|
91
|
-
);
|
|
92
|
-
|
|
93
|
-
reducerState = step.state;
|
|
94
|
-
messages = step.messages;
|
|
95
|
-
injectionMode = step.state.injectionMode;
|
|
96
|
-
|
|
97
|
-
// Per-iteration compaction flag: whether THIS step just produced a
|
|
98
|
-
// fresh compaction. PKB / NOW re-injection is gated on this — see the
|
|
99
|
-
// reinjectForMode JSDoc for why the two signals differ.
|
|
100
|
-
const stepCompacted = step.compactionResult?.compacted === true;
|
|
101
|
-
|
|
102
|
-
// Let the orchestrator apply compaction side effects (circuit-breaker
|
|
103
|
-
// tracking, event emission, ctx mutation) before we re-inject.
|
|
104
|
-
if (step.compactionResult) {
|
|
105
|
-
await args.onCompactionResult(step.compactionResult, basisMessages);
|
|
106
|
-
if (stepCompacted) {
|
|
107
|
-
reducerCompacted = true;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// Second abort gate — if the side effects or the step itself took us
|
|
112
|
-
// past the deadline, don't rebuild runMessages or iterate again.
|
|
113
|
-
args.abortSignal?.throwIfAborted();
|
|
114
|
-
|
|
115
|
-
// Rebuild runMessages via the orchestrator-supplied helper (which
|
|
116
|
-
// re-runs `applyRuntimeInjections` with potentially downgraded mode
|
|
117
|
-
// and freshly re-hydrated PKB/NOW blocks after compaction). We pass
|
|
118
|
-
// the current reduced `messages` explicitly so the orchestrator never
|
|
119
|
-
// has to read from mutable shared state to rebuild runMessages — a
|
|
120
|
-
// tier that doesn't trigger compaction (tool-result truncation, media
|
|
121
|
-
// stubbing) won't update `ctx.messages` on its own.
|
|
122
|
-
//
|
|
123
|
-
// `stepCompacted` and `reducerCompacted` are both passed so the
|
|
124
|
-
// orchestrator can gate PKB / NOW re-injection per-iteration while
|
|
125
|
-
// keeping `slackChronologicalMessages` suppressed once any iteration
|
|
126
|
-
// has compacted.
|
|
127
|
-
runMessages = await args.reinjectForMode(
|
|
128
|
-
messages,
|
|
129
|
-
injectionMode,
|
|
130
|
-
stepCompacted,
|
|
131
|
-
reducerCompacted,
|
|
132
|
-
);
|
|
133
|
-
|
|
134
|
-
// Re-estimate with injections included — `step.estimatedTokens` was
|
|
135
|
-
// computed on bare history and doesn't account for tokens added by
|
|
136
|
-
// runtime injections.
|
|
137
|
-
const postInjectionTokens = args.estimatePostInjection(runMessages);
|
|
138
|
-
if (postInjectionTokens <= args.preflightBudget) break;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
return {
|
|
142
|
-
messages,
|
|
143
|
-
runMessages,
|
|
144
|
-
injectionMode,
|
|
145
|
-
reducerState,
|
|
146
|
-
reducerCompacted,
|
|
147
|
-
attempts,
|
|
148
|
-
};
|
|
149
|
-
};
|
|
150
|
-
|
|
151
|
-
/**
|
|
152
|
-
* The default plugin registered at bootstrap. No `init`/`onShutdown` —
|
|
153
|
-
* registering the middleware is the only behavior.
|
|
154
|
-
*/
|
|
155
|
-
export const defaultOverflowReducePlugin: Plugin = {
|
|
156
|
-
manifest: {
|
|
157
|
-
name: "default-overflow-reduce",
|
|
158
|
-
version: "1.0.0",
|
|
159
|
-
},
|
|
160
|
-
middleware: {
|
|
161
|
-
overflowReduce: defaultOverflowReduceMiddleware,
|
|
162
|
-
},
|
|
163
|
-
};
|
|
164
|
-
|
|
165
|
-
// Module-load side effect: register this default at import time so
|
|
166
|
-
// downstream consumers (including tests that skip `bootstrapPlugins()`)
|
|
167
|
-
// observe a populated registry by default. Idempotent via the swallowed
|
|
168
|
-
// duplicate-name check. Kept local to this module (rather than iterating
|
|
169
|
-
// an array in `defaults/index.ts`) so the registration only references
|
|
170
|
-
// the already-initialized `defaultOverflowReducePlugin` identifier —
|
|
171
|
-
// avoiding a TDZ crash when tests `mock.module(...)` a dependency of any
|
|
172
|
-
// other default plugin and directly import this file.
|
|
173
|
-
try {
|
|
174
|
-
registerPlugin(defaultOverflowReducePlugin);
|
|
175
|
-
} catch (err) {
|
|
176
|
-
if (
|
|
177
|
-
err instanceof PluginExecutionError &&
|
|
178
|
-
err.message.includes("already registered")
|
|
179
|
-
) {
|
|
180
|
-
// already registered — expected when both index.ts and the direct
|
|
181
|
-
// file are imported in the same process
|
|
182
|
-
} else {
|
|
183
|
-
throw err;
|
|
184
|
-
}
|
|
185
|
-
}
|