@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
@@ -1,11 +1,14 @@
1
1
  import { getConfig } from "../config/loader.js";
2
+ import { isDispatchableProfile } from "../config/profile-dispatchability.js";
2
3
  import { orderProfileKeys } from "../config/profile-order.js";
3
4
  import type { ModelProfileInfo } from "./types.js";
4
5
 
5
6
  /**
6
7
  * List the workspace inference profiles a plugin can route to, in the order the
7
8
  * `/model` picker presents them (`llm.profileOrder` first, then the rest
8
- * alphabetically). Disabled profiles are included and flagged via
9
+ * alphabetically). Metadata-only entries without a provider, model, or mix are
10
+ * not routing targets, so plugins never see them. Disabled profiles are
11
+ * included and flagged via
9
12
  * {@link ModelProfileInfo.isDisabled}; weighted "mix" profiles are included and
10
13
  * flagged via {@link ModelProfileInfo.isMix}, since a mix is itself a valid
11
14
  * routing target (it resolves to one constituent per conversation).
@@ -20,6 +23,7 @@ export function getModelProfiles(): ModelProfileInfo[] {
20
23
  for (const key of orderProfileKeys(profiles, llm.profileOrder)) {
21
24
  const entry = profiles[key];
22
25
  if (entry == null) continue;
26
+ if (!isDispatchableProfile(entry)) continue;
23
27
  result.push({
24
28
  key,
25
29
  label: entry.label ?? key,
@@ -0,0 +1,173 @@
1
+ import { beforeEach, describe, expect, mock, test } from "bun:test";
2
+
3
+ import type { ModelProfileInfo } from "./types.js";
4
+
5
+ // ─── Mock config ────────────────────────────────────────────────────────────
6
+
7
+ interface MockProfileEntry {
8
+ provider?: string;
9
+ model?: string;
10
+ status?: string;
11
+ mix?: Array<{ profile: string; weight: number }>;
12
+ }
13
+
14
+ let mockProfiles: Record<string, MockProfileEntry> = {};
15
+ let mockDefault: { provider?: string; model?: string } = {
16
+ provider: "anthropic",
17
+ model: "claude-opus-4-6",
18
+ };
19
+
20
+ const realConfigLoader = await import("../config/loader.js");
21
+
22
+ mock.module("../config/loader.js", () => ({
23
+ ...realConfigLoader,
24
+ getConfig: () => ({
25
+ llm: {
26
+ profiles: mockProfiles,
27
+ default: mockDefault,
28
+ },
29
+ }),
30
+ getConfigReadOnly: () => ({
31
+ llm: {
32
+ profiles: mockProfiles,
33
+ default: mockDefault,
34
+ },
35
+ }),
36
+ }));
37
+
38
+ // Real model catalog — don't mock it, the test exercises real catalog lookups.
39
+ const { doesSupportVision } = await import("./vision-support.js");
40
+
41
+ // ─── Helpers ────────────────────────────────────────────────────────────────
42
+
43
+ function profile(key: string): ModelProfileInfo {
44
+ return {
45
+ key,
46
+ label: key,
47
+ description: null,
48
+ isActive: false,
49
+ isDisabled: false,
50
+ isMix: false,
51
+ };
52
+ }
53
+
54
+ function setMockConfig(
55
+ profiles: Record<string, MockProfileEntry>,
56
+ def: { provider?: string; model?: string } = {},
57
+ ) {
58
+ mockProfiles = profiles;
59
+ mockDefault = { provider: "anthropic", model: "claude-opus-4-6", ...def };
60
+ }
61
+
62
+ beforeEach(() => {
63
+ mockProfiles = {};
64
+ mockDefault = { provider: "anthropic", model: "claude-opus-4-6" };
65
+ });
66
+
67
+ // ─── Tests ──────────────────────────────────────────────────────────────────
68
+
69
+ describe("doesSupportVision", () => {
70
+ test("returns true for a known vision-capable model", () => {
71
+ setMockConfig({
72
+ "vision-profile": { provider: "anthropic", model: "claude-opus-4-6" },
73
+ });
74
+ expect(doesSupportVision(profile("vision-profile"))).toBe(true);
75
+ });
76
+
77
+ test("returns false for a known text-only model", () => {
78
+ setMockConfig({
79
+ "text-profile": {
80
+ provider: "fireworks",
81
+ model: "accounts/fireworks/models/glm-5p2",
82
+ },
83
+ });
84
+ expect(doesSupportVision(profile("text-profile"))).toBe(false);
85
+ });
86
+
87
+ test("returns false for an unknown profile key not in config", () => {
88
+ setMockConfig({});
89
+ expect(doesSupportVision(profile("nonexistent"))).toBe(false);
90
+ });
91
+
92
+ test("returns false for an unknown provider/model pair", () => {
93
+ setMockConfig({
94
+ "unknown-model": { provider: "unknown-provider", model: "unknown-model" },
95
+ });
96
+ expect(doesSupportVision(profile("unknown-model"))).toBe(false);
97
+ });
98
+
99
+ test("inherits provider from llm.default when profile only sets model", () => {
100
+ setMockConfig(
101
+ { "model-only": { model: "claude-opus-4-6" } },
102
+ { provider: "anthropic" },
103
+ );
104
+ expect(doesSupportVision(profile("model-only"))).toBe(true);
105
+ });
106
+
107
+ test("inherits model from llm.default when profile only sets provider", () => {
108
+ // llm.default → anthropic/claude-opus-4-6 (vision-capable)
109
+ setMockConfig({ "provider-only": { provider: "anthropic" } });
110
+ expect(doesSupportVision(profile("provider-only"))).toBe(true);
111
+ });
112
+
113
+ test("mix profile returns true when any arm supports vision", () => {
114
+ setMockConfig({
115
+ "mix-profile": {
116
+ mix: [
117
+ { profile: "text-arm", weight: 0.5 },
118
+ { profile: "vision-arm", weight: 0.5 },
119
+ ],
120
+ },
121
+ "text-arm": {
122
+ provider: "fireworks",
123
+ model: "accounts/fireworks/models/glm-5p2",
124
+ },
125
+ "vision-arm": { provider: "anthropic", model: "claude-opus-4-6" },
126
+ });
127
+ expect(doesSupportVision(profile("mix-profile"))).toBe(true);
128
+ });
129
+
130
+ test("mix profile returns false when all arms are text-only", () => {
131
+ setMockConfig({
132
+ "mix-profile": {
133
+ mix: [
134
+ { profile: "text-arm-1", weight: 0.5 },
135
+ { profile: "text-arm-2", weight: 0.5 },
136
+ ],
137
+ },
138
+ "text-arm-1": {
139
+ provider: "fireworks",
140
+ model: "accounts/fireworks/models/glm-5p2",
141
+ },
142
+ "text-arm-2": {
143
+ provider: "fireworks",
144
+ model: "accounts/fireworks/models/glm-5p2",
145
+ },
146
+ });
147
+ expect(doesSupportVision(profile("mix-profile"))).toBe(false);
148
+ });
149
+ });
150
+
151
+ describe("doesSupportVision with a bare string", () => {
152
+ test("returns true for a known vision-capable model id", () => {
153
+ expect(doesSupportVision("claude-opus-4-6")).toBe(true);
154
+ });
155
+
156
+ test("returns false for a known text-only model id", () => {
157
+ expect(doesSupportVision("accounts/fireworks/models/glm-5p2")).toBe(false);
158
+ });
159
+
160
+ test("falls back to resolving the string as a profile key", () => {
161
+ // "vision-profile" is not a catalog model id, so it resolves as a profile
162
+ // key → anthropic/claude-opus-4-6 (vision-capable).
163
+ setMockConfig({
164
+ "vision-profile": { provider: "anthropic", model: "claude-opus-4-6" },
165
+ });
166
+ expect(doesSupportVision("vision-profile")).toBe(true);
167
+ });
168
+
169
+ test("returns false for a string that is neither a model nor a profile", () => {
170
+ setMockConfig({});
171
+ expect(doesSupportVision("some-unknown-string")).toBe(false);
172
+ });
173
+ });
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Vision-support resolution for plugin consumption.
3
+ *
4
+ * A plugin that gates image processing on vision capability (e.g. an
5
+ * image-to-text fallback for text-only models) calls {@link doesSupportVision}
6
+ * instead of hardcoding model names. One entry point serves both shapes a
7
+ * caller might hold:
8
+ * - a concrete model id (e.g. the provider-reported model that just ran), and
9
+ * - a profile — either a {@link ModelProfileInfo} or a bare profile key —
10
+ * resolved through `llm.profiles` to an effective `(provider, model)`.
11
+ *
12
+ * A bare string is tried as a model id first and then as a profile key, so the
13
+ * two callers share one function. Resolution returns `false` when nothing
14
+ * resolves (rather than failing open): a consumer gating an image→text
15
+ * fallback wants an unknown model treated as "can't show images" — caption it —
16
+ * over silently shipping a raw image to a provider that may reject it.
17
+ */
18
+
19
+ import { getConfig } from "../config/loader.js";
20
+ import {
21
+ getCatalogProviderForModel,
22
+ PROVIDER_CATALOG,
23
+ } from "../providers/model-catalog.js";
24
+ import type { ModelProfileInfo } from "./types.js";
25
+
26
+ /**
27
+ * Whether the given model or profile can process image input.
28
+ *
29
+ * `modelOrProfile` may be a concrete model id, a profile key, or a
30
+ * {@link ModelProfileInfo}. A bare string is resolved as a model id first and,
31
+ * failing that, as a profile key. Returns `false` when nothing resolves.
32
+ */
33
+ export function doesSupportVision(
34
+ modelOrProfile: ModelProfileInfo | string,
35
+ ): boolean {
36
+ if (typeof modelOrProfile === "string") {
37
+ // Concrete model id first, then fall back to treating it as a profile key.
38
+ return (
39
+ modelVision(modelOrProfile) ?? profileVision(modelOrProfile) ?? false
40
+ );
41
+ }
42
+ return profileVision(modelOrProfile.key) ?? false;
43
+ }
44
+
45
+ /**
46
+ * Catalog vision flag for a concrete model id, or `undefined` when the catalog
47
+ * doesn't know the model. The same model id carries the same capability under
48
+ * every provider that offers it, so the first catalog match wins.
49
+ */
50
+ function modelVision(model: string): boolean | undefined {
51
+ for (const provider of PROVIDER_CATALOG) {
52
+ const catalogModel = provider.models.find((m) => m.id === model);
53
+ if (catalogModel != null) return catalogModel.supportsVision ?? false;
54
+ }
55
+ return undefined;
56
+ }
57
+
58
+ /**
59
+ * Resolve a profile key through `llm.profiles` to its vision capability, or
60
+ * `undefined` when the key is unknown or resolves to a model the catalog
61
+ * doesn't know. A mix profile resolves to `true` if any arm supports vision
62
+ * (the mix can route to it) and `false` only once every arm is a known
63
+ * text-only model.
64
+ */
65
+ function profileVision(profileKey: string): boolean | undefined {
66
+ const { llm } = getConfig();
67
+ const entry = llm.profiles[profileKey];
68
+ if (entry == null) return undefined;
69
+
70
+ if (entry.mix != null) {
71
+ let sawUnknown = false;
72
+ for (const arm of entry.mix) {
73
+ const armEntry = llm.profiles[arm.profile];
74
+ const armVision =
75
+ armEntry == null ? undefined : resolveEntryVision(armEntry, llm);
76
+ if (armVision === true) return true;
77
+ if (armVision == null) sawUnknown = true;
78
+ }
79
+ return sawUnknown ? undefined : false;
80
+ }
81
+
82
+ return resolveEntryVision(entry, llm);
83
+ }
84
+
85
+ /**
86
+ * Resolve whether a concrete (non-mix) profile entry supports vision by
87
+ * merging its fields over `llm.default` and inferring the provider when only
88
+ * the model is set. Returns `undefined` when the effective `(provider, model)`
89
+ * can't be determined or isn't in the catalog.
90
+ */
91
+ function resolveEntryVision(
92
+ entry: { provider?: string; model?: string },
93
+ llm: { default?: { provider?: string; model?: string } },
94
+ ): boolean | undefined {
95
+ const provider = entry.provider ?? llm.default?.provider;
96
+ const model = entry.model ?? llm.default?.model;
97
+
98
+ // Infer provider from model when missing (mirrors the resolver's
99
+ // withImpliedProviderForKnownModel).
100
+ const effectiveProvider =
101
+ provider ??
102
+ (typeof model === "string" ? getCatalogProviderForModel(model) : undefined);
103
+
104
+ if (typeof effectiveProvider !== "string" || typeof model !== "string") {
105
+ return undefined;
106
+ }
107
+
108
+ const catalogProvider = PROVIDER_CATALOG.find(
109
+ (p) => p.id === effectiveProvider,
110
+ );
111
+ const catalogModel = catalogProvider?.models.find((m) => m.id === model);
112
+ return catalogModel?.supportsVision;
113
+ }
@@ -8,12 +8,19 @@ let sendMessageArgs: Record<string, unknown> | null = null;
8
8
  let responseText = "Use a channel-based worker pool; drain on shutdown.";
9
9
  let sendMessageError: Error | null = null;
10
10
  let providerResolves = true;
11
+ let streamDeltas: string[] = [];
11
12
 
12
13
  const fakeProvider = {
13
14
  name: "mock-advisor-provider",
14
15
  async sendMessage(messages: unknown, options: unknown) {
15
16
  sendMessageArgs = { messages, options } as Record<string, unknown>;
16
17
  if (sendMessageError) throw sendMessageError;
18
+ const onEvent = (
19
+ options as { onEvent?: (e: { type: string; text?: string }) => void }
20
+ ).onEvent;
21
+ if (onEvent) {
22
+ for (const text of streamDeltas) onEvent({ type: "text_delta", text });
23
+ }
17
24
  return {
18
25
  content: [{ type: "text", text: responseText }],
19
26
  model: "mock-model",
@@ -49,6 +56,7 @@ beforeEach(() => {
49
56
  responseText = "Use a channel-based worker pool; drain on shutdown.";
50
57
  sendMessageError = null;
51
58
  providerResolves = true;
59
+ streamDeltas = [];
52
60
  resetAdvisorStateForTests();
53
61
  });
54
62
 
@@ -123,6 +131,29 @@ describe("consultAdvisor", () => {
123
131
  });
124
132
  expect(advice).toContain("no guidance");
125
133
  });
134
+
135
+ test("streams the model's text deltas to `onText` as it generates", async () => {
136
+ streamDeltas = ["Use a ", "channel-based ", "worker pool."];
137
+ const chunks: string[] = [];
138
+
139
+ const advice = await consultAdvisor({
140
+ systemPrompt: null,
141
+ messages: [userMsg("hi")],
142
+ onText: (c) => chunks.push(c),
143
+ });
144
+
145
+ // Each visible delta is forwarded live...
146
+ expect(chunks).toEqual(["Use a ", "channel-based ", "worker pool."]);
147
+ // ...and the complete guidance is still returned.
148
+ expect(advice).toBe(responseText);
149
+ });
150
+
151
+ test("registers no `onEvent` sink when `onText` is absent", async () => {
152
+ streamDeltas = ["x"];
153
+ await consultAdvisor({ systemPrompt: null, messages: [userMsg("hi")] });
154
+ const options = sendMessageArgs?.options as { onEvent?: unknown };
155
+ expect(options.onEvent).toBeUndefined();
156
+ });
126
157
  });
127
158
 
128
159
  describe("advisor tool.execute", () => {
@@ -150,4 +181,19 @@ describe("advisor tool.execute", () => {
150
181
  expect(result?.content).toContain("advisor unavailable");
151
182
  expect(result?.content).toContain("kaboom");
152
183
  });
184
+
185
+ test("streams the consult live via `ctx.onOutput`", async () => {
186
+ recordMessages("c3", [userMsg("hi")]);
187
+ streamDeltas = ["plan: ", "do X"];
188
+ const out: string[] = [];
189
+
190
+ const result = await advisorTool.execute?.({}, {
191
+ conversationId: "c3",
192
+ onOutput: (c: string) => out.push(c),
193
+ } as never);
194
+
195
+ expect(out).toEqual(["plan: ", "do X"]);
196
+ expect(result?.isError).toBe(false);
197
+ expect(result?.content).toBe(responseText);
198
+ });
153
199
  });
@@ -16,7 +16,7 @@ import {
16
16
  getConfiguredProvider,
17
17
  userMessage,
18
18
  } from "../../../providers/provider-send-message.js";
19
- import type { Message } from "../../../providers/types.js";
19
+ import type { Message, ProviderEvent } from "../../../providers/types.js";
20
20
  import { ADVISOR_CONFIG } from "./config.js";
21
21
  import { advisorRequestText, buildAdvisorSystem } from "./steering.js";
22
22
  import { toAdvisorMessages } from "./transcript.js";
@@ -46,6 +46,14 @@ export interface ConsultParams {
46
46
  systemPrompt: string | null;
47
47
  messages: ReadonlyArray<Message>;
48
48
  signal?: AbortSignal;
49
+ /**
50
+ * Optional sink for the advisor's generated text as it streams. Each call
51
+ * receives an incremental chunk (a provider `text_delta`). Wiring this to the
52
+ * tool's `onOutput` surfaces the consult live as `tool_output_chunk` while the
53
+ * advisor model is still generating; the complete guidance is still returned
54
+ * as the resolved string.
55
+ */
56
+ onText?: (chunk: string) => void;
49
57
  }
50
58
 
51
59
  /** Combine the caller's signal with a consult timeout. */
@@ -78,8 +86,17 @@ export async function consultAdvisor(params: ConsultParams): Promise<string> {
78
86
  // than an advisor-specific cap.
79
87
  const messages: Message[] = [...history, userMessage(advisorRequestText())];
80
88
 
89
+ const { onText } = params;
81
90
  const response = await provider.sendMessage(messages, {
82
91
  systemPrompt: buildAdvisorSystem(params.systemPrompt),
92
+ // Forward the model's visible text deltas to the caller's sink so the
93
+ // guidance streams live. Other event types (thinking, usage) ride their
94
+ // own channels and are intentionally not surfaced as tool output.
95
+ onEvent: onText
96
+ ? (event: ProviderEvent) => {
97
+ if (event.type === "text_delta" && event.text) onText(event.text);
98
+ }
99
+ : undefined,
83
100
  config: {
84
101
  callSite: ADVISOR_CALL_SITE,
85
102
  ...override,
@@ -52,6 +52,10 @@ const advisorTool: ToolDefinition = {
52
52
  systemPrompt: capture?.systemPrompt ?? null,
53
53
  messages: capture?.messages ?? [],
54
54
  signal: ctx.signal,
55
+ // Stream the advisor's guidance live as it generates: each delta is
56
+ // surfaced as a `tool_output_chunk` for this tool call and rendered in
57
+ // the tool-detail drawer. The complete text is still returned below.
58
+ onText: (chunk) => ctx.onOutput?.(chunk),
55
59
  });
56
60
  return { content: advice, isError: false };
57
61
  } catch (err) {
@@ -28,6 +28,7 @@ import {
28
28
  estimatePromptTokens,
29
29
  estimateToolsTokens,
30
30
  } from "../../../context/token-estimator.js";
31
+ import { findConversationOrSubagent } from "../../../daemon/conversation-registry.js";
31
32
  import type { InjectionMode } from "../../../daemon/conversation-runtime-assembly.js";
32
33
  import type {
33
34
  ContentBlock,
@@ -220,7 +221,6 @@ export interface OverflowRecoveryOptions {
220
221
 
221
222
  export interface ContextWindowManagerOptions {
222
223
  provider: Provider;
223
- systemPrompt: string | (() => string);
224
224
  config: ContextWindowConfig;
225
225
  /** Pre-computed tool token budget to include in all estimations. */
226
226
  toolTokenBudget?: number;
@@ -286,7 +286,6 @@ function extractText(content: ContentBlock[]): string {
286
286
 
287
287
  export class ContextWindowManager {
288
288
  private readonly provider: Provider;
289
- private readonly _systemPrompt: string | (() => string);
290
289
  private config: ContextWindowConfig;
291
290
  private readonly toolTokenBudget: number;
292
291
  private readonly conversationId: string | undefined;
@@ -300,7 +299,6 @@ export class ContextWindowManager {
300
299
  * rows. Decremented after a successful compaction.
301
300
  */
302
301
  private _nonPersistedPrefixCount = 0;
303
- private _resolvedSystemPrompt: string | undefined;
304
302
  /**
305
303
  * Reducer state for the in-progress overflow-recovery ladder, held across
306
304
  * the successive {@link reduceOverflowOneRung} calls of a single turn so the
@@ -324,7 +322,6 @@ export class ContextWindowManager {
324
322
 
325
323
  constructor(options: ContextWindowManagerOptions) {
326
324
  this.provider = options.provider;
327
- this._systemPrompt = options.systemPrompt;
328
325
  this.config = options.config;
329
326
  this.toolTokenBudget = options.toolTokenBudget ?? 0;
330
327
  this.conversationId = options.conversationId;
@@ -365,18 +362,8 @@ export class ContextWindowManager {
365
362
  }
366
363
 
367
364
  private get systemPrompt(): string {
368
- if (this._resolvedSystemPrompt !== undefined)
369
- return this._resolvedSystemPrompt;
370
- const resolved =
371
- typeof this._systemPrompt === "function"
372
- ? this._systemPrompt()
373
- : this._systemPrompt;
374
- this._resolvedSystemPrompt = resolved;
375
- return resolved;
376
- }
377
-
378
- private clearSystemPromptCache(): void {
379
- this._resolvedSystemPrompt = undefined;
365
+ const conversation = findConversationOrSubagent(this.conversationId);
366
+ return conversation?.systemPrompt ?? "";
380
367
  }
381
368
 
382
369
  private resolveCompactionConfig(): CompactionConfig {
@@ -393,14 +380,24 @@ export class ContextWindowManager {
393
380
  * turn re-resolves it (the system prompt is lazy and may have changed).
394
381
  */
395
382
  estimateInputTokens(messages: Message[]): number {
396
- try {
397
- return estimatePromptTokens(messages, this.systemPrompt, {
398
- providerName: this.estimationProviderName,
399
- toolTokenBudget: this.toolTokenBudget,
400
- });
401
- } finally {
402
- this.clearSystemPromptCache();
403
- }
383
+ return estimatePromptTokens(messages, this.systemPrompt, {
384
+ providerName: this.estimationProviderName,
385
+ toolTokenBudget: this.toolTokenBudget,
386
+ });
387
+ }
388
+
389
+ /**
390
+ * The resolved system prompt and tool definitions for the current turn —
391
+ * the same composition {@link estimateInputTokens} sizes against. Exposed as
392
+ * plain data so the daemon can run an out-of-band provider `count_tokens`
393
+ * request without re-deriving the prompt; the count call itself lives on the
394
+ * daemon, not this plugin.
395
+ */
396
+ get tokenCountInputs(): {
397
+ systemPrompt: string;
398
+ tools: ToolDefinition[] | undefined;
399
+ } {
400
+ return { systemPrompt: this.systemPrompt, tools: this.resolveTools?.() };
404
401
  }
405
402
 
406
403
  /**
@@ -412,18 +409,14 @@ export class ContextWindowManager {
412
409
  shouldCompact(messages: Message[]): ShouldCompactResult {
413
410
  const compaction = this.resolveCompactionConfig();
414
411
  if (!compaction.enabled) return { needed: false, estimatedTokens: 0 };
415
- try {
416
- const estimated = estimatePromptTokens(messages, this.systemPrompt, {
417
- providerName: this.estimationProviderName,
418
- toolTokenBudget: this.toolTokenBudget,
419
- });
420
- const threshold = Math.floor(
421
- this.config.maxInputTokens * compaction.autoThreshold,
422
- );
423
- return { needed: estimated >= threshold, estimatedTokens: estimated };
424
- } finally {
425
- this.clearSystemPromptCache();
426
- }
412
+ const estimated = estimatePromptTokens(messages, this.systemPrompt, {
413
+ providerName: this.estimationProviderName,
414
+ toolTokenBudget: this.toolTokenBudget,
415
+ });
416
+ const threshold = Math.floor(
417
+ this.config.maxInputTokens * compaction.autoThreshold,
418
+ );
419
+ return { needed: estimated >= threshold, estimatedTokens: estimated };
427
420
  }
428
421
 
429
422
  async maybeCompact(
@@ -431,11 +424,7 @@ export class ContextWindowManager {
431
424
  signal?: AbortSignal,
432
425
  options?: ContextWindowCompactOptions,
433
426
  ): Promise<ContextWindowResult> {
434
- try {
435
- return await this._maybeCompact(messages, signal, options);
436
- } finally {
437
- this.clearSystemPromptCache();
438
- }
427
+ return await this._maybeCompact(messages, signal, options);
439
428
  }
440
429
 
441
430
  /**
@@ -452,11 +441,7 @@ export class ContextWindowManager {
452
441
  options: OverflowRecoveryRungOptions,
453
442
  signal?: AbortSignal,
454
443
  ): Promise<ReducerStepResult> {
455
- try {
456
- return await this._reduceOverflowOneRung(messages, options, signal);
457
- } finally {
458
- this.clearSystemPromptCache();
459
- }
444
+ return await this._reduceOverflowOneRung(messages, options, signal);
460
445
  }
461
446
 
462
447
  /**
@@ -810,24 +795,20 @@ export class ContextWindowManager {
810
795
  "ContextWindowManager has no conversationId — cannot run emergency compaction",
811
796
  );
812
797
  }
813
- try {
814
- return await runEmergencyCompaction({
815
- conversationId: this.conversationId,
816
- messages,
817
- provider: this.provider,
818
- systemPrompt: this.systemPrompt,
819
- tools: undefined,
820
- compaction: this.resolveCompactionConfig(),
821
- maxInputTokens: this.config.maxInputTokens,
822
- previousEstimatedInputTokens: options.previousEstimatedInputTokens,
823
- force: true,
824
- signal,
825
- overrideProfile: options.overrideProfile ?? null,
826
- nonPersistedPrefixCount: this._nonPersistedPrefixCount,
827
- });
828
- } finally {
829
- this.clearSystemPromptCache();
830
- }
798
+ return await runEmergencyCompaction({
799
+ conversationId: this.conversationId,
800
+ messages,
801
+ provider: this.provider,
802
+ systemPrompt: this.systemPrompt,
803
+ tools: undefined,
804
+ compaction: this.resolveCompactionConfig(),
805
+ maxInputTokens: this.config.maxInputTokens,
806
+ previousEstimatedInputTokens: options.previousEstimatedInputTokens,
807
+ force: true,
808
+ signal,
809
+ overrideProfile: options.overrideProfile ?? null,
810
+ nonPersistedPrefixCount: this._nonPersistedPrefixCount,
811
+ });
831
812
  }
832
813
 
833
814
  /**
@@ -16,10 +16,12 @@
16
16
  * at least one prior assistant turn this run, and no earlier turn this run
17
17
  * already delivered visible text. The hook re-queries the model with
18
18
  * `NUDGE_TEXT` (a tool trail exists to summarize, so a retry can recover a
19
- * real answer). The retry is bounded to one pass per run by a one-shot
20
- * per-conversation mark this hook sets; the sibling `stop` hook (see
21
- * `./stop.ts`) clears it when the turn terminates, so the next run nudges
22
- * afresh.
19
+ * real answer). Main-agent turns only: background, subagent, and compaction
20
+ * calls have no user awaiting a summary, so per the post-model-call contract
21
+ * the nudge self-gates on {@link PostModelCallContext.callSite}. The retry is
22
+ * bounded to one pass per run by a one-shot per-conversation mark this hook
23
+ * sets; the sibling `stop` hook (see `./stop.ts`) clears it when the turn
24
+ * terminates, so the next run nudges afresh.
23
25
  *
24
26
  * Every other case leaves the decision at `"stop"` (the model said its piece,
25
27
  * or there is nothing to act on).
@@ -146,6 +148,13 @@ const postModelCall: PluginHookFn<PostModelCallContext> = async (ctx) => {
146
148
  !priorAssistantHadVisibleText;
147
149
 
148
150
  if (isEmptyTurnAfterTools) {
151
+ // Only the user-facing reply gets the re-query nudge. Background, subagent,
152
+ // and compaction calls have no user awaiting a summary, and the
153
+ // post-model-call contract requires self-gating on call site to avoid
154
+ // re-querying them. The refusal-rewrite above is a user-facing terminal
155
+ // fallback, not a re-query, so it stays ungated.
156
+ if (ctx.callSite !== "mainAgent") return;
157
+
149
158
  // Re-query once to recover a real answer. The one-shot per-conversation
150
159
  // mark makes the hook self-limiting: a second empty turn this run finds the
151
160
  // mark already set and lets the turn end rather than nudging again.