@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
|
@@ -279,17 +279,14 @@ async function identifyDuplicateGroups(
|
|
|
279
279
|
|
|
280
280
|
const systemPrompt = `You are scanning a list of memory nodes for DUPLICATES — nodes that describe the exact same specific event or fact. Group duplicates together. Two nodes are duplicates ONLY if they describe the same underlying thing with substantially the same details. Be conservative — nodes about the same person or topic but with different details, timestamps, or context are NOT duplicates. Only include nodes that have at least one true duplicate.`;
|
|
281
281
|
|
|
282
|
-
const response = await provider.sendMessage(
|
|
283
|
-
[
|
|
284
|
-
[DUPE_DETECT_TOOL],
|
|
282
|
+
const response = await provider.sendMessage([userMessage(listing)], {
|
|
283
|
+
tools: [DUPE_DETECT_TOOL],
|
|
285
284
|
systemPrompt,
|
|
286
|
-
{
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
tool_choice: { type: "tool" as const, name: "report_duplicate_groups" },
|
|
290
|
-
},
|
|
285
|
+
config: {
|
|
286
|
+
callSite: "memoryConsolidation" as const,
|
|
287
|
+
tool_choice: { type: "tool" as const, name: "report_duplicate_groups" },
|
|
291
288
|
},
|
|
292
|
-
);
|
|
289
|
+
});
|
|
293
290
|
|
|
294
291
|
const toolBlock = extractToolUse(response);
|
|
295
292
|
if (!toolBlock) return [];
|
|
@@ -458,9 +455,9 @@ async function consolidateChunk(
|
|
|
458
455
|
"Consolidate this partition. Focus on merging duplicates and fading old memories.",
|
|
459
456
|
),
|
|
460
457
|
],
|
|
461
|
-
[CONSOLIDATE_TOOL_SCHEMA],
|
|
462
|
-
systemPrompt,
|
|
463
458
|
{
|
|
459
|
+
tools: [CONSOLIDATE_TOOL_SCHEMA],
|
|
460
|
+
systemPrompt,
|
|
464
461
|
config: {
|
|
465
462
|
callSite: "memoryConsolidation" as const,
|
|
466
463
|
tool_choice: { type: "tool" as const, name: "consolidate_diff" },
|
|
@@ -22,6 +22,7 @@ import { getWorkspaceDir } from "../../util/platform.js";
|
|
|
22
22
|
import { getDb } from "../db-connection.js";
|
|
23
23
|
import { embedWithRetry } from "../embed.js";
|
|
24
24
|
import { generateSparseEmbedding } from "../embedding-backend.js";
|
|
25
|
+
import { wrapMemoryBlock } from "../memory-marker.js";
|
|
25
26
|
import type { QdrantSparseVector } from "../qdrant-client.js";
|
|
26
27
|
import { memorySummaries } from "../schema.js";
|
|
27
28
|
import { conversations } from "../schema/conversations.js";
|
|
@@ -895,13 +896,45 @@ export function stripExistingMemoryInjections(messages: Message[]): Message[] {
|
|
|
895
896
|
const last = messages[messages.length - 1];
|
|
896
897
|
if (!last || last.role !== "user") return messages;
|
|
897
898
|
|
|
898
|
-
const
|
|
899
|
-
if (
|
|
899
|
+
const stripped = stripMemoryPrefixFromUserMessage(last);
|
|
900
|
+
if (stripped === last) return messages;
|
|
900
901
|
|
|
901
|
-
return [
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
902
|
+
return [...messages.slice(0, -1), stripped];
|
|
903
|
+
}
|
|
904
|
+
|
|
905
|
+
/**
|
|
906
|
+
* Strip the memory-injected prefix from a single user message. Returns the
|
|
907
|
+
* same message reference unchanged when it is not a user message or carries no
|
|
908
|
+
* injected prefix, so callers can cheaply detect no-ops. Shared by
|
|
909
|
+
* `stripExistingMemoryInjections` (last message only) and
|
|
910
|
+
* `stripAllMemoryInjections` (every user message).
|
|
911
|
+
*/
|
|
912
|
+
function stripMemoryPrefixFromUserMessage(message: Message): Message {
|
|
913
|
+
if (message.role !== "user") return message;
|
|
914
|
+
const firstNonMemory = countMemoryPrefixBlocks(message.content);
|
|
915
|
+
if (firstNonMemory === 0) return message;
|
|
916
|
+
return { ...message, content: message.content.slice(firstNonMemory) };
|
|
917
|
+
}
|
|
918
|
+
|
|
919
|
+
/**
|
|
920
|
+
* Remove memory-injected blocks from EVERY user message, not just the last.
|
|
921
|
+
*
|
|
922
|
+
* memory-v3 live mode strips the injected `<memory>` block from all historical
|
|
923
|
+
* user messages each turn: it keeps the prompt lean and makes history
|
|
924
|
+
* byte-stable for prompt caching (v2 strips only the last user message — see
|
|
925
|
+
* `stripExistingMemoryInjections`). Reuses the same per-message block
|
|
926
|
+
* recognition as the last-message strip. Wired into the runtime-assembly
|
|
927
|
+
* suppression step (`conversation-runtime-assembly.ts`), which calls it when
|
|
928
|
+
* `memory-v3-live` is on and the v3 injector produced a block this turn.
|
|
929
|
+
*/
|
|
930
|
+
export function stripAllMemoryInjections(messages: Message[]): Message[] {
|
|
931
|
+
let changed = false;
|
|
932
|
+
const result = messages.map((message) => {
|
|
933
|
+
const stripped = stripMemoryPrefixFromUserMessage(message);
|
|
934
|
+
if (stripped !== message) changed = true;
|
|
935
|
+
return stripped;
|
|
936
|
+
});
|
|
937
|
+
return changed ? result : messages;
|
|
905
938
|
}
|
|
906
939
|
|
|
907
940
|
/**
|
|
@@ -933,7 +966,7 @@ function injectTextBlock(messages: Message[], text: string): Message[] {
|
|
|
933
966
|
content: [
|
|
934
967
|
{
|
|
935
968
|
type: "text" as const,
|
|
936
|
-
text:
|
|
969
|
+
text: wrapMemoryBlock(text),
|
|
937
970
|
},
|
|
938
971
|
...userTail.content,
|
|
939
972
|
],
|
|
@@ -977,7 +1010,7 @@ function injectMemoryBlock(
|
|
|
977
1010
|
|
|
978
1011
|
blocks.push({
|
|
979
1012
|
type: "text" as const,
|
|
980
|
-
text:
|
|
1013
|
+
text: wrapMemoryBlock(text),
|
|
981
1014
|
});
|
|
982
1015
|
|
|
983
1016
|
return [
|
|
@@ -1071,17 +1071,14 @@ export async function runGraphExtraction(
|
|
|
1071
1071
|
),
|
|
1072
1072
|
];
|
|
1073
1073
|
|
|
1074
|
-
const response = await provider.sendMessage(
|
|
1075
|
-
|
|
1076
|
-
[EXTRACT_TOOL_SCHEMA],
|
|
1074
|
+
const response = await provider.sendMessage(extractionMessages, {
|
|
1075
|
+
tools: [EXTRACT_TOOL_SCHEMA],
|
|
1077
1076
|
systemPrompt,
|
|
1078
|
-
{
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
tool_choice: { type: "tool" as const, name: "extract_graph_diff" },
|
|
1082
|
-
},
|
|
1077
|
+
config: {
|
|
1078
|
+
callSite: "memoryExtraction" as const,
|
|
1079
|
+
tool_choice: { type: "tool" as const, name: "extract_graph_diff" },
|
|
1083
1080
|
},
|
|
1084
|
-
);
|
|
1081
|
+
});
|
|
1085
1082
|
|
|
1086
1083
|
const toolBlock = extractToolUse(response);
|
|
1087
1084
|
if (!toolBlock) {
|
|
@@ -192,9 +192,9 @@ export async function runNarrativeRefinement(
|
|
|
192
192
|
"Review and refine the narrative structure of these memories. Identify story arcs and assign roles with the benefit of hindsight.",
|
|
193
193
|
),
|
|
194
194
|
],
|
|
195
|
-
[NARRATIVE_TOOL_SCHEMA],
|
|
196
|
-
systemPrompt,
|
|
197
195
|
{
|
|
196
|
+
tools: [NARRATIVE_TOOL_SCHEMA],
|
|
197
|
+
systemPrompt,
|
|
198
198
|
config: {
|
|
199
199
|
callSite: "narrativeRefinement" as const,
|
|
200
200
|
tool_choice: { type: "tool" as const, name: "refine_narratives" },
|
|
@@ -161,9 +161,9 @@ export async function runPatternScan(
|
|
|
161
161
|
"Analyze this memory sample for recurring patterns. Only report patterns you're confident about.",
|
|
162
162
|
),
|
|
163
163
|
],
|
|
164
|
-
[PATTERN_TOOL_SCHEMA],
|
|
165
|
-
systemPrompt,
|
|
166
164
|
{
|
|
165
|
+
tools: [PATTERN_TOOL_SCHEMA],
|
|
166
|
+
systemPrompt,
|
|
167
167
|
config: {
|
|
168
168
|
callSite: "patternScan" as const,
|
|
169
169
|
tool_choice: { type: "tool" as const, name: "detect_patterns" },
|
|
@@ -113,10 +113,9 @@ async function rerankAndDedup(
|
|
|
113
113
|
})
|
|
114
114
|
.join("\n");
|
|
115
115
|
|
|
116
|
-
const response = await provider.sendMessage(
|
|
117
|
-
[
|
|
118
|
-
|
|
119
|
-
`You are selecting memories for an AI assistant's context at conversation start. You see ${candidates.length} candidate memories ranked by algorithmic score.
|
|
116
|
+
const response = await provider.sendMessage([userMessage(listing)], {
|
|
117
|
+
tools: [RERANK_TOOL],
|
|
118
|
+
systemPrompt: `You are selecting memories for an AI assistant's context at conversation start. You see ${candidates.length} candidate memories ranked by algorithmic score.
|
|
120
119
|
|
|
121
120
|
Your job:
|
|
122
121
|
1. REMOVE DUPLICATES: If multiple entries describe the same event/fact/topic, keep ONLY the most complete version. Be aggressive — even partial overlaps should be deduplicated.
|
|
@@ -125,15 +124,13 @@ Your job:
|
|
|
125
124
|
- Diversity (don't load 5 memories about the same topic)
|
|
126
125
|
- Importance (key relationship moments, active commitments, identity-defining events)
|
|
127
126
|
3. Return the IDs in order of importance (most important first).`,
|
|
128
|
-
{
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
temperature: 0,
|
|
134
|
-
},
|
|
127
|
+
config: {
|
|
128
|
+
callSite: "memoryRetrieval" as const,
|
|
129
|
+
tool_choice: { type: "tool" as const, name: "select_memories" },
|
|
130
|
+
thinking: { type: "disabled" },
|
|
131
|
+
temperature: 0,
|
|
135
132
|
},
|
|
136
|
-
);
|
|
133
|
+
});
|
|
137
134
|
|
|
138
135
|
const toolBlock = extractToolUse(response);
|
|
139
136
|
if (!toolBlock) return candidates.slice(0, maxNodes);
|
|
@@ -214,9 +211,9 @@ async function dedupForTurn(
|
|
|
214
211
|
|
|
215
212
|
const response = await provider.sendMessage(
|
|
216
213
|
[userMessage(`query:\n${query}\n\nitems:\n\n${listing}`)],
|
|
217
|
-
[SELECT_ITEMS_TOOL],
|
|
218
|
-
`Dedupe + rerank the following numbered items. Pick the most relevant items to the query. Call the select_items tool.\n\nBe aggressive on dedup — when multiple items describe the same event, fact, or status, keep ONLY the richest version. But be generous on relevance — only cut items that are completely irrelevant to the query. If it's even tangentially related, keep it.`,
|
|
219
214
|
{
|
|
215
|
+
tools: [SELECT_ITEMS_TOOL],
|
|
216
|
+
systemPrompt: `Dedupe + rerank the following numbered items. Pick the most relevant items to the query. Call the select_items tool.\n\nBe aggressive on dedup — when multiple items describe the same event, fact, or status, keep ONLY the richest version. But be generous on relevance — only cut items that are completely irrelevant to the query. If it's even tangentially related, keep it.`,
|
|
220
217
|
config: {
|
|
221
218
|
callSite: "memoryRetrieval" as const,
|
|
222
219
|
tool_choice: { type: "tool" as const, name: "select_items" },
|
|
@@ -304,19 +301,16 @@ async function dedupCrossCategory(
|
|
|
304
301
|
})
|
|
305
302
|
.join("\n");
|
|
306
303
|
|
|
307
|
-
const response = await provider.sendMessage(
|
|
308
|
-
[
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
thinking: { type: "disabled" },
|
|
316
|
-
temperature: 0,
|
|
317
|
-
},
|
|
304
|
+
const response = await provider.sendMessage([userMessage(listing)], {
|
|
305
|
+
tools: [DEDUP_ITEMS_TOOL],
|
|
306
|
+
systemPrompt: `Deduplicate the following numbered items. When multiple items describe the same event, fact, or status, keep ONLY the richest version. Keep ALL items that are not duplicates — do not filter by relevance or topic. Call the select_items tool with every item that survives dedup.`,
|
|
307
|
+
config: {
|
|
308
|
+
callSite: "memoryRetrieval" as const,
|
|
309
|
+
tool_choice: { type: "tool" as const, name: "select_items" },
|
|
310
|
+
thinking: { type: "disabled" },
|
|
311
|
+
temperature: 0,
|
|
318
312
|
},
|
|
319
|
-
);
|
|
313
|
+
});
|
|
320
314
|
|
|
321
315
|
const toolBlock = extractToolUse(response);
|
|
322
316
|
if (!toolBlock) return candidates.slice(0, maxNodes);
|
|
@@ -15,7 +15,7 @@ const RECALL_DEPTHS = ["fast", "standard", "deep"] as const;
|
|
|
15
15
|
* Explicit local information search across memory, conversations, and
|
|
16
16
|
* workspace files.
|
|
17
17
|
*/
|
|
18
|
-
export const graphRecallDefinition
|
|
18
|
+
export const graphRecallDefinition = {
|
|
19
19
|
name: "recall",
|
|
20
20
|
description:
|
|
21
21
|
'Search local information the moment you feel uncertain. Use recall for memory, past conversations, and workspace files — before you guess, before you ask, before you hedge. Auto-injection is incomplete by design; it surfaces patterns, not the specifics you need to answer well. If you catch yourself reaching for "I think", "I believe", "if I remember", "didn\'t we", "last time" — that\'s the signal. Recall. If a turn references someone, a place, a decision, a document, or prior work you should be able to find locally — recall. Call it multiple times per conversation if the turn warrants it. Be specific in your query for best results.',
|
|
@@ -51,7 +51,7 @@ export const graphRecallDefinition: ToolDefinition = {
|
|
|
51
51
|
},
|
|
52
52
|
required: ["query"],
|
|
53
53
|
},
|
|
54
|
-
};
|
|
54
|
+
} satisfies ToolDefinition;
|
|
55
55
|
|
|
56
56
|
/**
|
|
57
57
|
* `remember` tool description. The retrospective pass catches what isn't
|
|
@@ -70,7 +70,7 @@ const REMEMBER_DESCRIPTION =
|
|
|
70
70
|
* of the buffer into longer-form storage runs as a separate periodic job in
|
|
71
71
|
* both modes.
|
|
72
72
|
*/
|
|
73
|
-
export const graphRememberDefinition
|
|
73
|
+
export const graphRememberDefinition = {
|
|
74
74
|
name: "remember",
|
|
75
75
|
description: REMEMBER_DESCRIPTION,
|
|
76
76
|
input_schema: {
|
|
@@ -89,4 +89,4 @@ export const graphRememberDefinition: ToolDefinition = {
|
|
|
89
89
|
},
|
|
90
90
|
required: ["content"],
|
|
91
91
|
},
|
|
92
|
-
};
|
|
92
|
+
} satisfies ToolDefinition;
|
|
@@ -295,44 +295,44 @@ Bad → Good (incomplete phrase → complete):
|
|
|
295
295
|
"Generate personalized conversation starters based on my context.",
|
|
296
296
|
),
|
|
297
297
|
],
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
298
|
+
{
|
|
299
|
+
tools: [
|
|
300
|
+
{
|
|
301
|
+
name: "store_conversation_starters",
|
|
302
|
+
description: "Store generated conversation starter suggestions",
|
|
303
|
+
input_schema: {
|
|
304
|
+
type: "object" as const,
|
|
305
|
+
properties: {
|
|
306
|
+
starters: {
|
|
307
|
+
type: "array",
|
|
308
|
+
items: {
|
|
309
|
+
type: "object",
|
|
310
|
+
properties: {
|
|
311
|
+
label: {
|
|
312
|
+
type: "string",
|
|
313
|
+
description:
|
|
314
|
+
"User-voice chip label (2-7 words, max 40 chars, verb-first)",
|
|
315
|
+
},
|
|
316
|
+
prompt: {
|
|
317
|
+
type: "string",
|
|
318
|
+
description:
|
|
319
|
+
"Full message sent on click (1-2 natural sentences, as the user would say it)",
|
|
320
|
+
},
|
|
321
|
+
category: {
|
|
322
|
+
type: "string",
|
|
323
|
+
enum: [...CONVERSATION_STARTER_CATEGORIES],
|
|
324
|
+
description: "Capability category for grouping",
|
|
325
|
+
},
|
|
324
326
|
},
|
|
327
|
+
required: ["label", "prompt", "category"],
|
|
325
328
|
},
|
|
326
|
-
required: ["label", "prompt", "category"],
|
|
327
329
|
},
|
|
328
330
|
},
|
|
331
|
+
required: ["starters"],
|
|
329
332
|
},
|
|
330
|
-
required: ["starters"],
|
|
331
333
|
},
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
systemPrompt,
|
|
335
|
-
{
|
|
334
|
+
],
|
|
335
|
+
systemPrompt,
|
|
336
336
|
config: {
|
|
337
337
|
callSite: "conversationStarters" as const,
|
|
338
338
|
max_tokens: 2048,
|
|
@@ -180,9 +180,8 @@ async function summarizeWithLLM(
|
|
|
180
180
|
try {
|
|
181
181
|
const response = await provider.sendMessage(
|
|
182
182
|
[userMessage(userParts.join("\n"))],
|
|
183
|
-
undefined,
|
|
184
|
-
systemPrompt,
|
|
185
183
|
{
|
|
184
|
+
systemPrompt,
|
|
186
185
|
config: {
|
|
187
186
|
callSite: "conversationSummarization" as const,
|
|
188
187
|
max_tokens: SUMMARY_MAX_TOKENS,
|
package/src/memory/jobs-store.ts
CHANGED
|
@@ -44,6 +44,8 @@ export type MemoryJobType =
|
|
|
44
44
|
| "memory_v2_migrate"
|
|
45
45
|
| "memory_v2_reembed"
|
|
46
46
|
| "memory_v2_activation_recompute"
|
|
47
|
+
| "memory_v3_maintain"
|
|
48
|
+
// Retired/legacy — no live handler; persisted rows drop via LEGACY_JOB_TYPES.
|
|
47
49
|
| "memory_v3_consolidate"
|
|
48
50
|
| "memory_v3_index_maintenance"
|
|
49
51
|
| "memory_v3_edge_learning"
|
|
@@ -70,7 +72,7 @@ export const SLOW_LLM_JOB_TYPES: MemoryJobType[] = [
|
|
|
70
72
|
"generate_conversation_starters",
|
|
71
73
|
"memory_v2_sweep",
|
|
72
74
|
"memory_v2_consolidate",
|
|
73
|
-
"
|
|
75
|
+
"memory_v3_maintain",
|
|
74
76
|
"memory_v2_migrate",
|
|
75
77
|
"memory_retrospective",
|
|
76
78
|
"backfill",
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { join } from "node:path";
|
|
2
2
|
|
|
3
|
+
import { isAssistantFeatureFlagEnabled } from "../config/assistant-feature-flags.js";
|
|
3
4
|
import { getConfig } from "../config/loader.js";
|
|
4
5
|
import type { AssistantConfig } from "../config/types.js";
|
|
5
6
|
import {
|
|
@@ -84,9 +85,7 @@ import {
|
|
|
84
85
|
memoryV2ConsolidateJob,
|
|
85
86
|
} from "./v2/consolidation-job.js";
|
|
86
87
|
import { memoryV2SweepJob } from "./v2/sweep-job.js";
|
|
87
|
-
import {
|
|
88
|
-
import { memoryV3EdgeLearningJob } from "./v3/edge-learning-job.js";
|
|
89
|
-
import { memoryV3IndexMaintenanceJob } from "./v3/maintenance.js";
|
|
88
|
+
import { maintainJob as memoryV3MaintainJob } from "./v3/maintain-job.js";
|
|
90
89
|
|
|
91
90
|
const log = getLogger("memory-jobs-worker");
|
|
92
91
|
|
|
@@ -126,6 +125,11 @@ const LEGACY_JOB_TYPES = new Set([
|
|
|
126
125
|
"generate_capability_cards",
|
|
127
126
|
"generate_thread_starters",
|
|
128
127
|
"memory_v2_rebuild_edges",
|
|
128
|
+
// Retired memory-v3 job types — handlers were removed in the v3 rip. Kept
|
|
129
|
+
// here so pre-upgrade rows enqueued by the old write path drop gracefully.
|
|
130
|
+
"memory_v3_consolidate",
|
|
131
|
+
"memory_v3_index_maintenance",
|
|
132
|
+
"memory_v3_edge_learning",
|
|
129
133
|
]);
|
|
130
134
|
|
|
131
135
|
export const POLL_INTERVAL_MIN_MS = 1_500;
|
|
@@ -607,16 +611,6 @@ async function processJob(
|
|
|
607
611
|
case "memory_v2_consolidate":
|
|
608
612
|
await memoryV2ConsolidateJob(job, config);
|
|
609
613
|
return;
|
|
610
|
-
case "memory_v3_consolidate":
|
|
611
|
-
await memoryV3ConsolidateJob(job, config);
|
|
612
|
-
return;
|
|
613
|
-
case "memory_v3_index_maintenance":
|
|
614
|
-
await memoryV3IndexMaintenanceJob(job);
|
|
615
|
-
return;
|
|
616
|
-
case "memory_v3_edge_learning":
|
|
617
|
-
// Fast lane: bounded DB work (decay + reinforce + read), no LLM.
|
|
618
|
-
memoryV3EdgeLearningJob(job);
|
|
619
|
-
return;
|
|
620
614
|
case "memory_v2_migrate":
|
|
621
615
|
await memoryV2MigrateJob(job, config);
|
|
622
616
|
return;
|
|
@@ -626,6 +620,9 @@ async function processJob(
|
|
|
626
620
|
case "memory_v2_activation_recompute":
|
|
627
621
|
await memoryV2ActivationRecomputeJob(job, config);
|
|
628
622
|
return;
|
|
623
|
+
case "memory_v3_maintain":
|
|
624
|
+
await memoryV3MaintainJob(job, config);
|
|
625
|
+
return;
|
|
629
626
|
case "memory_retrospective":
|
|
630
627
|
await memoryRetrospectiveJob(job, config);
|
|
631
628
|
return;
|
|
@@ -688,6 +685,12 @@ const GRAPH_DECAY_INTERVAL_MS = 60 * 60 * 1000; // 1 hour
|
|
|
688
685
|
const GRAPH_CONSOLIDATE_INTERVAL_MS = 4 * 60 * 60 * 1000; // 4 hours
|
|
689
686
|
const GRAPH_PATTERN_SCAN_INTERVAL_MS = 24 * 60 * 60 * 1000; // 1 day
|
|
690
687
|
const GRAPH_NARRATIVE_INTERVAL_MS = 7 * 24 * 60 * 60 * 1000; // 1 week
|
|
688
|
+
// Backstop cadence for v3 self-maintenance. The primary trigger is the
|
|
689
|
+
// post-consolidation follow-up (see `consolidation-job.ts`); this interval only
|
|
690
|
+
// covers the case where that follow-up is missed (enqueue failure, or a v3-on
|
|
691
|
+
// install with v2 consolidation disabled). A conservative cadence is fine since
|
|
692
|
+
// the maintenance pass is idempotent and cheap when there's nothing to do.
|
|
693
|
+
const GRAPH_V3_MAINTAIN_INTERVAL_MS = 6 * 60 * 60 * 1000; // 6 hours
|
|
691
694
|
|
|
692
695
|
export const GRAPH_MAINTENANCE_CHECKPOINTS = {
|
|
693
696
|
decay: "graph_maintenance:decay:last_run",
|
|
@@ -695,7 +698,7 @@ export const GRAPH_MAINTENANCE_CHECKPOINTS = {
|
|
|
695
698
|
patternScan: "graph_maintenance:pattern_scan:last_run",
|
|
696
699
|
narrative: "graph_maintenance:narrative:last_run",
|
|
697
700
|
memoryV2Consolidate: "memory_v2_consolidate_last_run",
|
|
698
|
-
|
|
701
|
+
memoryV3Maintain: "memory_v3_maintain_last_run",
|
|
699
702
|
} as const;
|
|
700
703
|
|
|
701
704
|
/**
|
|
@@ -707,15 +710,9 @@ export const GRAPH_MAINTENANCE_CHECKPOINTS = {
|
|
|
707
710
|
* - v2 inactive → the four v1 entries (decay, consolidate, pattern_scan,
|
|
708
711
|
* narrative) are scheduled instead.
|
|
709
712
|
*
|
|
710
|
-
*
|
|
711
|
-
*
|
|
712
|
-
*
|
|
713
|
-
* is scheduled INSTEAD of `memory_v2_consolidate` — same shared buffer +
|
|
714
|
-
* standing-context files, additionally authored into the v3 tree. When the v3
|
|
715
|
-
* write flag is off (default) the v2 consolidator stays the sole drainer,
|
|
716
|
-
* unchanged. The retarget is a clean conditional, fully reversible via the flag.
|
|
717
|
-
* Concept pages stay the shared canonical store, so the v2 router keeps working
|
|
718
|
-
* off pages v3 writes regardless of which consolidator ran.
|
|
713
|
+
* The `memory/buffer.md` is shared, so exactly one consolidator owns the drain
|
|
714
|
+
* at a time. When v2 is active, the v2 consolidator (`memory_v2_consolidate`)
|
|
715
|
+
* is the sole buffer-drainer.
|
|
719
716
|
*
|
|
720
717
|
* Read/write paths route to v2 when the flag is on, so v1 graph data goes
|
|
721
718
|
* unread; running v1 maintenance alongside v2 is wasted compute and LLM
|
|
@@ -727,28 +724,24 @@ export const GRAPH_MAINTENANCE_CHECKPOINTS = {
|
|
|
727
724
|
* Sweep is intentionally not on this schedule: it is debounced from the
|
|
728
725
|
* live `graph_extract` trigger path (see `indexMessageNow` in `indexer.ts`)
|
|
729
726
|
* so it runs on the same idle/message-count cadence.
|
|
727
|
+
*
|
|
728
|
+
* Independently of the v1/v2 split, a flag-gated `memory_v3_maintain` backstop
|
|
729
|
+
* is appended when a v3 path is active so the topic tree self-heals even if the
|
|
730
|
+
* primary post-consolidation follow-up enqueue is missed.
|
|
730
731
|
*/
|
|
731
732
|
export function maybeEnqueueGraphMaintenanceJobs(
|
|
732
733
|
config: AssistantConfig,
|
|
733
734
|
nowMs = Date.now(),
|
|
734
735
|
): void {
|
|
735
736
|
const v2Active = config.memory.v2.enabled;
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
//
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
jobType: "memory_v3_consolidate" as MemoryJobType,
|
|
745
|
-
}
|
|
746
|
-
: {
|
|
747
|
-
key: GRAPH_MAINTENANCE_CHECKPOINTS.memoryV2Consolidate,
|
|
748
|
-
intervalMs:
|
|
749
|
-
config.memory.v2.consolidation_interval_hours * 60 * 60 * 1000,
|
|
750
|
-
jobType: "memory_v2_consolidate" as MemoryJobType,
|
|
751
|
-
};
|
|
737
|
+
|
|
738
|
+
// The single buffer-drainer entry for the v2-active branch. Referenced again
|
|
739
|
+
// below by the size-based trigger.
|
|
740
|
+
const consolidateEntry = {
|
|
741
|
+
key: GRAPH_MAINTENANCE_CHECKPOINTS.memoryV2Consolidate,
|
|
742
|
+
intervalMs: config.memory.v2.consolidation_interval_hours * 60 * 60 * 1000,
|
|
743
|
+
jobType: "memory_v2_consolidate" as MemoryJobType,
|
|
744
|
+
};
|
|
752
745
|
|
|
753
746
|
const schedule: Array<{
|
|
754
747
|
key: string;
|
|
@@ -779,6 +772,25 @@ export function maybeEnqueueGraphMaintenanceJobs(
|
|
|
779
772
|
},
|
|
780
773
|
];
|
|
781
774
|
|
|
775
|
+
// v3 self-maintenance backstop. Orthogonal to the v1/v2 mutual exclusion
|
|
776
|
+
// above: it owns its own checkpoint and operates on the v3 topic tree, so it
|
|
777
|
+
// runs under either branch. Gated on the same flags that gate the v3 plugin
|
|
778
|
+
// so it stays inert when v3 is off. The post-consolidation follow-up in
|
|
779
|
+
// `consolidation-job.ts` remains the primary trigger; this interval only
|
|
780
|
+
// self-heals when that follow-up is missed (failed enqueue, or v3-on with v2
|
|
781
|
+
// consolidation disabled). The job handler itself no-ops when v3 is off, so
|
|
782
|
+
// this guard is belt-and-suspenders that also avoids a wasted enqueue.
|
|
783
|
+
if (
|
|
784
|
+
isAssistantFeatureFlagEnabled("memory-v3-shadow", config) ||
|
|
785
|
+
isAssistantFeatureFlagEnabled("memory-v3-live", config)
|
|
786
|
+
) {
|
|
787
|
+
schedule.push({
|
|
788
|
+
key: GRAPH_MAINTENANCE_CHECKPOINTS.memoryV3Maintain,
|
|
789
|
+
intervalMs: GRAPH_V3_MAINTAIN_INTERVAL_MS,
|
|
790
|
+
jobType: "memory_v3_maintain",
|
|
791
|
+
});
|
|
792
|
+
}
|
|
793
|
+
|
|
782
794
|
let enqueuedConsolidate = false;
|
|
783
795
|
for (const { key, intervalMs, jobType } of schedule) {
|
|
784
796
|
const lastRun = parseInt(getMemoryCheckpoint(key) ?? "0", 10);
|
|
@@ -259,36 +259,6 @@ export class ClickHouseLlmRequestLogSource implements LlmRequestLogSource {
|
|
|
259
259
|
return rows.map((r) => this.toLogRow(r));
|
|
260
260
|
}
|
|
261
261
|
|
|
262
|
-
async getPreviousNonCompactionCallCreatedAt(
|
|
263
|
-
conversationId: string,
|
|
264
|
-
beforeCreatedAt: number,
|
|
265
|
-
): Promise<number | null> {
|
|
266
|
-
const aid = await this.assistantId();
|
|
267
|
-
// "Non-compactionAgent" includes empty-string `call_site`, which is
|
|
268
|
-
// what the CH mirror writes for pre-migration-264 rows whose SQLite
|
|
269
|
-
// value was NULL (CH columns are `DEFAULT ''`, not Nullable — see
|
|
270
|
-
// `toLogRow`). The local store treats NULL `callSite` the same way,
|
|
271
|
-
// so the predicate stays in sync.
|
|
272
|
-
const sql = `SELECT
|
|
273
|
-
toUnixTimestamp64Milli(created_at) AS created_at
|
|
274
|
-
FROM ${this.tableRef()}
|
|
275
|
-
WHERE assistant_id = {assistant_id:String}
|
|
276
|
-
AND conversation_id = {conversation_id:String}
|
|
277
|
-
AND created_at < fromUnixTimestamp64Milli({before_created_at:Int64})
|
|
278
|
-
AND call_site != {call_site:String}
|
|
279
|
-
ORDER BY created_at DESC, id DESC
|
|
280
|
-
LIMIT 1
|
|
281
|
-
FORMAT JSONEachRow`;
|
|
282
|
-
const rows = await this.exec(sql, {
|
|
283
|
-
assistant_id: aid,
|
|
284
|
-
conversation_id: conversationId,
|
|
285
|
-
call_site: "compactionAgent",
|
|
286
|
-
before_created_at: String(beforeCreatedAt),
|
|
287
|
-
});
|
|
288
|
-
const value = rows[0]?.created_at;
|
|
289
|
-
return value === undefined ? null : Number(value);
|
|
290
|
-
}
|
|
291
|
-
|
|
292
262
|
private async selectByMessageIds(ids: string[]): Promise<LogRow[]> {
|
|
293
263
|
if (ids.length === 0) return [];
|
|
294
264
|
const aid = await this.assistantId();
|
|
@@ -367,7 +337,11 @@ export class ClickHouseLlmRequestLogSource implements LlmRequestLogSource {
|
|
|
367
337
|
if (!res.ok) {
|
|
368
338
|
const body = await res.text().catch(() => "");
|
|
369
339
|
log.error(
|
|
370
|
-
{
|
|
340
|
+
{
|
|
341
|
+
status: res.status,
|
|
342
|
+
table: this.config.table,
|
|
343
|
+
bodySnippet: body.slice(0, 200),
|
|
344
|
+
},
|
|
371
345
|
"ClickHouse query failed",
|
|
372
346
|
);
|
|
373
347
|
throw new Error(
|
|
@@ -11,7 +11,6 @@
|
|
|
11
11
|
import type { LlmRequestLogSource } from "./llm-request-log-source.js";
|
|
12
12
|
import {
|
|
13
13
|
getCompactionLogsBetween,
|
|
14
|
-
getPreviousNonCompactionCallCreatedAt,
|
|
15
14
|
getRequestLogById,
|
|
16
15
|
getRequestLogsByConversationId,
|
|
17
16
|
getRequestLogsByMessageId,
|
|
@@ -44,14 +43,4 @@ export class LocalLlmRequestLogSource implements LlmRequestLogSource {
|
|
|
44
43
|
beforeCreatedAt,
|
|
45
44
|
);
|
|
46
45
|
}
|
|
47
|
-
|
|
48
|
-
async getPreviousNonCompactionCallCreatedAt(
|
|
49
|
-
conversationId: string,
|
|
50
|
-
beforeCreatedAt: number,
|
|
51
|
-
): Promise<number | null> {
|
|
52
|
-
return getPreviousNonCompactionCallCreatedAt(
|
|
53
|
-
conversationId,
|
|
54
|
-
beforeCreatedAt,
|
|
55
|
-
);
|
|
56
|
-
}
|
|
57
46
|
}
|