@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.
Files changed (891) hide show
  1. package/AGENTS.md +4 -4
  2. package/Dockerfile +1 -0
  3. package/bun.lock +11 -2
  4. package/docker-entrypoint.sh +8 -6
  5. package/docs/plugins.md +63 -28
  6. package/examples/plugins/echo/register.ts +4 -7
  7. package/knip.json +1 -0
  8. package/node_modules/@vellumai/environments/bun.lock +24 -0
  9. package/node_modules/@vellumai/environments/package.json +18 -0
  10. package/node_modules/@vellumai/environments/src/__tests__/package-boundary.test.ts +95 -0
  11. package/node_modules/@vellumai/environments/src/index.ts +11 -0
  12. package/node_modules/@vellumai/environments/src/seeds.ts +73 -0
  13. package/node_modules/@vellumai/environments/src/types.ts +70 -0
  14. package/node_modules/@vellumai/environments/tsconfig.json +20 -0
  15. package/node_modules/@vellumai/skill-host-contracts/src/assistant-event.ts +11 -0
  16. package/node_modules/@vellumai/skill-host-contracts/src/client.ts +3 -4
  17. package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +6 -2
  18. package/openapi.yaml +3735 -353
  19. package/package.json +7 -3
  20. package/scripts/generate-openapi.ts +20 -13
  21. package/src/__tests__/agent-loop-callsite-precedence.test.ts +42 -80
  22. package/src/__tests__/agent-loop-exit-reason.test.ts +240 -39
  23. package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +141 -0
  24. package/src/__tests__/agent-loop-override-profile.test.ts +19 -32
  25. package/src/__tests__/agent-loop-provider-error-recording.test.ts +6 -4
  26. package/src/__tests__/agent-loop-thinking.test.ts +17 -12
  27. package/src/__tests__/agent-loop.test.ts +207 -341
  28. package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +4 -2
  29. package/src/__tests__/agent-wake-override-profile.test.ts +22 -40
  30. package/src/__tests__/anthropic-provider.test.ts +201 -55
  31. package/src/__tests__/app-builder-skill-instructions.test.ts +22 -0
  32. package/src/__tests__/app-control-flow.test.ts +5 -0
  33. package/src/__tests__/approval-cascade.test.ts +4 -11
  34. package/src/__tests__/approval-routes-http.test.ts +4 -2
  35. package/src/__tests__/assistant-event.test.ts +15 -0
  36. package/src/__tests__/assistant-feature-flags-integration.test.ts +2 -2
  37. package/src/__tests__/avatar-e2e.test.ts +7 -37
  38. package/src/__tests__/avatar-generator.test.ts +12 -42
  39. package/src/__tests__/avatar-identity-sync.test.ts +28 -3
  40. package/src/__tests__/background-shell-bash.test.ts +3 -7
  41. package/src/__tests__/btw-routes.test.ts +7 -12
  42. package/src/__tests__/call-pointer-messages.test.ts +5 -3
  43. package/src/__tests__/call-site-routing-provider.test.ts +22 -40
  44. package/src/__tests__/catalog-files.test.ts +1 -0
  45. package/src/__tests__/channel-approval-routes.test.ts +48 -20
  46. package/src/__tests__/channel-approvals.test.ts +3 -1
  47. package/src/__tests__/channel-invite-transport.test.ts +1 -5
  48. package/src/__tests__/channel-readiness-routes.test.ts +0 -4
  49. package/src/__tests__/channel-readiness-slack-remote.test.ts +2 -7
  50. package/src/__tests__/channel-retry-sweep.test.ts +71 -79
  51. package/src/__tests__/circuit-breaker-pipeline.test.ts +3 -3
  52. package/src/__tests__/clawhub-files.test.ts +1 -0
  53. package/src/__tests__/compaction-events.test.ts +5 -17
  54. package/src/__tests__/compaction-pipeline.test.ts +1 -1
  55. package/src/__tests__/compaction-timeout-recovery.test.ts +37 -48
  56. package/src/__tests__/compaction-trail-store.test.ts +1 -79
  57. package/src/__tests__/compactor-image-manifest-trust.test.ts +112 -0
  58. package/src/__tests__/computer-use-tools.test.ts +2 -2
  59. package/src/__tests__/config-watcher.test.ts +28 -0
  60. package/src/__tests__/context-search-agent-runner.test.ts +6 -3
  61. package/src/__tests__/context-token-estimator.test.ts +34 -0
  62. package/src/__tests__/context-window-manager-compact-retry.test.ts +291 -0
  63. package/src/__tests__/conversation-abort-tool-results.test.ts +14 -7
  64. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +3 -2
  65. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +12 -27
  66. package/src/__tests__/conversation-agent-loop-overflow.test.ts +430 -90
  67. package/src/__tests__/conversation-agent-loop.test.ts +581 -62
  68. package/src/__tests__/conversation-analysis-routes.test.ts +1 -3
  69. package/src/__tests__/conversation-app-control-lifecycle.test.ts +1 -1
  70. package/src/__tests__/conversation-clear-safety.test.ts +20 -10
  71. package/src/__tests__/conversation-confirmation-signals.test.ts +15 -45
  72. package/src/__tests__/conversation-disk-view-integration.test.ts +2 -2
  73. package/src/__tests__/conversation-disk-view.test.ts +10 -17
  74. package/src/__tests__/conversation-fork-crud.test.ts +86 -172
  75. package/src/__tests__/conversation-fork-route.test.ts +16 -14
  76. package/src/__tests__/conversation-init.benchmark.test.ts +6 -6
  77. package/src/__tests__/conversation-lifecycle.test.ts +3 -2
  78. package/src/__tests__/conversation-load-history-repair.test.ts +3 -2
  79. package/src/__tests__/conversation-load-history-stripped.test.ts +1 -1
  80. package/src/__tests__/conversation-message-sync-tags.test.ts +3 -4
  81. package/src/__tests__/conversation-pairing.test.ts +34 -4
  82. package/src/__tests__/conversation-pre-run-repair.test.ts +1 -1
  83. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +4 -0
  84. package/src/__tests__/conversation-process-callsite.test.ts +27 -30
  85. package/src/__tests__/conversation-provider-retry-repair.test.ts +53 -44
  86. package/src/__tests__/conversation-queue.test.ts +270 -164
  87. package/src/__tests__/conversation-routes-disk-view.test.ts +3 -2
  88. package/src/__tests__/conversation-routes-guardian-reply.test.ts +2 -2
  89. package/src/__tests__/conversation-routes-slash-commands.test.ts +2 -2
  90. package/src/__tests__/conversation-runtime-assembly.test.ts +20 -22
  91. package/src/__tests__/conversation-runtime-workspace.test.ts +19 -1
  92. package/src/__tests__/conversation-slash-queue.test.ts +37 -31
  93. package/src/__tests__/conversation-slash-unknown.test.ts +13 -15
  94. package/src/__tests__/conversation-speed-override.test.ts +8 -22
  95. package/src/__tests__/conversation-stream-state.test.ts +484 -0
  96. package/src/__tests__/conversation-surfaces-action-delivery.test.ts +6 -15
  97. package/src/__tests__/conversation-surfaces-app-control.test.ts +32 -4
  98. package/src/__tests__/conversation-surfaces-state-update.test.ts +5 -2
  99. package/src/__tests__/conversation-surfaces-table-action.test.ts +6 -15
  100. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +23 -11
  101. package/src/__tests__/conversation-unread-route.test.ts +14 -2
  102. package/src/__tests__/conversation-usage.test.ts +0 -2
  103. package/src/__tests__/conversation-wipe.test.ts +1 -1
  104. package/src/__tests__/conversation-workspace-cache-state.test.ts +3 -1
  105. package/src/__tests__/conversation-workspace-injection.test.ts +48 -22
  106. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +27 -7
  107. package/src/__tests__/credential-execution-tools.test.ts +1 -2
  108. package/src/__tests__/credential-security-invariants.test.ts +0 -1
  109. package/src/__tests__/cross-provider-web-search.test.ts +6 -2
  110. package/src/__tests__/cu-unified-flow.test.ts +26 -1
  111. package/src/__tests__/db-schedule-syntax-migration.test.ts +11 -0
  112. package/src/__tests__/disk-pressure-guard.test.ts +66 -0
  113. package/src/__tests__/disk-pressure-routes.test.ts +9 -2
  114. package/src/__tests__/dm-persistence.test.ts +7 -2
  115. package/src/__tests__/dynamic-page-surface.test.ts +68 -0
  116. package/src/__tests__/edit-propagation.test.ts +1 -2
  117. package/src/__tests__/empty-response-pipeline.test.ts +127 -5
  118. package/src/__tests__/filing-service.test.ts +2 -2
  119. package/src/__tests__/first-greeting.test.ts +55 -14
  120. package/src/__tests__/gemini-inline-media.test.ts +78 -0
  121. package/src/__tests__/gemini-provider.test.ts +351 -28
  122. package/src/__tests__/guardian-routing-state.test.ts +60 -71
  123. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +9 -7
  124. package/src/__tests__/heartbeat-disk-pressure.test.ts +1 -0
  125. package/src/__tests__/heartbeat-service.test.ts +2 -1
  126. package/src/__tests__/history-repair-hook.test.ts +161 -0
  127. package/src/__tests__/history-repair-observability.test.ts +1 -1
  128. package/src/__tests__/history-repair.test.ts +2 -1
  129. package/src/__tests__/host-app-control-proxy.test.ts +2 -0
  130. package/src/__tests__/host-cu-proxy.test.ts +2 -0
  131. package/src/__tests__/host-file-edit-tool.test.ts +4 -2
  132. package/src/__tests__/host-file-proxy.test.ts +31 -0
  133. package/src/__tests__/host-file-read-tool.test.ts +4 -2
  134. package/src/__tests__/host-file-write-tool.test.ts +9 -3
  135. package/src/__tests__/host-proxy-preactivation.test.ts +53 -14
  136. package/src/__tests__/host-shell-tool.test.ts +9 -4
  137. package/src/__tests__/http-user-message-parity.test.ts +2 -2
  138. package/src/__tests__/identity-intro-cache.test.ts +35 -14
  139. package/src/__tests__/inbound-slack-persistence.test.ts +7 -2
  140. package/src/__tests__/injector-background-turn.test.ts +1 -1
  141. package/src/__tests__/injector-chain.test.ts +1 -1
  142. package/src/__tests__/injector-disk-pressure.test.ts +1 -1
  143. package/src/__tests__/injector-document-comments.test.ts +1 -1
  144. package/src/__tests__/injector-pkb-v2-silenced.test.ts +1 -1
  145. package/src/__tests__/injector-v3-suppression.test.ts +220 -0
  146. package/src/__tests__/list-messages-attachments.test.ts +7 -8
  147. package/src/__tests__/list-messages-hidden-metadata.test.ts +17 -15
  148. package/src/__tests__/list-messages-page-latest.test.ts +0 -1
  149. package/src/__tests__/list-messages-tool-merge.test.ts +36 -6
  150. package/src/__tests__/llm-call-pipeline.test.ts +21 -15
  151. package/src/__tests__/llm-request-log-turn-query.test.ts +42 -86
  152. package/src/__tests__/llm-resolver.test.ts +23 -47
  153. package/src/__tests__/llm-usage-store.test.ts +45 -0
  154. package/src/__tests__/log-export-routes.test.ts +59 -0
  155. package/src/__tests__/managed-skill-lifecycle.test.ts +1 -8
  156. package/src/__tests__/mcp-auth-routes.test.ts +15 -10
  157. package/src/__tests__/mcp-health-check.test.ts +18 -13
  158. package/src/__tests__/memory-retrieval-pipeline.test.ts +1 -1
  159. package/src/__tests__/memory-v2-static-injector.test.ts +1 -1
  160. package/src/__tests__/messaging-send-tool.test.ts +8 -4
  161. package/src/__tests__/migration-export-http.test.ts +12 -12
  162. package/src/__tests__/migration-import-commit-http.test.ts +8 -8
  163. package/src/__tests__/migration-import-preflight-http.test.ts +7 -7
  164. package/src/__tests__/migration-validate-http.test.ts +3 -3
  165. package/src/__tests__/native-web-search.test.ts +14 -20
  166. package/src/__tests__/notification-decision-identity.test.ts +9 -18
  167. package/src/__tests__/notification-decision-recipient-context.test.ts +3 -6
  168. package/src/__tests__/oauth-commands-routes.test.ts +1 -1
  169. package/src/__tests__/onboarding-template-contract.test.ts +10 -0
  170. package/src/__tests__/openai-provider.test.ts +66 -70
  171. package/src/__tests__/openai-responses-provider.test.ts +21 -77
  172. package/src/__tests__/outbound-slack-persistence.test.ts +2 -1
  173. package/src/__tests__/overflow-reduce-pipeline.test.ts +2 -4
  174. package/src/__tests__/parallel-tool.benchmark.test.ts +24 -36
  175. package/src/__tests__/persistence-pipeline.test.ts +15 -26
  176. package/src/__tests__/persistence-secret-redaction.test.ts +2 -1
  177. package/src/__tests__/pipeline-runner.test.ts +2 -3
  178. package/src/__tests__/plugin-bootstrap.test.ts +51 -25
  179. package/src/__tests__/plugin-route-contribution.test.ts +6 -16
  180. package/src/__tests__/plugin-skill-contribution.test.ts +7 -17
  181. package/src/__tests__/plugin-tool-contribution.test.ts +10 -26
  182. package/src/__tests__/plugin-types.test.ts +7 -14
  183. package/src/__tests__/prechat-onboarding-contract.test.ts +23 -0
  184. package/src/__tests__/process-message-background-slack.test.ts +17 -16
  185. package/src/__tests__/process-message-display-content.test.ts +30 -42
  186. package/src/__tests__/provider-commit-message-generator.test.ts +19 -14
  187. package/src/__tests__/provider-error-scenarios.test.ts +7 -6
  188. package/src/__tests__/provider-platform-proxy-integration.test.ts +3 -8
  189. package/src/__tests__/provider-send-message-override-profile.test.ts +9 -25
  190. package/src/__tests__/provider-streaming.benchmark.test.ts +12 -22
  191. package/src/__tests__/provider-usage-tracking.test.ts +0 -6
  192. package/src/__tests__/ratelimit.test.ts +9 -4
  193. package/src/__tests__/relay-server.test.ts +20 -13
  194. package/src/__tests__/retry-openrouter-only-normalization.test.ts +5 -8
  195. package/src/__tests__/retry-thinking-tool-choice.test.ts +10 -13
  196. package/src/__tests__/retry-verbosity-normalization.test.ts +5 -8
  197. package/src/__tests__/runtime-events-sse-reconnect.test.ts +353 -0
  198. package/src/__tests__/schedule-routes.test.ts +80 -10
  199. package/src/__tests__/schedule-store.test.ts +67 -0
  200. package/src/__tests__/schedule-tools.test.ts +125 -0
  201. package/src/__tests__/secret-ingress-http.test.ts +2 -2
  202. package/src/__tests__/secret-prompt-log-hygiene.test.ts +11 -7
  203. package/src/__tests__/secret-prompter-channel-fallback.test.ts +11 -9
  204. package/src/__tests__/secret-response-routing.test.ts +13 -11
  205. package/src/__tests__/send-endpoint-busy.test.ts +2 -1
  206. package/src/__tests__/shell-observability.test.ts +249 -0
  207. package/src/__tests__/skill-feature-flags-integration.test.ts +11 -11
  208. package/src/__tests__/skill-feature-flags.test.ts +6 -6
  209. package/src/__tests__/skill-load-feature-flag.test.ts +10 -10
  210. package/src/__tests__/skills-files-catalog-fallback.test.ts +10 -0
  211. package/src/__tests__/skillssh-files.test.ts +1 -0
  212. package/src/__tests__/starter-task-flow.test.ts +6 -6
  213. package/src/__tests__/strip-memory-injections.test.ts +102 -14
  214. package/src/__tests__/subagent-call-site-routing.test.ts +2 -2
  215. package/src/__tests__/suggestion-routes.test.ts +3 -3
  216. package/src/__tests__/sync-message-contract.test.ts +19 -16
  217. package/src/__tests__/system-prompt.test.ts +54 -0
  218. package/src/__tests__/terminal-tools.test.ts +3 -24
  219. package/src/__tests__/thread-backfill.test.ts +4 -9
  220. package/src/__tests__/title-generate-pipeline.test.ts +1 -1
  221. package/src/__tests__/token-estimate-pipeline.test.ts +2 -4
  222. package/src/__tests__/tool-error-pipeline.test.ts +2 -2
  223. package/src/__tests__/tool-execute-pipeline.test.ts +1 -1
  224. package/src/__tests__/tool-preview-lifecycle.test.ts +13 -11
  225. package/src/__tests__/tool-result-truncate-pipeline.test.ts +9 -12
  226. package/src/__tests__/tool-result-truncation.test.ts +3 -1
  227. package/src/__tests__/tools-audio-read.test.ts +113 -0
  228. package/src/__tests__/turn-boundary-resolution.test.ts +44 -84
  229. package/src/__tests__/turn-events-store.test.ts +11 -7
  230. package/src/__tests__/voice-scoped-grant-consumer.test.ts +8 -6
  231. package/src/__tests__/voice-session-bridge.test.ts +13 -7
  232. package/src/acp/__tests__/prepare-agent-env.test.ts +143 -31
  233. package/src/acp/prepare-agent-env.ts +52 -11
  234. package/src/agent/compaction-circuit.ts +140 -0
  235. package/src/agent/loop.ts +409 -85
  236. package/src/api/README.md +19 -17
  237. package/src/api/constants/tool-execution.ts +21 -0
  238. package/src/api/events/assistant-activity-state.ts +75 -0
  239. package/src/api/events/assistant-outbound-attachment.ts +25 -27
  240. package/src/api/events/assistant-text-delta.ts +6 -8
  241. package/src/api/events/assistant-turn-start.ts +5 -7
  242. package/src/api/events/avatar-updated.ts +24 -0
  243. package/src/api/events/compaction-circuit-closed.ts +26 -0
  244. package/src/api/events/compaction-circuit-open.ts +28 -0
  245. package/src/api/events/confirmation-request.ts +114 -0
  246. package/src/api/events/contact-request.ts +33 -0
  247. package/src/api/events/conversation-error.ts +77 -0
  248. package/src/api/events/conversation-list-invalidated.ts +38 -0
  249. package/src/api/events/conversation-title-updated.ts +24 -0
  250. package/src/api/events/disk-pressure-status-changed.ts +61 -0
  251. package/src/api/events/document-comment-created.ts +24 -28
  252. package/src/api/events/document-comment-deleted.ts +6 -8
  253. package/src/api/events/document-comment-reopened.ts +6 -8
  254. package/src/api/events/document-comment-resolved.ts +8 -10
  255. package/src/api/events/document-editor-update.ts +27 -0
  256. package/src/api/events/error.ts +32 -0
  257. package/src/api/events/generation-cancelled.ts +4 -6
  258. package/src/api/events/generation-handoff.ts +13 -15
  259. package/src/api/events/home-feed-updated.ts +26 -0
  260. package/src/api/events/identity-changed.ts +32 -0
  261. package/src/api/events/interaction-resolved.ts +50 -0
  262. package/src/api/events/message-complete.ts +10 -12
  263. package/src/api/events/message-dequeued.ts +21 -0
  264. package/src/api/events/message-queued-deleted.ts +23 -0
  265. package/src/api/events/message-queued.ts +22 -0
  266. package/src/api/events/message-request-complete.ts +29 -0
  267. package/src/api/events/navigate-settings.ts +20 -0
  268. package/src/api/events/notification-intent.ts +33 -0
  269. package/src/api/events/open-url.ts +6 -8
  270. package/src/api/events/question-request.ts +67 -0
  271. package/src/api/events/relationship-state-updated.ts +4 -6
  272. package/src/api/events/secret-request.ts +42 -0
  273. package/src/api/events/subagent-event.ts +79 -0
  274. package/src/api/events/subagent-spawned.ts +40 -0
  275. package/src/api/events/subagent-status-changed.ts +65 -0
  276. package/src/api/events/sync-changed.ts +29 -0
  277. package/src/api/events/tool-result.ts +129 -0
  278. package/src/api/events/tool-use-start.ts +8 -10
  279. package/src/api/events/turn-profile-auto-routed.ts +28 -0
  280. package/src/api/events/ui-surface-complete.ts +30 -0
  281. package/src/api/events/ui-surface-dismiss.ts +22 -0
  282. package/src/api/events/ui-surface-show.ts +67 -0
  283. package/src/api/events/ui-surface-update.ts +26 -0
  284. package/src/api/events/usage-update.ts +34 -0
  285. package/src/api/events/user-message-echo.ts +35 -0
  286. package/src/api/index.ts +354 -0
  287. package/src/api/requests/dictation.ts +45 -0
  288. package/src/api/responses/disk-pressure-status.ts +26 -0
  289. package/src/api/responses/home.ts +217 -0
  290. package/src/api/responses/llm-context-response.ts +2 -0
  291. package/src/api/responses/memory-v3-selection-log.ts +50 -0
  292. package/src/api/responses/subagent-detail.ts +48 -0
  293. package/src/approvals/guardian-decision-primitive.ts +7 -15
  294. package/src/approvals/guardian-request-resolvers.ts +6 -9
  295. package/src/avatar/__tests__/avatar-manifest.test.ts +236 -0
  296. package/src/avatar/__tests__/avatar-store.test.ts +193 -0
  297. package/src/avatar/avatar-manifest.ts +195 -0
  298. package/src/avatar/avatar-store.ts +113 -0
  299. package/src/avatar/traits-png-sync.ts +8 -2
  300. package/src/background-wake/next-wake.test.ts +31 -1
  301. package/src/background-wake/next-wake.ts +4 -1
  302. package/src/calls/call-conversation-messages.ts +6 -4
  303. package/src/calls/guardian-action-sweep.ts +6 -4
  304. package/src/calls/relay-server.ts +12 -8
  305. package/src/calls/voice-session-bridge.ts +13 -27
  306. package/src/cli/commands/__tests__/memory-v3.test.ts +245 -0
  307. package/src/cli/commands/avatar.ts +17 -11
  308. package/src/cli/commands/conversations.ts +15 -1
  309. package/src/cli/commands/db/__tests__/repair.test.ts +540 -0
  310. package/src/cli/commands/db/__tests__/status.test.ts +253 -0
  311. package/src/cli/commands/db/format.ts +48 -0
  312. package/src/cli/commands/db/index.ts +29 -0
  313. package/src/cli/commands/db/repair-step-conversation-backfill.ts +345 -0
  314. package/src/cli/commands/db/repair-step-integrity.ts +146 -0
  315. package/src/cli/commands/db/repair-steps.ts +164 -0
  316. package/src/cli/commands/db/repair.ts +141 -0
  317. package/src/cli/commands/db/status.ts +366 -0
  318. package/src/cli/commands/memory-v3.ts +159 -445
  319. package/src/cli/lib/cli-colors.ts +24 -6
  320. package/src/cli/program.ts +4 -5
  321. package/src/config/__tests__/feature-flag-registry-guard.test.ts +2 -2
  322. package/src/config/assistant-feature-flags.ts +2 -2
  323. package/src/config/bundled-skills/app-builder/SKILL.md +14 -3
  324. package/src/config/bundled-skills/media-processing/services/reduce.ts +6 -9
  325. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +7 -2
  326. package/src/config/bundled-skills/schedule/SKILL.md +1 -1
  327. package/src/config/bundled-skills/schedule/TOOLS.json +8 -0
  328. package/src/config/call-site-defaults.ts +2 -7
  329. package/src/config/feature-flag-registry.json +25 -9
  330. package/src/config/schemas/__tests__/memory-v2.test.ts +1 -226
  331. package/src/config/schemas/call-site-catalog.ts +8 -15
  332. package/src/config/schemas/llm.ts +2 -3
  333. package/src/config/schemas/memory-lifecycle.ts +24 -0
  334. package/src/config/schemas/memory-v2.ts +0 -253
  335. package/src/config/schemas/memory-v3.ts +39 -0
  336. package/src/config/schemas/memory.ts +6 -1
  337. package/src/config/schemas/timeouts.ts +3 -1
  338. package/src/context/compactor.ts +54 -31
  339. package/src/context/token-estimator.ts +19 -0
  340. package/src/context/tool-result-truncation.ts +1 -43
  341. package/src/context/window-manager.ts +138 -20
  342. package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +2 -2
  343. package/src/daemon/__tests__/web-search-status-text.test.ts +10 -6
  344. package/src/daemon/approval-generators.ts +4 -4
  345. package/src/daemon/config-watcher.ts +7 -1
  346. package/src/daemon/conversation-agent-loop-handlers.ts +225 -88
  347. package/src/daemon/conversation-agent-loop.ts +284 -584
  348. package/src/daemon/conversation-error.ts +7 -7
  349. package/src/daemon/conversation-history.ts +22 -6
  350. package/src/daemon/conversation-launch.ts +4 -8
  351. package/src/daemon/conversation-lifecycle.ts +10 -38
  352. package/src/daemon/conversation-messaging.ts +1 -3
  353. package/src/daemon/conversation-notifiers.ts +7 -5
  354. package/src/daemon/conversation-process.ts +100 -79
  355. package/src/daemon/conversation-runtime-assembly.ts +47 -21
  356. package/src/daemon/conversation-store.ts +6 -5
  357. package/src/daemon/conversation-surfaces.ts +55 -69
  358. package/src/daemon/conversation-tool-setup.ts +3 -0
  359. package/src/daemon/conversation.ts +91 -126
  360. package/src/daemon/daemon-skill-host.ts +2 -6
  361. package/src/daemon/disk-pressure-guard.ts +35 -29
  362. package/src/daemon/external-plugins-bootstrap.ts +46 -24
  363. package/src/daemon/first-greeting.ts +26 -4
  364. package/src/daemon/guardian-action-generators.ts +2 -2
  365. package/src/daemon/handlers/conversations.ts +6 -22
  366. package/src/daemon/handlers/shared.ts +4 -0
  367. package/src/daemon/handlers/skills.ts +15 -14
  368. package/src/daemon/host-app-control-proxy.ts +54 -1
  369. package/src/daemon/host-cu-proxy.ts +46 -22
  370. package/src/daemon/host-file-proxy.ts +25 -1
  371. package/src/daemon/host-proxy-preactivation.ts +25 -6
  372. package/src/daemon/lifecycle.ts +28 -55
  373. package/src/daemon/message-protocol.ts +2 -3
  374. package/src/daemon/message-provenance.ts +49 -0
  375. package/src/daemon/message-types/contacts.ts +3 -20
  376. package/src/daemon/message-types/conversations.ts +13 -111
  377. package/src/daemon/message-types/documents.ts +3 -9
  378. package/src/daemon/message-types/home.ts +4 -17
  379. package/src/daemon/message-types/integrations.ts +2 -6
  380. package/src/daemon/message-types/messages.ts +28 -343
  381. package/src/daemon/message-types/notifications.ts +2 -32
  382. package/src/daemon/message-types/settings.ts +3 -8
  383. package/src/daemon/message-types/skills.ts +2 -0
  384. package/src/daemon/message-types/surfaces.ts +2 -0
  385. package/src/daemon/message-types/sync.ts +12 -25
  386. package/src/daemon/message-types/workspace.ts +3 -11
  387. package/src/daemon/process-message.ts +49 -46
  388. package/src/daemon/server.ts +12 -0
  389. package/src/daemon/tool-side-effects.ts +10 -7
  390. package/src/daemon/trust-context.ts +13 -0
  391. package/src/daemon/wake-target-adapter.ts +11 -1
  392. package/src/heartbeat/__tests__/heartbeat-service.test.ts +3 -1
  393. package/src/heartbeat/heartbeat-run-store.ts +31 -0
  394. package/src/heartbeat/heartbeat-service.ts +16 -0
  395. package/src/home/feature-gate.ts +22 -0
  396. package/src/home/feed-types.ts +36 -221
  397. package/src/ipc/__tests__/email-ipc.test.ts +0 -9
  398. package/src/ipc/routes/__tests__/route-adapter.test.ts +244 -0
  399. package/src/ipc/routes/route-adapter.ts +45 -6
  400. package/src/ipc/skill-routes/__tests__/memory.test.ts +18 -9
  401. package/src/ipc/skill-routes/__tests__/providers.test.ts +10 -10
  402. package/src/ipc/skill-routes/__tests__/registries.test.ts +28 -18
  403. package/src/ipc/skill-routes/memory.ts +26 -13
  404. package/src/ipc/skill-routes/providers.ts +5 -6
  405. package/src/ipc/skill-routes/registries.ts +13 -61
  406. package/src/live-voice/__tests__/live-voice-archive.test.ts +24 -11
  407. package/src/memory/__tests__/conversation-queries.test.ts +192 -8
  408. package/src/memory/__tests__/db-maintenance.test.ts +128 -0
  409. package/src/memory/__tests__/jobs-store-job-classes.test.ts +5 -4
  410. package/src/memory/__tests__/memory-retrospective-job.test.ts +10 -6
  411. package/src/memory/__tests__/memory-v3-selections-migration.test.ts +103 -0
  412. package/src/memory/context-search/agent-runner.ts +2 -4
  413. package/src/memory/conversation-crud.ts +39 -8
  414. package/src/memory/conversation-queries.ts +78 -22
  415. package/src/memory/db-init.ts +8 -0
  416. package/src/memory/db-maintenance.ts +18 -2
  417. package/src/memory/graph/consolidation.ts +8 -11
  418. package/src/memory/graph/conversation-graph-memory.ts +41 -8
  419. package/src/memory/graph/extraction.ts +6 -9
  420. package/src/memory/graph/narrative.ts +2 -2
  421. package/src/memory/graph/pattern-scan.ts +2 -2
  422. package/src/memory/graph/retriever.ts +20 -26
  423. package/src/memory/graph/tools.ts +4 -4
  424. package/src/memory/job-handlers/conversation-starters.ts +32 -32
  425. package/src/memory/job-handlers/summarization.ts +1 -2
  426. package/src/memory/jobs-store.ts +3 -1
  427. package/src/memory/jobs-worker.ts +51 -39
  428. package/src/memory/llm-request-log-source-clickhouse.ts +5 -31
  429. package/src/memory/llm-request-log-source-local.ts +0 -11
  430. package/src/memory/llm-request-log-source.ts +9 -25
  431. package/src/memory/llm-request-log-store.ts +0 -41
  432. package/src/memory/llm-usage-store.ts +10 -0
  433. package/src/memory/memory-marker.ts +17 -0
  434. package/src/memory/memory-retrospective-job.ts +6 -2
  435. package/src/memory/memory-v2-activation-log-store.ts +1 -83
  436. package/src/memory/migrations/267-llm-usage-events-add-assistant-version.ts +46 -0
  437. package/src/memory/migrations/268-add-memory-v3-selections.ts +28 -0
  438. package/src/memory/migrations/269-schedule-script-timeout.ts +11 -0
  439. package/src/memory/migrations/270-messages-role-created-at-index.ts +18 -0
  440. package/src/memory/migrations/__tests__/267-llm-usage-events-add-assistant-version.test.ts +117 -0
  441. package/src/memory/migrations/index.ts +4 -0
  442. package/src/memory/schema/infrastructure.ts +11 -0
  443. package/src/memory/v2/__tests__/consolidation-job.test.ts +124 -0
  444. package/src/memory/v2/__tests__/migration.test.ts +11 -3
  445. package/src/memory/v2/__tests__/page-index.test.ts +37 -1
  446. package/src/memory/v2/__tests__/router.test.ts +14 -4
  447. package/src/memory/v2/__tests__/sweep-job.test.ts +6 -5
  448. package/src/memory/v2/backfill-jobs.ts +6 -0
  449. package/src/memory/v2/consolidation-job.ts +89 -9
  450. package/src/memory/v2/migration.ts +5 -3
  451. package/src/memory/v2/page-index.ts +11 -0
  452. package/src/memory/v2/router.ts +8 -11
  453. package/src/memory/v2/sweep-job.ts +8 -11
  454. package/src/memory/v2/types.ts +1 -0
  455. package/src/memory/v3/__tests__/assign.test.ts +242 -0
  456. package/src/memory/v3/__tests__/capabilities.test.ts +118 -0
  457. package/src/memory/v3/__tests__/core.test.ts +39 -0
  458. package/src/memory/v3/__tests__/fixtures/eval-turns.json +36 -0
  459. package/src/memory/v3/__tests__/fixtures/live-turns.json +37 -0
  460. package/src/memory/v3/__tests__/health.test.ts +203 -0
  461. package/src/memory/v3/__tests__/live-integration.test.ts +330 -0
  462. package/src/memory/v3/__tests__/maintain-job.test.ts +288 -0
  463. package/src/memory/v3/__tests__/needle.test.ts +107 -0
  464. package/src/memory/v3/__tests__/orchestrate.test.ts +400 -0
  465. package/src/memory/v3/__tests__/reconcile.test.ts +274 -0
  466. package/src/memory/v3/__tests__/render-injection.test.ts +61 -0
  467. package/src/memory/v3/__tests__/router.test.ts +260 -0
  468. package/src/memory/v3/__tests__/selection-log-store.test.ts +179 -0
  469. package/src/memory/v3/__tests__/selector.test.ts +404 -0
  470. package/src/memory/v3/__tests__/shadow-plugin.test.ts +414 -0
  471. package/src/memory/v3/__tests__/snapshot.test.ts +168 -0
  472. package/src/memory/v3/__tests__/tree.test.ts +192 -0
  473. package/src/memory/v3/__tests__/types.test.ts +54 -0
  474. package/src/memory/v3/__tests__/working-set-eviction.test.ts +106 -0
  475. package/src/memory/v3/__tests__/working-set-skeleton.test.ts +44 -0
  476. package/src/memory/v3/assign.ts +268 -0
  477. package/src/memory/v3/capabilities.ts +124 -0
  478. package/src/memory/v3/core.ts +26 -0
  479. package/src/memory/v3/data/README.md +84 -0
  480. package/src/memory/v3/data/assignments.json +5 -0
  481. package/src/memory/v3/data/core.json +1 -0
  482. package/src/memory/v3/data/leaves/domain-a/topic-x.md +9 -0
  483. package/src/memory/v3/data/leaves/domain-a/topic-y.md +9 -0
  484. package/src/memory/v3/data/leaves/domain-b/topic-z.md +9 -0
  485. package/src/memory/v3/health.ts +0 -0
  486. package/src/memory/v3/maintain-job.ts +314 -0
  487. package/src/memory/v3/needle.ts +115 -0
  488. package/src/memory/v3/orchestrate.ts +114 -0
  489. package/src/memory/v3/page-content.ts +34 -0
  490. package/src/memory/v3/provider-blocks.ts +16 -0
  491. package/src/memory/v3/reconcile.ts +523 -0
  492. package/src/memory/v3/render-injection.ts +32 -0
  493. package/src/memory/v3/router.ts +184 -0
  494. package/src/memory/v3/selection-log-store.ts +84 -0
  495. package/src/memory/v3/selector.ts +211 -0
  496. package/src/memory/v3/shadow-plugin.ts +379 -0
  497. package/src/memory/v3/snapshot.ts +209 -0
  498. package/src/memory/v3/tree.ts +174 -0
  499. package/src/memory/v3/types.ts +46 -60
  500. package/src/memory/v3/working-set.ts +88 -0
  501. package/src/messaging/providers/slack/render-transcript.test.ts +1 -1
  502. package/src/messaging/providers/slack/render-transcript.ts +2 -2
  503. package/src/messaging/style-analyzer.ts +8 -11
  504. package/src/notifications/conversation-pairing.ts +8 -6
  505. package/src/notifications/decision-engine.ts +10 -13
  506. package/src/notifications/preference-extractor.ts +11 -14
  507. package/src/permissions/prompter.ts +42 -36
  508. package/src/permissions/question-prompter.test.ts +35 -26
  509. package/src/permissions/question-prompter.ts +6 -10
  510. package/src/plugin-api/index.ts +2 -0
  511. package/src/plugin-api/types.ts +25 -3
  512. package/src/plugins/defaults/circuit-breaker/middlewares/circuitBreaker.ts +93 -0
  513. package/src/plugins/defaults/circuit-breaker/package.json +15 -0
  514. package/src/plugins/defaults/circuit-breaker/register.ts +39 -0
  515. package/src/plugins/defaults/compaction/middlewares/compaction.ts +25 -0
  516. package/src/plugins/defaults/compaction/package.json +15 -0
  517. package/src/plugins/defaults/compaction/register.ts +35 -0
  518. package/src/plugins/defaults/compaction/terminal.ts +73 -0
  519. package/src/plugins/defaults/empty-response/middlewares/emptyResponse.ts +22 -0
  520. package/src/plugins/defaults/empty-response/package.json +15 -0
  521. package/src/plugins/defaults/empty-response/register.ts +28 -0
  522. package/src/plugins/defaults/empty-response/terminal.ts +106 -0
  523. package/src/plugins/defaults/history-repair/hooks/user-prompt-submit.ts +35 -0
  524. package/src/plugins/defaults/history-repair/package.json +15 -0
  525. package/src/plugins/defaults/history-repair/register.ts +24 -0
  526. package/src/{daemon/history-repair.ts → plugins/defaults/history-repair/terminal.ts} +48 -35
  527. package/src/plugins/defaults/index.ts +29 -40
  528. package/src/plugins/defaults/injectors/package.json +15 -0
  529. package/src/plugins/defaults/{injectors.ts → injectors/register.ts} +14 -38
  530. package/src/plugins/defaults/llm-call/middlewares/llmCall.ts +17 -0
  531. package/src/plugins/defaults/llm-call/package.json +15 -0
  532. package/src/plugins/defaults/{llm-call.ts → llm-call/register.ts} +6 -38
  533. package/src/plugins/defaults/memory-retrieval/middlewares/memoryRetrieval.ts +17 -0
  534. package/src/plugins/defaults/memory-retrieval/package.json +15 -0
  535. package/src/plugins/defaults/{memory-retrieval.ts → memory-retrieval/register.ts} +10 -48
  536. package/src/plugins/defaults/{overflow-reduce.ts → overflow-reduce/middlewares/overflowReduce.ts} +18 -77
  537. package/src/plugins/defaults/overflow-reduce/package.json +15 -0
  538. package/src/plugins/defaults/overflow-reduce/register.ts +42 -0
  539. package/src/plugins/defaults/persistence/middlewares/persistence.ts +19 -0
  540. package/src/plugins/defaults/persistence/package.json +15 -0
  541. package/src/plugins/defaults/persistence/register.ts +38 -0
  542. package/src/plugins/defaults/persistence/terminal.ts +83 -0
  543. package/src/plugins/defaults/title-generate/package.json +15 -0
  544. package/src/plugins/defaults/title-generate/register.ts +35 -0
  545. package/src/plugins/defaults/title-generate/terminal.ts +31 -0
  546. package/src/plugins/defaults/token-estimate/middlewares/tokenEstimate.ts +23 -0
  547. package/src/plugins/defaults/token-estimate/package.json +15 -0
  548. package/src/plugins/defaults/token-estimate/register.ts +34 -0
  549. package/src/plugins/defaults/token-estimate/terminal.ts +40 -0
  550. package/src/plugins/defaults/tool-error/middlewares/toolError.ts +21 -0
  551. package/src/plugins/defaults/tool-error/package.json +15 -0
  552. package/src/plugins/defaults/tool-error/register.ts +35 -0
  553. package/src/plugins/defaults/tool-error/terminal.ts +47 -0
  554. package/src/plugins/defaults/tool-execute/middlewares/toolExecute.ts +23 -0
  555. package/src/plugins/defaults/tool-execute/package.json +15 -0
  556. package/src/plugins/defaults/{tool-execute.ts → tool-execute/register.ts} +8 -46
  557. package/src/plugins/defaults/tool-result-truncate/middlewares/toolResultTruncate.ts +23 -0
  558. package/src/plugins/defaults/tool-result-truncate/package.json +15 -0
  559. package/src/plugins/defaults/tool-result-truncate/register.ts +35 -0
  560. package/src/plugins/defaults/tool-result-truncate/terminal.ts +113 -0
  561. package/src/plugins/defaults/tool-result-truncate/types.ts +22 -0
  562. package/src/plugins/external-plugin-loader.ts +2 -2
  563. package/src/plugins/pipeline.ts +0 -12
  564. package/src/plugins/types.ts +51 -90
  565. package/src/plugins/user-loader.ts +4 -3
  566. package/src/proactive-artifact/aux-message-injector.ts +0 -1
  567. package/src/proactive-artifact/job.test.ts +20 -8
  568. package/src/proactive-artifact/job.ts +3 -1
  569. package/src/prompts/sections.ts +20 -7
  570. package/src/prompts/templates/BOOTSTRAP-CONTENT-AUTOMATION.md +2 -2
  571. package/src/prompts/templates/BOOTSTRAP.md +5 -1
  572. package/src/prompts/templates/system-sections.ts +6 -0
  573. package/src/providers/__tests__/retry-callsite.test.ts +25 -25
  574. package/src/providers/__tests__/satellite-connection-routing.test.ts +7 -21
  575. package/src/providers/anthropic/client.ts +24 -5
  576. package/src/providers/call-site-routing.ts +1 -9
  577. package/src/providers/gemini/client.ts +152 -34
  578. package/src/providers/gemini/inline-media.ts +74 -0
  579. package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +0 -2
  580. package/src/providers/openai/chat-completions-provider.ts +1 -4
  581. package/src/providers/openai/responses-provider.ts +1 -4
  582. package/src/providers/openrouter/client.ts +1 -6
  583. package/src/providers/provider-send-message.ts +6 -6
  584. package/src/providers/ratelimit.ts +1 -9
  585. package/src/providers/retry.ts +0 -5
  586. package/src/providers/types.ts +11 -2
  587. package/src/providers/usage-tracking.ts +1 -9
  588. package/src/runtime/__tests__/agent-wake.test.ts +131 -26
  589. package/src/runtime/__tests__/background-job-runner.test.ts +1 -3
  590. package/src/runtime/agent-wake.ts +93 -18
  591. package/src/runtime/assistant-event-hub.ts +2 -2
  592. package/src/runtime/auth/__tests__/guard-tests.test.ts +75 -109
  593. package/src/runtime/auth/__tests__/route-policy.test.ts +153 -170
  594. package/src/runtime/auth/route-policy.ts +42 -1079
  595. package/src/runtime/background-job-runner.ts +1 -4
  596. package/src/runtime/btw-sidechain.ts +3 -1
  597. package/src/runtime/channel-approvals.ts +3 -14
  598. package/src/runtime/channel-invite-transport.ts +5 -6
  599. package/src/runtime/channel-readiness-service.ts +2 -5
  600. package/src/runtime/channel-retry-sweep.ts +12 -16
  601. package/src/runtime/conversation-stream-state.ts +294 -0
  602. package/src/runtime/http-router.ts +19 -22
  603. package/src/runtime/http-types.ts +12 -6
  604. package/src/runtime/invite-instruction-generator.ts +3 -3
  605. package/src/runtime/pending-interactions.ts +2 -2
  606. package/src/runtime/routes/__tests__/avatar-state-routes.test.ts +565 -0
  607. package/src/runtime/routes/__tests__/content-source-routes.test.ts +4 -4
  608. package/src/runtime/routes/__tests__/conversation-compaction-routes.test.ts +62 -32
  609. package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +237 -0
  610. package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +13 -22
  611. package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +7 -2
  612. package/src/runtime/routes/__tests__/sanity-routes.test.ts +6 -6
  613. package/src/runtime/routes/__tests__/stt-routes.test.ts +3 -3
  614. package/src/runtime/routes/__tests__/suggest-trust-rule-routes.test.ts +5 -2
  615. package/src/runtime/routes/__tests__/tts-routes.test.ts +3 -3
  616. package/src/runtime/routes/acp-routes.test.ts +97 -75
  617. package/src/runtime/routes/acp-routes.ts +29 -6
  618. package/src/runtime/routes/app-management-routes.ts +97 -24
  619. package/src/runtime/routes/app-routes.ts +25 -5
  620. package/src/runtime/routes/approval-routes.ts +16 -4
  621. package/src/runtime/routes/attachment-routes.ts +25 -1
  622. package/src/runtime/routes/audio-routes.ts +1 -0
  623. package/src/runtime/routes/audit-routes.ts +5 -0
  624. package/src/runtime/routes/auth-routes.ts +5 -0
  625. package/src/runtime/routes/avatar-routes.ts +238 -59
  626. package/src/runtime/routes/background-tool-routes.ts +9 -0
  627. package/src/runtime/routes/background-wake-routes.ts +13 -3
  628. package/src/runtime/routes/backup-routes.ts +45 -0
  629. package/src/runtime/routes/bookmark-routes.ts +13 -0
  630. package/src/runtime/routes/brain-graph-routes.ts +9 -0
  631. package/src/runtime/routes/browser-routes.ts +5 -0
  632. package/src/runtime/routes/browser-tabs-routes.ts +5 -0
  633. package/src/runtime/routes/btw-routes.ts +5 -1
  634. package/src/runtime/routes/cache-routes.ts +13 -0
  635. package/src/runtime/routes/call-routes.ts +21 -10
  636. package/src/runtime/routes/channel-availability-routes.ts +5 -1
  637. package/src/runtime/routes/channel-readiness-routes.ts +37 -4
  638. package/src/runtime/routes/channel-route-definitions.ts +21 -0
  639. package/src/runtime/routes/channel-verification-routes.ts +21 -0
  640. package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +9 -2
  641. package/src/runtime/routes/client-routes.ts +9 -0
  642. package/src/runtime/routes/consolidation-routes.ts +13 -5
  643. package/src/runtime/routes/contact-prompt-routes.ts +9 -0
  644. package/src/runtime/routes/contact-routes.ts +90 -23
  645. package/src/runtime/routes/content-source-routes.ts +5 -1
  646. package/src/runtime/routes/conversation-analysis-routes.ts +5 -1
  647. package/src/runtime/routes/conversation-attention-routes.ts +5 -0
  648. package/src/runtime/routes/conversation-cli-routes.ts +54 -7
  649. package/src/runtime/routes/conversation-compaction-routes.ts +54 -25
  650. package/src/runtime/routes/conversation-list-routes.ts +81 -12
  651. package/src/runtime/routes/conversation-management-routes.ts +57 -14
  652. package/src/runtime/routes/conversation-query-routes.ts +88 -41
  653. package/src/runtime/routes/conversation-routes.ts +74 -19
  654. package/src/runtime/routes/conversation-starter-routes.ts +22 -13
  655. package/src/runtime/routes/conversations-import-routes.ts +6 -1
  656. package/src/runtime/routes/credential-prompt-routes.ts +5 -0
  657. package/src/runtime/routes/credential-routes.ts +25 -6
  658. package/src/runtime/routes/debug-bash-routes.ts +5 -0
  659. package/src/runtime/routes/debug-routes.ts +11 -2
  660. package/src/runtime/routes/defer-routes.ts +13 -0
  661. package/src/runtime/routes/diagnostics-routes.ts +37 -46
  662. package/src/runtime/routes/disk-pressure-routes.ts +17 -31
  663. package/src/runtime/routes/document-comments-routes.ts +46 -27
  664. package/src/runtime/routes/documents-routes.ts +21 -10
  665. package/src/runtime/routes/domain-routes.ts +61 -28
  666. package/src/runtime/routes/email-routes.ts +33 -0
  667. package/src/runtime/routes/events-routes.ts +114 -9
  668. package/src/runtime/routes/filing-routes.ts +9 -4
  669. package/src/runtime/routes/gateway-log-routes.ts +5 -0
  670. package/src/runtime/routes/global-search-routes.ts +53 -50
  671. package/src/runtime/routes/group-routes.ts +21 -5
  672. package/src/runtime/routes/guardian-action-routes.ts +9 -0
  673. package/src/runtime/routes/guardian-approval-interception.ts +0 -31
  674. package/src/runtime/routes/heartbeat-routes.ts +25 -9
  675. package/src/runtime/routes/home-feed-routes.ts +23 -19
  676. package/src/runtime/routes/home-state-routes.ts +8 -40
  677. package/src/runtime/routes/host-app-control-routes.ts +5 -0
  678. package/src/runtime/routes/host-bash-routes.ts +5 -0
  679. package/src/runtime/routes/host-browser-routes.ts +13 -0
  680. package/src/runtime/routes/host-cu-routes.ts +5 -0
  681. package/src/runtime/routes/host-file-routes.ts +26 -6
  682. package/src/runtime/routes/host-transfer-routes.ts +13 -2
  683. package/src/runtime/routes/http-adapter.ts +1 -2
  684. package/src/runtime/routes/identity-intro-cache.ts +17 -6
  685. package/src/runtime/routes/identity-routes.ts +12 -2
  686. package/src/runtime/routes/image-generation-routes.ts +5 -0
  687. package/src/runtime/routes/inbound-message-handler.ts +15 -11
  688. package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +0 -12
  689. package/src/runtime/routes/inbound-stages/background-dispatch.ts +15 -19
  690. package/src/runtime/routes/inference-profile-session-routes.ts +13 -3
  691. package/src/runtime/routes/inference-provider-connection-routes.ts +21 -5
  692. package/src/runtime/routes/inference-send-routes.ts +11 -11
  693. package/src/runtime/routes/integrations/a2a.ts +30 -7
  694. package/src/runtime/routes/integrations/slack/channel.ts +19 -3
  695. package/src/runtime/routes/integrations/slack/share.ts +9 -2
  696. package/src/runtime/routes/integrations/telegram.ts +28 -9
  697. package/src/runtime/routes/integrations/twilio.ts +35 -7
  698. package/src/runtime/routes/integrations/vercel.ts +3 -3
  699. package/src/runtime/routes/internal-oauth-routes.ts +5 -0
  700. package/src/runtime/routes/internal-twilio-routes.ts +13 -0
  701. package/src/runtime/routes/llm-call-sites-routes.ts +39 -4
  702. package/src/runtime/routes/log-export-routes.ts +28 -10
  703. package/src/runtime/routes/mcp-auth-routes.ts +25 -0
  704. package/src/runtime/routes/memory-item-routes.ts +21 -10
  705. package/src/runtime/routes/memory-v2-routes.ts +90 -36
  706. package/src/runtime/routes/memory-v3-routes.ts +273 -407
  707. package/src/runtime/routes/migration-rollback-routes.ts +5 -1
  708. package/src/runtime/routes/migration-routes.ts +29 -0
  709. package/src/runtime/routes/notification-routes.ts +17 -1
  710. package/src/runtime/routes/oauth-apps.ts +33 -11
  711. package/src/runtime/routes/oauth-commands-routes.ts +37 -14
  712. package/src/runtime/routes/oauth-connect-routes.ts +9 -0
  713. package/src/runtime/routes/oauth-lifecycle-routes.ts +5 -1
  714. package/src/runtime/routes/oauth-providers.ts +35 -10
  715. package/src/runtime/routes/platform-routes.ts +21 -0
  716. package/src/runtime/routes/playground/__tests__/force-compact.test.ts +3 -2
  717. package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +37 -16
  718. package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +7 -3
  719. package/src/runtime/routes/playground/__tests__/state.test.ts +10 -3
  720. package/src/runtime/routes/playground/force-compact.ts +1 -1
  721. package/src/runtime/routes/playground/helpers.ts +0 -1
  722. package/src/runtime/routes/playground/inject-failures.ts +13 -8
  723. package/src/runtime/routes/playground/reset-circuit.ts +14 -9
  724. package/src/runtime/routes/playground/seed-conversation.ts +1 -1
  725. package/src/runtime/routes/playground/seeded-conversations.ts +3 -3
  726. package/src/runtime/routes/playground/state.ts +4 -3
  727. package/src/runtime/routes/plugins-routes.ts +22 -19
  728. package/src/runtime/routes/profiler-routes.ts +17 -4
  729. package/src/runtime/routes/ps-routes.ts +5 -0
  730. package/src/runtime/routes/publish-routes.ts +13 -3
  731. package/src/runtime/routes/question-routes.ts +5 -0
  732. package/src/runtime/routes/recording-routes.ts +25 -12
  733. package/src/runtime/routes/rename-conversation-routes.ts +5 -0
  734. package/src/runtime/routes/sanity-routes.ts +9 -2
  735. package/src/runtime/routes/schedule-routes.ts +137 -47
  736. package/src/runtime/routes/secret-routes.ts +17 -4
  737. package/src/runtime/routes/sequence-routes.ts +33 -0
  738. package/src/runtime/routes/settings-routes.ts +65 -19
  739. package/src/runtime/routes/skills-routes.ts +133 -69
  740. package/src/runtime/routes/slack-channel-routes.ts +5 -0
  741. package/src/runtime/routes/stt-routes.ts +13 -6
  742. package/src/runtime/routes/subagents-routes.ts +24 -18
  743. package/src/runtime/routes/suggest-trust-rule-routes.ts +7 -2
  744. package/src/runtime/routes/surface-action-routes.ts +9 -0
  745. package/src/runtime/routes/surface-content-routes.ts +10 -2
  746. package/src/runtime/routes/task-routes.ts +37 -0
  747. package/src/runtime/routes/telemetry-routes.ts +9 -0
  748. package/src/runtime/routes/trace-event-routes.ts +42 -1
  749. package/src/runtime/routes/trust-rules-routes.ts +5 -0
  750. package/src/runtime/routes/tts-routes.ts +13 -6
  751. package/src/runtime/routes/types.ts +17 -8
  752. package/src/runtime/routes/ui-request-routes.ts +5 -0
  753. package/src/runtime/routes/upgrade-broadcast-routes.ts +5 -0
  754. package/src/runtime/routes/usage-routes.ts +71 -3
  755. package/src/runtime/routes/user-routes-cli.ts +9 -0
  756. package/src/runtime/routes/user-routes.ts +5 -1
  757. package/src/runtime/routes/wake-conversation-routes.ts +5 -0
  758. package/src/runtime/routes/watcher-routes.ts +21 -0
  759. package/src/runtime/routes/webhook-routes.ts +9 -0
  760. package/src/runtime/routes/wipe-conversation-routes.ts +5 -0
  761. package/src/runtime/routes/work-items-routes.ts +47 -19
  762. package/src/runtime/routes/workspace-commit-routes.ts +5 -0
  763. package/src/runtime/routes/workspace-routes.test.ts +42 -0
  764. package/src/runtime/routes/workspace-routes.ts +120 -9
  765. package/src/runtime/services/__tests__/analyze-conversation.test.ts +2 -4
  766. package/src/runtime/services/analyze-conversation.ts +3 -6
  767. package/src/runtime/services/conversation-serializer.ts +24 -2
  768. package/src/runtime/sync/resource-sync-events.ts +16 -2
  769. package/src/runtime/sync/sync-publisher.ts +2 -2
  770. package/src/schedule/run-script.ts +28 -3
  771. package/src/schedule/schedule-store.ts +8 -0
  772. package/src/schedule/scheduler.ts +3 -1
  773. package/src/signals/user-message.ts +5 -8
  774. package/src/skills/catalog-files.ts +4 -1
  775. package/src/skills/clawhub-files.ts +2 -0
  776. package/src/skills/skillssh-files.ts +2 -0
  777. package/src/subagent/manager.ts +3 -6
  778. package/src/telemetry/types.ts +26 -0
  779. package/src/telemetry/usage-telemetry-reporter.test.ts +138 -1
  780. package/src/telemetry/usage-telemetry-reporter.ts +31 -0
  781. package/src/tools/acp/spawn.test.ts +88 -38
  782. package/src/tools/apps/definitions.ts +8 -4
  783. package/src/tools/ask-question/ask-question-tool.test.ts +120 -105
  784. package/src/tools/ask-question/ask-question-tool.ts +85 -90
  785. package/src/tools/computer-use/definitions.ts +28 -24
  786. package/src/tools/credential-execution/make-authenticated-request.ts +56 -51
  787. package/src/tools/credential-execution/manage-secure-command-tool.ts +2 -2
  788. package/src/tools/credential-execution/run-authenticated-command.ts +82 -77
  789. package/src/tools/credentials/vault.ts +112 -111
  790. package/src/tools/execution-target.ts +1 -1
  791. package/src/tools/execution-timeout.ts +3 -4
  792. package/src/tools/filesystem/edit.ts +45 -42
  793. package/src/tools/filesystem/list.ts +33 -30
  794. package/src/tools/filesystem/read.ts +54 -35
  795. package/src/tools/filesystem/write.ts +34 -31
  796. package/src/tools/host-filesystem/edit.ts +44 -42
  797. package/src/tools/host-filesystem/read.ts +49 -35
  798. package/src/tools/host-filesystem/transfer.ts +121 -108
  799. package/src/tools/host-filesystem/write.ts +33 -31
  800. package/src/tools/host-terminal/host-shell.ts +50 -48
  801. package/src/tools/memory/register.ts +23 -24
  802. package/src/tools/network/web-fetch.ts +49 -46
  803. package/src/tools/network/web-search.ts +16 -13
  804. package/src/tools/registry.ts +39 -16
  805. package/src/tools/schedule/create.ts +11 -0
  806. package/src/tools/schedule/update.ts +16 -0
  807. package/src/tools/shared/filesystem/audio-read.ts +122 -0
  808. package/src/tools/shared/filesystem/image-read.ts +1 -1
  809. package/src/tools/skills/execute.ts +34 -31
  810. package/src/tools/skills/load.ts +29 -23
  811. package/src/tools/subagent/notify-parent.ts +35 -32
  812. package/src/tools/system/avatar-generator.ts +13 -22
  813. package/src/tools/system/request-permission.ts +30 -27
  814. package/src/tools/terminal/shell.ts +190 -61
  815. package/src/tools/tool-defaults.ts +20 -9
  816. package/src/tools/tool-manifest.ts +4 -4
  817. package/src/tools/types.ts +74 -23
  818. package/src/tools/ui-surface/definitions.ts +69 -9
  819. package/src/usage/types.ts +10 -0
  820. package/src/util/errors.ts +2 -2
  821. package/src/util/map-limit.ts +27 -0
  822. package/src/util/platform.ts +15 -12
  823. package/src/work-items/work-item-runner.ts +7 -2
  824. package/src/workspace/migrations/028-recover-conversations-from-disk-view.ts +7 -20
  825. package/src/workspace/migrations/092-backfill-v3-leaves.ts +169 -0
  826. package/src/workspace/migrations/093-backfill-leaf-ids.ts +144 -0
  827. package/src/workspace/migrations/094-seed-avatar-manifest.ts +155 -0
  828. package/src/workspace/migrations/__tests__/094-seed-avatar-manifest.test.ts +136 -0
  829. package/src/workspace/migrations/__tests__/backfill-leaf-ids.test.ts +175 -0
  830. package/src/workspace/migrations/__tests__/backfill-v3-leaves.test.ts +124 -0
  831. package/src/workspace/migrations/registry.ts +6 -0
  832. package/src/workspace/provider-commit-message-generator.ts +15 -17
  833. package/tsconfig.json +4 -1
  834. package/src/__tests__/history-repair-pipeline.test.ts +0 -396
  835. package/src/cli/commands/__tests__/memory-v3-render.test.ts +0 -340
  836. package/src/cli/commands/memory-v3-render.ts +0 -491
  837. package/src/daemon/message-types/disk-pressure.ts +0 -9
  838. package/src/email/feature-gate.ts +0 -23
  839. package/src/memory/v3/__tests__/coactivation-store.test.ts +0 -422
  840. package/src/memory/v3/__tests__/consolidation-job.test.ts +0 -466
  841. package/src/memory/v3/__tests__/coretrieval-seed.test.ts +0 -270
  842. package/src/memory/v3/__tests__/edge-learning-job.test.ts +0 -324
  843. package/src/memory/v3/__tests__/edges.test.ts +0 -706
  844. package/src/memory/v3/__tests__/filter.test.ts +0 -560
  845. package/src/memory/v3/__tests__/gate.test.ts +0 -637
  846. package/src/memory/v3/__tests__/index-composition.test.ts +0 -291
  847. package/src/memory/v3/__tests__/loop.test.ts +0 -775
  848. package/src/memory/v3/__tests__/retriever.test.ts +0 -226
  849. package/src/memory/v3/__tests__/scouts.test.ts +0 -489
  850. package/src/memory/v3/__tests__/shadow-diff.test.ts +0 -225
  851. package/src/memory/v3/__tests__/shadow-middleware.test.ts +0 -398
  852. package/src/memory/v3/__tests__/system-prompts.test.ts +0 -154
  853. package/src/memory/v3/__tests__/traversal.test.ts +0 -508
  854. package/src/memory/v3/__tests__/tree-index.test.ts +0 -280
  855. package/src/memory/v3/__tests__/tree-store.test.ts +0 -529
  856. package/src/memory/v3/__tests__/tree-walk.test.ts +0 -784
  857. package/src/memory/v3/__tests__/validate.test.ts +0 -277
  858. package/src/memory/v3/auto-edges.ts +0 -223
  859. package/src/memory/v3/coactivation-store.ts +0 -124
  860. package/src/memory/v3/consolidation-job.ts +0 -323
  861. package/src/memory/v3/coretrieval-seed.ts +0 -240
  862. package/src/memory/v3/edge-learning-job.ts +0 -160
  863. package/src/memory/v3/edges.ts +0 -286
  864. package/src/memory/v3/filter.ts +0 -286
  865. package/src/memory/v3/gate.ts +0 -349
  866. package/src/memory/v3/index-composition.ts +0 -126
  867. package/src/memory/v3/llm-capture.ts +0 -46
  868. package/src/memory/v3/loop.ts +0 -430
  869. package/src/memory/v3/maintenance.ts +0 -144
  870. package/src/memory/v3/prompt-context.ts +0 -33
  871. package/src/memory/v3/prompts/consolidation.ts +0 -458
  872. package/src/memory/v3/prompts/system-prompts.ts +0 -196
  873. package/src/memory/v3/retriever.ts +0 -33
  874. package/src/memory/v3/scouts.ts +0 -431
  875. package/src/memory/v3/shadow-diff.ts +0 -287
  876. package/src/memory/v3/shadow-middleware.ts +0 -347
  877. package/src/memory/v3/traversal.ts +0 -211
  878. package/src/memory/v3/tree-index.ts +0 -237
  879. package/src/memory/v3/tree-store.ts +0 -394
  880. package/src/memory/v3/tree-walk.ts +0 -356
  881. package/src/memory/v3/validate.ts +0 -323
  882. package/src/plugins/defaults/circuit-breaker.ts +0 -141
  883. package/src/plugins/defaults/compaction.ts +0 -141
  884. package/src/plugins/defaults/empty-response.ts +0 -124
  885. package/src/plugins/defaults/history-repair.ts +0 -83
  886. package/src/plugins/defaults/persistence.ts +0 -146
  887. package/src/plugins/defaults/title-generate.ts +0 -90
  888. package/src/plugins/defaults/token-estimate.ts +0 -101
  889. package/src/plugins/defaults/tool-error.ts +0 -119
  890. package/src/plugins/defaults/tool-result-truncate.ts +0 -84
  891. 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 read-only inspection of the v3 memory tree — the DAG overlay
5
- * the v2 v3 data-migration hand-authors over the flat concept pages.
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
- * - `validate` — print a structural health report (dangling refs, orphan
10
- * pages, cycles, stale indexes, unknown edge targets). Exits non-zero when
11
- * any defect is found so it is scriptable as a check.
12
- * - `tree`print the tree as an indented outline rooted at the tree root,
13
- * marking shared-DAG re-entries.
14
- * - `simulate` — dry-run the v3 retrieval loop against an ad-hoc query and
15
- * print the per-pass descent trace plus the lane-grouped selection.
16
- * - `shadow-diff` — compare logged v3 shadow selections against the live v2
17
- * router selections, turn-for-turn, and print the overlap / v3-only /
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/splitsthat 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
- * All are read-only: they mutate nothing. `validate`/`tree`/`shadow-diff` run
21
- * no LLM; `simulate` invokes the loop (filter + gate LLM calls) but persists
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
- MemoryV3SimulateResult,
33
- MemoryV3TreeResult,
34
- MemoryV3ValidateResult,
35
- SeedCoretrievalResult,
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
- * Parse a positive numeric CLI flag. Returns `{ value }` when valid (or omitted,
52
- * with `value` undefined) and `{ error: true }` when present but not a positive
53
- * number — or not an integer when `int` is set.
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 a sibling registrar (e.g. v2)
72
- // attached it first; otherwise create one. Keeps registration order between
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 subsystem operations (tree-DAG overlay)",
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 layers a hand-authored DAG of tree nodes over the
89
- flat v2 concept pages. Each node lives under /workspace/memory/tree/ and
90
- its frontmatter 'children' list references sub-nodes (node:<id>) and leaf
91
- concept pages (page:<slug>). The structure is authored by the v2 v3
92
- data-migration, so these subcommands are read-only inspection only — they
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 validate
97
- $ assistant memory v3 tree
98
- $ assistant memory v3 tree --json | jq '.nodes | length'
99
- $ assistant memory v3 simulate -q "what should we ship next"
100
- $ assistant memory v3 shadow-diff`,
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
- // ── validate ──────────────────────────────────────────────────────────
76
+ // ── health ────────────────────────────────────────────────────────────
104
77
 
105
- v3.command("validate")
106
- .description(
107
- "Print a structural health report of the v3 tree (read-only)",
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
- Walks the hand-authored v3 tree DAG and reports:
114
- - Dangling child refs (node:/page: targets that do not exist)
115
- - Orphan pages (concept pages not reachable from the tree root)
116
- - Cycles (back-edges in the node:/node: adjacency)
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 validate
125
- $ assistant memory v3 validate --json | jq '.orphanPageCount'`,
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<MemoryV3ValidateResult>(
129
- "memory_v3_validate",
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 validate memory v3 tree");
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(report, null, 2));
143
- } else {
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
- // ── tree ──────────────────────────────────────────────────────────────
115
+ // ── reconcile ─────────────────────────────────────────────────────────
153
116
 
154
- v3.command("tree")
117
+ v3.command("reconcile")
155
118
  .description(
156
- "Print the v3 tree as an indented outline from the root (read-only)",
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 tree")
121
+ .option("--json", "Emit raw JSON instead of a formatted summary")
159
122
  .addHelpText(
160
123
  "after",
161
124
  `
162
- Descends the v3 tree depth-first from its root node, printing one line per
163
- node:/page: ref with indentation by depth. A node reached more than once
164
- (shared DAG sub-node or a cycle back-edge) is printed once with a re-entry
165
- marker rather than re-expanded, so output is finite. Nodes that exist on disk
166
- but are unreachable from the root are listed separately.
167
-
168
- Read-only mutates nothing.
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 tree
172
- $ assistant memory v3 tree --json | jq '.root'`,
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<MemoryV3TreeResult>(
176
- "memory_v3_tree",
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 read memory v3 tree");
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(view, null, 2));
153
+ log.info(JSON.stringify(payload, null, 2));
192
154
  return;
193
155
  }
194
-
195
- log.info(renderTree(view));
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
- // ── simulate ────────────────────────────────────────────────────────────
170
+ // ── set-core ──────────────────────────────────────────────────────────
199
171
 
200
- v3.command("simulate")
172
+ v3.command("set-core")
201
173
  .description(
202
- "Dry-run the v3 retrieval loop against an ad-hoc query (read-only)",
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
- "--show-llm",
219
- "Print the full input + output of every v3 LLM call (filter / descender / gate)",
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
- "--dump-llm <dir>",
223
- "Write one JSON file per v3 LLM call into <dir> (full request + raw response)",
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
- Runs the v3 multi-lane bounded-descent loop read-only against the live page
229
- index + tree DAG, building a single synthetic turn from the query plus the live
230
- NOW context. Prints the per-pass descent trace (scouts / tree levels / edge
231
- expansions / gate verdict) and the final selection grouped by provenance lane.
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 simulate -q "what should we ship next"
240
- $ assistant memory v3 simulate -q "..." --lanes tree,edges
241
- $ assistant memory v3 simulate -q "..." --pass-cap 1 --json | jq '.selectedSlugs'
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
- query: string;
248
- passCap?: string;
249
- lanes?: string;
206
+ add: string[];
207
+ remove: string[];
208
+ yes?: boolean;
250
209
  json?: boolean;
251
- showLlm?: boolean;
252
- dumpLlm?: string;
253
210
  }) => {
254
- let passCap: number | undefined;
255
- if (opts.passCap !== undefined) {
256
- const parsed = Number(opts.passCap);
257
- if (!Number.isInteger(parsed) || parsed < 1) {
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<MemoryV3SimulateResult>(
293
- "memory_v3_simulate",
217
+ const result = await cliIpcCall<MemoryV3SetCoreResult>(
218
+ "memory_v3_set_core",
294
219
  {
295
220
  body: {
296
- query: opts.query,
297
- ...(passCap !== undefined ? { passCap } : {}),
298
- ...(lanes !== undefined ? { lanes } : {}),
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 simulate v3 retrieval");
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
- renderLlmCalls(payload.llmCalls, { full: opts.showLlm === true }),
238
+ `Core leaves (${payload.nextCore.length}): ${
239
+ payload.nextCore.length === 0
240
+ ? "none"
241
+ : payload.nextCore.join(", ")
242
+ }`,
319
243
  );
320
-
321
- if (opts.dumpLlm !== undefined) {
322
- mkdirSync(opts.dumpLlm, { recursive: true });
323
- for (const call of payload.llmCalls) {
324
- const nodePart = call.node
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
- // ── shadow-diff ─────────────────────────────────────────────────────────
253
+ // ── rebuild-index ─────────────────────────────────────────────────────
341
254
 
342
- v3.command("shadow-diff")
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
- Pairs each v3 shadow-mode selection (mode='v3_shadow' rows) with the live v2
363
- router selection (mode='router') from the same turn and reports where they
364
- agree, what v3 surfaced that v2 missed, and what v2 had that v3 dropped — the
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 shadow-diff
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
- async (opts: {
383
- sinceDays?: string;
384
- toleranceSec?: string;
385
- limit?: string;
386
- json?: boolean;
387
- }) => {
388
- const sinceDays = parsePositiveFlag(opts.sinceDays, {
389
- int: false,
390
- });
391
- if (sinceDays.error) {
392
- log.error(
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
  }