@vellumai/assistant 0.10.0 → 0.10.1-dev.202606240206.7c2bca6

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 (959) hide show
  1. package/ARCHITECTURE.md +36 -37
  2. package/bun.lock +3 -0
  3. package/docs/workflows.md +12 -7
  4. package/eslint-rules/cli-no-daemon-internals.js +12 -0
  5. package/node_modules/@slack/types/LICENSE +23 -0
  6. package/node_modules/@slack/types/README.md +32 -0
  7. package/node_modules/@slack/types/dist/block-kit/block-elements.d.ts +953 -0
  8. package/node_modules/@slack/types/dist/block-kit/block-elements.d.ts.map +1 -0
  9. package/node_modules/@slack/types/dist/block-kit/block-elements.js +4 -0
  10. package/node_modules/@slack/types/dist/block-kit/block-elements.js.map +1 -0
  11. package/node_modules/@slack/types/dist/block-kit/blocks.d.ts +474 -0
  12. package/node_modules/@slack/types/dist/block-kit/blocks.d.ts.map +1 -0
  13. package/node_modules/@slack/types/dist/block-kit/blocks.js +3 -0
  14. package/node_modules/@slack/types/dist/block-kit/blocks.js.map +1 -0
  15. package/node_modules/@slack/types/dist/block-kit/composition-objects.d.ts +237 -0
  16. package/node_modules/@slack/types/dist/block-kit/composition-objects.d.ts.map +1 -0
  17. package/node_modules/@slack/types/dist/block-kit/composition-objects.js +4 -0
  18. package/node_modules/@slack/types/dist/block-kit/composition-objects.js.map +1 -0
  19. package/node_modules/@slack/types/dist/block-kit/extensions.d.ts +88 -0
  20. package/node_modules/@slack/types/dist/block-kit/extensions.d.ts.map +1 -0
  21. package/node_modules/@slack/types/dist/block-kit/extensions.js +3 -0
  22. package/node_modules/@slack/types/dist/block-kit/extensions.js.map +1 -0
  23. package/node_modules/@slack/types/dist/calls.d.ts +26 -0
  24. package/node_modules/@slack/types/dist/calls.d.ts.map +1 -0
  25. package/node_modules/@slack/types/dist/calls.js +6 -0
  26. package/node_modules/@slack/types/dist/calls.js.map +1 -0
  27. package/node_modules/@slack/types/dist/chunk.d.ts +52 -0
  28. package/node_modules/@slack/types/dist/chunk.d.ts.map +1 -0
  29. package/node_modules/@slack/types/dist/chunk.js +3 -0
  30. package/node_modules/@slack/types/dist/chunk.js.map +1 -0
  31. package/node_modules/@slack/types/dist/common/bot-profile.d.ts +12 -0
  32. package/node_modules/@slack/types/dist/common/bot-profile.d.ts.map +1 -0
  33. package/node_modules/@slack/types/dist/common/bot-profile.js +3 -0
  34. package/node_modules/@slack/types/dist/common/bot-profile.js.map +1 -0
  35. package/node_modules/@slack/types/dist/common/status-emoji-display-info.d.ts +6 -0
  36. package/node_modules/@slack/types/dist/common/status-emoji-display-info.d.ts.map +1 -0
  37. package/node_modules/@slack/types/dist/common/status-emoji-display-info.js +3 -0
  38. package/node_modules/@slack/types/dist/common/status-emoji-display-info.js.map +1 -0
  39. package/node_modules/@slack/types/dist/dialog.d.ts +36 -0
  40. package/node_modules/@slack/types/dist/dialog.d.ts.map +1 -0
  41. package/node_modules/@slack/types/dist/dialog.js +3 -0
  42. package/node_modules/@slack/types/dist/dialog.js.map +1 -0
  43. package/node_modules/@slack/types/dist/events/app.d.ts +204 -0
  44. package/node_modules/@slack/types/dist/events/app.d.ts.map +1 -0
  45. package/node_modules/@slack/types/dist/events/app.js +3 -0
  46. package/node_modules/@slack/types/dist/events/app.js.map +1 -0
  47. package/node_modules/@slack/types/dist/events/assistant.d.ts +29 -0
  48. package/node_modules/@slack/types/dist/events/assistant.d.ts.map +1 -0
  49. package/node_modules/@slack/types/dist/events/assistant.js +3 -0
  50. package/node_modules/@slack/types/dist/events/assistant.js.map +1 -0
  51. package/node_modules/@slack/types/dist/events/call.d.ts +8 -0
  52. package/node_modules/@slack/types/dist/events/call.d.ts.map +1 -0
  53. package/node_modules/@slack/types/dist/events/call.js +3 -0
  54. package/node_modules/@slack/types/dist/events/call.js.map +1 -0
  55. package/node_modules/@slack/types/dist/events/channel.d.ts +85 -0
  56. package/node_modules/@slack/types/dist/events/channel.d.ts.map +1 -0
  57. package/node_modules/@slack/types/dist/events/channel.js +3 -0
  58. package/node_modules/@slack/types/dist/events/channel.js.map +1 -0
  59. package/node_modules/@slack/types/dist/events/dnd.d.ts +24 -0
  60. package/node_modules/@slack/types/dist/events/dnd.d.ts.map +1 -0
  61. package/node_modules/@slack/types/dist/events/dnd.js +3 -0
  62. package/node_modules/@slack/types/dist/events/dnd.js.map +1 -0
  63. package/node_modules/@slack/types/dist/events/email.d.ts +6 -0
  64. package/node_modules/@slack/types/dist/events/email.d.ts.map +1 -0
  65. package/node_modules/@slack/types/dist/events/email.js +3 -0
  66. package/node_modules/@slack/types/dist/events/email.js.map +1 -0
  67. package/node_modules/@slack/types/dist/events/emoji.d.ts +11 -0
  68. package/node_modules/@slack/types/dist/events/emoji.d.ts.map +1 -0
  69. package/node_modules/@slack/types/dist/events/emoji.js +3 -0
  70. package/node_modules/@slack/types/dist/events/emoji.js.map +1 -0
  71. package/node_modules/@slack/types/dist/events/entity-details-requested.d.ts +21 -0
  72. package/node_modules/@slack/types/dist/events/entity-details-requested.d.ts.map +1 -0
  73. package/node_modules/@slack/types/dist/events/entity-details-requested.js +3 -0
  74. package/node_modules/@slack/types/dist/events/entity-details-requested.js.map +1 -0
  75. package/node_modules/@slack/types/dist/events/file.d.ts +60 -0
  76. package/node_modules/@slack/types/dist/events/file.d.ts.map +1 -0
  77. package/node_modules/@slack/types/dist/events/file.js +4 -0
  78. package/node_modules/@slack/types/dist/events/file.js.map +1 -0
  79. package/node_modules/@slack/types/dist/events/function.d.ts +33 -0
  80. package/node_modules/@slack/types/dist/events/function.d.ts.map +1 -0
  81. package/node_modules/@slack/types/dist/events/function.js +3 -0
  82. package/node_modules/@slack/types/dist/events/function.js.map +1 -0
  83. package/node_modules/@slack/types/dist/events/grid-migration.d.ts +9 -0
  84. package/node_modules/@slack/types/dist/events/grid-migration.d.ts.map +1 -0
  85. package/node_modules/@slack/types/dist/events/grid-migration.js +3 -0
  86. package/node_modules/@slack/types/dist/events/grid-migration.js.map +1 -0
  87. package/node_modules/@slack/types/dist/events/group.d.ts +55 -0
  88. package/node_modules/@slack/types/dist/events/group.d.ts.map +1 -0
  89. package/node_modules/@slack/types/dist/events/group.js +3 -0
  90. package/node_modules/@slack/types/dist/events/group.js.map +1 -0
  91. package/node_modules/@slack/types/dist/events/im.d.ts +26 -0
  92. package/node_modules/@slack/types/dist/events/im.d.ts.map +1 -0
  93. package/node_modules/@slack/types/dist/events/im.js +3 -0
  94. package/node_modules/@slack/types/dist/events/im.js.map +1 -0
  95. package/node_modules/@slack/types/dist/events/index.d.ts +60 -0
  96. package/node_modules/@slack/types/dist/events/index.d.ts.map +1 -0
  97. package/node_modules/@slack/types/dist/events/index.js +43 -0
  98. package/node_modules/@slack/types/dist/events/index.js.map +1 -0
  99. package/node_modules/@slack/types/dist/events/invite.d.ts +20 -0
  100. package/node_modules/@slack/types/dist/events/invite.d.ts.map +1 -0
  101. package/node_modules/@slack/types/dist/events/invite.js +3 -0
  102. package/node_modules/@slack/types/dist/events/invite.js.map +1 -0
  103. package/node_modules/@slack/types/dist/events/link-shared.d.ts +16 -0
  104. package/node_modules/@slack/types/dist/events/link-shared.d.ts.map +1 -0
  105. package/node_modules/@slack/types/dist/events/link-shared.js +3 -0
  106. package/node_modules/@slack/types/dist/events/link-shared.js.map +1 -0
  107. package/node_modules/@slack/types/dist/events/member.d.ts +19 -0
  108. package/node_modules/@slack/types/dist/events/member.d.ts.map +1 -0
  109. package/node_modules/@slack/types/dist/events/member.js +3 -0
  110. package/node_modules/@slack/types/dist/events/member.js.map +1 -0
  111. package/node_modules/@slack/types/dist/events/message-metadata.d.ts +38 -0
  112. package/node_modules/@slack/types/dist/events/message-metadata.d.ts.map +1 -0
  113. package/node_modules/@slack/types/dist/events/message-metadata.js +3 -0
  114. package/node_modules/@slack/types/dist/events/message-metadata.js.map +1 -0
  115. package/node_modules/@slack/types/dist/events/message.d.ts +306 -0
  116. package/node_modules/@slack/types/dist/events/message.d.ts.map +1 -0
  117. package/node_modules/@slack/types/dist/events/message.js +3 -0
  118. package/node_modules/@slack/types/dist/events/message.js.map +1 -0
  119. package/node_modules/@slack/types/dist/events/pin.d.ts +60 -0
  120. package/node_modules/@slack/types/dist/events/pin.d.ts.map +1 -0
  121. package/node_modules/@slack/types/dist/events/pin.js +3 -0
  122. package/node_modules/@slack/types/dist/events/pin.js.map +1 -0
  123. package/node_modules/@slack/types/dist/events/reaction.d.ts +23 -0
  124. package/node_modules/@slack/types/dist/events/reaction.d.ts.map +1 -0
  125. package/node_modules/@slack/types/dist/events/reaction.js +3 -0
  126. package/node_modules/@slack/types/dist/events/reaction.js.map +1 -0
  127. package/node_modules/@slack/types/dist/events/shared-channel.d.ts +134 -0
  128. package/node_modules/@slack/types/dist/events/shared-channel.d.ts.map +1 -0
  129. package/node_modules/@slack/types/dist/events/shared-channel.js +3 -0
  130. package/node_modules/@slack/types/dist/events/shared-channel.js.map +1 -0
  131. package/node_modules/@slack/types/dist/events/star.d.ts +13 -0
  132. package/node_modules/@slack/types/dist/events/star.d.ts.map +1 -0
  133. package/node_modules/@slack/types/dist/events/star.js +3 -0
  134. package/node_modules/@slack/types/dist/events/star.js.map +1 -0
  135. package/node_modules/@slack/types/dist/events/steps-from-apps.d.ts +82 -0
  136. package/node_modules/@slack/types/dist/events/steps-from-apps.d.ts.map +1 -0
  137. package/node_modules/@slack/types/dist/events/steps-from-apps.js +3 -0
  138. package/node_modules/@slack/types/dist/events/steps-from-apps.js.map +1 -0
  139. package/node_modules/@slack/types/dist/events/subteam.d.ts +66 -0
  140. package/node_modules/@slack/types/dist/events/subteam.d.ts.map +1 -0
  141. package/node_modules/@slack/types/dist/events/subteam.js +3 -0
  142. package/node_modules/@slack/types/dist/events/subteam.js.map +1 -0
  143. package/node_modules/@slack/types/dist/events/team.d.ts +99 -0
  144. package/node_modules/@slack/types/dist/events/team.d.ts.map +1 -0
  145. package/node_modules/@slack/types/dist/events/team.js +3 -0
  146. package/node_modules/@slack/types/dist/events/team.js.map +1 -0
  147. package/node_modules/@slack/types/dist/events/token.d.ts +8 -0
  148. package/node_modules/@slack/types/dist/events/token.d.ts.map +1 -0
  149. package/node_modules/@slack/types/dist/events/token.js +3 -0
  150. package/node_modules/@slack/types/dist/events/token.js.map +1 -0
  151. package/node_modules/@slack/types/dist/events/user.d.ts +313 -0
  152. package/node_modules/@slack/types/dist/events/user.d.ts.map +1 -0
  153. package/node_modules/@slack/types/dist/events/user.js +3 -0
  154. package/node_modules/@slack/types/dist/events/user.js.map +1 -0
  155. package/node_modules/@slack/types/dist/index.d.ts +12 -0
  156. package/node_modules/@slack/types/dist/index.d.ts.map +1 -0
  157. package/node_modules/@slack/types/dist/index.js +28 -0
  158. package/node_modules/@slack/types/dist/index.js.map +1 -0
  159. package/node_modules/@slack/types/dist/message-attachments.d.ts +171 -0
  160. package/node_modules/@slack/types/dist/message-attachments.d.ts.map +1 -0
  161. package/node_modules/@slack/types/dist/message-attachments.js +3 -0
  162. package/node_modules/@slack/types/dist/message-attachments.js.map +1 -0
  163. package/node_modules/@slack/types/dist/message-metadata.d.ts +281 -0
  164. package/node_modules/@slack/types/dist/message-metadata.d.ts.map +1 -0
  165. package/node_modules/@slack/types/dist/message-metadata.js +27 -0
  166. package/node_modules/@slack/types/dist/message-metadata.js.map +1 -0
  167. package/node_modules/@slack/types/dist/views.d.ts +71 -0
  168. package/node_modules/@slack/types/dist/views.d.ts.map +1 -0
  169. package/node_modules/@slack/types/dist/views.js +3 -0
  170. package/node_modules/@slack/types/dist/views.js.map +1 -0
  171. package/node_modules/@slack/types/package.json +47 -0
  172. package/node_modules/@vellumai/gateway-client/bun.lock +3 -0
  173. package/node_modules/@vellumai/gateway-client/package.json +1 -0
  174. package/node_modules/@vellumai/gateway-client/src/__tests__/contact-read-contracts.test.ts +69 -0
  175. package/node_modules/@vellumai/gateway-client/src/__tests__/guardian-delivery-contract.test.ts +91 -0
  176. package/node_modules/@vellumai/gateway-client/src/__tests__/trust-verdict-contract.test.ts +96 -0
  177. package/node_modules/@vellumai/gateway-client/src/gateway-ipc-contracts.ts +162 -0
  178. package/node_modules/@vellumai/gateway-client/src/guardian-delivery-contract.ts +48 -0
  179. package/node_modules/@vellumai/gateway-client/src/inbound-contract.ts +8 -0
  180. package/node_modules/@vellumai/gateway-client/src/index.ts +28 -0
  181. package/node_modules/@vellumai/gateway-client/src/ipc-client.ts +4 -2
  182. package/node_modules/@vellumai/gateway-client/src/outbound-contract.ts +3 -2
  183. package/node_modules/@vellumai/gateway-client/src/trust-verdict-contract.ts +95 -0
  184. package/openapi.yaml +458 -18
  185. package/package.json +2 -1
  186. package/scripts/memory-inspect.ts +24 -14
  187. package/scripts/test.sh +36 -15
  188. package/src/__tests__/access-request-seed-content-blocks.test.ts +83 -103
  189. package/src/__tests__/activation-early-marking.test.ts +1 -1
  190. package/src/__tests__/actor-token-service.test.ts +39 -17
  191. package/src/__tests__/agent-loop-callsite-precedence.test.ts +1 -40
  192. package/src/__tests__/agent-loop-compaction-events.test.ts +0 -1
  193. package/src/__tests__/agent-loop-compaction-strip.test.ts +0 -1
  194. package/src/__tests__/agent-loop-exit-reason.test.ts +0 -1
  195. package/src/__tests__/agent-loop-pushes-post-hook-prompt.test.ts +306 -0
  196. package/src/__tests__/agent-loop-regrowth-guard.test.ts +0 -1
  197. package/src/__tests__/agent-loop.test.ts +3 -0
  198. package/src/__tests__/agent-wake-override-profile.test.ts +2 -0
  199. package/src/__tests__/anthropic-provider.test.ts +210 -9
  200. package/src/__tests__/app-builder-skill-instructions.test.ts +47 -5
  201. package/src/__tests__/app-conversation-ids-backfill.test.ts +1 -1
  202. package/src/__tests__/app-source-watcher.test.ts +30 -10
  203. package/src/__tests__/approval-cascade.test.ts +6 -0
  204. package/src/__tests__/approval-interception-trust-gates.test.ts +151 -0
  205. package/src/__tests__/approval-primitive.test.ts +1 -1
  206. package/src/__tests__/approval-routes-http.test.ts +1 -1
  207. package/src/__tests__/assistant-attachments.test.ts +155 -0
  208. package/src/__tests__/assistant-event-hub-machine-name.test.ts +2 -4
  209. package/src/__tests__/assistant-events-sse-hardening.test.ts +1 -1
  210. package/src/__tests__/assistant-events-sse-shed.test.ts +1 -1
  211. package/src/__tests__/attachment-upload-trusted-source.test.ts +13 -8
  212. package/src/__tests__/attachments-store.test.ts +1 -1
  213. package/src/__tests__/audit-log-rotation.test.ts +50 -54
  214. package/src/__tests__/auth-fallback-events-store.test.ts +1 -1
  215. package/src/__tests__/auto-analysis-end-to-end.test.ts +9 -14
  216. package/src/__tests__/background-shell-bash.test.ts +4 -1
  217. package/src/__tests__/background-shell-host-bash.test.ts +17 -3
  218. package/src/__tests__/background-workers-disk-pressure.test.ts +1 -0
  219. package/src/__tests__/call-controller.test.ts +20 -1
  220. package/src/__tests__/call-conversation-messages.test.ts +1 -1
  221. package/src/__tests__/call-domain.test.ts +1 -1
  222. package/src/__tests__/call-pointer-messages.test.ts +3 -4
  223. package/src/__tests__/call-recovery.test.ts +1 -1
  224. package/src/__tests__/call-routes-http.test.ts +1 -1
  225. package/src/__tests__/call-store.test.ts +1 -1
  226. package/src/__tests__/cancel-resolves-conversation-key.test.ts +1 -1
  227. package/src/__tests__/canonical-guardian-store.test.ts +24 -1
  228. package/src/__tests__/card-surface-data.test.ts +60 -0
  229. package/src/__tests__/channel-approval-routes.test.ts +73 -1119
  230. package/src/__tests__/channel-delivery-store.test.ts +1 -1
  231. package/src/__tests__/channel-guardian.test.ts +291 -641
  232. package/src/__tests__/channel-inbound-disk-pressure.test.ts +1 -2
  233. package/src/__tests__/channel-retry-sweep.test.ts +1 -1
  234. package/src/__tests__/compaction-events.test.ts +6 -0
  235. package/src/__tests__/compaction-trail-store.test.ts +6 -5
  236. package/src/__tests__/compaction.benchmark.test.ts +0 -1
  237. package/src/__tests__/compactor-image-manifest-trust.test.ts +1 -1
  238. package/src/__tests__/config-loader-backfill.test.ts +188 -52
  239. package/src/__tests__/config-schema.test.ts +35 -0
  240. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +1 -2
  241. package/src/__tests__/contact-store-user-file.test.ts +2 -2
  242. package/src/__tests__/contacts-relay-reads.test.ts +409 -0
  243. package/src/__tests__/contacts-tools.test.ts +4 -4
  244. package/src/__tests__/contacts-write.test.ts +1 -2
  245. package/src/__tests__/context-search-conversations-source.test.ts +1 -1
  246. package/src/__tests__/context-window-manager-compact-retry.test.ts +6 -2
  247. package/src/__tests__/context-window-manager-overflow-rung.test.ts +6 -2
  248. package/src/__tests__/conversation-abort-tool-results.test.ts +6 -0
  249. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +3 -0
  250. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +3 -0
  251. package/src/__tests__/conversation-agent-loop-overflow.test.ts +3 -0
  252. package/src/__tests__/conversation-agent-loop.test.ts +7 -0
  253. package/src/__tests__/conversation-attachments.test.ts +2 -5
  254. package/src/__tests__/conversation-attention-store.test.ts +1 -1
  255. package/src/__tests__/conversation-attention-telegram.test.ts +1 -2
  256. package/src/__tests__/conversation-clear-safety.test.ts +1 -1
  257. package/src/__tests__/conversation-confirmation-signals.test.ts +6 -0
  258. package/src/__tests__/conversation-crud-inference-profile.test.ts +1 -1
  259. package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +12 -19
  260. package/src/__tests__/conversation-disk-view-integration.test.ts +1 -1
  261. package/src/__tests__/conversation-disk-view.test.ts +1 -1
  262. package/src/__tests__/conversation-fork-crud.test.ts +10 -8
  263. package/src/__tests__/conversation-fork-retrospective.test.ts +250 -0
  264. package/src/__tests__/conversation-fork-route.test.ts +1 -1
  265. package/src/__tests__/conversation-inference-profile-list.test.ts +1 -1
  266. package/src/__tests__/conversation-inference-profile-route.test.ts +1 -1
  267. package/src/__tests__/conversation-init.benchmark.test.ts +1 -1
  268. package/src/__tests__/conversation-key-store-disk-view.test.ts +1 -1
  269. package/src/__tests__/conversation-lifecycle.test.ts +117 -0
  270. package/src/__tests__/conversation-list-source.test.ts +3 -3
  271. package/src/__tests__/conversation-process-callsite.test.ts +6 -14
  272. package/src/__tests__/conversation-provider-retry-repair.test.ts +6 -0
  273. package/src/__tests__/conversation-queue.test.ts +95 -0
  274. package/src/__tests__/conversation-routes-disk-view.test.ts +1 -1
  275. package/src/__tests__/conversation-routes-guardian-reply.test.ts +12 -0
  276. package/src/__tests__/conversation-routes-slash-commands.test.ts +12 -0
  277. package/src/__tests__/conversation-runtime-assembly.test.ts +115 -12
  278. package/src/__tests__/conversation-slash-queue.test.ts +6 -0
  279. package/src/__tests__/conversation-slash-unknown.test.ts +6 -0
  280. package/src/__tests__/conversation-speed-override.test.ts +6 -0
  281. package/src/__tests__/conversation-starter-routes.test.ts +5 -5
  282. package/src/__tests__/conversation-store.test.ts +1 -1
  283. package/src/__tests__/conversation-surfaces-activation-emit.test.ts +4 -4
  284. package/src/__tests__/conversation-surfaces-task-progress.test.ts +352 -0
  285. package/src/__tests__/conversation-sync-tags.test.ts +1 -1
  286. package/src/__tests__/conversation-tool-setup-attribution.test.ts +47 -0
  287. package/src/__tests__/conversation-usage.test.ts +1 -1
  288. package/src/__tests__/conversation-wipe.test.ts +9 -8
  289. package/src/__tests__/conversation-workspace-cache-state.test.ts +6 -0
  290. package/src/__tests__/conversation-workspace-injection.test.ts +6 -0
  291. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +6 -0
  292. package/src/__tests__/conversations-import-system-filter.test.ts +1 -1
  293. package/src/__tests__/copy-composer-tc-templates.test.ts +17 -0
  294. package/src/__tests__/credential-security-invariants.test.ts +0 -1
  295. package/src/__tests__/db-acp-history.test.ts +2 -2
  296. package/src/__tests__/db-conversation-fork-lineage-migration.test.ts +5 -7
  297. package/src/__tests__/db-conversation-inference-profile-migration.test.ts +6 -7
  298. package/src/__tests__/db-llm-request-log-provider-migration.test.ts +5 -10
  299. package/src/__tests__/db-migration-rollback.test.ts +129 -39
  300. package/src/__tests__/db-proxy-transaction.test.ts +1 -1
  301. package/src/__tests__/db-schedule-syntax-migration.test.ts +0 -11
  302. package/src/__tests__/db-test-helpers.ts +36 -19
  303. package/src/__tests__/delete-propagation.test.ts +1 -1
  304. package/src/__tests__/deterministic-verification-control-plane.test.ts +28 -8
  305. package/src/__tests__/disk-pressure-tools.test.ts +41 -1
  306. package/src/__tests__/dm-backfill.test.ts +1 -1
  307. package/src/__tests__/drop-capability-card-state-migration.test.ts +0 -8
  308. package/src/__tests__/dynamic-page-surface.test.ts +0 -94
  309. package/src/__tests__/edit-propagation.test.ts +1 -1
  310. package/src/__tests__/emit-signal-routing-intent.test.ts +93 -5
  311. package/src/__tests__/empty-response-hook.test.ts +42 -0
  312. package/src/__tests__/events-client-registration.test.ts +1 -1
  313. package/src/__tests__/events-dev-bypass-actor.test.ts +7 -1
  314. package/src/__tests__/followup-tools.test.ts +1 -1
  315. package/src/__tests__/gemini-count-tokens.test.ts +70 -0
  316. package/src/__tests__/guardian-action-sweep.test.ts +9 -2
  317. package/src/__tests__/guardian-binding-drift-heal.test.ts +76 -11
  318. package/src/__tests__/guardian-card-withdrawal.test.ts +1 -1
  319. package/src/__tests__/guardian-decision-primitive-canonical.test.ts +1 -1
  320. package/src/__tests__/guardian-dispatch.test.ts +96 -2
  321. package/src/__tests__/guardian-outbound-http.test.ts +20 -12
  322. package/src/__tests__/guardian-principal-id-roundtrip.test.ts +1 -1
  323. package/src/__tests__/guardian-routing-invariants.test.ts +2 -4
  324. package/src/__tests__/guardian-routing-state.test.ts +1 -2
  325. package/src/__tests__/guardian-verification-voice-binding.test.ts +1 -1
  326. package/src/__tests__/headless-browser-mode.test.ts +2 -2
  327. package/src/__tests__/heartbeat-disk-pressure.test.ts +4 -0
  328. package/src/__tests__/heartbeat-service.test.ts +6 -0
  329. package/src/__tests__/helpers/channel-test-adapter.ts +92 -0
  330. package/src/__tests__/host-app-control-routes.test.ts +24 -30
  331. package/src/__tests__/host-bash-routes.test.ts +31 -41
  332. package/src/__tests__/host-browser-routes.test.ts +26 -32
  333. package/src/__tests__/host-cu-routes-targeted.test.ts +25 -33
  334. package/src/__tests__/host-file-routes-targeted.test.ts +40 -52
  335. package/src/__tests__/host-transfer-routes-targeted.test.ts +31 -43
  336. package/src/__tests__/http-conversation-lineage.test.ts +1 -1
  337. package/src/__tests__/http-user-message-parity.test.ts +165 -8
  338. package/src/__tests__/image-recovery-hook.test.ts +1 -1
  339. package/src/__tests__/inbound-invite-redemption.test.ts +1 -2
  340. package/src/__tests__/inbound-trust-verdict.test.ts +254 -0
  341. package/src/__tests__/inference-profile-reaper.test.ts +1 -1
  342. package/src/__tests__/inference-profile-session-handler.test.ts +1 -1
  343. package/src/__tests__/inference-profile-session-ipc.test.ts +1 -1
  344. package/src/__tests__/injector-chain.test.ts +1 -1
  345. package/src/__tests__/injector-disk-pressure.test.ts +11 -6
  346. package/src/__tests__/internal-telemetry-routes.test.ts +1 -1
  347. package/src/__tests__/invite-redemption-service.test.ts +244 -43
  348. package/src/__tests__/invite-routes-http.test.ts +35 -186
  349. package/src/__tests__/invite-service-ipc.test.ts +287 -0
  350. package/src/__tests__/jobs-store-qdrant-breaker.test.ts +5 -5
  351. package/src/__tests__/jobs-store-upsert-debounced.test.ts +9 -12
  352. package/src/__tests__/list-messages-attachments.test.ts +42 -1
  353. package/src/__tests__/list-messages-client-message-id.test.ts +1 -1
  354. package/src/__tests__/list-messages-hidden-metadata.test.ts +1 -1
  355. package/src/__tests__/list-messages-page-latest.test.ts +1 -1
  356. package/src/__tests__/list-messages-tool-merge.test.ts +1 -1
  357. package/src/__tests__/llm-context-normalization.test.ts +105 -0
  358. package/src/__tests__/llm-context-route-provider.test.ts +69 -4
  359. package/src/__tests__/llm-request-log-agent-loop-exit-reason.test.ts +9 -5
  360. package/src/__tests__/llm-request-log-call-site.test.ts +6 -6
  361. package/src/__tests__/llm-request-log-turn-query.test.ts +27 -13
  362. package/src/__tests__/llm-resolver.test.ts +205 -5
  363. package/src/__tests__/llm-usage-store.test.ts +65 -1
  364. package/src/__tests__/log-export-routes.test.ts +1 -1
  365. package/src/__tests__/log-export-workspace.test.ts +3 -3
  366. package/src/__tests__/media-stream-server-integration.test.ts +127 -0
  367. package/src/__tests__/memory-jobs-worker-lanes.test.ts +5 -5
  368. package/src/__tests__/memory-recall-log-store.test.ts +1 -1
  369. package/src/__tests__/memory-upsert-concurrency.test.ts +3 -4
  370. package/src/__tests__/messages-after-tiebreaker.test.ts +1 -1
  371. package/src/__tests__/migration-import-from-url.test.ts +2 -2
  372. package/src/__tests__/mtime-cache.test.ts +375 -0
  373. package/src/__tests__/non-member-access-request.test.ts +190 -19
  374. package/src/__tests__/notification-broadcaster.test.ts +4 -0
  375. package/src/__tests__/notification-candidate-guardian-context.test.ts +203 -0
  376. package/src/__tests__/notification-decision-recipient-context.test.ts +33 -32
  377. package/src/__tests__/notification-deep-link.test.ts +4 -0
  378. package/src/__tests__/notification-guardian-path.test.ts +20 -1
  379. package/src/__tests__/notification-schedule-notify-dedup.test.ts +1 -1
  380. package/src/__tests__/oauth-provider-profiles.test.ts +1 -1
  381. package/src/__tests__/oauth-provider-visibility.test.ts +1 -1
  382. package/src/__tests__/oauth-store.test.ts +1 -1
  383. package/src/__tests__/pending-interactions-resolved-event.test.ts +7 -4
  384. package/src/__tests__/persist-unsendable-image-downscale.test.ts +1 -1
  385. package/src/__tests__/persist-unsendable-image.test.ts +1 -1
  386. package/src/__tests__/persona-resolver.test.ts +39 -1
  387. package/src/__tests__/platform-bash-auto-approve.test.ts +1 -1
  388. package/src/__tests__/playbook-execution.test.ts +1 -1
  389. package/src/__tests__/playbook-tools.test.ts +1 -1
  390. package/src/__tests__/plugin-api-model-profiles.test.ts +74 -21
  391. package/src/__tests__/plugin-bootstrap.test.ts +78 -0
  392. package/src/__tests__/provider-platform-proxy-integration.test.ts +25 -5
  393. package/src/__tests__/provider-usage-tracking.test.ts +1 -1
  394. package/src/__tests__/prune-old-conversations-job.test.ts +1 -1
  395. package/src/__tests__/reaction-persistence.test.ts +1 -1
  396. package/src/__tests__/relay-server.test.ts +1026 -73
  397. package/src/__tests__/runtime-attachment-metadata.test.ts +9 -1
  398. package/src/__tests__/runtime-events-sse-bilingual.test.ts +7 -9
  399. package/src/__tests__/runtime-events-sse-parity.test.ts +1 -1
  400. package/src/__tests__/runtime-events-sse-reconnect.test.ts +1 -1
  401. package/src/__tests__/runtime-events-sse.test.ts +1 -1
  402. package/src/__tests__/schedule-retry.test.ts +1 -1
  403. package/src/__tests__/schedule-routes-workflow-validation.test.ts +1 -1
  404. package/src/__tests__/schedule-routes.test.ts +1 -1
  405. package/src/__tests__/schedule-store.test.ts +1 -1
  406. package/src/__tests__/schedule-tools.test.ts +1 -1
  407. package/src/__tests__/scheduler-disk-pressure.test.ts +1 -1
  408. package/src/__tests__/scheduler-recurrence.test.ts +1 -1
  409. package/src/__tests__/scheduler-reuse-conversation.test.ts +1 -1
  410. package/src/__tests__/scheduler-wake.test.ts +2 -1
  411. package/src/__tests__/scoped-approval-grants.test.ts +1 -1
  412. package/src/__tests__/scoped-grant-security-matrix.test.ts +5 -5
  413. package/src/__tests__/scrub-corrupted-image-attachments.test.ts +0 -8
  414. package/src/__tests__/secret-ingress-http.test.ts +12 -0
  415. package/src/__tests__/secret-routes-platform-proxy.test.ts +1 -0
  416. package/src/__tests__/send-endpoint-busy.test.ts +31 -9
  417. package/src/__tests__/sequence-store.test.ts +1 -1
  418. package/src/__tests__/server-history-render.test.ts +40 -1
  419. package/src/__tests__/settings-routes.test.ts +11 -10
  420. package/src/__tests__/skill-load-tool.test.ts +72 -0
  421. package/src/__tests__/skills.test.ts +44 -0
  422. package/src/__tests__/slack-inbound-verification.test.ts +48 -5
  423. package/src/__tests__/slack-messaging-token-resolution.test.ts +13 -2
  424. package/src/__tests__/slack-reaction-canonical-approval.test.ts +1 -1
  425. package/src/__tests__/sse-actor-principal-guardian-source.test.ts +102 -0
  426. package/src/__tests__/steer-on-enqueue-question.test.ts +181 -0
  427. package/src/__tests__/stt-hints.test.ts +44 -13
  428. package/src/__tests__/subagent-detail.test.ts +27 -0
  429. package/src/__tests__/subagent-disposal.test.ts +65 -0
  430. package/src/__tests__/subagent-tool-gate-mode.test.ts +2 -73
  431. package/src/__tests__/subagent-tools.test.ts +1 -31
  432. package/src/__tests__/system-prompt.test.ts +1 -1
  433. package/src/__tests__/system-storage-cleanup-skill.test.ts +56 -0
  434. package/src/__tests__/task-compiler.test.ts +1 -1
  435. package/src/__tests__/task-management-tools.test.ts +1 -1
  436. package/src/__tests__/task-memory-cleanup.test.ts +9 -6
  437. package/src/__tests__/task-scheduler.test.ts +1 -1
  438. package/src/__tests__/thread-backfill.test.ts +1 -1
  439. package/src/__tests__/tool-approval-handler.test.ts +1 -1
  440. package/src/__tests__/tool-approval-seed-content-blocks.test.ts +2 -0
  441. package/src/__tests__/tool-executor.test.ts +37 -1
  442. package/src/__tests__/tool-grant-request-escalation.test.ts +1 -2
  443. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +73 -1
  444. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +34 -34
  445. package/src/__tests__/trusted-contact-multichannel.test.ts +1 -2
  446. package/src/__tests__/trusted-contact-verification.test.ts +1 -1
  447. package/src/__tests__/turn-boundary-resolution.test.ts +3 -3
  448. package/src/__tests__/turn-events-store.test.ts +1 -1
  449. package/src/__tests__/twilio-routes.test.ts +98 -3
  450. package/src/__tests__/usage-cache-backfill-migration.test.ts +20 -10
  451. package/src/__tests__/usage-routes.test.ts +1 -1
  452. package/src/__tests__/user-plugin-loader.test.ts +34 -29
  453. package/src/__tests__/verification-control-plane-policy.test.ts +2 -2
  454. package/src/__tests__/voice-invite-redemption.test.ts +134 -36
  455. package/src/__tests__/voice-scoped-grant-consumer.test.ts +1 -1
  456. package/src/__tests__/voice-session-bridge.test.ts +1 -1
  457. package/src/__tests__/workspace-git-service.test.ts +114 -1
  458. package/src/__tests__/workspace-heartbeat-service.test.ts +45 -0
  459. package/src/__tests__/workspace-migration-009-backfill-conversation-disk-view.test.ts +1 -1
  460. package/src/__tests__/workspace-migration-013-repair-conversation-disk-view.test.ts +1 -1
  461. package/src/__tests__/workspace-migration-028-recover-conversations-from-disk-view.test.ts +88 -18
  462. package/src/__tests__/workspace-migration-108-drop-balanced-economy-profile.test.ts +6 -6
  463. package/src/__tests__/workspace-migration-109-swap-quality-profile-to-glm-5p2.test.ts +281 -0
  464. package/src/__tests__/workspace-migration-110-flip-balanced-profile-to-together.test.ts +167 -0
  465. package/src/__tests__/workspace-migrations-runner.test.ts +55 -0
  466. package/src/a2a/__tests__/e2e-a2a-channel.test.ts +1 -1
  467. package/src/a2a/__tests__/task-store.test.ts +1 -1
  468. package/src/acp/__tests__/session-manager-persistence.test.ts +1 -1
  469. package/src/acp/__tests__/session-manager-resume.test.ts +22 -11
  470. package/src/acp/__tests__/session-manager-startup.test.ts +1 -1
  471. package/src/acp/__tests__/session-manager.test.ts +72 -1
  472. package/src/acp/index.ts +10 -0
  473. package/src/acp/session-manager.ts +35 -0
  474. package/src/agent/loop.ts +45 -27
  475. package/src/api/constants/sse-replay.ts +41 -0
  476. package/src/api/events/ui-surface-show.ts +8 -3
  477. package/src/api/index.ts +7 -6
  478. package/src/api/responses/conversation-message.ts +4 -0
  479. package/src/api/responses/llm-request-log-entry.ts +25 -0
  480. package/src/api/responses/subagent-detail.ts +17 -0
  481. package/src/api/surfaces.ts +33 -0
  482. package/src/approvals/AGENTS.md +1 -2
  483. package/src/approvals/guardian-decision-primitive.ts +13 -210
  484. package/src/approvals/guardian-request-resolvers.ts +104 -58
  485. package/src/background-wake/wake-intent-hooks.test.ts +1 -1
  486. package/src/calls/__tests__/inbound-trust-reader.test.ts +110 -0
  487. package/src/calls/__tests__/relay-setup-router.test.ts +349 -65
  488. package/src/calls/guardian-dispatch.ts +10 -8
  489. package/src/calls/inbound-trust-reader.ts +56 -0
  490. package/src/calls/media-stream-server.ts +21 -0
  491. package/src/calls/relay-server.ts +231 -72
  492. package/src/calls/relay-setup-router.ts +57 -13
  493. package/src/calls/relay-verification.ts +7 -7
  494. package/src/calls/stt-hints.ts +9 -12
  495. package/src/calls/twilio-routes.ts +13 -3
  496. package/src/cli/commands/__tests__/cache.test.ts +8 -1
  497. package/src/cli/commands/cache.ts +194 -181
  498. package/src/cli/commands/contacts.ts +6 -24
  499. package/src/cli/commands/db/__tests__/repair.test.ts +15 -6
  500. package/src/cli/commands/db/__tests__/status.test.ts +7 -3
  501. package/src/cli/commands/db/status.ts +212 -33
  502. package/src/cli/commands/mcp.ts +252 -218
  503. package/src/cli/commands/memory/__tests__/memory-v3.test.ts +6 -1
  504. package/src/cli/commands/memory/__tests__/worker.test.ts +302 -0
  505. package/src/cli/commands/memory/index.ts +4 -0
  506. package/src/cli/commands/memory/memory-retrospective.ts +129 -0
  507. package/src/cli/commands/memory/memory-v3.ts +176 -4
  508. package/src/cli/commands/memory/worker.ts +175 -0
  509. package/src/cli/commands/plugins.ts +343 -14
  510. package/src/cli/lib/__tests__/install-from-github.test.ts +40 -0
  511. package/src/cli/lib/__tests__/list-installed-plugins.test.ts +160 -1
  512. package/src/cli/lib/__tests__/plugin-pin-history.test.ts +162 -0
  513. package/src/cli/lib/__tests__/toggle-plugin.test.ts +158 -0
  514. package/src/cli/lib/install-from-github.ts +47 -6
  515. package/src/cli/lib/list-installed-plugins.ts +179 -1
  516. package/src/cli/lib/plugin-marketplace.ts +11 -0
  517. package/src/cli/lib/plugin-pin-history.ts +257 -0
  518. package/src/cli/lib/toggle-plugin.ts +146 -0
  519. package/src/config/__tests__/loader-callsite-strip-fallback.test.ts +143 -0
  520. package/src/config/__tests__/sync-gated-profiles.test.ts +2 -2
  521. package/src/config/bundled-skills/app-builder/SKILL.md +15 -33
  522. package/src/config/bundled-skills/app-builder/references/DESIGN_SYSTEM.md +3 -8
  523. package/src/config/bundled-skills/app-builder/references/INTERACTION_HOOKS.md +64 -37
  524. package/src/config/bundled-skills/app-builder/references/RESPONSIVE.md +1 -1
  525. package/src/config/bundled-skills/app-builder/references/WIDGETS.md +14 -72
  526. package/src/config/bundled-skills/app-builder/references/examples/README.md +1 -2
  527. package/src/config/bundled-skills/contacts/SKILL.md +7 -12
  528. package/src/config/bundled-skills/messaging/tools/shared.ts +4 -1
  529. package/src/config/bundled-skills/system-storage-cleanup/SKILL.md +74 -0
  530. package/src/config/bundled-skills/workflows/SKILL.md +4 -3
  531. package/src/config/call-site-defaults.ts +11 -2
  532. package/src/config/feature-flag-registry.json +0 -8
  533. package/src/config/llm-resolver.ts +151 -14
  534. package/src/config/loader.ts +36 -5
  535. package/src/config/profile-dispatchability.ts +11 -0
  536. package/src/config/schemas/__tests__/memory-v3.test.ts +1 -0
  537. package/src/config/schemas/call-site-catalog.ts +7 -0
  538. package/src/config/schemas/llm.ts +2 -0
  539. package/src/config/schemas/memory-lifecycle.ts +17 -3
  540. package/src/config/schemas/memory-v3.ts +7 -0
  541. package/src/config/schemas/memory.ts +4 -0
  542. package/src/config/schemas/timeouts.ts +32 -0
  543. package/src/config/seed-inference-profiles.ts +147 -50
  544. package/src/config/skills.ts +27 -5
  545. package/src/config/sync-gated-profiles.ts +13 -1
  546. package/src/contacts/__tests__/guardian-delivery-reader.test.ts +312 -0
  547. package/src/contacts/contact-store.ts +21 -0
  548. package/src/contacts/contacts-write.ts +3 -0
  549. package/src/contacts/guardian-delivery-reader.ts +223 -0
  550. package/src/contacts/member-status.ts +9 -0
  551. package/src/credential-health/credential-health-service.ts +1 -5
  552. package/src/daemon/__tests__/conversation-tool-setup.test.ts +44 -0
  553. package/src/daemon/app-source-watcher.ts +31 -18
  554. package/src/daemon/assistant-attachments.ts +94 -4
  555. package/src/daemon/conversation-agent-loop-handlers.ts +3 -0
  556. package/src/daemon/conversation-agent-loop.ts +18 -36
  557. package/src/daemon/conversation-process.ts +35 -16
  558. package/src/daemon/conversation-runtime-assembly.ts +91 -66
  559. package/src/daemon/conversation-surfaces.ts +273 -18
  560. package/src/daemon/conversation-tool-setup.ts +24 -64
  561. package/src/daemon/conversation.ts +145 -52
  562. package/src/daemon/event-loop-watchdog.test.ts +85 -0
  563. package/src/daemon/event-loop-watchdog.ts +133 -0
  564. package/src/daemon/external-plugins-bootstrap.ts +26 -80
  565. package/src/daemon/handlers/__tests__/config-a2a-accept.test.ts +1 -1
  566. package/src/daemon/handlers/__tests__/config-a2a-complete.test.ts +1 -1
  567. package/src/daemon/handlers/__tests__/config-a2a-invite.test.ts +1 -1
  568. package/src/daemon/handlers/__tests__/config-a2a-redeem.test.ts +1 -1
  569. package/src/daemon/handlers/__tests__/config-a2a.test.ts +1 -1
  570. package/src/daemon/handlers/config-channels.ts +41 -27
  571. package/src/daemon/handlers/conversations.ts +84 -0
  572. package/src/daemon/handlers/shared.ts +7 -0
  573. package/src/daemon/lifecycle.ts +44 -5
  574. package/src/daemon/memory-v2-startup.test.ts +72 -0
  575. package/src/daemon/memory-v2-startup.ts +87 -19
  576. package/src/daemon/message-types/inbox.ts +0 -6
  577. package/src/daemon/message-types/messages.ts +0 -4
  578. package/src/daemon/message-types/surfaces.ts +12 -11
  579. package/src/daemon/server.ts +0 -4
  580. package/src/daemon/shutdown-handlers.ts +20 -0
  581. package/src/daemon/tool-setup-types.ts +7 -5
  582. package/src/daemon/trust-context.ts +6 -0
  583. package/src/daemon/wake-conversation-ops.ts +70 -0
  584. package/src/daemon/workspace-tools-watcher.ts +7 -3
  585. package/src/documents/document-comments-store.test.ts +1 -1
  586. package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +1 -1
  587. package/src/heartbeat/__tests__/heartbeat-service.test.ts +6 -0
  588. package/src/heartbeat/heartbeat-service.ts +3 -4
  589. package/src/ipc/__tests__/attachment-ipc.test.ts +1 -1
  590. package/src/ipc/__tests__/browser-ipc.test.ts +73 -2
  591. package/src/ipc/__tests__/clients-list-ipc.test.ts +1 -1
  592. package/src/ipc/__tests__/watcher-ipc.test.ts +59 -39
  593. package/src/ipc/assistant-server.ts +10 -2
  594. package/src/ipc/gateway-client.ts +2 -1
  595. package/src/ipc/routes/__tests__/invite-ipc-routes.test.ts +58 -0
  596. package/src/ipc/routes/invite-ipc-routes.ts +66 -0
  597. package/src/live-voice/__tests__/live-voice-archive.test.ts +1 -1
  598. package/src/memory/__tests__/activation-session-store.test.ts +1 -1
  599. package/src/memory/__tests__/auto-analysis-guard.test.ts +1 -1
  600. package/src/memory/__tests__/conversation-group-migration.test.ts +1 -1
  601. package/src/memory/__tests__/conversation-queries.test.ts +1 -1
  602. package/src/memory/__tests__/db-async-query.test.ts +1 -1
  603. package/src/memory/__tests__/db-logs-attach.test.ts +110 -0
  604. package/src/memory/__tests__/db-maintenance.test.ts +28 -36
  605. package/src/memory/__tests__/db-memory-attach.test.ts +113 -0
  606. package/src/memory/__tests__/find-analysis-conversation.test.ts +1 -1
  607. package/src/memory/__tests__/find-most-recent-retrospective-for.test.ts +1 -1
  608. package/src/memory/__tests__/fork-message-copy.test.ts +232 -0
  609. package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +3 -0
  610. package/src/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +5 -5
  611. package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +8 -6
  612. package/src/memory/__tests__/memory-retrospective-job.test.ts +30 -37
  613. package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +69 -66
  614. package/src/memory/__tests__/memory-retrospective-state.test.ts +1 -1
  615. package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +1 -1
  616. package/src/memory/__tests__/memory-v2-concept-frequency.test.ts +1 -1
  617. package/src/memory/__tests__/onboarding-events-store.test.ts +1 -1
  618. package/src/memory/__tests__/prompt-override.test.ts +192 -0
  619. package/src/memory/__tests__/table-relocation.test.ts +129 -0
  620. package/src/memory/conversation-crud.ts +461 -152
  621. package/src/memory/db-async-query.ts +89 -5
  622. package/src/memory/db-connection.ts +101 -18
  623. package/src/memory/db-init.ts +409 -234
  624. package/src/memory/db-maintenance.ts +43 -38
  625. package/src/memory/db-singleton.ts +45 -19
  626. package/src/memory/embedding-gemini.test.ts +3 -1
  627. package/src/memory/embedding-gemini.ts +18 -2
  628. package/src/memory/fork-message-copy.ts +170 -0
  629. package/src/memory/graph/__tests__/handle-remember-v2.test.ts +92 -0
  630. package/src/memory/graph/bootstrap.test.ts +6 -3
  631. package/src/memory/graph/retriever.test.ts +12 -12
  632. package/src/memory/graph/store.test.ts +15 -25
  633. package/src/memory/graph/store.ts +23 -14
  634. package/src/memory/graph/tool-handlers.ts +34 -5
  635. package/src/memory/graph/tools.ts +5 -2
  636. package/src/memory/indexer.ts +21 -9
  637. package/src/memory/job-handlers/cleanup.ts +10 -3
  638. package/src/memory/job-handlers/embedding.test.ts +4 -4
  639. package/src/memory/jobs/__tests__/embed-concept-page.test.ts +4 -4
  640. package/src/memory/jobs/embed-pkb-file.test.ts +7 -7
  641. package/src/memory/jobs-store.ts +36 -24
  642. package/src/memory/llm-request-log-store.ts +51 -19
  643. package/src/memory/llm-usage-store.ts +79 -21
  644. package/src/memory/memory-retrospective-job.ts +27 -19
  645. package/src/memory/memory-retrospective-startup-cleanup.ts +10 -2
  646. package/src/memory/migrations/{100-core-tables.ts → 000-core-tables.ts} +6 -10
  647. package/src/memory/migrations/014-backfill-inbox-thread-state.ts +13 -3
  648. package/src/memory/migrations/104-core-indexes.ts +1 -1
  649. package/src/memory/migrations/126-backfill-guardian-principal-id.ts +189 -196
  650. package/src/memory/migrations/127-guardian-principal-id-not-null.ts +98 -105
  651. package/src/memory/migrations/134-contacts-notes-column.ts +66 -69
  652. package/src/memory/migrations/135-backfill-contact-interaction-stats.ts +19 -22
  653. package/src/memory/migrations/136-drop-assistant-id-columns.ts +241 -219
  654. package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +204 -209
  655. package/src/memory/migrations/141-rename-verification-table.ts +45 -48
  656. package/src/memory/migrations/142-rename-verification-session-id-column.ts +16 -23
  657. package/src/memory/migrations/143-rename-guardian-verification-values.ts +23 -30
  658. package/src/memory/migrations/144-rename-voice-to-phone.ts +133 -136
  659. package/src/memory/migrations/145-drop-accounts-table.ts +4 -7
  660. package/src/memory/migrations/147-migrate-reminders-to-schedules.ts +79 -82
  661. package/src/memory/migrations/148-drop-reminders-table.ts +3 -6
  662. package/src/memory/migrations/150-oauth-apps-client-secret-path.ts +71 -78
  663. package/src/memory/migrations/157-invite-contact-id.ts +73 -76
  664. package/src/memory/migrations/162-guardian-timestamps-epoch-ms.ts +44 -58
  665. package/src/memory/migrations/169-rename-gmail-provider-key-to-google.ts +36 -43
  666. package/src/memory/migrations/174-rename-thread-starters-table.ts +30 -37
  667. package/src/memory/migrations/176-drop-capability-card-state.ts +17 -22
  668. package/src/memory/migrations/177-create-trace-events-table.ts +23 -28
  669. package/src/memory/migrations/180-backfill-inline-attachments-to-disk.ts +36 -43
  670. package/src/memory/migrations/181-rename-thread-starters-checkpoints.ts +14 -21
  671. package/src/memory/migrations/191-backfill-audio-attachment-mime-types.ts +17 -24
  672. package/src/memory/migrations/192-contacts-user-file-column.ts +6 -9
  673. package/src/memory/migrations/193-add-source-type-columns.ts +33 -36
  674. package/src/memory/migrations/194-memory-recall-logs.ts +34 -39
  675. package/src/memory/migrations/196-strip-integration-prefix-from-provider-keys.ts +59 -66
  676. package/src/memory/migrations/199-guardian-request-enrichment-columns.ts +41 -48
  677. package/src/memory/migrations/204-rename-memory-graph-type-values.ts +11 -18
  678. package/src/memory/migrations/206-scrub-corrupted-image-attachments.ts +76 -83
  679. package/src/memory/migrations/209-strip-thinking-from-consolidated.ts +135 -68
  680. package/src/memory/migrations/211-memory-recall-logs-query-context.ts +6 -11
  681. package/src/memory/migrations/212-llm-request-logs-created-at-index.ts +4 -9
  682. package/src/memory/migrations/217-conversation-host-access.ts +13 -18
  683. package/src/memory/migrations/220-normalize-user-file-by-principal.ts +86 -93
  684. package/src/memory/migrations/222-strip-placeholder-sentinels-from-messages.ts +41 -48
  685. package/src/memory/migrations/230-acp-session-history.ts +23 -28
  686. package/src/memory/migrations/231-repair-memory-graph-event-dates.ts +58 -62
  687. package/src/memory/migrations/232-activation-state.ts +11 -16
  688. package/src/memory/migrations/233-document-conversations.ts +20 -25
  689. package/src/memory/migrations/234-memory-v2-activation-logs.ts +26 -31
  690. package/src/memory/migrations/235-slack-compaction-watermark.ts +5 -10
  691. package/src/memory/migrations/236-tool-invocations-matched-rule-id.ts +6 -11
  692. package/src/memory/migrations/237-heartbeat-runs.ts +22 -27
  693. package/src/memory/migrations/239-trace-events-created-at-index.ts +4 -9
  694. package/src/memory/migrations/242-message-bookmarks.ts +17 -22
  695. package/src/memory/migrations/245-memory-retrospective-state.ts +8 -13
  696. package/src/memory/migrations/249-normalize-slack-external-content.ts +37 -41
  697. package/src/memory/migrations/251-a2a-tasks.ts +27 -32
  698. package/src/memory/migrations/254-external-conversation-binding-chat-name.ts +12 -17
  699. package/src/memory/migrations/255-channel-inbound-delivery-attempts.ts +10 -15
  700. package/src/memory/migrations/256-memory-v2-injection-events.ts +70 -74
  701. package/src/memory/migrations/259-conversation-cleaned-at.ts +4 -9
  702. package/src/memory/migrations/260-rename-cleaned-at.ts +11 -16
  703. package/src/memory/migrations/261-llm-usage-add-raw-usage.ts +3 -8
  704. package/src/memory/migrations/262-memory-v3-coactivation.ts +21 -26
  705. package/src/memory/migrations/263-memory-v3-auto-edges.ts +14 -19
  706. package/src/memory/migrations/270-schedule-description.ts +7 -12
  707. package/src/memory/migrations/272-acp-session-history-cwd.ts +8 -13
  708. package/src/memory/migrations/281-memory-retrospective-remembered-log.ts +8 -13
  709. package/src/memory/migrations/297-move-llm-request-logs-to-logs-db.ts +111 -0
  710. package/src/memory/migrations/298-move-memory-jobs-to-memory-db.ts +128 -0
  711. package/src/memory/migrations/299-canonical-guardian-deliveries-conversation-index.ts +19 -0
  712. package/src/memory/migrations/__tests__/014-backfill-inbox-thread-state.test.ts +108 -0
  713. package/src/memory/migrations/__tests__/136-drop-assistant-id-columns.test.ts +82 -0
  714. package/src/memory/migrations/__tests__/209-strip-thinking-from-consolidated.test.ts +224 -0
  715. package/src/memory/migrations/__tests__/297-move-llm-request-logs.test.ts +180 -0
  716. package/src/memory/migrations/__tests__/run-migrations.test.ts +333 -7
  717. package/src/memory/migrations/helpers/relocation.ts +227 -0
  718. package/src/memory/migrations/registry.ts +63 -0
  719. package/src/memory/migrations/run-migrations.ts +187 -16
  720. package/src/memory/migrations/schema-introspection.ts +14 -0
  721. package/src/memory/migrations/validate-migration-state.ts +50 -145
  722. package/src/memory/prompt-override.ts +129 -0
  723. package/src/memory/raw-query.ts +47 -2
  724. package/src/memory/skill-loaded-events-store.test.ts +1 -1
  725. package/src/memory/task-memory-cleanup.ts +62 -41
  726. package/src/memory/tool-executed-events-store.test.ts +1 -1
  727. package/src/memory/turn-trace-store.test.ts +1 -1
  728. package/src/memory/v2/__tests__/backfill-jobs.test.ts +16 -15
  729. package/src/memory/v2/__tests__/cli-command-store.test.ts +25 -0
  730. package/src/memory/v2/__tests__/harness-compare.test.ts +1 -1
  731. package/src/memory/v2/__tests__/harness-oracle.test.ts +1 -1
  732. package/src/memory/v2/__tests__/harness-replay-input.test.ts +1 -1
  733. package/src/memory/v2/__tests__/skill-store.test.ts +80 -0
  734. package/src/memory/v2/__tests__/sweep-job.test.ts +2 -2
  735. package/src/memory/v2/cli-command-store.ts +75 -38
  736. package/src/memory/v2/prompts/consolidation.ts +13 -82
  737. package/src/memory/v2/prompts/router.ts +21 -93
  738. package/src/memory/v2/skill-store.ts +68 -31
  739. package/src/memory/v3-eval/__tests__/eval-packets.test.ts +38 -0
  740. package/src/memory/v3-eval/__tests__/eval-tally.test.ts +139 -0
  741. package/src/memory/v3-eval/eval-packets.ts +197 -12
  742. package/src/memory/v3-eval/eval-tally.ts +234 -0
  743. package/src/memory/worker-control.ts +118 -0
  744. package/src/memory/worker-process.ts +72 -0
  745. package/src/messaging/provider.ts +10 -0
  746. package/src/messaging/providers/gmail/adapter.ts +1 -0
  747. package/src/messaging/providers/gmail/client.ts +13 -0
  748. package/src/messaging/providers/index.ts +1 -1
  749. package/src/messaging/providers/slack/send.test.ts +87 -39
  750. package/src/messaging/providers/slack/send.ts +84 -105
  751. package/src/notifications/README.md +9 -5
  752. package/src/notifications/__tests__/broadcaster.test.ts +16 -8
  753. package/src/notifications/__tests__/connected-channels.test.ts +114 -0
  754. package/src/notifications/__tests__/decision-engine.test.ts +78 -9
  755. package/src/notifications/__tests__/destination-resolver.test.ts +256 -0
  756. package/src/notifications/__tests__/deterministic-checks.test.ts +43 -1
  757. package/src/notifications/adapters/slack.ts +12 -10
  758. package/src/notifications/approval-card-builder.ts +81 -20
  759. package/src/notifications/approval-card-data.ts +8 -5
  760. package/src/notifications/broadcaster.ts +8 -1
  761. package/src/notifications/canonical-delivery-recorder.ts +7 -5
  762. package/src/notifications/conversation-candidates.ts +24 -59
  763. package/src/notifications/copy-composer.ts +48 -68
  764. package/src/notifications/decision-engine.ts +15 -7
  765. package/src/notifications/destination-resolver.ts +68 -24
  766. package/src/notifications/deterministic-checks.ts +19 -16
  767. package/src/notifications/emit-signal.ts +68 -15
  768. package/src/notifications/trusted-contact-payloads.ts +70 -0
  769. package/src/oauth/byo-connection.test.ts +9 -0
  770. package/src/oauth/connection-resolver.test.ts +174 -6
  771. package/src/oauth/connection-resolver.ts +132 -5
  772. package/src/oauth/oauth-store.ts +16 -3
  773. package/src/oauth/scope-utils.ts +39 -0
  774. package/src/permissions/question-prompter.test.ts +1 -1
  775. package/src/permissions/question-prompter.ts +7 -4
  776. package/src/plugin-api/index.ts +9 -4
  777. package/src/plugin-api/model-profiles.test.ts +123 -0
  778. package/src/plugin-api/model-profiles.ts +5 -1
  779. package/src/plugin-api/vision-support.test.ts +173 -0
  780. package/src/plugin-api/vision-support.ts +113 -0
  781. package/src/plugins/defaults/advisor/__tests__/consult.test.ts +46 -0
  782. package/src/plugins/defaults/advisor/consult.ts +18 -1
  783. package/src/plugins/defaults/advisor/tools/advisor.ts +4 -0
  784. package/src/plugins/defaults/compaction/window-manager.ts +45 -64
  785. package/src/plugins/defaults/empty-response/hooks/post-model-call.ts +13 -4
  786. package/src/plugins/defaults/image-fallback/__tests__/image-fallback.test.ts +441 -0
  787. package/src/plugins/defaults/image-fallback/hooks/post-tool-use.ts +57 -0
  788. package/src/plugins/defaults/image-fallback/hooks/user-prompt-submit.ts +61 -0
  789. package/src/plugins/defaults/image-fallback/package.json +14 -0
  790. package/src/plugins/defaults/image-fallback/src/caption-blocks.ts +108 -0
  791. package/src/plugins/defaults/image-fallback/src/caption-cache.ts +49 -0
  792. package/src/plugins/defaults/image-fallback/src/image-persist.ts +56 -0
  793. package/src/plugins/defaults/image-fallback/src/vision-caption.ts +120 -0
  794. package/src/plugins/defaults/index.ts +27 -0
  795. package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit.ts +14 -1
  796. package/src/plugins/defaults/memory-retrieval/injectors.ts +4 -4
  797. package/src/plugins/defaults/memory-v3-shadow/__tests__/pool-select.test.ts +134 -5
  798. package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +11 -2
  799. package/src/plugins/defaults/memory-v3-shadow/pool-select.test.ts +146 -0
  800. package/src/plugins/defaults/memory-v3-shadow/pool-select.ts +246 -19
  801. package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +8 -1
  802. package/src/plugins/external-plugin-loader.ts +47 -6
  803. package/src/plugins/mtime-cache.ts +772 -0
  804. package/src/plugins/pipeline.ts +7 -2
  805. package/src/plugins/registry.ts +16 -5
  806. package/src/plugins/user-loader.ts +22 -76
  807. package/src/prompts/persona-resolver.ts +29 -11
  808. package/src/prompts/system-prompt.ts +1 -1
  809. package/src/prompts/templates/system-sections.ts +4 -4
  810. package/src/providers/__tests__/count-tokens-forwarding.test.ts +98 -0
  811. package/src/providers/anthropic/client.ts +285 -185
  812. package/src/providers/call-site-routing.ts +10 -0
  813. package/src/providers/gemini/client.ts +43 -0
  814. package/src/providers/inference/adapter-factory.ts +6 -0
  815. package/src/providers/inference/connections.ts +6 -1
  816. package/src/providers/model-catalog.ts +53 -0
  817. package/src/providers/platform-proxy/constants.ts +5 -0
  818. package/src/providers/ratelimit.ts +9 -0
  819. package/src/providers/retry.ts +10 -0
  820. package/src/providers/together/client.ts +35 -0
  821. package/src/providers/types.ts +16 -0
  822. package/src/providers/usage-tracking.ts +7 -0
  823. package/src/runtime/AGENTS.md +9 -1
  824. package/src/runtime/__tests__/agent-wake.test.ts +259 -4
  825. package/src/runtime/__tests__/guardian-vellum-migration.test.ts +181 -0
  826. package/src/runtime/__tests__/is-guardian-bound-for-channel.test.ts +64 -0
  827. package/src/runtime/__tests__/local-principal-trust.test.ts +164 -0
  828. package/src/runtime/__tests__/slack-block-formatting.test.ts +39 -10
  829. package/src/runtime/__tests__/trust-verdict-consumer.test.ts +670 -0
  830. package/src/runtime/access-request-helper.ts +19 -39
  831. package/src/runtime/actor-trust-resolver.ts +8 -16
  832. package/src/runtime/agent-wake.ts +183 -60
  833. package/src/runtime/anchored-guardian.test.ts +156 -0
  834. package/src/runtime/anchored-guardian.ts +135 -0
  835. package/src/runtime/assistant-stream-state.ts +9 -2
  836. package/src/runtime/auth/__tests__/require-bound-guardian.test.ts +99 -0
  837. package/src/runtime/auth/require-bound-guardian.ts +21 -11
  838. package/src/runtime/channel-reply-delivery.ts +6 -3
  839. package/src/runtime/channel-verification-service.ts +24 -0
  840. package/src/runtime/guardian-decision-types.ts +3 -22
  841. package/src/runtime/guardian-vellum-migration.ts +66 -7
  842. package/src/runtime/http-server.ts +1 -15
  843. package/src/runtime/invite-redemption-service.ts +155 -6
  844. package/src/runtime/invite-service.ts +113 -62
  845. package/src/runtime/local-actor-identity.ts +76 -11
  846. package/src/runtime/local-principal-trust.ts +52 -0
  847. package/src/runtime/migrations/__tests__/vbundle-builder-fd-leak.test.ts +3 -0
  848. package/src/runtime/pending-interactions.ts +11 -1
  849. package/src/runtime/routes/__tests__/acp-routes.test.ts +1 -1
  850. package/src/runtime/routes/__tests__/bookmark-routes.test.ts +1 -1
  851. package/src/runtime/routes/__tests__/channel-verification-revoke.test.ts +277 -0
  852. package/src/runtime/routes/__tests__/channel-verification-routes.test.ts +140 -0
  853. package/src/runtime/routes/__tests__/connection-routes-vs-cli-parity.test.ts +26 -7
  854. package/src/runtime/routes/__tests__/consolidation-routes.test.ts +14 -10
  855. package/src/runtime/routes/__tests__/contact-routes-update-channel-relay.test.ts +164 -0
  856. package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +1 -1
  857. package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +1 -1
  858. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +8 -8
  859. package/src/runtime/routes/__tests__/conversation-surface-routes.test.ts +1 -1
  860. package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +1 -3
  861. package/src/runtime/routes/__tests__/invite-relay-routes.test.ts +240 -0
  862. package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +4 -0
  863. package/src/runtime/routes/__tests__/plugins-routes.test.ts +143 -0
  864. package/src/runtime/routes/__tests__/retrospective-routes.test.ts +1 -1
  865. package/src/runtime/routes/__tests__/slack-channel-routes.test.ts +1 -1
  866. package/src/runtime/routes/__tests__/surface-action-routes.test.ts +163 -0
  867. package/src/runtime/routes/acp-routes-list.test.ts +4 -0
  868. package/src/runtime/routes/acp-routes.test.ts +5 -6
  869. package/src/runtime/routes/attachment-routes.ts +21 -17
  870. package/src/runtime/routes/browser-routes.ts +19 -1
  871. package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +5 -9
  872. package/src/runtime/routes/channel-verification-routes.ts +13 -2
  873. package/src/runtime/routes/contact-routes.ts +275 -164
  874. package/src/runtime/routes/conversation-query-routes.ts +15 -5
  875. package/src/runtime/routes/conversation-routes.ts +80 -66
  876. package/src/runtime/routes/conversation-starter-routes.ts +7 -8
  877. package/src/runtime/routes/events-routes.ts +2 -2
  878. package/src/runtime/routes/guardian-approval-interception.ts +13 -274
  879. package/src/runtime/routes/host-app-control-routes.ts +5 -4
  880. package/src/runtime/routes/host-bash-routes.ts +5 -4
  881. package/src/runtime/routes/host-browser-routes.ts +9 -11
  882. package/src/runtime/routes/host-cu-routes.ts +5 -4
  883. package/src/runtime/routes/host-file-routes.ts +5 -4
  884. package/src/runtime/routes/host-transfer-routes.ts +6 -6
  885. package/src/runtime/routes/http-adapter.ts +1 -1
  886. package/src/runtime/routes/inbound-message-handler.ts +21 -16
  887. package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +376 -0
  888. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +86 -64
  889. package/src/runtime/routes/inbound-stages/admission-policy.ts +20 -5
  890. package/src/runtime/routes/inbound-stages/background-dispatch.ts +16 -4
  891. package/src/runtime/routes/inbound-stages/guardian-activation-intercept.test.ts +21 -8
  892. package/src/runtime/routes/inbound-stages/guardian-activation-intercept.ts +14 -3
  893. package/src/runtime/routes/llm-context-normalization.ts +71 -0
  894. package/src/runtime/routes/log-export-routes.ts +2 -2
  895. package/src/runtime/routes/mcp-auth-routes.ts +38 -15
  896. package/src/runtime/routes/memory-eval-routes.ts +92 -0
  897. package/src/runtime/routes/memory-item-routes.test.ts +12 -11
  898. package/src/runtime/routes/migration-routes.ts +51 -40
  899. package/src/runtime/routes/plugins-routes.ts +164 -8
  900. package/src/runtime/routes/schedule-routes.ts +1 -0
  901. package/src/runtime/routes/subagents-routes.ts +5 -0
  902. package/src/runtime/routes/surface-action-routes.ts +39 -51
  903. package/src/runtime/routes/usage-routes.ts +3 -0
  904. package/src/runtime/routes/work-items-routes.test.ts +1 -1
  905. package/src/runtime/slack-block-formatting.ts +46 -48
  906. package/src/runtime/trust-verdict-consumer.ts +210 -0
  907. package/src/schedule/scheduler.ts +6 -9
  908. package/src/signals/user-message.ts +16 -0
  909. package/src/subagent/manager.ts +9 -0
  910. package/src/telemetry/usage-telemetry-reporter.test.ts +1 -1
  911. package/src/tools/ask-question/ask-question-tool.test.ts +89 -52
  912. package/src/tools/ask-question/ask-question-tool.ts +27 -73
  913. package/src/tools/browser/__tests__/browser-status.test.ts +20 -0
  914. package/src/tools/browser/browser-execution.ts +16 -4
  915. package/src/tools/document/document-comment-tool.test.ts +1 -1
  916. package/src/tools/executor.ts +15 -3
  917. package/src/tools/host-terminal/host-shell.ts +28 -9
  918. package/src/tools/memory/register.test.ts +32 -0
  919. package/src/tools/skills/load.ts +43 -2
  920. package/src/tools/subagent/spawn.ts +4 -10
  921. package/src/tools/terminal/shell.ts +16 -5
  922. package/src/tools/types.ts +1 -0
  923. package/src/tools/ui-surface/definitions.ts +0 -43
  924. package/src/util/fs-watcher-error.ts +36 -0
  925. package/src/util/log-redact.ts +2 -4
  926. package/src/util/logs-db-path.ts +22 -0
  927. package/src/util/memory-db-path.ts +23 -0
  928. package/src/util/platform.ts +5 -0
  929. package/src/watcher/providers/gmail.ts +7 -2
  930. package/src/workflows/engine-integration.test.ts +1 -1
  931. package/src/workflows/engine.test.ts +1 -1
  932. package/src/workflows/engine.ts +22 -0
  933. package/src/workflows/fanout-load.test.ts +1 -1
  934. package/src/workflows/journal-store.test.ts +1 -1
  935. package/src/workflows/leaf-runner.test.ts +40 -1
  936. package/src/workflows/leaf-runner.ts +26 -1
  937. package/src/workspace/git-service.ts +144 -29
  938. package/src/workspace/migrations/109-swap-quality-profile-to-glm-5p2.ts +121 -0
  939. package/src/workspace/migrations/110-flip-balanced-profile-to-together.ts +82 -0
  940. package/src/workspace/migrations/registry.ts +4 -0
  941. package/src/workspace/migrations/runner.ts +32 -2
  942. package/src/__tests__/access-request-decision.test.ts +0 -375
  943. package/src/__tests__/guardian-grant-minting.test.ts +0 -607
  944. package/src/__tests__/plugin-source-watcher.test.ts +0 -302
  945. package/src/api/events/turn-profile-auto-routed.ts +0 -28
  946. package/src/daemon/__tests__/switch-inference-profile-tool.test.ts +0 -107
  947. package/src/daemon/plugin-source-watcher.ts +0 -278
  948. package/src/daemon/switch-inference-profile-tool.ts +0 -62
  949. package/src/memory/guardian-approvals.ts +0 -361
  950. package/src/memory/migrations/010-ext-conv-bindings-channel-chat-unique.ts +0 -66
  951. package/src/memory/migrations/038-actor-token-records.ts +0 -45
  952. package/src/memory/migrations/039-actor-refresh-token-records.ts +0 -57
  953. package/src/memory/migrations/103-complex-migrations.ts +0 -23
  954. package/src/memory/migrations/113-late-migrations.ts +0 -30
  955. package/src/memory/migrations/index.ts +0 -301
  956. package/src/runtime/routes/access-request-decision.ts +0 -297
  957. package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +0 -963
  958. package/src/runtime/routes/channel-guardian-routes.ts +0 -19
  959. package/src/runtime/routes/guardian-expiry-sweep.ts +0 -132
@@ -26,7 +26,7 @@ import { initializeDb } from "../../../memory/db-init.js";
26
26
  import { findById } from "../../../memory/invite-store.js";
27
27
  import { createA2AInvite, getA2AConfig } from "../config-a2a.js";
28
28
 
29
- initializeDb();
29
+ await initializeDb();
30
30
 
31
31
  function resetTables(): void {
32
32
  const sqlite = getSqlite();
@@ -28,7 +28,7 @@ import { getSqlite } from "../../../memory/db-connection.js";
28
28
  import { initializeDb } from "../../../memory/db-init.js";
29
29
  import { getA2AConfig, redeemA2AInvite } from "../config-a2a.js";
30
30
 
31
- initializeDb();
31
+ await initializeDb();
32
32
 
33
33
  function resetTables(): void {
34
34
  const sqlite = getSqlite();
@@ -24,7 +24,7 @@ import { getSqlite } from "../../../memory/db-connection.js";
24
24
  import { initializeDb } from "../../../memory/db-init.js";
25
25
  import { clearA2AConfig, getA2AConfig, setA2AConfig } from "../config-a2a.js";
26
26
 
27
- initializeDb();
27
+ await initializeDb();
28
28
 
29
29
  function resetTables(): void {
30
30
  const sqlite = getSqlite();
@@ -1,15 +1,18 @@
1
1
  import { createHash, randomBytes } from "node:crypto";
2
2
 
3
+ import { MarkChannelRevokedIpcResponseSchema } from "@vellumai/gateway-client/gateway-ipc-contracts";
4
+
3
5
  import { startVerificationCall } from "../../calls/call-domain.js";
4
6
  import type { ChannelId } from "../../channels/types.js";
7
+ import { emitContactChange } from "../../contacts/contact-events.js";
5
8
  import {
6
9
  findContactChannel,
7
10
  findGuardianForChannel,
8
11
  getChannelById,
9
12
  getContact,
10
13
  } from "../../contacts/contact-store.js";
11
- import { revokeMember } from "../../contacts/contacts-write.js";
12
14
  import type { ChannelStatus } from "../../contacts/types.js";
15
+ import { ipcCallPersistent } from "../../ipc/gateway-client.js";
13
16
  import { getBindingByChannelChat } from "../../memory/external-conversation-store.js";
14
17
  import { resolveGuardianName } from "../../prompts/user-reference.js";
15
18
  import { broadcastMessage } from "../../runtime/assistant-event-hub.js";
@@ -25,6 +28,7 @@ import {
25
28
  findActiveSession,
26
29
  getGuardianBinding,
27
30
  getPendingSession,
31
+ isGuardianBoundForChannel,
28
32
  revokeBinding,
29
33
  revokePendingSessions,
30
34
  updateSessionDelivery,
@@ -77,19 +81,18 @@ export function getReadinessService(): ChannelReadinessService {
77
81
  // Extracted business logic functions
78
82
  // ---------------------------------------------------------------------------
79
83
 
80
- export function createInboundChallenge(
84
+ export async function createInboundChallenge(
81
85
  channel?: ChannelId,
82
86
  rebind?: boolean,
83
87
  conversationId?: string,
84
- ): ChannelVerificationSessionResult {
85
- const resolvedAssistantId = DAEMON_INTERNAL_ASSISTANT_ID;
88
+ ): Promise<ChannelVerificationSessionResult> {
86
89
  const resolvedChannel = channel ?? "telegram";
87
90
 
88
- const existingBinding = getGuardianBinding(
89
- resolvedAssistantId,
90
- resolvedChannel,
91
- );
92
- if (existingBinding && !rebind) {
91
+ // Gateway-backed presence guard: block re-binding when a guardian is already
92
+ // bound. Null-list (gateway unreachable) is treated as bound, so a transient
93
+ // miss blocks rather than letting a second binding through.
94
+ const alreadyBound = await isGuardianBoundForChannel(resolvedChannel);
95
+ if (alreadyBound && !rebind) {
93
96
  return {
94
97
  success: false,
95
98
  error: "already_bound",
@@ -171,23 +174,21 @@ export function getVerificationStatus(
171
174
  // Revoke verification binding
172
175
  // ---------------------------------------------------------------------------
173
176
 
174
- export function revokeVerificationForChannel(
177
+ export async function revokeVerificationForChannel(
175
178
  channel?: ChannelId,
176
- ): ChannelVerificationSessionResult {
179
+ ): Promise<ChannelVerificationSessionResult> {
177
180
  const assistantId = DAEMON_INTERNAL_ASSISTANT_ID;
178
181
  const resolvedChannel = channel ?? "telegram";
179
182
 
180
- // Cancel any active outbound session so revoke is a complete teardown.
183
+ // Session teardown stays assistant-side — it is session state, not the ACL
184
+ // outcome. Cancel any active outbound session and pending challenges first
185
+ // (the macOS app uses action: "revoke" to cancel an in-flight challenge even
186
+ // before a binding exists, e.g. during verification setup).
181
187
  cancelOutbound({ channel: resolvedChannel });
182
-
183
- // Always revoke pending challenges first — the macOS app uses
184
- // action: "revoke" to cancel an in-flight challenge even before
185
- // a binding exists (e.g. during verification setup).
186
188
  revokePendingSessions(resolvedChannel);
187
189
 
188
- // Capture binding before revoking so we can revoke the guardian's
189
- // contact record — without this, the guardian would still pass
190
- // the ACL check after unbinding.
190
+ // Capture binding before revoking so we can downgrade the guardian's
191
+ // channel — without this, the guardian would still pass the ACL check.
191
192
  const bindingBeforeRevoke = getGuardianBinding(assistantId, resolvedChannel);
192
193
  if (!bindingBeforeRevoke) {
193
194
  return {
@@ -197,17 +198,15 @@ export function revokeVerificationForChannel(
197
198
  };
198
199
  }
199
200
 
200
- // Revoke the member BEFORE the guardian binding so that
201
- // revokeMember sees the channel as active/pending and sets the
202
- // correct revokedReason ("guardian_binding_revoked"). If the guardian binding
203
- // is revoked first, the channel is already marked revoked and the member
204
- // revocation becomes a no-op (wrong reason or skipped entirely).
205
201
  const contactResult = findContactChannel({
206
202
  channelType: resolvedChannel,
207
203
  address: bindingBeforeRevoke.guardianExternalUserId,
208
204
  externalChatId: bindingBeforeRevoke.guardianDeliveryChatId,
209
205
  });
210
206
 
207
+ // Relay the ACL downgrade to the gateway (source of truth). The gateway's
208
+ // mark_channel_revoked enforces the guardian guard and dual-writes the
209
+ // contact-channel status back to the assistant DB.
211
210
  if (contactResult) {
212
211
  const channelStatus: ChannelStatus = contactResult.channel.status;
213
212
  if (
@@ -215,10 +214,25 @@ export function revokeVerificationForChannel(
215
214
  channelStatus === "pending" ||
216
215
  channelStatus === "unverified"
217
216
  ) {
218
- revokeMember(contactResult.channel.id, "guardian_binding_revoked");
217
+ const result = await ipcCallPersistent("mark_channel_revoked", {
218
+ contactChannelId: contactResult.channel.id,
219
+ reason: "guardian_binding_revoked",
220
+ });
221
+ const parsed = MarkChannelRevokedIpcResponseSchema.parse(result);
222
+ if (!parsed.ok) {
223
+ throw new Error("mark_channel_revoked relay returned ok: false");
224
+ }
225
+ // The gateway dual-write already set the assistant channel to "revoked",
226
+ // so the later revokeGuardianBinding lookup (active-only) finds nothing
227
+ // and won't fire the invalidation. Emit it here so open client views
228
+ // stop showing the channel as active.
229
+ emitContactChange();
219
230
  }
220
231
  }
221
232
 
233
+ // The guardian binding is assistant-owned state the gateway relay does not
234
+ // manage; tear it down here. The contact-change invalidation is emitted
235
+ // explicitly above on relay success.
222
236
  revokeBinding(assistantId, resolvedChannel);
223
237
 
224
238
  return {
@@ -565,7 +579,7 @@ export async function handleChannelVerificationSession(
565
579
  ...publicResult,
566
580
  });
567
581
  } else {
568
- const result = createInboundChallenge(
582
+ const result = await createInboundChallenge(
569
583
  channel,
570
584
  msg.rebind,
571
585
  msg.conversationId,
@@ -590,7 +604,7 @@ export async function handleChannelVerificationSession(
590
604
  channel,
591
605
  });
592
606
  } else if (msg.action === "revoke") {
593
- const result = revokeVerificationForChannel(channel);
607
+ const result = await revokeVerificationForChannel(channel);
594
608
  broadcastMessage({
595
609
  type: "channel_verification_session_response",
596
610
  ...result,
@@ -1,9 +1,12 @@
1
1
  import { v4 as uuid } from "uuid";
2
2
 
3
+ import { peekAcpSessionManager } from "../../acp/index.js";
4
+ import { resolveCanonicalGuardianRequest } from "../../memory/canonical-guardian-store.js";
3
5
  import { clearAll, getConversation } from "../../memory/conversation-crud.js";
4
6
  import { resolveConversationId } from "../../memory/conversation-key-store.js";
5
7
  import { broadcastMessage } from "../../runtime/assistant-event-hub.js";
6
8
  import { resolveCapabilities } from "../../runtime/capabilities.js";
9
+ import * as pendingInteractions from "../../runtime/pending-interactions.js";
7
10
  import { getSubagentManager } from "../../subagent/index.js";
8
11
  import { createAbortReason } from "../../util/abort-reasons.js";
9
12
  import { UserError } from "../../util/errors.js";
@@ -106,6 +109,12 @@ export function cancelGeneration(conversationId: string): boolean {
106
109
  // being cancelled, so enqueuing synthetic messages would trigger
107
110
  // unwanted model activity after the user pressed stop.
108
111
  getSubagentManager().abortAllForParent(conversationId);
112
+ // Cancel any in-flight ACP agent sessions this conversation spawned, for the
113
+ // same reason: a backgrounded ACP prompt would otherwise keep running (and
114
+ // holding a child process) past the stop and, on completion, enqueue a
115
+ // follow-up message back into the conversation the user just cancelled. Peek
116
+ // the singleton so a conversation that never used ACP doesn't spin one up.
117
+ peekAcpSessionManager()?.cancelForParent(conversationId);
109
118
  // The processing flag is cleared by the in-flight turn's `finally`, not here.
110
119
  // Abort propagates into the provider call and tool execution (and is backed
111
120
  // by the agent loop's abort watchdog), so the turn reaches its `finally`
@@ -382,6 +391,81 @@ export function steerToMessage(
382
391
  return { steered: true };
383
392
  }
384
393
 
394
+ /**
395
+ * Supersede an open `ask_question` prompt when a new chat message is enqueued
396
+ * for the same conversation.
397
+ *
398
+ * A queued message while a clarification question is open means the user chose
399
+ * to move on rather than answer it. Steering to that message aborts the parked
400
+ * turn — which settles the open question via its turn-abort signal — repairs
401
+ * the dangling `tool_use`, and drains the message, instead of stranding it
402
+ * behind a prompt no one is going to answer. Only `ask_question` prompts
403
+ * (`kind: "question"`) trigger this; pending confirmations are handled
404
+ * separately by the enqueue path's auto-deny.
405
+ *
406
+ * Returns `true` when a parked question was found and a steer was issued.
407
+ */
408
+ export function steerOnEnqueuedMessageIfQuestionParked(
409
+ conversationId: string,
410
+ enqueuedRequestId: string,
411
+ ): boolean {
412
+ const hasParkedQuestion = pendingInteractions
413
+ .getByConversation(conversationId)
414
+ .some((interaction) => interaction.kind === "question");
415
+ if (!hasParkedQuestion) return false;
416
+ steerToMessage(conversationId, enqueuedRequestId);
417
+ return true;
418
+ }
419
+
420
+ /**
421
+ * Supersede interactions left pending by an in-flight turn when a new message
422
+ * is enqueued for a busy conversation. Centralized so every ingress path (the
423
+ * HTTP send handler and the CLI signal path) gets identical handling:
424
+ *
425
+ * 1. Auto-deny pending confirmations — notify the client and sync the
426
+ * canonical guardian record *before* clearing the prompter-owned
427
+ * confirmations, so a later guardian reply can't match a stale "pending"
428
+ * record and fail with `pending_interaction_not_found`.
429
+ * 2. Supersede a parked ask_question by steering to the enqueued message.
430
+ *
431
+ * Order matters: the steer aborts the turn, which denies the prompter's
432
+ * confirmations as a side effect, so the canonical/notification sync must run
433
+ * first. `removeByConversation` preserves `question` entries, so the parked
434
+ * question is still registered for the steer even after the confirmation sweep.
435
+ */
436
+ export function supersedePendingInteractionsOnEnqueue(
437
+ conversationId: string,
438
+ enqueuedRequestId: string,
439
+ ): void {
440
+ const conversation = findConversation(conversationId);
441
+ if (!conversation) return;
442
+
443
+ if (conversation.hasAnyPendingConfirmation()) {
444
+ for (const interaction of pendingInteractions.getByConversation(
445
+ conversationId,
446
+ )) {
447
+ if (interaction.kind === "confirmation") {
448
+ // sendToClient (wired to the SSE hub) delivers the denial to clients.
449
+ conversation.emitConfirmationStateChanged({
450
+ conversationId,
451
+ requestId: interaction.requestId,
452
+ state: "denied" as const,
453
+ source: "auto_deny" as const,
454
+ });
455
+ // Sync the canonical guardian record so stale "pending" rows aren't
456
+ // matched by later guardian reply routing.
457
+ resolveCanonicalGuardianRequest(interaction.requestId, "pending", {
458
+ status: "denied",
459
+ });
460
+ }
461
+ }
462
+ conversation.denyAllPendingConfirmations();
463
+ pendingInteractions.removeByConversation(conversationId);
464
+ }
465
+
466
+ steerOnEnqueuedMessageIfQuestionParked(conversationId, enqueuedRequestId);
467
+ }
468
+
385
469
  // ---------------------------------------------------------------------------
386
470
  // HTTP handler (delegates to shared logic)
387
471
  // ---------------------------------------------------------------------------
@@ -453,6 +453,13 @@ export function renderHistoryContent(
453
453
  // time filter in cleanAssistantContent and migration 222.
454
454
  if (isPlaceholderSentinelText(displayText)) continue;
455
455
  textParts.push(displayText);
456
+ // A ui_surface card's plain-text fallback (flagged `_surfaceFallback` by
457
+ // the approval-card builder) is represented by the adjacent surface for
458
+ // surface-capable clients. Keep it in the flat `.text` body above (CLI,
459
+ // search, channel replies, non-surface clients) but don't emit it as a
460
+ // text segment or content block, or those clients would render the card
461
+ // AND its fallback text.
462
+ if (block._surfaceFallback === true) continue;
456
463
  ensureSegment();
457
464
  currentSegmentParts.push(displayText);
458
465
  seenText = true;
@@ -58,6 +58,7 @@ import { initQdrantClient, resolveQdrantUrl } from "../memory/qdrant-client.js";
58
58
  import { QdrantManager } from "../memory/qdrant-manager.js";
59
59
  import { rotateToolInvocations } from "../memory/tool-usage-store.js";
60
60
  import { sweepConceptPageFrontmatter } from "../memory/v2/frontmatter-sweep.js";
61
+ import { spawnMemoryWorkerProcess } from "../memory/worker-control.js";
61
62
  import { emitNotificationSignal } from "../notifications/emit-signal.js";
62
63
  import { backfillManualTokenConnections } from "../oauth/manual-token-connection.js";
63
64
  import { seedOAuthProviders } from "../oauth/seed-providers.js";
@@ -121,6 +122,10 @@ import {
121
122
  startDiskPressureGuard,
122
123
  stopDiskPressureGuard,
123
124
  } from "./disk-pressure-guard.js";
125
+ import {
126
+ startEventLoopWatchdog,
127
+ stopEventLoopWatchdog,
128
+ } from "./event-loop-watchdog.js";
124
129
  import { initializePlugins } from "./external-plugins-bootstrap.js";
125
130
  import { backfillSlackInjectionTemplates } from "./handlers/config-slack-channel.js";
126
131
  import { installAssistantSymlink } from "./install-symlink.js";
@@ -410,7 +415,7 @@ export async function runDaemon(): Promise<void> {
410
415
  // remains reachable for health checks and diagnostics.
411
416
  let dbReady = false;
412
417
  try {
413
- initializeDb();
418
+ await initializeDb();
414
419
  dbReady = true;
415
420
  log.info("Daemon startup: DB initialized");
416
421
  } catch (err) {
@@ -432,8 +437,14 @@ export async function runDaemon(): Promise<void> {
432
437
  }
433
438
 
434
439
  if (dbReady) {
435
- await runWorkspaceMigrations(getWorkspaceDir(), WORKSPACE_MIGRATIONS);
436
- log.info("Daemon startup: workspace migrations complete");
440
+ const migrationSummary = await runWorkspaceMigrations(
441
+ getWorkspaceDir(),
442
+ WORKSPACE_MIGRATIONS,
443
+ );
444
+ log.info(
445
+ migrationSummary,
446
+ "Daemon startup: workspace migrations complete",
447
+ );
437
448
 
438
449
  // Seed canonical inference provider_connections and backfill any legacy
439
450
  // profiles that pre-date the connection field. Runs after workspace
@@ -816,6 +827,7 @@ export async function runDaemon(): Promise<void> {
816
827
  log.info("Daemon startup: DaemonServer started");
817
828
  startDiskPressureGuardForLifecycle();
818
829
  startOrphanReaper();
830
+ startEventLoopWatchdog();
819
831
 
820
832
  // Mutable refs for Qdrant and memory worker so background
821
833
  // init can assign them and the shutdown handler always sees the latest value.
@@ -955,8 +967,33 @@ export async function runDaemon(): Promise<void> {
955
967
  }
956
968
  }
957
969
 
958
- log.info("Daemon startup: starting memory worker");
959
- bgRefs.memoryWorker = startMemoryJobsWorker();
970
+ // `memory.worker.enabled` selects which worker implementation the daemon
971
+ // starts: the out-of-process worker (spawned like `assistant memory
972
+ // worker start`) or the in-process worker on the daemon's event loop.
973
+ // This flag only affects startup — shutdown stops whichever worker is
974
+ // actually running (see shutdown-handlers.ts).
975
+ if (config.memory.worker.enabled) {
976
+ log.info(
977
+ "Daemon startup: starting memory worker as a separate process",
978
+ );
979
+ try {
980
+ const { pid, alreadyRunning } = await spawnMemoryWorkerProcess();
981
+ log.info(
982
+ { pid, alreadyRunning },
983
+ alreadyRunning
984
+ ? "Memory worker process already running — reusing it"
985
+ : "Memory worker process started",
986
+ );
987
+ } catch (err) {
988
+ log.warn(
989
+ { err },
990
+ "Failed to start memory worker process — memory jobs will not be processed",
991
+ );
992
+ }
993
+ } else {
994
+ log.info("Daemon startup: starting memory worker");
995
+ bgRefs.memoryWorker = startMemoryJobsWorker();
996
+ }
960
997
 
961
998
  // Seed capability graph nodes (new memory graph system)
962
999
  try {
@@ -1416,6 +1453,7 @@ export async function runDaemon(): Promise<void> {
1416
1453
  stopGatewayFlagListener();
1417
1454
  stopDiskPressureGuardForLifecycle();
1418
1455
  stopOrphanReaper();
1456
+ stopEventLoopWatchdog();
1419
1457
  cleanupPidFile();
1420
1458
  },
1421
1459
  });
@@ -1431,6 +1469,7 @@ export async function runDaemon(): Promise<void> {
1431
1469
  log.error({ err }, "Daemon startup failed — cleaning up");
1432
1470
  stopDiskPressureGuardForLifecycle();
1433
1471
  stopOrphanReaper();
1472
+ stopEventLoopWatchdog();
1434
1473
  cleanupPidFileIfOwner(process.pid);
1435
1474
  throw err;
1436
1475
  }
@@ -59,6 +59,18 @@ function configWithV2(enabled: boolean): AssistantConfig {
59
59
  return { memory: { v2: { enabled } } } as unknown as AssistantConfig;
60
60
  }
61
61
 
62
+ /** Poll until `m` has been called at least `n` times, or `timeoutMs` elapses. */
63
+ async function waitForCalls(
64
+ m: { mock: { calls: unknown[] } },
65
+ n: number,
66
+ timeoutMs = 1000,
67
+ ): Promise<void> {
68
+ const start = Date.now();
69
+ while (m.mock.calls.length < n && Date.now() - start < timeoutMs) {
70
+ await new Promise((resolve) => setTimeout(resolve, 5));
71
+ }
72
+ }
73
+
62
74
  afterEach(() => {
63
75
  seedSkill.mockClear();
64
76
  seedCli.mockClear();
@@ -128,4 +140,64 @@ describe("maybeReseedCapabilitiesAfterManagedCredential", () => {
128
140
 
129
141
  expect(seedCli).toHaveBeenCalledTimes(1);
130
142
  });
143
+
144
+ test("enqueues the v3 maintain pass even when one catalog reseed rejects", async () => {
145
+ proxyState.prereqs = true;
146
+ v3State.live = true;
147
+ seedSkill.mockImplementationOnce(async () => {
148
+ throw new Error('Embedding backend "gemini" is not configured');
149
+ });
150
+
151
+ await maybeReseedCapabilitiesAfterManagedCredential(configWithV2(true));
152
+
153
+ // The CLI catalog seeded, so v3 must still rebuild its lanes — a single
154
+ // catalog failure cannot suppress the maintain pass.
155
+ expect(seedCli).toHaveBeenCalledTimes(1);
156
+ expect(enqueueJob).toHaveBeenCalledTimes(1);
157
+ expect(enqueueJob).toHaveBeenCalledWith("memory_v3_maintain", {});
158
+ });
159
+
160
+ test("enqueues the v3 maintain pass without blocking when a catalog reseed exceeds the timeout", async () => {
161
+ proxyState.prereqs = true;
162
+ v3State.live = true;
163
+ // Skill reseed never settles — mirrors the wedged getCatalog()/embed seen in
164
+ // the field. The CLI reseed completes normally.
165
+ seedSkill.mockImplementationOnce(() => new Promise<void>(() => {}));
166
+
167
+ await maybeReseedCapabilitiesAfterManagedCredential(configWithV2(true), {
168
+ reseedTimeoutMs: 20,
169
+ });
170
+
171
+ // An unbounded `Promise.all` barrier would hang here forever; the bounded
172
+ // barrier lets the CLI catalog's maintain pass enqueue regardless.
173
+ expect(seedCli).toHaveBeenCalledTimes(1);
174
+ expect(enqueueJob).toHaveBeenCalledTimes(1);
175
+ expect(enqueueJob).toHaveBeenCalledWith("memory_v3_maintain", {});
176
+ });
177
+
178
+ test("re-enqueues the v3 maintain pass when a straggler catalog finishes after the timeout", async () => {
179
+ proxyState.prereqs = true;
180
+ v3State.live = true;
181
+ let resolveSkill!: () => void;
182
+ seedSkill.mockImplementationOnce(
183
+ () =>
184
+ new Promise<void>((resolve) => {
185
+ resolveSkill = resolve;
186
+ }),
187
+ );
188
+
189
+ await maybeReseedCapabilitiesAfterManagedCredential(configWithV2(true), {
190
+ reseedTimeoutMs: 10,
191
+ });
192
+
193
+ // Post-barrier enqueue fires once even though the skill catalog is still
194
+ // embedding.
195
+ expect(enqueueJob).toHaveBeenCalledTimes(1);
196
+
197
+ // The straggler lands; maintain re-enqueues so its late capability rows are
198
+ // reconciled without waiting out the 6h backstop.
199
+ resolveSkill();
200
+ await waitForCalls(enqueueJob, 2);
201
+ expect(enqueueJob).toHaveBeenCalledTimes(2);
202
+ });
131
203
  });
@@ -49,6 +49,36 @@ export function maybeSeedMemoryV2CliCommands(config: AssistantConfig): void {
49
49
  .catch((err) => log.warn({ err }, "Failed to seed v2 CLI-command entries"));
50
50
  }
51
51
 
52
+ /**
53
+ * Default upper bound on how long
54
+ * {@link maybeReseedCapabilitiesAfterManagedCredential} waits for the capability
55
+ * reseeds before enqueuing the v3 maintain pass. The reseeds keep running
56
+ * detached past this bound — it only stops the barrier from waiting on a wedged
57
+ * catalog (a stalled `getCatalog()` or a managed-proxy embed that never
58
+ * returns). A straggler that finishes later re-enqueues maintain.
59
+ */
60
+ const RESEED_BARRIER_TIMEOUT_MS = 120_000;
61
+
62
+ /**
63
+ * Resolve to `true` if `p` settles within `ms`, or `false` if the timeout wins.
64
+ * Always clears the timer, so a `p` that settles first leaves no pending timer
65
+ * keeping the event loop (or a test) alive.
66
+ */
67
+ async function settledWithin(
68
+ p: Promise<unknown>,
69
+ ms: number,
70
+ ): Promise<boolean> {
71
+ let timer: ReturnType<typeof setTimeout> | undefined;
72
+ const timedOut = new Promise<false>((resolve) => {
73
+ timer = setTimeout(() => resolve(false), ms);
74
+ });
75
+ try {
76
+ return await Promise.race([p.then(() => true), timedOut]);
77
+ } finally {
78
+ if (timer) clearTimeout(timer);
79
+ }
80
+ }
81
+
52
82
  /**
53
83
  * Re-seed the v2 skill and CLI-command capability entries once a managed-proxy
54
84
  * credential lands, closing the first-boot race where the daemon's startup seed
@@ -83,9 +113,23 @@ export function maybeSeedMemoryV2CliCommands(config: AssistantConfig): void {
83
113
  * dense store and its lane-invalidation stage forces a rebuild against the now-
84
114
  * populated index, so v3 surfaces the skill/CLI pages within seconds instead of
85
115
  * waiting out the backstop.
116
+ *
117
+ * The maintain enqueue must NOT be gated on both catalogs settling. The two
118
+ * embeds are independent, and a single wedged catalog (a stalled `getCatalog()`
119
+ * or a managed-proxy embed that never returns) would otherwise block the v3 lane
120
+ * rebuild indefinitely, so the catalog that DID seed never reaches the selector.
121
+ * The barrier is therefore bounded by `reseedTimeoutMs`: maintain is enqueued
122
+ * once the barrier resolves (the pass is idempotent and reconciles whatever the
123
+ * page index currently holds), and a straggler catalog that finishes after the
124
+ * timeout re-enqueues maintain so its late rows are picked up without waiting out
125
+ * the backstop.
126
+ *
127
+ * `reseedTimeoutMs` is injectable for tests; production uses
128
+ * {@link RESEED_BARRIER_TIMEOUT_MS}.
86
129
  */
87
130
  export async function maybeReseedCapabilitiesAfterManagedCredential(
88
131
  config: AssistantConfig,
132
+ opts: { reseedTimeoutMs?: number } = {},
89
133
  ): Promise<void> {
90
134
  if (!config.memory.v2.enabled) return;
91
135
 
@@ -115,35 +159,59 @@ export async function maybeReseedCapabilitiesAfterManagedCredential(
115
159
  ],
116
160
  ];
117
161
 
118
- await Promise.all(
119
- catalogs.map(async ([label, seed]) => {
120
- try {
121
- await seed();
162
+ // Each reseed is contained so one catalog's embed failure (or hang) never
163
+ // rejects the caller or aborts the other. Started here but not awaited as a
164
+ // single barrier — the bounded wait below decides when to stop waiting.
165
+ const reseeds = catalogs.map(([label, seed]) =>
166
+ seed().then(
167
+ () =>
122
168
  log.info(
123
169
  `Memory v2 ${label} entries seeded after managed proxy credential update`,
124
- );
125
- } catch (err) {
170
+ ),
171
+ (err: unknown) =>
126
172
  log.warn(
127
173
  { err },
128
174
  `Failed to seed v2 ${label} entries after managed proxy credential update`,
129
- );
130
- }
131
- }),
175
+ ),
176
+ ),
132
177
  );
133
178
 
134
- // The stores (and the page index) are now populated; when v3 is live, kick a
135
- // maintain pass so it embeds the capability rows into `memory_v3_sections` and
136
- // invalidates its lanes immediately rather than waiting out the 6h backstop.
179
+ // When v3 is live, a maintain pass embeds the freshly-seeded capability rows
180
+ // into `memory_v3_sections` and invalidates the lanes so v3 surfaces the
181
+ // skill/CLI pages within seconds instead of waiting out the 6h backstop.
182
+ // Resolve the gate + enqueuer once and reuse for the post-barrier enqueue and
183
+ // the straggler re-enqueue below.
137
184
  const { isMemoryV3Live } = await import("../config/memory-v3-gate.js");
138
- if (!isMemoryV3Live(config)) return;
139
- try {
140
- const { enqueueMemoryJob } = await import("../memory/jobs-store.js");
141
- enqueueMemoryJob("memory_v3_maintain", {});
142
- } catch (err) {
185
+ const v3Live = isMemoryV3Live(config);
186
+ const enqueueMaintain = async (): Promise<void> => {
187
+ if (!v3Live) return;
188
+ try {
189
+ const { enqueueMemoryJob } = await import("../memory/jobs-store.js");
190
+ enqueueMemoryJob("memory_v3_maintain", {});
191
+ } catch (err) {
192
+ log.warn(
193
+ { err },
194
+ "Failed to enqueue memory_v3_maintain after managed proxy credential update",
195
+ );
196
+ }
197
+ };
198
+
199
+ // Bound the barrier so a wedged catalog can't block the maintain enqueue
200
+ // indefinitely; the reseeds keep running detached past the timeout.
201
+ const timeoutMs = opts.reseedTimeoutMs ?? RESEED_BARRIER_TIMEOUT_MS;
202
+ const allReseeds = Promise.allSettled(reseeds);
203
+ const settledInTime = await settledWithin(allReseeds, timeoutMs);
204
+
205
+ await enqueueMaintain();
206
+
207
+ if (!settledInTime) {
143
208
  log.warn(
144
- { err },
145
- "Failed to enqueue memory_v3_maintain after managed proxy credential update",
209
+ { timeoutMs },
210
+ "Capability reseed still running after the barrier timeout — enqueued v3 maintain now; will re-enqueue when the straggler catalog finishes",
146
211
  );
212
+ // The straggler is still embedding; re-enqueue maintain once it lands so its
213
+ // late capability rows are reconciled without waiting out the 6h backstop.
214
+ void allReseeds.then(() => enqueueMaintain());
147
215
  }
148
216
  }
149
217
 
@@ -23,12 +23,6 @@ export interface ContactsInviteRequest {
23
23
  externalChatId?: string;
24
24
  /** Filter by status (list only). */
25
25
  status?: string;
26
- /** Invitee's first name (voice invite create only). */
27
- friendName?: string;
28
- /** Contact display name for personalizing invite instructions (create only). */
29
- contactName?: string;
30
- /** Guardian's first name (voice invite create only). */
31
- guardianName?: string;
32
26
  }
33
27
 
34
28
  export interface AssistantInboxEscalationRequest {
@@ -22,7 +22,6 @@ import type {
22
22
  TraceEvent,
23
23
  TraceEventKind,
24
24
  } from "../../api/events/trace-event.js";
25
- import type { TurnProfileAutoRoutedEvent } from "../../api/events/turn-profile-auto-routed.js";
26
25
  import type { UserMessageEchoEvent } from "../../api/events/user-message-echo.js";
27
26
  import type { ChannelId, InterfaceId } from "../../channels/types.js";
28
27
  import type { CommandIntent, UserMessageAttachment } from "./shared.js";
@@ -122,8 +121,6 @@ export interface ConfirmationStateChanged {
122
121
  toolUseId?: string;
123
122
  }
124
123
 
125
- export type { TurnProfileAutoRoutedEvent };
126
-
127
124
  /**
128
125
  * Broadcast to clients when a conversation's inference-profile override
129
126
  * changes. `profile` is the profile name (a key in `llm.profiles`) or
@@ -172,6 +169,5 @@ export type _MessagesServerMessages =
172
169
  | TraceEvent
173
170
  | ConfirmationStateChanged
174
171
  | AssistantActivityStateEvent
175
- | TurnProfileAutoRoutedEvent
176
172
  | ConversationInferenceProfileUpdated
177
173
  | InteractionResolvedEvent;