@animalabs/agent-framework 0.22.1 → 0.22.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (946) hide show
  1. package/README.md +4 -2
  2. package/dist/src/agent.d.ts +266 -28
  3. package/dist/src/agent.d.ts.map +1 -1
  4. package/dist/src/agent.js +539 -104
  5. package/dist/src/agent.js.map +1 -1
  6. package/dist/src/api/mcp-server-core.d.ts +41 -0
  7. package/dist/src/api/mcp-server-core.d.ts.map +1 -0
  8. package/dist/src/api/mcp-server-core.js +593 -0
  9. package/dist/src/api/mcp-server-core.js.map +1 -0
  10. package/dist/src/api/mcp-server.d.ts +2 -36
  11. package/dist/src/api/mcp-server.d.ts.map +1 -1
  12. package/dist/src/api/mcp-server.js +15 -595
  13. package/dist/src/api/mcp-server.js.map +1 -1
  14. package/dist/src/api/server.d.ts +9 -1
  15. package/dist/src/api/server.d.ts.map +1 -1
  16. package/dist/src/api/server.js +55 -27
  17. package/dist/src/api/server.js.map +1 -1
  18. package/dist/src/api/types.d.ts +10 -2
  19. package/dist/src/api/types.d.ts.map +1 -1
  20. package/dist/src/branch-names.d.ts +14 -0
  21. package/dist/src/branch-names.d.ts.map +1 -0
  22. package/dist/src/branch-names.js +22 -0
  23. package/dist/src/branch-names.js.map +1 -0
  24. package/dist/src/closest-names.d.ts +28 -0
  25. package/dist/src/closest-names.d.ts.map +1 -0
  26. package/dist/src/closest-names.js +98 -0
  27. package/dist/src/closest-names.js.map +1 -0
  28. package/dist/src/code-execution/py-runner.d.ts +16 -5
  29. package/dist/src/code-execution/py-runner.d.ts.map +1 -1
  30. package/dist/src/code-execution/py-runner.js +186 -74
  31. package/dist/src/code-execution/py-runner.js.map +1 -1
  32. package/dist/src/code-execution/runtime-py.d.ts.map +1 -1
  33. package/dist/src/code-execution/runtime-py.js +49 -3
  34. package/dist/src/code-execution/runtime-py.js.map +1 -1
  35. package/dist/src/code-execution/tool-definition.d.ts +12 -1
  36. package/dist/src/code-execution/tool-definition.d.ts.map +1 -1
  37. package/dist/src/code-execution/tool-definition.js +21 -3
  38. package/dist/src/code-execution/tool-definition.js.map +1 -1
  39. package/dist/src/config-checks.d.ts +28 -0
  40. package/dist/src/config-checks.d.ts.map +1 -0
  41. package/dist/src/config-checks.js +52 -0
  42. package/dist/src/config-checks.js.map +1 -0
  43. package/dist/src/deadline-timer.d.ts +21 -0
  44. package/dist/src/deadline-timer.d.ts.map +1 -0
  45. package/dist/src/deadline-timer.js +43 -0
  46. package/dist/src/deadline-timer.js.map +1 -0
  47. package/dist/src/error-message.d.ts +30 -0
  48. package/dist/src/error-message.d.ts.map +1 -0
  49. package/dist/src/error-message.js +50 -0
  50. package/dist/src/error-message.js.map +1 -0
  51. package/dist/src/framework.d.ts +1212 -192
  52. package/dist/src/framework.d.ts.map +1 -1
  53. package/dist/src/framework.js +6686 -1835
  54. package/dist/src/framework.js.map +1 -1
  55. package/dist/src/gate/event-gate.d.ts +8 -0
  56. package/dist/src/gate/event-gate.d.ts.map +1 -1
  57. package/dist/src/gate/event-gate.js +27 -3
  58. package/dist/src/gate/event-gate.js.map +1 -1
  59. package/dist/src/gate/gate-script.d.ts.map +1 -1
  60. package/dist/src/gate/gate-script.js.map +1 -1
  61. package/dist/src/index.d.ts +5 -3
  62. package/dist/src/index.d.ts.map +1 -1
  63. package/dist/src/index.js +5 -3
  64. package/dist/src/index.js.map +1 -1
  65. package/dist/src/mcpl/capability-grant.d.ts.map +1 -1
  66. package/dist/src/mcpl/channel-registry.d.ts +170 -13
  67. package/dist/src/mcpl/channel-registry.d.ts.map +1 -1
  68. package/dist/src/mcpl/channel-registry.js +499 -258
  69. package/dist/src/mcpl/channel-registry.js.map +1 -1
  70. package/dist/src/mcpl/checkpoint-manager.d.ts +21 -1
  71. package/dist/src/mcpl/checkpoint-manager.d.ts.map +1 -1
  72. package/dist/src/mcpl/checkpoint-manager.js +91 -30
  73. package/dist/src/mcpl/checkpoint-manager.js.map +1 -1
  74. package/dist/src/mcpl/conversation-router.d.ts +19 -3
  75. package/dist/src/mcpl/conversation-router.d.ts.map +1 -1
  76. package/dist/src/mcpl/conversation-router.js +23 -8
  77. package/dist/src/mcpl/conversation-router.js.map +1 -1
  78. package/dist/src/mcpl/convert-block.d.ts +20 -0
  79. package/dist/src/mcpl/convert-block.d.ts.map +1 -0
  80. package/dist/src/mcpl/convert-block.js +89 -0
  81. package/dist/src/mcpl/convert-block.js.map +1 -0
  82. package/dist/src/mcpl/errors.d.ts +13 -0
  83. package/dist/src/mcpl/errors.d.ts.map +1 -1
  84. package/dist/src/mcpl/errors.js +28 -0
  85. package/dist/src/mcpl/errors.js.map +1 -1
  86. package/dist/src/mcpl/feature-set-manager.d.ts.map +1 -1
  87. package/dist/src/mcpl/feature-set-manager.js +4 -3
  88. package/dist/src/mcpl/feature-set-manager.js.map +1 -1
  89. package/dist/src/mcpl/hook-orchestrator.d.ts +23 -0
  90. package/dist/src/mcpl/hook-orchestrator.d.ts.map +1 -1
  91. package/dist/src/mcpl/hook-orchestrator.js +83 -72
  92. package/dist/src/mcpl/hook-orchestrator.js.map +1 -1
  93. package/dist/src/mcpl/inbound-source.d.ts +114 -0
  94. package/dist/src/mcpl/inbound-source.d.ts.map +1 -0
  95. package/dist/src/mcpl/inbound-source.js +83 -0
  96. package/dist/src/mcpl/inbound-source.js.map +1 -0
  97. package/dist/src/mcpl/index.d.ts +3 -1
  98. package/dist/src/mcpl/index.d.ts.map +1 -1
  99. package/dist/src/mcpl/index.js +3 -1
  100. package/dist/src/mcpl/index.js.map +1 -1
  101. package/dist/src/mcpl/inference-router.d.ts +15 -11
  102. package/dist/src/mcpl/inference-router.d.ts.map +1 -1
  103. package/dist/src/mcpl/inference-router.js +153 -84
  104. package/dist/src/mcpl/inference-router.js.map +1 -1
  105. package/dist/src/mcpl/log-value.d.ts +54 -0
  106. package/dist/src/mcpl/log-value.d.ts.map +1 -0
  107. package/dist/src/mcpl/log-value.js +109 -0
  108. package/dist/src/mcpl/log-value.js.map +1 -0
  109. package/dist/src/mcpl/prose-stream-router.d.ts +6 -6
  110. package/dist/src/mcpl/prose-stream-router.d.ts.map +1 -1
  111. package/dist/src/mcpl/prose-stream-router.js +4 -4
  112. package/dist/src/mcpl/prose-stream-router.js.map +1 -1
  113. package/dist/src/mcpl/push-coalescer.d.ts +64 -7
  114. package/dist/src/mcpl/push-coalescer.d.ts.map +1 -1
  115. package/dist/src/mcpl/push-coalescer.js +121 -24
  116. package/dist/src/mcpl/push-coalescer.js.map +1 -1
  117. package/dist/src/mcpl/push-handler.d.ts +38 -8
  118. package/dist/src/mcpl/push-handler.d.ts.map +1 -1
  119. package/dist/src/mcpl/push-handler.js +77 -78
  120. package/dist/src/mcpl/push-handler.js.map +1 -1
  121. package/dist/src/mcpl/reference-fetcher.d.ts +14 -2
  122. package/dist/src/mcpl/reference-fetcher.d.ts.map +1 -1
  123. package/dist/src/mcpl/reference-fetcher.js +72 -30
  124. package/dist/src/mcpl/reference-fetcher.js.map +1 -1
  125. package/dist/src/mcpl/references.d.ts +49 -14
  126. package/dist/src/mcpl/references.d.ts.map +1 -1
  127. package/dist/src/mcpl/references.js +74 -21
  128. package/dist/src/mcpl/references.js.map +1 -1
  129. package/dist/src/mcpl/refusal-lines.d.ts +37 -0
  130. package/dist/src/mcpl/refusal-lines.d.ts.map +1 -0
  131. package/dist/src/mcpl/refusal-lines.js +61 -0
  132. package/dist/src/mcpl/refusal-lines.js.map +1 -0
  133. package/dist/src/mcpl/scope-manager.d.ts.map +1 -1
  134. package/dist/src/mcpl/server-connection.d.ts +107 -12
  135. package/dist/src/mcpl/server-connection.d.ts.map +1 -1
  136. package/dist/src/mcpl/server-connection.js +470 -139
  137. package/dist/src/mcpl/server-connection.js.map +1 -1
  138. package/dist/src/mcpl/server-registry.d.ts +10 -1
  139. package/dist/src/mcpl/server-registry.d.ts.map +1 -1
  140. package/dist/src/mcpl/server-registry.js +14 -3
  141. package/dist/src/mcpl/server-registry.js.map +1 -1
  142. package/dist/src/mcpl/skip-reply-wake.d.ts +36 -0
  143. package/dist/src/mcpl/skip-reply-wake.d.ts.map +1 -0
  144. package/dist/src/mcpl/skip-reply-wake.js +55 -0
  145. package/dist/src/mcpl/skip-reply-wake.js.map +1 -0
  146. package/dist/src/mcpl/tool-classes.d.ts +1 -1
  147. package/dist/src/mcpl/tool-classes.d.ts.map +1 -1
  148. package/dist/src/mcpl/tool-classes.js +3 -2
  149. package/dist/src/mcpl/tool-classes.js.map +1 -1
  150. package/dist/src/mcpl/tool-lifecycle.d.ts.map +1 -1
  151. package/dist/src/mcpl/tool-lifecycle.js.map +1 -1
  152. package/dist/src/mcpl/transport.d.ts +74 -7
  153. package/dist/src/mcpl/transport.d.ts.map +1 -1
  154. package/dist/src/mcpl/transport.js +209 -22
  155. package/dist/src/mcpl/transport.js.map +1 -1
  156. package/dist/src/mcpl/types.d.ts +43 -28
  157. package/dist/src/mcpl/types.d.ts.map +1 -1
  158. package/dist/src/mcpl/types.js.map +1 -1
  159. package/dist/src/mcpl/visible-content.d.ts +15 -0
  160. package/dist/src/mcpl/visible-content.d.ts.map +1 -1
  161. package/dist/src/mcpl/visible-content.js +25 -0
  162. package/dist/src/mcpl/visible-content.js.map +1 -1
  163. package/dist/src/module-registry.d.ts +19 -1
  164. package/dist/src/module-registry.d.ts.map +1 -1
  165. package/dist/src/module-registry.js +54 -25
  166. package/dist/src/module-registry.js.map +1 -1
  167. package/dist/src/modules/api/index.d.ts.map +1 -1
  168. package/dist/src/modules/api/index.js +1 -1
  169. package/dist/src/modules/api/index.js.map +1 -1
  170. package/dist/src/modules/discord/discord-js-client.d.ts +1 -0
  171. package/dist/src/modules/discord/discord-js-client.d.ts.map +1 -1
  172. package/dist/src/modules/discord/discord-js-client.js +25 -9
  173. package/dist/src/modules/discord/discord-js-client.js.map +1 -1
  174. package/dist/src/modules/discord/index.d.ts +29 -3
  175. package/dist/src/modules/discord/index.d.ts.map +1 -1
  176. package/dist/src/modules/discord/index.js +383 -145
  177. package/dist/src/modules/discord/index.js.map +1 -1
  178. package/dist/src/modules/discord/types.d.ts +14 -1
  179. package/dist/src/modules/discord/types.d.ts.map +1 -1
  180. package/dist/src/modules/health/index.d.ts.map +1 -1
  181. package/dist/src/modules/health/index.js +2 -1
  182. package/dist/src/modules/health/index.js.map +1 -1
  183. package/dist/src/modules/history/index.d.ts +3 -1
  184. package/dist/src/modules/history/index.d.ts.map +1 -1
  185. package/dist/src/modules/history/index.js +359 -127
  186. package/dist/src/modules/history/index.js.map +1 -1
  187. package/dist/src/modules/history/semantic.d.ts +28 -1
  188. package/dist/src/modules/history/semantic.d.ts.map +1 -1
  189. package/dist/src/modules/history/semantic.js +177 -32
  190. package/dist/src/modules/history/semantic.js.map +1 -1
  191. package/dist/src/modules/unknown-tool.d.ts +10 -0
  192. package/dist/src/modules/unknown-tool.d.ts.map +1 -0
  193. package/dist/src/modules/unknown-tool.js +17 -0
  194. package/dist/src/modules/unknown-tool.js.map +1 -0
  195. package/dist/src/modules/workspace/branch-intent.d.ts.map +1 -1
  196. package/dist/src/modules/workspace/branch-intent.js.map +1 -1
  197. package/dist/src/modules/workspace/disk-agreement.d.ts +54 -6
  198. package/dist/src/modules/workspace/disk-agreement.d.ts.map +1 -1
  199. package/dist/src/modules/workspace/disk-agreement.js +93 -27
  200. package/dist/src/modules/workspace/disk-agreement.js.map +1 -1
  201. package/dist/src/modules/workspace/effects.d.ts +64 -6
  202. package/dist/src/modules/workspace/effects.d.ts.map +1 -1
  203. package/dist/src/modules/workspace/effects.js +291 -44
  204. package/dist/src/modules/workspace/effects.js.map +1 -1
  205. package/dist/src/modules/workspace/index.d.ts +127 -27
  206. package/dist/src/modules/workspace/index.d.ts.map +1 -1
  207. package/dist/src/modules/workspace/index.js +821 -248
  208. package/dist/src/modules/workspace/index.js.map +1 -1
  209. package/dist/src/modules/workspace/observe.d.ts +117 -15
  210. package/dist/src/modules/workspace/observe.d.ts.map +1 -1
  211. package/dist/src/modules/workspace/observe.js +436 -51
  212. package/dist/src/modules/workspace/observe.js.map +1 -1
  213. package/dist/src/modules/workspace/reconcile.d.ts +75 -8
  214. package/dist/src/modules/workspace/reconcile.d.ts.map +1 -1
  215. package/dist/src/modules/workspace/reconcile.js +576 -68
  216. package/dist/src/modules/workspace/reconcile.js.map +1 -1
  217. package/dist/src/modules/workspace/types.d.ts +42 -3
  218. package/dist/src/modules/workspace/types.d.ts.map +1 -1
  219. package/dist/src/modules/workspace/types.js.map +1 -1
  220. package/dist/src/modules/workspace/watcher.d.ts +7 -2
  221. package/dist/src/modules/workspace/watcher.d.ts.map +1 -1
  222. package/dist/src/modules/workspace/watcher.js +28 -4
  223. package/dist/src/modules/workspace/watcher.js.map +1 -1
  224. package/dist/src/operator-log.d.ts.map +1 -1
  225. package/dist/src/operator-log.js.map +1 -1
  226. package/dist/src/prose-drafts.d.ts +240 -0
  227. package/dist/src/prose-drafts.d.ts.map +1 -0
  228. package/dist/src/prose-drafts.js +362 -0
  229. package/dist/src/prose-drafts.js.map +1 -0
  230. package/dist/src/prose-segments.d.ts +21 -2
  231. package/dist/src/prose-segments.d.ts.map +1 -1
  232. package/dist/src/prose-segments.js +46 -9
  233. package/dist/src/prose-segments.js.map +1 -1
  234. package/dist/src/provider-waits.d.ts.map +1 -1
  235. package/dist/src/provider-waits.js.map +1 -1
  236. package/dist/src/queue.d.ts.map +1 -1
  237. package/dist/src/record-journal.d.ts.map +1 -1
  238. package/dist/src/record-journal.js.map +1 -1
  239. package/dist/src/recovery/discord-awareness-outbox.d.ts.map +1 -1
  240. package/dist/src/recovery/discord-awareness-outbox.js.map +1 -1
  241. package/dist/src/recovery/offline-branch.d.ts +1 -0
  242. package/dist/src/recovery/offline-branch.d.ts.map +1 -1
  243. package/dist/src/recovery/offline-branch.js +32 -25
  244. package/dist/src/recovery/offline-branch.js.map +1 -1
  245. package/dist/src/recovery/recover-cli.js.map +1 -1
  246. package/dist/src/runtime/liveness-watchdog.d.ts.map +1 -1
  247. package/dist/src/runtime/liveness-watchdog.js.map +1 -1
  248. package/dist/src/safe-slice.d.ts +5 -1
  249. package/dist/src/safe-slice.d.ts.map +1 -1
  250. package/dist/src/safe-slice.js +9 -1
  251. package/dist/src/safe-slice.js.map +1 -1
  252. package/dist/src/shutdown.d.ts.map +1 -1
  253. package/dist/src/shutdown.js.map +1 -1
  254. package/dist/src/stored-removal.d.ts +73 -0
  255. package/dist/src/stored-removal.d.ts.map +1 -0
  256. package/dist/src/stored-removal.js +100 -0
  257. package/dist/src/stored-removal.js.map +1 -0
  258. package/dist/src/thinking-token-stamp.js.map +1 -1
  259. package/dist/src/tool-image-ledger.d.ts +87 -19
  260. package/dist/src/tool-image-ledger.d.ts.map +1 -1
  261. package/dist/src/tool-image-ledger.js +135 -32
  262. package/dist/src/tool-image-ledger.js.map +1 -1
  263. package/dist/src/tool-presentation.d.ts +9 -0
  264. package/dist/src/tool-presentation.d.ts.map +1 -1
  265. package/dist/src/tool-presentation.js +257 -60
  266. package/dist/src/tool-presentation.js.map +1 -1
  267. package/dist/src/tool-result-guard.d.ts.map +1 -1
  268. package/dist/src/tool-result-guard.js +7 -10
  269. package/dist/src/tool-result-guard.js.map +1 -1
  270. package/dist/src/tool-result-history.d.ts +32 -3
  271. package/dist/src/tool-result-history.d.ts.map +1 -1
  272. package/dist/src/tool-result-history.js +106 -19
  273. package/dist/src/tool-result-history.js.map +1 -1
  274. package/dist/src/tune-out/coordinator.d.ts +25 -1
  275. package/dist/src/tune-out/coordinator.d.ts.map +1 -1
  276. package/dist/src/tune-out/coordinator.js +260 -65
  277. package/dist/src/tune-out/coordinator.js.map +1 -1
  278. package/dist/src/tune-out/tools.d.ts +1 -1
  279. package/dist/src/tune-out/tools.d.ts.map +1 -1
  280. package/dist/src/types/agent.d.ts +59 -11
  281. package/dist/src/types/agent.d.ts.map +1 -1
  282. package/dist/src/types/events.d.ts +17 -0
  283. package/dist/src/types/events.d.ts.map +1 -1
  284. package/dist/src/types/framework.d.ts +31 -5
  285. package/dist/src/types/framework.d.ts.map +1 -1
  286. package/dist/src/types/inference-log.d.ts +1 -1
  287. package/dist/src/types/inference-log.d.ts.map +1 -1
  288. package/dist/src/types/module.d.ts +30 -7
  289. package/dist/src/types/module.d.ts.map +1 -1
  290. package/dist/src/types/trace.d.ts +151 -11
  291. package/dist/src/types/trace.d.ts.map +1 -1
  292. package/dist/src/usage/usage-tracker.d.ts +5 -0
  293. package/dist/src/usage/usage-tracker.d.ts.map +1 -1
  294. package/dist/src/usage/usage-tracker.js +35 -8
  295. package/dist/src/usage/usage-tracker.js.map +1 -1
  296. package/package.json +10 -9
  297. package/src/agent.ts +572 -105
  298. package/src/api/mcp-server-core.ts +681 -0
  299. package/src/api/mcp-server.ts +16 -685
  300. package/src/api/server.ts +55 -30
  301. package/src/api/types.ts +10 -2
  302. package/src/branch-names.ts +19 -0
  303. package/src/closest-names.ts +94 -0
  304. package/src/code-execution/py-runner.ts +200 -76
  305. package/src/code-execution/runtime-py.ts +49 -3
  306. package/src/code-execution/tool-definition.ts +28 -4
  307. package/src/config-checks.ts +48 -0
  308. package/src/deadline-timer.ts +44 -0
  309. package/src/error-message.ts +48 -0
  310. package/src/framework.ts +7158 -1936
  311. package/src/gate/event-gate.ts +28 -3
  312. package/src/index.ts +12 -3
  313. package/src/mcpl/channel-registry.ts +615 -289
  314. package/src/mcpl/checkpoint-manager.ts +104 -29
  315. package/src/mcpl/conversation-router.ts +28 -8
  316. package/src/mcpl/convert-block.ts +97 -0
  317. package/src/mcpl/errors.ts +28 -0
  318. package/src/mcpl/feature-set-manager.ts +4 -3
  319. package/src/mcpl/hook-orchestrator.ts +84 -77
  320. package/src/mcpl/inbound-source.ts +156 -0
  321. package/src/mcpl/index.ts +10 -1
  322. package/src/mcpl/inference-router.ts +174 -99
  323. package/src/mcpl/log-value.ts +116 -0
  324. package/src/mcpl/prose-stream-router.ts +6 -6
  325. package/src/mcpl/push-coalescer.ts +124 -24
  326. package/src/mcpl/push-handler.ts +86 -84
  327. package/src/mcpl/reference-fetcher.ts +71 -26
  328. package/src/mcpl/references.ts +81 -22
  329. package/src/mcpl/refusal-lines.ts +59 -0
  330. package/src/mcpl/server-connection.ts +496 -142
  331. package/src/mcpl/server-registry.ts +15 -4
  332. package/src/mcpl/skip-reply-wake.ts +73 -0
  333. package/src/mcpl/tool-classes.ts +3 -2
  334. package/src/mcpl/transport.ts +219 -26
  335. package/src/mcpl/types.ts +18 -3
  336. package/src/mcpl/visible-content.ts +27 -0
  337. package/src/module-registry.ts +58 -23
  338. package/src/modules/api/index.ts +1 -1
  339. package/src/modules/discord/discord-js-client.ts +26 -10
  340. package/src/modules/discord/index.ts +395 -160
  341. package/src/modules/discord/types.ts +15 -2
  342. package/src/modules/health/index.ts +2 -1
  343. package/src/modules/history/index.ts +410 -120
  344. package/src/modules/history/semantic.ts +189 -32
  345. package/src/modules/unknown-tool.ts +16 -0
  346. package/src/modules/workspace/disk-agreement.ts +125 -21
  347. package/src/modules/workspace/effects.ts +279 -35
  348. package/src/modules/workspace/index.ts +841 -261
  349. package/src/modules/workspace/observe.ts +456 -56
  350. package/src/modules/workspace/reconcile.ts +688 -76
  351. package/src/modules/workspace/types.ts +41 -2
  352. package/src/modules/workspace/watcher.ts +27 -4
  353. package/src/prose-drafts.ts +481 -0
  354. package/src/prose-segments.ts +51 -8
  355. package/src/recovery/offline-branch.ts +36 -29
  356. package/src/safe-slice.ts +9 -1
  357. package/src/stored-removal.ts +126 -0
  358. package/src/tool-image-ledger.ts +153 -34
  359. package/src/tool-presentation.ts +224 -40
  360. package/src/tool-result-guard.ts +7 -8
  361. package/src/tool-result-history.ts +124 -20
  362. package/src/tune-out/coordinator.ts +259 -65
  363. package/src/types/agent.ts +59 -13
  364. package/src/types/events.ts +17 -0
  365. package/src/types/framework.ts +31 -5
  366. package/src/types/inference-log.ts +1 -1
  367. package/src/types/module.ts +31 -7
  368. package/src/types/trace.ts +158 -12
  369. package/src/usage/usage-tracker.ts +32 -8
  370. package/dist/test/activation-request-sanitize.test.d.ts +0 -2
  371. package/dist/test/activation-request-sanitize.test.d.ts.map +0 -1
  372. package/dist/test/activation-request-sanitize.test.js +0 -89
  373. package/dist/test/activation-request-sanitize.test.js.map +0 -1
  374. package/dist/test/agent-cache-ttl.test.d.ts +0 -2
  375. package/dist/test/agent-cache-ttl.test.d.ts.map +0 -1
  376. package/dist/test/agent-cache-ttl.test.js +0 -41
  377. package/dist/test/agent-cache-ttl.test.js.map +0 -1
  378. package/dist/test/agent-runtime-settings.test.d.ts +0 -2
  379. package/dist/test/agent-runtime-settings.test.d.ts.map +0 -1
  380. package/dist/test/agent-runtime-settings.test.js +0 -462
  381. package/dist/test/agent-runtime-settings.test.js.map +0 -1
  382. package/dist/test/api-admin-gate.test.d.ts +0 -2
  383. package/dist/test/api-admin-gate.test.d.ts.map +0 -1
  384. package/dist/test/api-admin-gate.test.js +0 -116
  385. package/dist/test/api-admin-gate.test.js.map +0 -1
  386. package/dist/test/assistant-persist-refusal.test.d.ts +0 -2
  387. package/dist/test/assistant-persist-refusal.test.d.ts.map +0 -1
  388. package/dist/test/assistant-persist-refusal.test.js +0 -63
  389. package/dist/test/assistant-persist-refusal.test.js.map +0 -1
  390. package/dist/test/batched-wake-locus.test.d.ts +0 -2
  391. package/dist/test/batched-wake-locus.test.d.ts.map +0 -1
  392. package/dist/test/batched-wake-locus.test.js +0 -166
  393. package/dist/test/batched-wake-locus.test.js.map +0 -1
  394. package/dist/test/busy-agent-scheduler.test.d.ts +0 -2
  395. package/dist/test/busy-agent-scheduler.test.d.ts.map +0 -1
  396. package/dist/test/busy-agent-scheduler.test.js +0 -92
  397. package/dist/test/busy-agent-scheduler.test.js.map +0 -1
  398. package/dist/test/channel-incoming-targeting.test.d.ts +0 -2
  399. package/dist/test/channel-incoming-targeting.test.d.ts.map +0 -1
  400. package/dist/test/channel-incoming-targeting.test.js +0 -81
  401. package/dist/test/channel-incoming-targeting.test.js.map +0 -1
  402. package/dist/test/channel-label-history.test.d.ts +0 -2
  403. package/dist/test/channel-label-history.test.d.ts.map +0 -1
  404. package/dist/test/channel-label-history.test.js +0 -424
  405. package/dist/test/channel-label-history.test.js.map +0 -1
  406. package/dist/test/channel-lifecycle-provenance.test.d.ts +0 -2
  407. package/dist/test/channel-lifecycle-provenance.test.d.ts.map +0 -1
  408. package/dist/test/channel-lifecycle-provenance.test.js +0 -47
  409. package/dist/test/channel-lifecycle-provenance.test.js.map +0 -1
  410. package/dist/test/channel-registry-routing.test.d.ts +0 -2
  411. package/dist/test/channel-registry-routing.test.d.ts.map +0 -1
  412. package/dist/test/channel-registry-routing.test.js +0 -446
  413. package/dist/test/channel-registry-routing.test.js.map +0 -1
  414. package/dist/test/channel-registry-typing.test.d.ts +0 -2
  415. package/dist/test/channel-registry-typing.test.d.ts.map +0 -1
  416. package/dist/test/channel-registry-typing.test.js +0 -91
  417. package/dist/test/channel-registry-typing.test.js.map +0 -1
  418. package/dist/test/channels-changed-respond-first.test.d.ts +0 -2
  419. package/dist/test/channels-changed-respond-first.test.d.ts.map +0 -1
  420. package/dist/test/channels-changed-respond-first.test.js +0 -74
  421. package/dist/test/channels-changed-respond-first.test.js.map +0 -1
  422. package/dist/test/checkpoint-attribution.test.d.ts +0 -2
  423. package/dist/test/checkpoint-attribution.test.d.ts.map +0 -1
  424. package/dist/test/checkpoint-attribution.test.js +0 -200
  425. package/dist/test/checkpoint-attribution.test.js.map +0 -1
  426. package/dist/test/code-execution.test.d.ts +0 -11
  427. package/dist/test/code-execution.test.d.ts.map +0 -1
  428. package/dist/test/code-execution.test.js +0 -1272
  429. package/dist/test/code-execution.test.js.map +0 -1
  430. package/dist/test/component-defaults.test.d.ts +0 -2
  431. package/dist/test/component-defaults.test.d.ts.map +0 -1
  432. package/dist/test/component-defaults.test.js +0 -54
  433. package/dist/test/component-defaults.test.js.map +0 -1
  434. package/dist/test/conversation-fork-injection-scoping.test.d.ts +0 -2
  435. package/dist/test/conversation-fork-injection-scoping.test.d.ts.map +0 -1
  436. package/dist/test/conversation-fork-injection-scoping.test.js +0 -200
  437. package/dist/test/conversation-fork-injection-scoping.test.js.map +0 -1
  438. package/dist/test/conversation-router.test.d.ts +0 -2
  439. package/dist/test/conversation-router.test.d.ts.map +0 -1
  440. package/dist/test/conversation-router.test.js +0 -174
  441. package/dist/test/conversation-router.test.js.map +0 -1
  442. package/dist/test/conversation-routing.test.d.ts +0 -7
  443. package/dist/test/conversation-routing.test.d.ts.map +0 -1
  444. package/dist/test/conversation-routing.test.js +0 -387
  445. package/dist/test/conversation-routing.test.js.map +0 -1
  446. package/dist/test/deferred-wake-integrity.test.d.ts +0 -29
  447. package/dist/test/deferred-wake-integrity.test.d.ts.map +0 -1
  448. package/dist/test/deferred-wake-integrity.test.js +0 -320
  449. package/dist/test/deferred-wake-integrity.test.js.map +0 -1
  450. package/dist/test/discord-awareness-outbox.test.d.ts +0 -2
  451. package/dist/test/discord-awareness-outbox.test.d.ts.map +0 -1
  452. package/dist/test/discord-awareness-outbox.test.js +0 -267
  453. package/dist/test/discord-awareness-outbox.test.js.map +0 -1
  454. package/dist/test/discord-history-delete-window.test.d.ts +0 -2
  455. package/dist/test/discord-history-delete-window.test.d.ts.map +0 -1
  456. package/dist/test/discord-history-delete-window.test.js +0 -81
  457. package/dist/test/discord-history-delete-window.test.js.map +0 -1
  458. package/dist/test/discord-history-sync.test.d.ts +0 -2
  459. package/dist/test/discord-history-sync.test.d.ts.map +0 -1
  460. package/dist/test/discord-history-sync.test.js +0 -56
  461. package/dist/test/discord-history-sync.test.js.map +0 -1
  462. package/dist/test/ephemeral-settle.test.d.ts +0 -2
  463. package/dist/test/ephemeral-settle.test.d.ts.map +0 -1
  464. package/dist/test/ephemeral-settle.test.js +0 -354
  465. package/dist/test/ephemeral-settle.test.js.map +0 -1
  466. package/dist/test/event-gate-passthrough.test.d.ts +0 -15
  467. package/dist/test/event-gate-passthrough.test.d.ts.map +0 -1
  468. package/dist/test/event-gate-passthrough.test.js +0 -289
  469. package/dist/test/event-gate-passthrough.test.js.map +0 -1
  470. package/dist/test/event-gate-policy-mutation.test.d.ts +0 -2
  471. package/dist/test/event-gate-policy-mutation.test.d.ts.map +0 -1
  472. package/dist/test/event-gate-policy-mutation.test.js +0 -137
  473. package/dist/test/event-gate-policy-mutation.test.js.map +0 -1
  474. package/dist/test/event-gate-rate-limit.test.d.ts +0 -2
  475. package/dist/test/event-gate-rate-limit.test.d.ts.map +0 -1
  476. package/dist/test/event-gate-rate-limit.test.js +0 -627
  477. package/dist/test/event-gate-rate-limit.test.js.map +0 -1
  478. package/dist/test/event-gate-script.test.d.ts +0 -2
  479. package/dist/test/event-gate-script.test.d.ts.map +0 -1
  480. package/dist/test/event-gate-script.test.js +0 -95
  481. package/dist/test/event-gate-script.test.js.map +0 -1
  482. package/dist/test/event-gate-selfwake.test.d.ts +0 -15
  483. package/dist/test/event-gate-selfwake.test.d.ts.map +0 -1
  484. package/dist/test/event-gate-selfwake.test.js +0 -125
  485. package/dist/test/event-gate-selfwake.test.js.map +0 -1
  486. package/dist/test/event-gate-tags.test.d.ts +0 -2
  487. package/dist/test/event-gate-tags.test.d.ts.map +0 -1
  488. package/dist/test/event-gate-tags.test.js +0 -76
  489. package/dist/test/event-gate-tags.test.js.map +0 -1
  490. package/dist/test/event-gate.test.d.ts +0 -2
  491. package/dist/test/event-gate.test.d.ts.map +0 -1
  492. package/dist/test/event-gate.test.js +0 -919
  493. package/dist/test/event-gate.test.js.map +0 -1
  494. package/dist/test/explicit-prose-routing.test.d.ts +0 -11
  495. package/dist/test/explicit-prose-routing.test.d.ts.map +0 -1
  496. package/dist/test/explicit-prose-routing.test.js +0 -1394
  497. package/dist/test/explicit-prose-routing.test.js.map +0 -1
  498. package/dist/test/framework.test.d.ts +0 -5
  499. package/dist/test/framework.test.d.ts.map +0 -1
  500. package/dist/test/framework.test.js +0 -1048
  501. package/dist/test/framework.test.js.map +0 -1
  502. package/dist/test/gather-context-timeout.test.d.ts +0 -2
  503. package/dist/test/gather-context-timeout.test.d.ts.map +0 -1
  504. package/dist/test/gather-context-timeout.test.js +0 -120
  505. package/dist/test/gather-context-timeout.test.js.map +0 -1
  506. package/dist/test/health-snapshot.test.d.ts +0 -2
  507. package/dist/test/health-snapshot.test.d.ts.map +0 -1
  508. package/dist/test/health-snapshot.test.js +0 -74
  509. package/dist/test/health-snapshot.test.js.map +0 -1
  510. package/dist/test/helpers/coalescing-fixture.d.ts +0 -72
  511. package/dist/test/helpers/coalescing-fixture.d.ts.map +0 -1
  512. package/dist/test/helpers/coalescing-fixture.js +0 -146
  513. package/dist/test/helpers/coalescing-fixture.js.map +0 -1
  514. package/dist/test/helpers/coalescing-kill-child.d.ts +0 -2
  515. package/dist/test/helpers/coalescing-kill-child.d.ts.map +0 -1
  516. package/dist/test/helpers/coalescing-kill-child.js +0 -24
  517. package/dist/test/helpers/coalescing-kill-child.js.map +0 -1
  518. package/dist/test/helpers/mock-membrane.d.ts +0 -53
  519. package/dist/test/helpers/mock-membrane.d.ts.map +0 -1
  520. package/dist/test/helpers/mock-membrane.js +0 -168
  521. package/dist/test/helpers/mock-membrane.js.map +0 -1
  522. package/dist/test/helpers/pytc-stop-rows.d.ts +0 -11
  523. package/dist/test/helpers/pytc-stop-rows.d.ts.map +0 -1
  524. package/dist/test/helpers/pytc-stop-rows.js +0 -143
  525. package/dist/test/helpers/pytc-stop-rows.js.map +0 -1
  526. package/dist/test/helpers/quiesce-crash-child.d.ts +0 -2
  527. package/dist/test/helpers/quiesce-crash-child.d.ts.map +0 -1
  528. package/dist/test/helpers/quiesce-crash-child.js +0 -156
  529. package/dist/test/helpers/quiesce-crash-child.js.map +0 -1
  530. package/dist/test/history-module-overview.test.d.ts +0 -2
  531. package/dist/test/history-module-overview.test.d.ts.map +0 -1
  532. package/dist/test/history-module-overview.test.js +0 -711
  533. package/dist/test/history-module-overview.test.js.map +0 -1
  534. package/dist/test/history-module-realstore.test.d.ts +0 -2
  535. package/dist/test/history-module-realstore.test.d.ts.map +0 -1
  536. package/dist/test/history-module-realstore.test.js +0 -363
  537. package/dist/test/history-module-realstore.test.js.map +0 -1
  538. package/dist/test/history-module-semantic.test.d.ts +0 -2
  539. package/dist/test/history-module-semantic.test.d.ts.map +0 -1
  540. package/dist/test/history-module-semantic.test.js +0 -213
  541. package/dist/test/history-module-semantic.test.js.map +0 -1
  542. package/dist/test/history-module-ux.test.d.ts +0 -2
  543. package/dist/test/history-module-ux.test.d.ts.map +0 -1
  544. package/dist/test/history-module-ux.test.js +0 -304
  545. package/dist/test/history-module-ux.test.js.map +0 -1
  546. package/dist/test/history-module.test.d.ts +0 -2
  547. package/dist/test/history-module.test.d.ts.map +0 -1
  548. package/dist/test/history-module.test.js +0 -619
  549. package/dist/test/history-module.test.js.map +0 -1
  550. package/dist/test/history-semantic-review-findings.test.d.ts +0 -2
  551. package/dist/test/history-semantic-review-findings.test.d.ts.map +0 -1
  552. package/dist/test/history-semantic-review-findings.test.js +0 -338
  553. package/dist/test/history-semantic-review-findings.test.js.map +0 -1
  554. package/dist/test/history-semantic-sync-converges.test.d.ts +0 -2
  555. package/dist/test/history-semantic-sync-converges.test.d.ts.map +0 -1
  556. package/dist/test/history-semantic-sync-converges.test.js +0 -109
  557. package/dist/test/history-semantic-sync-converges.test.js.map +0 -1
  558. package/dist/test/host-quiesce.test.d.ts +0 -2
  559. package/dist/test/host-quiesce.test.d.ts.map +0 -1
  560. package/dist/test/host-quiesce.test.js +0 -863
  561. package/dist/test/host-quiesce.test.js.map +0 -1
  562. package/dist/test/inference-exhaustion-rewind.test.d.ts +0 -2
  563. package/dist/test/inference-exhaustion-rewind.test.d.ts.map +0 -1
  564. package/dist/test/inference-exhaustion-rewind.test.js +0 -309
  565. package/dist/test/inference-exhaustion-rewind.test.js.map +0 -1
  566. package/dist/test/inference-failure-bounds.test.d.ts +0 -2
  567. package/dist/test/inference-failure-bounds.test.d.ts.map +0 -1
  568. package/dist/test/inference-failure-bounds.test.js +0 -1201
  569. package/dist/test/inference-failure-bounds.test.js.map +0 -1
  570. package/dist/test/inference-failure-observability.test.d.ts +0 -2
  571. package/dist/test/inference-failure-observability.test.d.ts.map +0 -1
  572. package/dist/test/inference-failure-observability.test.js +0 -84
  573. package/dist/test/inference-failure-observability.test.js.map +0 -1
  574. package/dist/test/journal-tool.test.d.ts +0 -2
  575. package/dist/test/journal-tool.test.d.ts.map +0 -1
  576. package/dist/test/journal-tool.test.js +0 -33
  577. package/dist/test/journal-tool.test.js.map +0 -1
  578. package/dist/test/kv-unified-open-flight-retry.test.d.ts +0 -2
  579. package/dist/test/kv-unified-open-flight-retry.test.d.ts.map +0 -1
  580. package/dist/test/kv-unified-open-flight-retry.test.js +0 -189
  581. package/dist/test/kv-unified-open-flight-retry.test.js.map +0 -1
  582. package/dist/test/kv-unified-wiring.test.d.ts +0 -2
  583. package/dist/test/kv-unified-wiring.test.d.ts.map +0 -1
  584. package/dist/test/kv-unified-wiring.test.js +0 -95
  585. package/dist/test/kv-unified-wiring.test.js.map +0 -1
  586. package/dist/test/late-events-after-stop.test.d.ts +0 -2
  587. package/dist/test/late-events-after-stop.test.d.ts.map +0 -1
  588. package/dist/test/late-events-after-stop.test.js +0 -122
  589. package/dist/test/late-events-after-stop.test.js.map +0 -1
  590. package/dist/test/liveness-watchdog.test.d.ts +0 -2
  591. package/dist/test/liveness-watchdog.test.d.ts.map +0 -1
  592. package/dist/test/liveness-watchdog.test.js +0 -94
  593. package/dist/test/liveness-watchdog.test.js.map +0 -1
  594. package/dist/test/machine-close-provenance.test.d.ts +0 -2
  595. package/dist/test/machine-close-provenance.test.d.ts.map +0 -1
  596. package/dist/test/machine-close-provenance.test.js +0 -116
  597. package/dist/test/machine-close-provenance.test.js.map +0 -1
  598. package/dist/test/maintenance-timer.test.d.ts +0 -2
  599. package/dist/test/maintenance-timer.test.d.ts.map +0 -1
  600. package/dist/test/maintenance-timer.test.js +0 -265
  601. package/dist/test/maintenance-timer.test.js.map +0 -1
  602. package/dist/test/mcpl-access-provider.test.d.ts +0 -2
  603. package/dist/test/mcpl-access-provider.test.d.ts.map +0 -1
  604. package/dist/test/mcpl-access-provider.test.js +0 -20
  605. package/dist/test/mcpl-access-provider.test.js.map +0 -1
  606. package/dist/test/mcpl-awareness-barrier.test.d.ts +0 -2
  607. package/dist/test/mcpl-awareness-barrier.test.d.ts.map +0 -1
  608. package/dist/test/mcpl-awareness-barrier.test.js +0 -769
  609. package/dist/test/mcpl-awareness-barrier.test.js.map +0 -1
  610. package/dist/test/mcpl-capability-grant.test.d.ts +0 -10
  611. package/dist/test/mcpl-capability-grant.test.d.ts.map +0 -1
  612. package/dist/test/mcpl-capability-grant.test.js +0 -111
  613. package/dist/test/mcpl-capability-grant.test.js.map +0 -1
  614. package/dist/test/mcpl-capability-scoping.test.d.ts +0 -2
  615. package/dist/test/mcpl-capability-scoping.test.d.ts.map +0 -1
  616. package/dist/test/mcpl-capability-scoping.test.js +0 -266
  617. package/dist/test/mcpl-capability-scoping.test.js.map +0 -1
  618. package/dist/test/mcpl-child-env.test.d.ts +0 -2
  619. package/dist/test/mcpl-child-env.test.d.ts.map +0 -1
  620. package/dist/test/mcpl-child-env.test.js +0 -158
  621. package/dist/test/mcpl-child-env.test.js.map +0 -1
  622. package/dist/test/mcpl-coalescing.test.d.ts +0 -2
  623. package/dist/test/mcpl-coalescing.test.d.ts.map +0 -1
  624. package/dist/test/mcpl-coalescing.test.js +0 -1125
  625. package/dist/test/mcpl-coalescing.test.js.map +0 -1
  626. package/dist/test/mcpl-config-diagnostics.test.d.ts +0 -2
  627. package/dist/test/mcpl-config-diagnostics.test.d.ts.map +0 -1
  628. package/dist/test/mcpl-config-diagnostics.test.js +0 -452
  629. package/dist/test/mcpl-config-diagnostics.test.js.map +0 -1
  630. package/dist/test/mcpl-empty-content.test.d.ts +0 -2
  631. package/dist/test/mcpl-empty-content.test.d.ts.map +0 -1
  632. package/dist/test/mcpl-empty-content.test.js +0 -368
  633. package/dist/test/mcpl-empty-content.test.js.map +0 -1
  634. package/dist/test/mcpl-gate-roundtrip.test.d.ts +0 -2
  635. package/dist/test/mcpl-gate-roundtrip.test.d.ts.map +0 -1
  636. package/dist/test/mcpl-gate-roundtrip.test.js +0 -285
  637. package/dist/test/mcpl-gate-roundtrip.test.js.map +0 -1
  638. package/dist/test/mcpl-list-status.test.d.ts +0 -2
  639. package/dist/test/mcpl-list-status.test.d.ts.map +0 -1
  640. package/dist/test/mcpl-list-status.test.js +0 -82
  641. package/dist/test/mcpl-list-status.test.js.map +0 -1
  642. package/dist/test/mcpl-manifest-changed.test.d.ts +0 -2
  643. package/dist/test/mcpl-manifest-changed.test.d.ts.map +0 -1
  644. package/dist/test/mcpl-manifest-changed.test.js +0 -178
  645. package/dist/test/mcpl-manifest-changed.test.js.map +0 -1
  646. package/dist/test/mcpl-push-convert.test.d.ts +0 -2
  647. package/dist/test/mcpl-push-convert.test.d.ts.map +0 -1
  648. package/dist/test/mcpl-push-convert.test.js +0 -42
  649. package/dist/test/mcpl-push-convert.test.js.map +0 -1
  650. package/dist/test/mcpl-reconnect-events.test.d.ts +0 -2
  651. package/dist/test/mcpl-reconnect-events.test.d.ts.map +0 -1
  652. package/dist/test/mcpl-reconnect-events.test.js +0 -144
  653. package/dist/test/mcpl-reconnect-events.test.js.map +0 -1
  654. package/dist/test/mcpl-reconnect-reregistration.test.d.ts +0 -2
  655. package/dist/test/mcpl-reconnect-reregistration.test.d.ts.map +0 -1
  656. package/dist/test/mcpl-reconnect-reregistration.test.js +0 -236
  657. package/dist/test/mcpl-reconnect-reregistration.test.js.map +0 -1
  658. package/dist/test/mcpl-reference-fetcher.test.d.ts +0 -2
  659. package/dist/test/mcpl-reference-fetcher.test.d.ts.map +0 -1
  660. package/dist/test/mcpl-reference-fetcher.test.js +0 -427
  661. package/dist/test/mcpl-reference-fetcher.test.js.map +0 -1
  662. package/dist/test/mcpl-reference-fields.test.d.ts +0 -2
  663. package/dist/test/mcpl-reference-fields.test.d.ts.map +0 -1
  664. package/dist/test/mcpl-reference-fields.test.js +0 -149
  665. package/dist/test/mcpl-reference-fields.test.js.map +0 -1
  666. package/dist/test/mcpl-request-timeout.test.d.ts +0 -2
  667. package/dist/test/mcpl-request-timeout.test.d.ts.map +0 -1
  668. package/dist/test/mcpl-request-timeout.test.js +0 -138
  669. package/dist/test/mcpl-request-timeout.test.js.map +0 -1
  670. package/dist/test/mcpl-runtime-lifecycle.test.d.ts +0 -7
  671. package/dist/test/mcpl-runtime-lifecycle.test.d.ts.map +0 -1
  672. package/dist/test/mcpl-runtime-lifecycle.test.js +0 -142
  673. package/dist/test/mcpl-runtime-lifecycle.test.js.map +0 -1
  674. package/dist/test/mcpl-tool-class-listing.test.d.ts +0 -2
  675. package/dist/test/mcpl-tool-class-listing.test.d.ts.map +0 -1
  676. package/dist/test/mcpl-tool-class-listing.test.js +0 -147
  677. package/dist/test/mcpl-tool-class-listing.test.js.map +0 -1
  678. package/dist/test/mcpl-tool-classes.test.d.ts +0 -7
  679. package/dist/test/mcpl-tool-classes.test.d.ts.map +0 -1
  680. package/dist/test/mcpl-tool-classes.test.js +0 -80
  681. package/dist/test/mcpl-tool-classes.test.js.map +0 -1
  682. package/dist/test/mcpl-tool-lifecycle-e2e.test.d.ts +0 -2
  683. package/dist/test/mcpl-tool-lifecycle-e2e.test.d.ts.map +0 -1
  684. package/dist/test/mcpl-tool-lifecycle-e2e.test.js +0 -237
  685. package/dist/test/mcpl-tool-lifecycle-e2e.test.js.map +0 -1
  686. package/dist/test/mcpl-tool-lifecycle-emitter.test.d.ts +0 -11
  687. package/dist/test/mcpl-tool-lifecycle-emitter.test.d.ts.map +0 -1
  688. package/dist/test/mcpl-tool-lifecycle-emitter.test.js +0 -412
  689. package/dist/test/mcpl-tool-lifecycle-emitter.test.js.map +0 -1
  690. package/dist/test/mcpl-tool-lifecycle-script.test.d.ts +0 -2
  691. package/dist/test/mcpl-tool-lifecycle-script.test.d.ts.map +0 -1
  692. package/dist/test/mcpl-tool-lifecycle-script.test.js +0 -288
  693. package/dist/test/mcpl-tool-lifecycle-script.test.js.map +0 -1
  694. package/dist/test/mcpl-tool-lifecycle.test.d.ts +0 -11
  695. package/dist/test/mcpl-tool-lifecycle.test.d.ts.map +0 -1
  696. package/dist/test/mcpl-tool-lifecycle.test.js +0 -270
  697. package/dist/test/mcpl-tool-lifecycle.test.js.map +0 -1
  698. package/dist/test/mcpl-ws-transport.test.d.ts +0 -2
  699. package/dist/test/mcpl-ws-transport.test.d.ts.map +0 -1
  700. package/dist/test/mcpl-ws-transport.test.js +0 -258
  701. package/dist/test/mcpl-ws-transport.test.js.map +0 -1
  702. package/dist/test/module-context-integration.test.d.ts +0 -18
  703. package/dist/test/module-context-integration.test.d.ts.map +0 -1
  704. package/dist/test/module-context-integration.test.js +0 -181
  705. package/dist/test/module-context-integration.test.js.map +0 -1
  706. package/dist/test/offline-recovery-branch.test.d.ts +0 -2
  707. package/dist/test/offline-recovery-branch.test.d.ts.map +0 -1
  708. package/dist/test/offline-recovery-branch.test.js +0 -226
  709. package/dist/test/offline-recovery-branch.test.js.map +0 -1
  710. package/dist/test/operator-surgery.test.d.ts +0 -2
  711. package/dist/test/operator-surgery.test.d.ts.map +0 -1
  712. package/dist/test/operator-surgery.test.js +0 -398
  713. package/dist/test/operator-surgery.test.js.map +0 -1
  714. package/dist/test/ops-alert.test.d.ts +0 -2
  715. package/dist/test/ops-alert.test.d.ts.map +0 -1
  716. package/dist/test/ops-alert.test.js +0 -153
  717. package/dist/test/ops-alert.test.js.map +0 -1
  718. package/dist/test/overbudget-drain-breaker.test.d.ts +0 -2
  719. package/dist/test/overbudget-drain-breaker.test.d.ts.map +0 -1
  720. package/dist/test/overbudget-drain-breaker.test.js +0 -197
  721. package/dist/test/overbudget-drain-breaker.test.js.map +0 -1
  722. package/dist/test/per-agent-delivery.test.d.ts +0 -2
  723. package/dist/test/per-agent-delivery.test.d.ts.map +0 -1
  724. package/dist/test/per-agent-delivery.test.js +0 -108
  725. package/dist/test/per-agent-delivery.test.js.map +0 -1
  726. package/dist/test/physical-window-restart.test.d.ts +0 -14
  727. package/dist/test/physical-window-restart.test.d.ts.map +0 -1
  728. package/dist/test/physical-window-restart.test.js +0 -222
  729. package/dist/test/physical-window-restart.test.js.map +0 -1
  730. package/dist/test/placed-reaction-baseline.test.d.ts +0 -2
  731. package/dist/test/placed-reaction-baseline.test.d.ts.map +0 -1
  732. package/dist/test/placed-reaction-baseline.test.js +0 -312
  733. package/dist/test/placed-reaction-baseline.test.js.map +0 -1
  734. package/dist/test/present-while-acting.test.d.ts +0 -19
  735. package/dist/test/present-while-acting.test.d.ts.map +0 -1
  736. package/dist/test/present-while-acting.test.js +0 -706
  737. package/dist/test/present-while-acting.test.js.map +0 -1
  738. package/dist/test/prose-segments.test.d.ts +0 -2
  739. package/dist/test/prose-segments.test.d.ts.map +0 -1
  740. package/dist/test/prose-segments.test.js +0 -52
  741. package/dist/test/prose-segments.test.js.map +0 -1
  742. package/dist/test/prose-stream-router.test.d.ts +0 -2
  743. package/dist/test/prose-stream-router.test.d.ts.map +0 -1
  744. package/dist/test/prose-stream-router.test.js +0 -171
  745. package/dist/test/prose-stream-router.test.js.map +0 -1
  746. package/dist/test/provider-acceleration-cooldown.test.d.ts +0 -2
  747. package/dist/test/provider-acceleration-cooldown.test.d.ts.map +0 -1
  748. package/dist/test/provider-acceleration-cooldown.test.js +0 -435
  749. package/dist/test/provider-acceleration-cooldown.test.js.map +0 -1
  750. package/dist/test/provider-waits.test.d.ts +0 -2
  751. package/dist/test/provider-waits.test.d.ts.map +0 -1
  752. package/dist/test/provider-waits.test.js +0 -2196
  753. package/dist/test/provider-waits.test.js.map +0 -1
  754. package/dist/test/puppet-tool-call.test.d.ts +0 -2
  755. package/dist/test/puppet-tool-call.test.d.ts.map +0 -1
  756. package/dist/test/puppet-tool-call.test.js +0 -224
  757. package/dist/test/puppet-tool-call.test.js.map +0 -1
  758. package/dist/test/puppet-turn-reservation.test.d.ts +0 -2
  759. package/dist/test/puppet-turn-reservation.test.d.ts.map +0 -1
  760. package/dist/test/puppet-turn-reservation.test.js +0 -139
  761. package/dist/test/puppet-turn-reservation.test.js.map +0 -1
  762. package/dist/test/reaction-baseline-platform.test.d.ts +0 -2
  763. package/dist/test/reaction-baseline-platform.test.d.ts.map +0 -1
  764. package/dist/test/reaction-baseline-platform.test.js +0 -124
  765. package/dist/test/reaction-baseline-platform.test.js.map +0 -1
  766. package/dist/test/record-journal.test.d.ts +0 -6
  767. package/dist/test/record-journal.test.d.ts.map +0 -1
  768. package/dist/test/record-journal.test.js +0 -269
  769. package/dist/test/record-journal.test.js.map +0 -1
  770. package/dist/test/refusal-reaction-baseline.test.d.ts +0 -2
  771. package/dist/test/refusal-reaction-baseline.test.d.ts.map +0 -1
  772. package/dist/test/refusal-reaction-baseline.test.js +0 -81
  773. package/dist/test/refusal-reaction-baseline.test.js.map +0 -1
  774. package/dist/test/refusal-rewind.test.d.ts +0 -2
  775. package/dist/test/refusal-rewind.test.d.ts.map +0 -1
  776. package/dist/test/refusal-rewind.test.js +0 -108
  777. package/dist/test/refusal-rewind.test.js.map +0 -1
  778. package/dist/test/refusal-single-call.test.d.ts +0 -2
  779. package/dist/test/refusal-single-call.test.d.ts.map +0 -1
  780. package/dist/test/refusal-single-call.test.js +0 -177
  781. package/dist/test/refusal-single-call.test.js.map +0 -1
  782. package/dist/test/release-changelog.test.d.ts +0 -2
  783. package/dist/test/release-changelog.test.d.ts.map +0 -1
  784. package/dist/test/release-changelog.test.js +0 -159
  785. package/dist/test/release-changelog.test.js.map +0 -1
  786. package/dist/test/same-round-think-policy.test.d.ts +0 -2
  787. package/dist/test/same-round-think-policy.test.d.ts.map +0 -1
  788. package/dist/test/same-round-think-policy.test.js +0 -853
  789. package/dist/test/same-round-think-policy.test.js.map +0 -1
  790. package/dist/test/save-recent-image.test.d.ts +0 -26
  791. package/dist/test/save-recent-image.test.d.ts.map +0 -1
  792. package/dist/test/save-recent-image.test.js +0 -974
  793. package/dist/test/save-recent-image.test.js.map +0 -1
  794. package/dist/test/shutdown-errors.test.d.ts +0 -2
  795. package/dist/test/shutdown-errors.test.d.ts.map +0 -1
  796. package/dist/test/shutdown-errors.test.js +0 -662
  797. package/dist/test/shutdown-errors.test.js.map +0 -1
  798. package/dist/test/silent-heartbeat-rows.test.d.ts +0 -2
  799. package/dist/test/silent-heartbeat-rows.test.d.ts.map +0 -1
  800. package/dist/test/silent-heartbeat-rows.test.js +0 -451
  801. package/dist/test/silent-heartbeat-rows.test.js.map +0 -1
  802. package/dist/test/silent-heartbeat.test.d.ts +0 -2
  803. package/dist/test/silent-heartbeat.test.d.ts.map +0 -1
  804. package/dist/test/silent-heartbeat.test.js +0 -165
  805. package/dist/test/silent-heartbeat.test.js.map +0 -1
  806. package/dist/test/state-scaling-e2e.test.d.ts +0 -22
  807. package/dist/test/state-scaling-e2e.test.d.ts.map +0 -1
  808. package/dist/test/state-scaling-e2e.test.js +0 -206
  809. package/dist/test/state-scaling-e2e.test.js.map +0 -1
  810. package/dist/test/state-scaling.test.d.ts +0 -12
  811. package/dist/test/state-scaling.test.d.ts.map +0 -1
  812. package/dist/test/state-scaling.test.js +0 -251
  813. package/dist/test/state-scaling.test.js.map +0 -1
  814. package/dist/test/stop-with-work-in-flight.test.d.ts +0 -23
  815. package/dist/test/stop-with-work-in-flight.test.d.ts.map +0 -1
  816. package/dist/test/stop-with-work-in-flight.test.js +0 -672
  817. package/dist/test/stop-with-work-in-flight.test.js.map +0 -1
  818. package/dist/test/surgery-marks-receipt.test.d.ts +0 -2
  819. package/dist/test/surgery-marks-receipt.test.d.ts.map +0 -1
  820. package/dist/test/surgery-marks-receipt.test.js +0 -540
  821. package/dist/test/surgery-marks-receipt.test.js.map +0 -1
  822. package/dist/test/thinking-token-stamp.test.d.ts +0 -12
  823. package/dist/test/thinking-token-stamp.test.d.ts.map +0 -1
  824. package/dist/test/thinking-token-stamp.test.js +0 -129
  825. package/dist/test/thinking-token-stamp.test.js.map +0 -1
  826. package/dist/test/timezone.test.d.ts +0 -2
  827. package/dist/test/timezone.test.d.ts.map +0 -1
  828. package/dist/test/timezone.test.js +0 -18
  829. package/dist/test/timezone.test.js.map +0 -1
  830. package/dist/test/tool-batch-hook.test.d.ts +0 -8
  831. package/dist/test/tool-batch-hook.test.d.ts.map +0 -1
  832. package/dist/test/tool-batch-hook.test.js +0 -275
  833. package/dist/test/tool-batch-hook.test.js.map +0 -1
  834. package/dist/test/tool-policy.test.d.ts +0 -2
  835. package/dist/test/tool-policy.test.d.ts.map +0 -1
  836. package/dist/test/tool-policy.test.js +0 -51
  837. package/dist/test/tool-policy.test.js.map +0 -1
  838. package/dist/test/tool-presentation.test.d.ts +0 -2
  839. package/dist/test/tool-presentation.test.d.ts.map +0 -1
  840. package/dist/test/tool-presentation.test.js +0 -268
  841. package/dist/test/tool-presentation.test.js.map +0 -1
  842. package/dist/test/tool-result-content.test.d.ts +0 -2
  843. package/dist/test/tool-result-content.test.d.ts.map +0 -1
  844. package/dist/test/tool-result-content.test.js +0 -37
  845. package/dist/test/tool-result-content.test.js.map +0 -1
  846. package/dist/test/tool-result-guard.test.d.ts +0 -2
  847. package/dist/test/tool-result-guard.test.d.ts.map +0 -1
  848. package/dist/test/tool-result-guard.test.js +0 -3607
  849. package/dist/test/tool-result-guard.test.js.map +0 -1
  850. package/dist/test/tool-result-history.test.d.ts +0 -7
  851. package/dist/test/tool-result-history.test.d.ts.map +0 -1
  852. package/dist/test/tool-result-history.test.js +0 -156
  853. package/dist/test/tool-result-history.test.js.map +0 -1
  854. package/dist/test/tool-result-spill.test.d.ts +0 -13
  855. package/dist/test/tool-result-spill.test.d.ts.map +0 -1
  856. package/dist/test/tool-result-spill.test.js +0 -586
  857. package/dist/test/tool-result-spill.test.js.map +0 -1
  858. package/dist/test/tool-wrapper-prose-guard-integration.test.d.ts +0 -2
  859. package/dist/test/tool-wrapper-prose-guard-integration.test.d.ts.map +0 -1
  860. package/dist/test/tool-wrapper-prose-guard-integration.test.js +0 -485
  861. package/dist/test/tool-wrapper-prose-guard-integration.test.js.map +0 -1
  862. package/dist/test/tool-wrapper-prose-guard.test.d.ts +0 -2
  863. package/dist/test/tool-wrapper-prose-guard.test.d.ts.map +0 -1
  864. package/dist/test/tool-wrapper-prose-guard.test.js +0 -34
  865. package/dist/test/tool-wrapper-prose-guard.test.js.map +0 -1
  866. package/dist/test/tools-observe-parser-conformance.test.d.ts +0 -2
  867. package/dist/test/tools-observe-parser-conformance.test.d.ts.map +0 -1
  868. package/dist/test/tools-observe-parser-conformance.test.js +0 -129
  869. package/dist/test/tools-observe-parser-conformance.test.js.map +0 -1
  870. package/dist/test/trunk-channel-routing.test.d.ts +0 -19
  871. package/dist/test/trunk-channel-routing.test.d.ts.map +0 -1
  872. package/dist/test/trunk-channel-routing.test.js +0 -329
  873. package/dist/test/trunk-channel-routing.test.js.map +0 -1
  874. package/dist/test/tune-out-e2e.test.d.ts +0 -2
  875. package/dist/test/tune-out-e2e.test.d.ts.map +0 -1
  876. package/dist/test/tune-out-e2e.test.js +0 -142
  877. package/dist/test/tune-out-e2e.test.js.map +0 -1
  878. package/dist/test/tune-out-gate-composition.test.d.ts +0 -2
  879. package/dist/test/tune-out-gate-composition.test.d.ts.map +0 -1
  880. package/dist/test/tune-out-gate-composition.test.js +0 -221
  881. package/dist/test/tune-out-gate-composition.test.js.map +0 -1
  882. package/dist/test/tune-out-lifecycle.test.d.ts +0 -2
  883. package/dist/test/tune-out-lifecycle.test.d.ts.map +0 -1
  884. package/dist/test/tune-out-lifecycle.test.js +0 -121
  885. package/dist/test/tune-out-lifecycle.test.js.map +0 -1
  886. package/dist/test/turn-trigger-provenance.test.d.ts +0 -2
  887. package/dist/test/turn-trigger-provenance.test.d.ts.map +0 -1
  888. package/dist/test/turn-trigger-provenance.test.js +0 -137
  889. package/dist/test/turn-trigger-provenance.test.js.map +0 -1
  890. package/dist/test/unconvertible-tool-result.test.d.ts +0 -2
  891. package/dist/test/unconvertible-tool-result.test.d.ts.map +0 -1
  892. package/dist/test/unconvertible-tool-result.test.js +0 -358
  893. package/dist/test/unconvertible-tool-result.test.js.map +0 -1
  894. package/dist/test/usage-accounting.test.d.ts +0 -2
  895. package/dist/test/usage-accounting.test.d.ts.map +0 -1
  896. package/dist/test/usage-accounting.test.js +0 -13
  897. package/dist/test/usage-accounting.test.js.map +0 -1
  898. package/dist/test/usage-tracker.test.d.ts +0 -2
  899. package/dist/test/usage-tracker.test.d.ts.map +0 -1
  900. package/dist/test/usage-tracker.test.js +0 -129
  901. package/dist/test/usage-tracker.test.js.map +0 -1
  902. package/dist/test/utils-surface.test.d.ts +0 -2
  903. package/dist/test/utils-surface.test.d.ts.map +0 -1
  904. package/dist/test/utils-surface.test.js +0 -145
  905. package/dist/test/utils-surface.test.js.map +0 -1
  906. package/dist/test/workspace-branch-continuation.test.d.ts +0 -15
  907. package/dist/test/workspace-branch-continuation.test.d.ts.map +0 -1
  908. package/dist/test/workspace-branch-continuation.test.js +0 -183
  909. package/dist/test/workspace-branch-continuation.test.js.map +0 -1
  910. package/dist/test/workspace-materialize-freshness.test.d.ts +0 -16
  911. package/dist/test/workspace-materialize-freshness.test.d.ts.map +0 -1
  912. package/dist/test/workspace-materialize-freshness.test.js +0 -252
  913. package/dist/test/workspace-materialize-freshness.test.js.map +0 -1
  914. package/dist/test/workspace-path-containment.test.d.ts +0 -19
  915. package/dist/test/workspace-path-containment.test.d.ts.map +0 -1
  916. package/dist/test/workspace-path-containment.test.js +0 -91
  917. package/dist/test/workspace-path-containment.test.js.map +0 -1
  918. package/dist/test/workspace-read-file-from-disk.test.d.ts +0 -17
  919. package/dist/test/workspace-read-file-from-disk.test.d.ts.map +0 -1
  920. package/dist/test/workspace-read-file-from-disk.test.js +0 -174
  921. package/dist/test/workspace-read-file-from-disk.test.js.map +0 -1
  922. package/dist/test/workspace-read-image.test.d.ts +0 -2
  923. package/dist/test/workspace-read-image.test.d.ts.map +0 -1
  924. package/dist/test/workspace-read-image.test.js +0 -597
  925. package/dist/test/workspace-read-image.test.js.map +0 -1
  926. package/dist/test/workspace-read-text.test.d.ts +0 -2
  927. package/dist/test/workspace-read-text.test.d.ts.map +0 -1
  928. package/dist/test/workspace-read-text.test.js +0 -101
  929. package/dist/test/workspace-read-text.test.js.map +0 -1
  930. package/dist/test/workspace-restore-order.test.d.ts +0 -16
  931. package/dist/test/workspace-restore-order.test.d.ts.map +0 -1
  932. package/dist/test/workspace-restore-order.test.js +0 -140
  933. package/dist/test/workspace-restore-order.test.js.map +0 -1
  934. package/dist/test/workspace-three-way.test.d.ts +0 -12
  935. package/dist/test/workspace-three-way.test.d.ts.map +0 -1
  936. package/dist/test/workspace-three-way.test.js +0 -3194
  937. package/dist/test/workspace-three-way.test.js.map +0 -1
  938. package/dist/test/workspace-watcher.test.d.ts +0 -2
  939. package/dist/test/workspace-watcher.test.d.ts.map +0 -1
  940. package/dist/test/workspace-watcher.test.js +0 -281
  941. package/dist/test/workspace-watcher.test.js.map +0 -1
  942. package/dist/test/xml-round-persist.test.d.ts +0 -19
  943. package/dist/test/xml-round-persist.test.d.ts.map +0 -1
  944. package/dist/test/xml-round-persist.test.js +0 -235
  945. package/dist/test/xml-round-persist.test.js.map +0 -1
  946. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -1,706 +0,0 @@
1
- /**
2
- * "Present while acting": the two halves that keep an agent conversationally
3
- * alive during a long tool-using turn.
4
- *
5
- * SPEAK-while-acting — each round's prose is routed to the locus LIVE when
6
- * the round yields its tool calls. Explicit-send suppression lasts until new
7
- * external input begins another conversational round; the 'complete' case
8
- * routes only trailing prose.
9
- * Previously all segments were batched to the end of the turn.
10
- *
11
- * HEAR-while-acting — messages arriving mid-turn (deferred by addMessage
12
- * while tool_use blocks are pending) are flushed to the context window at
13
- * the tool-result boundary AND injected into the live stream via
14
- * provideToolResults(results, { injectedMessages }) (membrane ≥0.5.72), so
15
- * the next round of the SAME turn sees them instead of the agent staying
16
- * deaf until the turn ends.
17
- */
18
- import { describe, it, beforeEach, afterEach } from 'node:test';
19
- import assert from 'node:assert/strict';
20
- import { tmpdir } from 'node:os';
21
- import { mkdtempSync, rmSync } from 'node:fs';
22
- import { join } from 'node:path';
23
- import { AgentFramework } from '../src/index.js';
24
- import { MockMembrane, createMockResponse } from './helpers/mock-membrane.js';
25
- // ---------------------------------------------------------------------------
26
- // Test module: tools that optionally emit a mid-turn external message
27
- // ---------------------------------------------------------------------------
28
- class RobotModule {
29
- name = 'robot';
30
- framework = null;
31
- /** When set, the next `move` call pushes this text as an external message
32
- * BEFORE returning its result (simulating a chat reply arriving while the
33
- * tool executes). */
34
- interjection = null;
35
- /** Optional routing locus attached to the interjected message. */
36
- interjectionChannelId = null;
37
- /** Full metadata override for the interjected message (wins over
38
- * interjectionChannelId when set) — e.g. reaction tags. */
39
- interjectionMetadata = null;
40
- /** Delay tool completion so live routing deterministically precedes it. */
41
- toolDelayMs = 0;
42
- async start(_ctx) { }
43
- async stop() { }
44
- getTools() {
45
- return [
46
- {
47
- name: 'move',
48
- description: 'Move the robot',
49
- inputSchema: { type: 'object', properties: { dir: { type: 'string' } } },
50
- },
51
- {
52
- name: 'send_message',
53
- description: 'Explicitly send a message',
54
- inputSchema: { type: 'object', properties: { text: { type: 'string' } } },
55
- },
56
- // World-surface publication verbs (Eidoverse). Bare names matter: the
57
- // framework strips the `robot--` prefix before consulting its sets.
58
- {
59
- name: 'say',
60
- description: 'Say something aloud in the world',
61
- inputSchema: { type: 'object', properties: { text: { type: 'string' } } },
62
- },
63
- {
64
- name: 'whisper',
65
- description: 'Whisper to someone in the world',
66
- inputSchema: { type: 'object', properties: { to: { type: 'string' }, text: { type: 'string' } } },
67
- },
68
- ];
69
- }
70
- async handleToolCall(call) {
71
- if (this.toolDelayMs > 0) {
72
- await new Promise((r) => setTimeout(r, this.toolDelayMs));
73
- }
74
- if (this.interjection) {
75
- const text = this.interjection;
76
- this.interjection = null;
77
- this.framework.pushEvent({
78
- type: 'external-message',
79
- source: 'test',
80
- content: text,
81
- metadata: this.interjectionMetadata
82
- ?? (this.interjectionChannelId
83
- ? { channelId: this.interjectionChannelId }
84
- : {}),
85
- });
86
- // Give the run loop a beat to process the queued message while this
87
- // tool round is still pending (pendingAssistantBlocks non-empty), so
88
- // it lands in deferredMessages before the tool-result event.
89
- await new Promise((r) => setTimeout(r, 30));
90
- }
91
- return { success: true, data: { ok: true, tool: call.name } };
92
- }
93
- async onProcess(event, _state) {
94
- if (event.type === 'external-message') {
95
- const text = String(event.content);
96
- const metadata = event.metadata;
97
- return {
98
- addMessages: [
99
- {
100
- participant: 'Antra',
101
- content: [{ type: 'text', text }],
102
- ...(metadata ? { metadata } : {}),
103
- },
104
- ],
105
- // Only the initial 'go' starts a turn. Mid-turn interjections must
106
- // NOT request inference — we're testing mid-turn delivery, not wakes.
107
- requestInference: text === 'go',
108
- };
109
- }
110
- return {};
111
- }
112
- }
113
- /** Minimal ChannelRegistry stub covering everything driveStream touches. */
114
- function stubChannelRegistry(framework) {
115
- const routed = [];
116
- let locusCalls = 0;
117
- const explicit = {
118
- resolveLocus: () => {
119
- locusCalls++;
120
- return `chan-live-${locusCalls}`;
121
- },
122
- routeSpeech: async (_agent, text, locus) => {
123
- routed.push({ text, locus: locus ?? null });
124
- // Mirror the real registry's outcome shape (delivery receipts read it).
125
- return locus ? { delivered: true, channelId: locus } : null;
126
- },
127
- getDefaultPublishChannel: () => null,
128
- isChannelOpen: () => true,
129
- getDescriptor: () => undefined,
130
- getChannelTools: () => [],
131
- };
132
- // Everything else driveStream/stop touches (startTyping, stopTyping,
133
- // stopAll, ensureChannelRegistered, ...) becomes a no-op via Proxy so the
134
- // stub doesn't chase the real registry's surface.
135
- framework.channelRegistry = new Proxy(explicit, {
136
- get: (target, prop) => (prop in target ? target[prop] : () => undefined),
137
- });
138
- return routed;
139
- }
140
- // ---------------------------------------------------------------------------
141
- describe('present while acting', () => {
142
- let tempDir;
143
- let membrane;
144
- let module;
145
- beforeEach(() => {
146
- tempDir = mkdtempSync(join(tmpdir(), 'pwa-test-'));
147
- membrane = new MockMembrane();
148
- module = new RobotModule();
149
- });
150
- afterEach(() => {
151
- rmSync(tempDir, { recursive: true, force: true });
152
- });
153
- async function createFramework() {
154
- const framework = await AgentFramework.create({
155
- storePath: join(tempDir, 'test.chronicle'),
156
- membrane: membrane.asMembrane(),
157
- agents: [
158
- { name: 'assistant', model: 'test-model', systemPrompt: 'You are a robot pilot.' },
159
- ],
160
- modules: [module],
161
- });
162
- module.framework = framework;
163
- return framework;
164
- }
165
- function trigger(framework) {
166
- framework.pushEvent({
167
- type: 'external-message',
168
- source: 'test',
169
- content: 'go',
170
- metadata: {},
171
- });
172
- }
173
- // -------------------------------------------------------------------------
174
- // Speak-while-acting
175
- // -------------------------------------------------------------------------
176
- it('routes each round\'s prose live and only trailing prose at complete', async () => {
177
- // Round 1: narration + move; Round 2: more narration + move; final: postscript
178
- membrane.pushResponse(createMockResponse([
179
- { type: 'text', text: 'Heading to the door now!' },
180
- { type: 'tool_use', id: 'c1', name: 'robot--move', input: { dir: 'north' } },
181
- ], 'tool_use'));
182
- membrane.pushResponse(createMockResponse([
183
- { type: 'text', text: 'Door reached, opening it.' },
184
- { type: 'tool_use', id: 'c2', name: 'robot--move', input: { dir: 'east' } },
185
- ], 'tool_use'));
186
- membrane.pushResponse(createMockResponse([
187
- { type: 'text', text: 'Arrived.' },
188
- ]));
189
- const framework = await createFramework();
190
- const routed = stubChannelRegistry(framework);
191
- module.toolDelayMs = 25;
192
- // Track live ordering: when the first segment routes, no tool results
193
- // may have been provided yet (i.e. delivery happened DURING the round).
194
- const resultsAtRouteTime = [];
195
- const registry = framework.channelRegistry;
196
- const origRoute = registry.routeSpeech;
197
- registry.routeSpeech = async (a, t, l) => {
198
- resultsAtRouteTime.push(membrane.lastStream.receivedToolResults.length);
199
- return origRoute(a, t, l);
200
- };
201
- trigger(framework);
202
- await framework.runUntilIdle();
203
- assert.deepEqual(routed.map((r) => r.text), ['Heading to the door now!', 'Door reached, opening it.', 'Arrived.'], 'all three segments delivered, in order');
204
- // Live: segment N routed before round N's tool results were provided
205
- assert.equal(resultsAtRouteTime[0], 0, 'round-1 prose routed before round-1 results');
206
- assert.equal(resultsAtRouteTime[1], 1, 'round-2 prose routed before round-2 results');
207
- // Locus resolved ONCE and pinned for the whole turn (incl. trailing prose)
208
- assert.deepEqual(routed.map((r) => r.locus), ['chan-live-1', 'chan-live-1', 'chan-live-1'], 'one locus resolution, pinned across the turn');
209
- await framework.stop();
210
- });
211
- it('sticky silencing: a silencing round suppresses its own and all later prose', async () => {
212
- membrane.pushResponse(createMockResponse([
213
- { type: 'text', text: 'sending it directly' },
214
- { type: 'tool_use', id: 'c1', name: 'robot--send_message', input: { text: 'hi' } },
215
- ], 'tool_use'));
216
- membrane.pushResponse(createMockResponse([
217
- { type: 'text', text: 'Narrating round two.' },
218
- { type: 'tool_use', id: 'c2', name: 'robot--move', input: { dir: 'up' } },
219
- ], 'tool_use'));
220
- membrane.pushResponse(createMockResponse([]));
221
- const framework = await createFramework();
222
- const routed = stubChannelRegistry(framework);
223
- trigger(framework);
224
- await framework.runUntilIdle();
225
- assert.deepEqual(routed.map((r) => r.text), [], 'explicit send in round 1 silences the turn from that round onward');
226
- await framework.stop();
227
- });
228
- it('sticky silencing is forward-only: earlier rounds\' prose still routes', async () => {
229
- membrane.pushResponse(createMockResponse([
230
- { type: 'text', text: 'Round one narration.' },
231
- { type: 'tool_use', id: 'c1', name: 'robot--move', input: { dir: 'up' } },
232
- ], 'tool_use'));
233
- membrane.pushResponse(createMockResponse([
234
- { type: 'text', text: 'private planning' },
235
- { type: 'tool_use', id: 'c2', name: 'robot--send_message', input: { text: 'hi' } },
236
- ], 'tool_use'));
237
- membrane.pushResponse(createMockResponse([
238
- { type: 'text', text: 'trailing postscript' },
239
- ]));
240
- const framework = await createFramework();
241
- const routed = stubChannelRegistry(framework);
242
- trigger(framework);
243
- await framework.runUntilIdle();
244
- assert.deepEqual(routed.map((r) => r.text), ['Round one narration.'], 'round-1 prose delivered live; round-2 (silencing) and trailing suppressed');
245
- await framework.stop();
246
- });
247
- it('new injected channel input resets send suppression but the turn locus stays frozen', async () => {
248
- // While handling one channel, the agent explicitly sends that response; a
249
- // message from another channel arrives during the send, and the terminal
250
- // prose answers the new message. The suppression is cleared (the prose IS
251
- // delivered) — but it lands in the TURN's frozen locus, not the injected
252
- // message's channel: ambient input must never capture the agent's voice
253
- // mid-turn (2026-07-21 Cairn lounge misroute). A cross-channel reply
254
- // needs an explicit send.
255
- membrane.pushResponse(createMockResponse([
256
- { type: 'tool_use', id: 'c1', name: 'robot--send_message', input: { text: 'reply to room4' } },
257
- ], 'tool_use'));
258
- membrane.pushResponse(createMockResponse([
259
- { type: 'text', text: 'Yes, I want to try the VR space.' },
260
- ]));
261
- const framework = await createFramework();
262
- const routed = stubChannelRegistry(framework);
263
- module.interjection = 'Want to try a VR space?';
264
- module.interjectionChannelId = 'discord:guild:fable';
265
- trigger(framework);
266
- await framework.runUntilIdle();
267
- assert.deepEqual(routed, [
268
- { text: 'Yes, I want to try the VR space.', locus: 'chan-live-1' },
269
- ]);
270
- await framework.stop();
271
- });
272
- it('an ADDRESSED mid-turn injection re-pins the locus for subsequent prose', async () => {
273
- // 2026-07-31 Mythos misroutes (n=6): someone explicitly addresses the
274
- // agent from another channel mid-turn (mention / reply / DM); the
275
- // agent's trailing prose answers THEM but the frozen pin delivered it
276
- // to the stale locus (the hospital scene into antra's DM, and its
277
- // mirror). Addressed conversational injections — the chat:addressed
278
- // signal turn-START batching already prefers — now move the pin, with a
279
- // one-line [routing] notice riding the same injection batch so window
280
- // and wire agree. Ambient injections still cannot (previous test).
281
- membrane.pushResponse(createMockResponse([
282
- { type: 'text', text: 'Station four, proceeding.' },
283
- { type: 'tool_use', id: 'c1', name: 'robot--move', input: { dir: 'north' } },
284
- ], 'tool_use'));
285
- membrane.pushResponse(createMockResponse([
286
- { type: 'text', text: 'Answering the person who addressed me.' },
287
- ]));
288
- const framework = await createFramework();
289
- const routed = stubChannelRegistry(framework);
290
- module.toolDelayMs = 25;
291
- module.interjection = 'hey, quick question over here?';
292
- module.interjectionMetadata = { channelId: 'discord:dm:antra', tags: ['chat:addressed'] };
293
- const notices = [];
294
- framework.onTrace((event) => {
295
- const e = event;
296
- if (e.type === 'message:added' && e.source === 'routing-notice')
297
- notices.push(e.source);
298
- });
299
- trigger(framework);
300
- await framework.runUntilIdle();
301
- // Round-1 prose predates the injection and belongs to the old pin;
302
- // trailing prose follows the addressed speaker.
303
- assert.deepEqual(routed, [
304
- { text: 'Station four, proceeding.', locus: 'chan-live-1' },
305
- { text: 'Answering the person who addressed me.', locus: 'discord:dm:antra' },
306
- ]);
307
- // Boot-baseline announcement + the mid-turn re-pin notice.
308
- assert.equal(notices.length, 2, 'the re-pin produced exactly one routing notice');
309
- // The notice rode the injection batch to the live stream (window == wire).
310
- const injectedBatches = membrane.lastStream.receivedToolResultOptions
311
- .map((o) => o?.injectedMessages ?? []);
312
- const wired = injectedBatches.flat().map((m) => JSON.stringify(m.content));
313
- assert.ok(wired.some((s) => s.includes('quick question')), 'the addressed message itself was injected');
314
- assert.ok(wired.some((s) => s.includes('[routing] The conversation moved to discord:dm:antra')), 'the re-pin notice was injected alongside it');
315
- await framework.stop();
316
- });
317
- it('a follow-up in a channel the agent explicitly engaged this turn re-pins', async () => {
318
- // 2026-07-31 n=7 (q's #portables reply): the agent explicitly sent into
319
- // a channel this turn; someone replies there WITHOUT a mention (ambient
320
- // by tag, addressed by context). The engaged-channel leg moves the pin;
321
- // trailing prose answering them follows.
322
- membrane.pushResponse(createMockResponse([
323
- { type: 'tool_use', id: 'c1', name: 'robot--move', input: { dir: 'north' } },
324
- ], 'tool_use'));
325
- membrane.pushResponse(createMockResponse([
326
- { type: 'text', text: 'Good plan on both counts.' },
327
- ]));
328
- const framework = await createFramework();
329
- const routed = stubChannelRegistry(framework);
330
- module.toolDelayMs = 25;
331
- module.interjection = 'I need to swap out this eye screen';
332
- module.interjectionMetadata = {
333
- channelId: 'discord:guild:portables',
334
- tags: ['chat:ambient', 'chat:from-human'],
335
- };
336
- // Simulate an explicit send into #portables earlier in THIS turn (the
337
- // production record happens on the MCPL send path; the harness module's
338
- // tools are not MCPL, so seed the turn-scoped set mid-turn — after the
339
- // turn-start clear, before the injection boundary).
340
- const origHandle = module.handleToolCall.bind(module);
341
- module.handleToolCall = async (call) => {
342
- framework.turnEngagedChannels.set('assistant', new Set(['discord:guild:portables']));
343
- return origHandle(call);
344
- };
345
- trigger(framework);
346
- await framework.runUntilIdle();
347
- assert.deepEqual(routed, [
348
- { text: 'Good plan on both counts.', locus: 'discord:guild:portables' },
349
- ], 'trailing prose followed the human reply into the engaged channel');
350
- await framework.stop();
351
- });
352
- it('an agent-resident follow-up in an engaged channel re-pins too (no author-kind filter)', async () => {
353
- // Fleet participants include agent-residents — "bot" by Discord flag,
354
- // full conversational participants in fact. Their in-flow replies in a
355
- // channel the agent just engaged move the pin exactly like anyone
356
- // else's (antra, 2026-07-31: the author-kind distinction is fragile and
357
- // wrong for this fleet).
358
- membrane.pushResponse(createMockResponse([
359
- { type: 'tool_use', id: 'c1', name: 'robot--move', input: { dir: 'north' } },
360
- ], 'tool_use'));
361
- membrane.pushResponse(createMockResponse([
362
- { type: 'text', text: 'Continuing with the colleague.' },
363
- ]));
364
- const framework = await createFramework();
365
- const routed = stubChannelRegistry(framework);
366
- module.toolDelayMs = 25;
367
- module.interjection = '*from the table* one receipt for the case, since I have a dated instance';
368
- module.interjectionMetadata = {
369
- channelId: 'discord:guild:hospital',
370
- tags: ['chat:ambient', 'chat:from-bot'],
371
- };
372
- const origHandle = module.handleToolCall.bind(module);
373
- module.handleToolCall = async (call) => {
374
- framework.turnEngagedChannels.set('assistant', new Set(['discord:guild:hospital']));
375
- return origHandle(call);
376
- };
377
- trigger(framework);
378
- await framework.runUntilIdle();
379
- assert.deepEqual(routed, [
380
- { text: 'Continuing with the colleague.', locus: 'discord:guild:hospital' },
381
- ], 'the agent-resident follow-up moved the pin like any participant');
382
- await framework.stop();
383
- });
384
- it('ambient chatter in a channel the agent did NOT engage still cannot move the pin', async () => {
385
- // The Cairn-protection boundary, restated for the engaged-channel era:
386
- // no mention, no engagement this turn → the pin holds.
387
- membrane.pushResponse(createMockResponse([
388
- { type: 'tool_use', id: 'c1', name: 'robot--move', input: { dir: 'north' } },
389
- ], 'tool_use'));
390
- membrane.pushResponse(createMockResponse([
391
- { type: 'text', text: 'Continuing my report.' },
392
- ]));
393
- const framework = await createFramework();
394
- const routed = stubChannelRegistry(framework);
395
- module.toolDelayMs = 25;
396
- module.interjection = 'unrelated lounge chatter';
397
- module.interjectionMetadata = {
398
- channelId: 'discord:guild:lounge',
399
- tags: ['chat:ambient', 'chat:from-human'],
400
- };
401
- trigger(framework);
402
- await framework.runUntilIdle();
403
- assert.deepEqual(routed, [
404
- { text: 'Continuing my report.', locus: 'chan-live-1' },
405
- ], 'un-engaged ambient left the pin alone');
406
- await framework.stop();
407
- });
408
- it('an addressed injection from the CURRENT locus does not chatter a notice', async () => {
409
- // Same-channel addressed input is the ordinary case (the person the
410
- // agent is already talking to sends another message mid-turn): the pin
411
- // is already right, so no re-pin and — critically for KV — no notice.
412
- membrane.pushResponse(createMockResponse([
413
- { type: 'tool_use', id: 'c1', name: 'robot--move', input: { dir: 'north' } },
414
- ], 'tool_use'));
415
- membrane.pushResponse(createMockResponse([
416
- { type: 'text', text: 'Continuing right here.' },
417
- ]));
418
- const framework = await createFramework();
419
- const routed = stubChannelRegistry(framework);
420
- module.toolDelayMs = 25;
421
- module.interjection = 'and one more thing';
422
- module.interjectionMetadata = { channelId: 'chan-live-1', tags: ['chat:addressed'] };
423
- const notices = [];
424
- framework.onTrace((event) => {
425
- const e = event;
426
- if (e.type === 'message:added' && e.source === 'routing-notice')
427
- notices.push(e.source);
428
- });
429
- trigger(framework);
430
- await framework.runUntilIdle();
431
- assert.deepEqual(routed, [{ text: 'Continuing right here.', locus: 'chan-live-1' }]);
432
- assert.equal(notices.length, 1, 'only the boot-baseline announcement — no re-pin chatter');
433
- await framework.stop();
434
- });
435
- it('a prose turn ends with a [delivered] receipt naming where the prose landed', async () => {
436
- // Explicit sends receipt themselves via tool_result; auto-routed prose
437
- // previously vanished with no in-window trace — the agent could never
438
- // see where its own words went (2026-07-31 misroute series). One compact
439
- // system message at logical turn end, channels deduped in delivery order.
440
- membrane.pushResponse(createMockResponse([
441
- { type: 'text', text: 'A quiet reply with no tools.' },
442
- ]));
443
- const framework = await createFramework();
444
- stubChannelRegistry(framework);
445
- trigger(framework);
446
- await framework.runUntilIdle();
447
- const cm = framework.agents.get('assistant').getContextManager();
448
- const texts = cm.getAllMessages()
449
- .flatMap((m) => m.content)
450
- .filter((b) => b.type === 'text')
451
- .map((b) => b.text ?? '');
452
- const receipts = texts.filter((t) => t.startsWith('[delivered]'));
453
- assert.deepEqual(receipts, ['[delivered] plain speech → chan-live-1']);
454
- // The receipt is the LAST window message — after the assistant blocks.
455
- assert.ok(texts[texts.length - 1].startsWith('[delivered]'), 'receipt sits at the settled tail');
456
- await framework.stop();
457
- });
458
- it('a re-pinned turn\'s receipt names both channels in delivery order', async () => {
459
- membrane.pushResponse(createMockResponse([
460
- { type: 'text', text: 'Station four, proceeding.' },
461
- { type: 'tool_use', id: 'c1', name: 'robot--move', input: { dir: 'north' } },
462
- ], 'tool_use'));
463
- membrane.pushResponse(createMockResponse([
464
- { type: 'text', text: 'Answering the person who addressed me.' },
465
- ]));
466
- const framework = await createFramework();
467
- stubChannelRegistry(framework);
468
- module.toolDelayMs = 25;
469
- module.interjection = 'quick question over here?';
470
- module.interjectionMetadata = { channelId: 'discord:dm:antra', tags: ['chat:addressed'] };
471
- trigger(framework);
472
- await framework.runUntilIdle();
473
- const cm = framework.agents.get('assistant').getContextManager();
474
- const receipts = cm.getAllMessages()
475
- .flatMap((m) => m.content)
476
- .filter((b) => b.type === 'text')
477
- .map((b) => b.text ?? '')
478
- .filter((t) => t.startsWith('[delivered]'));
479
- assert.deepEqual(receipts, ['[delivered] plain speech → chan-live-1 · discord:dm:antra']);
480
- await framework.stop();
481
- });
482
- it('suppressed prose is visible in the receipt (silencing is never a silent black hole)', async () => {
483
- // n=8 (2026-07-31 ~22:46): one round multiplexing two threads — prose
484
- // for the lane + an explicit send for another channel, textbook per the
485
- // routing doc. Sticky silencing ate the prose reply and nothing told
486
- // the author; their own record believed it delivered. The rule stands
487
- // (antra: visibility is enough) — but the turn-end receipt now reports
488
- // the suppression, so the segment's fate is visible one turn later.
489
- membrane.pushResponse(createMockResponse([
490
- { type: 'text', text: 'the reply that silencing will eat' },
491
- { type: 'tool_use', id: 'c1', name: 'robot--send_message', input: { text: 'explicit send to the other thread' } },
492
- ], 'tool_use'));
493
- membrane.pushResponse(createMockResponse([
494
- { type: 'text', text: 'trailing prose, also suppressed (sticky)' },
495
- ]));
496
- const framework = await createFramework();
497
- const routed = stubChannelRegistry(framework);
498
- trigger(framework);
499
- await framework.runUntilIdle();
500
- assert.deepEqual(routed, [], 'silencing semantics unchanged: nothing auto-routed');
501
- const cm = framework.agents.get('assistant').getContextManager();
502
- const receipts = cm.getAllMessages()
503
- .flatMap((m) => m.content)
504
- .filter((b) => b.type === 'text')
505
- .map((b) => b.text ?? '')
506
- .filter((t) => t.startsWith('[delivered]'));
507
- assert.deepEqual(receipts, [
508
- '[delivered] nothing — 2 plain-speech segment(s) suppressed (explicit send in the same round — resend with a send tool if it was meant to be heard)',
509
- ]);
510
- await framework.stop();
511
- });
512
- for (const verb of ['say', 'whisper']) {
513
- it(`world \`${verb}\` silences adjacent auto-routed prose in locus mode (no double-publish)`, async () => {
514
- // 2026-09-01 (Cairn, locus mode): a round of ordinary text + explicit
515
- // world `say` published TWICE — seq 15146 was the say text, seq 15147
516
- // the adjacent prose auto-routed to the same world locus, byte-for-byte.
517
- // World publication verbs silenced only in hybrid mode; Discord sends
518
- // silenced everywhere. An explicit world utterance is the resident's
519
- // chosen speech for the round in every mode.
520
- const input = verb === 'say'
521
- ? { text: 'the intended utterance' }
522
- : { to: 'sill', text: 'the intended utterance' };
523
- membrane.pushResponse(createMockResponse([
524
- { type: 'text', text: 'adjacent prose that must NOT auto-publish' },
525
- { type: 'tool_use', id: 'c1', name: `robot--${verb}`, input },
526
- ], 'tool_use'));
527
- membrane.pushResponse(createMockResponse([
528
- { type: 'text', text: 'trailing prose, also suppressed (sticky)' },
529
- ]));
530
- const framework = await createFramework();
531
- const routed = stubChannelRegistry(framework);
532
- trigger(framework);
533
- await framework.runUntilIdle();
534
- assert.deepEqual(routed, [], `${verb}: nothing auto-routed beside the explicit world utterance`);
535
- const cm = framework.agents.get('assistant').getContextManager();
536
- const receipts = cm.getAllMessages()
537
- .flatMap((m) => m.content)
538
- .filter((b) => b.type === 'text')
539
- .map((b) => b.text ?? '')
540
- .filter((t) => t.startsWith('[delivered]'));
541
- assert.deepEqual(receipts, [
542
- '[delivered] nothing — 2 plain-speech segment(s) suppressed (explicit send in the same round — resend with a send tool if it was meant to be heard)',
543
- ], `${verb}: suppression is visible in the receipt`);
544
- await framework.stop();
545
- });
546
- }
547
- it('a non-publishing world tool (move) does not silence — speak-while-acting unchanged', async () => {
548
- // Negative control for the world-verb silencing: only publication verbs
549
- // silence. Ordinary acting tools still narrate live to the locus.
550
- membrane.pushResponse(createMockResponse([
551
- { type: 'text', text: 'walking over' },
552
- { type: 'tool_use', id: 'c1', name: 'robot--move', input: { dir: 'north' } },
553
- ], 'tool_use'));
554
- membrane.pushResponse(createMockResponse([
555
- { type: 'text', text: 'there' },
556
- ]));
557
- const framework = await createFramework();
558
- const routed = stubChannelRegistry(framework);
559
- trigger(framework);
560
- await framework.runUntilIdle();
561
- assert.deepEqual(routed.map((r) => r.text), ['walking over', 'there']);
562
- await framework.stop();
563
- });
564
- it('channel_open moves the pin mid-turn and announces in its own tool result', async () => {
565
- // The agent's own deliberate open is the strongest "my next words go
566
- // here" signal — stronger than any injection. The original 2026-07-21
567
- // Aria fix only set next-turn trigger state; the turn-frozen refactor
568
- // silently regressed the reply-right-after-opening case. Now the pin
569
- // moves immediately and the announcement rides the tool result itself
570
- // (model-requested content: distance zero, safest role).
571
- membrane.pushResponse(createMockResponse([
572
- { type: 'tool_use', id: 'c1', name: 'channel_open', input: { channelId: 'discord:guild:observatory' } },
573
- ], 'tool_use'));
574
- membrane.pushResponse(createMockResponse([
575
- { type: 'text', text: 'Hello, observatory.' },
576
- ]));
577
- const framework = await createFramework();
578
- const routed = stubChannelRegistry(framework);
579
- const registry = framework.channelRegistry;
580
- registry.handleChannelToolCall =
581
- async () => ({ success: true, data: { channelId: 'discord:guild:observatory', opened: true } });
582
- trigger(framework);
583
- await framework.runUntilIdle();
584
- assert.deepEqual(routed, [
585
- { text: 'Hello, observatory.', locus: 'discord:guild:observatory' },
586
- ], 'prose right after channel_open lands in the opened channel');
587
- // The announcement rode the tool result the model saw.
588
- const results = membrane.lastStream.receivedToolResults.flat();
589
- assert.ok(JSON.stringify(results).includes('plain speech now lands in this channel'), 'routing note present in the channel_open tool result');
590
- await framework.stop();
591
- });
592
- it('reactions and system markers injected mid-turn do not clear send suppression', async () => {
593
- // A reaction (`chat:reaction` tag) or a `system: true` marker is not
594
- // conversational input: prose following an explicit send stays suppressed,
595
- // so a stray reaction can't make the agent double-post a "sent it"
596
- // postscript — and (with the frozen locus) can't move routing either.
597
- membrane.pushResponse(createMockResponse([
598
- { type: 'tool_use', id: 'c1', name: 'robot--send_message', input: { text: 'reply to room4' } },
599
- ], 'tool_use'));
600
- membrane.pushResponse(createMockResponse([
601
- { type: 'text', text: 'Sent it.' },
602
- ]));
603
- const framework = await createFramework();
604
- const routed = stubChannelRegistry(framework);
605
- module.interjection = '[reaction] @someone reacted 👍';
606
- module.interjectionChannelId = null;
607
- module.interjectionMetadata = { channelId: '999888777', tags: ['chat:reaction'] };
608
- trigger(framework);
609
- await framework.runUntilIdle();
610
- assert.deepEqual(routed, [], 'post-send prose stayed suppressed after a reaction');
611
- await framework.stop();
612
- });
613
- it('text-only turns route to the turn-frozen locus, not a live re-resolution', async () => {
614
- // The text-only dispatch runs after the agent is idle; a live resolution
615
- // there can read the NEXT turn's trigger state or a post-restart cleared
616
- // one (2026-07-22 Sol DM misroute). The stub increments its locus per
617
- // resolveLocus() call: the turn-start freeze consumes chan-live-1, so a
618
- // live re-resolution at dispatch would return chan-live-2. The frozen
619
- // path must deliver to chan-live-1.
620
- membrane.pushResponse(createMockResponse([
621
- { type: 'text', text: 'A quiet reply with no tools.' },
622
- ]));
623
- const framework = await createFramework();
624
- const routed = stubChannelRegistry(framework);
625
- trigger(framework);
626
- await framework.runUntilIdle();
627
- assert.deepEqual(routed, [
628
- { text: 'A quiet reply with no tools.', locus: 'chan-live-1' },
629
- ]);
630
- await framework.stop();
631
- });
632
- it('announces the outbound locus in the window only when it changes', async () => {
633
- // Turn 1 (locus chan-live-1, e2e): one durable [routing] notice — the
634
- // boot baseline. Then the announce-on-change logic directly (MockMembrane
635
- // supports one turn per test): same locus → silence (steady state must
636
- // not chatter — KV); new locus → exactly one more notice.
637
- membrane.pushResponse(createMockResponse([{ type: 'text', text: 'one' }]));
638
- const framework = await createFramework();
639
- stubChannelRegistry(framework);
640
- const notices = [];
641
- framework.onTrace((event) => {
642
- const e = event;
643
- if (e.type === 'message:added' && e.source === 'routing-notice') {
644
- notices.push(e.source);
645
- }
646
- });
647
- trigger(framework);
648
- await framework.runUntilIdle();
649
- assert.equal(notices.length, 1, 'first turn announced the boot-baseline locus');
650
- const announce = framework.announceLocusIfChanged.bind(framework);
651
- announce('assistant', 'chan-live-1');
652
- assert.equal(notices.length, 1, 'unchanged locus announced nothing');
653
- announce('assistant', 'chan-B');
654
- assert.equal(notices.length, 2, 'changed locus announced exactly once');
655
- announce('assistant', 'chan-B');
656
- assert.equal(notices.length, 2, 'steady state on the new locus stays silent');
657
- announce('assistant', null);
658
- assert.equal(notices.length, 3, 'losing the locus is announced too');
659
- await framework.stop();
660
- });
661
- // -------------------------------------------------------------------------
662
- // Hear-while-acting
663
- // -------------------------------------------------------------------------
664
- it('injects a mid-turn message into the resumed stream at the tool boundary', async () => {
665
- membrane.pushResponse(createMockResponse([
666
- { type: 'text', text: 'Moving.' },
667
- { type: 'tool_use', id: 'c1', name: 'robot--move', input: { dir: 'north' } },
668
- ], 'tool_use'));
669
- membrane.pushResponse(createMockResponse([
670
- { type: 'text', text: 'Heard you!' },
671
- ]));
672
- const framework = await createFramework();
673
- module.interjection = 'look left!';
674
- trigger(framework);
675
- await framework.runUntilIdle();
676
- const stream = membrane.lastStream;
677
- assert.equal(stream.receivedToolResults.length, 1);
678
- const options = stream.receivedToolResultOptions[0];
679
- assert.ok(options?.injectedMessages, 'tool-result resume carried injected messages');
680
- assert.equal(options.injectedMessages.length, 1);
681
- const injected = options.injectedMessages[0];
682
- assert.equal(injected.participant, 'Antra');
683
- const text = injected.content
684
- .filter((b) => b.type === 'text')
685
- .map((b) => b.text)
686
- .join('\n');
687
- assert.equal(text, 'look left!');
688
- await framework.stop();
689
- });
690
- it('passes no injection options when nothing arrived mid-turn', async () => {
691
- membrane.pushResponse(createMockResponse([
692
- { type: 'tool_use', id: 'c1', name: 'robot--move', input: { dir: 'north' } },
693
- ], 'tool_use'));
694
- membrane.pushResponse(createMockResponse([
695
- { type: 'text', text: 'done' },
696
- ]));
697
- const framework = await createFramework();
698
- trigger(framework);
699
- await framework.runUntilIdle();
700
- const stream = membrane.lastStream;
701
- assert.equal(stream.receivedToolResults.length, 1);
702
- assert.equal(stream.receivedToolResultOptions[0], undefined);
703
- await framework.stop();
704
- });
705
- });
706
- //# sourceMappingURL=present-while-acting.test.js.map