@vellumai/assistant 0.8.6 → 0.8.7
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 +1 -0
- package/bun.lock +11 -2
- package/docker-entrypoint.sh +8 -6
- package/docs/plugins.md +63 -28
- package/examples/plugins/echo/register.ts +4 -7
- 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/skill-host.ts +6 -2
- package/openapi.yaml +3735 -353
- package/package.json +7 -3
- package/scripts/generate-openapi.ts +20 -13
- package/src/__tests__/agent-loop-callsite-precedence.test.ts +42 -80
- package/src/__tests__/agent-loop-exit-reason.test.ts +240 -39
- 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 +6 -4
- package/src/__tests__/agent-loop-thinking.test.ts +17 -12
- package/src/__tests__/agent-loop.test.ts +207 -341
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +4 -2
- package/src/__tests__/agent-wake-override-profile.test.ts +22 -40
- package/src/__tests__/anthropic-provider.test.ts +201 -55
- package/src/__tests__/app-builder-skill-instructions.test.ts +22 -0
- package/src/__tests__/app-control-flow.test.ts +5 -0
- package/src/__tests__/approval-cascade.test.ts +4 -11
- package/src/__tests__/approval-routes-http.test.ts +4 -2
- package/src/__tests__/assistant-event.test.ts +15 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +2 -2
- 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__/btw-routes.test.ts +7 -12
- 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 +48 -20
- package/src/__tests__/channel-approvals.test.ts +3 -1
- 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__/circuit-breaker-pipeline.test.ts +3 -3
- package/src/__tests__/clawhub-files.test.ts +1 -0
- package/src/__tests__/compaction-events.test.ts +5 -17
- package/src/__tests__/compaction-pipeline.test.ts +1 -1
- package/src/__tests__/compaction-timeout-recovery.test.ts +37 -48
- package/src/__tests__/compaction-trail-store.test.ts +1 -79
- 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 +14 -7
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +3 -2
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +12 -27
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +430 -90
- package/src/__tests__/conversation-agent-loop.test.ts +581 -62
- package/src/__tests__/conversation-analysis-routes.test.ts +1 -3
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +1 -1
- 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-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 +34 -4
- package/src/__tests__/conversation-pre-run-repair.test.ts +1 -1
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +4 -0
- package/src/__tests__/conversation-process-callsite.test.ts +27 -30
- package/src/__tests__/conversation-provider-retry-repair.test.ts +53 -44
- package/src/__tests__/conversation-queue.test.ts +270 -164
- package/src/__tests__/conversation-routes-disk-view.test.ts +3 -2
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +2 -2
- package/src/__tests__/conversation-routes-slash-commands.test.ts +2 -2
- package/src/__tests__/conversation-runtime-assembly.test.ts +20 -22
- package/src/__tests__/conversation-runtime-workspace.test.ts +19 -1
- package/src/__tests__/conversation-slash-queue.test.ts +37 -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-stream-state.test.ts +484 -0
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +6 -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-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 +3 -1
- package/src/__tests__/conversation-workspace-injection.test.ts +48 -22
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +27 -7
- 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 +6 -2
- package/src/__tests__/cu-unified-flow.test.ts +26 -1
- package/src/__tests__/db-schedule-syntax-migration.test.ts +11 -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 +7 -2
- package/src/__tests__/dynamic-page-surface.test.ts +68 -0
- package/src/__tests__/edit-propagation.test.ts +1 -2
- package/src/__tests__/empty-response-pipeline.test.ts +127 -5
- package/src/__tests__/filing-service.test.ts +2 -2
- package/src/__tests__/first-greeting.test.ts +55 -14
- package/src/__tests__/gemini-inline-media.test.ts +78 -0
- package/src/__tests__/gemini-provider.test.ts +351 -28
- package/src/__tests__/guardian-routing-state.test.ts +60 -71
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +9 -7
- package/src/__tests__/heartbeat-disk-pressure.test.ts +1 -0
- package/src/__tests__/heartbeat-service.test.ts +2 -1
- package/src/__tests__/history-repair-hook.test.ts +161 -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-cu-proxy.test.ts +2 -0
- 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 +35 -14
- package/src/__tests__/inbound-slack-persistence.test.ts +7 -2
- package/src/__tests__/injector-background-turn.test.ts +1 -1
- package/src/__tests__/injector-chain.test.ts +1 -1
- package/src/__tests__/injector-disk-pressure.test.ts +1 -1
- package/src/__tests__/injector-document-comments.test.ts +1 -1
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +1 -1
- package/src/__tests__/injector-v3-suppression.test.ts +220 -0
- package/src/__tests__/list-messages-attachments.test.ts +7 -8
- package/src/__tests__/list-messages-hidden-metadata.test.ts +17 -15
- package/src/__tests__/list-messages-page-latest.test.ts +0 -1
- package/src/__tests__/list-messages-tool-merge.test.ts +36 -6
- package/src/__tests__/llm-call-pipeline.test.ts +21 -15
- 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 +45 -0
- 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-pipeline.test.ts +1 -1
- package/src/__tests__/memory-v2-static-injector.test.ts +1 -1
- 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 +14 -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 +10 -0
- package/src/__tests__/openai-provider.test.ts +66 -70
- 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 +2 -4
- package/src/__tests__/parallel-tool.benchmark.test.ts +24 -36
- package/src/__tests__/persistence-pipeline.test.ts +15 -26
- package/src/__tests__/persistence-secret-redaction.test.ts +2 -1
- package/src/__tests__/pipeline-runner.test.ts +2 -3
- package/src/__tests__/plugin-bootstrap.test.ts +51 -25
- 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 +7 -14
- 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 +30 -42
- 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__/relay-server.test.ts +20 -13
- 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 +353 -0
- package/src/__tests__/schedule-routes.test.ts +80 -10
- package/src/__tests__/schedule-store.test.ts +67 -0
- package/src/__tests__/schedule-tools.test.ts +125 -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 +2 -1
- package/src/__tests__/shell-observability.test.ts +249 -0
- package/src/__tests__/skill-feature-flags-integration.test.ts +11 -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 +2 -2
- 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 +54 -0
- package/src/__tests__/terminal-tools.test.ts +3 -24
- package/src/__tests__/thread-backfill.test.ts +4 -9
- package/src/__tests__/title-generate-pipeline.test.ts +1 -1
- package/src/__tests__/token-estimate-pipeline.test.ts +2 -4
- package/src/__tests__/tool-error-pipeline.test.ts +2 -2
- package/src/__tests__/tool-execute-pipeline.test.ts +1 -1
- package/src/__tests__/tool-preview-lifecycle.test.ts +13 -11
- package/src/__tests__/tool-result-truncate-pipeline.test.ts +9 -12
- package/src/__tests__/tool-result-truncation.test.ts +3 -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__/voice-scoped-grant-consumer.test.ts +8 -6
- package/src/__tests__/voice-session-bridge.test.ts +13 -7
- package/src/acp/__tests__/prepare-agent-env.test.ts +143 -31
- package/src/acp/prepare-agent-env.ts +52 -11
- package/src/agent/compaction-circuit.ts +140 -0
- package/src/agent/loop.ts +409 -85
- 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-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-result.ts +129 -0
- package/src/api/events/tool-use-start.ts +8 -10
- 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 +354 -0
- package/src/api/requests/dictation.ts +45 -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 +6 -9
- package/src/avatar/__tests__/avatar-manifest.test.ts +236 -0
- package/src/avatar/__tests__/avatar-store.test.ts +193 -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 +4 -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/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/lib/cli-colors.ts +24 -6
- package/src/cli/program.ts +4 -5
- package/src/config/__tests__/feature-flag-registry-guard.test.ts +2 -2
- package/src/config/assistant-feature-flags.ts +2 -2
- package/src/config/bundled-skills/app-builder/SKILL.md +14 -3
- package/src/config/bundled-skills/media-processing/services/reduce.ts +6 -9
- 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/call-site-defaults.ts +2 -7
- package/src/config/feature-flag-registry.json +25 -9
- package/src/config/schemas/__tests__/memory-v2.test.ts +1 -226
- package/src/config/schemas/call-site-catalog.ts +8 -15
- package/src/config/schemas/llm.ts +2 -3
- package/src/config/schemas/memory-lifecycle.ts +24 -0
- package/src/config/schemas/memory-v2.ts +0 -253
- package/src/config/schemas/memory-v3.ts +39 -0
- package/src/config/schemas/memory.ts +6 -1
- package/src/config/schemas/timeouts.ts +3 -1
- package/src/context/compactor.ts +54 -31
- package/src/context/token-estimator.ts +19 -0
- package/src/context/tool-result-truncation.ts +1 -43
- package/src/context/window-manager.ts +138 -20
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +2 -2
- package/src/daemon/__tests__/web-search-status-text.test.ts +10 -6
- package/src/daemon/approval-generators.ts +4 -4
- package/src/daemon/config-watcher.ts +7 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +225 -88
- package/src/daemon/conversation-agent-loop.ts +284 -584
- package/src/daemon/conversation-error.ts +7 -7
- package/src/daemon/conversation-history.ts +22 -6
- package/src/daemon/conversation-launch.ts +4 -8
- package/src/daemon/conversation-lifecycle.ts +10 -38
- package/src/daemon/conversation-messaging.ts +1 -3
- package/src/daemon/conversation-notifiers.ts +7 -5
- package/src/daemon/conversation-process.ts +100 -79
- package/src/daemon/conversation-runtime-assembly.ts +47 -21
- package/src/daemon/conversation-store.ts +6 -5
- package/src/daemon/conversation-surfaces.ts +55 -69
- package/src/daemon/conversation-tool-setup.ts +3 -0
- package/src/daemon/conversation.ts +91 -126
- 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 +46 -24
- package/src/daemon/first-greeting.ts +26 -4
- package/src/daemon/guardian-action-generators.ts +2 -2
- package/src/daemon/handlers/conversations.ts +6 -22
- package/src/daemon/handlers/shared.ts +4 -0
- package/src/daemon/handlers/skills.ts +15 -14
- 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 +28 -55
- package/src/daemon/message-protocol.ts +2 -3
- package/src/daemon/message-provenance.ts +49 -0
- 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 +28 -343
- 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 +2 -0
- package/src/daemon/message-types/surfaces.ts +2 -0
- package/src/daemon/message-types/sync.ts +12 -25
- package/src/daemon/message-types/workspace.ts +3 -11
- package/src/daemon/process-message.ts +49 -46
- package/src/daemon/server.ts +12 -0
- package/src/daemon/tool-side-effects.ts +10 -7
- package/src/daemon/trust-context.ts +13 -0
- package/src/daemon/wake-target-adapter.ts +11 -1
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +3 -1
- package/src/heartbeat/heartbeat-run-store.ts +31 -0
- package/src/heartbeat/heartbeat-service.ts +16 -0
- package/src/home/feature-gate.ts +22 -0
- package/src/home/feed-types.ts +36 -221
- package/src/ipc/__tests__/email-ipc.test.ts +0 -9
- 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 +18 -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 +26 -13
- 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/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__/memory-retrospective-job.test.ts +10 -6
- package/src/memory/__tests__/memory-v3-selections-migration.test.ts +103 -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/db-init.ts +8 -0
- package/src/memory/db-maintenance.ts +18 -2
- package/src/memory/graph/consolidation.ts +8 -11
- package/src/memory/graph/conversation-graph-memory.ts +41 -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 +32 -32
- package/src/memory/job-handlers/summarization.ts +1 -2
- package/src/memory/jobs-store.ts +3 -1
- package/src/memory/jobs-worker.ts +51 -39
- 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 +10 -0
- 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/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/__tests__/267-llm-usage-events-add-assistant-version.test.ts +117 -0
- package/src/memory/migrations/index.ts +4 -0
- package/src/memory/schema/infrastructure.ts +11 -0
- package/src/memory/v2/__tests__/consolidation-job.test.ts +124 -0
- 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 +89 -9
- 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/memory/v3/__tests__/assign.test.ts +242 -0
- package/src/memory/v3/__tests__/capabilities.test.ts +118 -0
- package/src/memory/v3/__tests__/core.test.ts +39 -0
- package/src/memory/v3/__tests__/fixtures/eval-turns.json +36 -0
- package/src/memory/v3/__tests__/fixtures/live-turns.json +37 -0
- package/src/memory/v3/__tests__/health.test.ts +203 -0
- package/src/memory/v3/__tests__/live-integration.test.ts +330 -0
- package/src/memory/v3/__tests__/maintain-job.test.ts +288 -0
- package/src/memory/v3/__tests__/needle.test.ts +107 -0
- package/src/memory/v3/__tests__/orchestrate.test.ts +400 -0
- package/src/memory/v3/__tests__/reconcile.test.ts +274 -0
- package/src/memory/v3/__tests__/render-injection.test.ts +61 -0
- package/src/memory/v3/__tests__/router.test.ts +260 -0
- package/src/memory/v3/__tests__/selection-log-store.test.ts +179 -0
- package/src/memory/v3/__tests__/selector.test.ts +404 -0
- package/src/memory/v3/__tests__/shadow-plugin.test.ts +414 -0
- package/src/memory/v3/__tests__/snapshot.test.ts +168 -0
- package/src/memory/v3/__tests__/tree.test.ts +192 -0
- package/src/memory/v3/__tests__/types.test.ts +54 -0
- package/src/memory/v3/__tests__/working-set-eviction.test.ts +106 -0
- package/src/memory/v3/__tests__/working-set-skeleton.test.ts +44 -0
- package/src/memory/v3/assign.ts +268 -0
- package/src/memory/v3/capabilities.ts +124 -0
- package/src/memory/v3/core.ts +26 -0
- package/src/memory/v3/data/README.md +84 -0
- package/src/memory/v3/data/assignments.json +5 -0
- package/src/memory/v3/data/core.json +1 -0
- package/src/memory/v3/data/leaves/domain-a/topic-x.md +9 -0
- package/src/memory/v3/data/leaves/domain-a/topic-y.md +9 -0
- package/src/memory/v3/data/leaves/domain-b/topic-z.md +9 -0
- package/src/memory/v3/health.ts +0 -0
- package/src/memory/v3/maintain-job.ts +314 -0
- package/src/memory/v3/needle.ts +115 -0
- package/src/memory/v3/orchestrate.ts +114 -0
- package/src/memory/v3/page-content.ts +34 -0
- package/src/memory/v3/provider-blocks.ts +16 -0
- package/src/memory/v3/reconcile.ts +523 -0
- package/src/memory/v3/render-injection.ts +32 -0
- package/src/memory/v3/router.ts +184 -0
- package/src/memory/v3/selection-log-store.ts +84 -0
- package/src/memory/v3/selector.ts +211 -0
- package/src/memory/v3/shadow-plugin.ts +379 -0
- package/src/memory/v3/snapshot.ts +209 -0
- package/src/memory/v3/tree.ts +174 -0
- package/src/memory/v3/types.ts +46 -60
- package/src/memory/v3/working-set.ts +88 -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 -6
- package/src/notifications/decision-engine.ts +10 -13
- package/src/notifications/preference-extractor.ts +11 -14
- package/src/permissions/prompter.ts +42 -36
- package/src/permissions/question-prompter.test.ts +35 -26
- package/src/permissions/question-prompter.ts +6 -10
- package/src/plugin-api/index.ts +2 -0
- package/src/plugin-api/types.ts +25 -3
- package/src/plugins/defaults/circuit-breaker/middlewares/circuitBreaker.ts +93 -0
- package/src/plugins/defaults/circuit-breaker/package.json +15 -0
- package/src/plugins/defaults/circuit-breaker/register.ts +39 -0
- package/src/plugins/defaults/compaction/middlewares/compaction.ts +25 -0
- package/src/plugins/defaults/compaction/package.json +15 -0
- package/src/plugins/defaults/compaction/register.ts +35 -0
- package/src/plugins/defaults/compaction/terminal.ts +73 -0
- package/src/plugins/defaults/empty-response/middlewares/emptyResponse.ts +22 -0
- package/src/plugins/defaults/empty-response/package.json +15 -0
- package/src/plugins/defaults/empty-response/register.ts +28 -0
- package/src/plugins/defaults/empty-response/terminal.ts +106 -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 +29 -40
- package/src/plugins/defaults/injectors/package.json +15 -0
- package/src/plugins/defaults/{injectors.ts → injectors/register.ts} +14 -38
- package/src/plugins/defaults/llm-call/middlewares/llmCall.ts +17 -0
- package/src/plugins/defaults/llm-call/package.json +15 -0
- package/src/plugins/defaults/{llm-call.ts → llm-call/register.ts} +6 -38
- package/src/plugins/defaults/memory-retrieval/middlewares/memoryRetrieval.ts +17 -0
- package/src/plugins/defaults/memory-retrieval/package.json +15 -0
- package/src/plugins/defaults/{memory-retrieval.ts → memory-retrieval/register.ts} +10 -48
- package/src/plugins/defaults/{overflow-reduce.ts → overflow-reduce/middlewares/overflowReduce.ts} +18 -77
- package/src/plugins/defaults/overflow-reduce/package.json +15 -0
- package/src/plugins/defaults/overflow-reduce/register.ts +42 -0
- package/src/plugins/defaults/persistence/middlewares/persistence.ts +19 -0
- package/src/plugins/defaults/persistence/package.json +15 -0
- package/src/plugins/defaults/persistence/register.ts +38 -0
- package/src/plugins/defaults/persistence/terminal.ts +83 -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/title-generate/terminal.ts +31 -0
- package/src/plugins/defaults/token-estimate/middlewares/tokenEstimate.ts +23 -0
- package/src/plugins/defaults/token-estimate/package.json +15 -0
- package/src/plugins/defaults/token-estimate/register.ts +34 -0
- package/src/plugins/defaults/token-estimate/terminal.ts +40 -0
- package/src/plugins/defaults/tool-error/middlewares/toolError.ts +21 -0
- package/src/plugins/defaults/tool-error/package.json +15 -0
- package/src/plugins/defaults/tool-error/register.ts +35 -0
- package/src/plugins/defaults/tool-error/terminal.ts +47 -0
- package/src/plugins/defaults/tool-execute/middlewares/toolExecute.ts +23 -0
- package/src/plugins/defaults/tool-execute/package.json +15 -0
- package/src/plugins/defaults/{tool-execute.ts → tool-execute/register.ts} +8 -46
- package/src/plugins/defaults/tool-result-truncate/middlewares/toolResultTruncate.ts +23 -0
- package/src/plugins/defaults/tool-result-truncate/package.json +15 -0
- package/src/plugins/defaults/tool-result-truncate/register.ts +35 -0
- package/src/plugins/defaults/tool-result-truncate/terminal.ts +113 -0
- package/src/plugins/defaults/tool-result-truncate/types.ts +22 -0
- package/src/plugins/external-plugin-loader.ts +2 -2
- package/src/plugins/pipeline.ts +0 -12
- package/src/plugins/types.ts +51 -90
- package/src/plugins/user-loader.ts +4 -3
- package/src/proactive-artifact/aux-message-injector.ts +0 -1
- package/src/proactive-artifact/job.test.ts +20 -8
- package/src/proactive-artifact/job.ts +3 -1
- package/src/prompts/sections.ts +20 -7
- package/src/prompts/templates/BOOTSTRAP-CONTENT-AUTOMATION.md +2 -2
- package/src/prompts/templates/BOOTSTRAP.md +5 -1
- package/src/prompts/templates/system-sections.ts +6 -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 +24 -5
- 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 +0 -2
- package/src/providers/openai/chat-completions-provider.ts +1 -4
- package/src/providers/openai/responses-provider.ts +1 -4
- package/src/providers/openrouter/client.ts +1 -6
- 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 +131 -26
- package/src/runtime/__tests__/background-job-runner.test.ts +1 -3
- package/src/runtime/agent-wake.ts +93 -18
- package/src/runtime/assistant-event-hub.ts +2 -2
- 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 +3 -14
- 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/conversation-stream-state.ts +294 -0
- package/src/runtime/http-router.ts +19 -22
- package/src/runtime/http-types.ts +12 -6
- package/src/runtime/invite-instruction-generator.ts +3 -3
- package/src/runtime/pending-interactions.ts +2 -2
- package/src/runtime/routes/__tests__/avatar-state-routes.test.ts +565 -0
- 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__/inference-provider-connection-routes.test.ts +13 -22
- 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__/tts-routes.test.ts +3 -3
- package/src/runtime/routes/acp-routes.test.ts +97 -75
- package/src/runtime/routes/acp-routes.ts +29 -6
- package/src/runtime/routes/app-management-routes.ts +97 -24
- package/src/runtime/routes/app-routes.ts +25 -5
- package/src/runtime/routes/approval-routes.ts +16 -4
- package/src/runtime/routes/attachment-routes.ts +25 -1
- 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 +238 -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 +5 -0
- package/src/runtime/routes/browser-tabs-routes.ts +5 -0
- package/src/runtime/routes/btw-routes.ts +5 -1
- 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 +13 -5
- 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 +88 -41
- package/src/runtime/routes/conversation-routes.ts +74 -19
- package/src/runtime/routes/conversation-starter-routes.ts +22 -13
- package/src/runtime/routes/conversations-import-routes.ts +6 -1
- 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 +21 -10
- package/src/runtime/routes/domain-routes.ts +61 -28
- package/src/runtime/routes/email-routes.ts +33 -0
- package/src/runtime/routes/events-routes.ts +114 -9
- package/src/runtime/routes/filing-routes.ts +9 -4
- package/src/runtime/routes/gateway-log-routes.ts +5 -0
- 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 +25 -9
- 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 +5 -0
- 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 +5 -0
- 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 +17 -6
- package/src/runtime/routes/identity-routes.ts +12 -2
- package/src/runtime/routes/image-generation-routes.ts +5 -0
- package/src/runtime/routes/inbound-message-handler.ts +15 -11
- 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/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 +30 -7
- package/src/runtime/routes/integrations/slack/channel.ts +19 -3
- package/src/runtime/routes/integrations/slack/share.ts +9 -2
- package/src/runtime/routes/integrations/telegram.ts +28 -9
- package/src/runtime/routes/integrations/twilio.ts +35 -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-twilio-routes.ts +13 -0
- package/src/runtime/routes/llm-call-sites-routes.ts +39 -4
- package/src/runtime/routes/log-export-routes.ts +28 -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 +90 -36
- package/src/runtime/routes/memory-v3-routes.ts +273 -407
- 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 +33 -11
- 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 +35 -10
- package/src/runtime/routes/platform-routes.ts +21 -0
- package/src/runtime/routes/playground/__tests__/force-compact.test.ts +3 -2
- 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 +1 -1
- package/src/runtime/routes/playground/helpers.ts +0 -1
- 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 +5 -0
- package/src/runtime/routes/sanity-routes.ts +9 -2
- package/src/runtime/routes/schedule-routes.ts +137 -47
- package/src/runtime/routes/secret-routes.ts +17 -4
- 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 +133 -69
- 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/task-routes.ts +37 -0
- package/src/runtime/routes/telemetry-routes.ts +9 -0
- package/src/runtime/routes/trace-event-routes.ts +42 -1
- package/src/runtime/routes/trust-rules-routes.ts +5 -0
- package/src/runtime/routes/tts-routes.ts +13 -6
- package/src/runtime/routes/types.ts +17 -8
- 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 +71 -3
- 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 +9 -0
- package/src/runtime/routes/wipe-conversation-routes.ts +5 -0
- package/src/runtime/routes/work-items-routes.ts +47 -19
- 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 +120 -9
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +2 -4
- package/src/runtime/services/analyze-conversation.ts +3 -6
- 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 +8 -0
- package/src/schedule/scheduler.ts +3 -1
- package/src/signals/user-message.ts +5 -8
- package/src/skills/catalog-files.ts +4 -1
- package/src/skills/clawhub-files.ts +2 -0
- package/src/skills/skillssh-files.ts +2 -0
- package/src/subagent/manager.ts +3 -6
- package/src/telemetry/types.ts +26 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +138 -1
- package/src/telemetry/usage-telemetry-reporter.ts +31 -0
- package/src/tools/acp/spawn.test.ts +88 -38
- package/src/tools/apps/definitions.ts +8 -4
- 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/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 +34 -31
- 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/web-fetch.ts +49 -46
- package/src/tools/network/web-search.ts +16 -13
- package/src/tools/registry.ts +39 -16
- package/src/tools/schedule/create.ts +11 -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/system/avatar-generator.ts +13 -22
- package/src/tools/system/request-permission.ts +30 -27
- 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 +69 -9
- 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/platform.ts +15 -12
- package/src/work-items/work-item-runner.ts +7 -2
- 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/__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 +6 -0
- package/src/workspace/provider-commit-message-generator.ts +15 -17
- package/tsconfig.json +4 -1
- package/src/__tests__/history-repair-pipeline.test.ts +0 -396
- 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/message-types/disk-pressure.ts +0 -9
- package/src/email/feature-gate.ts +0 -23
- 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/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/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-result-truncate.ts +0 -84
- package/src/runtime/routes/__tests__/memory-v3-simulate-params.test.ts +0 -35
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { MemoryArgs, MemoryResult, Middleware } from "../../../types.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Passthrough middleware for the `memoryRetrieval` pipeline.
|
|
5
|
+
*
|
|
6
|
+
* Keeping a real middleware registered (rather than an empty list) makes the
|
|
7
|
+
* pipeline observable in `plugin.pipeline` logs with a non-empty `chain` field
|
|
8
|
+
* and lets third-party plugins rely on the default slot being present even
|
|
9
|
+
* when nothing is overriding it. The work happens in the terminal supplied by
|
|
10
|
+
* the agent loop, which calls `runDefaultMemoryRetrieval`.
|
|
11
|
+
*/
|
|
12
|
+
const defaultMemoryRetrievalMiddleware: Middleware<MemoryArgs, MemoryResult> =
|
|
13
|
+
async function defaultMemoryRetrieval(args, next) {
|
|
14
|
+
return next(args);
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export default defaultMemoryRetrievalMiddleware;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "default-memory-retrieval",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "First-party default plugin wrapping the assistant's built-in memory-retrieval pipeline with a passthrough implementation.",
|
|
5
|
+
"private": true,
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"main": "./register.ts",
|
|
9
|
+
"engines": {
|
|
10
|
+
"node": ">=20.12.0"
|
|
11
|
+
},
|
|
12
|
+
"peerDependencies": {
|
|
13
|
+
"@vellumai/plugin-api": "^0.8.0"
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -24,22 +24,21 @@
|
|
|
24
24
|
* milestone.
|
|
25
25
|
*/
|
|
26
26
|
|
|
27
|
-
import type { AssistantConfig } from "
|
|
27
|
+
import type { AssistantConfig } from "../../../config/schema.js";
|
|
28
28
|
import {
|
|
29
29
|
readNowScratchpad,
|
|
30
30
|
readPkbContext,
|
|
31
|
-
} from "
|
|
32
|
-
import type { ServerMessage } from "
|
|
33
|
-
import type { ConversationGraphMemory } from "
|
|
34
|
-
import type { Message } from "
|
|
35
|
-
import { registerPlugin } from "../registry.js";
|
|
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";
|
|
36
35
|
import {
|
|
37
36
|
type MemoryArgs,
|
|
38
37
|
type MemoryResult,
|
|
39
|
-
type Middleware,
|
|
40
38
|
type Plugin,
|
|
41
|
-
|
|
42
|
-
|
|
39
|
+
} from "../../types.js";
|
|
40
|
+
import defaultMemoryRetrievalMiddleware from "./middlewares/memoryRetrieval.js";
|
|
41
|
+
import pkg from "./package.json" with { type: "json" };
|
|
43
42
|
|
|
44
43
|
/**
|
|
45
44
|
* Discriminator the agent loop uses to narrow `MemoryResult.memoryGraphBlocks`
|
|
@@ -166,21 +165,6 @@ export function asDefaultGraphPayload(
|
|
|
166
165
|
return null;
|
|
167
166
|
}
|
|
168
167
|
|
|
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
168
|
/**
|
|
185
169
|
* Default plugin exposing the `memoryRetrieval` pipeline slot. Registered
|
|
186
170
|
* by {@link registerDefaultMemoryRetrievalPlugin} from the plugin
|
|
@@ -188,32 +172,10 @@ const defaultMemoryRetrievalMiddleware: Middleware<MemoryArgs, MemoryResult> =
|
|
|
188
172
|
*/
|
|
189
173
|
export const defaultMemoryRetrievalPlugin: Plugin = {
|
|
190
174
|
manifest: {
|
|
191
|
-
name:
|
|
192
|
-
version:
|
|
175
|
+
name: pkg.name,
|
|
176
|
+
version: pkg.version,
|
|
193
177
|
},
|
|
194
178
|
middleware: {
|
|
195
179
|
memoryRetrieval: defaultMemoryRetrievalMiddleware,
|
|
196
180
|
},
|
|
197
181
|
};
|
|
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
|
-
}
|
package/src/plugins/defaults/{overflow-reduce.ts → overflow-reduce/middlewares/overflowReduce.ts}
RENAMED
|
@@ -1,54 +1,29 @@
|
|
|
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";
|
|
1
|
+
import type { ContextWindowCompactOptions } from "../../../../context/window-manager.js";
|
|
27
2
|
import {
|
|
28
3
|
createInitialReducerState,
|
|
29
4
|
reduceContextOverflow,
|
|
30
5
|
type ReducerState,
|
|
31
|
-
} from "
|
|
32
|
-
import {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
type Plugin,
|
|
38
|
-
PluginExecutionError,
|
|
39
|
-
} from "../types.js";
|
|
6
|
+
} from "../../../../daemon/context-overflow-reducer.js";
|
|
7
|
+
import type {
|
|
8
|
+
Middleware,
|
|
9
|
+
OverflowReduceArgs,
|
|
10
|
+
OverflowReduceResult,
|
|
11
|
+
} from "../../../types.js";
|
|
40
12
|
|
|
41
13
|
/**
|
|
42
|
-
* Default middleware — implements the
|
|
14
|
+
* Default middleware for the `overflowReduce` pipeline — implements the
|
|
15
|
+
* historical tier-loop semantics (forced compaction, tool-result truncation,
|
|
16
|
+
* media stubbing, injection downgrade) plus the post-step re-injection /
|
|
17
|
+
* re-estimation dance.
|
|
43
18
|
*
|
|
44
19
|
* The middleware intentionally ignores `next`. Overflow reduction is a
|
|
45
|
-
* *terminal* behavior: there is no downstream implementation to defer to
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
20
|
+
* *terminal* behavior: there is no downstream implementation to defer to when
|
|
21
|
+
* a user-supplied middleware short-circuits. Later plugins may still wrap this
|
|
22
|
+
* one (outer middleware can observe each reduction iteration via their own
|
|
23
|
+
* `next` callback) but the default never delegates to a hypothetical base
|
|
24
|
+
* handler — the inline loop was the base.
|
|
50
25
|
*/
|
|
51
|
-
|
|
26
|
+
const defaultOverflowReduceMiddleware: Middleware<
|
|
52
27
|
OverflowReduceArgs,
|
|
53
28
|
OverflowReduceResult
|
|
54
29
|
> = async function defaultOverflowReduceMiddleware(args, _next, _ctx) {
|
|
@@ -148,38 +123,4 @@ export const defaultOverflowReduceMiddleware: Middleware<
|
|
|
148
123
|
};
|
|
149
124
|
};
|
|
150
125
|
|
|
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
|
-
}
|
|
126
|
+
export default defaultOverflowReduceMiddleware;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "default-overflow-reduce",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "First-party default plugin wrapping the assistant's built-in overflow-reduce pipeline with a passthrough implementation.",
|
|
5
|
+
"private": true,
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"main": "./register.ts",
|
|
9
|
+
"engines": {
|
|
10
|
+
"node": ">=20.12.0"
|
|
11
|
+
},
|
|
12
|
+
"peerDependencies": {
|
|
13
|
+
"@vellumai/plugin-api": "^0.8.0"
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default `overflowReduce` plugin — extracted verbatim from the inline
|
|
3
|
+
* preflight reducer loop that previously lived in
|
|
4
|
+
* `daemon/conversation-agent-loop.ts` (the `while (preflightAttempts < …)`
|
|
5
|
+
* block around lines 1045–1156 before PR 23).
|
|
6
|
+
*
|
|
7
|
+
* The plugin owns the reducer tier-loop (forced compaction, tool-result
|
|
8
|
+
* truncation, media stubbing, injection downgrade) and the post-step
|
|
9
|
+
* re-injection / re-estimation dance. Orchestrator-specific coupling
|
|
10
|
+
* (activity emission, circuit-breaker tracking, compaction-result
|
|
11
|
+
* application, runtime injection reassembly) is threaded in through the
|
|
12
|
+
* callbacks carried on {@link OverflowReduceArgs}; the plugin itself has no
|
|
13
|
+
* access to the agent-loop context object.
|
|
14
|
+
*
|
|
15
|
+
* The forced-compaction tier runs through the orchestrator-supplied
|
|
16
|
+
* `compactFn`, which routes into the `compaction` plugin pipeline so
|
|
17
|
+
* registered compaction middleware observes reducer-initiated invocations
|
|
18
|
+
* alongside the orchestrator-owned call sites. Non-compaction tiers
|
|
19
|
+
* (tool-result truncation, media stubbing, injection downgrade) remain
|
|
20
|
+
* in-process: they mutate message arrays directly without crossing a
|
|
21
|
+
* pipeline boundary. The reducer itself runs under the `overflowReduce`
|
|
22
|
+
* pipeline, so the full layering is `overflowReduce` → reducer tier loop
|
|
23
|
+
* → (for the forced-compaction tier only) nested `compaction` pipeline.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
import { type Plugin } from "../../types.js";
|
|
27
|
+
import defaultOverflowReduceMiddleware from "./middlewares/overflowReduce.js";
|
|
28
|
+
import pkg from "./package.json" with { type: "json" };
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* The default plugin registered at bootstrap. No `init`/`onShutdown` —
|
|
32
|
+
* registering the middleware is the only behavior.
|
|
33
|
+
*/
|
|
34
|
+
export const defaultOverflowReducePlugin: Plugin = {
|
|
35
|
+
manifest: {
|
|
36
|
+
name: pkg.name,
|
|
37
|
+
version: pkg.version,
|
|
38
|
+
},
|
|
39
|
+
middleware: {
|
|
40
|
+
overflowReduce: defaultOverflowReduceMiddleware,
|
|
41
|
+
},
|
|
42
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Middleware, PersistArgs, PersistResult } from "../../../types.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Passthrough middleware for the `persistence` pipeline. Forwards to
|
|
5
|
+
* `next(args)` unchanged; the actual dispatch lives in the terminal handler
|
|
6
|
+
* (`../terminal.ts`), wired in at the `runPipeline` call sites in
|
|
7
|
+
* `daemon/conversation-agent-loop.ts` and
|
|
8
|
+
* `daemon/conversation-agent-loop-handlers.ts`.
|
|
9
|
+
*
|
|
10
|
+
* Defaults register at the OUTERMOST onion position, so deciding here without
|
|
11
|
+
* calling `next` would shadow every later-registered plugin. Routing through
|
|
12
|
+
* `next(args)` lets user middleware participate normally.
|
|
13
|
+
*/
|
|
14
|
+
const passthrough: Middleware<PersistArgs, PersistResult> = async (
|
|
15
|
+
args,
|
|
16
|
+
next,
|
|
17
|
+
) => next(args);
|
|
18
|
+
|
|
19
|
+
export default passthrough;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "default-persistence",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "First-party default plugin wrapping the assistant's built-in persistence pipeline with a passthrough implementation.",
|
|
5
|
+
"private": true,
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"main": "./register.ts",
|
|
9
|
+
"engines": {
|
|
10
|
+
"node": ">=20.12.0"
|
|
11
|
+
},
|
|
12
|
+
"peerDependencies": {
|
|
13
|
+
"@vellumai/plugin-api": "^0.8.0"
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default `persistence` plugin.
|
|
3
|
+
*
|
|
4
|
+
* The plugin's middleware is a passthrough — it calls `next(args)` and returns
|
|
5
|
+
* the result unchanged. The actual dispatch lives in the terminal handler in
|
|
6
|
+
* `./terminal.ts`, which is wired in as the pipeline's `terminal` argument by
|
|
7
|
+
* `runPipeline` call sites in `daemon/conversation-agent-loop.ts` and
|
|
8
|
+
* `daemon/conversation-agent-loop-handlers.ts`. This separation matters: the
|
|
9
|
+
* default plugin is registered before any user plugin (defaults load first in
|
|
10
|
+
* `bootstrapPlugins()`), which puts it at the OUTERMOST position of the onion
|
|
11
|
+
* chain. If the default middleware were to invoke the terminal directly
|
|
12
|
+
* without calling `next`, it would shadow every later-registered plugin.
|
|
13
|
+
* Routing through `next(args)` lets user middleware participate normally.
|
|
14
|
+
*
|
|
15
|
+
* Manifest declares `provides.persistence: "v1"` so other plugins can
|
|
16
|
+
* negotiate against the pipeline surface and `requires.pluginRuntime: "v1"`
|
|
17
|
+
* to satisfy the registry's mandatory capability check.
|
|
18
|
+
*
|
|
19
|
+
* Registered from `daemon/external-plugins-bootstrap.ts` via a side-effect
|
|
20
|
+
* import so the plugin is present in the registry before
|
|
21
|
+
* {@link bootstrapPlugins} walks it.
|
|
22
|
+
*
|
|
23
|
+
* Design doc: `.private/plans/agent-plugin-system.md` (PR 27).
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
import { type Plugin } from "../../types.js";
|
|
27
|
+
import persistence from "./middlewares/persistence.js";
|
|
28
|
+
import pkg from "./package.json" with { type: "json" };
|
|
29
|
+
|
|
30
|
+
export const defaultPersistencePlugin: Plugin = {
|
|
31
|
+
manifest: {
|
|
32
|
+
name: pkg.name,
|
|
33
|
+
version: pkg.version,
|
|
34
|
+
},
|
|
35
|
+
middleware: {
|
|
36
|
+
persistence,
|
|
37
|
+
},
|
|
38
|
+
};
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default `persistence` behavior: writes conversation messages to the database
|
|
3
|
+
* (and optionally the JSONL disk view).
|
|
4
|
+
*
|
|
5
|
+
* This module is side-effect free: importing it does not register any plugin.
|
|
6
|
+
*
|
|
7
|
+
* The handler dispatches on the discriminated {@link PersistArgs.op} field:
|
|
8
|
+
*
|
|
9
|
+
* - `add` → {@link addMessage}, optionally followed by
|
|
10
|
+
* {@link syncMessageToDisk} when `args.syncToDisk` is true.
|
|
11
|
+
* - `reserve` → {@link reserveMessage} — pre-allocates an empty row
|
|
12
|
+
* for assistant anchor stamping.
|
|
13
|
+
* - `updateContent` → {@link updateMessageContent} — overwrites an existing
|
|
14
|
+
* row's content (returns `void`, wrapped as
|
|
15
|
+
* `{ op: "updateContent" }`).
|
|
16
|
+
* - `update` → {@link updateMessageMetadata} (returns `void`, wrapped
|
|
17
|
+
* as `{ op: "update" }`).
|
|
18
|
+
* - `delete` → {@link deleteMessageById} (returns the segment/summary
|
|
19
|
+
* IDs the caller must clean up out-of-band).
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import {
|
|
23
|
+
addMessage,
|
|
24
|
+
deleteMessageById,
|
|
25
|
+
reserveMessage,
|
|
26
|
+
updateMessageContent,
|
|
27
|
+
updateMessageMetadata,
|
|
28
|
+
} from "../../../memory/conversation-crud.js";
|
|
29
|
+
import { syncMessageToDisk } from "../../../memory/conversation-disk-view.js";
|
|
30
|
+
import type { PersistArgs, PersistResult } from "../../types.js";
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Persist a message according to `args.op`. Exported so the agent-loop call
|
|
34
|
+
* sites can invoke it directly and tests can verify each op in isolation.
|
|
35
|
+
*/
|
|
36
|
+
export async function defaultPersistenceTerminal(
|
|
37
|
+
args: PersistArgs,
|
|
38
|
+
): Promise<PersistResult> {
|
|
39
|
+
switch (args.op) {
|
|
40
|
+
case "add": {
|
|
41
|
+
const message = await addMessage(
|
|
42
|
+
args.conversationId,
|
|
43
|
+
args.role,
|
|
44
|
+
args.content,
|
|
45
|
+
{
|
|
46
|
+
metadata: args.metadata,
|
|
47
|
+
...args.addOptions,
|
|
48
|
+
},
|
|
49
|
+
);
|
|
50
|
+
// Sync the just-persisted row to the JSONL disk view when the caller
|
|
51
|
+
// opted in. The handler that emits tool-result rows sets
|
|
52
|
+
// `syncToDisk: true` so the disk view stays in lockstep with the DB.
|
|
53
|
+
if (args.syncToDisk && args.createdAtMs !== undefined) {
|
|
54
|
+
syncMessageToDisk(args.conversationId, message.id, args.createdAtMs);
|
|
55
|
+
}
|
|
56
|
+
return { op: "add", message };
|
|
57
|
+
}
|
|
58
|
+
case "reserve": {
|
|
59
|
+
const message = await reserveMessage(
|
|
60
|
+
args.conversationId,
|
|
61
|
+
args.role,
|
|
62
|
+
args.metadata,
|
|
63
|
+
);
|
|
64
|
+
return { op: "reserve", message };
|
|
65
|
+
}
|
|
66
|
+
case "updateContent": {
|
|
67
|
+
updateMessageContent(args.messageId, args.content);
|
|
68
|
+
return { op: "updateContent" };
|
|
69
|
+
}
|
|
70
|
+
case "update": {
|
|
71
|
+
updateMessageMetadata(args.messageId, args.updates);
|
|
72
|
+
return { op: "update" };
|
|
73
|
+
}
|
|
74
|
+
case "delete": {
|
|
75
|
+
const deleted = deleteMessageById(args.messageId);
|
|
76
|
+
return {
|
|
77
|
+
op: "delete",
|
|
78
|
+
segmentIds: deleted.segmentIds,
|
|
79
|
+
deletedSummaryIds: deleted.deletedSummaryIds,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "default-title-generate",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "First-party default plugin wrapping the assistant's built-in title-generate pipeline with a passthrough implementation.",
|
|
5
|
+
"private": true,
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"main": "./register.ts",
|
|
9
|
+
"engines": {
|
|
10
|
+
"node": ">=20.12.0"
|
|
11
|
+
},
|
|
12
|
+
"peerDependencies": {
|
|
13
|
+
"@vellumai/plugin-api": "^0.8.0"
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default `titleGenerate` pipeline plugin.
|
|
3
|
+
*
|
|
4
|
+
* Declares no middleware — the terminal handler in `./terminal.ts` is wired in
|
|
5
|
+
* as the pipeline's `terminal` argument by the `runPipeline` call site in
|
|
6
|
+
* `daemon/conversation-agent-loop.ts`. This plugin exists purely to negotiate
|
|
7
|
+
* the `titleGenerateApi` capability so bootstrap has a record that the
|
|
8
|
+
* assistant runtime exposes this pipeline.
|
|
9
|
+
*
|
|
10
|
+
* Registered via a side-effect import from
|
|
11
|
+
* `daemon/external-plugins-bootstrap.ts` so it is present in the registry
|
|
12
|
+
* by the time {@link bootstrapPlugins} runs.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { type Plugin } from "../../types.js";
|
|
16
|
+
import pkg from "./package.json" with { type: "json" };
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Default titleGenerate plugin. Declares no middleware — it exists purely
|
|
20
|
+
* to negotiate the `titleGenerateApi` capability so bootstrap has a record
|
|
21
|
+
* that the assistant runtime exposes this pipeline.
|
|
22
|
+
*
|
|
23
|
+
* The terminal handler (`./terminal.ts`) is supplied at the call site in
|
|
24
|
+
* `conversation-agent-loop.ts` rather than through `middleware.titleGenerate`,
|
|
25
|
+
* because a default middleware would short-circuit user-registered middleware
|
|
26
|
+
* by always running first in onion order. Keeping the terminal outside the
|
|
27
|
+
* middleware chain lets user plugins observe/transform/short-circuit the
|
|
28
|
+
* call without competing with an assistant-owned default middleware.
|
|
29
|
+
*/
|
|
30
|
+
export const defaultTitleGeneratePlugin: Plugin = {
|
|
31
|
+
manifest: {
|
|
32
|
+
name: pkg.name,
|
|
33
|
+
version: pkg.version,
|
|
34
|
+
},
|
|
35
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default `titleGenerate` behavior: kicks off conversation-title generation.
|
|
3
|
+
*
|
|
4
|
+
* This module is side-effect free: importing it does not register any plugin.
|
|
5
|
+
*
|
|
6
|
+
* Delegates to {@link queueGenerateConversationTitle}, which schedules title
|
|
7
|
+
* generation as fire-and-forget background work and falls back to a
|
|
8
|
+
* deterministic placeholder on failure.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { queueGenerateConversationTitle } from "../../../memory/conversation-title-service.js";
|
|
12
|
+
import type { TitleArgs, TitleResult } from "../../types.js";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Invoke the title-generation service with the provided arguments. Exported
|
|
16
|
+
* for tests that want to exercise the default directly.
|
|
17
|
+
*
|
|
18
|
+
* Returns an empty result — the service is fire-and-forget and surfaces its
|
|
19
|
+
* output through `onTitleUpdated`.
|
|
20
|
+
*/
|
|
21
|
+
export async function defaultTitleGenerateTerminal(
|
|
22
|
+
args: TitleArgs,
|
|
23
|
+
): Promise<TitleResult> {
|
|
24
|
+
queueGenerateConversationTitle({
|
|
25
|
+
conversationId: args.conversationId,
|
|
26
|
+
provider: args.provider,
|
|
27
|
+
userMessage: args.userMessage,
|
|
28
|
+
onTitleUpdated: args.onTitleUpdated,
|
|
29
|
+
});
|
|
30
|
+
return {};
|
|
31
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
EstimateArgs,
|
|
3
|
+
EstimateResult,
|
|
4
|
+
Middleware,
|
|
5
|
+
} from "../../../types.js";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Passthrough middleware for the `tokenEstimate` pipeline. Forwards to
|
|
9
|
+
* `next(args)` unchanged; the actual estimate lives in the terminal handler
|
|
10
|
+
* (`../terminal.ts`), wired in at the `runPipeline` call sites in
|
|
11
|
+
* `daemon/conversation-agent-loop.ts`.
|
|
12
|
+
*
|
|
13
|
+
* Defaults register at the OUTERMOST onion position, so deciding here without
|
|
14
|
+
* calling `next` would shadow every later-registered plugin. The passthrough
|
|
15
|
+
* lets user middleware that wraps the default (e.g. a doubler, a
|
|
16
|
+
* provider-native `countTokens` override) participate normally.
|
|
17
|
+
*/
|
|
18
|
+
const passthrough: Middleware<EstimateArgs, EstimateResult> = async (
|
|
19
|
+
args,
|
|
20
|
+
next,
|
|
21
|
+
) => next(args);
|
|
22
|
+
|
|
23
|
+
export default passthrough;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "default-token-estimate",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "First-party default plugin wrapping the assistant's built-in token-estimate pipeline with a passthrough implementation.",
|
|
5
|
+
"private": true,
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"main": "./register.ts",
|
|
9
|
+
"engines": {
|
|
10
|
+
"node": ">=20.12.0"
|
|
11
|
+
},
|
|
12
|
+
"peerDependencies": {
|
|
13
|
+
"@vellumai/plugin-api": "^0.8.0"
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default `tokenEstimate` plugin.
|
|
3
|
+
*
|
|
4
|
+
* The plugin's middleware is a passthrough — it calls `next(args)` and returns
|
|
5
|
+
* the result unchanged. The actual estimate lives in the terminal handler in
|
|
6
|
+
* `./terminal.ts`, which is wired in as the pipeline's `terminal` argument by
|
|
7
|
+
* `runPipeline` call sites in `daemon/conversation-agent-loop.ts`. This
|
|
8
|
+
* separation matters: the default plugin is registered before any user plugin
|
|
9
|
+
* (defaults load first in `bootstrapPlugins()`), which puts it at the
|
|
10
|
+
* OUTERMOST position of the onion chain. If the default middleware were to
|
|
11
|
+
* invoke the terminal directly without calling `next`, it would shadow every
|
|
12
|
+
* later-registered plugin. The passthrough lets user middleware that wraps the
|
|
13
|
+
* default (e.g. a doubler, a provider-native `countTokens` override)
|
|
14
|
+
* participate normally.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { type Plugin } from "../../types.js";
|
|
18
|
+
import tokenEstimate from "./middlewares/tokenEstimate.js";
|
|
19
|
+
import pkg from "./package.json" with { type: "json" };
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Default `tokenEstimate` plugin. Registered by
|
|
23
|
+
* {@link bootstrapPlugins} on daemon startup so the pipeline always has a
|
|
24
|
+
* terminal handler even when no other plugin contributes one.
|
|
25
|
+
*/
|
|
26
|
+
export const defaultTokenEstimatePlugin: Plugin = {
|
|
27
|
+
manifest: {
|
|
28
|
+
name: pkg.name,
|
|
29
|
+
version: pkg.version,
|
|
30
|
+
},
|
|
31
|
+
middleware: {
|
|
32
|
+
tokenEstimate,
|
|
33
|
+
},
|
|
34
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default `tokenEstimate` behavior: estimates the prompt token count used by
|
|
3
|
+
* the overflow gate.
|
|
4
|
+
*
|
|
5
|
+
* This module is side-effect free: importing it does not register any plugin.
|
|
6
|
+
*
|
|
7
|
+
* Delegates to
|
|
8
|
+
* {@link estimatePromptTokens}, which applies the EWMA calibration correction
|
|
9
|
+
* recorded from past provider responses. Preflight + mid-loop checks must use
|
|
10
|
+
* the calibrated estimate — the calibrated value keeps the overflow gate
|
|
11
|
+
* consistent with the convergence path in the reducer. The pre-send
|
|
12
|
+
* calibration capture in `agent/loop.ts` still uses `estimatePromptTokensRaw`
|
|
13
|
+
* on purpose — the calibrator must learn against the raw estimate so the EWMA
|
|
14
|
+
* converges against provider ground truth rather than chasing its own
|
|
15
|
+
* corrected output. This path produces the user-facing estimate; calibration
|
|
16
|
+
* capture stays separate.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import {
|
|
20
|
+
estimatePromptTokens,
|
|
21
|
+
estimateToolsTokens,
|
|
22
|
+
} from "../../../context/token-estimator.js";
|
|
23
|
+
import type { EstimateArgs, EstimateResult } from "../../types.js";
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Compute the tool token budget from `args.tools` and delegate to
|
|
27
|
+
* {@link estimatePromptTokens} with the canonical provider key, applying the
|
|
28
|
+
* EWMA calibration correction. Exported so the agent loop can call it directly
|
|
29
|
+
* and tests can verify the default behavior.
|
|
30
|
+
*/
|
|
31
|
+
export const defaultTokenEstimateTerminal = async (
|
|
32
|
+
args: EstimateArgs,
|
|
33
|
+
): Promise<EstimateResult> => {
|
|
34
|
+
const toolTokenBudget =
|
|
35
|
+
args.tools.length > 0 ? estimateToolsTokens(args.tools) : 0;
|
|
36
|
+
return estimatePromptTokens(args.history, args.systemPrompt, {
|
|
37
|
+
providerName: args.providerName,
|
|
38
|
+
toolTokenBudget,
|
|
39
|
+
});
|
|
40
|
+
};
|