@animalabs/agent-framework 0.22.1 → 0.22.3

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