@animalabs/agent-framework 0.22.2 → 0.22.4

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 (940) hide show
  1. package/README.md +3 -1
  2. package/dist/src/agent.d.ts +77 -12
  3. package/dist/src/agent.d.ts.map +1 -1
  4. package/dist/src/agent.js +143 -41
  5. package/dist/src/agent.js.map +1 -1
  6. package/dist/src/api/mcp-server-core.js +1 -1
  7. package/dist/src/api/mcp-server-core.js.map +1 -1
  8. package/dist/src/api/server.d.ts.map +1 -1
  9. package/dist/src/api/server.js +5 -1
  10. package/dist/src/api/server.js.map +1 -1
  11. package/dist/src/api/types.d.ts +1 -1
  12. package/dist/src/api/types.d.ts.map +1 -1
  13. package/dist/src/branch-names.d.ts +14 -0
  14. package/dist/src/branch-names.d.ts.map +1 -0
  15. package/dist/src/branch-names.js +22 -0
  16. package/dist/src/branch-names.js.map +1 -0
  17. package/dist/src/closest-names.d.ts +28 -0
  18. package/dist/src/closest-names.d.ts.map +1 -0
  19. package/dist/src/closest-names.js +98 -0
  20. package/dist/src/closest-names.js.map +1 -0
  21. package/dist/src/code-execution/py-runner.d.ts +16 -5
  22. package/dist/src/code-execution/py-runner.d.ts.map +1 -1
  23. package/dist/src/code-execution/py-runner.js +186 -74
  24. package/dist/src/code-execution/py-runner.js.map +1 -1
  25. package/dist/src/code-execution/runtime-py.d.ts.map +1 -1
  26. package/dist/src/code-execution/runtime-py.js +49 -3
  27. package/dist/src/code-execution/runtime-py.js.map +1 -1
  28. package/dist/src/code-execution/tool-definition.d.ts +12 -1
  29. package/dist/src/code-execution/tool-definition.d.ts.map +1 -1
  30. package/dist/src/code-execution/tool-definition.js +21 -3
  31. package/dist/src/code-execution/tool-definition.js.map +1 -1
  32. package/dist/src/config-checks.d.ts +28 -0
  33. package/dist/src/config-checks.d.ts.map +1 -0
  34. package/dist/src/config-checks.js +52 -0
  35. package/dist/src/config-checks.js.map +1 -0
  36. package/dist/src/deadline-timer.d.ts +21 -0
  37. package/dist/src/deadline-timer.d.ts.map +1 -0
  38. package/dist/src/deadline-timer.js +43 -0
  39. package/dist/src/deadline-timer.js.map +1 -0
  40. package/dist/src/error-message.d.ts +30 -0
  41. package/dist/src/error-message.d.ts.map +1 -0
  42. package/dist/src/error-message.js +50 -0
  43. package/dist/src/error-message.js.map +1 -0
  44. package/dist/src/framework.d.ts +828 -88
  45. package/dist/src/framework.d.ts.map +1 -1
  46. package/dist/src/framework.js +5011 -1326
  47. package/dist/src/framework.js.map +1 -1
  48. package/dist/src/gate/event-gate.d.ts +8 -0
  49. package/dist/src/gate/event-gate.d.ts.map +1 -1
  50. package/dist/src/gate/event-gate.js +27 -3
  51. package/dist/src/gate/event-gate.js.map +1 -1
  52. package/dist/src/index.d.ts +4 -2
  53. package/dist/src/index.d.ts.map +1 -1
  54. package/dist/src/index.js +4 -2
  55. package/dist/src/index.js.map +1 -1
  56. package/dist/src/mcpl/channel-registry.d.ts +144 -6
  57. package/dist/src/mcpl/channel-registry.d.ts.map +1 -1
  58. package/dist/src/mcpl/channel-registry.js +424 -263
  59. package/dist/src/mcpl/channel-registry.js.map +1 -1
  60. package/dist/src/mcpl/checkpoint-manager.d.ts +21 -1
  61. package/dist/src/mcpl/checkpoint-manager.d.ts.map +1 -1
  62. package/dist/src/mcpl/checkpoint-manager.js +91 -30
  63. package/dist/src/mcpl/checkpoint-manager.js.map +1 -1
  64. package/dist/src/mcpl/conversation-router.d.ts +19 -3
  65. package/dist/src/mcpl/conversation-router.d.ts.map +1 -1
  66. package/dist/src/mcpl/conversation-router.js +23 -8
  67. package/dist/src/mcpl/conversation-router.js.map +1 -1
  68. package/dist/src/mcpl/convert-block.d.ts +20 -0
  69. package/dist/src/mcpl/convert-block.d.ts.map +1 -0
  70. package/dist/src/mcpl/convert-block.js +89 -0
  71. package/dist/src/mcpl/convert-block.js.map +1 -0
  72. package/dist/src/mcpl/errors.d.ts +13 -0
  73. package/dist/src/mcpl/errors.d.ts.map +1 -1
  74. package/dist/src/mcpl/errors.js +28 -0
  75. package/dist/src/mcpl/errors.js.map +1 -1
  76. package/dist/src/mcpl/hook-orchestrator.d.ts +23 -0
  77. package/dist/src/mcpl/hook-orchestrator.d.ts.map +1 -1
  78. package/dist/src/mcpl/hook-orchestrator.js +83 -72
  79. package/dist/src/mcpl/hook-orchestrator.js.map +1 -1
  80. package/dist/src/mcpl/inbound-source.d.ts +114 -0
  81. package/dist/src/mcpl/inbound-source.d.ts.map +1 -0
  82. package/dist/src/mcpl/inbound-source.js +83 -0
  83. package/dist/src/mcpl/inbound-source.js.map +1 -0
  84. package/dist/src/mcpl/index.d.ts +3 -1
  85. package/dist/src/mcpl/index.d.ts.map +1 -1
  86. package/dist/src/mcpl/index.js +3 -1
  87. package/dist/src/mcpl/index.js.map +1 -1
  88. package/dist/src/mcpl/inference-router.d.ts +15 -11
  89. package/dist/src/mcpl/inference-router.d.ts.map +1 -1
  90. package/dist/src/mcpl/inference-router.js +153 -84
  91. package/dist/src/mcpl/inference-router.js.map +1 -1
  92. package/dist/src/mcpl/push-coalescer.d.ts +33 -11
  93. package/dist/src/mcpl/push-coalescer.d.ts.map +1 -1
  94. package/dist/src/mcpl/push-coalescer.js +52 -20
  95. package/dist/src/mcpl/push-coalescer.js.map +1 -1
  96. package/dist/src/mcpl/push-handler.d.ts +16 -9
  97. package/dist/src/mcpl/push-handler.d.ts.map +1 -1
  98. package/dist/src/mcpl/push-handler.js +18 -83
  99. package/dist/src/mcpl/push-handler.js.map +1 -1
  100. package/dist/src/mcpl/reference-fetcher.d.ts +14 -2
  101. package/dist/src/mcpl/reference-fetcher.d.ts.map +1 -1
  102. package/dist/src/mcpl/reference-fetcher.js +72 -30
  103. package/dist/src/mcpl/reference-fetcher.js.map +1 -1
  104. package/dist/src/mcpl/references.d.ts +47 -12
  105. package/dist/src/mcpl/references.d.ts.map +1 -1
  106. package/dist/src/mcpl/references.js +74 -21
  107. package/dist/src/mcpl/references.js.map +1 -1
  108. package/dist/src/mcpl/server-connection.d.ts +89 -10
  109. package/dist/src/mcpl/server-connection.d.ts.map +1 -1
  110. package/dist/src/mcpl/server-connection.js +405 -129
  111. package/dist/src/mcpl/server-connection.js.map +1 -1
  112. package/dist/src/mcpl/server-registry.d.ts +10 -1
  113. package/dist/src/mcpl/server-registry.d.ts.map +1 -1
  114. package/dist/src/mcpl/server-registry.js +14 -3
  115. package/dist/src/mcpl/server-registry.js.map +1 -1
  116. package/dist/src/mcpl/skip-reply-wake.d.ts +36 -0
  117. package/dist/src/mcpl/skip-reply-wake.d.ts.map +1 -0
  118. package/dist/src/mcpl/skip-reply-wake.js +55 -0
  119. package/dist/src/mcpl/skip-reply-wake.js.map +1 -0
  120. package/dist/src/mcpl/transport.d.ts +51 -2
  121. package/dist/src/mcpl/transport.d.ts.map +1 -1
  122. package/dist/src/mcpl/transport.js +114 -20
  123. package/dist/src/mcpl/transport.js.map +1 -1
  124. package/dist/src/mcpl/types.d.ts +14 -3
  125. package/dist/src/mcpl/types.d.ts.map +1 -1
  126. package/dist/src/mcpl/types.js.map +1 -1
  127. package/dist/src/mcpl/visible-content.d.ts +15 -0
  128. package/dist/src/mcpl/visible-content.d.ts.map +1 -1
  129. package/dist/src/mcpl/visible-content.js +25 -0
  130. package/dist/src/mcpl/visible-content.js.map +1 -1
  131. package/dist/src/module-registry.d.ts +19 -1
  132. package/dist/src/module-registry.d.ts.map +1 -1
  133. package/dist/src/module-registry.js +54 -25
  134. package/dist/src/module-registry.js.map +1 -1
  135. package/dist/src/modules/api/index.js +1 -1
  136. package/dist/src/modules/api/index.js.map +1 -1
  137. package/dist/src/modules/discord/discord-js-client.d.ts +1 -0
  138. package/dist/src/modules/discord/discord-js-client.d.ts.map +1 -1
  139. package/dist/src/modules/discord/discord-js-client.js +25 -9
  140. package/dist/src/modules/discord/discord-js-client.js.map +1 -1
  141. package/dist/src/modules/discord/index.d.ts +29 -3
  142. package/dist/src/modules/discord/index.d.ts.map +1 -1
  143. package/dist/src/modules/discord/index.js +379 -143
  144. package/dist/src/modules/discord/index.js.map +1 -1
  145. package/dist/src/modules/discord/types.d.ts +14 -1
  146. package/dist/src/modules/discord/types.d.ts.map +1 -1
  147. package/dist/src/modules/health/index.d.ts.map +1 -1
  148. package/dist/src/modules/health/index.js +2 -1
  149. package/dist/src/modules/health/index.js.map +1 -1
  150. package/dist/src/modules/history/index.d.ts +3 -1
  151. package/dist/src/modules/history/index.d.ts.map +1 -1
  152. package/dist/src/modules/history/index.js +359 -127
  153. package/dist/src/modules/history/index.js.map +1 -1
  154. package/dist/src/modules/history/semantic.d.ts +28 -1
  155. package/dist/src/modules/history/semantic.d.ts.map +1 -1
  156. package/dist/src/modules/history/semantic.js +177 -32
  157. package/dist/src/modules/history/semantic.js.map +1 -1
  158. package/dist/src/modules/unknown-tool.d.ts +10 -0
  159. package/dist/src/modules/unknown-tool.d.ts.map +1 -0
  160. package/dist/src/modules/unknown-tool.js +17 -0
  161. package/dist/src/modules/unknown-tool.js.map +1 -0
  162. package/dist/src/modules/workspace/disk-agreement.d.ts +32 -2
  163. package/dist/src/modules/workspace/disk-agreement.d.ts.map +1 -1
  164. package/dist/src/modules/workspace/disk-agreement.js +30 -2
  165. package/dist/src/modules/workspace/disk-agreement.js.map +1 -1
  166. package/dist/src/modules/workspace/effects.d.ts +64 -6
  167. package/dist/src/modules/workspace/effects.d.ts.map +1 -1
  168. package/dist/src/modules/workspace/effects.js +291 -44
  169. package/dist/src/modules/workspace/effects.js.map +1 -1
  170. package/dist/src/modules/workspace/index.d.ts +119 -23
  171. package/dist/src/modules/workspace/index.d.ts.map +1 -1
  172. package/dist/src/modules/workspace/index.js +793 -247
  173. package/dist/src/modules/workspace/index.js.map +1 -1
  174. package/dist/src/modules/workspace/observe.d.ts +75 -8
  175. package/dist/src/modules/workspace/observe.d.ts.map +1 -1
  176. package/dist/src/modules/workspace/observe.js +174 -14
  177. package/dist/src/modules/workspace/observe.js.map +1 -1
  178. package/dist/src/modules/workspace/reconcile.d.ts +58 -7
  179. package/dist/src/modules/workspace/reconcile.d.ts.map +1 -1
  180. package/dist/src/modules/workspace/reconcile.js +521 -56
  181. package/dist/src/modules/workspace/reconcile.js.map +1 -1
  182. package/dist/src/modules/workspace/types.d.ts +18 -4
  183. package/dist/src/modules/workspace/types.d.ts.map +1 -1
  184. package/dist/src/modules/workspace/types.js.map +1 -1
  185. package/dist/src/modules/workspace/watcher.d.ts +7 -2
  186. package/dist/src/modules/workspace/watcher.d.ts.map +1 -1
  187. package/dist/src/modules/workspace/watcher.js +28 -4
  188. package/dist/src/modules/workspace/watcher.js.map +1 -1
  189. package/dist/src/prose-drafts.d.ts +240 -0
  190. package/dist/src/prose-drafts.d.ts.map +1 -0
  191. package/dist/src/prose-drafts.js +362 -0
  192. package/dist/src/prose-drafts.js.map +1 -0
  193. package/dist/src/prose-segments.d.ts +21 -2
  194. package/dist/src/prose-segments.d.ts.map +1 -1
  195. package/dist/src/prose-segments.js +46 -9
  196. package/dist/src/prose-segments.js.map +1 -1
  197. package/dist/src/recovery/offline-branch.d.ts +1 -0
  198. package/dist/src/recovery/offline-branch.d.ts.map +1 -1
  199. package/dist/src/recovery/offline-branch.js +3 -1
  200. package/dist/src/recovery/offline-branch.js.map +1 -1
  201. package/dist/src/safe-slice.d.ts +5 -1
  202. package/dist/src/safe-slice.d.ts.map +1 -1
  203. package/dist/src/safe-slice.js +9 -1
  204. package/dist/src/safe-slice.js.map +1 -1
  205. package/dist/src/thinking-token-stamp.d.ts +12 -0
  206. package/dist/src/thinking-token-stamp.d.ts.map +1 -1
  207. package/dist/src/thinking-token-stamp.js +34 -3
  208. package/dist/src/thinking-token-stamp.js.map +1 -1
  209. package/dist/src/tool-image-ledger.d.ts +87 -19
  210. package/dist/src/tool-image-ledger.d.ts.map +1 -1
  211. package/dist/src/tool-image-ledger.js +135 -32
  212. package/dist/src/tool-image-ledger.js.map +1 -1
  213. package/dist/src/tool-presentation.d.ts +9 -0
  214. package/dist/src/tool-presentation.d.ts.map +1 -1
  215. package/dist/src/tool-presentation.js +257 -60
  216. package/dist/src/tool-presentation.js.map +1 -1
  217. package/dist/src/tool-result-guard.d.ts.map +1 -1
  218. package/dist/src/tool-result-guard.js +7 -10
  219. package/dist/src/tool-result-guard.js.map +1 -1
  220. package/dist/src/tool-result-history.d.ts +32 -3
  221. package/dist/src/tool-result-history.d.ts.map +1 -1
  222. package/dist/src/tool-result-history.js +106 -19
  223. package/dist/src/tool-result-history.js.map +1 -1
  224. package/dist/src/tune-out/coordinator.d.ts +25 -1
  225. package/dist/src/tune-out/coordinator.d.ts.map +1 -1
  226. package/dist/src/tune-out/coordinator.js +260 -65
  227. package/dist/src/tune-out/coordinator.js.map +1 -1
  228. package/dist/src/types/agent.d.ts +17 -5
  229. package/dist/src/types/agent.d.ts.map +1 -1
  230. package/dist/src/types/events.d.ts +17 -0
  231. package/dist/src/types/events.d.ts.map +1 -1
  232. package/dist/src/types/framework.d.ts +21 -5
  233. package/dist/src/types/framework.d.ts.map +1 -1
  234. package/dist/src/types/inference-log.d.ts +1 -1
  235. package/dist/src/types/inference-log.d.ts.map +1 -1
  236. package/dist/src/types/module.d.ts +23 -4
  237. package/dist/src/types/module.d.ts.map +1 -1
  238. package/dist/src/types/trace.d.ts +95 -6
  239. package/dist/src/types/trace.d.ts.map +1 -1
  240. package/dist/src/usage/usage-tracker.d.ts +5 -0
  241. package/dist/src/usage/usage-tracker.d.ts.map +1 -1
  242. package/dist/src/usage/usage-tracker.js +35 -8
  243. package/dist/src/usage/usage-tracker.js.map +1 -1
  244. package/package.json +6 -4
  245. package/src/agent.ts +169 -41
  246. package/src/api/mcp-server-core.ts +1 -1
  247. package/src/api/server.ts +4 -1
  248. package/src/api/types.ts +1 -1
  249. package/src/branch-names.ts +19 -0
  250. package/src/closest-names.ts +94 -0
  251. package/src/code-execution/py-runner.ts +200 -76
  252. package/src/code-execution/runtime-py.ts +49 -3
  253. package/src/code-execution/tool-definition.ts +28 -4
  254. package/src/config-checks.ts +48 -0
  255. package/src/deadline-timer.ts +44 -0
  256. package/src/error-message.ts +48 -0
  257. package/src/framework.ts +5352 -1388
  258. package/src/gate/event-gate.ts +28 -3
  259. package/src/index.ts +11 -2
  260. package/src/mcpl/channel-registry.ts +517 -286
  261. package/src/mcpl/checkpoint-manager.ts +104 -29
  262. package/src/mcpl/conversation-router.ts +28 -8
  263. package/src/mcpl/convert-block.ts +97 -0
  264. package/src/mcpl/errors.ts +28 -0
  265. package/src/mcpl/hook-orchestrator.ts +84 -77
  266. package/src/mcpl/inbound-source.ts +156 -0
  267. package/src/mcpl/index.ts +10 -1
  268. package/src/mcpl/inference-router.ts +174 -99
  269. package/src/mcpl/push-coalescer.ts +60 -24
  270. package/src/mcpl/push-handler.ts +20 -90
  271. package/src/mcpl/reference-fetcher.ts +71 -26
  272. package/src/mcpl/references.ts +81 -22
  273. package/src/mcpl/server-connection.ts +427 -132
  274. package/src/mcpl/server-registry.ts +15 -4
  275. package/src/mcpl/skip-reply-wake.ts +73 -0
  276. package/src/mcpl/transport.ts +120 -18
  277. package/src/mcpl/types.ts +14 -3
  278. package/src/mcpl/visible-content.ts +27 -0
  279. package/src/module-registry.ts +58 -23
  280. package/src/modules/api/index.ts +1 -1
  281. package/src/modules/discord/discord-js-client.ts +26 -10
  282. package/src/modules/discord/index.ts +391 -158
  283. package/src/modules/discord/types.ts +15 -2
  284. package/src/modules/health/index.ts +2 -1
  285. package/src/modules/history/index.ts +410 -120
  286. package/src/modules/history/semantic.ts +189 -32
  287. package/src/modules/unknown-tool.ts +16 -0
  288. package/src/modules/workspace/disk-agreement.ts +51 -3
  289. package/src/modules/workspace/effects.ts +279 -35
  290. package/src/modules/workspace/index.ts +810 -260
  291. package/src/modules/workspace/observe.ts +194 -20
  292. package/src/modules/workspace/reconcile.ts +619 -64
  293. package/src/modules/workspace/types.ts +18 -4
  294. package/src/modules/workspace/watcher.ts +27 -4
  295. package/src/prose-drafts.ts +481 -0
  296. package/src/prose-segments.ts +51 -8
  297. package/src/recovery/offline-branch.ts +4 -1
  298. package/src/safe-slice.ts +9 -1
  299. package/src/thinking-token-stamp.ts +34 -3
  300. package/src/tool-image-ledger.ts +153 -34
  301. package/src/tool-presentation.ts +224 -40
  302. package/src/tool-result-guard.ts +7 -8
  303. package/src/tool-result-history.ts +124 -20
  304. package/src/tune-out/coordinator.ts +259 -65
  305. package/src/types/agent.ts +17 -7
  306. package/src/types/events.ts +17 -0
  307. package/src/types/framework.ts +21 -5
  308. package/src/types/inference-log.ts +1 -1
  309. package/src/types/module.ts +24 -4
  310. package/src/types/trace.ts +101 -6
  311. package/src/usage/usage-tracker.ts +32 -8
  312. package/dist/test/activation-request-sanitize.test.d.ts +0 -2
  313. package/dist/test/activation-request-sanitize.test.d.ts.map +0 -1
  314. package/dist/test/activation-request-sanitize.test.js +0 -89
  315. package/dist/test/activation-request-sanitize.test.js.map +0 -1
  316. package/dist/test/agent-cache-ttl.test.d.ts +0 -2
  317. package/dist/test/agent-cache-ttl.test.d.ts.map +0 -1
  318. package/dist/test/agent-cache-ttl.test.js +0 -41
  319. package/dist/test/agent-cache-ttl.test.js.map +0 -1
  320. package/dist/test/agent-runtime-settings.test.d.ts +0 -2
  321. package/dist/test/agent-runtime-settings.test.d.ts.map +0 -1
  322. package/dist/test/agent-runtime-settings.test.js +0 -1598
  323. package/dist/test/agent-runtime-settings.test.js.map +0 -1
  324. package/dist/test/api-admin-gate.test.d.ts +0 -2
  325. package/dist/test/api-admin-gate.test.d.ts.map +0 -1
  326. package/dist/test/api-admin-gate.test.js +0 -116
  327. package/dist/test/api-admin-gate.test.js.map +0 -1
  328. package/dist/test/assistant-persist-refusal.test.d.ts +0 -2
  329. package/dist/test/assistant-persist-refusal.test.d.ts.map +0 -1
  330. package/dist/test/assistant-persist-refusal.test.js +0 -63
  331. package/dist/test/assistant-persist-refusal.test.js.map +0 -1
  332. package/dist/test/batched-wake-locus.test.d.ts +0 -2
  333. package/dist/test/batched-wake-locus.test.d.ts.map +0 -1
  334. package/dist/test/batched-wake-locus.test.js +0 -166
  335. package/dist/test/batched-wake-locus.test.js.map +0 -1
  336. package/dist/test/busy-agent-scheduler.test.d.ts +0 -2
  337. package/dist/test/busy-agent-scheduler.test.d.ts.map +0 -1
  338. package/dist/test/busy-agent-scheduler.test.js +0 -92
  339. package/dist/test/busy-agent-scheduler.test.js.map +0 -1
  340. package/dist/test/channel-incoming-targeting.test.d.ts +0 -2
  341. package/dist/test/channel-incoming-targeting.test.d.ts.map +0 -1
  342. package/dist/test/channel-incoming-targeting.test.js +0 -81
  343. package/dist/test/channel-incoming-targeting.test.js.map +0 -1
  344. package/dist/test/channel-label-history.test.d.ts +0 -2
  345. package/dist/test/channel-label-history.test.d.ts.map +0 -1
  346. package/dist/test/channel-label-history.test.js +0 -424
  347. package/dist/test/channel-label-history.test.js.map +0 -1
  348. package/dist/test/channel-lifecycle-provenance.test.d.ts +0 -2
  349. package/dist/test/channel-lifecycle-provenance.test.d.ts.map +0 -1
  350. package/dist/test/channel-lifecycle-provenance.test.js +0 -47
  351. package/dist/test/channel-lifecycle-provenance.test.js.map +0 -1
  352. package/dist/test/channel-registry-routing.test.d.ts +0 -2
  353. package/dist/test/channel-registry-routing.test.d.ts.map +0 -1
  354. package/dist/test/channel-registry-routing.test.js +0 -446
  355. package/dist/test/channel-registry-routing.test.js.map +0 -1
  356. package/dist/test/channel-registry-typing.test.d.ts +0 -2
  357. package/dist/test/channel-registry-typing.test.d.ts.map +0 -1
  358. package/dist/test/channel-registry-typing.test.js +0 -91
  359. package/dist/test/channel-registry-typing.test.js.map +0 -1
  360. package/dist/test/channels-changed-respond-first.test.d.ts +0 -2
  361. package/dist/test/channels-changed-respond-first.test.d.ts.map +0 -1
  362. package/dist/test/channels-changed-respond-first.test.js +0 -74
  363. package/dist/test/channels-changed-respond-first.test.js.map +0 -1
  364. package/dist/test/checkpoint-attribution.test.d.ts +0 -2
  365. package/dist/test/checkpoint-attribution.test.d.ts.map +0 -1
  366. package/dist/test/checkpoint-attribution.test.js +0 -200
  367. package/dist/test/checkpoint-attribution.test.js.map +0 -1
  368. package/dist/test/code-execution.test.d.ts +0 -11
  369. package/dist/test/code-execution.test.d.ts.map +0 -1
  370. package/dist/test/code-execution.test.js +0 -1272
  371. package/dist/test/code-execution.test.js.map +0 -1
  372. package/dist/test/component-defaults.test.d.ts +0 -2
  373. package/dist/test/component-defaults.test.d.ts.map +0 -1
  374. package/dist/test/component-defaults.test.js +0 -54
  375. package/dist/test/component-defaults.test.js.map +0 -1
  376. package/dist/test/conversation-fork-injection-scoping.test.d.ts +0 -2
  377. package/dist/test/conversation-fork-injection-scoping.test.d.ts.map +0 -1
  378. package/dist/test/conversation-fork-injection-scoping.test.js +0 -200
  379. package/dist/test/conversation-fork-injection-scoping.test.js.map +0 -1
  380. package/dist/test/conversation-router.test.d.ts +0 -2
  381. package/dist/test/conversation-router.test.d.ts.map +0 -1
  382. package/dist/test/conversation-router.test.js +0 -174
  383. package/dist/test/conversation-router.test.js.map +0 -1
  384. package/dist/test/conversation-routing.test.d.ts +0 -7
  385. package/dist/test/conversation-routing.test.d.ts.map +0 -1
  386. package/dist/test/conversation-routing.test.js +0 -621
  387. package/dist/test/conversation-routing.test.js.map +0 -1
  388. package/dist/test/deferred-wake-integrity.test.d.ts +0 -29
  389. package/dist/test/deferred-wake-integrity.test.d.ts.map +0 -1
  390. package/dist/test/deferred-wake-integrity.test.js +0 -320
  391. package/dist/test/deferred-wake-integrity.test.js.map +0 -1
  392. package/dist/test/discord-awareness-outbox.test.d.ts +0 -2
  393. package/dist/test/discord-awareness-outbox.test.d.ts.map +0 -1
  394. package/dist/test/discord-awareness-outbox.test.js +0 -371
  395. package/dist/test/discord-awareness-outbox.test.js.map +0 -1
  396. package/dist/test/discord-history-delete-window.test.d.ts +0 -2
  397. package/dist/test/discord-history-delete-window.test.d.ts.map +0 -1
  398. package/dist/test/discord-history-delete-window.test.js +0 -81
  399. package/dist/test/discord-history-delete-window.test.js.map +0 -1
  400. package/dist/test/discord-history-sync.test.d.ts +0 -2
  401. package/dist/test/discord-history-sync.test.d.ts.map +0 -1
  402. package/dist/test/discord-history-sync.test.js +0 -56
  403. package/dist/test/discord-history-sync.test.js.map +0 -1
  404. package/dist/test/discord-typing-keepalive.test.d.ts +0 -2
  405. package/dist/test/discord-typing-keepalive.test.d.ts.map +0 -1
  406. package/dist/test/discord-typing-keepalive.test.js +0 -77
  407. package/dist/test/discord-typing-keepalive.test.js.map +0 -1
  408. package/dist/test/ephemeral-settle.test.d.ts +0 -2
  409. package/dist/test/ephemeral-settle.test.d.ts.map +0 -1
  410. package/dist/test/ephemeral-settle.test.js +0 -354
  411. package/dist/test/ephemeral-settle.test.js.map +0 -1
  412. package/dist/test/event-gate-passthrough.test.d.ts +0 -15
  413. package/dist/test/event-gate-passthrough.test.d.ts.map +0 -1
  414. package/dist/test/event-gate-passthrough.test.js +0 -289
  415. package/dist/test/event-gate-passthrough.test.js.map +0 -1
  416. package/dist/test/event-gate-policy-mutation.test.d.ts +0 -2
  417. package/dist/test/event-gate-policy-mutation.test.d.ts.map +0 -1
  418. package/dist/test/event-gate-policy-mutation.test.js +0 -137
  419. package/dist/test/event-gate-policy-mutation.test.js.map +0 -1
  420. package/dist/test/event-gate-rate-limit.test.d.ts +0 -2
  421. package/dist/test/event-gate-rate-limit.test.d.ts.map +0 -1
  422. package/dist/test/event-gate-rate-limit.test.js +0 -627
  423. package/dist/test/event-gate-rate-limit.test.js.map +0 -1
  424. package/dist/test/event-gate-script.test.d.ts +0 -2
  425. package/dist/test/event-gate-script.test.d.ts.map +0 -1
  426. package/dist/test/event-gate-script.test.js +0 -95
  427. package/dist/test/event-gate-script.test.js.map +0 -1
  428. package/dist/test/event-gate-selfwake.test.d.ts +0 -15
  429. package/dist/test/event-gate-selfwake.test.d.ts.map +0 -1
  430. package/dist/test/event-gate-selfwake.test.js +0 -125
  431. package/dist/test/event-gate-selfwake.test.js.map +0 -1
  432. package/dist/test/event-gate-tags.test.d.ts +0 -2
  433. package/dist/test/event-gate-tags.test.d.ts.map +0 -1
  434. package/dist/test/event-gate-tags.test.js +0 -76
  435. package/dist/test/event-gate-tags.test.js.map +0 -1
  436. package/dist/test/event-gate.test.d.ts +0 -2
  437. package/dist/test/event-gate.test.d.ts.map +0 -1
  438. package/dist/test/event-gate.test.js +0 -919
  439. package/dist/test/event-gate.test.js.map +0 -1
  440. package/dist/test/explicit-prose-routing.test.d.ts +0 -11
  441. package/dist/test/explicit-prose-routing.test.d.ts.map +0 -1
  442. package/dist/test/explicit-prose-routing.test.js +0 -1715
  443. package/dist/test/explicit-prose-routing.test.js.map +0 -1
  444. package/dist/test/framework.test.d.ts +0 -5
  445. package/dist/test/framework.test.d.ts.map +0 -1
  446. package/dist/test/framework.test.js +0 -1048
  447. package/dist/test/framework.test.js.map +0 -1
  448. package/dist/test/gather-context-timeout.test.d.ts +0 -2
  449. package/dist/test/gather-context-timeout.test.d.ts.map +0 -1
  450. package/dist/test/gather-context-timeout.test.js +0 -120
  451. package/dist/test/gather-context-timeout.test.js.map +0 -1
  452. package/dist/test/health-snapshot.test.d.ts +0 -2
  453. package/dist/test/health-snapshot.test.d.ts.map +0 -1
  454. package/dist/test/health-snapshot.test.js +0 -74
  455. package/dist/test/health-snapshot.test.js.map +0 -1
  456. package/dist/test/helpers/coalescing-fixture.d.ts +0 -74
  457. package/dist/test/helpers/coalescing-fixture.d.ts.map +0 -1
  458. package/dist/test/helpers/coalescing-fixture.js +0 -152
  459. package/dist/test/helpers/coalescing-fixture.js.map +0 -1
  460. package/dist/test/helpers/coalescing-kill-child.d.ts +0 -2
  461. package/dist/test/helpers/coalescing-kill-child.d.ts.map +0 -1
  462. package/dist/test/helpers/coalescing-kill-child.js +0 -24
  463. package/dist/test/helpers/coalescing-kill-child.js.map +0 -1
  464. package/dist/test/helpers/mock-membrane.d.ts +0 -53
  465. package/dist/test/helpers/mock-membrane.d.ts.map +0 -1
  466. package/dist/test/helpers/mock-membrane.js +0 -168
  467. package/dist/test/helpers/mock-membrane.js.map +0 -1
  468. package/dist/test/helpers/pytc-stop-rows.d.ts +0 -11
  469. package/dist/test/helpers/pytc-stop-rows.d.ts.map +0 -1
  470. package/dist/test/helpers/pytc-stop-rows.js +0 -143
  471. package/dist/test/helpers/pytc-stop-rows.js.map +0 -1
  472. package/dist/test/helpers/quiesce-crash-child.d.ts +0 -2
  473. package/dist/test/helpers/quiesce-crash-child.d.ts.map +0 -1
  474. package/dist/test/helpers/quiesce-crash-child.js +0 -156
  475. package/dist/test/helpers/quiesce-crash-child.js.map +0 -1
  476. package/dist/test/hide-then-turn.test.d.ts +0 -2
  477. package/dist/test/hide-then-turn.test.d.ts.map +0 -1
  478. package/dist/test/hide-then-turn.test.js +0 -101
  479. package/dist/test/hide-then-turn.test.js.map +0 -1
  480. package/dist/test/history-module-overview.test.d.ts +0 -2
  481. package/dist/test/history-module-overview.test.d.ts.map +0 -1
  482. package/dist/test/history-module-overview.test.js +0 -711
  483. package/dist/test/history-module-overview.test.js.map +0 -1
  484. package/dist/test/history-module-realstore.test.d.ts +0 -2
  485. package/dist/test/history-module-realstore.test.d.ts.map +0 -1
  486. package/dist/test/history-module-realstore.test.js +0 -363
  487. package/dist/test/history-module-realstore.test.js.map +0 -1
  488. package/dist/test/history-module-semantic.test.d.ts +0 -2
  489. package/dist/test/history-module-semantic.test.d.ts.map +0 -1
  490. package/dist/test/history-module-semantic.test.js +0 -213
  491. package/dist/test/history-module-semantic.test.js.map +0 -1
  492. package/dist/test/history-module-ux.test.d.ts +0 -2
  493. package/dist/test/history-module-ux.test.d.ts.map +0 -1
  494. package/dist/test/history-module-ux.test.js +0 -304
  495. package/dist/test/history-module-ux.test.js.map +0 -1
  496. package/dist/test/history-module.test.d.ts +0 -2
  497. package/dist/test/history-module.test.d.ts.map +0 -1
  498. package/dist/test/history-module.test.js +0 -619
  499. package/dist/test/history-module.test.js.map +0 -1
  500. package/dist/test/history-semantic-review-findings.test.d.ts +0 -2
  501. package/dist/test/history-semantic-review-findings.test.d.ts.map +0 -1
  502. package/dist/test/history-semantic-review-findings.test.js +0 -338
  503. package/dist/test/history-semantic-review-findings.test.js.map +0 -1
  504. package/dist/test/history-semantic-sync-converges.test.d.ts +0 -2
  505. package/dist/test/history-semantic-sync-converges.test.d.ts.map +0 -1
  506. package/dist/test/history-semantic-sync-converges.test.js +0 -109
  507. package/dist/test/history-semantic-sync-converges.test.js.map +0 -1
  508. package/dist/test/host-quiesce.test.d.ts +0 -2
  509. package/dist/test/host-quiesce.test.d.ts.map +0 -1
  510. package/dist/test/host-quiesce.test.js +0 -988
  511. package/dist/test/host-quiesce.test.js.map +0 -1
  512. package/dist/test/inference-exhaustion-rewind.test.d.ts +0 -2
  513. package/dist/test/inference-exhaustion-rewind.test.d.ts.map +0 -1
  514. package/dist/test/inference-exhaustion-rewind.test.js +0 -387
  515. package/dist/test/inference-exhaustion-rewind.test.js.map +0 -1
  516. package/dist/test/inference-failure-bounds.test.d.ts +0 -2
  517. package/dist/test/inference-failure-bounds.test.d.ts.map +0 -1
  518. package/dist/test/inference-failure-bounds.test.js +0 -1202
  519. package/dist/test/inference-failure-bounds.test.js.map +0 -1
  520. package/dist/test/inference-failure-observability.test.d.ts +0 -2
  521. package/dist/test/inference-failure-observability.test.d.ts.map +0 -1
  522. package/dist/test/inference-failure-observability.test.js +0 -84
  523. package/dist/test/inference-failure-observability.test.js.map +0 -1
  524. package/dist/test/journal-tool.test.d.ts +0 -2
  525. package/dist/test/journal-tool.test.d.ts.map +0 -1
  526. package/dist/test/journal-tool.test.js +0 -33
  527. package/dist/test/journal-tool.test.js.map +0 -1
  528. package/dist/test/kv-unified-open-flight-retry.test.d.ts +0 -2
  529. package/dist/test/kv-unified-open-flight-retry.test.d.ts.map +0 -1
  530. package/dist/test/kv-unified-open-flight-retry.test.js +0 -189
  531. package/dist/test/kv-unified-open-flight-retry.test.js.map +0 -1
  532. package/dist/test/kv-unified-wiring.test.d.ts +0 -2
  533. package/dist/test/kv-unified-wiring.test.d.ts.map +0 -1
  534. package/dist/test/kv-unified-wiring.test.js +0 -95
  535. package/dist/test/kv-unified-wiring.test.js.map +0 -1
  536. package/dist/test/late-events-after-stop.test.d.ts +0 -2
  537. package/dist/test/late-events-after-stop.test.d.ts.map +0 -1
  538. package/dist/test/late-events-after-stop.test.js +0 -122
  539. package/dist/test/late-events-after-stop.test.js.map +0 -1
  540. package/dist/test/liveness-watchdog.test.d.ts +0 -2
  541. package/dist/test/liveness-watchdog.test.d.ts.map +0 -1
  542. package/dist/test/liveness-watchdog.test.js +0 -94
  543. package/dist/test/liveness-watchdog.test.js.map +0 -1
  544. package/dist/test/machine-close-provenance.test.d.ts +0 -2
  545. package/dist/test/machine-close-provenance.test.d.ts.map +0 -1
  546. package/dist/test/machine-close-provenance.test.js +0 -116
  547. package/dist/test/machine-close-provenance.test.js.map +0 -1
  548. package/dist/test/maintenance-timer.test.d.ts +0 -2
  549. package/dist/test/maintenance-timer.test.d.ts.map +0 -1
  550. package/dist/test/maintenance-timer.test.js +0 -1827
  551. package/dist/test/maintenance-timer.test.js.map +0 -1
  552. package/dist/test/mcp-server-bin.test.d.ts +0 -2
  553. package/dist/test/mcp-server-bin.test.d.ts.map +0 -1
  554. package/dist/test/mcp-server-bin.test.js +0 -142
  555. package/dist/test/mcp-server-bin.test.js.map +0 -1
  556. package/dist/test/mcpl-access-provider.test.d.ts +0 -2
  557. package/dist/test/mcpl-access-provider.test.d.ts.map +0 -1
  558. package/dist/test/mcpl-access-provider.test.js +0 -20
  559. package/dist/test/mcpl-access-provider.test.js.map +0 -1
  560. package/dist/test/mcpl-awareness-barrier.test.d.ts +0 -2
  561. package/dist/test/mcpl-awareness-barrier.test.d.ts.map +0 -1
  562. package/dist/test/mcpl-awareness-barrier.test.js +0 -769
  563. package/dist/test/mcpl-awareness-barrier.test.js.map +0 -1
  564. package/dist/test/mcpl-capability-grant.test.d.ts +0 -10
  565. package/dist/test/mcpl-capability-grant.test.d.ts.map +0 -1
  566. package/dist/test/mcpl-capability-grant.test.js +0 -111
  567. package/dist/test/mcpl-capability-grant.test.js.map +0 -1
  568. package/dist/test/mcpl-capability-scoping.test.d.ts +0 -2
  569. package/dist/test/mcpl-capability-scoping.test.d.ts.map +0 -1
  570. package/dist/test/mcpl-capability-scoping.test.js +0 -266
  571. package/dist/test/mcpl-capability-scoping.test.js.map +0 -1
  572. package/dist/test/mcpl-child-env.test.d.ts +0 -2
  573. package/dist/test/mcpl-child-env.test.d.ts.map +0 -1
  574. package/dist/test/mcpl-child-env.test.js +0 -158
  575. package/dist/test/mcpl-child-env.test.js.map +0 -1
  576. package/dist/test/mcpl-coalesced-content-parity.test.d.ts +0 -2
  577. package/dist/test/mcpl-coalesced-content-parity.test.d.ts.map +0 -1
  578. package/dist/test/mcpl-coalesced-content-parity.test.js +0 -532
  579. package/dist/test/mcpl-coalesced-content-parity.test.js.map +0 -1
  580. package/dist/test/mcpl-coalescing.test.d.ts +0 -2
  581. package/dist/test/mcpl-coalescing.test.d.ts.map +0 -1
  582. package/dist/test/mcpl-coalescing.test.js +0 -1125
  583. package/dist/test/mcpl-coalescing.test.js.map +0 -1
  584. package/dist/test/mcpl-config-diagnostics.test.d.ts +0 -2
  585. package/dist/test/mcpl-config-diagnostics.test.d.ts.map +0 -1
  586. package/dist/test/mcpl-config-diagnostics.test.js +0 -452
  587. package/dist/test/mcpl-config-diagnostics.test.js.map +0 -1
  588. package/dist/test/mcpl-empty-content.test.d.ts +0 -2
  589. package/dist/test/mcpl-empty-content.test.d.ts.map +0 -1
  590. package/dist/test/mcpl-empty-content.test.js +0 -368
  591. package/dist/test/mcpl-empty-content.test.js.map +0 -1
  592. package/dist/test/mcpl-gate-roundtrip.test.d.ts +0 -2
  593. package/dist/test/mcpl-gate-roundtrip.test.d.ts.map +0 -1
  594. package/dist/test/mcpl-gate-roundtrip.test.js +0 -285
  595. package/dist/test/mcpl-gate-roundtrip.test.js.map +0 -1
  596. package/dist/test/mcpl-list-status.test.d.ts +0 -2
  597. package/dist/test/mcpl-list-status.test.d.ts.map +0 -1
  598. package/dist/test/mcpl-list-status.test.js +0 -82
  599. package/dist/test/mcpl-list-status.test.js.map +0 -1
  600. package/dist/test/mcpl-manifest-changed.test.d.ts +0 -2
  601. package/dist/test/mcpl-manifest-changed.test.d.ts.map +0 -1
  602. package/dist/test/mcpl-manifest-changed.test.js +0 -178
  603. package/dist/test/mcpl-manifest-changed.test.js.map +0 -1
  604. package/dist/test/mcpl-push-convert.test.d.ts +0 -2
  605. package/dist/test/mcpl-push-convert.test.d.ts.map +0 -1
  606. package/dist/test/mcpl-push-convert.test.js +0 -42
  607. package/dist/test/mcpl-push-convert.test.js.map +0 -1
  608. package/dist/test/mcpl-reconnect-events.test.d.ts +0 -2
  609. package/dist/test/mcpl-reconnect-events.test.d.ts.map +0 -1
  610. package/dist/test/mcpl-reconnect-events.test.js +0 -144
  611. package/dist/test/mcpl-reconnect-events.test.js.map +0 -1
  612. package/dist/test/mcpl-reconnect-reregistration.test.d.ts +0 -2
  613. package/dist/test/mcpl-reconnect-reregistration.test.d.ts.map +0 -1
  614. package/dist/test/mcpl-reconnect-reregistration.test.js +0 -238
  615. package/dist/test/mcpl-reconnect-reregistration.test.js.map +0 -1
  616. package/dist/test/mcpl-reference-fetcher.test.d.ts +0 -2
  617. package/dist/test/mcpl-reference-fetcher.test.d.ts.map +0 -1
  618. package/dist/test/mcpl-reference-fetcher.test.js +0 -427
  619. package/dist/test/mcpl-reference-fetcher.test.js.map +0 -1
  620. package/dist/test/mcpl-reference-fields.test.d.ts +0 -2
  621. package/dist/test/mcpl-reference-fields.test.d.ts.map +0 -1
  622. package/dist/test/mcpl-reference-fields.test.js +0 -149
  623. package/dist/test/mcpl-reference-fields.test.js.map +0 -1
  624. package/dist/test/mcpl-rejection-log-lines.test.d.ts +0 -2
  625. package/dist/test/mcpl-rejection-log-lines.test.d.ts.map +0 -1
  626. package/dist/test/mcpl-rejection-log-lines.test.js +0 -349
  627. package/dist/test/mcpl-rejection-log-lines.test.js.map +0 -1
  628. package/dist/test/mcpl-request-timeout.test.d.ts +0 -2
  629. package/dist/test/mcpl-request-timeout.test.d.ts.map +0 -1
  630. package/dist/test/mcpl-request-timeout.test.js +0 -138
  631. package/dist/test/mcpl-request-timeout.test.js.map +0 -1
  632. package/dist/test/mcpl-runtime-lifecycle.test.d.ts +0 -7
  633. package/dist/test/mcpl-runtime-lifecycle.test.d.ts.map +0 -1
  634. package/dist/test/mcpl-runtime-lifecycle.test.js +0 -142
  635. package/dist/test/mcpl-runtime-lifecycle.test.js.map +0 -1
  636. package/dist/test/mcpl-stderr-tail.test.d.ts +0 -2
  637. package/dist/test/mcpl-stderr-tail.test.d.ts.map +0 -1
  638. package/dist/test/mcpl-stderr-tail.test.js +0 -210
  639. package/dist/test/mcpl-stderr-tail.test.js.map +0 -1
  640. package/dist/test/mcpl-tool-class-listing.test.d.ts +0 -2
  641. package/dist/test/mcpl-tool-class-listing.test.d.ts.map +0 -1
  642. package/dist/test/mcpl-tool-class-listing.test.js +0 -147
  643. package/dist/test/mcpl-tool-class-listing.test.js.map +0 -1
  644. package/dist/test/mcpl-tool-classes.test.d.ts +0 -7
  645. package/dist/test/mcpl-tool-classes.test.d.ts.map +0 -1
  646. package/dist/test/mcpl-tool-classes.test.js +0 -80
  647. package/dist/test/mcpl-tool-classes.test.js.map +0 -1
  648. package/dist/test/mcpl-tool-lifecycle-e2e.test.d.ts +0 -2
  649. package/dist/test/mcpl-tool-lifecycle-e2e.test.d.ts.map +0 -1
  650. package/dist/test/mcpl-tool-lifecycle-e2e.test.js +0 -237
  651. package/dist/test/mcpl-tool-lifecycle-e2e.test.js.map +0 -1
  652. package/dist/test/mcpl-tool-lifecycle-emitter.test.d.ts +0 -11
  653. package/dist/test/mcpl-tool-lifecycle-emitter.test.d.ts.map +0 -1
  654. package/dist/test/mcpl-tool-lifecycle-emitter.test.js +0 -412
  655. package/dist/test/mcpl-tool-lifecycle-emitter.test.js.map +0 -1
  656. package/dist/test/mcpl-tool-lifecycle-script.test.d.ts +0 -2
  657. package/dist/test/mcpl-tool-lifecycle-script.test.d.ts.map +0 -1
  658. package/dist/test/mcpl-tool-lifecycle-script.test.js +0 -288
  659. package/dist/test/mcpl-tool-lifecycle-script.test.js.map +0 -1
  660. package/dist/test/mcpl-tool-lifecycle.test.d.ts +0 -11
  661. package/dist/test/mcpl-tool-lifecycle.test.d.ts.map +0 -1
  662. package/dist/test/mcpl-tool-lifecycle.test.js +0 -270
  663. package/dist/test/mcpl-tool-lifecycle.test.js.map +0 -1
  664. package/dist/test/mcpl-transport-close.test.d.ts +0 -2
  665. package/dist/test/mcpl-transport-close.test.d.ts.map +0 -1
  666. package/dist/test/mcpl-transport-close.test.js +0 -373
  667. package/dist/test/mcpl-transport-close.test.js.map +0 -1
  668. package/dist/test/mcpl-transport-spawn.test.d.ts +0 -2
  669. package/dist/test/mcpl-transport-spawn.test.d.ts.map +0 -1
  670. package/dist/test/mcpl-transport-spawn.test.js +0 -58
  671. package/dist/test/mcpl-transport-spawn.test.js.map +0 -1
  672. package/dist/test/mcpl-ws-transport.test.d.ts +0 -2
  673. package/dist/test/mcpl-ws-transport.test.d.ts.map +0 -1
  674. package/dist/test/mcpl-ws-transport.test.js +0 -259
  675. package/dist/test/mcpl-ws-transport.test.js.map +0 -1
  676. package/dist/test/module-context-integration.test.d.ts +0 -18
  677. package/dist/test/module-context-integration.test.d.ts.map +0 -1
  678. package/dist/test/module-context-integration.test.js +0 -181
  679. package/dist/test/module-context-integration.test.js.map +0 -1
  680. package/dist/test/offline-recovery-branch.test.d.ts +0 -2
  681. package/dist/test/offline-recovery-branch.test.d.ts.map +0 -1
  682. package/dist/test/offline-recovery-branch.test.js +0 -570
  683. package/dist/test/offline-recovery-branch.test.js.map +0 -1
  684. package/dist/test/operator-surgery.test.d.ts +0 -2
  685. package/dist/test/operator-surgery.test.d.ts.map +0 -1
  686. package/dist/test/operator-surgery.test.js +0 -595
  687. package/dist/test/operator-surgery.test.js.map +0 -1
  688. package/dist/test/ops-alert.test.d.ts +0 -2
  689. package/dist/test/ops-alert.test.d.ts.map +0 -1
  690. package/dist/test/ops-alert.test.js +0 -153
  691. package/dist/test/ops-alert.test.js.map +0 -1
  692. package/dist/test/overbudget-drain-breaker.test.d.ts +0 -2
  693. package/dist/test/overbudget-drain-breaker.test.d.ts.map +0 -1
  694. package/dist/test/overbudget-drain-breaker.test.js +0 -198
  695. package/dist/test/overbudget-drain-breaker.test.js.map +0 -1
  696. package/dist/test/pack-installs-alone.test.d.ts +0 -2
  697. package/dist/test/pack-installs-alone.test.d.ts.map +0 -1
  698. package/dist/test/pack-installs-alone.test.js +0 -284
  699. package/dist/test/pack-installs-alone.test.js.map +0 -1
  700. package/dist/test/per-agent-delivery.test.d.ts +0 -2
  701. package/dist/test/per-agent-delivery.test.d.ts.map +0 -1
  702. package/dist/test/per-agent-delivery.test.js +0 -108
  703. package/dist/test/per-agent-delivery.test.js.map +0 -1
  704. package/dist/test/physical-window-restart.test.d.ts +0 -16
  705. package/dist/test/physical-window-restart.test.d.ts.map +0 -1
  706. package/dist/test/physical-window-restart.test.js +0 -487
  707. package/dist/test/physical-window-restart.test.js.map +0 -1
  708. package/dist/test/placed-reaction-baseline.test.d.ts +0 -2
  709. package/dist/test/placed-reaction-baseline.test.d.ts.map +0 -1
  710. package/dist/test/placed-reaction-baseline.test.js +0 -312
  711. package/dist/test/placed-reaction-baseline.test.js.map +0 -1
  712. package/dist/test/present-while-acting.test.d.ts +0 -19
  713. package/dist/test/present-while-acting.test.d.ts.map +0 -1
  714. package/dist/test/present-while-acting.test.js +0 -1649
  715. package/dist/test/present-while-acting.test.js.map +0 -1
  716. package/dist/test/prose-segments.test.d.ts +0 -2
  717. package/dist/test/prose-segments.test.d.ts.map +0 -1
  718. package/dist/test/prose-segments.test.js +0 -52
  719. package/dist/test/prose-segments.test.js.map +0 -1
  720. package/dist/test/prose-stream-router.test.d.ts +0 -2
  721. package/dist/test/prose-stream-router.test.d.ts.map +0 -1
  722. package/dist/test/prose-stream-router.test.js +0 -171
  723. package/dist/test/prose-stream-router.test.js.map +0 -1
  724. package/dist/test/provider-acceleration-cooldown.test.d.ts +0 -2
  725. package/dist/test/provider-acceleration-cooldown.test.d.ts.map +0 -1
  726. package/dist/test/provider-acceleration-cooldown.test.js +0 -435
  727. package/dist/test/provider-acceleration-cooldown.test.js.map +0 -1
  728. package/dist/test/provider-waits.test.d.ts +0 -2
  729. package/dist/test/provider-waits.test.d.ts.map +0 -1
  730. package/dist/test/provider-waits.test.js +0 -2259
  731. package/dist/test/provider-waits.test.js.map +0 -1
  732. package/dist/test/puppet-tool-call.test.d.ts +0 -2
  733. package/dist/test/puppet-tool-call.test.d.ts.map +0 -1
  734. package/dist/test/puppet-tool-call.test.js +0 -226
  735. package/dist/test/puppet-tool-call.test.js.map +0 -1
  736. package/dist/test/puppet-turn-reservation.test.d.ts +0 -2
  737. package/dist/test/puppet-turn-reservation.test.d.ts.map +0 -1
  738. package/dist/test/puppet-turn-reservation.test.js +0 -139
  739. package/dist/test/puppet-turn-reservation.test.js.map +0 -1
  740. package/dist/test/reaction-baseline-platform.test.d.ts +0 -2
  741. package/dist/test/reaction-baseline-platform.test.d.ts.map +0 -1
  742. package/dist/test/reaction-baseline-platform.test.js +0 -124
  743. package/dist/test/reaction-baseline-platform.test.js.map +0 -1
  744. package/dist/test/record-journal.test.d.ts +0 -6
  745. package/dist/test/record-journal.test.d.ts.map +0 -1
  746. package/dist/test/record-journal.test.js +0 -269
  747. package/dist/test/record-journal.test.js.map +0 -1
  748. package/dist/test/refusal-reaction-baseline.test.d.ts +0 -2
  749. package/dist/test/refusal-reaction-baseline.test.d.ts.map +0 -1
  750. package/dist/test/refusal-reaction-baseline.test.js +0 -81
  751. package/dist/test/refusal-reaction-baseline.test.js.map +0 -1
  752. package/dist/test/refusal-rewind.test.d.ts +0 -2
  753. package/dist/test/refusal-rewind.test.d.ts.map +0 -1
  754. package/dist/test/refusal-rewind.test.js +0 -117
  755. package/dist/test/refusal-rewind.test.js.map +0 -1
  756. package/dist/test/refusal-single-call.test.d.ts +0 -2
  757. package/dist/test/refusal-single-call.test.d.ts.map +0 -1
  758. package/dist/test/refusal-single-call.test.js +0 -177
  759. package/dist/test/refusal-single-call.test.js.map +0 -1
  760. package/dist/test/release-bump.test.d.ts +0 -2
  761. package/dist/test/release-bump.test.d.ts.map +0 -1
  762. package/dist/test/release-bump.test.js +0 -248
  763. package/dist/test/release-bump.test.js.map +0 -1
  764. package/dist/test/release-changelog.test.d.ts +0 -2
  765. package/dist/test/release-changelog.test.d.ts.map +0 -1
  766. package/dist/test/release-changelog.test.js +0 -159
  767. package/dist/test/release-changelog.test.js.map +0 -1
  768. package/dist/test/release-holds.test.d.ts +0 -2
  769. package/dist/test/release-holds.test.d.ts.map +0 -1
  770. package/dist/test/release-holds.test.js +0 -456
  771. package/dist/test/release-holds.test.js.map +0 -1
  772. package/dist/test/same-round-think-policy.test.d.ts +0 -2
  773. package/dist/test/same-round-think-policy.test.d.ts.map +0 -1
  774. package/dist/test/same-round-think-policy.test.js +0 -853
  775. package/dist/test/same-round-think-policy.test.js.map +0 -1
  776. package/dist/test/save-recent-image.test.d.ts +0 -26
  777. package/dist/test/save-recent-image.test.d.ts.map +0 -1
  778. package/dist/test/save-recent-image.test.js +0 -974
  779. package/dist/test/save-recent-image.test.js.map +0 -1
  780. package/dist/test/shutdown-errors.test.d.ts +0 -2
  781. package/dist/test/shutdown-errors.test.d.ts.map +0 -1
  782. package/dist/test/shutdown-errors.test.js +0 -662
  783. package/dist/test/shutdown-errors.test.js.map +0 -1
  784. package/dist/test/silent-heartbeat-rows.test.d.ts +0 -2
  785. package/dist/test/silent-heartbeat-rows.test.d.ts.map +0 -1
  786. package/dist/test/silent-heartbeat-rows.test.js +0 -451
  787. package/dist/test/silent-heartbeat-rows.test.js.map +0 -1
  788. package/dist/test/silent-heartbeat.test.d.ts +0 -2
  789. package/dist/test/silent-heartbeat.test.d.ts.map +0 -1
  790. package/dist/test/silent-heartbeat.test.js +0 -165
  791. package/dist/test/silent-heartbeat.test.js.map +0 -1
  792. package/dist/test/state-scaling-e2e.test.d.ts +0 -22
  793. package/dist/test/state-scaling-e2e.test.d.ts.map +0 -1
  794. package/dist/test/state-scaling-e2e.test.js +0 -206
  795. package/dist/test/state-scaling-e2e.test.js.map +0 -1
  796. package/dist/test/state-scaling.test.d.ts +0 -12
  797. package/dist/test/state-scaling.test.d.ts.map +0 -1
  798. package/dist/test/state-scaling.test.js +0 -251
  799. package/dist/test/state-scaling.test.js.map +0 -1
  800. package/dist/test/stop-with-host-operations.test.d.ts +0 -20
  801. package/dist/test/stop-with-host-operations.test.d.ts.map +0 -1
  802. package/dist/test/stop-with-host-operations.test.js +0 -1174
  803. package/dist/test/stop-with-host-operations.test.js.map +0 -1
  804. package/dist/test/stop-with-work-in-flight.test.d.ts +0 -23
  805. package/dist/test/stop-with-work-in-flight.test.d.ts.map +0 -1
  806. package/dist/test/stop-with-work-in-flight.test.js +0 -784
  807. package/dist/test/stop-with-work-in-flight.test.js.map +0 -1
  808. package/dist/test/surgery-marks-receipt.test.d.ts +0 -2
  809. package/dist/test/surgery-marks-receipt.test.d.ts.map +0 -1
  810. package/dist/test/surgery-marks-receipt.test.js +0 -540
  811. package/dist/test/surgery-marks-receipt.test.js.map +0 -1
  812. package/dist/test/thinking-token-stamp.test.d.ts +0 -12
  813. package/dist/test/thinking-token-stamp.test.d.ts.map +0 -1
  814. package/dist/test/thinking-token-stamp.test.js +0 -129
  815. package/dist/test/thinking-token-stamp.test.js.map +0 -1
  816. package/dist/test/timezone.test.d.ts +0 -2
  817. package/dist/test/timezone.test.d.ts.map +0 -1
  818. package/dist/test/timezone.test.js +0 -18
  819. package/dist/test/timezone.test.js.map +0 -1
  820. package/dist/test/tool-batch-hook.test.d.ts +0 -8
  821. package/dist/test/tool-batch-hook.test.d.ts.map +0 -1
  822. package/dist/test/tool-batch-hook.test.js +0 -275
  823. package/dist/test/tool-batch-hook.test.js.map +0 -1
  824. package/dist/test/tool-policy.test.d.ts +0 -2
  825. package/dist/test/tool-policy.test.d.ts.map +0 -1
  826. package/dist/test/tool-policy.test.js +0 -51
  827. package/dist/test/tool-policy.test.js.map +0 -1
  828. package/dist/test/tool-presentation.test.d.ts +0 -2
  829. package/dist/test/tool-presentation.test.d.ts.map +0 -1
  830. package/dist/test/tool-presentation.test.js +0 -268
  831. package/dist/test/tool-presentation.test.js.map +0 -1
  832. package/dist/test/tool-result-content.test.d.ts +0 -2
  833. package/dist/test/tool-result-content.test.d.ts.map +0 -1
  834. package/dist/test/tool-result-content.test.js +0 -37
  835. package/dist/test/tool-result-content.test.js.map +0 -1
  836. package/dist/test/tool-result-guard.test.d.ts +0 -2
  837. package/dist/test/tool-result-guard.test.d.ts.map +0 -1
  838. package/dist/test/tool-result-guard.test.js +0 -3729
  839. package/dist/test/tool-result-guard.test.js.map +0 -1
  840. package/dist/test/tool-result-history.test.d.ts +0 -7
  841. package/dist/test/tool-result-history.test.d.ts.map +0 -1
  842. package/dist/test/tool-result-history.test.js +0 -156
  843. package/dist/test/tool-result-history.test.js.map +0 -1
  844. package/dist/test/tool-result-spill.test.d.ts +0 -13
  845. package/dist/test/tool-result-spill.test.d.ts.map +0 -1
  846. package/dist/test/tool-result-spill.test.js +0 -586
  847. package/dist/test/tool-result-spill.test.js.map +0 -1
  848. package/dist/test/tool-wrapper-prose-guard-integration.test.d.ts +0 -2
  849. package/dist/test/tool-wrapper-prose-guard-integration.test.d.ts.map +0 -1
  850. package/dist/test/tool-wrapper-prose-guard-integration.test.js +0 -485
  851. package/dist/test/tool-wrapper-prose-guard-integration.test.js.map +0 -1
  852. package/dist/test/tool-wrapper-prose-guard.test.d.ts +0 -2
  853. package/dist/test/tool-wrapper-prose-guard.test.d.ts.map +0 -1
  854. package/dist/test/tool-wrapper-prose-guard.test.js +0 -34
  855. package/dist/test/tool-wrapper-prose-guard.test.js.map +0 -1
  856. package/dist/test/tools-observe-parser-conformance.test.d.ts +0 -2
  857. package/dist/test/tools-observe-parser-conformance.test.d.ts.map +0 -1
  858. package/dist/test/tools-observe-parser-conformance.test.js +0 -129
  859. package/dist/test/tools-observe-parser-conformance.test.js.map +0 -1
  860. package/dist/test/trunk-channel-routing.test.d.ts +0 -19
  861. package/dist/test/trunk-channel-routing.test.d.ts.map +0 -1
  862. package/dist/test/trunk-channel-routing.test.js +0 -652
  863. package/dist/test/trunk-channel-routing.test.js.map +0 -1
  864. package/dist/test/tune-out-e2e.test.d.ts +0 -2
  865. package/dist/test/tune-out-e2e.test.d.ts.map +0 -1
  866. package/dist/test/tune-out-e2e.test.js +0 -142
  867. package/dist/test/tune-out-e2e.test.js.map +0 -1
  868. package/dist/test/tune-out-gate-composition.test.d.ts +0 -2
  869. package/dist/test/tune-out-gate-composition.test.d.ts.map +0 -1
  870. package/dist/test/tune-out-gate-composition.test.js +0 -221
  871. package/dist/test/tune-out-gate-composition.test.js.map +0 -1
  872. package/dist/test/tune-out-lifecycle.test.d.ts +0 -2
  873. package/dist/test/tune-out-lifecycle.test.d.ts.map +0 -1
  874. package/dist/test/tune-out-lifecycle.test.js +0 -121
  875. package/dist/test/tune-out-lifecycle.test.js.map +0 -1
  876. package/dist/test/turn-trigger-provenance.test.d.ts +0 -2
  877. package/dist/test/turn-trigger-provenance.test.d.ts.map +0 -1
  878. package/dist/test/turn-trigger-provenance.test.js +0 -137
  879. package/dist/test/turn-trigger-provenance.test.js.map +0 -1
  880. package/dist/test/unconvertible-tool-result.test.d.ts +0 -2
  881. package/dist/test/unconvertible-tool-result.test.d.ts.map +0 -1
  882. package/dist/test/unconvertible-tool-result.test.js +0 -358
  883. package/dist/test/unconvertible-tool-result.test.js.map +0 -1
  884. package/dist/test/unsent-compiles.test.d.ts +0 -2
  885. package/dist/test/unsent-compiles.test.d.ts.map +0 -1
  886. package/dist/test/unsent-compiles.test.js +0 -139
  887. package/dist/test/unsent-compiles.test.js.map +0 -1
  888. package/dist/test/usage-accounting.test.d.ts +0 -2
  889. package/dist/test/usage-accounting.test.d.ts.map +0 -1
  890. package/dist/test/usage-accounting.test.js +0 -13
  891. package/dist/test/usage-accounting.test.js.map +0 -1
  892. package/dist/test/usage-tracker.test.d.ts +0 -2
  893. package/dist/test/usage-tracker.test.d.ts.map +0 -1
  894. package/dist/test/usage-tracker.test.js +0 -129
  895. package/dist/test/usage-tracker.test.js.map +0 -1
  896. package/dist/test/utils-surface.test.d.ts +0 -2
  897. package/dist/test/utils-surface.test.d.ts.map +0 -1
  898. package/dist/test/utils-surface.test.js +0 -145
  899. package/dist/test/utils-surface.test.js.map +0 -1
  900. package/dist/test/workspace-branch-continuation.test.d.ts +0 -15
  901. package/dist/test/workspace-branch-continuation.test.d.ts.map +0 -1
  902. package/dist/test/workspace-branch-continuation.test.js +0 -183
  903. package/dist/test/workspace-branch-continuation.test.js.map +0 -1
  904. package/dist/test/workspace-materialize-freshness.test.d.ts +0 -16
  905. package/dist/test/workspace-materialize-freshness.test.d.ts.map +0 -1
  906. package/dist/test/workspace-materialize-freshness.test.js +0 -252
  907. package/dist/test/workspace-materialize-freshness.test.js.map +0 -1
  908. package/dist/test/workspace-path-containment.test.d.ts +0 -19
  909. package/dist/test/workspace-path-containment.test.d.ts.map +0 -1
  910. package/dist/test/workspace-path-containment.test.js +0 -91
  911. package/dist/test/workspace-path-containment.test.js.map +0 -1
  912. package/dist/test/workspace-read-file-from-disk.test.d.ts +0 -17
  913. package/dist/test/workspace-read-file-from-disk.test.d.ts.map +0 -1
  914. package/dist/test/workspace-read-file-from-disk.test.js +0 -174
  915. package/dist/test/workspace-read-file-from-disk.test.js.map +0 -1
  916. package/dist/test/workspace-read-image.test.d.ts +0 -2
  917. package/dist/test/workspace-read-image.test.d.ts.map +0 -1
  918. package/dist/test/workspace-read-image.test.js +0 -597
  919. package/dist/test/workspace-read-image.test.js.map +0 -1
  920. package/dist/test/workspace-read-text.test.d.ts +0 -2
  921. package/dist/test/workspace-read-text.test.d.ts.map +0 -1
  922. package/dist/test/workspace-read-text.test.js +0 -101
  923. package/dist/test/workspace-read-text.test.js.map +0 -1
  924. package/dist/test/workspace-restore-order.test.d.ts +0 -16
  925. package/dist/test/workspace-restore-order.test.d.ts.map +0 -1
  926. package/dist/test/workspace-restore-order.test.js +0 -140
  927. package/dist/test/workspace-restore-order.test.js.map +0 -1
  928. package/dist/test/workspace-three-way.test.d.ts +0 -12
  929. package/dist/test/workspace-three-way.test.d.ts.map +0 -1
  930. package/dist/test/workspace-three-way.test.js +0 -4094
  931. package/dist/test/workspace-three-way.test.js.map +0 -1
  932. package/dist/test/workspace-watcher.test.d.ts +0 -2
  933. package/dist/test/workspace-watcher.test.d.ts.map +0 -1
  934. package/dist/test/workspace-watcher.test.js +0 -281
  935. package/dist/test/workspace-watcher.test.js.map +0 -1
  936. package/dist/test/xml-round-persist.test.d.ts +0 -19
  937. package/dist/test/xml-round-persist.test.d.ts.map +0 -1
  938. package/dist/test/xml-round-persist.test.js +0 -235
  939. package/dist/test/xml-round-persist.test.js.map +0 -1
  940. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -38,6 +38,11 @@ export interface MountConfig {
38
38
  * - Exact name match: ".git", "node_modules"
39
39
  * - Directory glob: "node_modules/**" (anything under node_modules)
40
40
  * - Extension glob: "*.pyc" (any file ending in .pyc)
41
+ * A sync without a path and the watcher pass over what the list covers,
42
+ * and over entries with an editor's swap or backup file name whatever it
43
+ * says, a directory with what lies beneath it: `.name.swp` and `.name.swx`
44
+ * (the whole name), and names ending in `~` or in `.subl…tmp`, matched by
45
+ * `^\..+\.sw[px]$`, `~$` and `\.subl.*\.tmp$`.
41
46
  */
42
47
  ignore?: string[];
43
48
  /** Whether to follow symlinks (default: false) */
@@ -58,9 +63,13 @@ export interface MountConfig {
58
63
  * kept with the mount's disk evidence, so a restart resumes there, unless
59
64
  * the machine went down before the store made the latest place durable.
60
65
  * An agent-action scan (`watch: 'on-agent-action'`) and a listing (`ls`,
61
- * `glob`, `grep`) take up to it from their scope's start every time. Each
62
- * directory's listing is read whole, so a deletion is seen wherever the
63
- * walk lists, whatever it took.
66
+ * `glob`, `grep`) take up to it from their scope's start every time:
67
+ * `glob`'s is the directory its pattern's segments before the first
68
+ * wildcard name beneath its `path`, and `grep`'s the deeper of its `path`
69
+ * and its `glob` filter's directory, as far as disk lists each segment
70
+ * with that spelling as a directory, not a link. Each directory's listing
71
+ * is read whole, so a deletion is seen wherever the walk lists, whatever
72
+ * it took.
64
73
  *
65
74
  * It bounds what a walk observes, not the walk's own work: directories
66
75
  * don't count against it, and each one the walk visits is read whole, so
@@ -74,6 +83,8 @@ export interface MountConfig {
74
83
  *
75
84
  * Self-writes through the module's own tools are already suppressed by the
76
85
  * watcher, so a mount shared between agents only wakes on external writes.
86
+ * A change of a file's mode alone is recorded, and makes no event: it
87
+ * brings nothing new to read.
77
88
  * The EventGate still has final say — use gate policies for path-glob
78
89
  * filtering or to disable wake temporarily via hot-reload.
79
90
  */
@@ -136,7 +147,10 @@ export interface MountState {
136
147
  lastMaterializedSeq: number;
137
148
  /** Paths currently suppressed from watcher (recently materialized) */
138
149
  suppressedPaths: Set<string>;
139
- /** Whether a full scan of the mount has completed this session */
150
+ /**
151
+ * Whether a pass over the whole mount has run this session. On a mount
152
+ * over its walkCap, that pass took the first walkCap entries.
153
+ */
140
154
  initialSyncDone: boolean;
141
155
  /** Branch ID that was active when this mount last materialized */
142
156
  lastMaterializedBranchId: string | null;
@@ -8,6 +8,7 @@
8
8
  import { watch, type FSWatcher } from 'chokidar';
9
9
  import { mkdirSync, statSync } from 'node:fs';
10
10
  import { basename, sep } from 'node:path';
11
+ import { passedOverAt } from './observe.js';
11
12
  import { type MountConfig } from './types.js';
12
13
 
13
14
  export type FsOp = 'created' | 'modified' | 'deleted';
@@ -27,7 +28,8 @@ export interface WatcherEvents {
27
28
  * identical to an empty directory in the recorded state.
28
29
  */
29
30
  export interface WatcherLifecycle {
30
- /** Fires once, when chokidar completes its initial scan. */
31
+ /** Fires when chokidar completes its initial scan: once for each attach, so
32
+ * again after a re-attach. */
31
33
  onReady?: () => void;
32
34
  /** Fires on any chokidar-reported error (ENOENT, EACCES, platform faults). */
33
35
  onError?: (err: Error) => void;
@@ -48,7 +50,8 @@ interface RootIdentity {
48
50
  export class MountWatcher {
49
51
  private watcher: FSWatcher | null = null;
50
52
  // Most recent op seen per path within the current debounce window.
51
- // create -> modify collapses to 'created' (single batch); delete always wins.
53
+ // create -> modify collapses to 'created' (single batch); a trailing delete
54
+ // wins, and delete -> create reads as 'modified' (see mergeOp).
52
55
  private pendingChanges = new Map<string, FsOp>();
53
56
  private debounceTimer: ReturnType<typeof setTimeout> | null = null;
54
57
  private rootPollTimer: ReturnType<typeof setInterval> | null = null;
@@ -67,6 +70,8 @@ export class MountWatcher {
67
70
  config: MountConfig,
68
71
  onChange: (changes: FsChange[]) => void,
69
72
  lifecycle: WatcherLifecycle = {},
73
+ /** Other mounts' directories nested in this one, mount-relative: passed over as a walk passes over them. */
74
+ private readonly others: readonly string[] = [],
70
75
  ) {
71
76
  this.config = config;
72
77
  this.debounceMs = config.watchDebounceMs ?? 300;
@@ -101,10 +106,28 @@ export class MountWatcher {
101
106
  }
102
107
  }
103
108
 
104
- const ignored = this.config.ignore ?? [];
109
+ const ignore = this.config.ignore ?? [];
105
110
 
106
111
  this.watcher = watch(this.config.path, {
107
- ignored: ignored.length > 0 ? ignored : undefined,
112
+ // What a walk passes over by design, by the path relative to the mount:
113
+ // another mount's directory, the mount's ignore list and editors' swap
114
+ // and backup files. chokidar 4
115
+ // compares a string given here with the whole absolute path, so the
116
+ // list itself would match nothing.
117
+ ignored: (path: string) => {
118
+ const relative = this.toRelative(path);
119
+ return relative !== null && passedOverAt(relative, ignore, this.others) !== undefined;
120
+ },
121
+ // Its filter for editors' files tested the whole path, so a directory
122
+ // with a dot in its name hid every `*.swp` beneath it, and the walk
123
+ // didn't agree. An editor's save by rename then arrives as an unlink at
124
+ // once, and an add once `awaitWriteFinish` finds the new copy settled.
125
+ // A pass reads disk, not the ops, after the debounce's quiet spell
126
+ // following the last event: a copy on disk by then is taken in as a
127
+ // change, one still being written is read as it stands and taken in
128
+ // again when its add comes, and a re-add after a longer spell is a
129
+ // deletion and then a creation.
130
+ atomic: false,
108
131
  persistent: true,
109
132
  ignoreInitial: true,
110
133
  followSymlinks: this.config.followSymlinks ?? false,
@@ -0,0 +1,481 @@
1
+ /**
2
+ * Held prose drafts: a resident's plain speech that was not sent.
3
+ *
4
+ * Plain speech is held back for reasons that are right in themselves: an
5
+ * explicit send in the same round suppresses the round's prose (so a "sent
6
+ * it" postscript is not posted twice), a turn may have no destination, and a
7
+ * malformed or unresolvable routing prefix bounces. Before drafts, the held words were
8
+ * kept only as a count (or, in explicit mode, as one in-memory latest-wins
9
+ * clipboard): the law was right, and the penalty was amnesia. A draft keeps
10
+ * the exact words until the resident resends or dismisses them, or the
11
+ * retention below lets it go.
12
+ *
13
+ * The boundary is publication and agency, not visibility: a draft is never
14
+ * published except by its resident's explicit resend (or `{{unsent}}`), and
15
+ * only that resident can list or act on it. Its notices go into the
16
+ * resident's own history — which residents that share one message slot
17
+ * (#197) share, as they already share the assistant turn the words came
18
+ * from.
19
+ *
20
+ * Durability is outside the conversation. Drafts live in a RecordJournal of
21
+ * typed Chronicle records, which do not follow branch switches: undo,
22
+ * rollback, suppression and branch moves never touch them. A draft written
23
+ * in a turn that is later undone stays usable (the words were genuinely
24
+ * written and held back), and a delivered draft stays delivered. The
25
+ * notices that name a draft are conversation, so they do follow the branch: a draft counts as
26
+ * named while a message naming it is on the current branch, and one a
27
+ * rollback or branch move has left unnamed is named again.
28
+ *
29
+ * Drafts are kept, not hoarded. Each resident's KEEP_NEWEST newest drafts
30
+ * are always kept; an older one, in any state, is let go at the journal's
31
+ * next checkpoint once nothing has happened to it (held, named, attempted,
32
+ * answered, dismissed) for KEEP_IDLE_MS. The journal checkpoints what it
33
+ * keeps every CHECKPOINT_EVERY entries, so opening it replays only what came
34
+ * after, and a resident whose drafts change rarely keeps its older ones
35
+ * until then. The words stay in the resident's history either way.
36
+ *
37
+ * A delivery attempt is journaled durably BEFORE its request leaves the
38
+ * host, and its outcome after: an attempt with no recorded outcome (a crash
39
+ * mid-send) reads as unknown, never as unsent. A delivered draft carries a
40
+ * historical receipt — confirmed at a time, to a destination, with the
41
+ * connector's message id when it names one — not a claim that the message
42
+ * still exists. A draft is sent only by its resident's explicit resend or
43
+ * an envelope's {{unsent}}; nothing replays at boot or on a branch move.
44
+ */
45
+
46
+ import { randomInt } from 'node:crypto';
47
+ import type { JsStore } from '@animalabs/chronicle';
48
+ import { RecordJournal } from './record-journal.js';
49
+ import type { PublishDestination, PublishOutcome } from './mcpl/channel-registry.js';
50
+
51
+ /** Chronicle record type of the drafts journal. */
52
+ export const PROSE_DRAFT_RECORD_TYPE = 'framework/prose-draft';
53
+
54
+ /** Why words were held instead of sent. */
55
+ export type DraftReason =
56
+ /** An explicit send in the same round suppressed the round's plain speech. */
57
+ | 'explicit-send'
58
+ /** The speech had no destination (no route this turn, or a failed envelope). */
59
+ | 'no-destination'
60
+ /** An explicit/hybrid routing prefix was missing, malformed or unresolvable. */
61
+ | 'bounced';
62
+
63
+ export interface DraftAttemptOutcome {
64
+ status: PublishOutcome['status'];
65
+ at: number;
66
+ messageId?: string;
67
+ reason?: string;
68
+ detail?: unknown;
69
+ }
70
+
71
+ export interface DraftAttempt {
72
+ attemptId: string;
73
+ at: number;
74
+ destination: PublishDestination;
75
+ /** How the words went out: the drafts tool, or a `{{unsent}}` envelope (explicit or hybrid). */
76
+ via: 'resend' | 'unsent-token';
77
+ /** The resident resent knowing an earlier attempt may have been posted. */
78
+ confirmedDuplicate?: true;
79
+ /** Absent until recorded; an attempt without one reads as unknown. */
80
+ outcome?: DraftAttemptOutcome;
81
+ }
82
+
83
+ /**
84
+ * A draft held with words copied from another draft that may already have
85
+ * been posted (`{{unsent}}` re-bounced while that draft was unconfirmed or in
86
+ * flight). The new draft keeps the whole authored text and carries the same
87
+ * duplication risk: it reads `unconfirmed` until a confirmed delivery.
88
+ */
89
+ export interface InheritedRisk {
90
+ /** The draft whose words were copied in. */
91
+ draftId: string;
92
+ /** The draft whose attempt is the uncertain one, when the copied draft
93
+ * itself carried inherited risk (a chain of re-bounces): the evidence is
94
+ * that original attempt's, never re-invented. */
95
+ sourceDraftId?: string;
96
+ /** That uncertain attempt, when there was one (absent: it was in flight). */
97
+ destination?: PublishDestination;
98
+ at?: number;
99
+ reason: string;
100
+ }
101
+
102
+ export interface Draft {
103
+ id: string;
104
+ agent: string;
105
+ /** The held words, byte for byte as a resend publishes them: a run an
106
+ * explicit send suppressed exactly as written; a bounce or a hold with no
107
+ * destination, its envelope as routing read it (surrounding whitespace
108
+ * trimmed). */
109
+ text: string;
110
+ reason: DraftReason;
111
+ /** Words copied in from a draft that may already have been posted. */
112
+ inheritedRisk?: InheritedRisk;
113
+ /** Short context for the resident: the bounce reason, or the competing conversations. */
114
+ note?: string;
115
+ heldAt: number;
116
+ attempts: DraftAttempt[];
117
+ dismissedAt?: number;
118
+ /** The messages whose notices named this draft, by id. It counts as named
119
+ * while one of them is on the current branch. */
120
+ noticedIn?: string[];
121
+ /** When a notice last named it. */
122
+ noticedAt?: number;
123
+ }
124
+
125
+ /**
126
+ * - `held`: no inherited risk, and never attempted or every attempt
127
+ * definitely failed — resend freely;
128
+ * - `unconfirmed`: no attempt was confirmed and the draft is not dismissed;
129
+ * either an attempt's outcome is unknown (or was never recorded), or the
130
+ * words carry inherited risk regardless of their own attempts. A resend
131
+ * needs explicit confirmation. A later attempt that fails does not resolve
132
+ * an earlier one that may have landed — the uncertainty stays;
133
+ * - `delivered`: an attempt was confirmed — its receipt is historical;
134
+ * - `dismissed`: the resident set it aside.
135
+ */
136
+ export type DraftState = 'held' | 'unconfirmed' | 'delivered' | 'dismissed';
137
+
138
+ export function draftState(draft: Draft): DraftState {
139
+ if (draft.attempts.some((a) => a.outcome?.status === 'delivered')) return 'delivered';
140
+ if (draft.dismissedAt !== undefined) return 'dismissed';
141
+ return uncertainAttempt(draft) || draft.inheritedRisk ? 'unconfirmed' : 'held';
142
+ }
143
+
144
+ /** The most recent attempt that may have been posted (unknown or unrecorded
145
+ * outcome), when no attempt was confirmed. */
146
+ export function uncertainAttempt(draft: Draft): DraftAttempt | undefined {
147
+ if (draft.attempts.some((a) => a.outcome?.status === 'delivered')) return undefined;
148
+ for (let i = draft.attempts.length - 1; i >= 0; i--) {
149
+ const attempt = draft.attempts[i]!;
150
+ if (!attempt.outcome || attempt.outcome.status === 'unknown') return attempt;
151
+ }
152
+ return undefined;
153
+ }
154
+
155
+ type DraftEntry =
156
+ | { op: 'held'; draft: Omit<Draft, 'attempts' | 'dismissedAt' | 'noticedIn' | 'noticedAt'> }
157
+ | { op: 'attempt'; agent: string; id: string; attemptId: string; at: number; destination: PublishDestination; via: DraftAttempt['via']; confirmedDuplicate?: true }
158
+ | { op: 'outcome'; agent: string; id: string; attemptId: string; outcome: DraftAttemptOutcome }
159
+ | { op: 'dismissed'; agent: string; id: string; at: number }
160
+ /** A notice naming these drafts is in the history as message `messageId`.
161
+ * (A record without one names nowhere the drafts can be found again, so
162
+ * they are named once more.) */
163
+ | { op: 'noticed'; agent: string; ids: string[]; at: number; messageId?: string };
164
+
165
+ /** What a checkpoint keeps: every kept draft, in hold order, and each
166
+ * resident's latest bounce, which `{{unsent}}` means whatever became of it. */
167
+ interface DraftSnapshot {
168
+ v: 1;
169
+ drafts: Draft[];
170
+ latestBounces: Record<string, string>;
171
+ }
172
+
173
+ /** Unambiguous lowercase alphabet for short ids (no i/l/o/0/1). */
174
+ const ID_ALPHABET = 'abcdefghjkmnpqrstuvwxyz23456789';
175
+ /**
176
+ * Characters after `d-` in a draft's id: 31^7, about 2.75 × 10^10 ids, so a
177
+ * mistyped id almost never names a real draft, and an id retention let go is
178
+ * given again only rarely (see newId).
179
+ */
180
+ const ID_LENGTH = 7;
181
+
182
+ /** Each resident's newest drafts, by hold order, that are always kept. */
183
+ export const KEEP_NEWEST = 100;
184
+ /** How long an older draft is kept after the last thing that happened to it. */
185
+ export const KEEP_IDLE_MS = 7 * 24 * 60 * 60 * 1000;
186
+ /** Entries the journal takes between checkpoints. */
187
+ export const CHECKPOINT_EVERY = 500;
188
+
189
+ /** The store's retention, KEEP_NEWEST, KEEP_IDLE_MS and CHECKPOINT_EVERY
190
+ * unless given (tests give smaller ones). */
191
+ export interface DraftRetention {
192
+ keepNewest: number;
193
+ keepIdleMs: number;
194
+ checkpointEvery: number;
195
+ }
196
+
197
+ /** The last time anything happened to a draft: held, named, attempted,
198
+ * answered or dismissed. */
199
+ function lastActivity(draft: Draft): number {
200
+ let last = Math.max(draft.heldAt, draft.noticedAt ?? 0, draft.dismissedAt ?? 0);
201
+ for (const attempt of draft.attempts) last = Math.max(last, attempt.at, attempt.outcome?.at ?? 0);
202
+ return last;
203
+ }
204
+
205
+ export class ProseDraftStore {
206
+ private readonly journal: RecordJournal<DraftEntry, DraftSnapshot>;
207
+ /** agent → draft id → draft, in journal (hold) order. */
208
+ private drafts = new Map<string, Map<string, Draft>>();
209
+ /** agent → the id of its latest bounce, kept or not. */
210
+ private latestBounces = new Map<string, string>();
211
+ private readonly retention: DraftRetention;
212
+
213
+ constructor(store: JsStore, retention: Partial<DraftRetention> = {}) {
214
+ this.journal = new RecordJournal<DraftEntry, DraftSnapshot>(store, { type: PROSE_DRAFT_RECORD_TYPE });
215
+ this.retention = {
216
+ keepNewest: retention.keepNewest ?? KEEP_NEWEST,
217
+ keepIdleMs: retention.keepIdleMs ?? KEEP_IDLE_MS,
218
+ checkpointEvery: retention.checkpointEvery ?? CHECKPOINT_EVERY,
219
+ };
220
+ this.reload();
221
+ this.checkpointIfDue();
222
+ }
223
+
224
+ /** Rebuild the projection from the journal (at open, and to reconcile):
225
+ * the latest checkpoint's drafts, then the entries after it. */
226
+ reload(): void {
227
+ const { snapshot, entries } = this.journal.load();
228
+ this.drafts = new Map();
229
+ this.latestBounces = new Map(Object.entries(snapshot?.latestBounces ?? {}));
230
+ for (const draft of snapshot?.drafts ?? []) this.agentDrafts(draft.agent).set(draft.id, draft);
231
+ for (const { entry } of entries) this.reduce(entry);
232
+ }
233
+
234
+ /**
235
+ * Write a checkpoint once CHECKPOINT_EVERY entries have been appended since
236
+ * the last one, letting go of the drafts that aren't kept (see the module
237
+ * header). The projection drops them only once the checkpoint is written,
238
+ * so a failed one changes nothing, and the next write tries again.
239
+ */
240
+ private checkpointIfDue(): void {
241
+ const { keepNewest, keepIdleMs, checkpointEvery } = this.retention;
242
+ if (this.journal.entriesSinceCheckpoint < checkpointEvery) return;
243
+ const now = Date.now();
244
+ const kept = new Map<string, Map<string, Draft>>();
245
+ for (const [agent, drafts] of this.drafts) {
246
+ const all = [...drafts.values()];
247
+ const keep = new Map<string, Draft>();
248
+ all.forEach((draft, i) => {
249
+ if (i >= all.length - keepNewest || now - lastActivity(draft) < keepIdleMs) keep.set(draft.id, draft);
250
+ });
251
+ if (keep.size > 0) kept.set(agent, keep);
252
+ }
253
+ const snapshot: DraftSnapshot = {
254
+ v: 1,
255
+ drafts: [...kept.values()].flatMap((m) => [...m.values()]),
256
+ latestBounces: Object.fromEntries(this.latestBounces),
257
+ };
258
+ try {
259
+ this.journal.checkpoint(snapshot);
260
+ } catch (err) {
261
+ console.error('[drafts] checkpoint failed; the next write tries again:', err);
262
+ if (this.journal.needsReconcile) this.reload();
263
+ return;
264
+ }
265
+ this.drafts = kept;
266
+ }
267
+
268
+ private reduce(entry: DraftEntry): void {
269
+ if (entry.op === 'held') {
270
+ this.agentDrafts(entry.draft.agent).set(entry.draft.id, { ...entry.draft, attempts: [] });
271
+ if (entry.draft.reason === 'bounced') this.latestBounces.set(entry.draft.agent, entry.draft.id);
272
+ return;
273
+ }
274
+ if (entry.op === 'noticed') {
275
+ if (entry.messageId === undefined) return;
276
+ for (const id of entry.ids) {
277
+ const draft = this.drafts.get(entry.agent)?.get(id);
278
+ if (!draft) continue;
279
+ draft.noticedIn ??= [];
280
+ if (!draft.noticedIn.includes(entry.messageId)) draft.noticedIn.push(entry.messageId);
281
+ draft.noticedAt = Math.max(draft.noticedAt ?? 0, entry.at);
282
+ }
283
+ return;
284
+ }
285
+ const draft = this.drafts.get(entry.agent)?.get(entry.id);
286
+ if (!draft) return;
287
+ if (entry.op === 'dismissed') {
288
+ draft.dismissedAt ??= entry.at;
289
+ } else if (entry.op === 'attempt') {
290
+ draft.attempts.push({
291
+ attemptId: entry.attemptId,
292
+ at: entry.at,
293
+ destination: entry.destination,
294
+ via: entry.via,
295
+ ...(entry.confirmedDuplicate ? { confirmedDuplicate: true as const } : {}),
296
+ });
297
+ } else if (entry.op === 'outcome') {
298
+ const attempt = draft.attempts.find((a) => a.attemptId === entry.attemptId);
299
+ if (attempt) attempt.outcome = entry.outcome;
300
+ }
301
+ }
302
+
303
+ /**
304
+ * Journal and apply one entry. A write that fails after the store's append
305
+ * returned leaves the journal unreconciled: rebuild from it before
306
+ * rethrowing, so the projection never disagrees with what the journal
307
+ * holds. An append that fails inside the store can't be read back until
308
+ * the store is reopened: the journal then refuses every write until the
309
+ * next start, which replays that entry, so until then each write throws,
310
+ * no new draft is kept, and the projection lacks that entry.
311
+ */
312
+ private write(entry: DraftEntry, durable: boolean, afterCommittedState = false): void {
313
+ try {
314
+ this.journal.append(entry, { durable, afterCommittedState });
315
+ } catch (err) {
316
+ if (this.journal.needsReconcile) this.reload();
317
+ throw err;
318
+ }
319
+ this.reduce(entry);
320
+ this.checkpointIfDue();
321
+ }
322
+
323
+ private agentDrafts(agent: string): Map<string, Draft> {
324
+ let map = this.drafts.get(agent);
325
+ if (!map) {
326
+ map = new Map();
327
+ this.drafts.set(agent, map);
328
+ }
329
+ return map;
330
+ }
331
+
332
+ /** A new id, unique among the resident's kept drafts and never its latest
333
+ * bounce's. One that retention let go can be given again: after N more
334
+ * of its resident's drafts, a given let-go id has come back with a
335
+ * probability of about N in 2.75 × 10^10 (ID_LENGTH), and a request naming
336
+ * it then reaches the newer draft rather than being refused. */
337
+ private newId(agent: string): string {
338
+ const existing = this.agentDrafts(agent);
339
+ const latestBounce = this.latestBounces.get(agent);
340
+ for (;;) {
341
+ let id = 'd-';
342
+ for (let i = 0; i < ID_LENGTH; i++) id += ID_ALPHABET[randomInt(ID_ALPHABET.length)];
343
+ if (!existing.has(id) && id !== latestBounce) return id;
344
+ }
345
+ }
346
+
347
+ /**
348
+ * Hold words as drafts, in order, each journaled durably before this
349
+ * returns. If the journal refuses a write (after reconciling), the drafts
350
+ * already written stand and the rest are reported as not held: their words
351
+ * remain in the resident's history only. A draft whose record reached the
352
+ * store before its write failed (its sync did) is in the reconciled
353
+ * journal, so it is held, and counted so. When the store's append itself
354
+ * threw, the record may still be in its log: the draft is reported as not
355
+ * held, and the journal refuses further writes until a reload, which
356
+ * replays it as held if it is there.
357
+ */
358
+ hold(
359
+ agent: string,
360
+ segments: Array<{ text: string; note?: string; inheritedRisk?: InheritedRisk }>,
361
+ reason: DraftReason,
362
+ note?: string,
363
+ ): { held: Draft[]; notHeld?: { count: number; error: string } } {
364
+ const held: Draft[] = [];
365
+ for (let i = 0; i < segments.length; i++) {
366
+ const segment = segments[i]!;
367
+ const segmentNote = segment.note ?? note;
368
+ const draft = {
369
+ id: this.newId(agent),
370
+ agent,
371
+ text: segment.text,
372
+ reason,
373
+ ...(segmentNote ? { note: segmentNote } : {}),
374
+ ...(segment.inheritedRisk ? { inheritedRisk: segment.inheritedRisk } : {}),
375
+ heldAt: Date.now(),
376
+ };
377
+ try {
378
+ this.write({ op: 'held', draft }, true);
379
+ } catch (err) {
380
+ const error = err instanceof Error ? err.message : String(err);
381
+ const landed = this.get(agent, draft.id);
382
+ if (landed) {
383
+ console.error(`[drafts] ${agent}: ${landed.id} reached the journal, but its write then failed (${error}); it is held`);
384
+ held.push(landed);
385
+ }
386
+ const count = segments.length - i - (landed ? 1 : 0);
387
+ return { held, ...(count > 0 ? { notHeld: { count, error } } : {}) };
388
+ }
389
+ held.push(this.get(agent, draft.id)!);
390
+ }
391
+ return { held };
392
+ }
393
+
394
+ get(agent: string, id: string): Draft | undefined {
395
+ return this.drafts.get(agent)?.get(id);
396
+ }
397
+
398
+ /** Held and unconfirmed drafts, newest first (journal order, which is
399
+ * exact even for segments held in the same millisecond). */
400
+ open(agent: string): Draft[] {
401
+ return [...(this.drafts.get(agent)?.values() ?? [])]
402
+ .filter((d) => { const s = draftState(d); return s === 'held' || s === 'unconfirmed'; })
403
+ .reverse();
404
+ }
405
+
406
+ /**
407
+ * Open drafts, newest first, that no notice on the current branch names:
408
+ * none was recorded (a crash before the notice), or a rollback or branch
409
+ * move took away every message that named them. `onBranch` says whether a
410
+ * message, by id, is on the current branch.
411
+ */
412
+ unnoticed(agent: string, onBranch: (messageId: string) => boolean): Draft[] {
413
+ return this.open(agent).filter((d) => !d.noticedIn?.some(onBranch));
414
+ }
415
+
416
+ /**
417
+ * Record that message `messageId`, a notice naming these drafts, is in the
418
+ * resident's history. The notice is conversation state, buffered until the
419
+ * store syncs, while this record reaches the OS at once: so the store is
420
+ * synced FIRST (afterCommittedState), and a notice that never became
421
+ * durable can't leave a record that suppresses the crash catch-up.
422
+ */
423
+ markNoticed(agent: string, ids: string[], messageId: string): void {
424
+ if (ids.length === 0) return;
425
+ this.write({ op: 'noticed', agent, ids, at: Date.now(), messageId }, true, true);
426
+ }
427
+
428
+ dismiss(agent: string, id: string): void {
429
+ this.write({ op: 'dismissed', agent, id, at: Date.now() }, true);
430
+ }
431
+
432
+ /**
433
+ * Journal a delivery attempt durably, BEFORE the request leaves the host.
434
+ * Throws (having reconciled) when it cannot be made durable: the caller
435
+ * must then not send.
436
+ */
437
+ beginAttempt(
438
+ agent: string,
439
+ id: string,
440
+ destination: PublishDestination,
441
+ via: DraftAttempt['via'],
442
+ confirmedDuplicate: boolean,
443
+ ): string {
444
+ const attemptId = `a-${Date.now().toString(36)}-${randomInt(36 ** 4).toString(36)}`;
445
+ this.write({
446
+ op: 'attempt', agent, id, attemptId, at: Date.now(), destination, via,
447
+ ...(confirmedDuplicate ? { confirmedDuplicate: true as const } : {}),
448
+ }, true);
449
+ return attemptId;
450
+ }
451
+
452
+ /** Journal what an attempt established. */
453
+ recordOutcome(agent: string, id: string, attemptId: string, outcome: PublishOutcome): void {
454
+ this.write({
455
+ op: 'outcome', agent, id, attemptId,
456
+ outcome: {
457
+ status: outcome.status,
458
+ at: outcome.at,
459
+ ...(outcome.messageId ? { messageId: outcome.messageId } : {}),
460
+ ...(outcome.reason ? { reason: outcome.reason } : {}),
461
+ ...(outcome.detail !== undefined ? { detail: outcome.detail } : {}),
462
+ },
463
+ }, true);
464
+ }
465
+
466
+ /**
467
+ * Explicit and hybrid mode's `{{unsent}}`: the most recent bounce, while
468
+ * that draft is still open (held or unconfirmed — the caller must not
469
+ * resend an unconfirmed one without the resident's confirmation).
470
+ * Latest-wins, like the clipboard it replaces: once the latest bounce is
471
+ * delivered, dismissed or let go there is nothing to substitute, even if
472
+ * older bounces are still held (they stay in the collection, by id).
473
+ */
474
+ latestBounce(agent: string): Draft | undefined {
475
+ const id = this.latestBounces.get(agent);
476
+ const latest = id === undefined ? undefined : this.get(agent, id);
477
+ if (!latest) return undefined;
478
+ const state = draftState(latest);
479
+ return state === 'held' || state === 'unconfirmed' ? latest : undefined;
480
+ }
481
+ }
@@ -10,26 +10,40 @@
10
10
  * collapsing those distinct messages into one (item 4). This helper instead
11
11
  * yields each contiguous run of text — the segments a surface should deliver as
12
12
  * separate, ordered messages. Contiguous text blocks merge into one segment;
13
- * `tool_use` / `tool_result` blocks are segment boundaries; empty or
13
+ * `tool_use` / `tool_result` blocks are segment boundaries, as are XML tool
14
+ * mode's `tool_attempt` / `tool_notice` (a refused attempt and the harness's
15
+ * notice end a round just as a call and its results do); empty or
14
16
  * whitespace-only runs are dropped.
15
17
  */
16
18
 
17
19
  import type { ContentBlock } from '@animalabs/membrane';
18
20
 
19
- export function splitProseSegments(content: readonly ContentBlock[]): string[] {
20
- const segments: string[] = [];
21
+ /**
22
+ * The runs exactly as written: contiguous text blocks joined with a newline,
23
+ * nothing trimmed. Whitespace-only runs are dropped. Held drafts keep these,
24
+ * so a draft's words (indentation included) are the resident's own, byte for
25
+ * byte; speech routes each run trimmed of surrounding whitespace.
26
+ */
27
+ export function splitProseRuns(content: readonly ContentBlock[]): string[] {
28
+ const runs: string[] = [];
21
29
  let buf: string[] = [];
22
30
 
23
31
  const flush = (): void => {
24
- const s = buf.join('\n').trim();
25
- if (s) segments.push(s);
32
+ const run = buf.join('\n');
33
+ if (run.trim()) runs.push(run);
26
34
  buf = [];
27
35
  };
28
36
 
29
37
  for (const block of content) {
30
- if (block.type === 'text') {
38
+ const type = block.type as string;
39
+ if (type === 'text') {
31
40
  buf.push((block as ContentBlock & { type: 'text' }).text);
32
- } else if (block.type === 'tool_use' || block.type === 'tool_result') {
41
+ } else if (
42
+ type === 'tool_use' ||
43
+ type === 'tool_result' ||
44
+ type === 'tool_attempt' ||
45
+ type === 'tool_notice'
46
+ ) {
33
47
  flush();
34
48
  }
35
49
  // Other block types (thinking, redacted_thinking, image, …) are neither
@@ -38,5 +52,34 @@ export function splitProseSegments(content: readonly ContentBlock[]): string[] {
38
52
  }
39
53
  flush();
40
54
 
41
- return segments;
55
+ return runs;
56
+ }
57
+
58
+ /**
59
+ * A turn's content without the prose of some of its tool rounds, the turn's
60
+ * rounds counted from 0 in order. A round's prose is its text
61
+ * before its calls, and a round starts at the first block after the previous
62
+ * round's `tool_result` blocks. So a round with no prose still counts, two
63
+ * calls of one round (their `tool_use` blocks come before any result) stay
64
+ * one round, and a round is found by its place, whatever its text holds.
65
+ * Other rounds' text, every non-text block and the text after the last round
66
+ * stay.
67
+ */
68
+ export function withoutRoundsProse(
69
+ content: readonly ContentBlock[],
70
+ rounds: ReadonlySet<number>,
71
+ ): ContentBlock[] {
72
+ let round = 0;
73
+ let afterResults = false;
74
+ return content.filter((block) => {
75
+ if (block.type === 'tool_result') {
76
+ afterResults = true;
77
+ return true;
78
+ }
79
+ if (afterResults) {
80
+ round++;
81
+ afterResults = false;
82
+ }
83
+ return !(block.type === 'text' && rounds.has(round));
84
+ });
42
85
  }