@animalabs/agent-framework 0.22.2 → 0.22.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (940) hide show
  1. package/README.md +3 -1
  2. package/dist/src/agent.d.ts +77 -12
  3. package/dist/src/agent.d.ts.map +1 -1
  4. package/dist/src/agent.js +143 -41
  5. package/dist/src/agent.js.map +1 -1
  6. package/dist/src/api/mcp-server-core.js +1 -1
  7. package/dist/src/api/mcp-server-core.js.map +1 -1
  8. package/dist/src/api/server.d.ts.map +1 -1
  9. package/dist/src/api/server.js +5 -1
  10. package/dist/src/api/server.js.map +1 -1
  11. package/dist/src/api/types.d.ts +1 -1
  12. package/dist/src/api/types.d.ts.map +1 -1
  13. package/dist/src/branch-names.d.ts +14 -0
  14. package/dist/src/branch-names.d.ts.map +1 -0
  15. package/dist/src/branch-names.js +22 -0
  16. package/dist/src/branch-names.js.map +1 -0
  17. package/dist/src/closest-names.d.ts +28 -0
  18. package/dist/src/closest-names.d.ts.map +1 -0
  19. package/dist/src/closest-names.js +98 -0
  20. package/dist/src/closest-names.js.map +1 -0
  21. package/dist/src/code-execution/py-runner.d.ts +16 -5
  22. package/dist/src/code-execution/py-runner.d.ts.map +1 -1
  23. package/dist/src/code-execution/py-runner.js +186 -74
  24. package/dist/src/code-execution/py-runner.js.map +1 -1
  25. package/dist/src/code-execution/runtime-py.d.ts.map +1 -1
  26. package/dist/src/code-execution/runtime-py.js +49 -3
  27. package/dist/src/code-execution/runtime-py.js.map +1 -1
  28. package/dist/src/code-execution/tool-definition.d.ts +12 -1
  29. package/dist/src/code-execution/tool-definition.d.ts.map +1 -1
  30. package/dist/src/code-execution/tool-definition.js +21 -3
  31. package/dist/src/code-execution/tool-definition.js.map +1 -1
  32. package/dist/src/config-checks.d.ts +28 -0
  33. package/dist/src/config-checks.d.ts.map +1 -0
  34. package/dist/src/config-checks.js +52 -0
  35. package/dist/src/config-checks.js.map +1 -0
  36. package/dist/src/deadline-timer.d.ts +21 -0
  37. package/dist/src/deadline-timer.d.ts.map +1 -0
  38. package/dist/src/deadline-timer.js +43 -0
  39. package/dist/src/deadline-timer.js.map +1 -0
  40. package/dist/src/error-message.d.ts +30 -0
  41. package/dist/src/error-message.d.ts.map +1 -0
  42. package/dist/src/error-message.js +50 -0
  43. package/dist/src/error-message.js.map +1 -0
  44. package/dist/src/framework.d.ts +828 -88
  45. package/dist/src/framework.d.ts.map +1 -1
  46. package/dist/src/framework.js +5011 -1326
  47. package/dist/src/framework.js.map +1 -1
  48. package/dist/src/gate/event-gate.d.ts +8 -0
  49. package/dist/src/gate/event-gate.d.ts.map +1 -1
  50. package/dist/src/gate/event-gate.js +27 -3
  51. package/dist/src/gate/event-gate.js.map +1 -1
  52. package/dist/src/index.d.ts +4 -2
  53. package/dist/src/index.d.ts.map +1 -1
  54. package/dist/src/index.js +4 -2
  55. package/dist/src/index.js.map +1 -1
  56. package/dist/src/mcpl/channel-registry.d.ts +144 -6
  57. package/dist/src/mcpl/channel-registry.d.ts.map +1 -1
  58. package/dist/src/mcpl/channel-registry.js +424 -263
  59. package/dist/src/mcpl/channel-registry.js.map +1 -1
  60. package/dist/src/mcpl/checkpoint-manager.d.ts +21 -1
  61. package/dist/src/mcpl/checkpoint-manager.d.ts.map +1 -1
  62. package/dist/src/mcpl/checkpoint-manager.js +91 -30
  63. package/dist/src/mcpl/checkpoint-manager.js.map +1 -1
  64. package/dist/src/mcpl/conversation-router.d.ts +19 -3
  65. package/dist/src/mcpl/conversation-router.d.ts.map +1 -1
  66. package/dist/src/mcpl/conversation-router.js +23 -8
  67. package/dist/src/mcpl/conversation-router.js.map +1 -1
  68. package/dist/src/mcpl/convert-block.d.ts +20 -0
  69. package/dist/src/mcpl/convert-block.d.ts.map +1 -0
  70. package/dist/src/mcpl/convert-block.js +89 -0
  71. package/dist/src/mcpl/convert-block.js.map +1 -0
  72. package/dist/src/mcpl/errors.d.ts +13 -0
  73. package/dist/src/mcpl/errors.d.ts.map +1 -1
  74. package/dist/src/mcpl/errors.js +28 -0
  75. package/dist/src/mcpl/errors.js.map +1 -1
  76. package/dist/src/mcpl/hook-orchestrator.d.ts +23 -0
  77. package/dist/src/mcpl/hook-orchestrator.d.ts.map +1 -1
  78. package/dist/src/mcpl/hook-orchestrator.js +83 -72
  79. package/dist/src/mcpl/hook-orchestrator.js.map +1 -1
  80. package/dist/src/mcpl/inbound-source.d.ts +114 -0
  81. package/dist/src/mcpl/inbound-source.d.ts.map +1 -0
  82. package/dist/src/mcpl/inbound-source.js +83 -0
  83. package/dist/src/mcpl/inbound-source.js.map +1 -0
  84. package/dist/src/mcpl/index.d.ts +3 -1
  85. package/dist/src/mcpl/index.d.ts.map +1 -1
  86. package/dist/src/mcpl/index.js +3 -1
  87. package/dist/src/mcpl/index.js.map +1 -1
  88. package/dist/src/mcpl/inference-router.d.ts +15 -11
  89. package/dist/src/mcpl/inference-router.d.ts.map +1 -1
  90. package/dist/src/mcpl/inference-router.js +153 -84
  91. package/dist/src/mcpl/inference-router.js.map +1 -1
  92. package/dist/src/mcpl/push-coalescer.d.ts +33 -11
  93. package/dist/src/mcpl/push-coalescer.d.ts.map +1 -1
  94. package/dist/src/mcpl/push-coalescer.js +52 -20
  95. package/dist/src/mcpl/push-coalescer.js.map +1 -1
  96. package/dist/src/mcpl/push-handler.d.ts +16 -9
  97. package/dist/src/mcpl/push-handler.d.ts.map +1 -1
  98. package/dist/src/mcpl/push-handler.js +18 -83
  99. package/dist/src/mcpl/push-handler.js.map +1 -1
  100. package/dist/src/mcpl/reference-fetcher.d.ts +14 -2
  101. package/dist/src/mcpl/reference-fetcher.d.ts.map +1 -1
  102. package/dist/src/mcpl/reference-fetcher.js +72 -30
  103. package/dist/src/mcpl/reference-fetcher.js.map +1 -1
  104. package/dist/src/mcpl/references.d.ts +47 -12
  105. package/dist/src/mcpl/references.d.ts.map +1 -1
  106. package/dist/src/mcpl/references.js +74 -21
  107. package/dist/src/mcpl/references.js.map +1 -1
  108. package/dist/src/mcpl/server-connection.d.ts +89 -10
  109. package/dist/src/mcpl/server-connection.d.ts.map +1 -1
  110. package/dist/src/mcpl/server-connection.js +405 -129
  111. package/dist/src/mcpl/server-connection.js.map +1 -1
  112. package/dist/src/mcpl/server-registry.d.ts +10 -1
  113. package/dist/src/mcpl/server-registry.d.ts.map +1 -1
  114. package/dist/src/mcpl/server-registry.js +14 -3
  115. package/dist/src/mcpl/server-registry.js.map +1 -1
  116. package/dist/src/mcpl/skip-reply-wake.d.ts +36 -0
  117. package/dist/src/mcpl/skip-reply-wake.d.ts.map +1 -0
  118. package/dist/src/mcpl/skip-reply-wake.js +55 -0
  119. package/dist/src/mcpl/skip-reply-wake.js.map +1 -0
  120. package/dist/src/mcpl/transport.d.ts +51 -2
  121. package/dist/src/mcpl/transport.d.ts.map +1 -1
  122. package/dist/src/mcpl/transport.js +114 -20
  123. package/dist/src/mcpl/transport.js.map +1 -1
  124. package/dist/src/mcpl/types.d.ts +14 -3
  125. package/dist/src/mcpl/types.d.ts.map +1 -1
  126. package/dist/src/mcpl/types.js.map +1 -1
  127. package/dist/src/mcpl/visible-content.d.ts +15 -0
  128. package/dist/src/mcpl/visible-content.d.ts.map +1 -1
  129. package/dist/src/mcpl/visible-content.js +25 -0
  130. package/dist/src/mcpl/visible-content.js.map +1 -1
  131. package/dist/src/module-registry.d.ts +19 -1
  132. package/dist/src/module-registry.d.ts.map +1 -1
  133. package/dist/src/module-registry.js +54 -25
  134. package/dist/src/module-registry.js.map +1 -1
  135. package/dist/src/modules/api/index.js +1 -1
  136. package/dist/src/modules/api/index.js.map +1 -1
  137. package/dist/src/modules/discord/discord-js-client.d.ts +1 -0
  138. package/dist/src/modules/discord/discord-js-client.d.ts.map +1 -1
  139. package/dist/src/modules/discord/discord-js-client.js +25 -9
  140. package/dist/src/modules/discord/discord-js-client.js.map +1 -1
  141. package/dist/src/modules/discord/index.d.ts +29 -3
  142. package/dist/src/modules/discord/index.d.ts.map +1 -1
  143. package/dist/src/modules/discord/index.js +379 -143
  144. package/dist/src/modules/discord/index.js.map +1 -1
  145. package/dist/src/modules/discord/types.d.ts +14 -1
  146. package/dist/src/modules/discord/types.d.ts.map +1 -1
  147. package/dist/src/modules/health/index.d.ts.map +1 -1
  148. package/dist/src/modules/health/index.js +2 -1
  149. package/dist/src/modules/health/index.js.map +1 -1
  150. package/dist/src/modules/history/index.d.ts +3 -1
  151. package/dist/src/modules/history/index.d.ts.map +1 -1
  152. package/dist/src/modules/history/index.js +359 -127
  153. package/dist/src/modules/history/index.js.map +1 -1
  154. package/dist/src/modules/history/semantic.d.ts +28 -1
  155. package/dist/src/modules/history/semantic.d.ts.map +1 -1
  156. package/dist/src/modules/history/semantic.js +177 -32
  157. package/dist/src/modules/history/semantic.js.map +1 -1
  158. package/dist/src/modules/unknown-tool.d.ts +10 -0
  159. package/dist/src/modules/unknown-tool.d.ts.map +1 -0
  160. package/dist/src/modules/unknown-tool.js +17 -0
  161. package/dist/src/modules/unknown-tool.js.map +1 -0
  162. package/dist/src/modules/workspace/disk-agreement.d.ts +32 -2
  163. package/dist/src/modules/workspace/disk-agreement.d.ts.map +1 -1
  164. package/dist/src/modules/workspace/disk-agreement.js +30 -2
  165. package/dist/src/modules/workspace/disk-agreement.js.map +1 -1
  166. package/dist/src/modules/workspace/effects.d.ts +64 -6
  167. package/dist/src/modules/workspace/effects.d.ts.map +1 -1
  168. package/dist/src/modules/workspace/effects.js +291 -44
  169. package/dist/src/modules/workspace/effects.js.map +1 -1
  170. package/dist/src/modules/workspace/index.d.ts +119 -23
  171. package/dist/src/modules/workspace/index.d.ts.map +1 -1
  172. package/dist/src/modules/workspace/index.js +793 -247
  173. package/dist/src/modules/workspace/index.js.map +1 -1
  174. package/dist/src/modules/workspace/observe.d.ts +75 -8
  175. package/dist/src/modules/workspace/observe.d.ts.map +1 -1
  176. package/dist/src/modules/workspace/observe.js +174 -14
  177. package/dist/src/modules/workspace/observe.js.map +1 -1
  178. package/dist/src/modules/workspace/reconcile.d.ts +58 -7
  179. package/dist/src/modules/workspace/reconcile.d.ts.map +1 -1
  180. package/dist/src/modules/workspace/reconcile.js +521 -56
  181. package/dist/src/modules/workspace/reconcile.js.map +1 -1
  182. package/dist/src/modules/workspace/types.d.ts +18 -4
  183. package/dist/src/modules/workspace/types.d.ts.map +1 -1
  184. package/dist/src/modules/workspace/types.js.map +1 -1
  185. package/dist/src/modules/workspace/watcher.d.ts +7 -2
  186. package/dist/src/modules/workspace/watcher.d.ts.map +1 -1
  187. package/dist/src/modules/workspace/watcher.js +28 -4
  188. package/dist/src/modules/workspace/watcher.js.map +1 -1
  189. package/dist/src/prose-drafts.d.ts +240 -0
  190. package/dist/src/prose-drafts.d.ts.map +1 -0
  191. package/dist/src/prose-drafts.js +362 -0
  192. package/dist/src/prose-drafts.js.map +1 -0
  193. package/dist/src/prose-segments.d.ts +21 -2
  194. package/dist/src/prose-segments.d.ts.map +1 -1
  195. package/dist/src/prose-segments.js +46 -9
  196. package/dist/src/prose-segments.js.map +1 -1
  197. package/dist/src/recovery/offline-branch.d.ts +1 -0
  198. package/dist/src/recovery/offline-branch.d.ts.map +1 -1
  199. package/dist/src/recovery/offline-branch.js +3 -1
  200. package/dist/src/recovery/offline-branch.js.map +1 -1
  201. package/dist/src/safe-slice.d.ts +5 -1
  202. package/dist/src/safe-slice.d.ts.map +1 -1
  203. package/dist/src/safe-slice.js +9 -1
  204. package/dist/src/safe-slice.js.map +1 -1
  205. package/dist/src/thinking-token-stamp.d.ts +12 -0
  206. package/dist/src/thinking-token-stamp.d.ts.map +1 -1
  207. package/dist/src/thinking-token-stamp.js +34 -3
  208. package/dist/src/thinking-token-stamp.js.map +1 -1
  209. package/dist/src/tool-image-ledger.d.ts +87 -19
  210. package/dist/src/tool-image-ledger.d.ts.map +1 -1
  211. package/dist/src/tool-image-ledger.js +135 -32
  212. package/dist/src/tool-image-ledger.js.map +1 -1
  213. package/dist/src/tool-presentation.d.ts +9 -0
  214. package/dist/src/tool-presentation.d.ts.map +1 -1
  215. package/dist/src/tool-presentation.js +257 -60
  216. package/dist/src/tool-presentation.js.map +1 -1
  217. package/dist/src/tool-result-guard.d.ts.map +1 -1
  218. package/dist/src/tool-result-guard.js +7 -10
  219. package/dist/src/tool-result-guard.js.map +1 -1
  220. package/dist/src/tool-result-history.d.ts +32 -3
  221. package/dist/src/tool-result-history.d.ts.map +1 -1
  222. package/dist/src/tool-result-history.js +106 -19
  223. package/dist/src/tool-result-history.js.map +1 -1
  224. package/dist/src/tune-out/coordinator.d.ts +25 -1
  225. package/dist/src/tune-out/coordinator.d.ts.map +1 -1
  226. package/dist/src/tune-out/coordinator.js +260 -65
  227. package/dist/src/tune-out/coordinator.js.map +1 -1
  228. package/dist/src/types/agent.d.ts +17 -5
  229. package/dist/src/types/agent.d.ts.map +1 -1
  230. package/dist/src/types/events.d.ts +17 -0
  231. package/dist/src/types/events.d.ts.map +1 -1
  232. package/dist/src/types/framework.d.ts +21 -5
  233. package/dist/src/types/framework.d.ts.map +1 -1
  234. package/dist/src/types/inference-log.d.ts +1 -1
  235. package/dist/src/types/inference-log.d.ts.map +1 -1
  236. package/dist/src/types/module.d.ts +23 -4
  237. package/dist/src/types/module.d.ts.map +1 -1
  238. package/dist/src/types/trace.d.ts +95 -6
  239. package/dist/src/types/trace.d.ts.map +1 -1
  240. package/dist/src/usage/usage-tracker.d.ts +5 -0
  241. package/dist/src/usage/usage-tracker.d.ts.map +1 -1
  242. package/dist/src/usage/usage-tracker.js +35 -8
  243. package/dist/src/usage/usage-tracker.js.map +1 -1
  244. package/package.json +6 -4
  245. package/src/agent.ts +169 -41
  246. package/src/api/mcp-server-core.ts +1 -1
  247. package/src/api/server.ts +4 -1
  248. package/src/api/types.ts +1 -1
  249. package/src/branch-names.ts +19 -0
  250. package/src/closest-names.ts +94 -0
  251. package/src/code-execution/py-runner.ts +200 -76
  252. package/src/code-execution/runtime-py.ts +49 -3
  253. package/src/code-execution/tool-definition.ts +28 -4
  254. package/src/config-checks.ts +48 -0
  255. package/src/deadline-timer.ts +44 -0
  256. package/src/error-message.ts +48 -0
  257. package/src/framework.ts +5352 -1388
  258. package/src/gate/event-gate.ts +28 -3
  259. package/src/index.ts +11 -2
  260. package/src/mcpl/channel-registry.ts +517 -286
  261. package/src/mcpl/checkpoint-manager.ts +104 -29
  262. package/src/mcpl/conversation-router.ts +28 -8
  263. package/src/mcpl/convert-block.ts +97 -0
  264. package/src/mcpl/errors.ts +28 -0
  265. package/src/mcpl/hook-orchestrator.ts +84 -77
  266. package/src/mcpl/inbound-source.ts +156 -0
  267. package/src/mcpl/index.ts +10 -1
  268. package/src/mcpl/inference-router.ts +174 -99
  269. package/src/mcpl/push-coalescer.ts +60 -24
  270. package/src/mcpl/push-handler.ts +20 -90
  271. package/src/mcpl/reference-fetcher.ts +71 -26
  272. package/src/mcpl/references.ts +81 -22
  273. package/src/mcpl/server-connection.ts +427 -132
  274. package/src/mcpl/server-registry.ts +15 -4
  275. package/src/mcpl/skip-reply-wake.ts +73 -0
  276. package/src/mcpl/transport.ts +120 -18
  277. package/src/mcpl/types.ts +14 -3
  278. package/src/mcpl/visible-content.ts +27 -0
  279. package/src/module-registry.ts +58 -23
  280. package/src/modules/api/index.ts +1 -1
  281. package/src/modules/discord/discord-js-client.ts +26 -10
  282. package/src/modules/discord/index.ts +391 -158
  283. package/src/modules/discord/types.ts +15 -2
  284. package/src/modules/health/index.ts +2 -1
  285. package/src/modules/history/index.ts +410 -120
  286. package/src/modules/history/semantic.ts +189 -32
  287. package/src/modules/unknown-tool.ts +16 -0
  288. package/src/modules/workspace/disk-agreement.ts +51 -3
  289. package/src/modules/workspace/effects.ts +279 -35
  290. package/src/modules/workspace/index.ts +810 -260
  291. package/src/modules/workspace/observe.ts +194 -20
  292. package/src/modules/workspace/reconcile.ts +619 -64
  293. package/src/modules/workspace/types.ts +18 -4
  294. package/src/modules/workspace/watcher.ts +27 -4
  295. package/src/prose-drafts.ts +481 -0
  296. package/src/prose-segments.ts +51 -8
  297. package/src/recovery/offline-branch.ts +4 -1
  298. package/src/safe-slice.ts +9 -1
  299. package/src/thinking-token-stamp.ts +34 -3
  300. package/src/tool-image-ledger.ts +153 -34
  301. package/src/tool-presentation.ts +224 -40
  302. package/src/tool-result-guard.ts +7 -8
  303. package/src/tool-result-history.ts +124 -20
  304. package/src/tune-out/coordinator.ts +259 -65
  305. package/src/types/agent.ts +17 -7
  306. package/src/types/events.ts +17 -0
  307. package/src/types/framework.ts +21 -5
  308. package/src/types/inference-log.ts +1 -1
  309. package/src/types/module.ts +24 -4
  310. package/src/types/trace.ts +101 -6
  311. package/src/usage/usage-tracker.ts +32 -8
  312. package/dist/test/activation-request-sanitize.test.d.ts +0 -2
  313. package/dist/test/activation-request-sanitize.test.d.ts.map +0 -1
  314. package/dist/test/activation-request-sanitize.test.js +0 -89
  315. package/dist/test/activation-request-sanitize.test.js.map +0 -1
  316. package/dist/test/agent-cache-ttl.test.d.ts +0 -2
  317. package/dist/test/agent-cache-ttl.test.d.ts.map +0 -1
  318. package/dist/test/agent-cache-ttl.test.js +0 -41
  319. package/dist/test/agent-cache-ttl.test.js.map +0 -1
  320. package/dist/test/agent-runtime-settings.test.d.ts +0 -2
  321. package/dist/test/agent-runtime-settings.test.d.ts.map +0 -1
  322. package/dist/test/agent-runtime-settings.test.js +0 -1598
  323. package/dist/test/agent-runtime-settings.test.js.map +0 -1
  324. package/dist/test/api-admin-gate.test.d.ts +0 -2
  325. package/dist/test/api-admin-gate.test.d.ts.map +0 -1
  326. package/dist/test/api-admin-gate.test.js +0 -116
  327. package/dist/test/api-admin-gate.test.js.map +0 -1
  328. package/dist/test/assistant-persist-refusal.test.d.ts +0 -2
  329. package/dist/test/assistant-persist-refusal.test.d.ts.map +0 -1
  330. package/dist/test/assistant-persist-refusal.test.js +0 -63
  331. package/dist/test/assistant-persist-refusal.test.js.map +0 -1
  332. package/dist/test/batched-wake-locus.test.d.ts +0 -2
  333. package/dist/test/batched-wake-locus.test.d.ts.map +0 -1
  334. package/dist/test/batched-wake-locus.test.js +0 -166
  335. package/dist/test/batched-wake-locus.test.js.map +0 -1
  336. package/dist/test/busy-agent-scheduler.test.d.ts +0 -2
  337. package/dist/test/busy-agent-scheduler.test.d.ts.map +0 -1
  338. package/dist/test/busy-agent-scheduler.test.js +0 -92
  339. package/dist/test/busy-agent-scheduler.test.js.map +0 -1
  340. package/dist/test/channel-incoming-targeting.test.d.ts +0 -2
  341. package/dist/test/channel-incoming-targeting.test.d.ts.map +0 -1
  342. package/dist/test/channel-incoming-targeting.test.js +0 -81
  343. package/dist/test/channel-incoming-targeting.test.js.map +0 -1
  344. package/dist/test/channel-label-history.test.d.ts +0 -2
  345. package/dist/test/channel-label-history.test.d.ts.map +0 -1
  346. package/dist/test/channel-label-history.test.js +0 -424
  347. package/dist/test/channel-label-history.test.js.map +0 -1
  348. package/dist/test/channel-lifecycle-provenance.test.d.ts +0 -2
  349. package/dist/test/channel-lifecycle-provenance.test.d.ts.map +0 -1
  350. package/dist/test/channel-lifecycle-provenance.test.js +0 -47
  351. package/dist/test/channel-lifecycle-provenance.test.js.map +0 -1
  352. package/dist/test/channel-registry-routing.test.d.ts +0 -2
  353. package/dist/test/channel-registry-routing.test.d.ts.map +0 -1
  354. package/dist/test/channel-registry-routing.test.js +0 -446
  355. package/dist/test/channel-registry-routing.test.js.map +0 -1
  356. package/dist/test/channel-registry-typing.test.d.ts +0 -2
  357. package/dist/test/channel-registry-typing.test.d.ts.map +0 -1
  358. package/dist/test/channel-registry-typing.test.js +0 -91
  359. package/dist/test/channel-registry-typing.test.js.map +0 -1
  360. package/dist/test/channels-changed-respond-first.test.d.ts +0 -2
  361. package/dist/test/channels-changed-respond-first.test.d.ts.map +0 -1
  362. package/dist/test/channels-changed-respond-first.test.js +0 -74
  363. package/dist/test/channels-changed-respond-first.test.js.map +0 -1
  364. package/dist/test/checkpoint-attribution.test.d.ts +0 -2
  365. package/dist/test/checkpoint-attribution.test.d.ts.map +0 -1
  366. package/dist/test/checkpoint-attribution.test.js +0 -200
  367. package/dist/test/checkpoint-attribution.test.js.map +0 -1
  368. package/dist/test/code-execution.test.d.ts +0 -11
  369. package/dist/test/code-execution.test.d.ts.map +0 -1
  370. package/dist/test/code-execution.test.js +0 -1272
  371. package/dist/test/code-execution.test.js.map +0 -1
  372. package/dist/test/component-defaults.test.d.ts +0 -2
  373. package/dist/test/component-defaults.test.d.ts.map +0 -1
  374. package/dist/test/component-defaults.test.js +0 -54
  375. package/dist/test/component-defaults.test.js.map +0 -1
  376. package/dist/test/conversation-fork-injection-scoping.test.d.ts +0 -2
  377. package/dist/test/conversation-fork-injection-scoping.test.d.ts.map +0 -1
  378. package/dist/test/conversation-fork-injection-scoping.test.js +0 -200
  379. package/dist/test/conversation-fork-injection-scoping.test.js.map +0 -1
  380. package/dist/test/conversation-router.test.d.ts +0 -2
  381. package/dist/test/conversation-router.test.d.ts.map +0 -1
  382. package/dist/test/conversation-router.test.js +0 -174
  383. package/dist/test/conversation-router.test.js.map +0 -1
  384. package/dist/test/conversation-routing.test.d.ts +0 -7
  385. package/dist/test/conversation-routing.test.d.ts.map +0 -1
  386. package/dist/test/conversation-routing.test.js +0 -621
  387. package/dist/test/conversation-routing.test.js.map +0 -1
  388. package/dist/test/deferred-wake-integrity.test.d.ts +0 -29
  389. package/dist/test/deferred-wake-integrity.test.d.ts.map +0 -1
  390. package/dist/test/deferred-wake-integrity.test.js +0 -320
  391. package/dist/test/deferred-wake-integrity.test.js.map +0 -1
  392. package/dist/test/discord-awareness-outbox.test.d.ts +0 -2
  393. package/dist/test/discord-awareness-outbox.test.d.ts.map +0 -1
  394. package/dist/test/discord-awareness-outbox.test.js +0 -371
  395. package/dist/test/discord-awareness-outbox.test.js.map +0 -1
  396. package/dist/test/discord-history-delete-window.test.d.ts +0 -2
  397. package/dist/test/discord-history-delete-window.test.d.ts.map +0 -1
  398. package/dist/test/discord-history-delete-window.test.js +0 -81
  399. package/dist/test/discord-history-delete-window.test.js.map +0 -1
  400. package/dist/test/discord-history-sync.test.d.ts +0 -2
  401. package/dist/test/discord-history-sync.test.d.ts.map +0 -1
  402. package/dist/test/discord-history-sync.test.js +0 -56
  403. package/dist/test/discord-history-sync.test.js.map +0 -1
  404. package/dist/test/discord-typing-keepalive.test.d.ts +0 -2
  405. package/dist/test/discord-typing-keepalive.test.d.ts.map +0 -1
  406. package/dist/test/discord-typing-keepalive.test.js +0 -77
  407. package/dist/test/discord-typing-keepalive.test.js.map +0 -1
  408. package/dist/test/ephemeral-settle.test.d.ts +0 -2
  409. package/dist/test/ephemeral-settle.test.d.ts.map +0 -1
  410. package/dist/test/ephemeral-settle.test.js +0 -354
  411. package/dist/test/ephemeral-settle.test.js.map +0 -1
  412. package/dist/test/event-gate-passthrough.test.d.ts +0 -15
  413. package/dist/test/event-gate-passthrough.test.d.ts.map +0 -1
  414. package/dist/test/event-gate-passthrough.test.js +0 -289
  415. package/dist/test/event-gate-passthrough.test.js.map +0 -1
  416. package/dist/test/event-gate-policy-mutation.test.d.ts +0 -2
  417. package/dist/test/event-gate-policy-mutation.test.d.ts.map +0 -1
  418. package/dist/test/event-gate-policy-mutation.test.js +0 -137
  419. package/dist/test/event-gate-policy-mutation.test.js.map +0 -1
  420. package/dist/test/event-gate-rate-limit.test.d.ts +0 -2
  421. package/dist/test/event-gate-rate-limit.test.d.ts.map +0 -1
  422. package/dist/test/event-gate-rate-limit.test.js +0 -627
  423. package/dist/test/event-gate-rate-limit.test.js.map +0 -1
  424. package/dist/test/event-gate-script.test.d.ts +0 -2
  425. package/dist/test/event-gate-script.test.d.ts.map +0 -1
  426. package/dist/test/event-gate-script.test.js +0 -95
  427. package/dist/test/event-gate-script.test.js.map +0 -1
  428. package/dist/test/event-gate-selfwake.test.d.ts +0 -15
  429. package/dist/test/event-gate-selfwake.test.d.ts.map +0 -1
  430. package/dist/test/event-gate-selfwake.test.js +0 -125
  431. package/dist/test/event-gate-selfwake.test.js.map +0 -1
  432. package/dist/test/event-gate-tags.test.d.ts +0 -2
  433. package/dist/test/event-gate-tags.test.d.ts.map +0 -1
  434. package/dist/test/event-gate-tags.test.js +0 -76
  435. package/dist/test/event-gate-tags.test.js.map +0 -1
  436. package/dist/test/event-gate.test.d.ts +0 -2
  437. package/dist/test/event-gate.test.d.ts.map +0 -1
  438. package/dist/test/event-gate.test.js +0 -919
  439. package/dist/test/event-gate.test.js.map +0 -1
  440. package/dist/test/explicit-prose-routing.test.d.ts +0 -11
  441. package/dist/test/explicit-prose-routing.test.d.ts.map +0 -1
  442. package/dist/test/explicit-prose-routing.test.js +0 -1715
  443. package/dist/test/explicit-prose-routing.test.js.map +0 -1
  444. package/dist/test/framework.test.d.ts +0 -5
  445. package/dist/test/framework.test.d.ts.map +0 -1
  446. package/dist/test/framework.test.js +0 -1048
  447. package/dist/test/framework.test.js.map +0 -1
  448. package/dist/test/gather-context-timeout.test.d.ts +0 -2
  449. package/dist/test/gather-context-timeout.test.d.ts.map +0 -1
  450. package/dist/test/gather-context-timeout.test.js +0 -120
  451. package/dist/test/gather-context-timeout.test.js.map +0 -1
  452. package/dist/test/health-snapshot.test.d.ts +0 -2
  453. package/dist/test/health-snapshot.test.d.ts.map +0 -1
  454. package/dist/test/health-snapshot.test.js +0 -74
  455. package/dist/test/health-snapshot.test.js.map +0 -1
  456. package/dist/test/helpers/coalescing-fixture.d.ts +0 -74
  457. package/dist/test/helpers/coalescing-fixture.d.ts.map +0 -1
  458. package/dist/test/helpers/coalescing-fixture.js +0 -152
  459. package/dist/test/helpers/coalescing-fixture.js.map +0 -1
  460. package/dist/test/helpers/coalescing-kill-child.d.ts +0 -2
  461. package/dist/test/helpers/coalescing-kill-child.d.ts.map +0 -1
  462. package/dist/test/helpers/coalescing-kill-child.js +0 -24
  463. package/dist/test/helpers/coalescing-kill-child.js.map +0 -1
  464. package/dist/test/helpers/mock-membrane.d.ts +0 -53
  465. package/dist/test/helpers/mock-membrane.d.ts.map +0 -1
  466. package/dist/test/helpers/mock-membrane.js +0 -168
  467. package/dist/test/helpers/mock-membrane.js.map +0 -1
  468. package/dist/test/helpers/pytc-stop-rows.d.ts +0 -11
  469. package/dist/test/helpers/pytc-stop-rows.d.ts.map +0 -1
  470. package/dist/test/helpers/pytc-stop-rows.js +0 -143
  471. package/dist/test/helpers/pytc-stop-rows.js.map +0 -1
  472. package/dist/test/helpers/quiesce-crash-child.d.ts +0 -2
  473. package/dist/test/helpers/quiesce-crash-child.d.ts.map +0 -1
  474. package/dist/test/helpers/quiesce-crash-child.js +0 -156
  475. package/dist/test/helpers/quiesce-crash-child.js.map +0 -1
  476. package/dist/test/hide-then-turn.test.d.ts +0 -2
  477. package/dist/test/hide-then-turn.test.d.ts.map +0 -1
  478. package/dist/test/hide-then-turn.test.js +0 -101
  479. package/dist/test/hide-then-turn.test.js.map +0 -1
  480. package/dist/test/history-module-overview.test.d.ts +0 -2
  481. package/dist/test/history-module-overview.test.d.ts.map +0 -1
  482. package/dist/test/history-module-overview.test.js +0 -711
  483. package/dist/test/history-module-overview.test.js.map +0 -1
  484. package/dist/test/history-module-realstore.test.d.ts +0 -2
  485. package/dist/test/history-module-realstore.test.d.ts.map +0 -1
  486. package/dist/test/history-module-realstore.test.js +0 -363
  487. package/dist/test/history-module-realstore.test.js.map +0 -1
  488. package/dist/test/history-module-semantic.test.d.ts +0 -2
  489. package/dist/test/history-module-semantic.test.d.ts.map +0 -1
  490. package/dist/test/history-module-semantic.test.js +0 -213
  491. package/dist/test/history-module-semantic.test.js.map +0 -1
  492. package/dist/test/history-module-ux.test.d.ts +0 -2
  493. package/dist/test/history-module-ux.test.d.ts.map +0 -1
  494. package/dist/test/history-module-ux.test.js +0 -304
  495. package/dist/test/history-module-ux.test.js.map +0 -1
  496. package/dist/test/history-module.test.d.ts +0 -2
  497. package/dist/test/history-module.test.d.ts.map +0 -1
  498. package/dist/test/history-module.test.js +0 -619
  499. package/dist/test/history-module.test.js.map +0 -1
  500. package/dist/test/history-semantic-review-findings.test.d.ts +0 -2
  501. package/dist/test/history-semantic-review-findings.test.d.ts.map +0 -1
  502. package/dist/test/history-semantic-review-findings.test.js +0 -338
  503. package/dist/test/history-semantic-review-findings.test.js.map +0 -1
  504. package/dist/test/history-semantic-sync-converges.test.d.ts +0 -2
  505. package/dist/test/history-semantic-sync-converges.test.d.ts.map +0 -1
  506. package/dist/test/history-semantic-sync-converges.test.js +0 -109
  507. package/dist/test/history-semantic-sync-converges.test.js.map +0 -1
  508. package/dist/test/host-quiesce.test.d.ts +0 -2
  509. package/dist/test/host-quiesce.test.d.ts.map +0 -1
  510. package/dist/test/host-quiesce.test.js +0 -988
  511. package/dist/test/host-quiesce.test.js.map +0 -1
  512. package/dist/test/inference-exhaustion-rewind.test.d.ts +0 -2
  513. package/dist/test/inference-exhaustion-rewind.test.d.ts.map +0 -1
  514. package/dist/test/inference-exhaustion-rewind.test.js +0 -387
  515. package/dist/test/inference-exhaustion-rewind.test.js.map +0 -1
  516. package/dist/test/inference-failure-bounds.test.d.ts +0 -2
  517. package/dist/test/inference-failure-bounds.test.d.ts.map +0 -1
  518. package/dist/test/inference-failure-bounds.test.js +0 -1202
  519. package/dist/test/inference-failure-bounds.test.js.map +0 -1
  520. package/dist/test/inference-failure-observability.test.d.ts +0 -2
  521. package/dist/test/inference-failure-observability.test.d.ts.map +0 -1
  522. package/dist/test/inference-failure-observability.test.js +0 -84
  523. package/dist/test/inference-failure-observability.test.js.map +0 -1
  524. package/dist/test/journal-tool.test.d.ts +0 -2
  525. package/dist/test/journal-tool.test.d.ts.map +0 -1
  526. package/dist/test/journal-tool.test.js +0 -33
  527. package/dist/test/journal-tool.test.js.map +0 -1
  528. package/dist/test/kv-unified-open-flight-retry.test.d.ts +0 -2
  529. package/dist/test/kv-unified-open-flight-retry.test.d.ts.map +0 -1
  530. package/dist/test/kv-unified-open-flight-retry.test.js +0 -189
  531. package/dist/test/kv-unified-open-flight-retry.test.js.map +0 -1
  532. package/dist/test/kv-unified-wiring.test.d.ts +0 -2
  533. package/dist/test/kv-unified-wiring.test.d.ts.map +0 -1
  534. package/dist/test/kv-unified-wiring.test.js +0 -95
  535. package/dist/test/kv-unified-wiring.test.js.map +0 -1
  536. package/dist/test/late-events-after-stop.test.d.ts +0 -2
  537. package/dist/test/late-events-after-stop.test.d.ts.map +0 -1
  538. package/dist/test/late-events-after-stop.test.js +0 -122
  539. package/dist/test/late-events-after-stop.test.js.map +0 -1
  540. package/dist/test/liveness-watchdog.test.d.ts +0 -2
  541. package/dist/test/liveness-watchdog.test.d.ts.map +0 -1
  542. package/dist/test/liveness-watchdog.test.js +0 -94
  543. package/dist/test/liveness-watchdog.test.js.map +0 -1
  544. package/dist/test/machine-close-provenance.test.d.ts +0 -2
  545. package/dist/test/machine-close-provenance.test.d.ts.map +0 -1
  546. package/dist/test/machine-close-provenance.test.js +0 -116
  547. package/dist/test/machine-close-provenance.test.js.map +0 -1
  548. package/dist/test/maintenance-timer.test.d.ts +0 -2
  549. package/dist/test/maintenance-timer.test.d.ts.map +0 -1
  550. package/dist/test/maintenance-timer.test.js +0 -1827
  551. package/dist/test/maintenance-timer.test.js.map +0 -1
  552. package/dist/test/mcp-server-bin.test.d.ts +0 -2
  553. package/dist/test/mcp-server-bin.test.d.ts.map +0 -1
  554. package/dist/test/mcp-server-bin.test.js +0 -142
  555. package/dist/test/mcp-server-bin.test.js.map +0 -1
  556. package/dist/test/mcpl-access-provider.test.d.ts +0 -2
  557. package/dist/test/mcpl-access-provider.test.d.ts.map +0 -1
  558. package/dist/test/mcpl-access-provider.test.js +0 -20
  559. package/dist/test/mcpl-access-provider.test.js.map +0 -1
  560. package/dist/test/mcpl-awareness-barrier.test.d.ts +0 -2
  561. package/dist/test/mcpl-awareness-barrier.test.d.ts.map +0 -1
  562. package/dist/test/mcpl-awareness-barrier.test.js +0 -769
  563. package/dist/test/mcpl-awareness-barrier.test.js.map +0 -1
  564. package/dist/test/mcpl-capability-grant.test.d.ts +0 -10
  565. package/dist/test/mcpl-capability-grant.test.d.ts.map +0 -1
  566. package/dist/test/mcpl-capability-grant.test.js +0 -111
  567. package/dist/test/mcpl-capability-grant.test.js.map +0 -1
  568. package/dist/test/mcpl-capability-scoping.test.d.ts +0 -2
  569. package/dist/test/mcpl-capability-scoping.test.d.ts.map +0 -1
  570. package/dist/test/mcpl-capability-scoping.test.js +0 -266
  571. package/dist/test/mcpl-capability-scoping.test.js.map +0 -1
  572. package/dist/test/mcpl-child-env.test.d.ts +0 -2
  573. package/dist/test/mcpl-child-env.test.d.ts.map +0 -1
  574. package/dist/test/mcpl-child-env.test.js +0 -158
  575. package/dist/test/mcpl-child-env.test.js.map +0 -1
  576. package/dist/test/mcpl-coalesced-content-parity.test.d.ts +0 -2
  577. package/dist/test/mcpl-coalesced-content-parity.test.d.ts.map +0 -1
  578. package/dist/test/mcpl-coalesced-content-parity.test.js +0 -532
  579. package/dist/test/mcpl-coalesced-content-parity.test.js.map +0 -1
  580. package/dist/test/mcpl-coalescing.test.d.ts +0 -2
  581. package/dist/test/mcpl-coalescing.test.d.ts.map +0 -1
  582. package/dist/test/mcpl-coalescing.test.js +0 -1125
  583. package/dist/test/mcpl-coalescing.test.js.map +0 -1
  584. package/dist/test/mcpl-config-diagnostics.test.d.ts +0 -2
  585. package/dist/test/mcpl-config-diagnostics.test.d.ts.map +0 -1
  586. package/dist/test/mcpl-config-diagnostics.test.js +0 -452
  587. package/dist/test/mcpl-config-diagnostics.test.js.map +0 -1
  588. package/dist/test/mcpl-empty-content.test.d.ts +0 -2
  589. package/dist/test/mcpl-empty-content.test.d.ts.map +0 -1
  590. package/dist/test/mcpl-empty-content.test.js +0 -368
  591. package/dist/test/mcpl-empty-content.test.js.map +0 -1
  592. package/dist/test/mcpl-gate-roundtrip.test.d.ts +0 -2
  593. package/dist/test/mcpl-gate-roundtrip.test.d.ts.map +0 -1
  594. package/dist/test/mcpl-gate-roundtrip.test.js +0 -285
  595. package/dist/test/mcpl-gate-roundtrip.test.js.map +0 -1
  596. package/dist/test/mcpl-list-status.test.d.ts +0 -2
  597. package/dist/test/mcpl-list-status.test.d.ts.map +0 -1
  598. package/dist/test/mcpl-list-status.test.js +0 -82
  599. package/dist/test/mcpl-list-status.test.js.map +0 -1
  600. package/dist/test/mcpl-manifest-changed.test.d.ts +0 -2
  601. package/dist/test/mcpl-manifest-changed.test.d.ts.map +0 -1
  602. package/dist/test/mcpl-manifest-changed.test.js +0 -178
  603. package/dist/test/mcpl-manifest-changed.test.js.map +0 -1
  604. package/dist/test/mcpl-push-convert.test.d.ts +0 -2
  605. package/dist/test/mcpl-push-convert.test.d.ts.map +0 -1
  606. package/dist/test/mcpl-push-convert.test.js +0 -42
  607. package/dist/test/mcpl-push-convert.test.js.map +0 -1
  608. package/dist/test/mcpl-reconnect-events.test.d.ts +0 -2
  609. package/dist/test/mcpl-reconnect-events.test.d.ts.map +0 -1
  610. package/dist/test/mcpl-reconnect-events.test.js +0 -144
  611. package/dist/test/mcpl-reconnect-events.test.js.map +0 -1
  612. package/dist/test/mcpl-reconnect-reregistration.test.d.ts +0 -2
  613. package/dist/test/mcpl-reconnect-reregistration.test.d.ts.map +0 -1
  614. package/dist/test/mcpl-reconnect-reregistration.test.js +0 -238
  615. package/dist/test/mcpl-reconnect-reregistration.test.js.map +0 -1
  616. package/dist/test/mcpl-reference-fetcher.test.d.ts +0 -2
  617. package/dist/test/mcpl-reference-fetcher.test.d.ts.map +0 -1
  618. package/dist/test/mcpl-reference-fetcher.test.js +0 -427
  619. package/dist/test/mcpl-reference-fetcher.test.js.map +0 -1
  620. package/dist/test/mcpl-reference-fields.test.d.ts +0 -2
  621. package/dist/test/mcpl-reference-fields.test.d.ts.map +0 -1
  622. package/dist/test/mcpl-reference-fields.test.js +0 -149
  623. package/dist/test/mcpl-reference-fields.test.js.map +0 -1
  624. package/dist/test/mcpl-rejection-log-lines.test.d.ts +0 -2
  625. package/dist/test/mcpl-rejection-log-lines.test.d.ts.map +0 -1
  626. package/dist/test/mcpl-rejection-log-lines.test.js +0 -349
  627. package/dist/test/mcpl-rejection-log-lines.test.js.map +0 -1
  628. package/dist/test/mcpl-request-timeout.test.d.ts +0 -2
  629. package/dist/test/mcpl-request-timeout.test.d.ts.map +0 -1
  630. package/dist/test/mcpl-request-timeout.test.js +0 -138
  631. package/dist/test/mcpl-request-timeout.test.js.map +0 -1
  632. package/dist/test/mcpl-runtime-lifecycle.test.d.ts +0 -7
  633. package/dist/test/mcpl-runtime-lifecycle.test.d.ts.map +0 -1
  634. package/dist/test/mcpl-runtime-lifecycle.test.js +0 -142
  635. package/dist/test/mcpl-runtime-lifecycle.test.js.map +0 -1
  636. package/dist/test/mcpl-stderr-tail.test.d.ts +0 -2
  637. package/dist/test/mcpl-stderr-tail.test.d.ts.map +0 -1
  638. package/dist/test/mcpl-stderr-tail.test.js +0 -210
  639. package/dist/test/mcpl-stderr-tail.test.js.map +0 -1
  640. package/dist/test/mcpl-tool-class-listing.test.d.ts +0 -2
  641. package/dist/test/mcpl-tool-class-listing.test.d.ts.map +0 -1
  642. package/dist/test/mcpl-tool-class-listing.test.js +0 -147
  643. package/dist/test/mcpl-tool-class-listing.test.js.map +0 -1
  644. package/dist/test/mcpl-tool-classes.test.d.ts +0 -7
  645. package/dist/test/mcpl-tool-classes.test.d.ts.map +0 -1
  646. package/dist/test/mcpl-tool-classes.test.js +0 -80
  647. package/dist/test/mcpl-tool-classes.test.js.map +0 -1
  648. package/dist/test/mcpl-tool-lifecycle-e2e.test.d.ts +0 -2
  649. package/dist/test/mcpl-tool-lifecycle-e2e.test.d.ts.map +0 -1
  650. package/dist/test/mcpl-tool-lifecycle-e2e.test.js +0 -237
  651. package/dist/test/mcpl-tool-lifecycle-e2e.test.js.map +0 -1
  652. package/dist/test/mcpl-tool-lifecycle-emitter.test.d.ts +0 -11
  653. package/dist/test/mcpl-tool-lifecycle-emitter.test.d.ts.map +0 -1
  654. package/dist/test/mcpl-tool-lifecycle-emitter.test.js +0 -412
  655. package/dist/test/mcpl-tool-lifecycle-emitter.test.js.map +0 -1
  656. package/dist/test/mcpl-tool-lifecycle-script.test.d.ts +0 -2
  657. package/dist/test/mcpl-tool-lifecycle-script.test.d.ts.map +0 -1
  658. package/dist/test/mcpl-tool-lifecycle-script.test.js +0 -288
  659. package/dist/test/mcpl-tool-lifecycle-script.test.js.map +0 -1
  660. package/dist/test/mcpl-tool-lifecycle.test.d.ts +0 -11
  661. package/dist/test/mcpl-tool-lifecycle.test.d.ts.map +0 -1
  662. package/dist/test/mcpl-tool-lifecycle.test.js +0 -270
  663. package/dist/test/mcpl-tool-lifecycle.test.js.map +0 -1
  664. package/dist/test/mcpl-transport-close.test.d.ts +0 -2
  665. package/dist/test/mcpl-transport-close.test.d.ts.map +0 -1
  666. package/dist/test/mcpl-transport-close.test.js +0 -373
  667. package/dist/test/mcpl-transport-close.test.js.map +0 -1
  668. package/dist/test/mcpl-transport-spawn.test.d.ts +0 -2
  669. package/dist/test/mcpl-transport-spawn.test.d.ts.map +0 -1
  670. package/dist/test/mcpl-transport-spawn.test.js +0 -58
  671. package/dist/test/mcpl-transport-spawn.test.js.map +0 -1
  672. package/dist/test/mcpl-ws-transport.test.d.ts +0 -2
  673. package/dist/test/mcpl-ws-transport.test.d.ts.map +0 -1
  674. package/dist/test/mcpl-ws-transport.test.js +0 -259
  675. package/dist/test/mcpl-ws-transport.test.js.map +0 -1
  676. package/dist/test/module-context-integration.test.d.ts +0 -18
  677. package/dist/test/module-context-integration.test.d.ts.map +0 -1
  678. package/dist/test/module-context-integration.test.js +0 -181
  679. package/dist/test/module-context-integration.test.js.map +0 -1
  680. package/dist/test/offline-recovery-branch.test.d.ts +0 -2
  681. package/dist/test/offline-recovery-branch.test.d.ts.map +0 -1
  682. package/dist/test/offline-recovery-branch.test.js +0 -570
  683. package/dist/test/offline-recovery-branch.test.js.map +0 -1
  684. package/dist/test/operator-surgery.test.d.ts +0 -2
  685. package/dist/test/operator-surgery.test.d.ts.map +0 -1
  686. package/dist/test/operator-surgery.test.js +0 -595
  687. package/dist/test/operator-surgery.test.js.map +0 -1
  688. package/dist/test/ops-alert.test.d.ts +0 -2
  689. package/dist/test/ops-alert.test.d.ts.map +0 -1
  690. package/dist/test/ops-alert.test.js +0 -153
  691. package/dist/test/ops-alert.test.js.map +0 -1
  692. package/dist/test/overbudget-drain-breaker.test.d.ts +0 -2
  693. package/dist/test/overbudget-drain-breaker.test.d.ts.map +0 -1
  694. package/dist/test/overbudget-drain-breaker.test.js +0 -198
  695. package/dist/test/overbudget-drain-breaker.test.js.map +0 -1
  696. package/dist/test/pack-installs-alone.test.d.ts +0 -2
  697. package/dist/test/pack-installs-alone.test.d.ts.map +0 -1
  698. package/dist/test/pack-installs-alone.test.js +0 -284
  699. package/dist/test/pack-installs-alone.test.js.map +0 -1
  700. package/dist/test/per-agent-delivery.test.d.ts +0 -2
  701. package/dist/test/per-agent-delivery.test.d.ts.map +0 -1
  702. package/dist/test/per-agent-delivery.test.js +0 -108
  703. package/dist/test/per-agent-delivery.test.js.map +0 -1
  704. package/dist/test/physical-window-restart.test.d.ts +0 -16
  705. package/dist/test/physical-window-restart.test.d.ts.map +0 -1
  706. package/dist/test/physical-window-restart.test.js +0 -487
  707. package/dist/test/physical-window-restart.test.js.map +0 -1
  708. package/dist/test/placed-reaction-baseline.test.d.ts +0 -2
  709. package/dist/test/placed-reaction-baseline.test.d.ts.map +0 -1
  710. package/dist/test/placed-reaction-baseline.test.js +0 -312
  711. package/dist/test/placed-reaction-baseline.test.js.map +0 -1
  712. package/dist/test/present-while-acting.test.d.ts +0 -19
  713. package/dist/test/present-while-acting.test.d.ts.map +0 -1
  714. package/dist/test/present-while-acting.test.js +0 -1649
  715. package/dist/test/present-while-acting.test.js.map +0 -1
  716. package/dist/test/prose-segments.test.d.ts +0 -2
  717. package/dist/test/prose-segments.test.d.ts.map +0 -1
  718. package/dist/test/prose-segments.test.js +0 -52
  719. package/dist/test/prose-segments.test.js.map +0 -1
  720. package/dist/test/prose-stream-router.test.d.ts +0 -2
  721. package/dist/test/prose-stream-router.test.d.ts.map +0 -1
  722. package/dist/test/prose-stream-router.test.js +0 -171
  723. package/dist/test/prose-stream-router.test.js.map +0 -1
  724. package/dist/test/provider-acceleration-cooldown.test.d.ts +0 -2
  725. package/dist/test/provider-acceleration-cooldown.test.d.ts.map +0 -1
  726. package/dist/test/provider-acceleration-cooldown.test.js +0 -435
  727. package/dist/test/provider-acceleration-cooldown.test.js.map +0 -1
  728. package/dist/test/provider-waits.test.d.ts +0 -2
  729. package/dist/test/provider-waits.test.d.ts.map +0 -1
  730. package/dist/test/provider-waits.test.js +0 -2259
  731. package/dist/test/provider-waits.test.js.map +0 -1
  732. package/dist/test/puppet-tool-call.test.d.ts +0 -2
  733. package/dist/test/puppet-tool-call.test.d.ts.map +0 -1
  734. package/dist/test/puppet-tool-call.test.js +0 -226
  735. package/dist/test/puppet-tool-call.test.js.map +0 -1
  736. package/dist/test/puppet-turn-reservation.test.d.ts +0 -2
  737. package/dist/test/puppet-turn-reservation.test.d.ts.map +0 -1
  738. package/dist/test/puppet-turn-reservation.test.js +0 -139
  739. package/dist/test/puppet-turn-reservation.test.js.map +0 -1
  740. package/dist/test/reaction-baseline-platform.test.d.ts +0 -2
  741. package/dist/test/reaction-baseline-platform.test.d.ts.map +0 -1
  742. package/dist/test/reaction-baseline-platform.test.js +0 -124
  743. package/dist/test/reaction-baseline-platform.test.js.map +0 -1
  744. package/dist/test/record-journal.test.d.ts +0 -6
  745. package/dist/test/record-journal.test.d.ts.map +0 -1
  746. package/dist/test/record-journal.test.js +0 -269
  747. package/dist/test/record-journal.test.js.map +0 -1
  748. package/dist/test/refusal-reaction-baseline.test.d.ts +0 -2
  749. package/dist/test/refusal-reaction-baseline.test.d.ts.map +0 -1
  750. package/dist/test/refusal-reaction-baseline.test.js +0 -81
  751. package/dist/test/refusal-reaction-baseline.test.js.map +0 -1
  752. package/dist/test/refusal-rewind.test.d.ts +0 -2
  753. package/dist/test/refusal-rewind.test.d.ts.map +0 -1
  754. package/dist/test/refusal-rewind.test.js +0 -117
  755. package/dist/test/refusal-rewind.test.js.map +0 -1
  756. package/dist/test/refusal-single-call.test.d.ts +0 -2
  757. package/dist/test/refusal-single-call.test.d.ts.map +0 -1
  758. package/dist/test/refusal-single-call.test.js +0 -177
  759. package/dist/test/refusal-single-call.test.js.map +0 -1
  760. package/dist/test/release-bump.test.d.ts +0 -2
  761. package/dist/test/release-bump.test.d.ts.map +0 -1
  762. package/dist/test/release-bump.test.js +0 -248
  763. package/dist/test/release-bump.test.js.map +0 -1
  764. package/dist/test/release-changelog.test.d.ts +0 -2
  765. package/dist/test/release-changelog.test.d.ts.map +0 -1
  766. package/dist/test/release-changelog.test.js +0 -159
  767. package/dist/test/release-changelog.test.js.map +0 -1
  768. package/dist/test/release-holds.test.d.ts +0 -2
  769. package/dist/test/release-holds.test.d.ts.map +0 -1
  770. package/dist/test/release-holds.test.js +0 -456
  771. package/dist/test/release-holds.test.js.map +0 -1
  772. package/dist/test/same-round-think-policy.test.d.ts +0 -2
  773. package/dist/test/same-round-think-policy.test.d.ts.map +0 -1
  774. package/dist/test/same-round-think-policy.test.js +0 -853
  775. package/dist/test/same-round-think-policy.test.js.map +0 -1
  776. package/dist/test/save-recent-image.test.d.ts +0 -26
  777. package/dist/test/save-recent-image.test.d.ts.map +0 -1
  778. package/dist/test/save-recent-image.test.js +0 -974
  779. package/dist/test/save-recent-image.test.js.map +0 -1
  780. package/dist/test/shutdown-errors.test.d.ts +0 -2
  781. package/dist/test/shutdown-errors.test.d.ts.map +0 -1
  782. package/dist/test/shutdown-errors.test.js +0 -662
  783. package/dist/test/shutdown-errors.test.js.map +0 -1
  784. package/dist/test/silent-heartbeat-rows.test.d.ts +0 -2
  785. package/dist/test/silent-heartbeat-rows.test.d.ts.map +0 -1
  786. package/dist/test/silent-heartbeat-rows.test.js +0 -451
  787. package/dist/test/silent-heartbeat-rows.test.js.map +0 -1
  788. package/dist/test/silent-heartbeat.test.d.ts +0 -2
  789. package/dist/test/silent-heartbeat.test.d.ts.map +0 -1
  790. package/dist/test/silent-heartbeat.test.js +0 -165
  791. package/dist/test/silent-heartbeat.test.js.map +0 -1
  792. package/dist/test/state-scaling-e2e.test.d.ts +0 -22
  793. package/dist/test/state-scaling-e2e.test.d.ts.map +0 -1
  794. package/dist/test/state-scaling-e2e.test.js +0 -206
  795. package/dist/test/state-scaling-e2e.test.js.map +0 -1
  796. package/dist/test/state-scaling.test.d.ts +0 -12
  797. package/dist/test/state-scaling.test.d.ts.map +0 -1
  798. package/dist/test/state-scaling.test.js +0 -251
  799. package/dist/test/state-scaling.test.js.map +0 -1
  800. package/dist/test/stop-with-host-operations.test.d.ts +0 -20
  801. package/dist/test/stop-with-host-operations.test.d.ts.map +0 -1
  802. package/dist/test/stop-with-host-operations.test.js +0 -1174
  803. package/dist/test/stop-with-host-operations.test.js.map +0 -1
  804. package/dist/test/stop-with-work-in-flight.test.d.ts +0 -23
  805. package/dist/test/stop-with-work-in-flight.test.d.ts.map +0 -1
  806. package/dist/test/stop-with-work-in-flight.test.js +0 -784
  807. package/dist/test/stop-with-work-in-flight.test.js.map +0 -1
  808. package/dist/test/surgery-marks-receipt.test.d.ts +0 -2
  809. package/dist/test/surgery-marks-receipt.test.d.ts.map +0 -1
  810. package/dist/test/surgery-marks-receipt.test.js +0 -540
  811. package/dist/test/surgery-marks-receipt.test.js.map +0 -1
  812. package/dist/test/thinking-token-stamp.test.d.ts +0 -12
  813. package/dist/test/thinking-token-stamp.test.d.ts.map +0 -1
  814. package/dist/test/thinking-token-stamp.test.js +0 -129
  815. package/dist/test/thinking-token-stamp.test.js.map +0 -1
  816. package/dist/test/timezone.test.d.ts +0 -2
  817. package/dist/test/timezone.test.d.ts.map +0 -1
  818. package/dist/test/timezone.test.js +0 -18
  819. package/dist/test/timezone.test.js.map +0 -1
  820. package/dist/test/tool-batch-hook.test.d.ts +0 -8
  821. package/dist/test/tool-batch-hook.test.d.ts.map +0 -1
  822. package/dist/test/tool-batch-hook.test.js +0 -275
  823. package/dist/test/tool-batch-hook.test.js.map +0 -1
  824. package/dist/test/tool-policy.test.d.ts +0 -2
  825. package/dist/test/tool-policy.test.d.ts.map +0 -1
  826. package/dist/test/tool-policy.test.js +0 -51
  827. package/dist/test/tool-policy.test.js.map +0 -1
  828. package/dist/test/tool-presentation.test.d.ts +0 -2
  829. package/dist/test/tool-presentation.test.d.ts.map +0 -1
  830. package/dist/test/tool-presentation.test.js +0 -268
  831. package/dist/test/tool-presentation.test.js.map +0 -1
  832. package/dist/test/tool-result-content.test.d.ts +0 -2
  833. package/dist/test/tool-result-content.test.d.ts.map +0 -1
  834. package/dist/test/tool-result-content.test.js +0 -37
  835. package/dist/test/tool-result-content.test.js.map +0 -1
  836. package/dist/test/tool-result-guard.test.d.ts +0 -2
  837. package/dist/test/tool-result-guard.test.d.ts.map +0 -1
  838. package/dist/test/tool-result-guard.test.js +0 -3729
  839. package/dist/test/tool-result-guard.test.js.map +0 -1
  840. package/dist/test/tool-result-history.test.d.ts +0 -7
  841. package/dist/test/tool-result-history.test.d.ts.map +0 -1
  842. package/dist/test/tool-result-history.test.js +0 -156
  843. package/dist/test/tool-result-history.test.js.map +0 -1
  844. package/dist/test/tool-result-spill.test.d.ts +0 -13
  845. package/dist/test/tool-result-spill.test.d.ts.map +0 -1
  846. package/dist/test/tool-result-spill.test.js +0 -586
  847. package/dist/test/tool-result-spill.test.js.map +0 -1
  848. package/dist/test/tool-wrapper-prose-guard-integration.test.d.ts +0 -2
  849. package/dist/test/tool-wrapper-prose-guard-integration.test.d.ts.map +0 -1
  850. package/dist/test/tool-wrapper-prose-guard-integration.test.js +0 -485
  851. package/dist/test/tool-wrapper-prose-guard-integration.test.js.map +0 -1
  852. package/dist/test/tool-wrapper-prose-guard.test.d.ts +0 -2
  853. package/dist/test/tool-wrapper-prose-guard.test.d.ts.map +0 -1
  854. package/dist/test/tool-wrapper-prose-guard.test.js +0 -34
  855. package/dist/test/tool-wrapper-prose-guard.test.js.map +0 -1
  856. package/dist/test/tools-observe-parser-conformance.test.d.ts +0 -2
  857. package/dist/test/tools-observe-parser-conformance.test.d.ts.map +0 -1
  858. package/dist/test/tools-observe-parser-conformance.test.js +0 -129
  859. package/dist/test/tools-observe-parser-conformance.test.js.map +0 -1
  860. package/dist/test/trunk-channel-routing.test.d.ts +0 -19
  861. package/dist/test/trunk-channel-routing.test.d.ts.map +0 -1
  862. package/dist/test/trunk-channel-routing.test.js +0 -652
  863. package/dist/test/trunk-channel-routing.test.js.map +0 -1
  864. package/dist/test/tune-out-e2e.test.d.ts +0 -2
  865. package/dist/test/tune-out-e2e.test.d.ts.map +0 -1
  866. package/dist/test/tune-out-e2e.test.js +0 -142
  867. package/dist/test/tune-out-e2e.test.js.map +0 -1
  868. package/dist/test/tune-out-gate-composition.test.d.ts +0 -2
  869. package/dist/test/tune-out-gate-composition.test.d.ts.map +0 -1
  870. package/dist/test/tune-out-gate-composition.test.js +0 -221
  871. package/dist/test/tune-out-gate-composition.test.js.map +0 -1
  872. package/dist/test/tune-out-lifecycle.test.d.ts +0 -2
  873. package/dist/test/tune-out-lifecycle.test.d.ts.map +0 -1
  874. package/dist/test/tune-out-lifecycle.test.js +0 -121
  875. package/dist/test/tune-out-lifecycle.test.js.map +0 -1
  876. package/dist/test/turn-trigger-provenance.test.d.ts +0 -2
  877. package/dist/test/turn-trigger-provenance.test.d.ts.map +0 -1
  878. package/dist/test/turn-trigger-provenance.test.js +0 -137
  879. package/dist/test/turn-trigger-provenance.test.js.map +0 -1
  880. package/dist/test/unconvertible-tool-result.test.d.ts +0 -2
  881. package/dist/test/unconvertible-tool-result.test.d.ts.map +0 -1
  882. package/dist/test/unconvertible-tool-result.test.js +0 -358
  883. package/dist/test/unconvertible-tool-result.test.js.map +0 -1
  884. package/dist/test/unsent-compiles.test.d.ts +0 -2
  885. package/dist/test/unsent-compiles.test.d.ts.map +0 -1
  886. package/dist/test/unsent-compiles.test.js +0 -139
  887. package/dist/test/unsent-compiles.test.js.map +0 -1
  888. package/dist/test/usage-accounting.test.d.ts +0 -2
  889. package/dist/test/usage-accounting.test.d.ts.map +0 -1
  890. package/dist/test/usage-accounting.test.js +0 -13
  891. package/dist/test/usage-accounting.test.js.map +0 -1
  892. package/dist/test/usage-tracker.test.d.ts +0 -2
  893. package/dist/test/usage-tracker.test.d.ts.map +0 -1
  894. package/dist/test/usage-tracker.test.js +0 -129
  895. package/dist/test/usage-tracker.test.js.map +0 -1
  896. package/dist/test/utils-surface.test.d.ts +0 -2
  897. package/dist/test/utils-surface.test.d.ts.map +0 -1
  898. package/dist/test/utils-surface.test.js +0 -145
  899. package/dist/test/utils-surface.test.js.map +0 -1
  900. package/dist/test/workspace-branch-continuation.test.d.ts +0 -15
  901. package/dist/test/workspace-branch-continuation.test.d.ts.map +0 -1
  902. package/dist/test/workspace-branch-continuation.test.js +0 -183
  903. package/dist/test/workspace-branch-continuation.test.js.map +0 -1
  904. package/dist/test/workspace-materialize-freshness.test.d.ts +0 -16
  905. package/dist/test/workspace-materialize-freshness.test.d.ts.map +0 -1
  906. package/dist/test/workspace-materialize-freshness.test.js +0 -252
  907. package/dist/test/workspace-materialize-freshness.test.js.map +0 -1
  908. package/dist/test/workspace-path-containment.test.d.ts +0 -19
  909. package/dist/test/workspace-path-containment.test.d.ts.map +0 -1
  910. package/dist/test/workspace-path-containment.test.js +0 -91
  911. package/dist/test/workspace-path-containment.test.js.map +0 -1
  912. package/dist/test/workspace-read-file-from-disk.test.d.ts +0 -17
  913. package/dist/test/workspace-read-file-from-disk.test.d.ts.map +0 -1
  914. package/dist/test/workspace-read-file-from-disk.test.js +0 -174
  915. package/dist/test/workspace-read-file-from-disk.test.js.map +0 -1
  916. package/dist/test/workspace-read-image.test.d.ts +0 -2
  917. package/dist/test/workspace-read-image.test.d.ts.map +0 -1
  918. package/dist/test/workspace-read-image.test.js +0 -597
  919. package/dist/test/workspace-read-image.test.js.map +0 -1
  920. package/dist/test/workspace-read-text.test.d.ts +0 -2
  921. package/dist/test/workspace-read-text.test.d.ts.map +0 -1
  922. package/dist/test/workspace-read-text.test.js +0 -101
  923. package/dist/test/workspace-read-text.test.js.map +0 -1
  924. package/dist/test/workspace-restore-order.test.d.ts +0 -16
  925. package/dist/test/workspace-restore-order.test.d.ts.map +0 -1
  926. package/dist/test/workspace-restore-order.test.js +0 -140
  927. package/dist/test/workspace-restore-order.test.js.map +0 -1
  928. package/dist/test/workspace-three-way.test.d.ts +0 -12
  929. package/dist/test/workspace-three-way.test.d.ts.map +0 -1
  930. package/dist/test/workspace-three-way.test.js +0 -4094
  931. package/dist/test/workspace-three-way.test.js.map +0 -1
  932. package/dist/test/workspace-watcher.test.d.ts +0 -2
  933. package/dist/test/workspace-watcher.test.d.ts.map +0 -1
  934. package/dist/test/workspace-watcher.test.js +0 -281
  935. package/dist/test/workspace-watcher.test.js.map +0 -1
  936. package/dist/test/xml-round-persist.test.d.ts +0 -19
  937. package/dist/test/xml-round-persist.test.d.ts.map +0 -1
  938. package/dist/test/xml-round-persist.test.js +0 -235
  939. package/dist/test/xml-round-persist.test.js.map +0 -1
  940. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -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