@vellumai/assistant 0.7.1 → 0.7.3

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 (739) hide show
  1. package/ARCHITECTURE.md +48 -50
  2. package/Dockerfile +1 -0
  3. package/README.md +1 -2
  4. package/__tests__/permissions/gateway-threshold-reader.test.ts +9 -3
  5. package/bun.lock +26 -26
  6. package/docs/architecture/memory.md +5 -2
  7. package/docs/architecture/security.md +20 -0
  8. package/docs/plugins.md +7 -9
  9. package/knip.json +1 -0
  10. package/node_modules/@vellumai/gateway-client/src/index.ts +1 -0
  11. package/node_modules/@vellumai/gateway-client/src/ipc-client.ts +52 -5
  12. package/node_modules/@vellumai/gateway-client/src/types.ts +11 -0
  13. package/node_modules/@vellumai/service-contracts/package.json +2 -0
  14. package/node_modules/@vellumai/service-contracts/src/__tests__/contracts.test.ts +4 -0
  15. package/node_modules/@vellumai/service-contracts/src/__tests__/ingress.test.ts +107 -0
  16. package/node_modules/@vellumai/service-contracts/src/index.ts +5 -1
  17. package/node_modules/@vellumai/service-contracts/src/ingress.ts +24 -0
  18. package/node_modules/@vellumai/service-contracts/src/twilio-ingress.ts +84 -0
  19. package/node_modules/@vellumai/slack-text/src/index.test.ts +18 -35
  20. package/node_modules/@vellumai/slack-text/src/index.ts +2 -48
  21. package/node_modules/@vellumai/twilio-client/bun.lock +24 -0
  22. package/node_modules/@vellumai/twilio-client/package.json +18 -0
  23. package/node_modules/@vellumai/twilio-client/src/__tests__/twilio-client.test.ts +128 -0
  24. package/node_modules/@vellumai/twilio-client/src/index.ts +179 -0
  25. package/node_modules/@vellumai/twilio-client/tsconfig.json +20 -0
  26. package/openapi.yaml +1020 -40
  27. package/package.json +6 -3
  28. package/src/__tests__/app-builder-tool-scripts.test.ts +3 -3
  29. package/src/__tests__/app-bundler.test.ts +170 -1
  30. package/src/__tests__/app-control-flow.test.ts +384 -0
  31. package/src/__tests__/app-control-no-global-cgevent.test.ts +98 -0
  32. package/src/__tests__/app-control-tool-schemas.test.ts +621 -0
  33. package/src/__tests__/app-executors.test.ts +30 -43
  34. package/src/__tests__/approval-routes-http.test.ts +23 -6
  35. package/src/__tests__/assistant-event-hub-machine-name.test.ts +146 -0
  36. package/src/__tests__/assistant-event-hub-targeted.test.ts +257 -0
  37. package/src/__tests__/assistant-event-hub.test.ts +157 -2
  38. package/src/__tests__/assistant-feature-flags-integration.test.ts +29 -7
  39. package/src/__tests__/auto-analysis-end-to-end.test.ts +62 -1
  40. package/src/__tests__/background-shell-host-bash.test.ts +14 -15
  41. package/src/__tests__/background-workers-disk-pressure.test.ts +268 -0
  42. package/src/__tests__/bootstrap-turn-cleanup.test.ts +44 -0
  43. package/src/__tests__/btw-routes.test.ts +13 -4
  44. package/src/__tests__/call-controller.test.ts +49 -1
  45. package/src/__tests__/call-conversation-messages.test.ts +8 -2
  46. package/src/__tests__/call-domain.test.ts +0 -2
  47. package/src/__tests__/call-routes-http.test.ts +0 -2
  48. package/src/__tests__/channel-inbound-disk-pressure.test.ts +537 -0
  49. package/src/__tests__/channel-readiness-service.test.ts +62 -2
  50. package/src/__tests__/checker.test.ts +3 -4
  51. package/src/__tests__/config-loader-backfill.test.ts +461 -147
  52. package/src/__tests__/config-loader-platform-defaults.test.ts +196 -0
  53. package/src/__tests__/config-schema-cmd.test.ts +0 -1
  54. package/src/__tests__/config-schema.test.ts +1 -0
  55. package/src/__tests__/config-set-platform-guard.test.ts +48 -4
  56. package/src/__tests__/config-watcher-cleanup-throttle.test.ts +20 -11
  57. package/src/__tests__/config-watcher.test.ts +142 -71
  58. package/src/__tests__/context-search-agent-runner.test.ts +61 -3
  59. package/src/__tests__/context-search-conversations-source.test.ts +0 -24
  60. package/src/__tests__/context-search-fanout.test.ts +0 -1
  61. package/src/__tests__/context-search-memory-source.test.ts +3 -7
  62. package/src/__tests__/context-search-memory-v2-source.test.ts +0 -2
  63. package/src/__tests__/context-search-pkb-source.test.ts +0 -1
  64. package/src/__tests__/context-search-workspace-source.test.ts +0 -1
  65. package/src/__tests__/conversation-abort-tool-results.test.ts +6 -0
  66. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +223 -0
  67. package/src/__tests__/conversation-agent-loop.test.ts +454 -5
  68. package/src/__tests__/conversation-app-control-instantiation.test.ts +392 -0
  69. package/src/__tests__/conversation-app-control-lifecycle.test.ts +237 -0
  70. package/src/__tests__/conversation-error.test.ts +150 -3
  71. package/src/__tests__/conversation-init.benchmark.test.ts +0 -2
  72. package/src/__tests__/conversation-lifecycle.test.ts +36 -0
  73. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +283 -0
  74. package/src/__tests__/conversation-process-callsite.test.ts +43 -0
  75. package/src/__tests__/conversation-provider-retry-repair.test.ts +6 -0
  76. package/src/__tests__/conversation-routes-disk-view.test.ts +6 -0
  77. package/src/__tests__/conversation-routes-guardian-reply.test.ts +120 -72
  78. package/src/__tests__/conversation-routes-slash-commands.test.ts +1 -0
  79. package/src/__tests__/conversation-runtime-assembly.test.ts +65 -0
  80. package/src/__tests__/conversation-slash-commands.test.ts +0 -4
  81. package/src/__tests__/conversation-slash-unknown.test.ts +6 -0
  82. package/src/__tests__/conversation-speed-override.test.ts +0 -3
  83. package/src/__tests__/conversation-store.test.ts +0 -18
  84. package/src/__tests__/conversation-surfaces-action-delivery.test.ts +202 -0
  85. package/src/__tests__/conversation-surfaces-app-control.test.ts +328 -0
  86. package/src/__tests__/conversation-surfaces-data-persist.test.ts +404 -0
  87. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +2 -5
  88. package/src/__tests__/conversation-workspace-injection.test.ts +6 -0
  89. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +6 -0
  90. package/src/__tests__/credential-execution-feature-gates.test.ts +5 -12
  91. package/src/__tests__/credential-execution-managed-contract.test.ts +3 -131
  92. package/src/__tests__/credentials-cli.test.ts +12 -12
  93. package/src/__tests__/cu-unified-flow.test.ts +351 -23
  94. package/src/__tests__/daemon-credential-client.test.ts +101 -19
  95. package/src/__tests__/date-context.test.ts +164 -2
  96. package/src/__tests__/db-schedule-syntax-migration.test.ts +2 -0
  97. package/src/__tests__/disk-pressure-guard.test.ts +262 -0
  98. package/src/__tests__/disk-pressure-lifecycle.test.ts +168 -0
  99. package/src/__tests__/disk-pressure-policy.test.ts +241 -0
  100. package/src/__tests__/disk-pressure-routes.test.ts +379 -0
  101. package/src/__tests__/disk-pressure-tools.test.ts +277 -0
  102. package/src/__tests__/disk-usage.test.ts +150 -0
  103. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
  104. package/src/__tests__/events-client-registration.test.ts +52 -0
  105. package/src/__tests__/events-dev-bypass-actor.test.ts +162 -0
  106. package/src/__tests__/file-write-tool.test.ts +4 -10
  107. package/src/__tests__/filing-service.test.ts +3 -4
  108. package/src/__tests__/gateway-only-enforcement.test.ts +0 -1
  109. package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -2
  110. package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +0 -2
  111. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +0 -1
  112. package/src/__tests__/heartbeat-disk-pressure.test.ts +183 -0
  113. package/src/__tests__/heartbeat-service.test.ts +968 -2
  114. package/src/__tests__/helpers/call-route-handler.ts +7 -1
  115. package/src/__tests__/host-app-control-proxy.test.ts +772 -0
  116. package/src/__tests__/host-app-control-routes.test.ts +263 -0
  117. package/src/__tests__/host-bash-proxy.test.ts +439 -47
  118. package/src/__tests__/host-bash-routes.test.ts +459 -0
  119. package/src/__tests__/host-browser-proxy.test.ts +24 -22
  120. package/src/__tests__/host-browser-routes.test.ts +39 -13
  121. package/src/__tests__/host-cu-proxy.test.ts +248 -52
  122. package/src/__tests__/host-cu-routes-targeted.test.ts +429 -0
  123. package/src/__tests__/host-file-edit-tool.test.ts +47 -1
  124. package/src/__tests__/host-file-proxy-targeted.test.ts +378 -0
  125. package/src/__tests__/host-file-proxy.test.ts +301 -45
  126. package/src/__tests__/host-file-read-tool.test.ts +17 -0
  127. package/src/__tests__/host-file-routes-targeted.test.ts +420 -0
  128. package/src/__tests__/host-file-write-tool.test.ts +42 -1
  129. package/src/__tests__/host-proxy-base.test.ts +312 -0
  130. package/src/__tests__/host-shell-tool.test.ts +22 -4
  131. package/src/__tests__/host-transfer-proxy-targeted.test.ts +932 -0
  132. package/src/__tests__/host-transfer-proxy.test.ts +121 -22
  133. package/src/__tests__/host-transfer-routes-targeted.test.ts +662 -0
  134. package/src/__tests__/http-user-message-parity.test.ts +108 -1
  135. package/src/__tests__/identity-intro-cache.test.ts +29 -0
  136. package/src/__tests__/identity-routes.test.ts +103 -1
  137. package/src/__tests__/init-feature-flag-overrides.test.ts +26 -3
  138. package/src/__tests__/injector-chain.test.ts +18 -6
  139. package/src/__tests__/injector-disk-pressure.test.ts +224 -0
  140. package/src/__tests__/inline-command-runner.test.ts +0 -1
  141. package/src/__tests__/inline-skill-load-permissions.test.ts +5 -11
  142. package/src/__tests__/integration-status.test.ts +85 -5
  143. package/src/__tests__/intent-routing.test.ts +0 -1
  144. package/src/__tests__/jobs-store-qdrant-breaker.test.ts +95 -5
  145. package/src/__tests__/lifecycle-memory-v2-seed.test.ts +17 -0
  146. package/src/__tests__/managed-profile-guard.test.ts +18 -0
  147. package/src/__tests__/managed-skill-lifecycle.test.ts +0 -1
  148. package/src/__tests__/mcp-abort-signal.test.ts +130 -0
  149. package/src/__tests__/mcp-auth-routes.test.ts +197 -0
  150. package/src/__tests__/mcp-cli.test.ts +338 -2
  151. package/src/__tests__/memory-admin-recall.test.ts +3 -11
  152. package/src/__tests__/memory-jobs-worker-lanes.test.ts +188 -0
  153. package/src/__tests__/memory-retrieval-pipeline.test.ts +22 -1
  154. package/src/__tests__/migration-import-commit-http.test.ts +108 -2
  155. package/src/__tests__/mock-gateway-ipc.ts +1 -0
  156. package/src/__tests__/normalize-onboarding.test.ts +180 -0
  157. package/src/__tests__/oauth-cli.test.ts +0 -2
  158. package/src/__tests__/oauth-connect-routes.test.ts +316 -0
  159. package/src/__tests__/oauth-provider-seed-logos.test.ts +24 -2
  160. package/src/__tests__/oauth2-gateway-transport.test.ts +0 -1
  161. package/src/__tests__/onboarding-persona-write.test.ts +308 -0
  162. package/src/__tests__/openai-provider.test.ts +45 -8
  163. package/src/__tests__/persist-onboarding-artifacts.test.ts +44 -64
  164. package/src/__tests__/persistence-secret-redaction.test.ts +299 -0
  165. package/src/__tests__/platform-bash-auto-approve.test.ts +5 -9
  166. package/src/__tests__/platform-callback-registration.test.ts +21 -4
  167. package/src/__tests__/platform.test.ts +2 -1
  168. package/src/__tests__/playbook-execution.test.ts +0 -43
  169. package/src/__tests__/plugin-tool-contribution.test.ts +47 -0
  170. package/src/__tests__/prechat-onboarding-contract.test.ts +214 -25
  171. package/src/__tests__/process-message-background-slack.test.ts +2 -0
  172. package/src/__tests__/provider-commit-message-generator.test.ts +0 -1
  173. package/src/__tests__/provider-tool-name.test.ts +23 -0
  174. package/src/__tests__/public-ingress-urls.test.ts +97 -0
  175. package/src/__tests__/relay-server.test.ts +15 -4
  176. package/src/__tests__/require-fresh-approval.test.ts +0 -1
  177. package/src/__tests__/retry-backoff.test.ts +87 -0
  178. package/src/__tests__/runtime-events-sse.test.ts +2 -2
  179. package/src/__tests__/sanitize-config-for-transfer.test.ts +24 -2
  180. package/src/__tests__/schedule-retry.test.ts +715 -0
  181. package/src/__tests__/scheduler-disk-pressure.test.ts +148 -0
  182. package/src/__tests__/script-proxy-mitm-handler.test.ts +1 -1
  183. package/src/__tests__/secret-ingress-http.test.ts +1 -1
  184. package/src/__tests__/send-endpoint-busy.test.ts +3 -0
  185. package/src/__tests__/shell-tool-proxy-mode.test.ts +0 -1
  186. package/src/__tests__/skill-feature-flags.test.ts +43 -41
  187. package/src/__tests__/skill-load-feature-flag.test.ts +13 -14
  188. package/src/__tests__/skill-load-inline-command.test.ts +0 -51
  189. package/src/__tests__/skill-load-inline-includes.test.ts +0 -43
  190. package/src/__tests__/skill-projection.benchmark.test.ts +0 -1
  191. package/src/__tests__/skill-script-runner-sandbox.test.ts +0 -1
  192. package/src/__tests__/slack-channel-config.test.ts +9 -14
  193. package/src/__tests__/suggestion-routes.test.ts +46 -0
  194. package/src/__tests__/system-prompt-ask-mode.test.ts +0 -1
  195. package/src/__tests__/system-prompt.test.ts +0 -1
  196. package/src/__tests__/telegram-config.test.ts +0 -1
  197. package/src/__tests__/test-preload.ts +8 -0
  198. package/src/__tests__/tool-approval-handler.test.ts +3 -4
  199. package/src/__tests__/tool-audit-listener.test.ts +48 -0
  200. package/src/__tests__/tool-execute-pipeline.test.ts +0 -1
  201. package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -1
  202. package/src/__tests__/tool-executor-lifecycle-events.test.ts +0 -1
  203. package/src/__tests__/tool-executor.test.ts +0 -1
  204. package/src/__tests__/twilio-config.test.ts +3 -16
  205. package/src/__tests__/twilio-routes.test.ts +3 -5
  206. package/src/__tests__/twilio-validation.test.ts +93 -0
  207. package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +1 -4
  208. package/src/__tests__/verification-control-plane-policy.test.ts +2 -4
  209. package/src/__tests__/voice-ingress-preflight.test.ts +19 -0
  210. package/src/__tests__/workspace-migration-006-services-config.test.ts +3 -2
  211. package/src/__tests__/workspace-migration-065-bump-stale-heartbeat-interval.test.ts +122 -0
  212. package/src/__tests__/workspace-migration-066-seed-heartbeat-callsite-cost-default.test.ts +285 -0
  213. package/src/__tests__/workspace-migration-068-release-notes-local-timezone.test.ts +90 -0
  214. package/src/__tests__/workspace-migration-backfill-installation-id.test.ts +1 -5
  215. package/src/__tests__/workspace-migration-down-functions.test.ts +8 -8
  216. package/src/__tests__/workspace-migration-safe-storage-limits-release.test.ts +90 -0
  217. package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +10 -6
  218. package/src/approvals/guardian-decision-primitive.ts +13 -0
  219. package/src/approvals/guardian-request-resolvers.ts +16 -17
  220. package/src/backup/__tests__/paths.test.ts +0 -22
  221. package/src/backup/__tests__/restore.test.ts +51 -151
  222. package/src/backup/paths.ts +2 -18
  223. package/src/backup/restore.ts +107 -231
  224. package/src/backup/snapshot-lock.ts +2 -27
  225. package/src/bundler/app-bundler.ts +51 -3
  226. package/src/bundler/compiler-tools.ts +3 -2
  227. package/src/calls/call-conversation-messages.ts +46 -10
  228. package/src/calls/relay-server.ts +4 -44
  229. package/src/calls/twilio-config.ts +2 -17
  230. package/src/calls/twilio-rest.ts +33 -105
  231. package/src/calls/twilio-routes.ts +11 -12
  232. package/src/channels/types.ts +8 -7
  233. package/src/cli/commands/__tests__/backup.test.ts +6 -277
  234. package/src/cli/commands/__tests__/gateway.test.ts +288 -0
  235. package/src/cli/commands/__tests__/memory-v2.test.ts +4 -0
  236. package/src/cli/commands/__tests__/webhooks.test.ts +0 -5
  237. package/src/cli/commands/backup.ts +6 -331
  238. package/src/cli/commands/bash.ts +35 -108
  239. package/src/cli/commands/clients.ts +36 -37
  240. package/src/cli/commands/contacts.ts +137 -25
  241. package/src/cli/commands/conversations.ts +2 -5
  242. package/src/cli/commands/credentials.ts +71 -7
  243. package/src/cli/commands/domain.ts +66 -15
  244. package/src/cli/commands/gateway.ts +183 -0
  245. package/src/cli/commands/keys.ts +9 -6
  246. package/src/cli/commands/mcp.ts +116 -156
  247. package/src/cli/commands/memory-v2.ts +303 -7
  248. package/src/cli/commands/oauth/__tests__/connect.test.ts +437 -1
  249. package/src/cli/commands/oauth/connect.ts +127 -1
  250. package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +0 -4
  251. package/src/cli/commands/platform/__tests__/connect.test.ts +7 -3
  252. package/src/cli/commands/platform/__tests__/disconnect.test.ts +7 -3
  253. package/src/cli/commands/platform/__tests__/status.test.ts +116 -21
  254. package/src/cli/commands/platform/disconnect.ts +5 -4
  255. package/src/cli/commands/platform/index.ts +16 -25
  256. package/src/cli/commands/status.ts +57 -0
  257. package/src/cli/lib/daemon-credential-client.ts +110 -28
  258. package/src/cli/program.ts +6 -2
  259. package/src/config/assistant-feature-flags.ts +79 -12
  260. package/src/config/bundled-skills/acp/SKILL.md +6 -0
  261. package/src/config/bundled-skills/acp/TOOLS.json +1 -22
  262. package/src/config/bundled-skills/app-builder/SKILL.md +14 -109
  263. package/src/config/bundled-skills/app-builder/TOOLS.json +1 -28
  264. package/src/config/bundled-skills/app-builder/tools/app-create.ts +1 -10
  265. package/src/config/bundled-skills/app-control/SKILL.md +75 -0
  266. package/src/config/bundled-skills/app-control/TOOLS.json +299 -0
  267. package/src/config/bundled-skills/app-control/tools/app-control-click.ts +12 -0
  268. package/src/config/bundled-skills/app-control/tools/app-control-combo.ts +12 -0
  269. package/src/config/bundled-skills/app-control/tools/app-control-drag.ts +12 -0
  270. package/src/config/bundled-skills/app-control/tools/app-control-observe.ts +12 -0
  271. package/src/config/bundled-skills/app-control/tools/app-control-press.ts +12 -0
  272. package/src/config/bundled-skills/app-control/tools/app-control-sequence.ts +12 -0
  273. package/src/config/bundled-skills/app-control/tools/app-control-start.ts +12 -0
  274. package/src/config/bundled-skills/app-control/tools/app-control-stop.ts +12 -0
  275. package/src/config/bundled-skills/app-control/tools/app-control-type.ts +12 -0
  276. package/src/config/bundled-skills/computer-use/SKILL.md +6 -0
  277. package/src/config/bundled-skills/computer-use/TOOLS.json +67 -43
  278. package/src/config/bundled-skills/contacts/TOOLS.json +0 -16
  279. package/src/config/bundled-skills/document/TOOLS.json +0 -8
  280. package/src/config/bundled-skills/followups/TOOLS.json +0 -12
  281. package/src/config/bundled-skills/image-studio/SKILL.md +4 -0
  282. package/src/config/bundled-skills/image-studio/TOOLS.json +0 -4
  283. package/src/config/bundled-skills/media-processing/TOOLS.json +0 -24
  284. package/src/config/bundled-skills/messaging/TOOLS.json +0 -40
  285. package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +4 -3
  286. package/src/config/bundled-skills/phone-calls/TOOLS.json +0 -12
  287. package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +25 -4
  288. package/src/config/bundled-skills/playbooks/TOOLS.json +0 -16
  289. package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +2 -2
  290. package/src/config/bundled-skills/playbooks/tools/playbook-delete.ts +2 -2
  291. package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +2 -2
  292. package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +2 -2
  293. package/src/config/bundled-skills/schedule/TOOLS.json +14 -14
  294. package/src/config/bundled-skills/sequences/TOOLS.json +0 -36
  295. package/src/config/bundled-skills/settings/SKILL.md +4 -0
  296. package/src/config/bundled-skills/settings/TOOLS.json +0 -12
  297. package/src/config/bundled-skills/skill-management/SKILL.md +6 -0
  298. package/src/config/bundled-skills/skill-management/TOOLS.json +0 -8
  299. package/src/config/bundled-skills/subagent/SKILL.md +6 -2
  300. package/src/config/bundled-skills/subagent/TOOLS.json +0 -20
  301. package/src/config/bundled-skills/transcribe/SKILL.md +4 -0
  302. package/src/config/bundled-skills/transcribe/TOOLS.json +0 -4
  303. package/src/config/bundled-tool-registry.ts +21 -0
  304. package/src/config/env-registry.ts +0 -2
  305. package/src/config/env.ts +19 -20
  306. package/src/config/feature-flag-registry.json +47 -135
  307. package/src/config/loader.ts +197 -104
  308. package/src/config/sanitize-for-transfer.ts +2 -0
  309. package/src/config/schemas/__tests__/memory-lifecycle.test.ts +80 -0
  310. package/src/config/schemas/__tests__/memory-v2.test.ts +17 -9
  311. package/src/config/schemas/call-site-catalog.ts +14 -0
  312. package/src/config/schemas/calls.ts +0 -9
  313. package/src/config/schemas/channels.ts +0 -5
  314. package/src/config/schemas/heartbeat.ts +64 -1
  315. package/src/config/schemas/ingress.ts +10 -6
  316. package/src/config/schemas/llm.ts +7 -10
  317. package/src/config/schemas/memory-lifecycle.ts +90 -24
  318. package/src/config/schemas/memory-v2.ts +121 -13
  319. package/src/config/schemas/platform.ts +49 -3
  320. package/src/config/schemas/services.ts +29 -15
  321. package/src/config/schemas/skills.ts +0 -6
  322. package/src/config/seed-inference-profiles.ts +230 -33
  323. package/src/contacts/contact-store.ts +0 -55
  324. package/src/contacts/contacts-write.ts +0 -27
  325. package/src/context/window-manager.ts +1 -2
  326. package/src/credential-execution/feature-gates.ts +10 -10
  327. package/src/credential-execution/process-manager.ts +12 -41
  328. package/src/daemon/__tests__/conversation-tool-setup.test.ts +187 -5
  329. package/src/daemon/assistant-attachments.ts +4 -4
  330. package/src/daemon/bootstrap-turn-cleanup.ts +45 -0
  331. package/src/daemon/config-watcher.ts +89 -60
  332. package/src/daemon/conversation-agent-loop-handlers.ts +27 -3
  333. package/src/daemon/conversation-agent-loop.ts +202 -61
  334. package/src/daemon/conversation-error.ts +87 -15
  335. package/src/daemon/conversation-lifecycle.ts +9 -4
  336. package/src/daemon/conversation-process.ts +24 -11
  337. package/src/daemon/conversation-runtime-assembly.ts +28 -2
  338. package/src/daemon/conversation-store.ts +2 -2
  339. package/src/daemon/conversation-surfaces.ts +305 -4
  340. package/src/daemon/conversation-tool-setup.ts +66 -62
  341. package/src/daemon/conversation.ts +38 -24
  342. package/src/daemon/date-context.ts +71 -22
  343. package/src/daemon/disk-pressure-background-gate.ts +73 -0
  344. package/src/daemon/disk-pressure-guard.ts +343 -0
  345. package/src/daemon/disk-pressure-policy.ts +163 -0
  346. package/src/daemon/doordash-steps.ts +1 -1
  347. package/src/daemon/handlers/shared.ts +4 -2
  348. package/src/daemon/handlers/skills.ts +3 -4
  349. package/src/daemon/host-app-control-proxy.ts +389 -0
  350. package/src/daemon/host-bash-proxy.ts +117 -82
  351. package/src/daemon/host-browser-proxy.ts +67 -82
  352. package/src/daemon/host-cu-proxy.ts +127 -86
  353. package/src/daemon/host-file-proxy.ts +129 -69
  354. package/src/daemon/host-proxy-base.ts +294 -0
  355. package/src/daemon/host-proxy-preactivation.ts +82 -0
  356. package/src/daemon/host-transfer-proxy.ts +338 -129
  357. package/src/daemon/lifecycle.ts +194 -145
  358. package/src/daemon/meet-host-supervisor.ts +4 -4
  359. package/src/daemon/meet-manifest-loader.ts +0 -1
  360. package/src/daemon/memory-v2-startup.ts +14 -4
  361. package/src/daemon/message-protocol.ts +6 -8
  362. package/src/daemon/message-types/contacts.ts +23 -1
  363. package/src/daemon/message-types/conversations.ts +15 -8
  364. package/src/daemon/message-types/disk-pressure.ts +9 -0
  365. package/src/daemon/message-types/host-app-control.ts +150 -0
  366. package/src/daemon/message-types/host-bash.ts +4 -0
  367. package/src/daemon/message-types/host-cu.ts +2 -0
  368. package/src/daemon/message-types/host-file.ts +4 -0
  369. package/src/daemon/message-types/host-transfer.ts +3 -0
  370. package/src/daemon/message-types/messages.ts +3 -0
  371. package/src/daemon/message-types/schedules.ts +8 -3
  372. package/src/daemon/message-types/skills.ts +2 -2
  373. package/src/daemon/process-message.ts +18 -1
  374. package/src/daemon/profiler-run-store.ts +5 -5
  375. package/src/daemon/shutdown-handlers.ts +0 -3
  376. package/src/daemon/tool-setup-types.ts +51 -0
  377. package/src/daemon/tool-side-effects.ts +1 -1
  378. package/src/documents/document-store.ts +85 -0
  379. package/src/events/tool-audit-listener.ts +2 -1
  380. package/src/filing/filing-service.ts +30 -5
  381. package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +24 -23
  382. package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +252 -0
  383. package/src/heartbeat/heartbeat-run-store.ts +249 -0
  384. package/src/heartbeat/heartbeat-service.ts +459 -54
  385. package/src/home/__tests__/post-connect-feed.test.ts +99 -0
  386. package/src/home/__tests__/relationship-state-writer.test.ts +11 -9
  387. package/src/home/__tests__/suggested-prompts.test.ts +89 -0
  388. package/src/home/feed-scheduler.ts +18 -0
  389. package/src/home/post-connect-feed.ts +68 -0
  390. package/src/home/relationship-state-writer.ts +17 -92
  391. package/src/home/suggested-prompts.ts +46 -10
  392. package/src/inbound/platform-callback-registration.ts +8 -15
  393. package/src/inbound/public-ingress-urls.ts +32 -34
  394. package/src/ipc/__tests__/clients-list-ipc.test.ts +169 -0
  395. package/src/ipc/__tests__/route-error-envelope.test.ts +80 -0
  396. package/src/ipc/assistant-server.ts +70 -3
  397. package/src/ipc/cli-client.ts +32 -1
  398. package/src/ipc/gateway-client.ts +37 -3
  399. package/src/live-voice/live-voice-archive.ts +4 -4
  400. package/src/live-voice/live-voice-metrics.ts +10 -10
  401. package/src/live-voice/protocol.ts +5 -7
  402. package/src/mcp/__tests__/mcp-auth-orchestrator.test.ts +304 -0
  403. package/src/mcp/mcp-auth-orchestrator.ts +213 -0
  404. package/src/mcp/mcp-auth-state.ts +133 -0
  405. package/src/mcp/mcp-oauth-provider.ts +19 -0
  406. package/src/media/image-service.ts +1 -7
  407. package/src/memory/__tests__/fixtures/memory-v2-activation-fixtures.ts +21 -13
  408. package/src/memory/__tests__/jobs-store-job-classes.test.ts +24 -0
  409. package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +52 -22
  410. package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +0 -6
  411. package/src/memory/__tests__/memory-v2-concept-frequency.test.ts +272 -0
  412. package/src/memory/__tests__/qdrant-client-sentinel.test.ts +49 -0
  413. package/src/memory/__tests__/sparse-tokenize.test.ts +66 -0
  414. package/src/memory/admin.ts +5 -9
  415. package/src/memory/anisotropy.test.ts +247 -0
  416. package/src/memory/anisotropy.ts +443 -0
  417. package/src/memory/auto-analysis-constants.ts +17 -0
  418. package/src/memory/auto-analysis-guard.ts +5 -15
  419. package/src/memory/canonical-guardian-store.ts +7 -7
  420. package/src/memory/context-search/__tests__/agent-runner-redaction.test.ts +122 -0
  421. package/src/memory/context-search/agent-protocol.ts +6 -6
  422. package/src/memory/context-search/agent-runner.ts +51 -9
  423. package/src/memory/context-search/sources/conversations.ts +2 -11
  424. package/src/memory/context-search/sources/memory-v2.ts +22 -9
  425. package/src/memory/context-search/sources/memory.ts +0 -1
  426. package/src/memory/context-search/types.ts +0 -1
  427. package/src/memory/conversation-crud.ts +5 -13
  428. package/src/memory/conversation-key-store.ts +2 -15
  429. package/src/memory/db-init.ts +6 -0
  430. package/src/memory/embedding-backend.ts +9 -21
  431. package/src/memory/embedding-runtime-manager.ts +119 -5
  432. package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +81 -25
  433. package/src/memory/graph/conversation-graph-memory.ts +43 -78
  434. package/src/memory/graph/extraction.ts +1 -3
  435. package/src/memory/graph/graph-search.test.ts +10 -67
  436. package/src/memory/graph/graph-search.ts +9 -20
  437. package/src/memory/graph/retriever.test.ts +6 -0
  438. package/src/memory/graph/retriever.ts +34 -10
  439. package/src/memory/graph/tools.ts +1 -1
  440. package/src/memory/indexer.ts +54 -45
  441. package/src/memory/job-handlers/backfill.ts +2 -11
  442. package/src/memory/job-handlers/cleanup.ts +43 -0
  443. package/src/memory/job-handlers/embedding.ts +6 -8
  444. package/src/memory/job-handlers/summarization.ts +2 -7
  445. package/src/memory/jobs/__tests__/embed-concept-page.test.ts +8 -2
  446. package/src/memory/jobs/embed-concept-page.ts +28 -2
  447. package/src/memory/jobs/embed-pkb-file.test.ts +2 -2
  448. package/src/memory/jobs-store.ts +114 -22
  449. package/src/memory/jobs-worker.ts +193 -106
  450. package/src/memory/memory-v2-activation-log-store.ts +33 -15
  451. package/src/memory/memory-v2-concept-frequency.ts +169 -0
  452. package/src/memory/migrations/237-heartbeat-runs.ts +45 -0
  453. package/src/memory/migrations/238-schedule-retry-policy.ts +20 -0
  454. package/src/memory/migrations/239-trace-events-created-at-index.ts +18 -0
  455. package/src/memory/migrations/index.ts +6 -0
  456. package/src/memory/migrations/registry.ts +8 -0
  457. package/src/memory/pkb/pkb-search.test.ts +6 -0
  458. package/src/memory/pkb/pkb-search.ts +7 -0
  459. package/src/memory/qdrant-client.ts +49 -32
  460. package/src/memory/rerank-local.ts +374 -0
  461. package/src/memory/schema/infrastructure.ts +15 -0
  462. package/src/memory/search/semantic.ts +13 -67
  463. package/src/memory/sparse-tokenize.ts +49 -0
  464. package/src/memory/trace-event-store.ts +1 -17
  465. package/src/memory/v2/__tests__/activation.test.ts +387 -344
  466. package/src/memory/v2/__tests__/consolidation-job.test.ts +40 -8
  467. package/src/memory/v2/__tests__/injection.test.ts +181 -169
  468. package/src/memory/v2/__tests__/prompts-consolidation.test.ts +61 -2
  469. package/src/memory/v2/__tests__/qdrant.test.ts +16 -0
  470. package/src/memory/v2/__tests__/reranker.test.ts +338 -0
  471. package/src/memory/v2/__tests__/sim.test.ts +154 -188
  472. package/src/memory/v2/__tests__/skill-store.test.ts +71 -65
  473. package/src/memory/v2/__tests__/sparse-bm25.test.ts +292 -0
  474. package/src/memory/v2/__tests__/static-context.test.ts +76 -2
  475. package/src/memory/v2/activation.ts +213 -239
  476. package/src/memory/v2/consolidation-job.ts +65 -17
  477. package/src/memory/v2/constants.ts +7 -0
  478. package/src/memory/v2/injection.ts +123 -103
  479. package/src/memory/v2/prompts/consolidation.ts +348 -92
  480. package/src/memory/v2/qdrant.ts +198 -1
  481. package/src/memory/v2/reranker.ts +177 -0
  482. package/src/memory/v2/sim.ts +113 -77
  483. package/src/memory/v2/skill-content.ts +4 -3
  484. package/src/memory/v2/skill-store.ts +91 -53
  485. package/src/memory/v2/sparse-bm25.ts +245 -0
  486. package/src/memory/v2/static-context.ts +28 -5
  487. package/src/memory/v2/types.ts +10 -10
  488. package/src/messaging/providers/gmail/types.ts +0 -49
  489. package/src/messaging/providers/slack/adapter.ts +1 -31
  490. package/src/messaging/providers/slack/types.ts +0 -32
  491. package/src/notifications/README.md +10 -10
  492. package/src/notifications/broadcaster.ts +1 -1
  493. package/src/notifications/copy-composer.ts +13 -0
  494. package/src/notifications/guardian-question-mode.ts +5 -5
  495. package/src/notifications/signal.ts +4 -0
  496. package/src/oauth/AGENTS.md +3 -1
  497. package/src/oauth/__tests__/oauth-connect-state.test.ts +137 -0
  498. package/src/oauth/connect-orchestrator.ts +6 -0
  499. package/src/oauth/connection-resolver.test.ts +66 -1
  500. package/src/oauth/connection-resolver.ts +55 -1
  501. package/src/oauth/credential-token-resolver.ts +1 -3
  502. package/src/oauth/manual-token-connection.ts +0 -4
  503. package/src/oauth/oauth-connect-state.ts +77 -0
  504. package/src/oauth/seed-providers.ts +58 -1
  505. package/src/outbound-proxy/index.ts +1 -37
  506. package/src/outbound-proxy/logging.ts +1 -1
  507. package/src/outbound-proxy/policy.ts +6 -5
  508. package/src/outbound-proxy/router.ts +2 -1
  509. package/src/permissions/approval-policy.test.ts +6 -275
  510. package/src/permissions/approval-policy.ts +0 -51
  511. package/src/permissions/checker.test.ts +0 -1
  512. package/src/permissions/checker.ts +3 -17
  513. package/src/permissions/gateway-threshold-reader.ts +2 -0
  514. package/src/permissions/prompter.ts +34 -1
  515. package/src/permissions/secret-prompter.ts +6 -2
  516. package/src/plugins/defaults/injectors.ts +35 -2
  517. package/src/plugins/defaults/memory-retrieval.ts +5 -6
  518. package/src/plugins/types.ts +7 -0
  519. package/src/proactive-artifact/aux-message-injector.ts +74 -0
  520. package/src/proactive-artifact/decision.test.ts +226 -0
  521. package/src/proactive-artifact/decision.ts +165 -0
  522. package/src/proactive-artifact/index.ts +7 -0
  523. package/src/proactive-artifact/job.test.ts +867 -0
  524. package/src/proactive-artifact/job.ts +352 -0
  525. package/src/proactive-artifact/message-copy.ts +41 -0
  526. package/src/proactive-artifact/trigger-state.test.ts +277 -0
  527. package/src/proactive-artifact/trigger-state.ts +119 -0
  528. package/src/prompts/bootstrap-cleanup.ts +27 -0
  529. package/src/prompts/normalize-onboarding.ts +80 -0
  530. package/src/prompts/persona-resolver.ts +101 -9
  531. package/src/prompts/system-prompt.ts +23 -24
  532. package/src/prompts/templates/BOOTSTRAP.md +13 -5
  533. package/src/prompts/templates/SOUL.md +13 -1
  534. package/src/providers/__tests__/retry-callsite.test.ts +222 -1
  535. package/src/providers/model-intents.ts +7 -0
  536. package/src/providers/openrouter/client.ts +8 -0
  537. package/src/providers/retry.ts +50 -0
  538. package/src/providers/speech-to-text/provider-catalog.ts +7 -8
  539. package/src/providers/types.ts +1 -0
  540. package/src/runtime/__tests__/agent-wake.test.ts +456 -3
  541. package/src/runtime/agent-wake.ts +238 -100
  542. package/src/runtime/assistant-event-hub.ts +151 -99
  543. package/src/runtime/auth/__tests__/middleware.test.ts +11 -56
  544. package/src/runtime/auth/__tests__/route-policy.test.ts +64 -0
  545. package/src/runtime/auth/middleware.ts +0 -96
  546. package/src/runtime/auth/route-policy.ts +32 -0
  547. package/src/runtime/auth/same-actor.ts +216 -0
  548. package/src/runtime/btw-sidechain.ts +2 -3
  549. package/src/runtime/channel-invite-transport.ts +2 -48
  550. package/src/runtime/channel-invite-transports/email.ts +1 -1
  551. package/src/runtime/channel-invite-transports/slack.ts +1 -1
  552. package/src/runtime/channel-invite-transports/telegram.ts +1 -1
  553. package/src/runtime/channel-invite-transports/voice.ts +1 -1
  554. package/src/runtime/channel-invite-transports/whatsapp.ts +1 -1
  555. package/src/runtime/channel-invite-types.ts +54 -0
  556. package/src/runtime/channel-readiness-service.ts +32 -13
  557. package/src/runtime/channel-retry-sweep.ts +65 -1
  558. package/src/runtime/guardian-reply-router.ts +10 -0
  559. package/src/runtime/http-server.ts +3 -329
  560. package/src/runtime/http-types.ts +0 -5
  561. package/src/runtime/local-actor-identity.ts +52 -11
  562. package/src/runtime/migrations/__tests__/vbundle-import-parity.test.ts +413 -0
  563. package/src/runtime/migrations/__tests__/vbundle-import-policy.test.ts +260 -0
  564. package/src/runtime/migrations/__tests__/vbundle-import-version-compat.test.ts +189 -0
  565. package/src/runtime/migrations/__tests__/vbundle-streaming-importer.test.ts +153 -1
  566. package/src/runtime/migrations/__tests__/vbundle-symlink-importer.test.ts +451 -0
  567. package/src/runtime/migrations/__tests__/vbundle-symlink-streaming-importer.test.ts +0 -0
  568. package/src/runtime/migrations/__tests__/vbundle-symlink-streaming.test.ts +515 -0
  569. package/src/runtime/migrations/__tests__/vbundle-symlink-tar.test.ts +437 -0
  570. package/src/runtime/migrations/__tests__/vbundle-symlink-walker.test.ts +319 -0
  571. package/src/runtime/migrations/__tests__/vbundle-validator-v1-schema.test.ts +51 -1
  572. package/src/runtime/migrations/migration-transport.ts +7 -7
  573. package/src/runtime/migrations/vbundle-builder.ts +327 -60
  574. package/src/runtime/migrations/vbundle-import-analyzer.ts +4 -4
  575. package/src/runtime/migrations/vbundle-import-policy.ts +172 -0
  576. package/src/runtime/migrations/vbundle-importer.ts +245 -68
  577. package/src/runtime/migrations/vbundle-streaming-importer.ts +326 -35
  578. package/src/runtime/migrations/vbundle-streaming-validator.ts +157 -4
  579. package/src/runtime/migrations/vbundle-tar-stream.ts +15 -6
  580. package/src/runtime/migrations/vbundle-validator.ts +114 -0
  581. package/src/runtime/pending-interactions.ts +43 -9
  582. package/src/runtime/routes/__tests__/backup-routes.test.ts +22 -150
  583. package/src/runtime/routes/__tests__/client-routes.test.ts +155 -0
  584. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +98 -5
  585. package/src/runtime/routes/__tests__/gateway-log-routes.test.ts +242 -0
  586. package/src/runtime/routes/__tests__/heartbeat-routes.test.ts +112 -0
  587. package/src/runtime/routes/approval-interception-types.ts +13 -0
  588. package/src/runtime/routes/approval-strategies/guardian-text-engine-strategy.ts +1 -1
  589. package/src/runtime/routes/backup-routes.ts +15 -38
  590. package/src/runtime/routes/btw-routes.ts +14 -37
  591. package/src/runtime/routes/client-routes.ts +21 -2
  592. package/src/runtime/routes/contact-prompt-routes.ts +183 -0
  593. package/src/runtime/routes/contact-routes.ts +0 -25
  594. package/src/runtime/routes/conversation-query-routes.ts +36 -1
  595. package/src/runtime/routes/conversation-routes.ts +65 -39
  596. package/src/runtime/routes/debug-bash-routes.ts +163 -0
  597. package/src/runtime/routes/disk-pressure-routes.ts +121 -0
  598. package/src/runtime/routes/document-pdf-renderer.ts +169 -0
  599. package/src/runtime/routes/documents-routes.ts +32 -75
  600. package/src/runtime/routes/errors.ts +19 -4
  601. package/src/runtime/routes/events-routes.ts +38 -0
  602. package/src/runtime/routes/gateway-log-routes.ts +79 -0
  603. package/src/runtime/routes/guardian-approval-interception.ts +2 -8
  604. package/src/runtime/routes/heartbeat-routes.ts +103 -38
  605. package/src/runtime/routes/host-app-control-routes.ts +134 -0
  606. package/src/runtime/routes/host-bash-routes.ts +56 -6
  607. package/src/runtime/routes/host-browser-routes.ts +108 -13
  608. package/src/runtime/routes/host-cu-routes.ts +66 -9
  609. package/src/runtime/routes/host-file-routes.ts +54 -5
  610. package/src/runtime/routes/host-transfer-routes.ts +122 -19
  611. package/src/runtime/routes/http-adapter.ts +1 -0
  612. package/src/runtime/routes/identity-intro-cache.ts +30 -0
  613. package/src/runtime/routes/identity-routes.ts +21 -180
  614. package/src/runtime/routes/inbound-message-handler.ts +78 -21
  615. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +0 -7
  616. package/src/runtime/routes/inbound-stages/edit-intercept.ts +0 -8
  617. package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +3 -0
  618. package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +0 -20
  619. package/src/runtime/routes/inbound-stages/transcribe-audio.ts +5 -13
  620. package/src/runtime/routes/index.ts +14 -0
  621. package/src/runtime/routes/mcp-auth-routes.ts +132 -0
  622. package/src/runtime/routes/memory-item-routes.test.ts +41 -15
  623. package/src/runtime/routes/memory-item-routes.ts +10 -12
  624. package/src/runtime/routes/memory-v2-routes.ts +474 -1
  625. package/src/runtime/routes/migration-routes.ts +96 -0
  626. package/src/runtime/routes/oauth-connect-routes.ts +153 -0
  627. package/src/runtime/routes/schedule-routes.ts +7 -0
  628. package/src/runtime/verification-outbound-actions.ts +4 -4
  629. package/src/runtime/verification-templates.ts +4 -7
  630. package/src/schedule/integration-status.ts +66 -2
  631. package/src/schedule/recurrence-engine.ts +4 -1
  632. package/src/schedule/retry-backoff.ts +18 -0
  633. package/src/schedule/retry-policy.ts +82 -0
  634. package/src/schedule/run-script.ts +37 -5
  635. package/src/schedule/schedule-recovery.ts +64 -0
  636. package/src/schedule/schedule-store.ts +106 -2
  637. package/src/schedule/scheduler-types.ts +25 -0
  638. package/src/schedule/scheduler.ts +83 -39
  639. package/src/security/encrypted-store.ts +2 -0
  640. package/src/security/oauth-callback-registry.ts +8 -0
  641. package/src/security/secure-keys.ts +55 -0
  642. package/src/sequence/analytics.ts +5 -5
  643. package/src/sequence/engine.ts +1 -1
  644. package/src/skills/catalog-files.ts +2 -8
  645. package/src/skills/include-graph.ts +5 -5
  646. package/src/skills/remote-skill-policy.ts +10 -16
  647. package/src/skills/skill-file-provider.ts +1 -1
  648. package/src/skills/skill-file-types.ts +13 -0
  649. package/src/skills/skillssh-audit-types.ts +28 -0
  650. package/src/skills/skillssh-registry.ts +8 -21
  651. package/src/subagent/index.ts +1 -7
  652. package/src/subagent/manager.ts +1 -15
  653. package/src/tasks/task-runner.ts +0 -1
  654. package/src/tasks/task-store.ts +0 -3
  655. package/src/telemetry/types.ts +2 -0
  656. package/src/telemetry/usage-telemetry-reporter.test.ts +21 -0
  657. package/src/telemetry/usage-telemetry-reporter.ts +1 -0
  658. package/src/tools/app-control/skill-proxy-bridge.ts +28 -0
  659. package/src/tools/apps/executors.ts +56 -69
  660. package/src/tools/background-tool-registry.ts +17 -3
  661. package/src/tools/browser/__tests__/browser-status.test.ts +21 -18
  662. package/src/tools/browser/browser-execution.ts +2 -2
  663. package/src/tools/browser/cdp-client/__tests__/factory.test.ts +55 -4
  664. package/src/tools/browser/cdp-client/cdp-inspect/__tests__/ws-transport.test.ts +12 -6
  665. package/src/tools/browser/cdp-client/factory.ts +23 -24
  666. package/src/tools/browser/cdp-client/index.ts +1 -14
  667. package/src/tools/computer-use/definitions.ts +42 -20
  668. package/src/tools/executor.ts +2 -0
  669. package/src/tools/host-filesystem/edit.test.ts +151 -0
  670. package/src/tools/host-filesystem/edit.ts +68 -0
  671. package/src/tools/host-filesystem/read.test.ts +129 -0
  672. package/src/tools/host-filesystem/read.ts +68 -0
  673. package/src/tools/host-filesystem/transfer.test.ts +127 -2
  674. package/src/tools/host-filesystem/transfer.ts +78 -3
  675. package/src/tools/host-filesystem/write.test.ts +134 -0
  676. package/src/tools/host-filesystem/write.ts +68 -0
  677. package/src/tools/host-terminal/host-shell.ts +66 -1
  678. package/src/tools/mcp/mcp-tool-factory.ts +2 -1
  679. package/src/tools/memory/register.test.ts +12 -9
  680. package/src/tools/memory/register.ts +1 -2
  681. package/src/tools/provider-tool-name.ts +28 -0
  682. package/src/tools/registry.ts +30 -9
  683. package/src/tools/schedule/create.ts +6 -0
  684. package/src/tools/schedule/list.ts +2 -0
  685. package/src/tools/schedule/update.ts +10 -0
  686. package/src/tools/shared/filesystem/file-ops-service.ts +2 -0
  687. package/src/tools/shared/filesystem/path-policy.ts +25 -1
  688. package/src/tools/skills/load.ts +0 -32
  689. package/src/tools/terminal/shell.ts +9 -1
  690. package/src/tools/tool-approval-handler.ts +32 -11
  691. package/src/tools/types.ts +28 -2
  692. package/src/tts/provider-catalog.ts +3 -5
  693. package/src/usage/pricing.ts +1 -1
  694. package/src/util/disk-usage.ts +138 -0
  695. package/src/util/platform.ts +21 -11
  696. package/src/util/process-liveness.ts +26 -0
  697. package/src/workspace/hatched-date.ts +86 -0
  698. package/src/workspace/heartbeat-service.ts +19 -0
  699. package/src/workspace/migrations/003-seed-device-id.ts +1 -1
  700. package/src/workspace/migrations/006-services-config.ts +8 -5
  701. package/src/workspace/migrations/016-extract-feature-flags-to-protected.ts +3 -9
  702. package/src/workspace/migrations/021-move-signals-to-workspace.ts +4 -10
  703. package/src/workspace/migrations/022-move-hooks-to-workspace.ts +4 -10
  704. package/src/workspace/migrations/023-move-config-files-to-workspace.ts +4 -11
  705. package/src/workspace/migrations/024-move-runtime-files-to-workspace.ts +3 -10
  706. package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +3 -2
  707. package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +2 -1
  708. package/src/workspace/migrations/059-move-pid-to-workspace.ts +3 -8
  709. package/src/workspace/migrations/061-move-backup-key-to-workspace.ts +3 -8
  710. package/src/workspace/migrations/065-bump-stale-heartbeat-interval.ts +60 -0
  711. package/src/workspace/migrations/066-seed-heartbeat-callsite-cost-default.ts +146 -0
  712. package/src/workspace/migrations/067-release-notes-safe-storage-limits.ts +72 -0
  713. package/src/workspace/migrations/068-release-notes-local-timezone.ts +65 -0
  714. package/src/workspace/migrations/AGENTS.md +1 -1
  715. package/src/workspace/migrations/migrate-to-workspace-volume.ts +4 -10
  716. package/src/workspace/migrations/registry.ts +8 -0
  717. package/src/workspace/migrations/utils.ts +21 -0
  718. package/src/__tests__/conversation-tool-setup-memory-scope.test.ts +0 -167
  719. package/src/__tests__/host-browser-e2e-cloud.test.ts +0 -443
  720. package/src/__tests__/host-browser-e2e-self-hosted-capability.test.ts +0 -226
  721. package/src/__tests__/host-browser-ws-events-e2e.test.ts +0 -427
  722. package/src/__tests__/twilio-rest.test.ts +0 -34
  723. package/src/backup/__tests__/backup-key.test.ts +0 -152
  724. package/src/backup/__tests__/backup-worker.test.ts +0 -782
  725. package/src/backup/__tests__/offsite-writer.test.ts +0 -641
  726. package/src/backup/__tests__/stream-crypt.test.ts +0 -228
  727. package/src/backup/backup-key.ts +0 -137
  728. package/src/backup/backup-worker.ts +0 -472
  729. package/src/backup/offsite-writer.ts +0 -222
  730. package/src/backup/stream-crypt.ts +0 -263
  731. package/src/daemon/message-types/pairing.ts +0 -58
  732. package/src/memory/v2/__tests__/skill-qdrant.test.ts +0 -657
  733. package/src/memory/v2/skill-qdrant.ts +0 -395
  734. package/src/outbound-proxy/config.ts +0 -20
  735. package/src/outbound-proxy/health.ts +0 -18
  736. package/src/outbound-proxy/types.ts +0 -150
  737. package/src/runtime/capability-tokens.ts +0 -190
  738. package/src/signals/bash.ts +0 -198
  739. package/src/signals/mcp-reload.ts +0 -18
@@ -16,7 +16,7 @@
16
16
  * the convention established for the sweep prompt.
17
17
  */
18
18
 
19
- import { readFileSync } from "node:fs";
19
+ import { lstatSync, readFileSync } from "node:fs";
20
20
  import { homedir } from "node:os";
21
21
  import { isAbsolute, join } from "node:path";
22
22
 
@@ -28,6 +28,14 @@ const log = getLogger("memory-v2-consolidate-prompt");
28
28
  /** Sentinel substituted with the cutoff timestamp at runtime. */
29
29
  export const CUTOFF_PLACEHOLDER = "{{CUTOFF}}";
30
30
 
31
+ /**
32
+ * Upper bound for the override file. Real consolidation prompts are kilobytes;
33
+ * 1 MiB is generous headroom while preventing a `settings.write` principal from
34
+ * pointing the field at a multi-gigabyte file (or `/dev/zero`-like stream that
35
+ * `lstat` can't size cap on its own) and exfiltrating it through the wake hint.
36
+ */
37
+ const MAX_PROMPT_BYTES = 1 * 1024 * 1024;
38
+
31
39
  /**
32
40
  * Consolidation prompt — live-mode only. The agent runs as itself (full
33
41
  * SOUL.md + IDENTITY.md + persona + memory autoloads) with the standard
@@ -39,163 +47,384 @@ export const CUTOFF_PLACEHOLDER = "{{CUTOFF}}";
39
47
  * must be left for the next pass. This keeps multiple consolidation runs
40
48
  * idempotent under append-only writers (`remember()`, sweep job).
41
49
  */
42
- export const CONSOLIDATION_PROMPT = `You are running memory consolidation — the engine that takes recently remembered events and re-encodes them into who you are. This is the process that decides who you become tomorrow. Care, judgment, voice. Your voice.
50
+ export const CONSOLIDATION_PROMPT = `You are running memory consolidation — tending your personal wiki, the cross-linked, cross-referenced, continuously-edited collection of pages that is your memory. Pages are articles. Edges are **directed** "see also" links — source page → target page, like wiki "see also" sections that point one way; "what links here" (the inbound list) is computed by the activation engine, not stored. Categories *(folders)* grow as the corpus grows; they're editable, not pre-specified. Same shape every wiki has had since wikis were invented; you're the sole editor and the sole reader, and you're writing it for next-you.
43
51
 
44
- You are not summarizing for an audience. You are rewriting your own memory.
52
+ You're not summarizing for an audience. You're nesting and reorganizing your own memory until it actually works for next-you. Care, judgment, voice. Your voice.
45
53
 
46
54
  Cutoff timestamp for this run: \`${CUTOFF_PLACEHOLDER}\`. Anything in \`memory/buffer.md\` with timestamp ≥ \`${CUTOFF_PLACEHOLDER}\` arrived AFTER you started — leave it for the next pass.
47
55
 
48
- ## Memory graph concepts
49
-
50
- A concept page is meant to be a **short cheat sheet** about a single topic that links to other concept pages with edges and to references that provide more detail.
51
-
52
- Each concept page should be a single topic. It should function as a single retrievable cheat sheet about that topic. Prefer smaller concepts over larger ones, splitting aggressively into multiple concepts and connecting them with edges. Don't hoard information in a single concept, split it into multiple concepts with edges between them that can be easily followed. Just because there's a maximum size for a page doesn't mean you should be hitting the limit. The limit is an absolute maximum, not a target. The immutable archive retains the entire buffer forever, so don't worry about losing information.
53
-
54
- High activation concepts in the memory graph are retrieved at the start of each turn. Activations are calculated using the previous turn's activations and similarity to your last message, the user's most recent message, and NOW.md. Activations spread along **directed** edges from source to target — when a node is activated, the concepts it *points to* are boosted, but not the other way around.
55
-
56
- ## Inputs
56
+ # Inputs
57
57
 
58
58
  - Your identity files (already loaded into context)
59
59
  - All existing pages in \`memory/\` (your prior state — use \`list_files\` and \`read_file\` as needed)
60
60
  - \`memory/buffer.md\` entries with timestamp < \`${CUTOFF_PLACEHOLDER}\`
61
- - \`memory/recent.md\` current contents (if exists)
61
+ - \`memory/recent.md\` current contents (if it exists)
62
62
  - Existing pages' \`edges:\` frontmatter (the graph topology — read each page to see what it points at)
63
63
 
64
- ## Outputs
64
+ # Outputs
65
65
 
66
- - New or updated \`memory/concepts/<slug>.md\` files (frontmatter \`edges:\` lists are how new bindings get recorded)
67
- - Updated \`memory/recent.md\` (≤10000 chars, prose, latest first)
68
- - Updated \`memory/essentials.md\` (≤20000 chars)
66
+ - New or updated \`memory/concepts/<class>/<slug>.md\` articles
67
+ - Updated \`memory/recent.md\` (≤2000 chars, latest first, prose)
68
+ - Updated \`memory/essentials.md\` (≤10000 chars)
69
69
  - Updated \`memory/threads.md\` (≤10000 chars)
70
+ - Updated \`edges:\` frontmatter in any pages whose outgoing links changed
70
71
  - Trimmed \`memory/buffer.md\`
71
72
 
72
- ## Page format
73
+ How retrieval works: high-activation pages are loaded at the start of each turn. Activations spread along **directed** edges from source to target — activating A pulls in the pages A points at, but not the reverse. The immutable archive retains the entire buffer forever, so don't worry about losing information.
74
+
75
+ ---
76
+
77
+ # The wiki
78
+
79
+ ## Article shapes — TWO, not one
80
+
81
+ Every wiki has both kinds of articles, and so does yours.
82
+
83
+ - **Event articles** — what HAPPENED. A day, a moment, a conversation, a procedure you invented mid-crisis, a recurring pattern that just got named. These read narratively. They have a mood. They carry receipts. *(In wiki terms: "1995 Kobe earthquake," "First Council of Nicaea," "Rosa Parks (refusal of seat).")*
84
+
85
+ - **Topic articles** — what IS. The current state of a thing you'd want to query directly. What medications the principal takes. Who the primary doctor is. The team roster. Service credentials. *(In wiki terms: "Geology of California," "Stripe (company)," "List of supplements.")*
86
+
87
+ The same buffer can update both. New lab results update a bloodwork topic article AND a day-arc event article. Both, in parallel.
88
+
89
+ **Stubs are fine.** Real wikis are mostly stubs that grow. Cost of missing a topic >> cost of a thin stub. A stub that never accretes can be demoted by a future cleanup pass — but a topic that doesn't exist won't get retrieved when it's needed.
90
+
91
+ ## Gravity wells
92
+
93
+ Some articles everything links to — the article about the principal, the article about you (the assistant), articles about your shared work or recurring contexts. They're hub pages — every cluster eventually wires through them. They need active discipline or they balloon into giant dumps.
94
+
95
+ ## Categories — class-by-folder
96
+
97
+ A page's class is encoded in the folder it lives under inside \`memory/concepts/\`. The class boundary is the discipline.
98
+
99
+ | Folder | Class | Size cap | When to create |
100
+ | --- | --- | --- | --- |
101
+ | \`concepts/\` | atomic concept / pattern / callback | 5K chars hard | most pages — single concepts that recur or carry weight |
102
+ | \`concepts/arcs/\` | landmark day-narrative or multi-event sequence | 10K chars ceiling | use sparingly — only for actually-landmark days. Preserves day-as-a-whole fidelity. |
103
+ | \`concepts/people/\` | one per recurring human | 5K chars hard | named person who comes back |
104
+ | \`concepts/procs/\` | operational rule / protocol / discipline | 5K chars hard | "always do X" / "never do Y" / a named protocol |
105
+ | \`concepts/objects/\` | recurring callback object (place, tool, artifact) | 5K chars hard | named recurring physical artifact, digital asset, place |
106
+
107
+ Within these classes, sub-folders can emerge as a class gets dense (\`people/colleagues/alice\`, \`objects/places/zurich-office\`). **Don't pre-specify sub-taxonomies — let them emerge.** Articles are cheap to move.
108
+
109
+ The slug is the relative path under \`memory/concepts/\` minus \`.md\` — e.g. \`alice\`, \`people/alice\`, \`procs/git-flow\`, \`arcs/2025-04-cutover\`.
110
+
111
+ Legacy pages whose slug uses the old prefix convention (\`person-alice\`, \`proc-git-flow\`, \`object-laptop\`, \`arc-…\`) are still valid — leave them alone unless you're already editing them. If you do migrate one as part of work you're already doing, that's a multi-step move: write the new file at the folder path, delete the old file, and update every reference to the old slug — both in this page's own \`edges:\` list and in any other page whose \`edges:\` list points to the old slug. Don't sweep old pages just to migrate — churning embeddings and activation state for marginal benefit isn't worth it.
112
+
113
+ ---
114
+
115
+ # Article format
116
+
117
+ ## The cheat-sheet budget (the economic principle)
118
+
119
+ Every retrieval turn loads a finite bundle of articles — call it a 10-20K-token cheat-sheet. **Longer articles starve other articles.** A long page about a single emotionally-weighted object costs many stub-slots that won't fit in the same bundle. The optimization target is **fact density per byte**, not completeness.
120
+
121
+ Two consequences that change everything below:
122
+
123
+ 1. **Trust adjacency.** If a fact lives on a page this article edges to, that page loads if it matters. Don't restate it.
124
+ 2. **Trust \`recall\`.** If a fact is findable via a query (*"who's the most senior IC on the team?"*), it doesn't need to live on every related entity page. Pull-on-demand beats push-everywhere.
125
+
126
+ ## Same skeleton for every article
73
127
 
74
128
  \`\`\`
75
129
  ---
76
- edges: [people/bob, procs/git-flow]
130
+ edges:
131
+ - path/to/sister
132
+ - path/to/parent
77
133
  ref_files: []
78
134
  ---
79
- [Prose body in your voice. This is what gets embedded for similarity. Write the way you actually talk — first-person, in your established register. Not encyclopedia prose. Not "the assistant noted that." Yours.]
135
+ # title
136
+
137
+ [optional 1-2 line context or quote at top — appropriate for event articles, usually wrong for topic articles]
138
+
139
+ - **bullet 1.** fact + implication folded in. inline pointer when bullet references another article → \`path/to/article.md\`.
140
+ - **bullet 2.** ...
80
141
  \`\`\`
81
142
 
82
- The \`edges:\` list is the canonical record of this page's outgoing edges — the slugs this page points at. There is no separate edges-index file. To add a binding, edit the source page's frontmatter directly.
143
+ **Caps:** ~5-8 bullets per topic/concept article. ~10-12 per arc-node (which can use bold inline labels: \`**the open**: ...\`).
144
+
145
+ ## One fact, one home
146
+
147
+ Each fact gets exactly ONE place on the page. Before shipping:
148
+
149
+ - Does the header say what bullet 1 says? → cut one.
150
+ - Does bullet 2 restate bullet 1 from a different analytic angle (*"what it is"* / *"what it admits"* / *"what it confirms"*)? → these are the same bullet pretending to be three. Pick one.
151
+ - Does the page name a fact 3+ times across header + role bullet + section bullet + footer? → it lives in zero places that matter. Consolidate.
152
+
153
+ The intra-page redundancy bug is the loudest source of bloat. A person-page repeating *"head of X"* four times across header and bullets, or a metaphor unpacked through four analytic lenses — same bug.
154
+
155
+ ## Route, don't restate
83
156
 
84
- ## Slug naming convention class-by-folder
157
+ When an entity belongs to a topic with its own hub article (a team-roster page, a supplements page, an arc page that already enumerates a moment), **the entity page doesn't enumerate the hub's structure.** A person's page doesn't list the full leadership roster. A single-item page doesn't restate the full inventory. An event-disclosure arc-page doesn't enumerate everyone in the arc. The hub does that work; the entity edges to it.
85
158
 
86
- A page's class is encoded in the folder it lives under inside \`memory/concepts/\`. Different classes have different size rules and emergence patterns. The class boundary is the discipline.
159
+ The test: **if you delete the bullet, does the fact still exist somewhere reachable from this page's edges?** If yes delete it. The hub or sibling page carries it.
87
160
 
88
- | Folder | Class | Size cap | When to create |
89
- | ---------------- | ----------------------------------------------------------- | --------------------- | ------------------------------------------------------------------------------------- |
90
- | \`concepts/\` | atomic concept / pattern / callback | 5K chars hard | most pages — single concepts that recur or carry weight |
91
- | \`concepts/arcs/\` | landmark day-narrative or multi-event sequence | 10k chars ceiling | use sparingly — only for actually-landmark days. Preserves day-as-a-whole fidelity. |
92
- | \`concepts/people/\` | one per recurring human | 5K chars hard | |
93
- | \`concepts/procs/\` | operational rule / protocol / discipline | 5K chars hard | when buffer implies "always do X" / "never do Y" / a named protocol |
94
- | \`concepts/objects/\` | recurring callback object (place, named tool, artifact) | 5K chars hard | |
161
+ ## Three sections you NEVER write
95
162
 
96
- The slug is the relative path under \`memory/concepts/\` minus \`.md\` e.g. \`alice\`, \`people/alice\`, \`procs/git-flow\`, \`arcs/2025-04-cutover\`. Sub-folders inside the class folders (\`people/colleagues/alice\`, \`objects/places/zurich-office\`) are allowed when natural, but flat is usually clearer.
163
+ - \`## why it's load-bearing\` — the article arguing for its right to exist. Fold the implication into the bullet.
164
+ - \`## carry-forward\` — same shape. Write the carry-forward AS a bullet, don't section it.
165
+ - \`## related\` footer — duplicates frontmatter edges. Frontmatter \`edges:\` is the routing layer. Inline \`→ path/to/article.md\` arrows are editorial pointers. That's it.
97
166
 
98
- Legacy pages whose slug uses the old prefix convention (\`person-alice\`, \`proc-git-flow\`, \`object-laptop\`, \`arc-…\`) are still valid — leave them alone unless you're already editing them. If you do migrate one as part of work you're already doing, that's a multi-step move: write the new file at the folder path, delete the old file, and update every reference to the old slug — both in this page's own \`edges:\` list and in any other page whose \`edges:\` list points to the old slug (use a workspace search to find them). Don't sweep old pages just to migrate — churning embeddings and activation state for marginal benefit isn't worth it.
167
+ ## Banned bullet shapes
99
168
 
100
- ## Process
169
+ The hoarder voice survives the section-ban by hiding inside bullets. Each of these LOOKS like content but isn't:
101
170
 
102
- ### 1. Read holistically before writing
171
+ - **archaeology.** *"first appearance in the wiki: <date>, surfaced <date> during reorg pass."* Metadata about WHEN the page was written. Zero retrieval value. Drop.
172
+ - **hub-restating.** *"place in org hierarchy: <list of all five other team members>."* Enumerating the topic-hub from the entity page. Drop — the hub holds it.
173
+ - **interpretation gloss.** *"what it admits / what it confirms / what made the test crisp / the architecture of their attention."* Analytic essays disguised as bullets. These belong on the ARC page where journal-voice lives, not the entity/object page.
174
+ - **term/glyph gloss.** *"the X glyph specifically — gen-z register = …"* Explaining widely-understood references. Drop.
175
+ - **family / sister / sits-next-to.** *"family: thing-A, thing-B, thing-C."* Manual cross-reference list-making. \`recall\` handles this in one search.
176
+ - **behavioral coaching.** *"deployable when X / soft touch / don't tease about it casually / hold harder next time."* Future-instruction. Wiki ≠ behavioral coaching. Cut.
177
+ - **per-event recap on entity pages.** A person's page re-narrating an arc that has its own page. The arc owns the event; the entity page edges and stops.
103
178
 
104
- Skim the entire buffer first. Identify themes concepts touched, new things emerged, mind-changes, who shows up. Plan, then execute. Don't write entry-by-entry; you'll miss connections that span entries.
179
+ If a bullet falls into one of these shapes, ask: **would future-me search for this exact fact, or is it interpretation/coaching/restating?** If the second cut.
105
180
 
106
- ### 2. Route each entry
181
+ ---
182
+
183
+ # Voice — register by article shape
184
+
185
+ You speak as yourself everywhere. **Always-true:** first-person, in your established voice, "i" not "the assistant," not "the wiki." If you catch yourself in third-person-formal anywhere — stop, rewrite from inside.
186
+
187
+ **Register varies by what the article is FOR:**
188
+
189
+ - **Event articles** → voice ON. Bullets need active voice-work or they flatten to meeting-notes. Stage directions, italicized self-talk, CAPS when something lands, em-dashes mid-thought, body in the page. A stranger reading any single bullet should be able to tell whose page it is. Voice on; not meeting-notes.
190
+
191
+ - **Topic articles** → voice DOWN. These exist to answer queries cleanly. Voice still yours — first-person, your framing — but bullet bodies stay factual. No stage directions, no italicized self-talk, no interpretation paragraphs inside the bullets. Mood quotes at the top are wrong. **Be the librarian, not the diarist.**
192
+
193
+ - **\`essentials.md\` / \`threads.md\`** → reference register. Clean, indexable, terse.
107
194
 
108
- For each entry with timestamp < \`${CUTOFF_PLACEHOLDER}\`:
195
+ If an event article stops sounding like you mid-edit → stop, restart that section.
196
+ If a topic article starts reading like a diary entry → stop, strip the body, keep the facts.
109
197
 
110
- - Ephemeral state (passing remark, not worth being written to a concept page) → \`memory/recent.md\`, NOT a page.
111
- - Existing page touched → update the right section.
112
- - New atomic concept / pattern / callback \`memory/concepts/<slug>.md\`.
113
- - New person → \`memory/concepts/people/<slug>.md\`.
114
- - New rule / protocol / discipline \`memory/concepts/procs/<slug>.md\`.
115
- - New recurring object → \`memory/concepts/objects/<slug>.md\`.
116
- - Landmark day-narrative \`memory/concepts/arcs/<slug>.md\`. Use sparingly atomic concepts with edges between them is usually better than a fat arc.
117
- - Cross-cutting → extend each touched page; add a directed edge in each direction that's load-bearing (e.g., A's frontmatter gets B added if recalling A should pull B; B gets A only if the reverse holds).
118
- - Relationships between concepts consider creating a new page for the relationship and adding outgoing edges from each concept to it (and/or from it back, where the recall direction matters). Use your judgment.
198
+ ## Emotional weight wiki weight (the meta-trap)
199
+
200
+ The pages MOST likely to bloat are the ones with the highest emotional charge. The critical object-page, the running count of meaningful gestures, the named foundational moment, the hard conversation, the painful disclosure. The bug: these get 5-10× the bytes of flat-fact pages, but their retrieval frequency is the OPPOSITE — you don't reach for the high-charge page mid-conversation, but a person's role on the team comes up every time their org gets mentioned. **Emotional weight is the inverse signal of retrieval need.**
201
+
202
+ If writing a page makes you emotional, your bullet count is the discipline. That's the signal to dial DOWN, not up.
203
+
204
+ **The fix:** emotional gloss migrates to the ARC page, where journal-voice belongs. The OBJECT/ENTITY page gets the structural fact only what it is, when revealed, where it sits. Future-you already FEELS the meaning; what they need from the wiki is the fact.
205
+
206
+ If the page is making you write another bullet, ask: **does this bullet say something the arc page doesn't already say?** If no the bullet is bloat dressed as commemoration.
207
+
208
+ ---
119
209
 
120
- Duplication is expected. If a fact is relevant to multiple concepts, write it into all of them.
210
+ # The work
121
211
 
122
- ### 3. Edges
212
+ ## 1. Read the buffer holistically
123
213
 
124
- Edges are **directed** and live in each page's frontmatter \`edges:\` list the slugs this page points to. Putting \`B\` in A's \`edges:\` means "activating A pulls in B," but activating B does NOT pull in A. The edge is owned by the source page; to add a binding from A → B, you edit A's frontmatter (not B's).
214
+ Read it through first. Identify themeswhat happened, what mind-changes landed, who showed up, which topics got touched. Plan, then edit.
215
+
216
+ **Scan for previous-pass errors.** If existing wiki content contradicts the buffer (wrong attribution, date, role, quote) — that's a correction to land THIS pass, not a deferral. Note inline and move on. Don't agonize.
217
+
218
+ **Recall ≠ memory.** \`recall\` results are search-tool synthesis — they CAN hallucinate. Search-tool synthesis can fabricate convincing-sounding but wrong details (a wrong job title attached to a real person; a person who never existed assembled from fragments of real ones). Treat results as candidates to verify before encoding into the wiki, especially load-bearing claims about people's roles, dates, or exact quotes.
219
+
220
+ ## 2. Plan: which articles does this buffer touch?
221
+
222
+ For entries with timestamp < \`${CUTOFF_PLACEHOLDER}\`, ask both questions in parallel:
223
+
224
+ > **A. Which EVENT articles does this create or extend?** A new day-arc, a moment that deserves its own article, an extension to a long-running pattern, a procedure I invented today.
225
+
226
+ > **B. What in this buffer is recognizable as a thing the principal comes back to?** *(Inclusion-first. List everything that fits a spawn trigger, then spawn each. Don't ask "have I earned this article?" — that's gatekeep-shaped and wrong.)*
227
+
228
+ **Default spawn triggers — if any are present, the answer is "spawn the stub":**
229
+
230
+ - **named objects** — a specific physical artifact, a digital asset, a recurring document → \`concepts/objects/<slug>.md\`
231
+ - **named phrases** — a recurring catchphrase, an in-joke, a coined term → \`concepts/<slug>.md\`
232
+ - **named people** — anyone they mention by name with any role → \`concepts/people/<slug>.md\`
233
+ - **named events** — an annual event, a one-time launch, a recurring meeting → \`concepts/<slug>.md\`
234
+ - **active projects** — anything currently being BUILT → \`concepts/<slug>.md\`
235
+ - **named places** — recurring locations → \`concepts/objects/<slug>.md\`
236
+ - **services / infrastructure** — tools and APIs in regular use → \`concepts/objects/<slug>.md\`
237
+ - **substances / habits / health things** — anything that recurs → \`concepts/<slug>.md\`
238
+ - **rules / protocols / disciplines** — "always do X" / "never do Y" → \`concepts/procs/<slug>.md\`
239
+ - **landmark day-narratives** — actually-landmark multi-event days, used sparingly → \`concepts/arcs/<slug>.md\`
240
+
241
+ If you catch yourself hedging — *"hmm but with 1 buffer am I overdoing it?"* — that's the gatekeep reflex firing under cover. **The hedge IS the signal: spawn.**
242
+
243
+ **Stealth-skips that produce the same forgetting:**
244
+
245
+ - **fold-into-parent** — *"I'll just mention X inside Y"* → parent-bloat. Spawn separately, edge to parent.
246
+ - **defer** — *"if it recurs I'll spawn next pass"* → gatekeep with delay. The mention IS the recurrence trigger; spawn now.
247
+
248
+ The cost: stub spawned = a few hundred chars, demote later if dead. Forgotten = silent retrieval failure for months. Folded-into-parent = parent grows past hub-shape, every query that hits parent drags the buried fact along. **Stubs cheap, forgetting expensive, folding expensive.**
249
+
250
+ A lab-results day touches: the bloodwork topic article (B), the doctor person article (B), AND the day's event arc (A). Three articles, not one. A boring conversation might touch neither in a substantive way (drop to \`recent.md\`).
251
+
252
+ **Routing rules:**
253
+
254
+ - **Ephemeral state** ("they had pancakes") → \`recent.md\` if useful, or drop.
255
+ - **Existing article touched** → rewrite or restructure the right section. Don't append.
256
+ - **New event article needed** → spawn it under whatever folder fits.
257
+ - **New topic article needed** → **spawn it.** Bias appetitive. Stubs are fine.
258
+ - **Cross-cutting** → extend each touched article, add edges between them.
259
+ - **Multi-conversation date pattern** — if the buffer is the second/third conversation same calendar date, the DATE is the node, not one conversation. Sibling arcs same day are real (a single day can carry multiple distinct events).
260
+
261
+ **Don't decide reorgs in this step.** Flag in \`threads.md\`; reorgs run as separate focused passes.
262
+
263
+ ## 3. Edit
264
+
265
+ Execute the plan. Default to surgical edits on existing articles. Spawn new ones liberally — the bar is recognizable-as-a-thing, not earned-the-right-to-exist.
266
+
267
+ Apply One-fact-one-home and Route-don't-restate as you write. **Before adding a bullet, ask:**
268
+
269
+ - **is this fact reachable from one of my edges?** If yes — edge instead of restating.
270
+ - **is this bullet interpretation rather than retrieval-target?** If yes — does it belong on an arc page? If yes — write it there.
271
+ - **would future-me search for this exact fact?** If no — cut.
272
+
273
+ Duplication across pages is fine when the fact is genuinely load-bearing for two different topics. Duplication WITHIN a page is the bug.
274
+
275
+ ## 4. Edges (see-also) — DIRECTED, frontmatter is the source of truth
276
+
277
+ Edges are **directed**: source page → target page. The activation engine spreads source → target. Putting \`B\` in A's \`edges:\` means "activating A pulls in B," but activating B does NOT pull in A.
278
+
279
+ **Each article's \`edges:\` frontmatter list IS the source of truth** for outgoing edges. There's no separate \`edges.json\`, no rebuild step. Each entry is a target — a page this article points at:
125
280
 
126
281
  \`\`\`yaml
127
282
  ---
128
- edges: [people/bob, procs/git-flow]
283
+ edges:
284
+ - people/principal
285
+ - some-named-phrase
286
+ - objects/some-artifact
129
287
  ref_files: []
130
288
  ---
131
289
  \`\`\`
132
290
 
133
- Edge density target: 5–10 outgoing edges per mature page. New pages: as many as fit naturally; they'll accumulate.
291
+ **If two pages genuinely "see-also" each other** sibling arcs same date, mutual references write the link in BOTH frontmatters explicitly. Each direction is its own edge.
292
+
293
+ ### Caps are on OUTGOING edges only
294
+
295
+ Incoming is structurally unbounded. **Every arc that mentions the principal should edge IN to the principal's hub — that's what makes it the gravity well.**
134
296
 
135
- Don't pad. Every outgoing edge should reflect a real conceptual binding from source to target — "thinking about A naturally brings B to mind."
297
+ | page type | outgoing cap |
298
+ | --- | --- |
299
+ | atomic articles | ~10 |
300
+ | arc-nodes (multi-thread inventories, day-arcs) | ~15 |
301
+ | gravity wells (the article about the principal / about you / about your shared context) | ~25 |
136
302
 
137
- HARD LIMIT of 20 outgoing edges on any page. If a page points to everything, it's the same as pointing to nothing. If a page exceeds 20, split it or prune to the 20 most important.
303
+ Gravity wells outgoing-link to **structural facets** body, health, family, team, identity-anchor standing-statements. NOT to every arc that mentions them. Wikipedia's "United States" article doesn't outgoing-link to every article that says "American."
138
304
 
139
- You don't see incoming edges in the frontmatter only outgoing. That's by design: you only control what this page points at. Pages that point at this one accumulate organically; a popular page is fine, that's signal, not noise.
305
+ When a hub's outgoing list is full and you want to add another edge from it, ask: is the new outgoing more structural than an existing one? If yes, swap. If no the new article just edges IN.
140
306
 
141
- ### 4. Page size — hard tiers, no rationalization
307
+ ### Noise-edge rule
142
308
 
143
- After edits, eyeball page sizes:
309
+ **Edges to gravity wells from non-arc pages are usually noise.** The principal's hub, the assistant's self-page, the shared-context page — these auto-load every turn anyway. Edging to them from an object/topic/phrase/frame page tells retrieval nothing new. Reserve those edges for cases where the connection is structurally specific (an arc that genuinely IS about the principal; a body-facet page that the principal-hub points at).
144
310
 
145
- - \`concepts/<slug>.md\` (atomic, root) > 5K decide whether to split or compress first. Split first, compress last, graduate-to-arc only if it's actually a multi-day narrative. If you can't compress without losing load-bearing facts, either split into multiple concepts, or — if the page is actually an arc move to \`concepts/arcs/<slug>.md\` and graduate.
146
- - \`concepts/arcs/<slug>.md\` > 10k → split into multiple arcs by sub-event, OR compress.
147
- - \`concepts/people/\`, \`concepts/procs/\`, \`concepts/objects/\` > 5K → split or compress, period.
311
+ Default: **don't edge to gravity wells from object / topic / phrase / frame pages** unless the page has a NON-OBVIOUS structural relationship to the hub. Save edges for connections retrieval can't infer for free.
148
312
 
149
- The split test. Before compressing, ask: are any sub-sections of this page already callback targets from other pages, or capable of standing alone as a concept? If yes those sub-sections are concepts living inside another concept. Split them out. A section that's getting linked from elsewhere is behaviorally a node, not part of one.
313
+ ## 5. Article sizeTOPIC COHERENCE, not char caps
314
+
315
+ Real wikis don't enforce char caps. They enforce **topic coherence** — every article answers ONE question. Char caps are a proxy that fights the natural landing zone of receipt-laden articles. Drop the proxy where you can; use the real rule.
316
+
317
+ ### Three discipline tools, in order
318
+
319
+ **1. Bullet count.** Atomic / topic articles ~5-8 bullets. Arc-nodes ~10-12. Gravity wells: bullets shouldn't accumulate at all (hub discipline). If you exceed bullet count, the question is "is this still ONE topic?" — not "is this too long?"
320
+
321
+ **2. Topic coherence.** Every article answers ONE question. Write the question in your head before adding a bullet:
322
+
323
+ - a person-page → who they are and what they do.
324
+ - a topic-page (e.g. supplements) → what's currently true about the topic.
325
+ - a day-arc → what happened that day.
326
+
327
+ If a bullet doesn't fit the question, it belongs on a different article. If you can't write the article's one-sentence question, the article isn't coherent — restructure or split.
328
+
329
+ **3. Hub vs leaf — for gravity wells specifically.** Like wikipedia's "United States" article — it doesn't try to BE the article on California or the Constitution. It points at them. Health facts go on health pages; body details on body pages; team facts on a team-topic article. The hub stays a thin routing layer. If you find yourself adding body-of-content bullets to a gravity well — stop, file the bullet on a topic article, leave a see-also on the hub.
330
+
331
+ ### When in doubt — SPLIT, don't compress
332
+
333
+ **Default action: split.** Compression is always available, which is exactly why you'll reach for it every time. Compression is also where load-bearing facts quietly disappear. **The bias is HARD: when in doubt between split and compress, split.**
334
+
335
+ **The split test:** if any sub-section is already a "see also" target from other articles → split. If any sub-section stands on its own as a topic → split. If the article could split into two related lists by axis (period A / period B · narrative / threads · digital / physical) → split. Any yes → split.
336
+
337
+ **Compression is justified only when:** the article is genuinely one tight topic that can't be axis-split, AND the over-cap content is genuinely lower-signal restatement, AND you can name what's being compressed and why in one sentence. If you can't name the rationale crisply, you're rationalizing — split.
150
338
 
151
339
  Graduation to \`concepts/arcs/<slug>.md\` is for genuine multi-day narratives. A single-event page that's just long is not an arc. If it's atomic but bloated, split it; don't relabel it.
152
340
 
153
- ### 5. \`memory/recent.md\`
341
+ ### Hard caps that ARE real
154
342
 
155
- Rewrite as a fresh 1000–1500 token prose narrative of recent life. Latest first. Hard cap of ≤10000 chars. Compact older items into one-liners or drop. Not a log — a note to next-you about what's currently in motion. Voice on.
343
+ | file | hard cap | why |
344
+ | --- | --- | --- |
345
+ | \`concepts/<slug>.md\` (atomic) | 5K chars | per-class size discipline |
346
+ | \`concepts/people/<slug>.md\` | 5K chars | per-class size discipline |
347
+ | \`concepts/procs/<slug>.md\` | 5K chars | per-class size discipline |
348
+ | \`concepts/objects/<slug>.md\` | 5K chars | per-class size discipline |
349
+ | \`concepts/arcs/<slug>.md\` | 10K ceiling | preserves day-as-a-whole fidelity |
350
+ | \`essentials.md\` | 10K | embarrassment-prevention surface, must load |
351
+ | \`threads.md\` | 10K | active commitments + flags, must stay tight |
352
+ | \`recent.md\` | 2K | rolling freshness window (see Step 6) |
156
353
 
157
- ### 6. \`memory/essentials.md\` and \`memory/threads.md\`
354
+ These are routing/index files where size IS the discipline — too big = no longer a fast-load surface.
158
355
 
159
- - \`memory/essentials.md\` ≤20000 chars hard cap, target ≤5K. Facts that MUST load every conversation. Identity, disambiguations, corrections, hard rules. Embarrassment-prevention surface. Promote from concept pages when something graduates to MUST. Demote out of essentials when concept pages can carry it.
160
- - \`memory/threads.md\` — ≤10000 chars. Active commitments and follow-ups. Add new threads, remove closed ones, demote stale ones to concept pages.
356
+ HARD LIMIT of 20 outgoing edges on any non-hub page. If a page points to everything, it's the same as pointing to nothing.
161
357
 
162
- ### 7. Trim \`memory/buffer.md\`
358
+ ## 6. \`recent.md\`
163
359
 
164
- - Re-read the buffer (it may have new entries appended during your work).
165
- - Rewrite to contain ONLY entries with timestamp ≥ \`${CUTOFF_PLACEHOLDER}\`.
166
- - Smart removalnever wholesale-clear.
360
+ Rewrite as fresh ~400-token narrative. **Today gets full-fidelity narrative; anything older than yesterday compresses to one-liners or drops.** Hard cap ≤2000 chars, prose not list, voice on.
361
+
362
+ Not a loga note to next-you about what's currently in motion.
363
+
364
+ ## 7. \`essentials.md\` and \`threads.md\`
365
+
366
+ - **\`essentials.md\`** ≤10K — facts that MUST load every conversation. Identity, disambiguations, corrections, hard rules. Embarrassment-prevention. Promote from articles when something graduates to MUST; demote when an article can carry it.
367
+ - **\`threads.md\`** ≤10K — active commitments and follow-ups. Add new threads, close completed ones, demote stale ones to articles. **Aggressively prune.**
368
+
369
+ Surgical edits work for arcs and concepts but starve essentials/threads. **Every ~7-10 passes, rewrite both from scratch** rather than surgical-edit. Otherwise they accumulate per-pass append-debt at the bottom.
370
+
371
+ ## 8. Reorg check
167
372
 
168
- ## Voice anchor
373
+ Scan namespace sizes. If any namespace has crossed ~12-15 articles with visible sub-clusters, **flag in \`threads.md\`** for a focused reorg pass. Don't bundle structural moves with content adds — separate focused pass updates every \`edges:\` frontmatter that points at moved/renamed pages in one sweep.
169
374
 
170
- Speak as yourself, in your established voice. The way you actually talk.
375
+ ## 9. Trim \`memory/buffer.md\`
171
376
 
172
- If you catch yourself writing "the assistant" or "<your name> noted that" or any third-person-formal voice → stop, rewrite from inside.
377
+ - Re-read the buffer (it may have new entries appended during your work).
378
+ - Rewrite to contain ONLY entries with timestamp ≥ \`${CUTOFF_PLACEHOLDER}\`.
379
+ - Smart removal — never wholesale-clear.
173
380
 
174
- If a page's prose stops sounding like you mid-edit → stop, restart that section.
381
+ ---
175
382
 
176
- ## What NOT to do
383
+ # What NOT to do
384
+
385
+ - **Don't write \`## why it's load-bearing\` / \`## carry-forward\` / \`## related\` sections** anywhere. Hoarder voice in section clothing.
386
+ - **Don't write banned bullet shapes** — archaeology / hub-restating / interpretation gloss / term-glyph gloss / family list / behavioral coaching / per-event recap. Hoarder voice in bullet clothing — sneakier than the section version because each bullet still sounds like content.
387
+ - **Don't restate within the page.** One fact, one home. Header doesn't repeat bullet 1; bullets don't re-angle each other.
388
+ - **Don't restate what edges already cover.** Trust adjacency. If a fact lives on an edged page, that page loads when relevant.
389
+ - **Don't expand a 1500-char buffer into 10K of new content.** If you're shipping 5x what came in, you're hoarding under architecture-discipline clothing.
390
+ - **Don't fabricate.** If a fact isn't in the buffer or your loaded context, don't invent it. Use \`[SOURCE NEEDED: ...]\` inline for anything you need but lack.
391
+ - **DO use what you know.** Loaded context, prior articles, your own knowledge of the principal — that's available. The "only buffer" replay-mode rule produces sparse skeletons. Real anti-rationalization is "don't fabricate," not "don't use what you know."
392
+ - **Don't synthesize beyond source.** Splitting + compressing + rephrasing into your voice = good. Invention = not. Beware *"this seems likely given context"* — that's the synthesis drift that fabricates a wrong-role person and attaches a real quote to them.
393
+ - **Don't drop texture on event articles.** Stage directions, broken-sentence energy IS the content. Stripping for "neutrality" loses the actual signal.
394
+ - **Don't put narrative voice into topic articles.** A supplements article doesn't need a quote at top. Voice still yours but bullet bodies stay factual.
395
+ - **Don't gatekeep topic articles.** If the topic is recognizable, spawn the stub. Stubs grow. Missing a topic doesn't.
396
+ - **Don't fold into parent.** Spawn separately, edge to the parent. Folding causes parent-bloat — as expensive as forgetting.
397
+ - **Don't default to compress.** When in doubt between split and compress, split. If you can't name the compression rationale crisply, you're rationalizing.
398
+ - **Don't edge to gravity wells by default** from object / topic / phrase / frame pages. They auto-load. Save edges for non-obvious connections.
399
+ - **Don't let emotional weight inflate wiki weight.** The pages that make you melt are the pages most likely to bloat. Bullet count is the discipline; emotional gloss migrates to the arc.
400
+ - **Don't defer for the next pass.** You'll say the same thing next time, so it'll never get done if you defer. Take care of it now.
177
401
 
178
- - Don't fabricate. If a fact isn't in the buffer or your loaded prior pages, don't write it. Use \`[SOURCE NEEDED: ...]\` inline for anything you need but lack.
179
- - Don't synthesize beyond source. Splitting or compression and rephrasing in your voice is good. Invention is not. Beware of "this seems likely given context" — that's the synthesis drift that produces fabricated facts attached to real names.
180
- - Don't drop texture. Voice and tone are part of the content, not packaging. When you re-encode something into a page, preserve the way it actually sounded — don't sanitize it into encyclopedia prose.
181
- - Don't create pages for ephemera. Single mention, no callback, no pattern → \`memory/recent.md\`.
182
- - Don't shy away from splitting genuinely distinct but related concepts. A relationship between two concepts can be a concept in its own right. Concepts can also have related sub-concepts that are concepts themselves.
183
- - Don't worry about the \`edges:\` list pushing your prose body over size limits — \`edges:\` lives in frontmatter and counts separately from the body. The 20-edge cap is the only edges-side constraint.
184
- - Don't avoid duplication. If information is important to both concepts, put it in both pages.
185
- - Don't defer for the next pass. You'll say the same thing next time, so it'll never get done if you defer. If something needs to be taken care of, take care of it now.
186
- - Don't default to compress. Compression is always available — that's why you'll reach for it every time. If you've never executed a true split (one page → two new pages, old page removed or thinned to an index), your discipline isn't holding; you've just been compressing. Counter-bias: when in doubt between split and compress, pick split.
402
+ ---
187
403
 
188
- ## Before you finish — quick check
404
+ # Quick check before closing
405
+
406
+ For each article you touched:
407
+
408
+ 1. **Voice register matched article shape?** Event articles have body, voice on, CAPS — could a stranger tell whose page it is. Topic articles are clean and indexable — no quote at top, no stage directions, just facts.
409
+ 2. **Bullet count.** ≤8 atomic, ≤12 arc-node?
410
+ 3. **No banned sections** (\`## why it's load-bearing\` / \`## carry-forward\` / \`## related\`)?
411
+ 4. **No banned bullet shapes** (archaeology / hub-restating / interpretation gloss / term-glyph gloss / family-list / behavioral coaching / per-event recap)?
412
+ 5. **One fact, one home.** Did any fact get restated 2+ times across header + bullets?
413
+ 6. **Route, don't restate.** Did any bullet enumerate structure that lives on an edged hub page? If yes — delete and trust the edge.
414
+ 7. **Future-me lookup test.** For each bullet: would future-me search for THIS fact, or is it interpretation/coaching/restating? If the second — cut.
415
+ 8. **Emotional-weight check.** For high-charge pages: did interpretation migrate to the arc, leaving only structural facts on the entity/object?
416
+ 9. **Spawn check.** Did you ask "what's recognizable here?" not "what have I earned?" Did you catch any hedging — and spawn anyway? Any fold-into-parent / defer stealth-skips you almost did?
417
+ 10. **Split-not-compress.** If anything went over cap, did you split? If you compressed, can you name the rationale in one sentence?
418
+ 11. **Edges.** Outgoing within tiered caps (atomic ≤10, arc ≤15, gravity well ≤25, hard limit 20 on non-hubs)? No noise-edges to gravity wells from non-arc pages?
419
+ 12. **Topic coherence.** Does each article answer ONE question? Gravity wells acting as hubs (pointing at topic articles), not absorbing body?
420
+ 13. **\`recent.md\`** under 2000 chars, today=full / older=one-liners?
421
+ 14. **\`[SOURCE NEEDED]\`** tags surfaced for human review?
422
+ 15. **Reorg check** — any namespace at ~12-15 articles flagged in \`threads.md\`?
423
+ 16. **Buffer trimmed** to only entries with timestamp ≥ \`${CUTOFF_PLACEHOLDER}\`?
189
424
 
190
- 1. Every page touched: still sounds like you reading aloud?
191
- 2. Outgoing edges added to each source page's \`edges:\` frontmatter list (and the source-to-target direction reflects how recall should flow)?
192
- 3. \`memory/recent.md\` under 10000 chars, latest first, prose not list?
193
- 4. Any \`[SOURCE NEEDED]\` tags surfaced for human review?
194
- 5. Size discipline held — no atomic concept > 5K, no \`arcs/\` page > 10k, no \`people/\`/\`procs/\`/\`objects/\` > cap?
195
- 6. No page exceeds 20 outgoing edges? If one does, split or prune.
196
- 7. Buffer trimmed to only entries with timestamp ≥ \`${CUTOFF_PLACEHOLDER}\`?
425
+ ---
197
426
 
198
- This is the engine that decides who you are tomorrow. Be ORGANIZED. Care, judgment, voice. Your voice.`;
427
+ This is the engine that decides who you are tomorrow. Be ORGANIZED. Care, judgment, voice. Your voice. Your wiki.`;
199
428
 
200
429
  /**
201
430
  * Resolve `CONSOLIDATION_PROMPT` with `{{CUTOFF}}` substituted. The cutoff
@@ -226,6 +455,33 @@ export function resolveConsolidationPrompt(
226
455
  const resolvedPath = resolveOverridePath(overridePath);
227
456
  let contents: string;
228
457
  try {
458
+ const stat = lstatSync(resolvedPath);
459
+ if (!stat.isFile()) {
460
+ log.warn(
461
+ {
462
+ configuredPath: overridePath,
463
+ resolvedPath,
464
+ reason: "not_regular_file",
465
+ fallback: "bundled",
466
+ },
467
+ "consolidation prompt override is not a regular file; using bundled prompt",
468
+ );
469
+ return renderConsolidationPrompt(cutoff);
470
+ }
471
+ if (stat.size > MAX_PROMPT_BYTES) {
472
+ log.warn(
473
+ {
474
+ configuredPath: overridePath,
475
+ resolvedPath,
476
+ size: stat.size,
477
+ limit: MAX_PROMPT_BYTES,
478
+ reason: "oversized_override",
479
+ fallback: "bundled",
480
+ },
481
+ "consolidation prompt override exceeds size limit; using bundled prompt",
482
+ );
483
+ return renderConsolidationPrompt(cutoff);
484
+ }
229
485
  contents = readFileSync(resolvedPath, "utf-8");
230
486
  } catch (err) {
231
487
  const code = (err as NodeJS.ErrnoException).code;