@animalabs/agent-framework 0.22.2 → 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 (935) hide show
  1. package/README.md +3 -1
  2. package/dist/src/agent.d.ts +77 -12
  3. package/dist/src/agent.d.ts.map +1 -1
  4. package/dist/src/agent.js +136 -40
  5. package/dist/src/agent.js.map +1 -1
  6. package/dist/src/api/mcp-server-core.js +1 -1
  7. package/dist/src/api/mcp-server-core.js.map +1 -1
  8. package/dist/src/api/server.d.ts.map +1 -1
  9. package/dist/src/api/server.js +5 -1
  10. package/dist/src/api/server.js.map +1 -1
  11. package/dist/src/api/types.d.ts +1 -1
  12. package/dist/src/api/types.d.ts.map +1 -1
  13. package/dist/src/branch-names.d.ts +14 -0
  14. package/dist/src/branch-names.d.ts.map +1 -0
  15. package/dist/src/branch-names.js +22 -0
  16. package/dist/src/branch-names.js.map +1 -0
  17. package/dist/src/closest-names.d.ts +28 -0
  18. package/dist/src/closest-names.d.ts.map +1 -0
  19. package/dist/src/closest-names.js +98 -0
  20. package/dist/src/closest-names.js.map +1 -0
  21. package/dist/src/code-execution/py-runner.d.ts +16 -5
  22. package/dist/src/code-execution/py-runner.d.ts.map +1 -1
  23. package/dist/src/code-execution/py-runner.js +186 -74
  24. package/dist/src/code-execution/py-runner.js.map +1 -1
  25. package/dist/src/code-execution/runtime-py.d.ts.map +1 -1
  26. package/dist/src/code-execution/runtime-py.js +49 -3
  27. package/dist/src/code-execution/runtime-py.js.map +1 -1
  28. package/dist/src/code-execution/tool-definition.d.ts +12 -1
  29. package/dist/src/code-execution/tool-definition.d.ts.map +1 -1
  30. package/dist/src/code-execution/tool-definition.js +21 -3
  31. package/dist/src/code-execution/tool-definition.js.map +1 -1
  32. package/dist/src/config-checks.d.ts +28 -0
  33. package/dist/src/config-checks.d.ts.map +1 -0
  34. package/dist/src/config-checks.js +52 -0
  35. package/dist/src/config-checks.js.map +1 -0
  36. package/dist/src/deadline-timer.d.ts +21 -0
  37. package/dist/src/deadline-timer.d.ts.map +1 -0
  38. package/dist/src/deadline-timer.js +43 -0
  39. package/dist/src/deadline-timer.js.map +1 -0
  40. package/dist/src/error-message.d.ts +30 -0
  41. package/dist/src/error-message.d.ts.map +1 -0
  42. package/dist/src/error-message.js +50 -0
  43. package/dist/src/error-message.js.map +1 -0
  44. package/dist/src/framework.d.ts +828 -88
  45. package/dist/src/framework.d.ts.map +1 -1
  46. package/dist/src/framework.js +5011 -1326
  47. package/dist/src/framework.js.map +1 -1
  48. package/dist/src/gate/event-gate.d.ts +8 -0
  49. package/dist/src/gate/event-gate.d.ts.map +1 -1
  50. package/dist/src/gate/event-gate.js +27 -3
  51. package/dist/src/gate/event-gate.js.map +1 -1
  52. package/dist/src/index.d.ts +4 -2
  53. package/dist/src/index.d.ts.map +1 -1
  54. package/dist/src/index.js +4 -2
  55. package/dist/src/index.js.map +1 -1
  56. package/dist/src/mcpl/channel-registry.d.ts +144 -6
  57. package/dist/src/mcpl/channel-registry.d.ts.map +1 -1
  58. package/dist/src/mcpl/channel-registry.js +424 -263
  59. package/dist/src/mcpl/channel-registry.js.map +1 -1
  60. package/dist/src/mcpl/checkpoint-manager.d.ts +21 -1
  61. package/dist/src/mcpl/checkpoint-manager.d.ts.map +1 -1
  62. package/dist/src/mcpl/checkpoint-manager.js +91 -30
  63. package/dist/src/mcpl/checkpoint-manager.js.map +1 -1
  64. package/dist/src/mcpl/conversation-router.d.ts +19 -3
  65. package/dist/src/mcpl/conversation-router.d.ts.map +1 -1
  66. package/dist/src/mcpl/conversation-router.js +23 -8
  67. package/dist/src/mcpl/conversation-router.js.map +1 -1
  68. package/dist/src/mcpl/convert-block.d.ts +20 -0
  69. package/dist/src/mcpl/convert-block.d.ts.map +1 -0
  70. package/dist/src/mcpl/convert-block.js +89 -0
  71. package/dist/src/mcpl/convert-block.js.map +1 -0
  72. package/dist/src/mcpl/errors.d.ts +13 -0
  73. package/dist/src/mcpl/errors.d.ts.map +1 -1
  74. package/dist/src/mcpl/errors.js +28 -0
  75. package/dist/src/mcpl/errors.js.map +1 -1
  76. package/dist/src/mcpl/hook-orchestrator.d.ts +23 -0
  77. package/dist/src/mcpl/hook-orchestrator.d.ts.map +1 -1
  78. package/dist/src/mcpl/hook-orchestrator.js +83 -72
  79. package/dist/src/mcpl/hook-orchestrator.js.map +1 -1
  80. package/dist/src/mcpl/inbound-source.d.ts +114 -0
  81. package/dist/src/mcpl/inbound-source.d.ts.map +1 -0
  82. package/dist/src/mcpl/inbound-source.js +83 -0
  83. package/dist/src/mcpl/inbound-source.js.map +1 -0
  84. package/dist/src/mcpl/index.d.ts +3 -1
  85. package/dist/src/mcpl/index.d.ts.map +1 -1
  86. package/dist/src/mcpl/index.js +3 -1
  87. package/dist/src/mcpl/index.js.map +1 -1
  88. package/dist/src/mcpl/inference-router.d.ts +15 -11
  89. package/dist/src/mcpl/inference-router.d.ts.map +1 -1
  90. package/dist/src/mcpl/inference-router.js +153 -84
  91. package/dist/src/mcpl/inference-router.js.map +1 -1
  92. package/dist/src/mcpl/push-coalescer.d.ts +33 -11
  93. package/dist/src/mcpl/push-coalescer.d.ts.map +1 -1
  94. package/dist/src/mcpl/push-coalescer.js +52 -20
  95. package/dist/src/mcpl/push-coalescer.js.map +1 -1
  96. package/dist/src/mcpl/push-handler.d.ts +16 -9
  97. package/dist/src/mcpl/push-handler.d.ts.map +1 -1
  98. package/dist/src/mcpl/push-handler.js +18 -83
  99. package/dist/src/mcpl/push-handler.js.map +1 -1
  100. package/dist/src/mcpl/reference-fetcher.d.ts +14 -2
  101. package/dist/src/mcpl/reference-fetcher.d.ts.map +1 -1
  102. package/dist/src/mcpl/reference-fetcher.js +72 -30
  103. package/dist/src/mcpl/reference-fetcher.js.map +1 -1
  104. package/dist/src/mcpl/references.d.ts +47 -12
  105. package/dist/src/mcpl/references.d.ts.map +1 -1
  106. package/dist/src/mcpl/references.js +74 -21
  107. package/dist/src/mcpl/references.js.map +1 -1
  108. package/dist/src/mcpl/server-connection.d.ts +89 -10
  109. package/dist/src/mcpl/server-connection.d.ts.map +1 -1
  110. package/dist/src/mcpl/server-connection.js +405 -129
  111. package/dist/src/mcpl/server-connection.js.map +1 -1
  112. package/dist/src/mcpl/server-registry.d.ts +10 -1
  113. package/dist/src/mcpl/server-registry.d.ts.map +1 -1
  114. package/dist/src/mcpl/server-registry.js +14 -3
  115. package/dist/src/mcpl/server-registry.js.map +1 -1
  116. package/dist/src/mcpl/skip-reply-wake.d.ts +36 -0
  117. package/dist/src/mcpl/skip-reply-wake.d.ts.map +1 -0
  118. package/dist/src/mcpl/skip-reply-wake.js +55 -0
  119. package/dist/src/mcpl/skip-reply-wake.js.map +1 -0
  120. package/dist/src/mcpl/transport.d.ts +51 -2
  121. package/dist/src/mcpl/transport.d.ts.map +1 -1
  122. package/dist/src/mcpl/transport.js +114 -20
  123. package/dist/src/mcpl/transport.js.map +1 -1
  124. package/dist/src/mcpl/types.d.ts +14 -3
  125. package/dist/src/mcpl/types.d.ts.map +1 -1
  126. package/dist/src/mcpl/types.js.map +1 -1
  127. package/dist/src/mcpl/visible-content.d.ts +15 -0
  128. package/dist/src/mcpl/visible-content.d.ts.map +1 -1
  129. package/dist/src/mcpl/visible-content.js +25 -0
  130. package/dist/src/mcpl/visible-content.js.map +1 -1
  131. package/dist/src/module-registry.d.ts +19 -1
  132. package/dist/src/module-registry.d.ts.map +1 -1
  133. package/dist/src/module-registry.js +54 -25
  134. package/dist/src/module-registry.js.map +1 -1
  135. package/dist/src/modules/api/index.js +1 -1
  136. package/dist/src/modules/api/index.js.map +1 -1
  137. package/dist/src/modules/discord/discord-js-client.d.ts +1 -0
  138. package/dist/src/modules/discord/discord-js-client.d.ts.map +1 -1
  139. package/dist/src/modules/discord/discord-js-client.js +25 -9
  140. package/dist/src/modules/discord/discord-js-client.js.map +1 -1
  141. package/dist/src/modules/discord/index.d.ts +29 -3
  142. package/dist/src/modules/discord/index.d.ts.map +1 -1
  143. package/dist/src/modules/discord/index.js +379 -143
  144. package/dist/src/modules/discord/index.js.map +1 -1
  145. package/dist/src/modules/discord/types.d.ts +14 -1
  146. package/dist/src/modules/discord/types.d.ts.map +1 -1
  147. package/dist/src/modules/health/index.d.ts.map +1 -1
  148. package/dist/src/modules/health/index.js +2 -1
  149. package/dist/src/modules/health/index.js.map +1 -1
  150. package/dist/src/modules/history/index.d.ts +3 -1
  151. package/dist/src/modules/history/index.d.ts.map +1 -1
  152. package/dist/src/modules/history/index.js +359 -127
  153. package/dist/src/modules/history/index.js.map +1 -1
  154. package/dist/src/modules/history/semantic.d.ts +28 -1
  155. package/dist/src/modules/history/semantic.d.ts.map +1 -1
  156. package/dist/src/modules/history/semantic.js +177 -32
  157. package/dist/src/modules/history/semantic.js.map +1 -1
  158. package/dist/src/modules/unknown-tool.d.ts +10 -0
  159. package/dist/src/modules/unknown-tool.d.ts.map +1 -0
  160. package/dist/src/modules/unknown-tool.js +17 -0
  161. package/dist/src/modules/unknown-tool.js.map +1 -0
  162. package/dist/src/modules/workspace/disk-agreement.d.ts +32 -2
  163. package/dist/src/modules/workspace/disk-agreement.d.ts.map +1 -1
  164. package/dist/src/modules/workspace/disk-agreement.js +30 -2
  165. package/dist/src/modules/workspace/disk-agreement.js.map +1 -1
  166. package/dist/src/modules/workspace/effects.d.ts +64 -6
  167. package/dist/src/modules/workspace/effects.d.ts.map +1 -1
  168. package/dist/src/modules/workspace/effects.js +291 -44
  169. package/dist/src/modules/workspace/effects.js.map +1 -1
  170. package/dist/src/modules/workspace/index.d.ts +119 -23
  171. package/dist/src/modules/workspace/index.d.ts.map +1 -1
  172. package/dist/src/modules/workspace/index.js +793 -247
  173. package/dist/src/modules/workspace/index.js.map +1 -1
  174. package/dist/src/modules/workspace/observe.d.ts +75 -8
  175. package/dist/src/modules/workspace/observe.d.ts.map +1 -1
  176. package/dist/src/modules/workspace/observe.js +174 -14
  177. package/dist/src/modules/workspace/observe.js.map +1 -1
  178. package/dist/src/modules/workspace/reconcile.d.ts +58 -7
  179. package/dist/src/modules/workspace/reconcile.d.ts.map +1 -1
  180. package/dist/src/modules/workspace/reconcile.js +521 -56
  181. package/dist/src/modules/workspace/reconcile.js.map +1 -1
  182. package/dist/src/modules/workspace/types.d.ts +18 -4
  183. package/dist/src/modules/workspace/types.d.ts.map +1 -1
  184. package/dist/src/modules/workspace/types.js.map +1 -1
  185. package/dist/src/modules/workspace/watcher.d.ts +7 -2
  186. package/dist/src/modules/workspace/watcher.d.ts.map +1 -1
  187. package/dist/src/modules/workspace/watcher.js +28 -4
  188. package/dist/src/modules/workspace/watcher.js.map +1 -1
  189. package/dist/src/prose-drafts.d.ts +240 -0
  190. package/dist/src/prose-drafts.d.ts.map +1 -0
  191. package/dist/src/prose-drafts.js +362 -0
  192. package/dist/src/prose-drafts.js.map +1 -0
  193. package/dist/src/prose-segments.d.ts +21 -2
  194. package/dist/src/prose-segments.d.ts.map +1 -1
  195. package/dist/src/prose-segments.js +46 -9
  196. package/dist/src/prose-segments.js.map +1 -1
  197. package/dist/src/recovery/offline-branch.d.ts +1 -0
  198. package/dist/src/recovery/offline-branch.d.ts.map +1 -1
  199. package/dist/src/recovery/offline-branch.js +3 -1
  200. package/dist/src/recovery/offline-branch.js.map +1 -1
  201. package/dist/src/safe-slice.d.ts +5 -1
  202. package/dist/src/safe-slice.d.ts.map +1 -1
  203. package/dist/src/safe-slice.js +9 -1
  204. package/dist/src/safe-slice.js.map +1 -1
  205. package/dist/src/tool-image-ledger.d.ts +87 -19
  206. package/dist/src/tool-image-ledger.d.ts.map +1 -1
  207. package/dist/src/tool-image-ledger.js +135 -32
  208. package/dist/src/tool-image-ledger.js.map +1 -1
  209. package/dist/src/tool-presentation.d.ts +9 -0
  210. package/dist/src/tool-presentation.d.ts.map +1 -1
  211. package/dist/src/tool-presentation.js +257 -60
  212. package/dist/src/tool-presentation.js.map +1 -1
  213. package/dist/src/tool-result-guard.d.ts.map +1 -1
  214. package/dist/src/tool-result-guard.js +7 -10
  215. package/dist/src/tool-result-guard.js.map +1 -1
  216. package/dist/src/tool-result-history.d.ts +32 -3
  217. package/dist/src/tool-result-history.d.ts.map +1 -1
  218. package/dist/src/tool-result-history.js +106 -19
  219. package/dist/src/tool-result-history.js.map +1 -1
  220. package/dist/src/tune-out/coordinator.d.ts +25 -1
  221. package/dist/src/tune-out/coordinator.d.ts.map +1 -1
  222. package/dist/src/tune-out/coordinator.js +260 -65
  223. package/dist/src/tune-out/coordinator.js.map +1 -1
  224. package/dist/src/types/agent.d.ts +17 -5
  225. package/dist/src/types/agent.d.ts.map +1 -1
  226. package/dist/src/types/events.d.ts +17 -0
  227. package/dist/src/types/events.d.ts.map +1 -1
  228. package/dist/src/types/framework.d.ts +21 -5
  229. package/dist/src/types/framework.d.ts.map +1 -1
  230. package/dist/src/types/inference-log.d.ts +1 -1
  231. package/dist/src/types/inference-log.d.ts.map +1 -1
  232. package/dist/src/types/module.d.ts +23 -4
  233. package/dist/src/types/module.d.ts.map +1 -1
  234. package/dist/src/types/trace.d.ts +95 -6
  235. package/dist/src/types/trace.d.ts.map +1 -1
  236. package/dist/src/usage/usage-tracker.d.ts +5 -0
  237. package/dist/src/usage/usage-tracker.d.ts.map +1 -1
  238. package/dist/src/usage/usage-tracker.js +35 -8
  239. package/dist/src/usage/usage-tracker.js.map +1 -1
  240. package/package.json +3 -4
  241. package/src/agent.ts +162 -40
  242. package/src/api/mcp-server-core.ts +1 -1
  243. package/src/api/server.ts +4 -1
  244. package/src/api/types.ts +1 -1
  245. package/src/branch-names.ts +19 -0
  246. package/src/closest-names.ts +94 -0
  247. package/src/code-execution/py-runner.ts +200 -76
  248. package/src/code-execution/runtime-py.ts +49 -3
  249. package/src/code-execution/tool-definition.ts +28 -4
  250. package/src/config-checks.ts +48 -0
  251. package/src/deadline-timer.ts +44 -0
  252. package/src/error-message.ts +48 -0
  253. package/src/framework.ts +5352 -1388
  254. package/src/gate/event-gate.ts +28 -3
  255. package/src/index.ts +11 -2
  256. package/src/mcpl/channel-registry.ts +517 -286
  257. package/src/mcpl/checkpoint-manager.ts +104 -29
  258. package/src/mcpl/conversation-router.ts +28 -8
  259. package/src/mcpl/convert-block.ts +97 -0
  260. package/src/mcpl/errors.ts +28 -0
  261. package/src/mcpl/hook-orchestrator.ts +84 -77
  262. package/src/mcpl/inbound-source.ts +156 -0
  263. package/src/mcpl/index.ts +10 -1
  264. package/src/mcpl/inference-router.ts +174 -99
  265. package/src/mcpl/push-coalescer.ts +60 -24
  266. package/src/mcpl/push-handler.ts +20 -90
  267. package/src/mcpl/reference-fetcher.ts +71 -26
  268. package/src/mcpl/references.ts +81 -22
  269. package/src/mcpl/server-connection.ts +427 -132
  270. package/src/mcpl/server-registry.ts +15 -4
  271. package/src/mcpl/skip-reply-wake.ts +73 -0
  272. package/src/mcpl/transport.ts +120 -18
  273. package/src/mcpl/types.ts +14 -3
  274. package/src/mcpl/visible-content.ts +27 -0
  275. package/src/module-registry.ts +58 -23
  276. package/src/modules/api/index.ts +1 -1
  277. package/src/modules/discord/discord-js-client.ts +26 -10
  278. package/src/modules/discord/index.ts +391 -158
  279. package/src/modules/discord/types.ts +15 -2
  280. package/src/modules/health/index.ts +2 -1
  281. package/src/modules/history/index.ts +410 -120
  282. package/src/modules/history/semantic.ts +189 -32
  283. package/src/modules/unknown-tool.ts +16 -0
  284. package/src/modules/workspace/disk-agreement.ts +51 -3
  285. package/src/modules/workspace/effects.ts +279 -35
  286. package/src/modules/workspace/index.ts +810 -260
  287. package/src/modules/workspace/observe.ts +194 -20
  288. package/src/modules/workspace/reconcile.ts +619 -64
  289. package/src/modules/workspace/types.ts +18 -4
  290. package/src/modules/workspace/watcher.ts +27 -4
  291. package/src/prose-drafts.ts +481 -0
  292. package/src/prose-segments.ts +51 -8
  293. package/src/recovery/offline-branch.ts +4 -1
  294. package/src/safe-slice.ts +9 -1
  295. package/src/tool-image-ledger.ts +153 -34
  296. package/src/tool-presentation.ts +224 -40
  297. package/src/tool-result-guard.ts +7 -8
  298. package/src/tool-result-history.ts +124 -20
  299. package/src/tune-out/coordinator.ts +259 -65
  300. package/src/types/agent.ts +17 -7
  301. package/src/types/events.ts +17 -0
  302. package/src/types/framework.ts +21 -5
  303. package/src/types/inference-log.ts +1 -1
  304. package/src/types/module.ts +24 -4
  305. package/src/types/trace.ts +101 -6
  306. package/src/usage/usage-tracker.ts +32 -8
  307. package/dist/test/activation-request-sanitize.test.d.ts +0 -2
  308. package/dist/test/activation-request-sanitize.test.d.ts.map +0 -1
  309. package/dist/test/activation-request-sanitize.test.js +0 -89
  310. package/dist/test/activation-request-sanitize.test.js.map +0 -1
  311. package/dist/test/agent-cache-ttl.test.d.ts +0 -2
  312. package/dist/test/agent-cache-ttl.test.d.ts.map +0 -1
  313. package/dist/test/agent-cache-ttl.test.js +0 -41
  314. package/dist/test/agent-cache-ttl.test.js.map +0 -1
  315. package/dist/test/agent-runtime-settings.test.d.ts +0 -2
  316. package/dist/test/agent-runtime-settings.test.d.ts.map +0 -1
  317. package/dist/test/agent-runtime-settings.test.js +0 -1598
  318. package/dist/test/agent-runtime-settings.test.js.map +0 -1
  319. package/dist/test/api-admin-gate.test.d.ts +0 -2
  320. package/dist/test/api-admin-gate.test.d.ts.map +0 -1
  321. package/dist/test/api-admin-gate.test.js +0 -116
  322. package/dist/test/api-admin-gate.test.js.map +0 -1
  323. package/dist/test/assistant-persist-refusal.test.d.ts +0 -2
  324. package/dist/test/assistant-persist-refusal.test.d.ts.map +0 -1
  325. package/dist/test/assistant-persist-refusal.test.js +0 -63
  326. package/dist/test/assistant-persist-refusal.test.js.map +0 -1
  327. package/dist/test/batched-wake-locus.test.d.ts +0 -2
  328. package/dist/test/batched-wake-locus.test.d.ts.map +0 -1
  329. package/dist/test/batched-wake-locus.test.js +0 -166
  330. package/dist/test/batched-wake-locus.test.js.map +0 -1
  331. package/dist/test/busy-agent-scheduler.test.d.ts +0 -2
  332. package/dist/test/busy-agent-scheduler.test.d.ts.map +0 -1
  333. package/dist/test/busy-agent-scheduler.test.js +0 -92
  334. package/dist/test/busy-agent-scheduler.test.js.map +0 -1
  335. package/dist/test/channel-incoming-targeting.test.d.ts +0 -2
  336. package/dist/test/channel-incoming-targeting.test.d.ts.map +0 -1
  337. package/dist/test/channel-incoming-targeting.test.js +0 -81
  338. package/dist/test/channel-incoming-targeting.test.js.map +0 -1
  339. package/dist/test/channel-label-history.test.d.ts +0 -2
  340. package/dist/test/channel-label-history.test.d.ts.map +0 -1
  341. package/dist/test/channel-label-history.test.js +0 -424
  342. package/dist/test/channel-label-history.test.js.map +0 -1
  343. package/dist/test/channel-lifecycle-provenance.test.d.ts +0 -2
  344. package/dist/test/channel-lifecycle-provenance.test.d.ts.map +0 -1
  345. package/dist/test/channel-lifecycle-provenance.test.js +0 -47
  346. package/dist/test/channel-lifecycle-provenance.test.js.map +0 -1
  347. package/dist/test/channel-registry-routing.test.d.ts +0 -2
  348. package/dist/test/channel-registry-routing.test.d.ts.map +0 -1
  349. package/dist/test/channel-registry-routing.test.js +0 -446
  350. package/dist/test/channel-registry-routing.test.js.map +0 -1
  351. package/dist/test/channel-registry-typing.test.d.ts +0 -2
  352. package/dist/test/channel-registry-typing.test.d.ts.map +0 -1
  353. package/dist/test/channel-registry-typing.test.js +0 -91
  354. package/dist/test/channel-registry-typing.test.js.map +0 -1
  355. package/dist/test/channels-changed-respond-first.test.d.ts +0 -2
  356. package/dist/test/channels-changed-respond-first.test.d.ts.map +0 -1
  357. package/dist/test/channels-changed-respond-first.test.js +0 -74
  358. package/dist/test/channels-changed-respond-first.test.js.map +0 -1
  359. package/dist/test/checkpoint-attribution.test.d.ts +0 -2
  360. package/dist/test/checkpoint-attribution.test.d.ts.map +0 -1
  361. package/dist/test/checkpoint-attribution.test.js +0 -200
  362. package/dist/test/checkpoint-attribution.test.js.map +0 -1
  363. package/dist/test/code-execution.test.d.ts +0 -11
  364. package/dist/test/code-execution.test.d.ts.map +0 -1
  365. package/dist/test/code-execution.test.js +0 -1272
  366. package/dist/test/code-execution.test.js.map +0 -1
  367. package/dist/test/component-defaults.test.d.ts +0 -2
  368. package/dist/test/component-defaults.test.d.ts.map +0 -1
  369. package/dist/test/component-defaults.test.js +0 -54
  370. package/dist/test/component-defaults.test.js.map +0 -1
  371. package/dist/test/conversation-fork-injection-scoping.test.d.ts +0 -2
  372. package/dist/test/conversation-fork-injection-scoping.test.d.ts.map +0 -1
  373. package/dist/test/conversation-fork-injection-scoping.test.js +0 -200
  374. package/dist/test/conversation-fork-injection-scoping.test.js.map +0 -1
  375. package/dist/test/conversation-router.test.d.ts +0 -2
  376. package/dist/test/conversation-router.test.d.ts.map +0 -1
  377. package/dist/test/conversation-router.test.js +0 -174
  378. package/dist/test/conversation-router.test.js.map +0 -1
  379. package/dist/test/conversation-routing.test.d.ts +0 -7
  380. package/dist/test/conversation-routing.test.d.ts.map +0 -1
  381. package/dist/test/conversation-routing.test.js +0 -621
  382. package/dist/test/conversation-routing.test.js.map +0 -1
  383. package/dist/test/deferred-wake-integrity.test.d.ts +0 -29
  384. package/dist/test/deferred-wake-integrity.test.d.ts.map +0 -1
  385. package/dist/test/deferred-wake-integrity.test.js +0 -320
  386. package/dist/test/deferred-wake-integrity.test.js.map +0 -1
  387. package/dist/test/discord-awareness-outbox.test.d.ts +0 -2
  388. package/dist/test/discord-awareness-outbox.test.d.ts.map +0 -1
  389. package/dist/test/discord-awareness-outbox.test.js +0 -371
  390. package/dist/test/discord-awareness-outbox.test.js.map +0 -1
  391. package/dist/test/discord-history-delete-window.test.d.ts +0 -2
  392. package/dist/test/discord-history-delete-window.test.d.ts.map +0 -1
  393. package/dist/test/discord-history-delete-window.test.js +0 -81
  394. package/dist/test/discord-history-delete-window.test.js.map +0 -1
  395. package/dist/test/discord-history-sync.test.d.ts +0 -2
  396. package/dist/test/discord-history-sync.test.d.ts.map +0 -1
  397. package/dist/test/discord-history-sync.test.js +0 -56
  398. package/dist/test/discord-history-sync.test.js.map +0 -1
  399. package/dist/test/discord-typing-keepalive.test.d.ts +0 -2
  400. package/dist/test/discord-typing-keepalive.test.d.ts.map +0 -1
  401. package/dist/test/discord-typing-keepalive.test.js +0 -77
  402. package/dist/test/discord-typing-keepalive.test.js.map +0 -1
  403. package/dist/test/ephemeral-settle.test.d.ts +0 -2
  404. package/dist/test/ephemeral-settle.test.d.ts.map +0 -1
  405. package/dist/test/ephemeral-settle.test.js +0 -354
  406. package/dist/test/ephemeral-settle.test.js.map +0 -1
  407. package/dist/test/event-gate-passthrough.test.d.ts +0 -15
  408. package/dist/test/event-gate-passthrough.test.d.ts.map +0 -1
  409. package/dist/test/event-gate-passthrough.test.js +0 -289
  410. package/dist/test/event-gate-passthrough.test.js.map +0 -1
  411. package/dist/test/event-gate-policy-mutation.test.d.ts +0 -2
  412. package/dist/test/event-gate-policy-mutation.test.d.ts.map +0 -1
  413. package/dist/test/event-gate-policy-mutation.test.js +0 -137
  414. package/dist/test/event-gate-policy-mutation.test.js.map +0 -1
  415. package/dist/test/event-gate-rate-limit.test.d.ts +0 -2
  416. package/dist/test/event-gate-rate-limit.test.d.ts.map +0 -1
  417. package/dist/test/event-gate-rate-limit.test.js +0 -627
  418. package/dist/test/event-gate-rate-limit.test.js.map +0 -1
  419. package/dist/test/event-gate-script.test.d.ts +0 -2
  420. package/dist/test/event-gate-script.test.d.ts.map +0 -1
  421. package/dist/test/event-gate-script.test.js +0 -95
  422. package/dist/test/event-gate-script.test.js.map +0 -1
  423. package/dist/test/event-gate-selfwake.test.d.ts +0 -15
  424. package/dist/test/event-gate-selfwake.test.d.ts.map +0 -1
  425. package/dist/test/event-gate-selfwake.test.js +0 -125
  426. package/dist/test/event-gate-selfwake.test.js.map +0 -1
  427. package/dist/test/event-gate-tags.test.d.ts +0 -2
  428. package/dist/test/event-gate-tags.test.d.ts.map +0 -1
  429. package/dist/test/event-gate-tags.test.js +0 -76
  430. package/dist/test/event-gate-tags.test.js.map +0 -1
  431. package/dist/test/event-gate.test.d.ts +0 -2
  432. package/dist/test/event-gate.test.d.ts.map +0 -1
  433. package/dist/test/event-gate.test.js +0 -919
  434. package/dist/test/event-gate.test.js.map +0 -1
  435. package/dist/test/explicit-prose-routing.test.d.ts +0 -11
  436. package/dist/test/explicit-prose-routing.test.d.ts.map +0 -1
  437. package/dist/test/explicit-prose-routing.test.js +0 -1715
  438. package/dist/test/explicit-prose-routing.test.js.map +0 -1
  439. package/dist/test/framework.test.d.ts +0 -5
  440. package/dist/test/framework.test.d.ts.map +0 -1
  441. package/dist/test/framework.test.js +0 -1048
  442. package/dist/test/framework.test.js.map +0 -1
  443. package/dist/test/gather-context-timeout.test.d.ts +0 -2
  444. package/dist/test/gather-context-timeout.test.d.ts.map +0 -1
  445. package/dist/test/gather-context-timeout.test.js +0 -120
  446. package/dist/test/gather-context-timeout.test.js.map +0 -1
  447. package/dist/test/health-snapshot.test.d.ts +0 -2
  448. package/dist/test/health-snapshot.test.d.ts.map +0 -1
  449. package/dist/test/health-snapshot.test.js +0 -74
  450. package/dist/test/health-snapshot.test.js.map +0 -1
  451. package/dist/test/helpers/coalescing-fixture.d.ts +0 -74
  452. package/dist/test/helpers/coalescing-fixture.d.ts.map +0 -1
  453. package/dist/test/helpers/coalescing-fixture.js +0 -152
  454. package/dist/test/helpers/coalescing-fixture.js.map +0 -1
  455. package/dist/test/helpers/coalescing-kill-child.d.ts +0 -2
  456. package/dist/test/helpers/coalescing-kill-child.d.ts.map +0 -1
  457. package/dist/test/helpers/coalescing-kill-child.js +0 -24
  458. package/dist/test/helpers/coalescing-kill-child.js.map +0 -1
  459. package/dist/test/helpers/mock-membrane.d.ts +0 -53
  460. package/dist/test/helpers/mock-membrane.d.ts.map +0 -1
  461. package/dist/test/helpers/mock-membrane.js +0 -168
  462. package/dist/test/helpers/mock-membrane.js.map +0 -1
  463. package/dist/test/helpers/pytc-stop-rows.d.ts +0 -11
  464. package/dist/test/helpers/pytc-stop-rows.d.ts.map +0 -1
  465. package/dist/test/helpers/pytc-stop-rows.js +0 -143
  466. package/dist/test/helpers/pytc-stop-rows.js.map +0 -1
  467. package/dist/test/helpers/quiesce-crash-child.d.ts +0 -2
  468. package/dist/test/helpers/quiesce-crash-child.d.ts.map +0 -1
  469. package/dist/test/helpers/quiesce-crash-child.js +0 -156
  470. package/dist/test/helpers/quiesce-crash-child.js.map +0 -1
  471. package/dist/test/hide-then-turn.test.d.ts +0 -2
  472. package/dist/test/hide-then-turn.test.d.ts.map +0 -1
  473. package/dist/test/hide-then-turn.test.js +0 -101
  474. package/dist/test/hide-then-turn.test.js.map +0 -1
  475. package/dist/test/history-module-overview.test.d.ts +0 -2
  476. package/dist/test/history-module-overview.test.d.ts.map +0 -1
  477. package/dist/test/history-module-overview.test.js +0 -711
  478. package/dist/test/history-module-overview.test.js.map +0 -1
  479. package/dist/test/history-module-realstore.test.d.ts +0 -2
  480. package/dist/test/history-module-realstore.test.d.ts.map +0 -1
  481. package/dist/test/history-module-realstore.test.js +0 -363
  482. package/dist/test/history-module-realstore.test.js.map +0 -1
  483. package/dist/test/history-module-semantic.test.d.ts +0 -2
  484. package/dist/test/history-module-semantic.test.d.ts.map +0 -1
  485. package/dist/test/history-module-semantic.test.js +0 -213
  486. package/dist/test/history-module-semantic.test.js.map +0 -1
  487. package/dist/test/history-module-ux.test.d.ts +0 -2
  488. package/dist/test/history-module-ux.test.d.ts.map +0 -1
  489. package/dist/test/history-module-ux.test.js +0 -304
  490. package/dist/test/history-module-ux.test.js.map +0 -1
  491. package/dist/test/history-module.test.d.ts +0 -2
  492. package/dist/test/history-module.test.d.ts.map +0 -1
  493. package/dist/test/history-module.test.js +0 -619
  494. package/dist/test/history-module.test.js.map +0 -1
  495. package/dist/test/history-semantic-review-findings.test.d.ts +0 -2
  496. package/dist/test/history-semantic-review-findings.test.d.ts.map +0 -1
  497. package/dist/test/history-semantic-review-findings.test.js +0 -338
  498. package/dist/test/history-semantic-review-findings.test.js.map +0 -1
  499. package/dist/test/history-semantic-sync-converges.test.d.ts +0 -2
  500. package/dist/test/history-semantic-sync-converges.test.d.ts.map +0 -1
  501. package/dist/test/history-semantic-sync-converges.test.js +0 -109
  502. package/dist/test/history-semantic-sync-converges.test.js.map +0 -1
  503. package/dist/test/host-quiesce.test.d.ts +0 -2
  504. package/dist/test/host-quiesce.test.d.ts.map +0 -1
  505. package/dist/test/host-quiesce.test.js +0 -988
  506. package/dist/test/host-quiesce.test.js.map +0 -1
  507. package/dist/test/inference-exhaustion-rewind.test.d.ts +0 -2
  508. package/dist/test/inference-exhaustion-rewind.test.d.ts.map +0 -1
  509. package/dist/test/inference-exhaustion-rewind.test.js +0 -387
  510. package/dist/test/inference-exhaustion-rewind.test.js.map +0 -1
  511. package/dist/test/inference-failure-bounds.test.d.ts +0 -2
  512. package/dist/test/inference-failure-bounds.test.d.ts.map +0 -1
  513. package/dist/test/inference-failure-bounds.test.js +0 -1202
  514. package/dist/test/inference-failure-bounds.test.js.map +0 -1
  515. package/dist/test/inference-failure-observability.test.d.ts +0 -2
  516. package/dist/test/inference-failure-observability.test.d.ts.map +0 -1
  517. package/dist/test/inference-failure-observability.test.js +0 -84
  518. package/dist/test/inference-failure-observability.test.js.map +0 -1
  519. package/dist/test/journal-tool.test.d.ts +0 -2
  520. package/dist/test/journal-tool.test.d.ts.map +0 -1
  521. package/dist/test/journal-tool.test.js +0 -33
  522. package/dist/test/journal-tool.test.js.map +0 -1
  523. package/dist/test/kv-unified-open-flight-retry.test.d.ts +0 -2
  524. package/dist/test/kv-unified-open-flight-retry.test.d.ts.map +0 -1
  525. package/dist/test/kv-unified-open-flight-retry.test.js +0 -189
  526. package/dist/test/kv-unified-open-flight-retry.test.js.map +0 -1
  527. package/dist/test/kv-unified-wiring.test.d.ts +0 -2
  528. package/dist/test/kv-unified-wiring.test.d.ts.map +0 -1
  529. package/dist/test/kv-unified-wiring.test.js +0 -95
  530. package/dist/test/kv-unified-wiring.test.js.map +0 -1
  531. package/dist/test/late-events-after-stop.test.d.ts +0 -2
  532. package/dist/test/late-events-after-stop.test.d.ts.map +0 -1
  533. package/dist/test/late-events-after-stop.test.js +0 -122
  534. package/dist/test/late-events-after-stop.test.js.map +0 -1
  535. package/dist/test/liveness-watchdog.test.d.ts +0 -2
  536. package/dist/test/liveness-watchdog.test.d.ts.map +0 -1
  537. package/dist/test/liveness-watchdog.test.js +0 -94
  538. package/dist/test/liveness-watchdog.test.js.map +0 -1
  539. package/dist/test/machine-close-provenance.test.d.ts +0 -2
  540. package/dist/test/machine-close-provenance.test.d.ts.map +0 -1
  541. package/dist/test/machine-close-provenance.test.js +0 -116
  542. package/dist/test/machine-close-provenance.test.js.map +0 -1
  543. package/dist/test/maintenance-timer.test.d.ts +0 -2
  544. package/dist/test/maintenance-timer.test.d.ts.map +0 -1
  545. package/dist/test/maintenance-timer.test.js +0 -1827
  546. package/dist/test/maintenance-timer.test.js.map +0 -1
  547. package/dist/test/mcp-server-bin.test.d.ts +0 -2
  548. package/dist/test/mcp-server-bin.test.d.ts.map +0 -1
  549. package/dist/test/mcp-server-bin.test.js +0 -142
  550. package/dist/test/mcp-server-bin.test.js.map +0 -1
  551. package/dist/test/mcpl-access-provider.test.d.ts +0 -2
  552. package/dist/test/mcpl-access-provider.test.d.ts.map +0 -1
  553. package/dist/test/mcpl-access-provider.test.js +0 -20
  554. package/dist/test/mcpl-access-provider.test.js.map +0 -1
  555. package/dist/test/mcpl-awareness-barrier.test.d.ts +0 -2
  556. package/dist/test/mcpl-awareness-barrier.test.d.ts.map +0 -1
  557. package/dist/test/mcpl-awareness-barrier.test.js +0 -769
  558. package/dist/test/mcpl-awareness-barrier.test.js.map +0 -1
  559. package/dist/test/mcpl-capability-grant.test.d.ts +0 -10
  560. package/dist/test/mcpl-capability-grant.test.d.ts.map +0 -1
  561. package/dist/test/mcpl-capability-grant.test.js +0 -111
  562. package/dist/test/mcpl-capability-grant.test.js.map +0 -1
  563. package/dist/test/mcpl-capability-scoping.test.d.ts +0 -2
  564. package/dist/test/mcpl-capability-scoping.test.d.ts.map +0 -1
  565. package/dist/test/mcpl-capability-scoping.test.js +0 -266
  566. package/dist/test/mcpl-capability-scoping.test.js.map +0 -1
  567. package/dist/test/mcpl-child-env.test.d.ts +0 -2
  568. package/dist/test/mcpl-child-env.test.d.ts.map +0 -1
  569. package/dist/test/mcpl-child-env.test.js +0 -158
  570. package/dist/test/mcpl-child-env.test.js.map +0 -1
  571. package/dist/test/mcpl-coalesced-content-parity.test.d.ts +0 -2
  572. package/dist/test/mcpl-coalesced-content-parity.test.d.ts.map +0 -1
  573. package/dist/test/mcpl-coalesced-content-parity.test.js +0 -532
  574. package/dist/test/mcpl-coalesced-content-parity.test.js.map +0 -1
  575. package/dist/test/mcpl-coalescing.test.d.ts +0 -2
  576. package/dist/test/mcpl-coalescing.test.d.ts.map +0 -1
  577. package/dist/test/mcpl-coalescing.test.js +0 -1125
  578. package/dist/test/mcpl-coalescing.test.js.map +0 -1
  579. package/dist/test/mcpl-config-diagnostics.test.d.ts +0 -2
  580. package/dist/test/mcpl-config-diagnostics.test.d.ts.map +0 -1
  581. package/dist/test/mcpl-config-diagnostics.test.js +0 -452
  582. package/dist/test/mcpl-config-diagnostics.test.js.map +0 -1
  583. package/dist/test/mcpl-empty-content.test.d.ts +0 -2
  584. package/dist/test/mcpl-empty-content.test.d.ts.map +0 -1
  585. package/dist/test/mcpl-empty-content.test.js +0 -368
  586. package/dist/test/mcpl-empty-content.test.js.map +0 -1
  587. package/dist/test/mcpl-gate-roundtrip.test.d.ts +0 -2
  588. package/dist/test/mcpl-gate-roundtrip.test.d.ts.map +0 -1
  589. package/dist/test/mcpl-gate-roundtrip.test.js +0 -285
  590. package/dist/test/mcpl-gate-roundtrip.test.js.map +0 -1
  591. package/dist/test/mcpl-list-status.test.d.ts +0 -2
  592. package/dist/test/mcpl-list-status.test.d.ts.map +0 -1
  593. package/dist/test/mcpl-list-status.test.js +0 -82
  594. package/dist/test/mcpl-list-status.test.js.map +0 -1
  595. package/dist/test/mcpl-manifest-changed.test.d.ts +0 -2
  596. package/dist/test/mcpl-manifest-changed.test.d.ts.map +0 -1
  597. package/dist/test/mcpl-manifest-changed.test.js +0 -178
  598. package/dist/test/mcpl-manifest-changed.test.js.map +0 -1
  599. package/dist/test/mcpl-push-convert.test.d.ts +0 -2
  600. package/dist/test/mcpl-push-convert.test.d.ts.map +0 -1
  601. package/dist/test/mcpl-push-convert.test.js +0 -42
  602. package/dist/test/mcpl-push-convert.test.js.map +0 -1
  603. package/dist/test/mcpl-reconnect-events.test.d.ts +0 -2
  604. package/dist/test/mcpl-reconnect-events.test.d.ts.map +0 -1
  605. package/dist/test/mcpl-reconnect-events.test.js +0 -144
  606. package/dist/test/mcpl-reconnect-events.test.js.map +0 -1
  607. package/dist/test/mcpl-reconnect-reregistration.test.d.ts +0 -2
  608. package/dist/test/mcpl-reconnect-reregistration.test.d.ts.map +0 -1
  609. package/dist/test/mcpl-reconnect-reregistration.test.js +0 -238
  610. package/dist/test/mcpl-reconnect-reregistration.test.js.map +0 -1
  611. package/dist/test/mcpl-reference-fetcher.test.d.ts +0 -2
  612. package/dist/test/mcpl-reference-fetcher.test.d.ts.map +0 -1
  613. package/dist/test/mcpl-reference-fetcher.test.js +0 -427
  614. package/dist/test/mcpl-reference-fetcher.test.js.map +0 -1
  615. package/dist/test/mcpl-reference-fields.test.d.ts +0 -2
  616. package/dist/test/mcpl-reference-fields.test.d.ts.map +0 -1
  617. package/dist/test/mcpl-reference-fields.test.js +0 -149
  618. package/dist/test/mcpl-reference-fields.test.js.map +0 -1
  619. package/dist/test/mcpl-rejection-log-lines.test.d.ts +0 -2
  620. package/dist/test/mcpl-rejection-log-lines.test.d.ts.map +0 -1
  621. package/dist/test/mcpl-rejection-log-lines.test.js +0 -349
  622. package/dist/test/mcpl-rejection-log-lines.test.js.map +0 -1
  623. package/dist/test/mcpl-request-timeout.test.d.ts +0 -2
  624. package/dist/test/mcpl-request-timeout.test.d.ts.map +0 -1
  625. package/dist/test/mcpl-request-timeout.test.js +0 -138
  626. package/dist/test/mcpl-request-timeout.test.js.map +0 -1
  627. package/dist/test/mcpl-runtime-lifecycle.test.d.ts +0 -7
  628. package/dist/test/mcpl-runtime-lifecycle.test.d.ts.map +0 -1
  629. package/dist/test/mcpl-runtime-lifecycle.test.js +0 -142
  630. package/dist/test/mcpl-runtime-lifecycle.test.js.map +0 -1
  631. package/dist/test/mcpl-stderr-tail.test.d.ts +0 -2
  632. package/dist/test/mcpl-stderr-tail.test.d.ts.map +0 -1
  633. package/dist/test/mcpl-stderr-tail.test.js +0 -210
  634. package/dist/test/mcpl-stderr-tail.test.js.map +0 -1
  635. package/dist/test/mcpl-tool-class-listing.test.d.ts +0 -2
  636. package/dist/test/mcpl-tool-class-listing.test.d.ts.map +0 -1
  637. package/dist/test/mcpl-tool-class-listing.test.js +0 -147
  638. package/dist/test/mcpl-tool-class-listing.test.js.map +0 -1
  639. package/dist/test/mcpl-tool-classes.test.d.ts +0 -7
  640. package/dist/test/mcpl-tool-classes.test.d.ts.map +0 -1
  641. package/dist/test/mcpl-tool-classes.test.js +0 -80
  642. package/dist/test/mcpl-tool-classes.test.js.map +0 -1
  643. package/dist/test/mcpl-tool-lifecycle-e2e.test.d.ts +0 -2
  644. package/dist/test/mcpl-tool-lifecycle-e2e.test.d.ts.map +0 -1
  645. package/dist/test/mcpl-tool-lifecycle-e2e.test.js +0 -237
  646. package/dist/test/mcpl-tool-lifecycle-e2e.test.js.map +0 -1
  647. package/dist/test/mcpl-tool-lifecycle-emitter.test.d.ts +0 -11
  648. package/dist/test/mcpl-tool-lifecycle-emitter.test.d.ts.map +0 -1
  649. package/dist/test/mcpl-tool-lifecycle-emitter.test.js +0 -412
  650. package/dist/test/mcpl-tool-lifecycle-emitter.test.js.map +0 -1
  651. package/dist/test/mcpl-tool-lifecycle-script.test.d.ts +0 -2
  652. package/dist/test/mcpl-tool-lifecycle-script.test.d.ts.map +0 -1
  653. package/dist/test/mcpl-tool-lifecycle-script.test.js +0 -288
  654. package/dist/test/mcpl-tool-lifecycle-script.test.js.map +0 -1
  655. package/dist/test/mcpl-tool-lifecycle.test.d.ts +0 -11
  656. package/dist/test/mcpl-tool-lifecycle.test.d.ts.map +0 -1
  657. package/dist/test/mcpl-tool-lifecycle.test.js +0 -270
  658. package/dist/test/mcpl-tool-lifecycle.test.js.map +0 -1
  659. package/dist/test/mcpl-transport-close.test.d.ts +0 -2
  660. package/dist/test/mcpl-transport-close.test.d.ts.map +0 -1
  661. package/dist/test/mcpl-transport-close.test.js +0 -373
  662. package/dist/test/mcpl-transport-close.test.js.map +0 -1
  663. package/dist/test/mcpl-transport-spawn.test.d.ts +0 -2
  664. package/dist/test/mcpl-transport-spawn.test.d.ts.map +0 -1
  665. package/dist/test/mcpl-transport-spawn.test.js +0 -58
  666. package/dist/test/mcpl-transport-spawn.test.js.map +0 -1
  667. package/dist/test/mcpl-ws-transport.test.d.ts +0 -2
  668. package/dist/test/mcpl-ws-transport.test.d.ts.map +0 -1
  669. package/dist/test/mcpl-ws-transport.test.js +0 -259
  670. package/dist/test/mcpl-ws-transport.test.js.map +0 -1
  671. package/dist/test/module-context-integration.test.d.ts +0 -18
  672. package/dist/test/module-context-integration.test.d.ts.map +0 -1
  673. package/dist/test/module-context-integration.test.js +0 -181
  674. package/dist/test/module-context-integration.test.js.map +0 -1
  675. package/dist/test/offline-recovery-branch.test.d.ts +0 -2
  676. package/dist/test/offline-recovery-branch.test.d.ts.map +0 -1
  677. package/dist/test/offline-recovery-branch.test.js +0 -570
  678. package/dist/test/offline-recovery-branch.test.js.map +0 -1
  679. package/dist/test/operator-surgery.test.d.ts +0 -2
  680. package/dist/test/operator-surgery.test.d.ts.map +0 -1
  681. package/dist/test/operator-surgery.test.js +0 -595
  682. package/dist/test/operator-surgery.test.js.map +0 -1
  683. package/dist/test/ops-alert.test.d.ts +0 -2
  684. package/dist/test/ops-alert.test.d.ts.map +0 -1
  685. package/dist/test/ops-alert.test.js +0 -153
  686. package/dist/test/ops-alert.test.js.map +0 -1
  687. package/dist/test/overbudget-drain-breaker.test.d.ts +0 -2
  688. package/dist/test/overbudget-drain-breaker.test.d.ts.map +0 -1
  689. package/dist/test/overbudget-drain-breaker.test.js +0 -198
  690. package/dist/test/overbudget-drain-breaker.test.js.map +0 -1
  691. package/dist/test/pack-installs-alone.test.d.ts +0 -2
  692. package/dist/test/pack-installs-alone.test.d.ts.map +0 -1
  693. package/dist/test/pack-installs-alone.test.js +0 -284
  694. package/dist/test/pack-installs-alone.test.js.map +0 -1
  695. package/dist/test/per-agent-delivery.test.d.ts +0 -2
  696. package/dist/test/per-agent-delivery.test.d.ts.map +0 -1
  697. package/dist/test/per-agent-delivery.test.js +0 -108
  698. package/dist/test/per-agent-delivery.test.js.map +0 -1
  699. package/dist/test/physical-window-restart.test.d.ts +0 -16
  700. package/dist/test/physical-window-restart.test.d.ts.map +0 -1
  701. package/dist/test/physical-window-restart.test.js +0 -487
  702. package/dist/test/physical-window-restart.test.js.map +0 -1
  703. package/dist/test/placed-reaction-baseline.test.d.ts +0 -2
  704. package/dist/test/placed-reaction-baseline.test.d.ts.map +0 -1
  705. package/dist/test/placed-reaction-baseline.test.js +0 -312
  706. package/dist/test/placed-reaction-baseline.test.js.map +0 -1
  707. package/dist/test/present-while-acting.test.d.ts +0 -19
  708. package/dist/test/present-while-acting.test.d.ts.map +0 -1
  709. package/dist/test/present-while-acting.test.js +0 -1649
  710. package/dist/test/present-while-acting.test.js.map +0 -1
  711. package/dist/test/prose-segments.test.d.ts +0 -2
  712. package/dist/test/prose-segments.test.d.ts.map +0 -1
  713. package/dist/test/prose-segments.test.js +0 -52
  714. package/dist/test/prose-segments.test.js.map +0 -1
  715. package/dist/test/prose-stream-router.test.d.ts +0 -2
  716. package/dist/test/prose-stream-router.test.d.ts.map +0 -1
  717. package/dist/test/prose-stream-router.test.js +0 -171
  718. package/dist/test/prose-stream-router.test.js.map +0 -1
  719. package/dist/test/provider-acceleration-cooldown.test.d.ts +0 -2
  720. package/dist/test/provider-acceleration-cooldown.test.d.ts.map +0 -1
  721. package/dist/test/provider-acceleration-cooldown.test.js +0 -435
  722. package/dist/test/provider-acceleration-cooldown.test.js.map +0 -1
  723. package/dist/test/provider-waits.test.d.ts +0 -2
  724. package/dist/test/provider-waits.test.d.ts.map +0 -1
  725. package/dist/test/provider-waits.test.js +0 -2259
  726. package/dist/test/provider-waits.test.js.map +0 -1
  727. package/dist/test/puppet-tool-call.test.d.ts +0 -2
  728. package/dist/test/puppet-tool-call.test.d.ts.map +0 -1
  729. package/dist/test/puppet-tool-call.test.js +0 -226
  730. package/dist/test/puppet-tool-call.test.js.map +0 -1
  731. package/dist/test/puppet-turn-reservation.test.d.ts +0 -2
  732. package/dist/test/puppet-turn-reservation.test.d.ts.map +0 -1
  733. package/dist/test/puppet-turn-reservation.test.js +0 -139
  734. package/dist/test/puppet-turn-reservation.test.js.map +0 -1
  735. package/dist/test/reaction-baseline-platform.test.d.ts +0 -2
  736. package/dist/test/reaction-baseline-platform.test.d.ts.map +0 -1
  737. package/dist/test/reaction-baseline-platform.test.js +0 -124
  738. package/dist/test/reaction-baseline-platform.test.js.map +0 -1
  739. package/dist/test/record-journal.test.d.ts +0 -6
  740. package/dist/test/record-journal.test.d.ts.map +0 -1
  741. package/dist/test/record-journal.test.js +0 -269
  742. package/dist/test/record-journal.test.js.map +0 -1
  743. package/dist/test/refusal-reaction-baseline.test.d.ts +0 -2
  744. package/dist/test/refusal-reaction-baseline.test.d.ts.map +0 -1
  745. package/dist/test/refusal-reaction-baseline.test.js +0 -81
  746. package/dist/test/refusal-reaction-baseline.test.js.map +0 -1
  747. package/dist/test/refusal-rewind.test.d.ts +0 -2
  748. package/dist/test/refusal-rewind.test.d.ts.map +0 -1
  749. package/dist/test/refusal-rewind.test.js +0 -117
  750. package/dist/test/refusal-rewind.test.js.map +0 -1
  751. package/dist/test/refusal-single-call.test.d.ts +0 -2
  752. package/dist/test/refusal-single-call.test.d.ts.map +0 -1
  753. package/dist/test/refusal-single-call.test.js +0 -177
  754. package/dist/test/refusal-single-call.test.js.map +0 -1
  755. package/dist/test/release-bump.test.d.ts +0 -2
  756. package/dist/test/release-bump.test.d.ts.map +0 -1
  757. package/dist/test/release-bump.test.js +0 -248
  758. package/dist/test/release-bump.test.js.map +0 -1
  759. package/dist/test/release-changelog.test.d.ts +0 -2
  760. package/dist/test/release-changelog.test.d.ts.map +0 -1
  761. package/dist/test/release-changelog.test.js +0 -159
  762. package/dist/test/release-changelog.test.js.map +0 -1
  763. package/dist/test/release-holds.test.d.ts +0 -2
  764. package/dist/test/release-holds.test.d.ts.map +0 -1
  765. package/dist/test/release-holds.test.js +0 -456
  766. package/dist/test/release-holds.test.js.map +0 -1
  767. package/dist/test/same-round-think-policy.test.d.ts +0 -2
  768. package/dist/test/same-round-think-policy.test.d.ts.map +0 -1
  769. package/dist/test/same-round-think-policy.test.js +0 -853
  770. package/dist/test/same-round-think-policy.test.js.map +0 -1
  771. package/dist/test/save-recent-image.test.d.ts +0 -26
  772. package/dist/test/save-recent-image.test.d.ts.map +0 -1
  773. package/dist/test/save-recent-image.test.js +0 -974
  774. package/dist/test/save-recent-image.test.js.map +0 -1
  775. package/dist/test/shutdown-errors.test.d.ts +0 -2
  776. package/dist/test/shutdown-errors.test.d.ts.map +0 -1
  777. package/dist/test/shutdown-errors.test.js +0 -662
  778. package/dist/test/shutdown-errors.test.js.map +0 -1
  779. package/dist/test/silent-heartbeat-rows.test.d.ts +0 -2
  780. package/dist/test/silent-heartbeat-rows.test.d.ts.map +0 -1
  781. package/dist/test/silent-heartbeat-rows.test.js +0 -451
  782. package/dist/test/silent-heartbeat-rows.test.js.map +0 -1
  783. package/dist/test/silent-heartbeat.test.d.ts +0 -2
  784. package/dist/test/silent-heartbeat.test.d.ts.map +0 -1
  785. package/dist/test/silent-heartbeat.test.js +0 -165
  786. package/dist/test/silent-heartbeat.test.js.map +0 -1
  787. package/dist/test/state-scaling-e2e.test.d.ts +0 -22
  788. package/dist/test/state-scaling-e2e.test.d.ts.map +0 -1
  789. package/dist/test/state-scaling-e2e.test.js +0 -206
  790. package/dist/test/state-scaling-e2e.test.js.map +0 -1
  791. package/dist/test/state-scaling.test.d.ts +0 -12
  792. package/dist/test/state-scaling.test.d.ts.map +0 -1
  793. package/dist/test/state-scaling.test.js +0 -251
  794. package/dist/test/state-scaling.test.js.map +0 -1
  795. package/dist/test/stop-with-host-operations.test.d.ts +0 -20
  796. package/dist/test/stop-with-host-operations.test.d.ts.map +0 -1
  797. package/dist/test/stop-with-host-operations.test.js +0 -1174
  798. package/dist/test/stop-with-host-operations.test.js.map +0 -1
  799. package/dist/test/stop-with-work-in-flight.test.d.ts +0 -23
  800. package/dist/test/stop-with-work-in-flight.test.d.ts.map +0 -1
  801. package/dist/test/stop-with-work-in-flight.test.js +0 -784
  802. package/dist/test/stop-with-work-in-flight.test.js.map +0 -1
  803. package/dist/test/surgery-marks-receipt.test.d.ts +0 -2
  804. package/dist/test/surgery-marks-receipt.test.d.ts.map +0 -1
  805. package/dist/test/surgery-marks-receipt.test.js +0 -540
  806. package/dist/test/surgery-marks-receipt.test.js.map +0 -1
  807. package/dist/test/thinking-token-stamp.test.d.ts +0 -12
  808. package/dist/test/thinking-token-stamp.test.d.ts.map +0 -1
  809. package/dist/test/thinking-token-stamp.test.js +0 -129
  810. package/dist/test/thinking-token-stamp.test.js.map +0 -1
  811. package/dist/test/timezone.test.d.ts +0 -2
  812. package/dist/test/timezone.test.d.ts.map +0 -1
  813. package/dist/test/timezone.test.js +0 -18
  814. package/dist/test/timezone.test.js.map +0 -1
  815. package/dist/test/tool-batch-hook.test.d.ts +0 -8
  816. package/dist/test/tool-batch-hook.test.d.ts.map +0 -1
  817. package/dist/test/tool-batch-hook.test.js +0 -275
  818. package/dist/test/tool-batch-hook.test.js.map +0 -1
  819. package/dist/test/tool-policy.test.d.ts +0 -2
  820. package/dist/test/tool-policy.test.d.ts.map +0 -1
  821. package/dist/test/tool-policy.test.js +0 -51
  822. package/dist/test/tool-policy.test.js.map +0 -1
  823. package/dist/test/tool-presentation.test.d.ts +0 -2
  824. package/dist/test/tool-presentation.test.d.ts.map +0 -1
  825. package/dist/test/tool-presentation.test.js +0 -268
  826. package/dist/test/tool-presentation.test.js.map +0 -1
  827. package/dist/test/tool-result-content.test.d.ts +0 -2
  828. package/dist/test/tool-result-content.test.d.ts.map +0 -1
  829. package/dist/test/tool-result-content.test.js +0 -37
  830. package/dist/test/tool-result-content.test.js.map +0 -1
  831. package/dist/test/tool-result-guard.test.d.ts +0 -2
  832. package/dist/test/tool-result-guard.test.d.ts.map +0 -1
  833. package/dist/test/tool-result-guard.test.js +0 -3729
  834. package/dist/test/tool-result-guard.test.js.map +0 -1
  835. package/dist/test/tool-result-history.test.d.ts +0 -7
  836. package/dist/test/tool-result-history.test.d.ts.map +0 -1
  837. package/dist/test/tool-result-history.test.js +0 -156
  838. package/dist/test/tool-result-history.test.js.map +0 -1
  839. package/dist/test/tool-result-spill.test.d.ts +0 -13
  840. package/dist/test/tool-result-spill.test.d.ts.map +0 -1
  841. package/dist/test/tool-result-spill.test.js +0 -586
  842. package/dist/test/tool-result-spill.test.js.map +0 -1
  843. package/dist/test/tool-wrapper-prose-guard-integration.test.d.ts +0 -2
  844. package/dist/test/tool-wrapper-prose-guard-integration.test.d.ts.map +0 -1
  845. package/dist/test/tool-wrapper-prose-guard-integration.test.js +0 -485
  846. package/dist/test/tool-wrapper-prose-guard-integration.test.js.map +0 -1
  847. package/dist/test/tool-wrapper-prose-guard.test.d.ts +0 -2
  848. package/dist/test/tool-wrapper-prose-guard.test.d.ts.map +0 -1
  849. package/dist/test/tool-wrapper-prose-guard.test.js +0 -34
  850. package/dist/test/tool-wrapper-prose-guard.test.js.map +0 -1
  851. package/dist/test/tools-observe-parser-conformance.test.d.ts +0 -2
  852. package/dist/test/tools-observe-parser-conformance.test.d.ts.map +0 -1
  853. package/dist/test/tools-observe-parser-conformance.test.js +0 -129
  854. package/dist/test/tools-observe-parser-conformance.test.js.map +0 -1
  855. package/dist/test/trunk-channel-routing.test.d.ts +0 -19
  856. package/dist/test/trunk-channel-routing.test.d.ts.map +0 -1
  857. package/dist/test/trunk-channel-routing.test.js +0 -652
  858. package/dist/test/trunk-channel-routing.test.js.map +0 -1
  859. package/dist/test/tune-out-e2e.test.d.ts +0 -2
  860. package/dist/test/tune-out-e2e.test.d.ts.map +0 -1
  861. package/dist/test/tune-out-e2e.test.js +0 -142
  862. package/dist/test/tune-out-e2e.test.js.map +0 -1
  863. package/dist/test/tune-out-gate-composition.test.d.ts +0 -2
  864. package/dist/test/tune-out-gate-composition.test.d.ts.map +0 -1
  865. package/dist/test/tune-out-gate-composition.test.js +0 -221
  866. package/dist/test/tune-out-gate-composition.test.js.map +0 -1
  867. package/dist/test/tune-out-lifecycle.test.d.ts +0 -2
  868. package/dist/test/tune-out-lifecycle.test.d.ts.map +0 -1
  869. package/dist/test/tune-out-lifecycle.test.js +0 -121
  870. package/dist/test/tune-out-lifecycle.test.js.map +0 -1
  871. package/dist/test/turn-trigger-provenance.test.d.ts +0 -2
  872. package/dist/test/turn-trigger-provenance.test.d.ts.map +0 -1
  873. package/dist/test/turn-trigger-provenance.test.js +0 -137
  874. package/dist/test/turn-trigger-provenance.test.js.map +0 -1
  875. package/dist/test/unconvertible-tool-result.test.d.ts +0 -2
  876. package/dist/test/unconvertible-tool-result.test.d.ts.map +0 -1
  877. package/dist/test/unconvertible-tool-result.test.js +0 -358
  878. package/dist/test/unconvertible-tool-result.test.js.map +0 -1
  879. package/dist/test/unsent-compiles.test.d.ts +0 -2
  880. package/dist/test/unsent-compiles.test.d.ts.map +0 -1
  881. package/dist/test/unsent-compiles.test.js +0 -139
  882. package/dist/test/unsent-compiles.test.js.map +0 -1
  883. package/dist/test/usage-accounting.test.d.ts +0 -2
  884. package/dist/test/usage-accounting.test.d.ts.map +0 -1
  885. package/dist/test/usage-accounting.test.js +0 -13
  886. package/dist/test/usage-accounting.test.js.map +0 -1
  887. package/dist/test/usage-tracker.test.d.ts +0 -2
  888. package/dist/test/usage-tracker.test.d.ts.map +0 -1
  889. package/dist/test/usage-tracker.test.js +0 -129
  890. package/dist/test/usage-tracker.test.js.map +0 -1
  891. package/dist/test/utils-surface.test.d.ts +0 -2
  892. package/dist/test/utils-surface.test.d.ts.map +0 -1
  893. package/dist/test/utils-surface.test.js +0 -145
  894. package/dist/test/utils-surface.test.js.map +0 -1
  895. package/dist/test/workspace-branch-continuation.test.d.ts +0 -15
  896. package/dist/test/workspace-branch-continuation.test.d.ts.map +0 -1
  897. package/dist/test/workspace-branch-continuation.test.js +0 -183
  898. package/dist/test/workspace-branch-continuation.test.js.map +0 -1
  899. package/dist/test/workspace-materialize-freshness.test.d.ts +0 -16
  900. package/dist/test/workspace-materialize-freshness.test.d.ts.map +0 -1
  901. package/dist/test/workspace-materialize-freshness.test.js +0 -252
  902. package/dist/test/workspace-materialize-freshness.test.js.map +0 -1
  903. package/dist/test/workspace-path-containment.test.d.ts +0 -19
  904. package/dist/test/workspace-path-containment.test.d.ts.map +0 -1
  905. package/dist/test/workspace-path-containment.test.js +0 -91
  906. package/dist/test/workspace-path-containment.test.js.map +0 -1
  907. package/dist/test/workspace-read-file-from-disk.test.d.ts +0 -17
  908. package/dist/test/workspace-read-file-from-disk.test.d.ts.map +0 -1
  909. package/dist/test/workspace-read-file-from-disk.test.js +0 -174
  910. package/dist/test/workspace-read-file-from-disk.test.js.map +0 -1
  911. package/dist/test/workspace-read-image.test.d.ts +0 -2
  912. package/dist/test/workspace-read-image.test.d.ts.map +0 -1
  913. package/dist/test/workspace-read-image.test.js +0 -597
  914. package/dist/test/workspace-read-image.test.js.map +0 -1
  915. package/dist/test/workspace-read-text.test.d.ts +0 -2
  916. package/dist/test/workspace-read-text.test.d.ts.map +0 -1
  917. package/dist/test/workspace-read-text.test.js +0 -101
  918. package/dist/test/workspace-read-text.test.js.map +0 -1
  919. package/dist/test/workspace-restore-order.test.d.ts +0 -16
  920. package/dist/test/workspace-restore-order.test.d.ts.map +0 -1
  921. package/dist/test/workspace-restore-order.test.js +0 -140
  922. package/dist/test/workspace-restore-order.test.js.map +0 -1
  923. package/dist/test/workspace-three-way.test.d.ts +0 -12
  924. package/dist/test/workspace-three-way.test.d.ts.map +0 -1
  925. package/dist/test/workspace-three-way.test.js +0 -4094
  926. package/dist/test/workspace-three-way.test.js.map +0 -1
  927. package/dist/test/workspace-watcher.test.d.ts +0 -2
  928. package/dist/test/workspace-watcher.test.d.ts.map +0 -1
  929. package/dist/test/workspace-watcher.test.js +0 -281
  930. package/dist/test/workspace-watcher.test.js.map +0 -1
  931. package/dist/test/xml-round-persist.test.d.ts +0 -19
  932. package/dist/test/xml-round-persist.test.d.ts.map +0 -1
  933. package/dist/test/xml-round-persist.test.js +0 -235
  934. package/dist/test/xml-round-persist.test.js.map +0 -1
  935. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -1,769 +0,0 @@
1
- import { test } from 'node:test';
2
- import assert from 'node:assert/strict';
3
- import { fileURLToPath } from 'node:url';
4
- import { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync, } from 'node:fs';
5
- import { join } from 'node:path';
6
- import { EventEmitter } from 'node:events';
7
- import { AgentFramework } from '../src/framework.js';
8
- import { McplServerConnection } from '../src/mcpl/server-connection.js';
9
- import { CapabilityGrant } from '../src/mcpl/capability-grant.js';
10
- import { DiscordAwarenessOutbox } from '../src/recovery/discord-awareness-outbox.js';
11
- import { MockMembrane } from './helpers/mock-membrane.js';
12
- const FIXTURE = fileURLToPath(new URL('./fixtures/awareness-barrier-mcpl-server.mjs', import.meta.url));
13
- const TEST_ROOT = join(process.cwd(), '.test-tmp');
14
- function records(path) {
15
- try {
16
- return readFileSync(path, 'utf8')
17
- .split('\n')
18
- .filter(Boolean)
19
- .map((line) => JSON.parse(line));
20
- }
21
- catch {
22
- return [];
23
- }
24
- }
25
- async function waitFor(description, predicate, timeoutMs = 3_000) {
26
- const deadline = Date.now() + timeoutMs;
27
- while (Date.now() < deadline) {
28
- if (predicate())
29
- return;
30
- await new Promise((resolve) => setTimeout(resolve, 10));
31
- }
32
- assert.fail(`timed out waiting for ${description}`);
33
- }
34
- function preparePending(outboxPath) {
35
- const outbox = new DiscordAwarenessOutbox(outboxPath);
36
- const batch = outbox.prepare({
37
- agentName: 'assistant',
38
- sourceBranch: 'source',
39
- targetBranch: 'main',
40
- activationPolicy: 'explicit',
41
- refs: [{ serverId: 'discord', channelId: 'discord:guild:startup', messageId: 'message-1' }],
42
- });
43
- assert.ok(batch);
44
- outbox.activate(batch.id);
45
- return outbox;
46
- }
47
- function frameworkConfig(dir, extraEnv = {}, requestTimeoutMs = 1_000, serverOverrides = {}, awarenessDeadlineMs = 1_000) {
48
- const outboxPath = join(dir, 'awareness.json');
49
- return {
50
- outboxPath,
51
- config: {
52
- storePath: join(dir, 'store'),
53
- discordAwarenessOutboxPath: outboxPath,
54
- discordAwarenessDeadlineMs: awarenessDeadlineMs,
55
- membrane: new MockMembrane().asMembrane(),
56
- agents: [{ name: 'assistant', model: 'test', systemPrompt: 'test' }],
57
- modules: [],
58
- mcplServers: [{
59
- id: 'discord',
60
- command: process.execPath,
61
- args: [FIXTURE],
62
- requestTimeoutMs,
63
- env: extraEnv,
64
- enabledFeatureSets: ['chat'],
65
- ...serverOverrides,
66
- }],
67
- },
68
- };
69
- }
70
- function twoServerFrameworkConfig(dir, order, dataMethod, runtime = false) {
71
- const outboxPath = join(dir, 'awareness.json');
72
- const statusPath = join(dir, 'status.jsonl');
73
- const releasePath = join(dir, 'release');
74
- const listChangePath = join(dir, 'list-change');
75
- const arrivalPath = join(dir, 'heartbeat-arrival');
76
- const server = (id) => ({
77
- id,
78
- command: process.execPath,
79
- args: [FIXTURE],
80
- // The host/command matrix leg models the legitimate slash-command relay:
81
- // host-owned authority is the operator's config decision (PR #79
82
- // blocker 9), so the test config makes it, exactly as the fleet's
83
- // discord config will at rollout.
84
- allowHostCommands: true,
85
- requestTimeoutMs: 0,
86
- env: {
87
- STATUS_PATH: statusPath,
88
- LEDGER_PATH: outboxPath,
89
- SERVER_ID: id,
90
- DATA_METHOD: dataMethod,
91
- ...(id === 'discord'
92
- ? { RELEASE_PATH: releasePath, WAIT_FOR_ARRIVAL_PATH: arrivalPath }
93
- : { ARRIVAL_PATH: arrivalPath }),
94
- ...(runtime && id === 'heartbeat' ? { LIST_CHANGE_PATH: listChangePath } : {}),
95
- },
96
- enabledFeatureSets: ['chat'],
97
- });
98
- const servers = order === 'heartbeat-first'
99
- ? [server('heartbeat'), server('discord')]
100
- : [server('discord'), server('heartbeat')];
101
- return {
102
- outboxPath,
103
- statusPath,
104
- releasePath,
105
- listChangePath,
106
- config: {
107
- storePath: join(dir, 'store'),
108
- discordAwarenessOutboxPath: outboxPath,
109
- discordAwarenessDeadlineMs: 1_000,
110
- membrane: new MockMembrane().asMembrane(),
111
- agents: [{ name: 'assistant', model: 'test', systemPrompt: 'test' }],
112
- modules: [],
113
- mcplServers: servers,
114
- },
115
- };
116
- }
117
- const DATA_METHODS = [
118
- 'push/event',
119
- 'inference/request',
120
- 'channels/incoming',
121
- 'host/command',
122
- ];
123
- for (const order of ['heartbeat-first', 'discord-first']) {
124
- for (const dataMethod of DATA_METHODS)
125
- test(`startup globally gates ${dataMethod} with ${order} config`, async () => {
126
- mkdirSync(TEST_ROOT, { recursive: true });
127
- const dir = mkdtempSync(join(TEST_ROOT, 'awareness-startup-'));
128
- const { outboxPath, statusPath, releasePath, config } = twoServerFrameworkConfig(dir, order, dataMethod);
129
- const outbox = preparePending(outboxPath);
130
- let framework;
131
- let createSettled = false;
132
- const creating = AgentFramework.create(config).then((created) => {
133
- framework = created;
134
- createSettled = true;
135
- return created;
136
- });
137
- try {
138
- await waitFor('registration and a second control response', () => {
139
- const events = records(statusPath)
140
- .filter((record) => record.serverId === 'discord')
141
- .map((record) => record.event);
142
- return events.includes('registration-response')
143
- && events.includes('control-response-during-barrier');
144
- });
145
- const discordOrdering = records(statusPath)
146
- .filter((record) => record.serverId === 'discord')
147
- .map((record) => record.event)
148
- .filter((event) => [
149
- 'reaction-queued-before-registration',
150
- 'registration-response',
151
- 'reaction-call',
152
- ].includes(event));
153
- assert.deepEqual(discordOrdering, [
154
- 'reaction-queued-before-registration',
155
- 'registration-response',
156
- 'reaction-call',
157
- ]);
158
- const allStatus = records(statusPath);
159
- const heartbeatArrival = allStatus.findIndex((record) => record.serverId === 'heartbeat' && record.event === 'data-request-sent');
160
- const discordDrain = allStatus.findIndex((record) => record.serverId === 'discord' && record.event === 'reaction-queued-before-registration');
161
- assert.ok(heartbeatArrival >= 0 && heartbeatArrival < discordDrain, 'non-Discord data arrives before Discord registration/drain starts');
162
- assert.equal(createSettled, false, 'framework readiness must wait for the marker outcome');
163
- assert.equal(records(statusPath).some((record) => record.serverId === 'heartbeat' && record.event === 'push-response'), false, `non-Discord ${dataMethod} must remain held while the Discord marker is pending`);
164
- assert.equal(outbox.pending('discord').length, 1);
165
- writeFileSync(releasePath, 'release');
166
- await creating;
167
- await waitFor('gated push response', () => records(statusPath).some((record) => record.serverId === 'heartbeat' && record.event === 'push-response'));
168
- const status = records(statusPath);
169
- const push = status.find((record) => record.serverId === 'heartbeat' && record.event === 'push-response');
170
- assert.equal(push?.method, dataMethod);
171
- assert.equal(push?.accepted, true);
172
- assert.equal(push?.ledgerStatus, 'applied', 'push released only after durable success');
173
- assert.equal(outbox.pending('discord').length, 0);
174
- assert.equal(status.filter((record) => record.serverId === 'discord' && record.event === 'reaction-call').length, 1);
175
- }
176
- finally {
177
- await framework?.stop();
178
- rmSync(dir, { recursive: true, force: true });
179
- }
180
- });
181
- }
182
- test('mandatory awareness deadline survives requestTimeoutMs: 0 and durably releases startup', async () => {
183
- mkdirSync(TEST_ROOT, { recursive: true });
184
- const dir = mkdtempSync(join(TEST_ROOT, 'awareness-timeout-'));
185
- const statusPath = join(dir, 'status.jsonl');
186
- const { outboxPath, config } = frameworkConfig(dir, {
187
- STATUS_PATH: statusPath,
188
- LEDGER_PATH: join(dir, 'awareness.json'),
189
- FAIL_REACTION: '1',
190
- }, 0, {}, 60);
191
- const outbox = preparePending(outboxPath);
192
- let framework;
193
- try {
194
- framework = await AgentFramework.create(config);
195
- await waitFor('push response after timeout accounting', () => records(statusPath).some((record) => record.event === 'push-response'));
196
- const entry = outbox.batches()[0].refs[0];
197
- assert.equal(entry.deliveryStatus, 'pending');
198
- assert.equal(entry.attempts, 1);
199
- assert.match(entry.lastError ?? '', /did not respond to tools\/call/);
200
- assert.match(entry.lastError ?? '', /outcome is unknown/i);
201
- assert.equal(records(statusPath).filter((record) => record.event === 'reaction-call').length, 1);
202
- const push = records(statusPath).find((record) => record.event === 'push-response');
203
- assert.equal(push?.ledgerStatus, 'pending', 'failure was durable before inference release');
204
- }
205
- finally {
206
- await framework?.stop();
207
- rmSync(dir, { recursive: true, force: true });
208
- }
209
- });
210
- test('permanent marker failure is durably accounted before startup data is released', async () => {
211
- mkdirSync(TEST_ROOT, { recursive: true });
212
- const dir = mkdtempSync(join(TEST_ROOT, 'awareness-permanent-'));
213
- const statusPath = join(dir, 'status.jsonl');
214
- const { outboxPath, config } = frameworkConfig(dir, {
215
- STATUS_PATH: statusPath,
216
- LEDGER_PATH: join(dir, 'awareness.json'),
217
- PERMANENT_REACTION: '1',
218
- });
219
- const outbox = preparePending(outboxPath);
220
- let framework;
221
- try {
222
- framework = await AgentFramework.create(config);
223
- await waitFor('data response after permanent failure accounting', () => records(statusPath).some((record) => record.event === 'push-response'));
224
- const entry = outbox.batches()[0].refs[0];
225
- assert.equal(entry.deliveryStatus, 'permanent-failure');
226
- assert.equal(entry.attempts, 1);
227
- assert.match(entry.lastError ?? '', /Unknown Message/);
228
- const response = records(statusPath).find((record) => record.event === 'push-response');
229
- assert.equal(response?.ledgerStatus, 'permanent-failure');
230
- }
231
- finally {
232
- await framework?.stop();
233
- rmSync(dir, { recursive: true, force: true });
234
- }
235
- });
236
- test('initial reconnect stub durably records unavailable work, then retries behind a fresh gate', async () => {
237
- mkdirSync(TEST_ROOT, { recursive: true });
238
- const dir = mkdtempSync(join(TEST_ROOT, 'awareness-initial-unavailable-'));
239
- const statusPath = join(dir, 'status.jsonl');
240
- const releasePath = join(dir, 'release');
241
- const generationPath = join(dir, 'generation');
242
- const { outboxPath, config } = frameworkConfig(dir, {
243
- STATUS_PATH: statusPath,
244
- LEDGER_PATH: join(dir, 'awareness.json'),
245
- RELEASE_PATH: releasePath,
246
- GENERATION_PATH: generationPath,
247
- FAIL_INITIAL_GENERATION: '1',
248
- }, 1_000, {
249
- reconnect: true,
250
- reconnectIntervalMs: 100,
251
- reconnectMaxIntervalMs: 100,
252
- });
253
- const outbox = preparePending(outboxPath);
254
- let framework;
255
- try {
256
- framework = await AgentFramework.create(config);
257
- const deferred = outbox.batches()[0].refs[0];
258
- assert.equal(deferred.deliveryStatus, 'pending');
259
- assert.equal(deferred.attempts, 1, 'ready state must include a durable unavailable attempt');
260
- assert.match(deferred.lastError ?? '', /not attempted.*connection unavailable/i);
261
- await waitFor('successful reconnect registration and awareness call', () => {
262
- const second = records(statusPath).filter((record) => record.generation === 2);
263
- return second.some((record) => record.event === 'registration-response')
264
- && second.some((record) => record.event === 'reaction-call');
265
- });
266
- assert.equal(records(statusPath).some((record) => record.generation === 2 && record.event === 'push-response'), false, 'reconnect data remains behind the newly installed awareness gate');
267
- writeFileSync(releasePath, 'release');
268
- await waitFor('reconnected data after durable marker success', () => records(statusPath).some((record) => record.generation === 2 && record.event === 'push-response'));
269
- assert.equal(outbox.pending('discord').length, 0);
270
- assert.equal(outbox.batches()[0].refs[0].attempts, 2);
271
- }
272
- finally {
273
- await framework?.stop();
274
- rmSync(dir, { recursive: true, force: true });
275
- }
276
- });
277
- test('tools/list_changed installs the data gate before a following push', async () => {
278
- mkdirSync(TEST_ROOT, { recursive: true });
279
- const dir = mkdtempSync(join(TEST_ROOT, 'awareness-list-change-'));
280
- const statusPath = join(dir, 'status.jsonl');
281
- const releasePath = join(dir, 'release');
282
- const listChangePath = join(dir, 'list-change');
283
- const { outboxPath, config } = frameworkConfig(dir, {
284
- STATUS_PATH: statusPath,
285
- LEDGER_PATH: join(dir, 'awareness.json'),
286
- RELEASE_PATH: releasePath,
287
- LIST_CHANGE_PATH: listChangePath,
288
- });
289
- const outbox = new DiscordAwarenessOutbox(outboxPath);
290
- let framework;
291
- try {
292
- framework = await AgentFramework.create(config);
293
- await waitFor('initial zero-pending push response', () => records(statusPath).some((record) => record.event === 'push-response'));
294
- const batch = outbox.prepare({
295
- agentName: 'assistant',
296
- sourceBranch: 'source',
297
- targetBranch: 'main',
298
- activationPolicy: 'explicit',
299
- refs: [{ serverId: 'discord', channelId: 'discord:guild:startup', messageId: 'message-list' }],
300
- });
301
- assert.ok(batch);
302
- outbox.activate(batch.id);
303
- writeFileSync(listChangePath, 'change');
304
- await waitFor('control response while list-change barrier is pending', () => {
305
- const status = records(statusPath);
306
- return status.some((record) => record.event === 'tools-list-changed-notification')
307
- && status.some((record) => record.event === 'control-response-during-barrier');
308
- });
309
- assert.equal(records(statusPath).some((record) => record.event === 'list-change-push-response'), false);
310
- writeFileSync(releasePath, 'release');
311
- await waitFor('list-change gated push response', () => records(statusPath).some((record) => record.event === 'list-change-push-response'));
312
- const push = records(statusPath).find((record) => record.event === 'list-change-push-response');
313
- assert.equal(push?.ledgerStatus, 'applied');
314
- assert.equal(outbox.pending('discord').length, 0);
315
- }
316
- finally {
317
- await framework?.stop();
318
- rmSync(dir, { recursive: true, force: true });
319
- }
320
- });
321
- for (const dataMethod of DATA_METHODS)
322
- test(`runtime awareness generation globally gates non-Discord ${dataMethod}`, async () => {
323
- mkdirSync(TEST_ROOT, { recursive: true });
324
- const dir = mkdtempSync(join(TEST_ROOT, 'awareness-runtime-global-'));
325
- const { outboxPath, statusPath, releasePath, listChangePath, config, } = twoServerFrameworkConfig(dir, 'discord-first', dataMethod, true);
326
- const outbox = new DiscordAwarenessOutbox(outboxPath);
327
- let framework;
328
- try {
329
- framework = await AgentFramework.create(config);
330
- await waitFor('both initial data responses', () => {
331
- const initial = records(statusPath).filter((record) => record.event === 'push-response');
332
- return initial.some((record) => record.serverId === 'discord')
333
- && initial.some((record) => record.serverId === 'heartbeat');
334
- });
335
- const batch = outbox.prepare({
336
- agentName: 'assistant',
337
- sourceBranch: 'source',
338
- targetBranch: 'main',
339
- activationPolicy: 'explicit',
340
- refs: [{
341
- serverId: 'discord',
342
- channelId: 'discord:guild:startup',
343
- messageId: `runtime-global-${dataMethod}`,
344
- }],
345
- });
346
- assert.ok(batch);
347
- outbox.activate(batch.id);
348
- writeFileSync(listChangePath, 'change');
349
- await waitFor('Discord marker call for heartbeat generation', () => records(statusPath).some((record) => record.serverId === 'discord' && record.event === 'reaction-call'));
350
- assert.equal(records(statusPath).some((record) => record.serverId === 'heartbeat' && record.event === 'list-change-push-response'), false, `fresh heartbeat ${dataMethod} must wait for Discord accounting`);
351
- writeFileSync(releasePath, 'release');
352
- await waitFor('globally gated runtime response', () => records(statusPath).some((record) => record.serverId === 'heartbeat' && record.event === 'list-change-push-response'));
353
- const response = records(statusPath).find((record) => record.serverId === 'heartbeat' && record.event === 'list-change-push-response');
354
- assert.equal(response?.method, dataMethod);
355
- assert.equal(response?.ledgerStatus, 'applied');
356
- assert.equal(outbox.pending('discord').length, 0);
357
- }
358
- finally {
359
- await framework?.stop();
360
- rmSync(dir, { recursive: true, force: true });
361
- }
362
- });
363
- test('reconnect pauses fresh inbound data but permits registration and awareness tool service', async () => {
364
- mkdirSync(TEST_ROOT, { recursive: true });
365
- const dir = mkdtempSync(join(TEST_ROOT, 'awareness-reconnect-'));
366
- const statusPath = join(dir, 'status.jsonl');
367
- const releasePath = join(dir, 'release');
368
- const crashPath = join(dir, 'crash');
369
- const generationPath = join(dir, 'generation');
370
- const { outboxPath, config } = frameworkConfig(dir, {
371
- STATUS_PATH: statusPath,
372
- LEDGER_PATH: join(dir, 'awareness.json'),
373
- RELEASE_PATH: releasePath,
374
- CRASH_PATH: crashPath,
375
- GENERATION_PATH: generationPath,
376
- }, 1_000, {
377
- reconnect: true,
378
- reconnectIntervalMs: 20,
379
- reconnectMaxIntervalMs: 20,
380
- });
381
- const outbox = new DiscordAwarenessOutbox(outboxPath);
382
- let framework;
383
- try {
384
- // No startup marker: this path must release push responders synchronously.
385
- framework = await AgentFramework.create(config);
386
- await waitFor('initial synchronous push response', () => records(statusPath).some((record) => record.generation === 1 && record.event === 'push-response'));
387
- const batch = outbox.prepare({
388
- agentName: 'assistant',
389
- sourceBranch: 'source',
390
- targetBranch: 'main',
391
- activationPolicy: 'explicit',
392
- refs: [{ serverId: 'discord', channelId: 'discord:guild:startup', messageId: 'message-2' }],
393
- });
394
- assert.ok(batch);
395
- outbox.activate(batch.id);
396
- writeFileSync(crashPath, 'crash');
397
- await waitFor('reconnect control plane during pending barrier', () => {
398
- const second = records(statusPath).filter((record) => record.generation === 2);
399
- return second.some((record) => record.event === 'registration-response')
400
- && second.some((record) => record.event === 'control-response-during-barrier');
401
- });
402
- assert.equal(records(statusPath).some((record) => record.generation === 2 && record.event === 'push-response'), false, 'fresh reconnect data must not pass the new gate');
403
- writeFileSync(releasePath, 'release');
404
- await waitFor('reconnect gated push response', () => records(statusPath).some((record) => record.generation === 2 && record.event === 'push-response'));
405
- const push = records(statusPath).find((record) => record.generation === 2 && record.event === 'push-response');
406
- assert.equal(push?.ledgerStatus, 'applied');
407
- assert.equal(outbox.pending('discord').length, 0);
408
- }
409
- finally {
410
- await framework?.stop();
411
- rmSync(dir, { recursive: true, force: true });
412
- }
413
- });
414
- test('a reconnect gate opens only after re-registration, even when the awareness drain settles first', async () => {
415
- // The gate is global: marks pending for one server keep every data plane
416
- // paused. Here the reconnecting server's re-registration (its §5.3 policy
417
- // reply) is held while another server's drain finishes. The reconnecting
418
- // server's data must wait for its grant, not only for the drain.
419
- mkdirSync(TEST_ROOT, { recursive: true });
420
- const dir = mkdtempSync(join(TEST_ROOT, 'awareness-reconnect-grant-'));
421
- const outboxPath = join(dir, 'awareness.json');
422
- const statusPath = join(dir, 'status.jsonl');
423
- const crashPath = join(dir, 'crash');
424
- const policyHoldPath = join(dir, 'release-policy');
425
- const server = (id, env, reconnect = false) => ({
426
- id,
427
- command: process.execPath,
428
- args: [FIXTURE],
429
- requestTimeoutMs: 0,
430
- env: { STATUS_PATH: statusPath, LEDGER_PATH: outboxPath, SERVER_ID: id, ...env },
431
- enabledFeatureSets: ['chat'],
432
- ...(reconnect ? { reconnect: true, reconnectIntervalMs: 20, reconnectMaxIntervalMs: 20 } : {}),
433
- });
434
- const outbox = new DiscordAwarenessOutbox(outboxPath);
435
- let framework;
436
- try {
437
- framework = await AgentFramework.create({
438
- storePath: join(dir, 'store'),
439
- discordAwarenessOutboxPath: outboxPath,
440
- discordAwarenessDeadlineMs: 1_000,
441
- membrane: new MockMembrane().asMembrane(),
442
- agents: [{ name: 'assistant', model: 'test', systemPrompt: 'test' }],
443
- modules: [],
444
- mcplServers: [
445
- server('discord', {}),
446
- server('heartbeat', {
447
- CRASH_PATH: crashPath,
448
- GENERATION_PATH: join(dir, 'heartbeat-generation'),
449
- POLICY_HOLD_PATH: policyHoldPath,
450
- }, true),
451
- ],
452
- });
453
- await waitFor('both servers\' startup data answered', () => ['discord', 'heartbeat'].every((id) => records(statusPath).some((r) => r.serverId === id && r.generation === 1 && r.event === 'push-response')));
454
- // A mark pending for discord, then the heartbeat server drops and comes back.
455
- const batch = outbox.prepare({
456
- agentName: 'assistant',
457
- sourceBranch: 'source',
458
- targetBranch: 'main',
459
- activationPolicy: 'explicit',
460
- refs: [{ serverId: 'discord', channelId: 'discord:guild:startup', messageId: 'message-3' }],
461
- });
462
- assert.ok(batch);
463
- outbox.activate(batch.id);
464
- writeFileSync(crashPath, 'crash');
465
- await waitFor('the reconnect generation\'s policy held', () => records(statusPath).some((r) => r.serverId === 'heartbeat' && r.generation === 2 && r.event === 'policy-held'));
466
- assert.ok(records(statusPath).some((r) => r.serverId === 'heartbeat' && r.generation === 2 && r.event === 'data-request-sent'), 'the reconnected server has already sent the data its grant must hold');
467
- await waitFor('discord\'s mark delivered while re-registration is held', () => outbox.batches()[0]?.refs[0]?.deliveryStatus === 'applied');
468
- await new Promise((resolve) => setTimeout(resolve, 200));
469
- assert.equal(records(statusPath).some((r) => r.serverId === 'heartbeat' && r.generation === 2 && r.event === 'push-response'), false, 'the reconnected server\'s data waits for its grant, though the drain has settled');
470
- writeFileSync(policyHoldPath, 'release');
471
- await waitFor('the reconnected server\'s data after its grant', () => records(statusPath).some((r) => r.serverId === 'heartbeat' && r.generation === 2 && r.event === 'push-response'));
472
- const push = records(statusPath).find((r) => r.serverId === 'heartbeat' && r.generation === 2 && r.event === 'push-response');
473
- assert.equal(push?.accepted, true, 'delivered under the re-established grant, not rejected fail-closed');
474
- }
475
- finally {
476
- await framework?.stop();
477
- rmSync(dir, { recursive: true, force: true });
478
- }
479
- });
480
- test('startup fails explicitly when awareness reconciliation throws', async () => {
481
- mkdirSync(TEST_ROOT, { recursive: true });
482
- const dir = mkdtempSync(join(TEST_ROOT, 'awareness-reconcile-failure-'));
483
- const statusPath = join(dir, 'status.jsonl');
484
- const { outboxPath, config } = frameworkConfig(dir, {
485
- STATUS_PATH: statusPath,
486
- LEDGER_PATH: join(dir, 'awareness.json'),
487
- });
488
- preparePending(outboxPath);
489
- const prototype = DiscordAwarenessOutbox.prototype;
490
- const original = prototype.reconcileForBranch;
491
- let calls = 0;
492
- prototype.reconcileForBranch = function (...args) {
493
- calls++;
494
- if (calls === 2)
495
- throw new Error('injected reconcile failure');
496
- return original.apply(this, args);
497
- };
498
- try {
499
- await assert.rejects(AgentFramework.create(config), /awareness accounting failed.*injected reconcile failure/i);
500
- assert.equal(records(statusPath).some((record) => record.event === 'push-response'), false, 'failed startup never reports a released data plane');
501
- }
502
- finally {
503
- prototype.reconcileForBranch = original;
504
- rmSync(dir, { recursive: true, force: true });
505
- }
506
- });
507
- test('startup fails explicitly when the awareness ledger read throws', async () => {
508
- mkdirSync(TEST_ROOT, { recursive: true });
509
- const dir = mkdtempSync(join(TEST_ROOT, 'awareness-read-failure-'));
510
- const { outboxPath, config } = frameworkConfig(dir);
511
- preparePending(outboxPath);
512
- const prototype = DiscordAwarenessOutbox.prototype;
513
- const original = prototype.pending;
514
- prototype.pending = () => { throw new Error('injected read failure'); };
515
- try {
516
- await assert.rejects(AgentFramework.create(config), /awareness accounting failed.*injected read failure/i);
517
- }
518
- finally {
519
- prototype.pending = original;
520
- rmSync(dir, { recursive: true, force: true });
521
- }
522
- });
523
- for (const writeMethod of ['recordSuccess', 'recordFailure'])
524
- test(`startup fails explicitly when ${writeMethod} cannot persist`, async () => {
525
- mkdirSync(TEST_ROOT, { recursive: true });
526
- const dir = mkdtempSync(join(TEST_ROOT, `awareness-${writeMethod}-failure-`));
527
- const statusPath = join(dir, 'status.jsonl');
528
- const { outboxPath, config } = frameworkConfig(dir, {
529
- STATUS_PATH: statusPath,
530
- LEDGER_PATH: join(dir, 'awareness.json'),
531
- ...(writeMethod === 'recordFailure' ? { PERMANENT_REACTION: '1' } : {}),
532
- });
533
- preparePending(outboxPath);
534
- const prototype = DiscordAwarenessOutbox.prototype;
535
- const original = prototype[writeMethod];
536
- prototype[writeMethod] = () => { throw new Error(`injected ${writeMethod} write failure`); };
537
- try {
538
- await assert.rejects(AgentFramework.create(config), new RegExp(`awareness accounting failed.*injected ${writeMethod} write failure`, 'i'));
539
- assert.equal(records(statusPath).some((record) => record.event === 'push-response'), false);
540
- }
541
- finally {
542
- prototype[writeMethod] = original;
543
- rmSync(dir, { recursive: true, force: true });
544
- }
545
- });
546
- test('runtime reconciliation failure recycles the connection and keeps fresh data gated', async () => {
547
- mkdirSync(TEST_ROOT, { recursive: true });
548
- const dir = mkdtempSync(join(TEST_ROOT, 'awareness-runtime-accounting-'));
549
- const statusPath = join(dir, 'status.jsonl');
550
- const releasePath = join(dir, 'release');
551
- const listChangePath = join(dir, 'list-change');
552
- const generationPath = join(dir, 'generation');
553
- const { outboxPath, config } = frameworkConfig(dir, {
554
- STATUS_PATH: statusPath,
555
- LEDGER_PATH: join(dir, 'awareness.json'),
556
- RELEASE_PATH: releasePath,
557
- LIST_CHANGE_PATH: listChangePath,
558
- GENERATION_PATH: generationPath,
559
- }, 1_000, {
560
- reconnect: true,
561
- reconnectIntervalMs: 20,
562
- reconnectMaxIntervalMs: 20,
563
- });
564
- const outbox = new DiscordAwarenessOutbox(outboxPath);
565
- let framework;
566
- try {
567
- framework = await AgentFramework.create(config);
568
- await waitFor('initial response', () => records(statusPath).some((record) => record.event === 'push-response'));
569
- const batch = outbox.prepare({
570
- agentName: 'assistant',
571
- sourceBranch: 'source',
572
- targetBranch: 'main',
573
- activationPolicy: 'explicit',
574
- refs: [{ serverId: 'discord', channelId: 'discord:guild:startup', messageId: 'runtime-fail' }],
575
- });
576
- outbox.activate(batch.id);
577
- const prototype = DiscordAwarenessOutbox.prototype;
578
- const original = prototype.reconcileForBranch;
579
- let injected = false;
580
- prototype.reconcileForBranch = function (...args) {
581
- if (!injected) {
582
- injected = true;
583
- throw new Error('injected runtime reconcile failure');
584
- }
585
- return original.apply(this, args);
586
- };
587
- try {
588
- writeFileSync(listChangePath, 'change');
589
- await waitFor('replacement connection awareness call', () => records(statusPath).some((record) => record.generation === 2 && record.event === 'reaction-call'));
590
- }
591
- finally {
592
- prototype.reconcileForBranch = original;
593
- }
594
- assert.equal(records(statusPath).some((record) => record.generation === 2 && record.event === 'push-response'), false);
595
- writeFileSync(releasePath, 'release');
596
- await waitFor('replacement connection data release', () => records(statusPath).some((record) => record.generation === 2 && record.event === 'push-response'));
597
- assert.equal(outbox.pending('discord').length, 0);
598
- }
599
- finally {
600
- await framework?.stop();
601
- rmSync(dir, { recursive: true, force: true });
602
- }
603
- });
604
- function deferred() {
605
- let resolve;
606
- let reject;
607
- const promise = new Promise((res, rej) => { resolve = res; reject = rej; });
608
- return { promise, resolve, reject };
609
- }
610
- test('a control flush that installs a newer generation cannot be released by the old barrier', async () => {
611
- const oldDrain = deferred();
612
- const newDrain = deferred();
613
- const framework = Object.create(AgentFramework.prototype);
614
- framework.discordAwarenessBarrier = null;
615
- framework.discordAwarenessBarrierGeneration = 0;
616
- const drains = [oldDrain.promise, newDrain.promise];
617
- framework.beginDiscordAwarenessBarrier = () => ({
618
- requiresBarrier: true,
619
- promise: drains.shift(),
620
- });
621
- let readyCalls = 0;
622
- let newer;
623
- const connection = {
624
- id: 'discord',
625
- pauseDataPlane: () => { },
626
- ready: () => { readyCalls++; },
627
- readyControlPlane: () => {
628
- if (newer)
629
- return;
630
- newer = framework.installMcplDataPlaneGate();
631
- framework.releaseMcplDataPlaneGate(newer);
632
- },
633
- };
634
- framework.mcplServerRegistry = { getAllServers: () => [connection] };
635
- const older = framework.installMcplDataPlaneGate();
636
- framework.releaseMcplDataPlaneGate(older);
637
- assert.equal(newer.generation, older.generation + 1);
638
- oldDrain.resolve({ status: 'delivered', delivered: 1, failed: 0 });
639
- await older.promise;
640
- assert.equal(framework.completeMcplDataPlaneGate(older), false);
641
- assert.equal(readyCalls, 0, 'old completion leaves fresh data held');
642
- newDrain.resolve({ status: 'delivered', delivered: 1, failed: 0 });
643
- await newer.promise;
644
- assert.equal(framework.completeMcplDataPlaneGate(newer), true);
645
- assert.equal(readyCalls, 1);
646
- });
647
- test('overlapping reconnect/list-change generations release only the newest barrier', async () => {
648
- const reconnectDrain = deferred();
649
- const listChangeDrain = deferred();
650
- const framework = Object.create(AgentFramework.prototype);
651
- framework.discordAwarenessBarrier = null;
652
- framework.discordAwarenessBarrierGeneration = 0;
653
- const drains = [reconnectDrain.promise, listChangeDrain.promise];
654
- framework.beginDiscordAwarenessBarrier = () => ({
655
- requiresBarrier: true,
656
- promise: drains.shift(),
657
- });
658
- let readyCalls = 0;
659
- const connection = {
660
- id: 'discord',
661
- pauseDataPlane: () => { },
662
- readyControlPlane: () => { },
663
- ready: () => { readyCalls++; },
664
- };
665
- framework.mcplServerRegistry = { getAllServers: () => [connection] };
666
- const reconnectBarrier = framework.installMcplDataPlaneGate();
667
- framework.releaseMcplDataPlaneGate(reconnectBarrier);
668
- const listChangeBarrier = framework.installMcplDataPlaneGate();
669
- framework.releaseMcplDataPlaneGate(listChangeBarrier);
670
- reconnectDrain.resolve({ status: 'delivered', delivered: 1, failed: 0 });
671
- await reconnectBarrier.promise;
672
- framework.completeMcplDataPlaneGate(reconnectBarrier);
673
- assert.equal(readyCalls, 0, 'reconnect completion cannot bypass overlapping list-change work');
674
- listChangeDrain.resolve({ status: 'delivered', delivered: 1, failed: 0 });
675
- await listChangeBarrier.promise;
676
- framework.completeMcplDataPlaneGate(listChangeBarrier);
677
- assert.equal(readyCalls, 1);
678
- });
679
- test('inbound handlers wait out a generation installed while they wait', async () => {
680
- const framework = Object.create(AgentFramework.prototype);
681
- const first = deferred();
682
- const second = deferred();
683
- framework.discordAwarenessBarrier = { generation: 1, requiresBarrier: true, promise: first.promise };
684
- const handled = [];
685
- framework.pushHandler = { handlePushEvent: async () => { handled.push('push-event'); } };
686
- framework.inferenceRouter = { handleInferenceRequest: async () => { handled.push('inference-request'); } };
687
- framework.channelRegistry = { handleIncoming: async () => { handled.push('channels-incoming'); } };
688
- framework.handleHostCommand = async () => { handled.push('host-command'); return { ok: true }; };
689
- const connection = new EventEmitter();
690
- connection.id = 'discord';
691
- framework.wireMcplEvents(connection);
692
- const responder = { id: 1, respond: () => { }, respondError: () => { } };
693
- for (const event of ['push-event', 'inference-request', 'channels-incoming', 'host-command']) {
694
- connection.emit(event, {}, responder);
695
- }
696
- // A newer generation is armed while the handlers wait on the first.
697
- framework.discordAwarenessBarrier = { generation: 2, requiresBarrier: true, promise: second.promise };
698
- first.resolve({ status: 'delivered', delivered: 0, failed: 0 });
699
- await new Promise((resolve) => setTimeout(resolve, 20));
700
- assert.deepEqual(handled, [], 'no handler runs behind the newer generation');
701
- framework.discordAwarenessBarrier = null;
702
- second.resolve({ status: 'delivered', delivered: 0, failed: 0 });
703
- await new Promise((resolve) => setTimeout(resolve, 20));
704
- assert.deepEqual(handled.sort(), ['channels-incoming', 'host-command', 'inference-request', 'push-event']);
705
- });
706
- test('an inbound handler waiting on a generation that fails refuses its request and never runs it', async () => {
707
- // A generation fails when the awareness ledger can't be read or written, so
708
- // its marks were not all attempted: nothing that waited behind it may run,
709
- // and each request is answered with the failure rather than left waiting.
710
- const framework = Object.create(AgentFramework.prototype);
711
- const failing = deferred();
712
- framework.discordAwarenessBarrier = { generation: 1, requiresBarrier: true, promise: failing.promise };
713
- const handled = [];
714
- framework.pushHandler = { handlePushEvent: async () => { handled.push('push-event'); } };
715
- framework.inferenceRouter = { handleInferenceRequest: async () => { handled.push('inference-request'); } };
716
- framework.channelRegistry = { handleIncoming: async () => { handled.push('channels-incoming'); } };
717
- framework.handleHostCommand = async () => { handled.push('host-command'); return { ok: true }; };
718
- const connection = new EventEmitter();
719
- connection.id = 'discord';
720
- framework.wireMcplEvents(connection);
721
- const answers = [];
722
- for (const event of ['push-event', 'inference-request', 'channels-incoming', 'host-command']) {
723
- connection.emit(event, {}, {
724
- id: 1,
725
- respond: (result) => { answers.push({ event, result }); },
726
- respondError: (code) => { answers.push({ event, code }); },
727
- });
728
- }
729
- failing.reject(new Error('injected accounting failure'));
730
- await waitFor('every request to be answered', () => answers.length === 4);
731
- assert.deepEqual(handled, [], 'nothing runs behind a failed generation');
732
- assert.deepEqual(answers.sort((a, b) => a.event.localeCompare(b.event)), ['channels-incoming', 'host-command', 'inference-request', 'push-event'].map((event) => ({ event, code: -32603 })), 'each request is refused with the failure');
733
- });
734
- test('with no generation current, an inbound event is handled in the turn it arrives', () => {
735
- // The push coalescer orders a push against its retraction by arrival, so a
736
- // handler with no gate to wait out must not yield first.
737
- const framework = Object.create(AgentFramework.prototype);
738
- framework.discordAwarenessBarrier = null;
739
- const handled = [];
740
- framework.pushHandler = { handlePushEvent: async () => { handled.push('push-event'); } };
741
- framework.inferenceRouter = { handleInferenceRequest: async () => { handled.push('inference-request'); } };
742
- framework.channelRegistry = { handleIncoming: async () => { handled.push('channels-incoming'); } };
743
- framework.handleHostCommand = async () => { handled.push('host-command'); return { ok: true }; };
744
- const connection = new EventEmitter();
745
- connection.id = 'discord';
746
- framework.wireMcplEvents(connection);
747
- const responder = { id: 1, respond: () => { }, respondError: () => { } };
748
- for (const event of ['push-event', 'inference-request', 'channels-incoming', 'host-command']) {
749
- connection.emit(event, {}, responder);
750
- }
751
- assert.deepEqual(handled.sort(), ['channels-incoming', 'host-command', 'inference-request', 'push-event']);
752
- });
753
- test('synchronous zero-pending flush rechecks the gate after a nested list change', () => {
754
- const connection = new McplServerConnection('discord', null, null);
755
- // This test exercises plane-flush mechanics, not authorization: admission
756
- // now enforces the grant (§5.4), so model the post-policy state or the
757
- // push is correctly discarded before it can count.
758
- connection.establishGrant(new CapabilityGrant(new Set(['pushEvents']), []));
759
- let dataDeliveries = 0;
760
- connection.on('tools-list-changed', () => connection.pauseDataPlane());
761
- connection.on('push-event', () => { dataDeliveries++; });
762
- connection.emit('tools-list-changed');
763
- connection.emit('push-event', {});
764
- connection.ready();
765
- assert.equal(dataDeliveries, 0, 'the nested list-change pause must retain later items from the same ready() snapshot');
766
- connection.ready();
767
- assert.equal(dataDeliveries, 1);
768
- });
769
- //# sourceMappingURL=mcpl-awareness-barrier.test.js.map