@animalabs/agent-framework 0.22.2 → 0.23.0

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