@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
|
@@ -1,567 +1,281 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `assistant memory v3` CLI subgroup.
|
|
3
3
|
*
|
|
4
|
-
* Operator-facing
|
|
5
|
-
*
|
|
4
|
+
* Operator-facing tree-gardening + core-editing subcommands for the v3 memory
|
|
5
|
+
* subsystem (leaf-tree activation model). The daemon owns the live tree, so the
|
|
6
|
+
* mutating verbs route through `cliIpcCall` to handlers that run inside the
|
|
7
|
+
* assistant process (where the in-memory lanes can be invalidated after a
|
|
8
|
+
* write). The read-only `health` report and the `set-core` cost preview also
|
|
9
|
+
* route through the daemon so it stays the single source of truth for the live
|
|
10
|
+
* workspace tree.
|
|
6
11
|
*
|
|
7
12
|
* Subcommands:
|
|
8
13
|
*
|
|
9
|
-
* - `
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* - `
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* v2-only breakdown by provenance lane.
|
|
14
|
+
* - `health` — print the structural health report (read-only).
|
|
15
|
+
* - `reconcile` — v1 convergence pass: rewrites any dangling page/core ref to
|
|
16
|
+
* the current on-disk tree and prunes stale core entries. It does NOT yet
|
|
17
|
+
* detect renames/moves/splits — that requires a captured prior leaf
|
|
18
|
+
* snapshot (a follow-up), so `renames` is always empty in v1.
|
|
19
|
+
* - `set-core` — add/remove always-on core leaves. Validates that every added
|
|
20
|
+
* leaf exists, previews the resulting always-on page count, and writes only
|
|
21
|
+
* on `--yes`.
|
|
22
|
+
* - `rebuild-index` — invalidate the v3 lanes so the next turn rebuilds.
|
|
19
23
|
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* nothing. `--json` emits the raw daemon payload for any subcommand.
|
|
24
|
+
* Deferred to follow-ups: thin `add-leaf` / `rename-leaf` / `delete-leaf`
|
|
25
|
+
* wrappers (edit the leaf file[s] then reconcile).
|
|
23
26
|
*/
|
|
24
27
|
|
|
25
|
-
import { mkdirSync, writeFileSync } from "node:fs";
|
|
26
|
-
import { join } from "node:path";
|
|
27
|
-
|
|
28
28
|
import type { Command } from "commander";
|
|
29
29
|
|
|
30
30
|
import { cliIpcCall } from "../../ipc/cli-client.js";
|
|
31
31
|
import type {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
ShadowDiffResult,
|
|
32
|
+
MemoryV3HealthResult,
|
|
33
|
+
MemoryV3RebuildIndexResult,
|
|
34
|
+
MemoryV3ReconcileResult,
|
|
35
|
+
MemoryV3SetCoreResult,
|
|
37
36
|
} from "../../runtime/routes/memory-v3-routes.js";
|
|
38
37
|
import { registerCommand } from "../lib/register-command.js";
|
|
39
38
|
import { log } from "../logger.js";
|
|
40
|
-
import {
|
|
41
|
-
renderLlmCalls,
|
|
42
|
-
renderSeedEdges,
|
|
43
|
-
renderShadowDiff,
|
|
44
|
-
renderSimulation,
|
|
45
|
-
renderTree,
|
|
46
|
-
renderValidationReport,
|
|
47
|
-
reportHasDefects,
|
|
48
|
-
} from "./memory-v3-render.js";
|
|
49
39
|
|
|
50
|
-
/**
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
*/
|
|
55
|
-
function parsePositiveFlag(
|
|
56
|
-
raw: string | undefined,
|
|
57
|
-
opts: { int: boolean },
|
|
58
|
-
): { value?: number; error?: boolean } {
|
|
59
|
-
if (raw === undefined) return {};
|
|
60
|
-
const n = Number(raw);
|
|
61
|
-
if (!Number.isFinite(n) || n <= 0 || (opts.int && !Number.isInteger(n))) {
|
|
62
|
-
return { error: true };
|
|
63
|
-
}
|
|
64
|
-
return { value: n };
|
|
40
|
+
/** Commander collector for a repeatable option: accumulates each value. */
|
|
41
|
+
function collect(val: string, acc: string[]): string[] {
|
|
42
|
+
acc.push(val);
|
|
43
|
+
return acc;
|
|
65
44
|
}
|
|
66
45
|
|
|
67
|
-
/** Valid lane names accepted by `--lanes` (matches memory.v3.lanes keys). */
|
|
68
|
-
const V3_LANE_NAMES = ["hot", "sparse", "dense", "tree", "edges"] as const;
|
|
69
|
-
|
|
70
46
|
export function registerMemoryV3Command(program: Command): void {
|
|
71
|
-
// Reuse an existing `memory` parent if
|
|
72
|
-
//
|
|
47
|
+
// Reuse an existing `memory` parent if some other registrar attached to it
|
|
48
|
+
// first; otherwise create one. This keeps the registration order between
|
|
73
49
|
// sibling memory registrars unconstrained.
|
|
74
50
|
const memory =
|
|
75
51
|
program.commands.find((c) => c.name() === "memory") ??
|
|
76
|
-
program
|
|
77
|
-
.command("memory")
|
|
78
|
-
.description("Manage the memory subsystem (concept-page model)");
|
|
52
|
+
program.command("memory").description("Manage the memory subsystem");
|
|
79
53
|
|
|
80
54
|
registerCommand(memory, {
|
|
81
55
|
name: "v3",
|
|
82
56
|
transport: "ipc",
|
|
83
|
-
description: "Memory v3
|
|
57
|
+
description: "Memory v3 tree-gardening and core-editing (leaf-tree model)",
|
|
84
58
|
build: (v3) => {
|
|
85
59
|
v3.addHelpText(
|
|
86
60
|
"after",
|
|
87
61
|
`
|
|
88
|
-
The v3 memory subsystem
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
mutate nothing and run no LLM.
|
|
62
|
+
The v3 memory subsystem organizes concept pages under a curated leaf tree
|
|
63
|
+
(/workspace/memory/v3/data/) and pins an always-on "core" set of leaves.
|
|
64
|
+
These commands garden that tree safely: each mutating verb snapshots and
|
|
65
|
+
fail-closed validates before committing, and invalidates the live lanes so
|
|
66
|
+
the next turn rebuilds from the reconciled state.
|
|
94
67
|
|
|
95
68
|
Examples:
|
|
96
|
-
$ assistant memory v3
|
|
97
|
-
$ assistant memory v3
|
|
98
|
-
$ assistant memory v3
|
|
99
|
-
$ assistant memory v3
|
|
100
|
-
$ assistant memory v3
|
|
69
|
+
$ assistant memory v3 health
|
|
70
|
+
$ assistant memory v3 set-core --add domain-a/topic-x
|
|
71
|
+
$ assistant memory v3 set-core --remove domain-a/topic-y --yes
|
|
72
|
+
$ assistant memory v3 reconcile
|
|
73
|
+
$ assistant memory v3 rebuild-index`,
|
|
101
74
|
);
|
|
102
75
|
|
|
103
|
-
// ──
|
|
76
|
+
// ── health ────────────────────────────────────────────────────────────
|
|
104
77
|
|
|
105
|
-
v3.command("
|
|
106
|
-
.description(
|
|
107
|
-
|
|
108
|
-
)
|
|
109
|
-
.option("--json", "Emit raw JSON instead of a formatted report")
|
|
78
|
+
v3.command("health")
|
|
79
|
+
.description("Print the v3 structural health report (read-only)")
|
|
80
|
+
.option("--json", "Emit raw JSON instead of the rendered report")
|
|
110
81
|
.addHelpText(
|
|
111
82
|
"after",
|
|
112
83
|
`
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
- Stale indexes (a node older than a child it composes)
|
|
118
|
-
- Unknown edge targets (page edges: pointing at a missing slug)
|
|
119
|
-
|
|
120
|
-
Read-only — mutates nothing. Exits non-zero if any defect is reported, so it
|
|
121
|
-
is usable as a pre-flight check while the v2 → v3 migration is in flight.
|
|
84
|
+
Loads the live leaf tree + core set and reports where the taxonomy has
|
|
85
|
+
drifted from the page graph: unassigned slugs, dangling refs, novel
|
|
86
|
+
clusters, and over/under-sized leaves. Read-only — no writes. Prints
|
|
87
|
+
"all green" when no maintenance is warranted.
|
|
122
88
|
|
|
123
89
|
Examples:
|
|
124
|
-
$ assistant memory v3
|
|
125
|
-
$ assistant memory v3
|
|
90
|
+
$ assistant memory v3 health
|
|
91
|
+
$ assistant memory v3 health --json | jq '.counts'`,
|
|
126
92
|
)
|
|
127
93
|
.action(async (opts: { json?: boolean }) => {
|
|
128
|
-
const result = await cliIpcCall<
|
|
129
|
-
"
|
|
94
|
+
const result = await cliIpcCall<MemoryV3HealthResult>(
|
|
95
|
+
"memory_v3_health",
|
|
130
96
|
{ body: {} },
|
|
131
97
|
);
|
|
132
|
-
|
|
133
98
|
if (!result.ok) {
|
|
134
|
-
log.error(result.error ?? "Failed to
|
|
99
|
+
log.error(result.error ?? "Failed to compute v3 health");
|
|
135
100
|
process.exitCode = 1;
|
|
136
101
|
return;
|
|
137
102
|
}
|
|
138
|
-
|
|
139
|
-
const report = result.result!;
|
|
140
|
-
|
|
103
|
+
const payload = result.result!;
|
|
141
104
|
if (opts.json === true) {
|
|
142
|
-
log.info(JSON.stringify(
|
|
143
|
-
|
|
144
|
-
log.info(renderValidationReport(report));
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
if (reportHasDefects(report)) {
|
|
148
|
-
process.exitCode = 1;
|
|
105
|
+
log.info(JSON.stringify(payload, null, 2));
|
|
106
|
+
return;
|
|
149
107
|
}
|
|
108
|
+
log.info(
|
|
109
|
+
payload.rendered === ""
|
|
110
|
+
? "memory-v3 health: all green"
|
|
111
|
+
: payload.rendered,
|
|
112
|
+
);
|
|
150
113
|
});
|
|
151
114
|
|
|
152
|
-
// ──
|
|
115
|
+
// ── reconcile ─────────────────────────────────────────────────────────
|
|
153
116
|
|
|
154
|
-
v3.command("
|
|
117
|
+
v3.command("reconcile")
|
|
155
118
|
.description(
|
|
156
|
-
"
|
|
119
|
+
"v1 convergence/prune pass over page/core refs (no rename detection yet)",
|
|
157
120
|
)
|
|
158
|
-
.option("--json", "Emit raw JSON instead of a formatted
|
|
121
|
+
.option("--json", "Emit raw JSON instead of a formatted summary")
|
|
159
122
|
.addHelpText(
|
|
160
123
|
"after",
|
|
161
124
|
`
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
125
|
+
Runs a convergence pass over the leaf tree: rewrites any page leaves:
|
|
126
|
+
frontmatter or core.json entry that dangles to a path the current on-disk
|
|
127
|
+
tree no longer has, and prunes stale core entries. Fail-closed: snapshots
|
|
128
|
+
before mutating and rolls back if any dangling reference survives
|
|
129
|
+
validation. On success the v3 lanes are invalidated.
|
|
130
|
+
|
|
131
|
+
Limitation: v1 cannot detect renames/moves/splits. The reconciler diffs
|
|
132
|
+
the current tree against itself (there is no captured "before" snapshot),
|
|
133
|
+
so renames always report as empty and a true rename surfaces as a
|
|
134
|
+
delete + add. Full rename/move/split detection requires persisting a prior
|
|
135
|
+
leaf snapshot and is a planned follow-up.
|
|
169
136
|
|
|
170
137
|
Examples:
|
|
171
|
-
$ assistant memory v3
|
|
172
|
-
$ assistant memory v3
|
|
138
|
+
$ assistant memory v3 reconcile
|
|
139
|
+
$ assistant memory v3 reconcile --json | jq '.prunedCore'`,
|
|
173
140
|
)
|
|
174
141
|
.action(async (opts: { json?: boolean }) => {
|
|
175
|
-
const result = await cliIpcCall<
|
|
176
|
-
"
|
|
177
|
-
{
|
|
178
|
-
body: {},
|
|
179
|
-
},
|
|
142
|
+
const result = await cliIpcCall<MemoryV3ReconcileResult>(
|
|
143
|
+
"memory_v3_reconcile",
|
|
144
|
+
{ body: {} },
|
|
180
145
|
);
|
|
181
|
-
|
|
182
146
|
if (!result.ok) {
|
|
183
|
-
log.error(result.error ?? "Failed to
|
|
147
|
+
log.error(result.error ?? "Failed to reconcile the v3 tree");
|
|
184
148
|
process.exitCode = 1;
|
|
185
149
|
return;
|
|
186
150
|
}
|
|
187
|
-
|
|
188
|
-
const view = result.result!;
|
|
189
|
-
|
|
151
|
+
const payload = result.result!;
|
|
190
152
|
if (opts.json === true) {
|
|
191
|
-
log.info(JSON.stringify(
|
|
153
|
+
log.info(JSON.stringify(payload, null, 2));
|
|
192
154
|
return;
|
|
193
155
|
}
|
|
194
|
-
|
|
195
|
-
|
|
156
|
+
log.info(
|
|
157
|
+
`Renamed: ${payload.renames.length === 0 ? "none" : payload.renames.length}`,
|
|
158
|
+
);
|
|
159
|
+
for (const r of payload.renames) {
|
|
160
|
+
log.info(` - ${r.oldPath} → ${r.newPath}`);
|
|
161
|
+
}
|
|
162
|
+
log.info(
|
|
163
|
+
`Deleted: ${payload.deleted.length === 0 ? "none" : payload.deleted.join(", ")}`,
|
|
164
|
+
);
|
|
165
|
+
log.info(
|
|
166
|
+
`Pruned core: ${payload.prunedCore.length === 0 ? "none" : payload.prunedCore.join(", ")}`,
|
|
167
|
+
);
|
|
196
168
|
});
|
|
197
169
|
|
|
198
|
-
// ──
|
|
170
|
+
// ── set-core ──────────────────────────────────────────────────────────
|
|
199
171
|
|
|
200
|
-
v3.command("
|
|
172
|
+
v3.command("set-core")
|
|
201
173
|
.description(
|
|
202
|
-
"
|
|
203
|
-
)
|
|
204
|
-
.requiredOption(
|
|
205
|
-
"-q, --query <text>",
|
|
206
|
-
"User query to run a single synthetic retrieval turn against",
|
|
207
|
-
)
|
|
208
|
-
.option(
|
|
209
|
-
"--pass-cap <n>",
|
|
210
|
-
"Override memory.v3.passCap for this run (positive integer)",
|
|
211
|
-
)
|
|
212
|
-
.option(
|
|
213
|
-
"--lanes <list>",
|
|
214
|
-
`Restrict to a comma-separated allowlist of lanes (others off): ${V3_LANE_NAMES.join(", ")}`,
|
|
174
|
+
"Add/remove always-on core leaves (previews cost; writes on --yes)",
|
|
215
175
|
)
|
|
216
|
-
.option("--json", "Emit raw JSON instead of a formatted report")
|
|
217
176
|
.option(
|
|
218
|
-
"--
|
|
219
|
-
"
|
|
177
|
+
"--add <leaf>",
|
|
178
|
+
"Leaf path to add to the always-on core set (repeatable)",
|
|
179
|
+
collect,
|
|
180
|
+
[] as string[],
|
|
220
181
|
)
|
|
221
182
|
.option(
|
|
222
|
-
"--
|
|
223
|
-
"
|
|
183
|
+
"--remove <leaf>",
|
|
184
|
+
"Leaf path to remove from the always-on core set (repeatable)",
|
|
185
|
+
collect,
|
|
186
|
+
[] as string[],
|
|
224
187
|
)
|
|
188
|
+
.option("--yes", "Apply the change (otherwise preview only)")
|
|
189
|
+
.option("--json", "Emit raw JSON instead of a formatted summary")
|
|
225
190
|
.addHelpText(
|
|
226
191
|
"after",
|
|
227
192
|
`
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
The loop is invoked directly — it does NOT require memory.v3.enabled or
|
|
234
|
-
memory.v3.shadow, so you can probe v3 retrieval before the flags flip. Writes
|
|
235
|
-
nothing (co-activation persistence is forced off), but each pass still spends
|
|
236
|
-
the loop's dense-filter + gate LLM calls, so pass-cap is the cost knob.
|
|
193
|
+
Edits the always-on core leaf set in core.json. Every --add entry must
|
|
194
|
+
exist in the live tree (unknown leaves are rejected). Without --yes this
|
|
195
|
+
PREVIEWS the resulting core set and the number of unique page slugs it
|
|
196
|
+
would pin always-on, WITHOUT writing. Pass --yes to persist and invalidate
|
|
197
|
+
the lanes.
|
|
237
198
|
|
|
238
199
|
Examples:
|
|
239
|
-
$ assistant memory v3
|
|
240
|
-
$ assistant memory v3
|
|
241
|
-
$ assistant memory v3
|
|
242
|
-
$ assistant memory v3 simulate -q "..." --show-llm
|
|
243
|
-
$ assistant memory v3 simulate -q "..." --dump-llm /tmp/v3-calls`,
|
|
200
|
+
$ assistant memory v3 set-core --add domain-a/topic-x # preview
|
|
201
|
+
$ assistant memory v3 set-core --add domain-a/topic-x --yes # apply
|
|
202
|
+
$ assistant memory v3 set-core --remove domain-b/topic-z --yes`,
|
|
244
203
|
)
|
|
245
204
|
.action(
|
|
246
205
|
async (opts: {
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
206
|
+
add: string[];
|
|
207
|
+
remove: string[];
|
|
208
|
+
yes?: boolean;
|
|
250
209
|
json?: boolean;
|
|
251
|
-
showLlm?: boolean;
|
|
252
|
-
dumpLlm?: string;
|
|
253
210
|
}) => {
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
log.error(
|
|
259
|
-
`--pass-cap must be a positive integer (got "${opts.passCap}")`,
|
|
260
|
-
);
|
|
261
|
-
process.exitCode = 1;
|
|
262
|
-
return;
|
|
263
|
-
}
|
|
264
|
-
passCap = parsed;
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
let lanes: string[] | undefined;
|
|
268
|
-
if (opts.lanes !== undefined) {
|
|
269
|
-
const requested = opts.lanes
|
|
270
|
-
.split(",")
|
|
271
|
-
.map((s) => s.trim())
|
|
272
|
-
.filter((s) => s.length > 0);
|
|
273
|
-
const invalid = requested.filter(
|
|
274
|
-
(l) =>
|
|
275
|
-
!V3_LANE_NAMES.includes(l as (typeof V3_LANE_NAMES)[number]),
|
|
276
|
-
);
|
|
277
|
-
if (invalid.length > 0) {
|
|
278
|
-
log.error(
|
|
279
|
-
`--lanes contains unknown lane(s): ${invalid.join(", ")}. Valid: ${V3_LANE_NAMES.join(", ")}`,
|
|
280
|
-
);
|
|
281
|
-
process.exitCode = 1;
|
|
282
|
-
return;
|
|
283
|
-
}
|
|
284
|
-
if (requested.length === 0) {
|
|
285
|
-
log.error("--lanes must list at least one lane");
|
|
286
|
-
process.exitCode = 1;
|
|
287
|
-
return;
|
|
288
|
-
}
|
|
289
|
-
lanes = requested;
|
|
211
|
+
if (opts.add.length === 0 && opts.remove.length === 0) {
|
|
212
|
+
log.error("Pass at least one --add or --remove leaf path.");
|
|
213
|
+
process.exitCode = 1;
|
|
214
|
+
return;
|
|
290
215
|
}
|
|
291
216
|
|
|
292
|
-
const result = await cliIpcCall<
|
|
293
|
-
"
|
|
217
|
+
const result = await cliIpcCall<MemoryV3SetCoreResult>(
|
|
218
|
+
"memory_v3_set_core",
|
|
294
219
|
{
|
|
295
220
|
body: {
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
221
|
+
add: opts.add,
|
|
222
|
+
remove: opts.remove,
|
|
223
|
+
write: opts.yes === true,
|
|
299
224
|
},
|
|
300
225
|
},
|
|
301
226
|
);
|
|
302
|
-
|
|
303
227
|
if (!result.ok) {
|
|
304
|
-
log.error(result.error ?? "Failed to
|
|
228
|
+
log.error(result.error ?? "Failed to update the v3 core set");
|
|
305
229
|
process.exitCode = 1;
|
|
306
230
|
return;
|
|
307
231
|
}
|
|
308
|
-
|
|
309
232
|
const payload = result.result!;
|
|
310
233
|
if (opts.json === true) {
|
|
311
234
|
log.info(JSON.stringify(payload, null, 2));
|
|
312
235
|
return;
|
|
313
236
|
}
|
|
314
|
-
log.info(renderSimulation(payload));
|
|
315
|
-
|
|
316
|
-
log.info("");
|
|
317
237
|
log.info(
|
|
318
|
-
|
|
238
|
+
`Core leaves (${payload.nextCore.length}): ${
|
|
239
|
+
payload.nextCore.length === 0
|
|
240
|
+
? "none"
|
|
241
|
+
: payload.nextCore.join(", ")
|
|
242
|
+
}`,
|
|
319
243
|
);
|
|
320
|
-
|
|
321
|
-
if (
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
? `-${call.node.replace(/\//g, "_")}`
|
|
326
|
-
: "";
|
|
327
|
-
const file = join(
|
|
328
|
-
opts.dumpLlm,
|
|
329
|
-
`pass${call.pass}-${call.lane}${nodePart}.json`,
|
|
330
|
-
);
|
|
331
|
-
writeFileSync(file, JSON.stringify(call, null, 2));
|
|
332
|
-
}
|
|
333
|
-
log.info(
|
|
334
|
-
`\nWrote ${payload.llmCalls.length} LLM-call file(s) to ${opts.dumpLlm}`,
|
|
335
|
-
);
|
|
244
|
+
log.info(`Always-on page count: ${payload.alwaysOnPageCount}`);
|
|
245
|
+
if (payload.written) {
|
|
246
|
+
log.info("Written to core.json; lanes invalidated.");
|
|
247
|
+
} else {
|
|
248
|
+
log.info("Preview only — re-run with --yes to apply.");
|
|
336
249
|
}
|
|
337
250
|
},
|
|
338
251
|
);
|
|
339
252
|
|
|
340
|
-
// ──
|
|
253
|
+
// ── rebuild-index ─────────────────────────────────────────────────────
|
|
341
254
|
|
|
342
|
-
v3.command("
|
|
343
|
-
.description(
|
|
344
|
-
"Compare v3 shadow selections against live v2 router selections (read-only)",
|
|
345
|
-
)
|
|
346
|
-
.option(
|
|
347
|
-
"--since-days <n>",
|
|
348
|
-
"Only consider shadow rows newer than N days (default: all)",
|
|
349
|
-
)
|
|
350
|
-
.option(
|
|
351
|
-
"--tolerance-sec <n>",
|
|
352
|
-
"Max seconds between a shadow row and its paired router row (default: 10)",
|
|
353
|
-
)
|
|
354
|
-
.option(
|
|
355
|
-
"--limit <n>",
|
|
356
|
-
"Cap per-turn detail rows shown, newest first (default: 50)",
|
|
357
|
-
)
|
|
358
|
-
.option("--json", "Emit raw JSON instead of a formatted report")
|
|
255
|
+
v3.command("rebuild-index")
|
|
256
|
+
.description("Invalidate the v3 lanes so the next turn rebuilds")
|
|
359
257
|
.addHelpText(
|
|
360
258
|
"after",
|
|
361
259
|
`
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
v3-only / v2-only sets — broken down by v3 provenance lane.
|
|
366
|
-
|
|
367
|
-
Pairing is by timestamp within --tolerance-sec, not by turn number (the shadow
|
|
368
|
-
and router rows count turns with different counters). The v2 comparand is the
|
|
369
|
-
router's fresh per-turn pick (status='injected'), not its accumulated
|
|
370
|
-
in-context set, so it is comparable to v3's fresh per-turn selection.
|
|
371
|
-
|
|
372
|
-
Requires that v3 shadow mode has been running (memory.v3.enabled +
|
|
373
|
-
memory.v3.shadow) so v3_shadow rows exist. Read-only — runs no LLM, writes
|
|
374
|
-
nothing.
|
|
260
|
+
Drops the daemon's cached v3 shadow lanes so the tree + needle are rebuilt
|
|
261
|
+
from the current on-disk state on the next turn. Useful after editing leaf
|
|
262
|
+
files or assignments out-of-band.
|
|
375
263
|
|
|
376
264
|
Examples:
|
|
377
|
-
$ assistant memory v3
|
|
378
|
-
$ assistant memory v3 shadow-diff --since-days 2
|
|
379
|
-
$ assistant memory v3 shadow-diff --json | jq '.agg.v3OnlyByLane'`,
|
|
265
|
+
$ assistant memory v3 rebuild-index`,
|
|
380
266
|
)
|
|
381
|
-
.action(
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
`--since-days must be a positive number (got "${opts.sinceDays}")`,
|
|
394
|
-
);
|
|
395
|
-
process.exitCode = 1;
|
|
396
|
-
return;
|
|
397
|
-
}
|
|
398
|
-
const toleranceSec = parsePositiveFlag(opts.toleranceSec, {
|
|
399
|
-
int: false,
|
|
400
|
-
});
|
|
401
|
-
if (toleranceSec.error) {
|
|
402
|
-
log.error(
|
|
403
|
-
`--tolerance-sec must be a positive number (got "${opts.toleranceSec}")`,
|
|
404
|
-
);
|
|
405
|
-
process.exitCode = 1;
|
|
406
|
-
return;
|
|
407
|
-
}
|
|
408
|
-
const limit = parsePositiveFlag(opts.limit, { int: true });
|
|
409
|
-
if (limit.error) {
|
|
410
|
-
log.error(
|
|
411
|
-
`--limit must be a positive integer (got "${opts.limit}")`,
|
|
412
|
-
);
|
|
413
|
-
process.exitCode = 1;
|
|
414
|
-
return;
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
const result = await cliIpcCall<ShadowDiffResult>(
|
|
418
|
-
"memory_v3_shadow_diff",
|
|
419
|
-
{
|
|
420
|
-
body: {
|
|
421
|
-
...(sinceDays.value !== undefined
|
|
422
|
-
? { sinceDays: sinceDays.value }
|
|
423
|
-
: {}),
|
|
424
|
-
...(toleranceSec.value !== undefined
|
|
425
|
-
? { toleranceSec: toleranceSec.value }
|
|
426
|
-
: {}),
|
|
427
|
-
...(limit.value !== undefined ? { limit: limit.value } : {}),
|
|
428
|
-
},
|
|
429
|
-
},
|
|
430
|
-
);
|
|
431
|
-
|
|
432
|
-
if (!result.ok) {
|
|
433
|
-
log.error(result.error ?? "Failed to diff v3 shadow selections");
|
|
434
|
-
process.exitCode = 1;
|
|
435
|
-
return;
|
|
436
|
-
}
|
|
437
|
-
|
|
438
|
-
const payload = result.result!;
|
|
439
|
-
if (opts.json === true) {
|
|
440
|
-
log.info(JSON.stringify(payload, null, 2));
|
|
441
|
-
return;
|
|
442
|
-
}
|
|
443
|
-
log.info(renderShadowDiff(payload));
|
|
444
|
-
},
|
|
445
|
-
);
|
|
446
|
-
|
|
447
|
-
// ── seed-edges ────────────────────────────────────────────────────────
|
|
448
|
-
|
|
449
|
-
v3.command("seed-edges")
|
|
450
|
-
.description(
|
|
451
|
-
"Seed the learned co-retrieval edge graph from v2 router history",
|
|
452
|
-
)
|
|
453
|
-
.option(
|
|
454
|
-
"--min-count <n>",
|
|
455
|
-
"Min co-occurrence turns for an edge (positive integer, default: 5)",
|
|
456
|
-
)
|
|
457
|
-
.option(
|
|
458
|
-
"--top-k <n>",
|
|
459
|
-
"Neighbors kept per source node (positive integer, default: 20)",
|
|
460
|
-
)
|
|
461
|
-
.option(
|
|
462
|
-
"--max-neighbor-freq-ratio <n>",
|
|
463
|
-
"Exclude neighbors selected on more than this fraction of turns (0-1, default: 0.4)",
|
|
464
|
-
)
|
|
465
|
-
.option(
|
|
466
|
-
"--seed-weight <n>",
|
|
467
|
-
"Weight of a perfect-NPMI (1.0) edge; each edge stored at this × its NPMI (positive, default: 2.0)",
|
|
468
|
-
)
|
|
469
|
-
.option("--json", "Emit raw JSON instead of a formatted summary")
|
|
470
|
-
.addHelpText(
|
|
471
|
-
"after",
|
|
472
|
-
`
|
|
473
|
-
Builds an NPMI-scored co-retrieval graph from the v2 router's per-turn
|
|
474
|
-
selections (memory_v2_activation_logs, status='injected') and writes it into
|
|
475
|
-
memory_v3_auto_edges, warm-starting the learned edge graph. This is the only
|
|
476
|
-
'memory v3' subcommand that WRITES. Idempotent — re-running refreshes the
|
|
477
|
-
seeded edges to the seed weight. Runs no LLM.
|
|
478
|
-
|
|
479
|
-
The edge-expansion lane only merges the learned graph once
|
|
480
|
-
memory.v3.edges.learnedAdjacencyThreshold is set above 0 (default off); seed
|
|
481
|
-
first, then enable the threshold to A/B via 'memory v3 simulate'.
|
|
482
|
-
|
|
483
|
-
Examples:
|
|
484
|
-
$ assistant memory v3 seed-edges
|
|
485
|
-
$ assistant memory v3 seed-edges --min-count 8 --top-k 15
|
|
486
|
-
$ assistant memory v3 seed-edges --json | jq '.edgesWritten'`,
|
|
487
|
-
)
|
|
488
|
-
.action(
|
|
489
|
-
async (opts: {
|
|
490
|
-
minCount?: string;
|
|
491
|
-
topK?: string;
|
|
492
|
-
maxNeighborFreqRatio?: string;
|
|
493
|
-
seedWeight?: string;
|
|
494
|
-
json?: boolean;
|
|
495
|
-
}) => {
|
|
496
|
-
const minCount = parsePositiveFlag(opts.minCount, { int: true });
|
|
497
|
-
if (minCount.error) {
|
|
498
|
-
log.error(
|
|
499
|
-
`--min-count must be a positive integer (got "${opts.minCount}")`,
|
|
500
|
-
);
|
|
501
|
-
process.exitCode = 1;
|
|
502
|
-
return;
|
|
503
|
-
}
|
|
504
|
-
const topK = parsePositiveFlag(opts.topK, { int: true });
|
|
505
|
-
if (topK.error) {
|
|
506
|
-
log.error(
|
|
507
|
-
`--top-k must be a positive integer (got "${opts.topK}")`,
|
|
508
|
-
);
|
|
509
|
-
process.exitCode = 1;
|
|
510
|
-
return;
|
|
511
|
-
}
|
|
512
|
-
const ratio = parsePositiveFlag(opts.maxNeighborFreqRatio, {
|
|
513
|
-
int: false,
|
|
514
|
-
});
|
|
515
|
-
if (ratio.error || (ratio.value !== undefined && ratio.value > 1)) {
|
|
516
|
-
log.error(
|
|
517
|
-
`--max-neighbor-freq-ratio must be a number in (0, 1] (got "${opts.maxNeighborFreqRatio}")`,
|
|
518
|
-
);
|
|
519
|
-
process.exitCode = 1;
|
|
520
|
-
return;
|
|
521
|
-
}
|
|
522
|
-
const seedWeight = parsePositiveFlag(opts.seedWeight, {
|
|
523
|
-
int: false,
|
|
524
|
-
});
|
|
525
|
-
if (seedWeight.error) {
|
|
526
|
-
log.error(
|
|
527
|
-
`--seed-weight must be a positive number (got "${opts.seedWeight}")`,
|
|
528
|
-
);
|
|
529
|
-
process.exitCode = 1;
|
|
530
|
-
return;
|
|
531
|
-
}
|
|
532
|
-
|
|
533
|
-
const result = await cliIpcCall<SeedCoretrievalResult>(
|
|
534
|
-
"memory_v3_seed_edges",
|
|
535
|
-
{
|
|
536
|
-
body: {
|
|
537
|
-
...(minCount.value !== undefined
|
|
538
|
-
? { minCount: minCount.value }
|
|
539
|
-
: {}),
|
|
540
|
-
...(topK.value !== undefined ? { topK: topK.value } : {}),
|
|
541
|
-
...(ratio.value !== undefined
|
|
542
|
-
? { maxNeighborFreqRatio: ratio.value }
|
|
543
|
-
: {}),
|
|
544
|
-
...(seedWeight.value !== undefined
|
|
545
|
-
? { seedWeight: seedWeight.value }
|
|
546
|
-
: {}),
|
|
547
|
-
},
|
|
548
|
-
},
|
|
549
|
-
);
|
|
550
|
-
|
|
551
|
-
if (!result.ok) {
|
|
552
|
-
log.error(result.error ?? "Failed to seed co-retrieval edges");
|
|
553
|
-
process.exitCode = 1;
|
|
554
|
-
return;
|
|
555
|
-
}
|
|
556
|
-
|
|
557
|
-
const payload = result.result!;
|
|
558
|
-
if (opts.json === true) {
|
|
559
|
-
log.info(JSON.stringify(payload, null, 2));
|
|
560
|
-
return;
|
|
561
|
-
}
|
|
562
|
-
log.info(renderSeedEdges(payload));
|
|
563
|
-
},
|
|
564
|
-
);
|
|
267
|
+
.action(async () => {
|
|
268
|
+
const result = await cliIpcCall<MemoryV3RebuildIndexResult>(
|
|
269
|
+
"memory_v3_rebuild_index",
|
|
270
|
+
{ body: {} },
|
|
271
|
+
);
|
|
272
|
+
if (!result.ok) {
|
|
273
|
+
log.error(result.error ?? "Failed to invalidate the v3 lanes");
|
|
274
|
+
process.exitCode = 1;
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
log.info("v3 lanes invalidated; next turn will rebuild.");
|
|
278
|
+
});
|
|
565
279
|
},
|
|
566
280
|
});
|
|
567
281
|
}
|