@animalabs/agent-framework 0.22.2 → 0.22.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (935) hide show
  1. package/README.md +3 -1
  2. package/dist/src/agent.d.ts +77 -12
  3. package/dist/src/agent.d.ts.map +1 -1
  4. package/dist/src/agent.js +136 -40
  5. package/dist/src/agent.js.map +1 -1
  6. package/dist/src/api/mcp-server-core.js +1 -1
  7. package/dist/src/api/mcp-server-core.js.map +1 -1
  8. package/dist/src/api/server.d.ts.map +1 -1
  9. package/dist/src/api/server.js +5 -1
  10. package/dist/src/api/server.js.map +1 -1
  11. package/dist/src/api/types.d.ts +1 -1
  12. package/dist/src/api/types.d.ts.map +1 -1
  13. package/dist/src/branch-names.d.ts +14 -0
  14. package/dist/src/branch-names.d.ts.map +1 -0
  15. package/dist/src/branch-names.js +22 -0
  16. package/dist/src/branch-names.js.map +1 -0
  17. package/dist/src/closest-names.d.ts +28 -0
  18. package/dist/src/closest-names.d.ts.map +1 -0
  19. package/dist/src/closest-names.js +98 -0
  20. package/dist/src/closest-names.js.map +1 -0
  21. package/dist/src/code-execution/py-runner.d.ts +16 -5
  22. package/dist/src/code-execution/py-runner.d.ts.map +1 -1
  23. package/dist/src/code-execution/py-runner.js +186 -74
  24. package/dist/src/code-execution/py-runner.js.map +1 -1
  25. package/dist/src/code-execution/runtime-py.d.ts.map +1 -1
  26. package/dist/src/code-execution/runtime-py.js +49 -3
  27. package/dist/src/code-execution/runtime-py.js.map +1 -1
  28. package/dist/src/code-execution/tool-definition.d.ts +12 -1
  29. package/dist/src/code-execution/tool-definition.d.ts.map +1 -1
  30. package/dist/src/code-execution/tool-definition.js +21 -3
  31. package/dist/src/code-execution/tool-definition.js.map +1 -1
  32. package/dist/src/config-checks.d.ts +28 -0
  33. package/dist/src/config-checks.d.ts.map +1 -0
  34. package/dist/src/config-checks.js +52 -0
  35. package/dist/src/config-checks.js.map +1 -0
  36. package/dist/src/deadline-timer.d.ts +21 -0
  37. package/dist/src/deadline-timer.d.ts.map +1 -0
  38. package/dist/src/deadline-timer.js +43 -0
  39. package/dist/src/deadline-timer.js.map +1 -0
  40. package/dist/src/error-message.d.ts +30 -0
  41. package/dist/src/error-message.d.ts.map +1 -0
  42. package/dist/src/error-message.js +50 -0
  43. package/dist/src/error-message.js.map +1 -0
  44. package/dist/src/framework.d.ts +828 -88
  45. package/dist/src/framework.d.ts.map +1 -1
  46. package/dist/src/framework.js +5011 -1326
  47. package/dist/src/framework.js.map +1 -1
  48. package/dist/src/gate/event-gate.d.ts +8 -0
  49. package/dist/src/gate/event-gate.d.ts.map +1 -1
  50. package/dist/src/gate/event-gate.js +27 -3
  51. package/dist/src/gate/event-gate.js.map +1 -1
  52. package/dist/src/index.d.ts +4 -2
  53. package/dist/src/index.d.ts.map +1 -1
  54. package/dist/src/index.js +4 -2
  55. package/dist/src/index.js.map +1 -1
  56. package/dist/src/mcpl/channel-registry.d.ts +144 -6
  57. package/dist/src/mcpl/channel-registry.d.ts.map +1 -1
  58. package/dist/src/mcpl/channel-registry.js +424 -263
  59. package/dist/src/mcpl/channel-registry.js.map +1 -1
  60. package/dist/src/mcpl/checkpoint-manager.d.ts +21 -1
  61. package/dist/src/mcpl/checkpoint-manager.d.ts.map +1 -1
  62. package/dist/src/mcpl/checkpoint-manager.js +91 -30
  63. package/dist/src/mcpl/checkpoint-manager.js.map +1 -1
  64. package/dist/src/mcpl/conversation-router.d.ts +19 -3
  65. package/dist/src/mcpl/conversation-router.d.ts.map +1 -1
  66. package/dist/src/mcpl/conversation-router.js +23 -8
  67. package/dist/src/mcpl/conversation-router.js.map +1 -1
  68. package/dist/src/mcpl/convert-block.d.ts +20 -0
  69. package/dist/src/mcpl/convert-block.d.ts.map +1 -0
  70. package/dist/src/mcpl/convert-block.js +89 -0
  71. package/dist/src/mcpl/convert-block.js.map +1 -0
  72. package/dist/src/mcpl/errors.d.ts +13 -0
  73. package/dist/src/mcpl/errors.d.ts.map +1 -1
  74. package/dist/src/mcpl/errors.js +28 -0
  75. package/dist/src/mcpl/errors.js.map +1 -1
  76. package/dist/src/mcpl/hook-orchestrator.d.ts +23 -0
  77. package/dist/src/mcpl/hook-orchestrator.d.ts.map +1 -1
  78. package/dist/src/mcpl/hook-orchestrator.js +83 -72
  79. package/dist/src/mcpl/hook-orchestrator.js.map +1 -1
  80. package/dist/src/mcpl/inbound-source.d.ts +114 -0
  81. package/dist/src/mcpl/inbound-source.d.ts.map +1 -0
  82. package/dist/src/mcpl/inbound-source.js +83 -0
  83. package/dist/src/mcpl/inbound-source.js.map +1 -0
  84. package/dist/src/mcpl/index.d.ts +3 -1
  85. package/dist/src/mcpl/index.d.ts.map +1 -1
  86. package/dist/src/mcpl/index.js +3 -1
  87. package/dist/src/mcpl/index.js.map +1 -1
  88. package/dist/src/mcpl/inference-router.d.ts +15 -11
  89. package/dist/src/mcpl/inference-router.d.ts.map +1 -1
  90. package/dist/src/mcpl/inference-router.js +153 -84
  91. package/dist/src/mcpl/inference-router.js.map +1 -1
  92. package/dist/src/mcpl/push-coalescer.d.ts +33 -11
  93. package/dist/src/mcpl/push-coalescer.d.ts.map +1 -1
  94. package/dist/src/mcpl/push-coalescer.js +52 -20
  95. package/dist/src/mcpl/push-coalescer.js.map +1 -1
  96. package/dist/src/mcpl/push-handler.d.ts +16 -9
  97. package/dist/src/mcpl/push-handler.d.ts.map +1 -1
  98. package/dist/src/mcpl/push-handler.js +18 -83
  99. package/dist/src/mcpl/push-handler.js.map +1 -1
  100. package/dist/src/mcpl/reference-fetcher.d.ts +14 -2
  101. package/dist/src/mcpl/reference-fetcher.d.ts.map +1 -1
  102. package/dist/src/mcpl/reference-fetcher.js +72 -30
  103. package/dist/src/mcpl/reference-fetcher.js.map +1 -1
  104. package/dist/src/mcpl/references.d.ts +47 -12
  105. package/dist/src/mcpl/references.d.ts.map +1 -1
  106. package/dist/src/mcpl/references.js +74 -21
  107. package/dist/src/mcpl/references.js.map +1 -1
  108. package/dist/src/mcpl/server-connection.d.ts +89 -10
  109. package/dist/src/mcpl/server-connection.d.ts.map +1 -1
  110. package/dist/src/mcpl/server-connection.js +405 -129
  111. package/dist/src/mcpl/server-connection.js.map +1 -1
  112. package/dist/src/mcpl/server-registry.d.ts +10 -1
  113. package/dist/src/mcpl/server-registry.d.ts.map +1 -1
  114. package/dist/src/mcpl/server-registry.js +14 -3
  115. package/dist/src/mcpl/server-registry.js.map +1 -1
  116. package/dist/src/mcpl/skip-reply-wake.d.ts +36 -0
  117. package/dist/src/mcpl/skip-reply-wake.d.ts.map +1 -0
  118. package/dist/src/mcpl/skip-reply-wake.js +55 -0
  119. package/dist/src/mcpl/skip-reply-wake.js.map +1 -0
  120. package/dist/src/mcpl/transport.d.ts +51 -2
  121. package/dist/src/mcpl/transport.d.ts.map +1 -1
  122. package/dist/src/mcpl/transport.js +114 -20
  123. package/dist/src/mcpl/transport.js.map +1 -1
  124. package/dist/src/mcpl/types.d.ts +14 -3
  125. package/dist/src/mcpl/types.d.ts.map +1 -1
  126. package/dist/src/mcpl/types.js.map +1 -1
  127. package/dist/src/mcpl/visible-content.d.ts +15 -0
  128. package/dist/src/mcpl/visible-content.d.ts.map +1 -1
  129. package/dist/src/mcpl/visible-content.js +25 -0
  130. package/dist/src/mcpl/visible-content.js.map +1 -1
  131. package/dist/src/module-registry.d.ts +19 -1
  132. package/dist/src/module-registry.d.ts.map +1 -1
  133. package/dist/src/module-registry.js +54 -25
  134. package/dist/src/module-registry.js.map +1 -1
  135. package/dist/src/modules/api/index.js +1 -1
  136. package/dist/src/modules/api/index.js.map +1 -1
  137. package/dist/src/modules/discord/discord-js-client.d.ts +1 -0
  138. package/dist/src/modules/discord/discord-js-client.d.ts.map +1 -1
  139. package/dist/src/modules/discord/discord-js-client.js +25 -9
  140. package/dist/src/modules/discord/discord-js-client.js.map +1 -1
  141. package/dist/src/modules/discord/index.d.ts +29 -3
  142. package/dist/src/modules/discord/index.d.ts.map +1 -1
  143. package/dist/src/modules/discord/index.js +379 -143
  144. package/dist/src/modules/discord/index.js.map +1 -1
  145. package/dist/src/modules/discord/types.d.ts +14 -1
  146. package/dist/src/modules/discord/types.d.ts.map +1 -1
  147. package/dist/src/modules/health/index.d.ts.map +1 -1
  148. package/dist/src/modules/health/index.js +2 -1
  149. package/dist/src/modules/health/index.js.map +1 -1
  150. package/dist/src/modules/history/index.d.ts +3 -1
  151. package/dist/src/modules/history/index.d.ts.map +1 -1
  152. package/dist/src/modules/history/index.js +359 -127
  153. package/dist/src/modules/history/index.js.map +1 -1
  154. package/dist/src/modules/history/semantic.d.ts +28 -1
  155. package/dist/src/modules/history/semantic.d.ts.map +1 -1
  156. package/dist/src/modules/history/semantic.js +177 -32
  157. package/dist/src/modules/history/semantic.js.map +1 -1
  158. package/dist/src/modules/unknown-tool.d.ts +10 -0
  159. package/dist/src/modules/unknown-tool.d.ts.map +1 -0
  160. package/dist/src/modules/unknown-tool.js +17 -0
  161. package/dist/src/modules/unknown-tool.js.map +1 -0
  162. package/dist/src/modules/workspace/disk-agreement.d.ts +32 -2
  163. package/dist/src/modules/workspace/disk-agreement.d.ts.map +1 -1
  164. package/dist/src/modules/workspace/disk-agreement.js +30 -2
  165. package/dist/src/modules/workspace/disk-agreement.js.map +1 -1
  166. package/dist/src/modules/workspace/effects.d.ts +64 -6
  167. package/dist/src/modules/workspace/effects.d.ts.map +1 -1
  168. package/dist/src/modules/workspace/effects.js +291 -44
  169. package/dist/src/modules/workspace/effects.js.map +1 -1
  170. package/dist/src/modules/workspace/index.d.ts +119 -23
  171. package/dist/src/modules/workspace/index.d.ts.map +1 -1
  172. package/dist/src/modules/workspace/index.js +793 -247
  173. package/dist/src/modules/workspace/index.js.map +1 -1
  174. package/dist/src/modules/workspace/observe.d.ts +75 -8
  175. package/dist/src/modules/workspace/observe.d.ts.map +1 -1
  176. package/dist/src/modules/workspace/observe.js +174 -14
  177. package/dist/src/modules/workspace/observe.js.map +1 -1
  178. package/dist/src/modules/workspace/reconcile.d.ts +58 -7
  179. package/dist/src/modules/workspace/reconcile.d.ts.map +1 -1
  180. package/dist/src/modules/workspace/reconcile.js +521 -56
  181. package/dist/src/modules/workspace/reconcile.js.map +1 -1
  182. package/dist/src/modules/workspace/types.d.ts +18 -4
  183. package/dist/src/modules/workspace/types.d.ts.map +1 -1
  184. package/dist/src/modules/workspace/types.js.map +1 -1
  185. package/dist/src/modules/workspace/watcher.d.ts +7 -2
  186. package/dist/src/modules/workspace/watcher.d.ts.map +1 -1
  187. package/dist/src/modules/workspace/watcher.js +28 -4
  188. package/dist/src/modules/workspace/watcher.js.map +1 -1
  189. package/dist/src/prose-drafts.d.ts +240 -0
  190. package/dist/src/prose-drafts.d.ts.map +1 -0
  191. package/dist/src/prose-drafts.js +362 -0
  192. package/dist/src/prose-drafts.js.map +1 -0
  193. package/dist/src/prose-segments.d.ts +21 -2
  194. package/dist/src/prose-segments.d.ts.map +1 -1
  195. package/dist/src/prose-segments.js +46 -9
  196. package/dist/src/prose-segments.js.map +1 -1
  197. package/dist/src/recovery/offline-branch.d.ts +1 -0
  198. package/dist/src/recovery/offline-branch.d.ts.map +1 -1
  199. package/dist/src/recovery/offline-branch.js +3 -1
  200. package/dist/src/recovery/offline-branch.js.map +1 -1
  201. package/dist/src/safe-slice.d.ts +5 -1
  202. package/dist/src/safe-slice.d.ts.map +1 -1
  203. package/dist/src/safe-slice.js +9 -1
  204. package/dist/src/safe-slice.js.map +1 -1
  205. package/dist/src/tool-image-ledger.d.ts +87 -19
  206. package/dist/src/tool-image-ledger.d.ts.map +1 -1
  207. package/dist/src/tool-image-ledger.js +135 -32
  208. package/dist/src/tool-image-ledger.js.map +1 -1
  209. package/dist/src/tool-presentation.d.ts +9 -0
  210. package/dist/src/tool-presentation.d.ts.map +1 -1
  211. package/dist/src/tool-presentation.js +257 -60
  212. package/dist/src/tool-presentation.js.map +1 -1
  213. package/dist/src/tool-result-guard.d.ts.map +1 -1
  214. package/dist/src/tool-result-guard.js +7 -10
  215. package/dist/src/tool-result-guard.js.map +1 -1
  216. package/dist/src/tool-result-history.d.ts +32 -3
  217. package/dist/src/tool-result-history.d.ts.map +1 -1
  218. package/dist/src/tool-result-history.js +106 -19
  219. package/dist/src/tool-result-history.js.map +1 -1
  220. package/dist/src/tune-out/coordinator.d.ts +25 -1
  221. package/dist/src/tune-out/coordinator.d.ts.map +1 -1
  222. package/dist/src/tune-out/coordinator.js +260 -65
  223. package/dist/src/tune-out/coordinator.js.map +1 -1
  224. package/dist/src/types/agent.d.ts +17 -5
  225. package/dist/src/types/agent.d.ts.map +1 -1
  226. package/dist/src/types/events.d.ts +17 -0
  227. package/dist/src/types/events.d.ts.map +1 -1
  228. package/dist/src/types/framework.d.ts +21 -5
  229. package/dist/src/types/framework.d.ts.map +1 -1
  230. package/dist/src/types/inference-log.d.ts +1 -1
  231. package/dist/src/types/inference-log.d.ts.map +1 -1
  232. package/dist/src/types/module.d.ts +23 -4
  233. package/dist/src/types/module.d.ts.map +1 -1
  234. package/dist/src/types/trace.d.ts +95 -6
  235. package/dist/src/types/trace.d.ts.map +1 -1
  236. package/dist/src/usage/usage-tracker.d.ts +5 -0
  237. package/dist/src/usage/usage-tracker.d.ts.map +1 -1
  238. package/dist/src/usage/usage-tracker.js +35 -8
  239. package/dist/src/usage/usage-tracker.js.map +1 -1
  240. package/package.json +3 -4
  241. package/src/agent.ts +162 -40
  242. package/src/api/mcp-server-core.ts +1 -1
  243. package/src/api/server.ts +4 -1
  244. package/src/api/types.ts +1 -1
  245. package/src/branch-names.ts +19 -0
  246. package/src/closest-names.ts +94 -0
  247. package/src/code-execution/py-runner.ts +200 -76
  248. package/src/code-execution/runtime-py.ts +49 -3
  249. package/src/code-execution/tool-definition.ts +28 -4
  250. package/src/config-checks.ts +48 -0
  251. package/src/deadline-timer.ts +44 -0
  252. package/src/error-message.ts +48 -0
  253. package/src/framework.ts +5352 -1388
  254. package/src/gate/event-gate.ts +28 -3
  255. package/src/index.ts +11 -2
  256. package/src/mcpl/channel-registry.ts +517 -286
  257. package/src/mcpl/checkpoint-manager.ts +104 -29
  258. package/src/mcpl/conversation-router.ts +28 -8
  259. package/src/mcpl/convert-block.ts +97 -0
  260. package/src/mcpl/errors.ts +28 -0
  261. package/src/mcpl/hook-orchestrator.ts +84 -77
  262. package/src/mcpl/inbound-source.ts +156 -0
  263. package/src/mcpl/index.ts +10 -1
  264. package/src/mcpl/inference-router.ts +174 -99
  265. package/src/mcpl/push-coalescer.ts +60 -24
  266. package/src/mcpl/push-handler.ts +20 -90
  267. package/src/mcpl/reference-fetcher.ts +71 -26
  268. package/src/mcpl/references.ts +81 -22
  269. package/src/mcpl/server-connection.ts +427 -132
  270. package/src/mcpl/server-registry.ts +15 -4
  271. package/src/mcpl/skip-reply-wake.ts +73 -0
  272. package/src/mcpl/transport.ts +120 -18
  273. package/src/mcpl/types.ts +14 -3
  274. package/src/mcpl/visible-content.ts +27 -0
  275. package/src/module-registry.ts +58 -23
  276. package/src/modules/api/index.ts +1 -1
  277. package/src/modules/discord/discord-js-client.ts +26 -10
  278. package/src/modules/discord/index.ts +391 -158
  279. package/src/modules/discord/types.ts +15 -2
  280. package/src/modules/health/index.ts +2 -1
  281. package/src/modules/history/index.ts +410 -120
  282. package/src/modules/history/semantic.ts +189 -32
  283. package/src/modules/unknown-tool.ts +16 -0
  284. package/src/modules/workspace/disk-agreement.ts +51 -3
  285. package/src/modules/workspace/effects.ts +279 -35
  286. package/src/modules/workspace/index.ts +810 -260
  287. package/src/modules/workspace/observe.ts +194 -20
  288. package/src/modules/workspace/reconcile.ts +619 -64
  289. package/src/modules/workspace/types.ts +18 -4
  290. package/src/modules/workspace/watcher.ts +27 -4
  291. package/src/prose-drafts.ts +481 -0
  292. package/src/prose-segments.ts +51 -8
  293. package/src/recovery/offline-branch.ts +4 -1
  294. package/src/safe-slice.ts +9 -1
  295. package/src/tool-image-ledger.ts +153 -34
  296. package/src/tool-presentation.ts +224 -40
  297. package/src/tool-result-guard.ts +7 -8
  298. package/src/tool-result-history.ts +124 -20
  299. package/src/tune-out/coordinator.ts +259 -65
  300. package/src/types/agent.ts +17 -7
  301. package/src/types/events.ts +17 -0
  302. package/src/types/framework.ts +21 -5
  303. package/src/types/inference-log.ts +1 -1
  304. package/src/types/module.ts +24 -4
  305. package/src/types/trace.ts +101 -6
  306. package/src/usage/usage-tracker.ts +32 -8
  307. package/dist/test/activation-request-sanitize.test.d.ts +0 -2
  308. package/dist/test/activation-request-sanitize.test.d.ts.map +0 -1
  309. package/dist/test/activation-request-sanitize.test.js +0 -89
  310. package/dist/test/activation-request-sanitize.test.js.map +0 -1
  311. package/dist/test/agent-cache-ttl.test.d.ts +0 -2
  312. package/dist/test/agent-cache-ttl.test.d.ts.map +0 -1
  313. package/dist/test/agent-cache-ttl.test.js +0 -41
  314. package/dist/test/agent-cache-ttl.test.js.map +0 -1
  315. package/dist/test/agent-runtime-settings.test.d.ts +0 -2
  316. package/dist/test/agent-runtime-settings.test.d.ts.map +0 -1
  317. package/dist/test/agent-runtime-settings.test.js +0 -1598
  318. package/dist/test/agent-runtime-settings.test.js.map +0 -1
  319. package/dist/test/api-admin-gate.test.d.ts +0 -2
  320. package/dist/test/api-admin-gate.test.d.ts.map +0 -1
  321. package/dist/test/api-admin-gate.test.js +0 -116
  322. package/dist/test/api-admin-gate.test.js.map +0 -1
  323. package/dist/test/assistant-persist-refusal.test.d.ts +0 -2
  324. package/dist/test/assistant-persist-refusal.test.d.ts.map +0 -1
  325. package/dist/test/assistant-persist-refusal.test.js +0 -63
  326. package/dist/test/assistant-persist-refusal.test.js.map +0 -1
  327. package/dist/test/batched-wake-locus.test.d.ts +0 -2
  328. package/dist/test/batched-wake-locus.test.d.ts.map +0 -1
  329. package/dist/test/batched-wake-locus.test.js +0 -166
  330. package/dist/test/batched-wake-locus.test.js.map +0 -1
  331. package/dist/test/busy-agent-scheduler.test.d.ts +0 -2
  332. package/dist/test/busy-agent-scheduler.test.d.ts.map +0 -1
  333. package/dist/test/busy-agent-scheduler.test.js +0 -92
  334. package/dist/test/busy-agent-scheduler.test.js.map +0 -1
  335. package/dist/test/channel-incoming-targeting.test.d.ts +0 -2
  336. package/dist/test/channel-incoming-targeting.test.d.ts.map +0 -1
  337. package/dist/test/channel-incoming-targeting.test.js +0 -81
  338. package/dist/test/channel-incoming-targeting.test.js.map +0 -1
  339. package/dist/test/channel-label-history.test.d.ts +0 -2
  340. package/dist/test/channel-label-history.test.d.ts.map +0 -1
  341. package/dist/test/channel-label-history.test.js +0 -424
  342. package/dist/test/channel-label-history.test.js.map +0 -1
  343. package/dist/test/channel-lifecycle-provenance.test.d.ts +0 -2
  344. package/dist/test/channel-lifecycle-provenance.test.d.ts.map +0 -1
  345. package/dist/test/channel-lifecycle-provenance.test.js +0 -47
  346. package/dist/test/channel-lifecycle-provenance.test.js.map +0 -1
  347. package/dist/test/channel-registry-routing.test.d.ts +0 -2
  348. package/dist/test/channel-registry-routing.test.d.ts.map +0 -1
  349. package/dist/test/channel-registry-routing.test.js +0 -446
  350. package/dist/test/channel-registry-routing.test.js.map +0 -1
  351. package/dist/test/channel-registry-typing.test.d.ts +0 -2
  352. package/dist/test/channel-registry-typing.test.d.ts.map +0 -1
  353. package/dist/test/channel-registry-typing.test.js +0 -91
  354. package/dist/test/channel-registry-typing.test.js.map +0 -1
  355. package/dist/test/channels-changed-respond-first.test.d.ts +0 -2
  356. package/dist/test/channels-changed-respond-first.test.d.ts.map +0 -1
  357. package/dist/test/channels-changed-respond-first.test.js +0 -74
  358. package/dist/test/channels-changed-respond-first.test.js.map +0 -1
  359. package/dist/test/checkpoint-attribution.test.d.ts +0 -2
  360. package/dist/test/checkpoint-attribution.test.d.ts.map +0 -1
  361. package/dist/test/checkpoint-attribution.test.js +0 -200
  362. package/dist/test/checkpoint-attribution.test.js.map +0 -1
  363. package/dist/test/code-execution.test.d.ts +0 -11
  364. package/dist/test/code-execution.test.d.ts.map +0 -1
  365. package/dist/test/code-execution.test.js +0 -1272
  366. package/dist/test/code-execution.test.js.map +0 -1
  367. package/dist/test/component-defaults.test.d.ts +0 -2
  368. package/dist/test/component-defaults.test.d.ts.map +0 -1
  369. package/dist/test/component-defaults.test.js +0 -54
  370. package/dist/test/component-defaults.test.js.map +0 -1
  371. package/dist/test/conversation-fork-injection-scoping.test.d.ts +0 -2
  372. package/dist/test/conversation-fork-injection-scoping.test.d.ts.map +0 -1
  373. package/dist/test/conversation-fork-injection-scoping.test.js +0 -200
  374. package/dist/test/conversation-fork-injection-scoping.test.js.map +0 -1
  375. package/dist/test/conversation-router.test.d.ts +0 -2
  376. package/dist/test/conversation-router.test.d.ts.map +0 -1
  377. package/dist/test/conversation-router.test.js +0 -174
  378. package/dist/test/conversation-router.test.js.map +0 -1
  379. package/dist/test/conversation-routing.test.d.ts +0 -7
  380. package/dist/test/conversation-routing.test.d.ts.map +0 -1
  381. package/dist/test/conversation-routing.test.js +0 -621
  382. package/dist/test/conversation-routing.test.js.map +0 -1
  383. package/dist/test/deferred-wake-integrity.test.d.ts +0 -29
  384. package/dist/test/deferred-wake-integrity.test.d.ts.map +0 -1
  385. package/dist/test/deferred-wake-integrity.test.js +0 -320
  386. package/dist/test/deferred-wake-integrity.test.js.map +0 -1
  387. package/dist/test/discord-awareness-outbox.test.d.ts +0 -2
  388. package/dist/test/discord-awareness-outbox.test.d.ts.map +0 -1
  389. package/dist/test/discord-awareness-outbox.test.js +0 -371
  390. package/dist/test/discord-awareness-outbox.test.js.map +0 -1
  391. package/dist/test/discord-history-delete-window.test.d.ts +0 -2
  392. package/dist/test/discord-history-delete-window.test.d.ts.map +0 -1
  393. package/dist/test/discord-history-delete-window.test.js +0 -81
  394. package/dist/test/discord-history-delete-window.test.js.map +0 -1
  395. package/dist/test/discord-history-sync.test.d.ts +0 -2
  396. package/dist/test/discord-history-sync.test.d.ts.map +0 -1
  397. package/dist/test/discord-history-sync.test.js +0 -56
  398. package/dist/test/discord-history-sync.test.js.map +0 -1
  399. package/dist/test/discord-typing-keepalive.test.d.ts +0 -2
  400. package/dist/test/discord-typing-keepalive.test.d.ts.map +0 -1
  401. package/dist/test/discord-typing-keepalive.test.js +0 -77
  402. package/dist/test/discord-typing-keepalive.test.js.map +0 -1
  403. package/dist/test/ephemeral-settle.test.d.ts +0 -2
  404. package/dist/test/ephemeral-settle.test.d.ts.map +0 -1
  405. package/dist/test/ephemeral-settle.test.js +0 -354
  406. package/dist/test/ephemeral-settle.test.js.map +0 -1
  407. package/dist/test/event-gate-passthrough.test.d.ts +0 -15
  408. package/dist/test/event-gate-passthrough.test.d.ts.map +0 -1
  409. package/dist/test/event-gate-passthrough.test.js +0 -289
  410. package/dist/test/event-gate-passthrough.test.js.map +0 -1
  411. package/dist/test/event-gate-policy-mutation.test.d.ts +0 -2
  412. package/dist/test/event-gate-policy-mutation.test.d.ts.map +0 -1
  413. package/dist/test/event-gate-policy-mutation.test.js +0 -137
  414. package/dist/test/event-gate-policy-mutation.test.js.map +0 -1
  415. package/dist/test/event-gate-rate-limit.test.d.ts +0 -2
  416. package/dist/test/event-gate-rate-limit.test.d.ts.map +0 -1
  417. package/dist/test/event-gate-rate-limit.test.js +0 -627
  418. package/dist/test/event-gate-rate-limit.test.js.map +0 -1
  419. package/dist/test/event-gate-script.test.d.ts +0 -2
  420. package/dist/test/event-gate-script.test.d.ts.map +0 -1
  421. package/dist/test/event-gate-script.test.js +0 -95
  422. package/dist/test/event-gate-script.test.js.map +0 -1
  423. package/dist/test/event-gate-selfwake.test.d.ts +0 -15
  424. package/dist/test/event-gate-selfwake.test.d.ts.map +0 -1
  425. package/dist/test/event-gate-selfwake.test.js +0 -125
  426. package/dist/test/event-gate-selfwake.test.js.map +0 -1
  427. package/dist/test/event-gate-tags.test.d.ts +0 -2
  428. package/dist/test/event-gate-tags.test.d.ts.map +0 -1
  429. package/dist/test/event-gate-tags.test.js +0 -76
  430. package/dist/test/event-gate-tags.test.js.map +0 -1
  431. package/dist/test/event-gate.test.d.ts +0 -2
  432. package/dist/test/event-gate.test.d.ts.map +0 -1
  433. package/dist/test/event-gate.test.js +0 -919
  434. package/dist/test/event-gate.test.js.map +0 -1
  435. package/dist/test/explicit-prose-routing.test.d.ts +0 -11
  436. package/dist/test/explicit-prose-routing.test.d.ts.map +0 -1
  437. package/dist/test/explicit-prose-routing.test.js +0 -1715
  438. package/dist/test/explicit-prose-routing.test.js.map +0 -1
  439. package/dist/test/framework.test.d.ts +0 -5
  440. package/dist/test/framework.test.d.ts.map +0 -1
  441. package/dist/test/framework.test.js +0 -1048
  442. package/dist/test/framework.test.js.map +0 -1
  443. package/dist/test/gather-context-timeout.test.d.ts +0 -2
  444. package/dist/test/gather-context-timeout.test.d.ts.map +0 -1
  445. package/dist/test/gather-context-timeout.test.js +0 -120
  446. package/dist/test/gather-context-timeout.test.js.map +0 -1
  447. package/dist/test/health-snapshot.test.d.ts +0 -2
  448. package/dist/test/health-snapshot.test.d.ts.map +0 -1
  449. package/dist/test/health-snapshot.test.js +0 -74
  450. package/dist/test/health-snapshot.test.js.map +0 -1
  451. package/dist/test/helpers/coalescing-fixture.d.ts +0 -74
  452. package/dist/test/helpers/coalescing-fixture.d.ts.map +0 -1
  453. package/dist/test/helpers/coalescing-fixture.js +0 -152
  454. package/dist/test/helpers/coalescing-fixture.js.map +0 -1
  455. package/dist/test/helpers/coalescing-kill-child.d.ts +0 -2
  456. package/dist/test/helpers/coalescing-kill-child.d.ts.map +0 -1
  457. package/dist/test/helpers/coalescing-kill-child.js +0 -24
  458. package/dist/test/helpers/coalescing-kill-child.js.map +0 -1
  459. package/dist/test/helpers/mock-membrane.d.ts +0 -53
  460. package/dist/test/helpers/mock-membrane.d.ts.map +0 -1
  461. package/dist/test/helpers/mock-membrane.js +0 -168
  462. package/dist/test/helpers/mock-membrane.js.map +0 -1
  463. package/dist/test/helpers/pytc-stop-rows.d.ts +0 -11
  464. package/dist/test/helpers/pytc-stop-rows.d.ts.map +0 -1
  465. package/dist/test/helpers/pytc-stop-rows.js +0 -143
  466. package/dist/test/helpers/pytc-stop-rows.js.map +0 -1
  467. package/dist/test/helpers/quiesce-crash-child.d.ts +0 -2
  468. package/dist/test/helpers/quiesce-crash-child.d.ts.map +0 -1
  469. package/dist/test/helpers/quiesce-crash-child.js +0 -156
  470. package/dist/test/helpers/quiesce-crash-child.js.map +0 -1
  471. package/dist/test/hide-then-turn.test.d.ts +0 -2
  472. package/dist/test/hide-then-turn.test.d.ts.map +0 -1
  473. package/dist/test/hide-then-turn.test.js +0 -101
  474. package/dist/test/hide-then-turn.test.js.map +0 -1
  475. package/dist/test/history-module-overview.test.d.ts +0 -2
  476. package/dist/test/history-module-overview.test.d.ts.map +0 -1
  477. package/dist/test/history-module-overview.test.js +0 -711
  478. package/dist/test/history-module-overview.test.js.map +0 -1
  479. package/dist/test/history-module-realstore.test.d.ts +0 -2
  480. package/dist/test/history-module-realstore.test.d.ts.map +0 -1
  481. package/dist/test/history-module-realstore.test.js +0 -363
  482. package/dist/test/history-module-realstore.test.js.map +0 -1
  483. package/dist/test/history-module-semantic.test.d.ts +0 -2
  484. package/dist/test/history-module-semantic.test.d.ts.map +0 -1
  485. package/dist/test/history-module-semantic.test.js +0 -213
  486. package/dist/test/history-module-semantic.test.js.map +0 -1
  487. package/dist/test/history-module-ux.test.d.ts +0 -2
  488. package/dist/test/history-module-ux.test.d.ts.map +0 -1
  489. package/dist/test/history-module-ux.test.js +0 -304
  490. package/dist/test/history-module-ux.test.js.map +0 -1
  491. package/dist/test/history-module.test.d.ts +0 -2
  492. package/dist/test/history-module.test.d.ts.map +0 -1
  493. package/dist/test/history-module.test.js +0 -619
  494. package/dist/test/history-module.test.js.map +0 -1
  495. package/dist/test/history-semantic-review-findings.test.d.ts +0 -2
  496. package/dist/test/history-semantic-review-findings.test.d.ts.map +0 -1
  497. package/dist/test/history-semantic-review-findings.test.js +0 -338
  498. package/dist/test/history-semantic-review-findings.test.js.map +0 -1
  499. package/dist/test/history-semantic-sync-converges.test.d.ts +0 -2
  500. package/dist/test/history-semantic-sync-converges.test.d.ts.map +0 -1
  501. package/dist/test/history-semantic-sync-converges.test.js +0 -109
  502. package/dist/test/history-semantic-sync-converges.test.js.map +0 -1
  503. package/dist/test/host-quiesce.test.d.ts +0 -2
  504. package/dist/test/host-quiesce.test.d.ts.map +0 -1
  505. package/dist/test/host-quiesce.test.js +0 -988
  506. package/dist/test/host-quiesce.test.js.map +0 -1
  507. package/dist/test/inference-exhaustion-rewind.test.d.ts +0 -2
  508. package/dist/test/inference-exhaustion-rewind.test.d.ts.map +0 -1
  509. package/dist/test/inference-exhaustion-rewind.test.js +0 -387
  510. package/dist/test/inference-exhaustion-rewind.test.js.map +0 -1
  511. package/dist/test/inference-failure-bounds.test.d.ts +0 -2
  512. package/dist/test/inference-failure-bounds.test.d.ts.map +0 -1
  513. package/dist/test/inference-failure-bounds.test.js +0 -1202
  514. package/dist/test/inference-failure-bounds.test.js.map +0 -1
  515. package/dist/test/inference-failure-observability.test.d.ts +0 -2
  516. package/dist/test/inference-failure-observability.test.d.ts.map +0 -1
  517. package/dist/test/inference-failure-observability.test.js +0 -84
  518. package/dist/test/inference-failure-observability.test.js.map +0 -1
  519. package/dist/test/journal-tool.test.d.ts +0 -2
  520. package/dist/test/journal-tool.test.d.ts.map +0 -1
  521. package/dist/test/journal-tool.test.js +0 -33
  522. package/dist/test/journal-tool.test.js.map +0 -1
  523. package/dist/test/kv-unified-open-flight-retry.test.d.ts +0 -2
  524. package/dist/test/kv-unified-open-flight-retry.test.d.ts.map +0 -1
  525. package/dist/test/kv-unified-open-flight-retry.test.js +0 -189
  526. package/dist/test/kv-unified-open-flight-retry.test.js.map +0 -1
  527. package/dist/test/kv-unified-wiring.test.d.ts +0 -2
  528. package/dist/test/kv-unified-wiring.test.d.ts.map +0 -1
  529. package/dist/test/kv-unified-wiring.test.js +0 -95
  530. package/dist/test/kv-unified-wiring.test.js.map +0 -1
  531. package/dist/test/late-events-after-stop.test.d.ts +0 -2
  532. package/dist/test/late-events-after-stop.test.d.ts.map +0 -1
  533. package/dist/test/late-events-after-stop.test.js +0 -122
  534. package/dist/test/late-events-after-stop.test.js.map +0 -1
  535. package/dist/test/liveness-watchdog.test.d.ts +0 -2
  536. package/dist/test/liveness-watchdog.test.d.ts.map +0 -1
  537. package/dist/test/liveness-watchdog.test.js +0 -94
  538. package/dist/test/liveness-watchdog.test.js.map +0 -1
  539. package/dist/test/machine-close-provenance.test.d.ts +0 -2
  540. package/dist/test/machine-close-provenance.test.d.ts.map +0 -1
  541. package/dist/test/machine-close-provenance.test.js +0 -116
  542. package/dist/test/machine-close-provenance.test.js.map +0 -1
  543. package/dist/test/maintenance-timer.test.d.ts +0 -2
  544. package/dist/test/maintenance-timer.test.d.ts.map +0 -1
  545. package/dist/test/maintenance-timer.test.js +0 -1827
  546. package/dist/test/maintenance-timer.test.js.map +0 -1
  547. package/dist/test/mcp-server-bin.test.d.ts +0 -2
  548. package/dist/test/mcp-server-bin.test.d.ts.map +0 -1
  549. package/dist/test/mcp-server-bin.test.js +0 -142
  550. package/dist/test/mcp-server-bin.test.js.map +0 -1
  551. package/dist/test/mcpl-access-provider.test.d.ts +0 -2
  552. package/dist/test/mcpl-access-provider.test.d.ts.map +0 -1
  553. package/dist/test/mcpl-access-provider.test.js +0 -20
  554. package/dist/test/mcpl-access-provider.test.js.map +0 -1
  555. package/dist/test/mcpl-awareness-barrier.test.d.ts +0 -2
  556. package/dist/test/mcpl-awareness-barrier.test.d.ts.map +0 -1
  557. package/dist/test/mcpl-awareness-barrier.test.js +0 -769
  558. package/dist/test/mcpl-awareness-barrier.test.js.map +0 -1
  559. package/dist/test/mcpl-capability-grant.test.d.ts +0 -10
  560. package/dist/test/mcpl-capability-grant.test.d.ts.map +0 -1
  561. package/dist/test/mcpl-capability-grant.test.js +0 -111
  562. package/dist/test/mcpl-capability-grant.test.js.map +0 -1
  563. package/dist/test/mcpl-capability-scoping.test.d.ts +0 -2
  564. package/dist/test/mcpl-capability-scoping.test.d.ts.map +0 -1
  565. package/dist/test/mcpl-capability-scoping.test.js +0 -266
  566. package/dist/test/mcpl-capability-scoping.test.js.map +0 -1
  567. package/dist/test/mcpl-child-env.test.d.ts +0 -2
  568. package/dist/test/mcpl-child-env.test.d.ts.map +0 -1
  569. package/dist/test/mcpl-child-env.test.js +0 -158
  570. package/dist/test/mcpl-child-env.test.js.map +0 -1
  571. package/dist/test/mcpl-coalesced-content-parity.test.d.ts +0 -2
  572. package/dist/test/mcpl-coalesced-content-parity.test.d.ts.map +0 -1
  573. package/dist/test/mcpl-coalesced-content-parity.test.js +0 -532
  574. package/dist/test/mcpl-coalesced-content-parity.test.js.map +0 -1
  575. package/dist/test/mcpl-coalescing.test.d.ts +0 -2
  576. package/dist/test/mcpl-coalescing.test.d.ts.map +0 -1
  577. package/dist/test/mcpl-coalescing.test.js +0 -1125
  578. package/dist/test/mcpl-coalescing.test.js.map +0 -1
  579. package/dist/test/mcpl-config-diagnostics.test.d.ts +0 -2
  580. package/dist/test/mcpl-config-diagnostics.test.d.ts.map +0 -1
  581. package/dist/test/mcpl-config-diagnostics.test.js +0 -452
  582. package/dist/test/mcpl-config-diagnostics.test.js.map +0 -1
  583. package/dist/test/mcpl-empty-content.test.d.ts +0 -2
  584. package/dist/test/mcpl-empty-content.test.d.ts.map +0 -1
  585. package/dist/test/mcpl-empty-content.test.js +0 -368
  586. package/dist/test/mcpl-empty-content.test.js.map +0 -1
  587. package/dist/test/mcpl-gate-roundtrip.test.d.ts +0 -2
  588. package/dist/test/mcpl-gate-roundtrip.test.d.ts.map +0 -1
  589. package/dist/test/mcpl-gate-roundtrip.test.js +0 -285
  590. package/dist/test/mcpl-gate-roundtrip.test.js.map +0 -1
  591. package/dist/test/mcpl-list-status.test.d.ts +0 -2
  592. package/dist/test/mcpl-list-status.test.d.ts.map +0 -1
  593. package/dist/test/mcpl-list-status.test.js +0 -82
  594. package/dist/test/mcpl-list-status.test.js.map +0 -1
  595. package/dist/test/mcpl-manifest-changed.test.d.ts +0 -2
  596. package/dist/test/mcpl-manifest-changed.test.d.ts.map +0 -1
  597. package/dist/test/mcpl-manifest-changed.test.js +0 -178
  598. package/dist/test/mcpl-manifest-changed.test.js.map +0 -1
  599. package/dist/test/mcpl-push-convert.test.d.ts +0 -2
  600. package/dist/test/mcpl-push-convert.test.d.ts.map +0 -1
  601. package/dist/test/mcpl-push-convert.test.js +0 -42
  602. package/dist/test/mcpl-push-convert.test.js.map +0 -1
  603. package/dist/test/mcpl-reconnect-events.test.d.ts +0 -2
  604. package/dist/test/mcpl-reconnect-events.test.d.ts.map +0 -1
  605. package/dist/test/mcpl-reconnect-events.test.js +0 -144
  606. package/dist/test/mcpl-reconnect-events.test.js.map +0 -1
  607. package/dist/test/mcpl-reconnect-reregistration.test.d.ts +0 -2
  608. package/dist/test/mcpl-reconnect-reregistration.test.d.ts.map +0 -1
  609. package/dist/test/mcpl-reconnect-reregistration.test.js +0 -238
  610. package/dist/test/mcpl-reconnect-reregistration.test.js.map +0 -1
  611. package/dist/test/mcpl-reference-fetcher.test.d.ts +0 -2
  612. package/dist/test/mcpl-reference-fetcher.test.d.ts.map +0 -1
  613. package/dist/test/mcpl-reference-fetcher.test.js +0 -427
  614. package/dist/test/mcpl-reference-fetcher.test.js.map +0 -1
  615. package/dist/test/mcpl-reference-fields.test.d.ts +0 -2
  616. package/dist/test/mcpl-reference-fields.test.d.ts.map +0 -1
  617. package/dist/test/mcpl-reference-fields.test.js +0 -149
  618. package/dist/test/mcpl-reference-fields.test.js.map +0 -1
  619. package/dist/test/mcpl-rejection-log-lines.test.d.ts +0 -2
  620. package/dist/test/mcpl-rejection-log-lines.test.d.ts.map +0 -1
  621. package/dist/test/mcpl-rejection-log-lines.test.js +0 -349
  622. package/dist/test/mcpl-rejection-log-lines.test.js.map +0 -1
  623. package/dist/test/mcpl-request-timeout.test.d.ts +0 -2
  624. package/dist/test/mcpl-request-timeout.test.d.ts.map +0 -1
  625. package/dist/test/mcpl-request-timeout.test.js +0 -138
  626. package/dist/test/mcpl-request-timeout.test.js.map +0 -1
  627. package/dist/test/mcpl-runtime-lifecycle.test.d.ts +0 -7
  628. package/dist/test/mcpl-runtime-lifecycle.test.d.ts.map +0 -1
  629. package/dist/test/mcpl-runtime-lifecycle.test.js +0 -142
  630. package/dist/test/mcpl-runtime-lifecycle.test.js.map +0 -1
  631. package/dist/test/mcpl-stderr-tail.test.d.ts +0 -2
  632. package/dist/test/mcpl-stderr-tail.test.d.ts.map +0 -1
  633. package/dist/test/mcpl-stderr-tail.test.js +0 -210
  634. package/dist/test/mcpl-stderr-tail.test.js.map +0 -1
  635. package/dist/test/mcpl-tool-class-listing.test.d.ts +0 -2
  636. package/dist/test/mcpl-tool-class-listing.test.d.ts.map +0 -1
  637. package/dist/test/mcpl-tool-class-listing.test.js +0 -147
  638. package/dist/test/mcpl-tool-class-listing.test.js.map +0 -1
  639. package/dist/test/mcpl-tool-classes.test.d.ts +0 -7
  640. package/dist/test/mcpl-tool-classes.test.d.ts.map +0 -1
  641. package/dist/test/mcpl-tool-classes.test.js +0 -80
  642. package/dist/test/mcpl-tool-classes.test.js.map +0 -1
  643. package/dist/test/mcpl-tool-lifecycle-e2e.test.d.ts +0 -2
  644. package/dist/test/mcpl-tool-lifecycle-e2e.test.d.ts.map +0 -1
  645. package/dist/test/mcpl-tool-lifecycle-e2e.test.js +0 -237
  646. package/dist/test/mcpl-tool-lifecycle-e2e.test.js.map +0 -1
  647. package/dist/test/mcpl-tool-lifecycle-emitter.test.d.ts +0 -11
  648. package/dist/test/mcpl-tool-lifecycle-emitter.test.d.ts.map +0 -1
  649. package/dist/test/mcpl-tool-lifecycle-emitter.test.js +0 -412
  650. package/dist/test/mcpl-tool-lifecycle-emitter.test.js.map +0 -1
  651. package/dist/test/mcpl-tool-lifecycle-script.test.d.ts +0 -2
  652. package/dist/test/mcpl-tool-lifecycle-script.test.d.ts.map +0 -1
  653. package/dist/test/mcpl-tool-lifecycle-script.test.js +0 -288
  654. package/dist/test/mcpl-tool-lifecycle-script.test.js.map +0 -1
  655. package/dist/test/mcpl-tool-lifecycle.test.d.ts +0 -11
  656. package/dist/test/mcpl-tool-lifecycle.test.d.ts.map +0 -1
  657. package/dist/test/mcpl-tool-lifecycle.test.js +0 -270
  658. package/dist/test/mcpl-tool-lifecycle.test.js.map +0 -1
  659. package/dist/test/mcpl-transport-close.test.d.ts +0 -2
  660. package/dist/test/mcpl-transport-close.test.d.ts.map +0 -1
  661. package/dist/test/mcpl-transport-close.test.js +0 -373
  662. package/dist/test/mcpl-transport-close.test.js.map +0 -1
  663. package/dist/test/mcpl-transport-spawn.test.d.ts +0 -2
  664. package/dist/test/mcpl-transport-spawn.test.d.ts.map +0 -1
  665. package/dist/test/mcpl-transport-spawn.test.js +0 -58
  666. package/dist/test/mcpl-transport-spawn.test.js.map +0 -1
  667. package/dist/test/mcpl-ws-transport.test.d.ts +0 -2
  668. package/dist/test/mcpl-ws-transport.test.d.ts.map +0 -1
  669. package/dist/test/mcpl-ws-transport.test.js +0 -259
  670. package/dist/test/mcpl-ws-transport.test.js.map +0 -1
  671. package/dist/test/module-context-integration.test.d.ts +0 -18
  672. package/dist/test/module-context-integration.test.d.ts.map +0 -1
  673. package/dist/test/module-context-integration.test.js +0 -181
  674. package/dist/test/module-context-integration.test.js.map +0 -1
  675. package/dist/test/offline-recovery-branch.test.d.ts +0 -2
  676. package/dist/test/offline-recovery-branch.test.d.ts.map +0 -1
  677. package/dist/test/offline-recovery-branch.test.js +0 -570
  678. package/dist/test/offline-recovery-branch.test.js.map +0 -1
  679. package/dist/test/operator-surgery.test.d.ts +0 -2
  680. package/dist/test/operator-surgery.test.d.ts.map +0 -1
  681. package/dist/test/operator-surgery.test.js +0 -595
  682. package/dist/test/operator-surgery.test.js.map +0 -1
  683. package/dist/test/ops-alert.test.d.ts +0 -2
  684. package/dist/test/ops-alert.test.d.ts.map +0 -1
  685. package/dist/test/ops-alert.test.js +0 -153
  686. package/dist/test/ops-alert.test.js.map +0 -1
  687. package/dist/test/overbudget-drain-breaker.test.d.ts +0 -2
  688. package/dist/test/overbudget-drain-breaker.test.d.ts.map +0 -1
  689. package/dist/test/overbudget-drain-breaker.test.js +0 -198
  690. package/dist/test/overbudget-drain-breaker.test.js.map +0 -1
  691. package/dist/test/pack-installs-alone.test.d.ts +0 -2
  692. package/dist/test/pack-installs-alone.test.d.ts.map +0 -1
  693. package/dist/test/pack-installs-alone.test.js +0 -284
  694. package/dist/test/pack-installs-alone.test.js.map +0 -1
  695. package/dist/test/per-agent-delivery.test.d.ts +0 -2
  696. package/dist/test/per-agent-delivery.test.d.ts.map +0 -1
  697. package/dist/test/per-agent-delivery.test.js +0 -108
  698. package/dist/test/per-agent-delivery.test.js.map +0 -1
  699. package/dist/test/physical-window-restart.test.d.ts +0 -16
  700. package/dist/test/physical-window-restart.test.d.ts.map +0 -1
  701. package/dist/test/physical-window-restart.test.js +0 -487
  702. package/dist/test/physical-window-restart.test.js.map +0 -1
  703. package/dist/test/placed-reaction-baseline.test.d.ts +0 -2
  704. package/dist/test/placed-reaction-baseline.test.d.ts.map +0 -1
  705. package/dist/test/placed-reaction-baseline.test.js +0 -312
  706. package/dist/test/placed-reaction-baseline.test.js.map +0 -1
  707. package/dist/test/present-while-acting.test.d.ts +0 -19
  708. package/dist/test/present-while-acting.test.d.ts.map +0 -1
  709. package/dist/test/present-while-acting.test.js +0 -1649
  710. package/dist/test/present-while-acting.test.js.map +0 -1
  711. package/dist/test/prose-segments.test.d.ts +0 -2
  712. package/dist/test/prose-segments.test.d.ts.map +0 -1
  713. package/dist/test/prose-segments.test.js +0 -52
  714. package/dist/test/prose-segments.test.js.map +0 -1
  715. package/dist/test/prose-stream-router.test.d.ts +0 -2
  716. package/dist/test/prose-stream-router.test.d.ts.map +0 -1
  717. package/dist/test/prose-stream-router.test.js +0 -171
  718. package/dist/test/prose-stream-router.test.js.map +0 -1
  719. package/dist/test/provider-acceleration-cooldown.test.d.ts +0 -2
  720. package/dist/test/provider-acceleration-cooldown.test.d.ts.map +0 -1
  721. package/dist/test/provider-acceleration-cooldown.test.js +0 -435
  722. package/dist/test/provider-acceleration-cooldown.test.js.map +0 -1
  723. package/dist/test/provider-waits.test.d.ts +0 -2
  724. package/dist/test/provider-waits.test.d.ts.map +0 -1
  725. package/dist/test/provider-waits.test.js +0 -2259
  726. package/dist/test/provider-waits.test.js.map +0 -1
  727. package/dist/test/puppet-tool-call.test.d.ts +0 -2
  728. package/dist/test/puppet-tool-call.test.d.ts.map +0 -1
  729. package/dist/test/puppet-tool-call.test.js +0 -226
  730. package/dist/test/puppet-tool-call.test.js.map +0 -1
  731. package/dist/test/puppet-turn-reservation.test.d.ts +0 -2
  732. package/dist/test/puppet-turn-reservation.test.d.ts.map +0 -1
  733. package/dist/test/puppet-turn-reservation.test.js +0 -139
  734. package/dist/test/puppet-turn-reservation.test.js.map +0 -1
  735. package/dist/test/reaction-baseline-platform.test.d.ts +0 -2
  736. package/dist/test/reaction-baseline-platform.test.d.ts.map +0 -1
  737. package/dist/test/reaction-baseline-platform.test.js +0 -124
  738. package/dist/test/reaction-baseline-platform.test.js.map +0 -1
  739. package/dist/test/record-journal.test.d.ts +0 -6
  740. package/dist/test/record-journal.test.d.ts.map +0 -1
  741. package/dist/test/record-journal.test.js +0 -269
  742. package/dist/test/record-journal.test.js.map +0 -1
  743. package/dist/test/refusal-reaction-baseline.test.d.ts +0 -2
  744. package/dist/test/refusal-reaction-baseline.test.d.ts.map +0 -1
  745. package/dist/test/refusal-reaction-baseline.test.js +0 -81
  746. package/dist/test/refusal-reaction-baseline.test.js.map +0 -1
  747. package/dist/test/refusal-rewind.test.d.ts +0 -2
  748. package/dist/test/refusal-rewind.test.d.ts.map +0 -1
  749. package/dist/test/refusal-rewind.test.js +0 -117
  750. package/dist/test/refusal-rewind.test.js.map +0 -1
  751. package/dist/test/refusal-single-call.test.d.ts +0 -2
  752. package/dist/test/refusal-single-call.test.d.ts.map +0 -1
  753. package/dist/test/refusal-single-call.test.js +0 -177
  754. package/dist/test/refusal-single-call.test.js.map +0 -1
  755. package/dist/test/release-bump.test.d.ts +0 -2
  756. package/dist/test/release-bump.test.d.ts.map +0 -1
  757. package/dist/test/release-bump.test.js +0 -248
  758. package/dist/test/release-bump.test.js.map +0 -1
  759. package/dist/test/release-changelog.test.d.ts +0 -2
  760. package/dist/test/release-changelog.test.d.ts.map +0 -1
  761. package/dist/test/release-changelog.test.js +0 -159
  762. package/dist/test/release-changelog.test.js.map +0 -1
  763. package/dist/test/release-holds.test.d.ts +0 -2
  764. package/dist/test/release-holds.test.d.ts.map +0 -1
  765. package/dist/test/release-holds.test.js +0 -456
  766. package/dist/test/release-holds.test.js.map +0 -1
  767. package/dist/test/same-round-think-policy.test.d.ts +0 -2
  768. package/dist/test/same-round-think-policy.test.d.ts.map +0 -1
  769. package/dist/test/same-round-think-policy.test.js +0 -853
  770. package/dist/test/same-round-think-policy.test.js.map +0 -1
  771. package/dist/test/save-recent-image.test.d.ts +0 -26
  772. package/dist/test/save-recent-image.test.d.ts.map +0 -1
  773. package/dist/test/save-recent-image.test.js +0 -974
  774. package/dist/test/save-recent-image.test.js.map +0 -1
  775. package/dist/test/shutdown-errors.test.d.ts +0 -2
  776. package/dist/test/shutdown-errors.test.d.ts.map +0 -1
  777. package/dist/test/shutdown-errors.test.js +0 -662
  778. package/dist/test/shutdown-errors.test.js.map +0 -1
  779. package/dist/test/silent-heartbeat-rows.test.d.ts +0 -2
  780. package/dist/test/silent-heartbeat-rows.test.d.ts.map +0 -1
  781. package/dist/test/silent-heartbeat-rows.test.js +0 -451
  782. package/dist/test/silent-heartbeat-rows.test.js.map +0 -1
  783. package/dist/test/silent-heartbeat.test.d.ts +0 -2
  784. package/dist/test/silent-heartbeat.test.d.ts.map +0 -1
  785. package/dist/test/silent-heartbeat.test.js +0 -165
  786. package/dist/test/silent-heartbeat.test.js.map +0 -1
  787. package/dist/test/state-scaling-e2e.test.d.ts +0 -22
  788. package/dist/test/state-scaling-e2e.test.d.ts.map +0 -1
  789. package/dist/test/state-scaling-e2e.test.js +0 -206
  790. package/dist/test/state-scaling-e2e.test.js.map +0 -1
  791. package/dist/test/state-scaling.test.d.ts +0 -12
  792. package/dist/test/state-scaling.test.d.ts.map +0 -1
  793. package/dist/test/state-scaling.test.js +0 -251
  794. package/dist/test/state-scaling.test.js.map +0 -1
  795. package/dist/test/stop-with-host-operations.test.d.ts +0 -20
  796. package/dist/test/stop-with-host-operations.test.d.ts.map +0 -1
  797. package/dist/test/stop-with-host-operations.test.js +0 -1174
  798. package/dist/test/stop-with-host-operations.test.js.map +0 -1
  799. package/dist/test/stop-with-work-in-flight.test.d.ts +0 -23
  800. package/dist/test/stop-with-work-in-flight.test.d.ts.map +0 -1
  801. package/dist/test/stop-with-work-in-flight.test.js +0 -784
  802. package/dist/test/stop-with-work-in-flight.test.js.map +0 -1
  803. package/dist/test/surgery-marks-receipt.test.d.ts +0 -2
  804. package/dist/test/surgery-marks-receipt.test.d.ts.map +0 -1
  805. package/dist/test/surgery-marks-receipt.test.js +0 -540
  806. package/dist/test/surgery-marks-receipt.test.js.map +0 -1
  807. package/dist/test/thinking-token-stamp.test.d.ts +0 -12
  808. package/dist/test/thinking-token-stamp.test.d.ts.map +0 -1
  809. package/dist/test/thinking-token-stamp.test.js +0 -129
  810. package/dist/test/thinking-token-stamp.test.js.map +0 -1
  811. package/dist/test/timezone.test.d.ts +0 -2
  812. package/dist/test/timezone.test.d.ts.map +0 -1
  813. package/dist/test/timezone.test.js +0 -18
  814. package/dist/test/timezone.test.js.map +0 -1
  815. package/dist/test/tool-batch-hook.test.d.ts +0 -8
  816. package/dist/test/tool-batch-hook.test.d.ts.map +0 -1
  817. package/dist/test/tool-batch-hook.test.js +0 -275
  818. package/dist/test/tool-batch-hook.test.js.map +0 -1
  819. package/dist/test/tool-policy.test.d.ts +0 -2
  820. package/dist/test/tool-policy.test.d.ts.map +0 -1
  821. package/dist/test/tool-policy.test.js +0 -51
  822. package/dist/test/tool-policy.test.js.map +0 -1
  823. package/dist/test/tool-presentation.test.d.ts +0 -2
  824. package/dist/test/tool-presentation.test.d.ts.map +0 -1
  825. package/dist/test/tool-presentation.test.js +0 -268
  826. package/dist/test/tool-presentation.test.js.map +0 -1
  827. package/dist/test/tool-result-content.test.d.ts +0 -2
  828. package/dist/test/tool-result-content.test.d.ts.map +0 -1
  829. package/dist/test/tool-result-content.test.js +0 -37
  830. package/dist/test/tool-result-content.test.js.map +0 -1
  831. package/dist/test/tool-result-guard.test.d.ts +0 -2
  832. package/dist/test/tool-result-guard.test.d.ts.map +0 -1
  833. package/dist/test/tool-result-guard.test.js +0 -3729
  834. package/dist/test/tool-result-guard.test.js.map +0 -1
  835. package/dist/test/tool-result-history.test.d.ts +0 -7
  836. package/dist/test/tool-result-history.test.d.ts.map +0 -1
  837. package/dist/test/tool-result-history.test.js +0 -156
  838. package/dist/test/tool-result-history.test.js.map +0 -1
  839. package/dist/test/tool-result-spill.test.d.ts +0 -13
  840. package/dist/test/tool-result-spill.test.d.ts.map +0 -1
  841. package/dist/test/tool-result-spill.test.js +0 -586
  842. package/dist/test/tool-result-spill.test.js.map +0 -1
  843. package/dist/test/tool-wrapper-prose-guard-integration.test.d.ts +0 -2
  844. package/dist/test/tool-wrapper-prose-guard-integration.test.d.ts.map +0 -1
  845. package/dist/test/tool-wrapper-prose-guard-integration.test.js +0 -485
  846. package/dist/test/tool-wrapper-prose-guard-integration.test.js.map +0 -1
  847. package/dist/test/tool-wrapper-prose-guard.test.d.ts +0 -2
  848. package/dist/test/tool-wrapper-prose-guard.test.d.ts.map +0 -1
  849. package/dist/test/tool-wrapper-prose-guard.test.js +0 -34
  850. package/dist/test/tool-wrapper-prose-guard.test.js.map +0 -1
  851. package/dist/test/tools-observe-parser-conformance.test.d.ts +0 -2
  852. package/dist/test/tools-observe-parser-conformance.test.d.ts.map +0 -1
  853. package/dist/test/tools-observe-parser-conformance.test.js +0 -129
  854. package/dist/test/tools-observe-parser-conformance.test.js.map +0 -1
  855. package/dist/test/trunk-channel-routing.test.d.ts +0 -19
  856. package/dist/test/trunk-channel-routing.test.d.ts.map +0 -1
  857. package/dist/test/trunk-channel-routing.test.js +0 -652
  858. package/dist/test/trunk-channel-routing.test.js.map +0 -1
  859. package/dist/test/tune-out-e2e.test.d.ts +0 -2
  860. package/dist/test/tune-out-e2e.test.d.ts.map +0 -1
  861. package/dist/test/tune-out-e2e.test.js +0 -142
  862. package/dist/test/tune-out-e2e.test.js.map +0 -1
  863. package/dist/test/tune-out-gate-composition.test.d.ts +0 -2
  864. package/dist/test/tune-out-gate-composition.test.d.ts.map +0 -1
  865. package/dist/test/tune-out-gate-composition.test.js +0 -221
  866. package/dist/test/tune-out-gate-composition.test.js.map +0 -1
  867. package/dist/test/tune-out-lifecycle.test.d.ts +0 -2
  868. package/dist/test/tune-out-lifecycle.test.d.ts.map +0 -1
  869. package/dist/test/tune-out-lifecycle.test.js +0 -121
  870. package/dist/test/tune-out-lifecycle.test.js.map +0 -1
  871. package/dist/test/turn-trigger-provenance.test.d.ts +0 -2
  872. package/dist/test/turn-trigger-provenance.test.d.ts.map +0 -1
  873. package/dist/test/turn-trigger-provenance.test.js +0 -137
  874. package/dist/test/turn-trigger-provenance.test.js.map +0 -1
  875. package/dist/test/unconvertible-tool-result.test.d.ts +0 -2
  876. package/dist/test/unconvertible-tool-result.test.d.ts.map +0 -1
  877. package/dist/test/unconvertible-tool-result.test.js +0 -358
  878. package/dist/test/unconvertible-tool-result.test.js.map +0 -1
  879. package/dist/test/unsent-compiles.test.d.ts +0 -2
  880. package/dist/test/unsent-compiles.test.d.ts.map +0 -1
  881. package/dist/test/unsent-compiles.test.js +0 -139
  882. package/dist/test/unsent-compiles.test.js.map +0 -1
  883. package/dist/test/usage-accounting.test.d.ts +0 -2
  884. package/dist/test/usage-accounting.test.d.ts.map +0 -1
  885. package/dist/test/usage-accounting.test.js +0 -13
  886. package/dist/test/usage-accounting.test.js.map +0 -1
  887. package/dist/test/usage-tracker.test.d.ts +0 -2
  888. package/dist/test/usage-tracker.test.d.ts.map +0 -1
  889. package/dist/test/usage-tracker.test.js +0 -129
  890. package/dist/test/usage-tracker.test.js.map +0 -1
  891. package/dist/test/utils-surface.test.d.ts +0 -2
  892. package/dist/test/utils-surface.test.d.ts.map +0 -1
  893. package/dist/test/utils-surface.test.js +0 -145
  894. package/dist/test/utils-surface.test.js.map +0 -1
  895. package/dist/test/workspace-branch-continuation.test.d.ts +0 -15
  896. package/dist/test/workspace-branch-continuation.test.d.ts.map +0 -1
  897. package/dist/test/workspace-branch-continuation.test.js +0 -183
  898. package/dist/test/workspace-branch-continuation.test.js.map +0 -1
  899. package/dist/test/workspace-materialize-freshness.test.d.ts +0 -16
  900. package/dist/test/workspace-materialize-freshness.test.d.ts.map +0 -1
  901. package/dist/test/workspace-materialize-freshness.test.js +0 -252
  902. package/dist/test/workspace-materialize-freshness.test.js.map +0 -1
  903. package/dist/test/workspace-path-containment.test.d.ts +0 -19
  904. package/dist/test/workspace-path-containment.test.d.ts.map +0 -1
  905. package/dist/test/workspace-path-containment.test.js +0 -91
  906. package/dist/test/workspace-path-containment.test.js.map +0 -1
  907. package/dist/test/workspace-read-file-from-disk.test.d.ts +0 -17
  908. package/dist/test/workspace-read-file-from-disk.test.d.ts.map +0 -1
  909. package/dist/test/workspace-read-file-from-disk.test.js +0 -174
  910. package/dist/test/workspace-read-file-from-disk.test.js.map +0 -1
  911. package/dist/test/workspace-read-image.test.d.ts +0 -2
  912. package/dist/test/workspace-read-image.test.d.ts.map +0 -1
  913. package/dist/test/workspace-read-image.test.js +0 -597
  914. package/dist/test/workspace-read-image.test.js.map +0 -1
  915. package/dist/test/workspace-read-text.test.d.ts +0 -2
  916. package/dist/test/workspace-read-text.test.d.ts.map +0 -1
  917. package/dist/test/workspace-read-text.test.js +0 -101
  918. package/dist/test/workspace-read-text.test.js.map +0 -1
  919. package/dist/test/workspace-restore-order.test.d.ts +0 -16
  920. package/dist/test/workspace-restore-order.test.d.ts.map +0 -1
  921. package/dist/test/workspace-restore-order.test.js +0 -140
  922. package/dist/test/workspace-restore-order.test.js.map +0 -1
  923. package/dist/test/workspace-three-way.test.d.ts +0 -12
  924. package/dist/test/workspace-three-way.test.d.ts.map +0 -1
  925. package/dist/test/workspace-three-way.test.js +0 -4094
  926. package/dist/test/workspace-three-way.test.js.map +0 -1
  927. package/dist/test/workspace-watcher.test.d.ts +0 -2
  928. package/dist/test/workspace-watcher.test.d.ts.map +0 -1
  929. package/dist/test/workspace-watcher.test.js +0 -281
  930. package/dist/test/workspace-watcher.test.js.map +0 -1
  931. package/dist/test/xml-round-persist.test.d.ts +0 -19
  932. package/dist/test/xml-round-persist.test.d.ts.map +0 -1
  933. package/dist/test/xml-round-persist.test.js +0 -235
  934. package/dist/test/xml-round-persist.test.js.map +0 -1
  935. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -1,619 +0,0 @@
1
- import { describe, it } from 'node:test';
2
- import assert from 'node:assert/strict';
3
- import { HistoryModule } from '../src/modules/history/index.js';
4
- /**
5
- * HistoryModule's own logic is dispatch (always via
6
- * queryMessagesByTimeAndChannel, per context-manager's own test evidence
7
- * that it already handles "only one filter" and "neither filter"), input
8
- * validation (ISO dates, regex, limit capping), and presentation (content
9
- * flattening, snippet extraction, truncation detection). The underlying
10
- * index-query *correctness* is context-manager's own responsibility and is
11
- * covered by its test suite (test/message-store-history-index.test.ts) — so
12
- * this stub implements realistic-but-simple in-memory filtering over a small
13
- * fixture rather than standing up a real chronicle store, and a `calls` log
14
- * lets tests assert on exactly what HistoryModule asked for (e.g. the capped
15
- * limit).
16
- */
17
- function textBlock(text) {
18
- return { type: 'text', text };
19
- }
20
- function metaFor(channelId) {
21
- return channelId ? { external: { channelId } } : undefined;
22
- }
23
- function msg(id, ms, participant, content, channelId) {
24
- return {
25
- id,
26
- sequence: Number(id.replace(/\D/g, '')),
27
- participant,
28
- content,
29
- metadata: metaFor(channelId),
30
- timestamp: new Date(ms),
31
- };
32
- }
33
- function channelIdOf(m) {
34
- return m.metadata?.external?.channelId;
35
- }
36
- /** Trivial, deterministic stand-in for real token estimation — tests only
37
- * assert on shape/filtering, never on the exact number. */
38
- function estimate(m) {
39
- return m.content.reduce((n, b) => n + (b.type === 'text' ? b.text.length : 4), 0);
40
- }
41
- function buildStub(messages, opts = {}) {
42
- const calls = [];
43
- const unsupported = () => {
44
- throw new Error('Chronicle history index unsupported: native field-index capability absent on this chronicle build.');
45
- };
46
- const cm = {
47
- queryMessagesByTimeAndChannel(args) {
48
- calls.push({ method: 'queryMessagesByTimeAndChannel', args });
49
- if (opts.throwUnsupported)
50
- return unsupported();
51
- const filtered = messages.filter((m) => {
52
- const ts = m.timestamp.getTime();
53
- if (args.fromMs !== undefined && ts < args.fromMs)
54
- return false;
55
- if (args.toMs !== undefined && ts > args.toMs)
56
- return false;
57
- if (args.channelId !== undefined && channelIdOf(m) !== args.channelId)
58
- return false;
59
- return true;
60
- });
61
- const matchedCount = filtered.length;
62
- const offset = args.offset ?? 0;
63
- const limit = args.limit ?? filtered.length;
64
- return { messages: filtered.slice(offset, offset + limit), matchedCount };
65
- },
66
- // Time-only native query (search's candidate window and extract's
67
- // aroundId use it for timestamp-ordered edges). Real contract:
68
- // timestamp-ordered, `reverse` supported, matchedCount = PAGE size.
69
- queryMessagesByTime(args) {
70
- calls.push({ method: 'queryMessagesByTime', args });
71
- if (opts.throwUnsupported)
72
- return unsupported();
73
- let filtered = messages
74
- .filter((m) => {
75
- const ts = m.timestamp.getTime();
76
- if (args.fromMs !== undefined && ts < args.fromMs)
77
- return false;
78
- if (args.toMs !== undefined && ts > args.toMs)
79
- return false;
80
- return true;
81
- })
82
- .sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());
83
- if (args.reverse)
84
- filtered = filtered.reverse();
85
- const offset = args.offset ?? 0;
86
- const page = filtered.slice(offset, args.limit === undefined ? undefined : offset + args.limit);
87
- return { messages: page, matchedCount: page.length };
88
- },
89
- getChannelMessageCounts() {
90
- calls.push({ method: 'getChannelMessageCounts', args: undefined });
91
- if (opts.throwUnsupported)
92
- return unsupported();
93
- const counts = new Map();
94
- for (const m of messages) {
95
- const c = channelIdOf(m);
96
- if (c)
97
- counts.set(c, (counts.get(c) ?? 0) + 1);
98
- }
99
- return [...counts.entries()].map(([channelId, count]) => ({ channelId, messages: count }));
100
- },
101
- getChannelTokenStats(args) {
102
- calls.push({ method: 'getChannelTokenStats', args });
103
- if (opts.throwUnsupported)
104
- return unsupported();
105
- const inRange = messages.filter((m) => {
106
- const ts = m.timestamp.getTime();
107
- if (args?.fromMs !== undefined && ts < args.fromMs)
108
- return false;
109
- if (args?.toMs !== undefined && ts > args.toMs)
110
- return false;
111
- return true;
112
- });
113
- const byChannel = new Map();
114
- let totalTokensEstimate = 0;
115
- for (const m of inRange) {
116
- const est = estimate(m);
117
- totalTokensEstimate += est;
118
- const c = channelIdOf(m);
119
- if (c) {
120
- const agg = byChannel.get(c) ?? { messages: 0, tokensEstimate: 0 };
121
- agg.messages++;
122
- agg.tokensEstimate += est;
123
- byChannel.set(c, agg);
124
- }
125
- }
126
- return {
127
- totalMessages: inRange.length,
128
- totalTokensEstimate,
129
- byChannel: [...byChannel.entries()].map(([channelId, agg]) => ({ channelId, ...agg })),
130
- };
131
- },
132
- };
133
- return { cm, calls };
134
- }
135
- function call(name, input) {
136
- return { id: `call-${name}`, name, input };
137
- }
138
- // Fixture: two channels (c1, c2), one channel-less message, spread across
139
- // distinct timestamps so time-range filtering is exercisable.
140
- const FIXTURE = [
141
- msg('m1', 1000, 'User', [textBlock('hello world')], 'c1'),
142
- msg('m2', 2000, 'Claude', [{ type: 'tool_use', id: 't1', name: 'search', input: {} }], 'c1'),
143
- msg('m3', 3000, 'User', [textBlock('foo BAR baz')], 'c2'),
144
- msg('m4', 4000, 'Claude', [{ type: 'thinking', thinking: 'hmm' }, textBlock('final answer')], 'c2'),
145
- msg('m5', 5000, 'User', [textBlock('unchanneled message')]),
146
- msg('m6', 6000, 'User', [textBlock('another c1 message with searchterm inside')], 'c1'),
147
- ];
148
- describe('HistoryModule', () => {
149
- describe('stats', () => {
150
- it('reports all-time message counts and range-scoped token stats separately', async () => {
151
- const { cm } = buildStub(FIXTURE);
152
- const h = new HistoryModule();
153
- h.bind(cm);
154
- // Range covers only m3..m5 (3000-5000), but messageCountsAllTime must
155
- // still reflect the whole store.
156
- const result = await h.handleToolCall(call('stats', { from: new Date(3000).toISOString(), to: new Date(5000).toISOString() }));
157
- assert.equal(result.success, true, result.error);
158
- const data = result.data;
159
- const allTimeByChannel = new Map(data.messageCountsAllTime.map((c) => [c.channelId, c.messages]));
160
- assert.equal(allTimeByChannel.get('c1'), 3); // m1, m2, m6 — unaffected by the range
161
- assert.equal(allTimeByChannel.get('c2'), 2); // m3, m4
162
- assert.equal(data.tokenStatsForRange.totalMessages, 3); // m3, m4, m5
163
- const rangeByChannel = new Map(data.tokenStatsForRange.byChannel.map((c) => [c.channelId, c.messages]));
164
- assert.equal(rangeByChannel.get('c2'), 2); // m3 and m4 both fall in [3000,5000]
165
- assert.equal(rangeByChannel.has('c1'), false); // no c1 message falls in [3000,5000]
166
- });
167
- it('filters both parts of the response to one channelId when given', async () => {
168
- const { cm } = buildStub(FIXTURE);
169
- const h = new HistoryModule();
170
- h.bind(cm);
171
- const result = await h.handleToolCall(call('stats', { channelId: 'c1' }));
172
- assert.equal(result.success, true, result.error);
173
- const data = result.data;
174
- assert.deepEqual(data.messageCountsAllTime.map((c) => c.channelId), ['c1']);
175
- assert.deepEqual(data.tokenStatsForRange.byChannel.map((c) => c.channelId), ['c1']);
176
- });
177
- it('rejects an invalid ISO date cleanly instead of throwing', async () => {
178
- const { cm } = buildStub(FIXTURE);
179
- const h = new HistoryModule();
180
- h.bind(cm);
181
- const result = await h.handleToolCall(call('stats', { from: 'not-a-date' }));
182
- assert.equal(result.success, false);
183
- assert.equal(result.isError, true);
184
- assert.match(result.error ?? '', /Invalid ISO 8601 date/);
185
- });
186
- it('surfaces the capability-absent error as a clean tool error, not a crash', async () => {
187
- const { cm } = buildStub(FIXTURE, { throwUnsupported: true });
188
- const h = new HistoryModule();
189
- h.bind(cm);
190
- const result = await h.handleToolCall(call('stats', {}));
191
- assert.equal(result.success, false);
192
- assert.equal(result.isError, true);
193
- assert.match(result.error ?? '', /Chronicle history index unsupported/);
194
- });
195
- });
196
- describe('extract', () => {
197
- it('filters by channel and date range', async () => {
198
- const { cm } = buildStub(FIXTURE);
199
- const h = new HistoryModule();
200
- h.bind(cm);
201
- const result = await h.handleToolCall(call('extract', { channelId: 'c1', from: new Date(1500).toISOString() }));
202
- assert.equal(result.success, true, result.error);
203
- const data = result.data;
204
- // c1 messages at ts >= 1500: m2 (2000), m6 (6000) — m1 (1000) excluded.
205
- assert.deepEqual(data.messages.map((m) => m.id), ['m2', 'm6']);
206
- assert.equal(data.returned, 2);
207
- assert.equal(data.matchedCount, 2);
208
- });
209
- it('format:"text" flattens content; format:"raw" returns blocks as-is', async () => {
210
- const { cm } = buildStub(FIXTURE);
211
- const h = new HistoryModule();
212
- h.bind(cm);
213
- const textResult = await h.handleToolCall(call('extract', { channelId: 'c2', format: 'text' }));
214
- const textData = textResult.data;
215
- const m4 = textData.messages.find((m) => m.id === 'm4');
216
- assert.equal(m4.content, '[thinking] final answer');
217
- const rawResult = await h.handleToolCall(call('extract', { channelId: 'c2', format: 'raw' }));
218
- const rawData = rawResult.data;
219
- const m4Raw = rawData.messages.find((m) => m.id === 'm4');
220
- assert.ok(Array.isArray(m4Raw.content));
221
- assert.equal(m4Raw.content.length, 2);
222
- assert.equal(m4Raw.content[0]?.type, 'thinking');
223
- });
224
- it('caps limit at the hard maximum before it reaches context-manager', async () => {
225
- const { cm, calls } = buildStub(FIXTURE);
226
- const h = new HistoryModule();
227
- h.bind(cm);
228
- await h.handleToolCall(call('extract', { limit: 999999 }));
229
- const queryCall = calls.find((c) => c.method === 'queryMessagesByTimeAndChannel');
230
- // 200 = the hard cap; +1 is extract's own "is there another page" probe row.
231
- assert.equal((queryCall?.args).limit, 201);
232
- });
233
- it('clamps an out-of-u32-range offset to the native ceiling instead of passing it through to wrap (reviewer repro)', async () => {
234
- // Number.MAX_SAFE_INTEGER is not a safe ceiling for a value that
235
- // eventually crosses into a native u32 argument: 4294967296 (one past
236
- // u32 max) must be clamped to 4294967295, not passed through as-is —
237
- // otherwise it wraps/truncates at the N-API boundary into a small
238
- // offset and silently returns the wrong page instead of an empty one.
239
- const { cm, calls } = buildStub(FIXTURE);
240
- const h = new HistoryModule();
241
- h.bind(cm);
242
- await h.handleToolCall(call('extract', { offset: 4294967296, limit: 1 }));
243
- const queryCall = calls.find((c) => c.method === 'queryMessagesByTimeAndChannel');
244
- assert.equal((queryCall?.args).offset, 4294967295);
245
- });
246
- it('surfaces the capability-absent error cleanly', async () => {
247
- const { cm } = buildStub(FIXTURE, { throwUnsupported: true });
248
- const h = new HistoryModule();
249
- h.bind(cm);
250
- const result = await h.handleToolCall(call('extract', {}));
251
- assert.equal(result.success, false);
252
- assert.equal(result.isError, true);
253
- assert.match(result.error ?? '', /Chronicle history index unsupported/);
254
- });
255
- });
256
- describe('search', () => {
257
- it('matches a case-insensitive substring by default', async () => {
258
- const { cm } = buildStub(FIXTURE);
259
- const h = new HistoryModule();
260
- h.bind(cm);
261
- const result = await h.handleToolCall(call('search', { query: 'bar' }));
262
- assert.equal(result.success, true, result.error);
263
- const data = result.data;
264
- assert.deepEqual(data.matches.map((m) => m.id), ['m3']);
265
- assert.match(data.matches[0].snippet, /BAR/);
266
- });
267
- it('limit:0 (substring) returns zero matches instead of one (reviewer repro)', async () => {
268
- // clampCount accepts 0 as a valid value (it's >= 0). Both matching
269
- // loops used to push a match onto the results array BEFORE checking
270
- // the limit, so with a matching candidate present, limit:0 still
271
- // returned exactly 1 match.
272
- const { cm } = buildStub(FIXTURE);
273
- const h = new HistoryModule();
274
- h.bind(cm);
275
- const result = await h.handleToolCall(call('search', { query: 'bar', limit: 0 }));
276
- assert.equal(result.success, true, result.error);
277
- const data = result.data;
278
- assert.equal(data.matches.length, 0);
279
- });
280
- it('limit:0 (regex) returns zero matches instead of one (reviewer repro)', async () => {
281
- // Same bug, independently, in search-regex-worker.ts's own copy of
282
- // the match loop.
283
- const { cm } = buildStub(FIXTURE);
284
- const h = new HistoryModule();
285
- h.bind(cm);
286
- const result = await h.handleToolCall(call('search', { query: '\\bworld\\b', regex: true, limit: 0 }));
287
- assert.equal(result.success, true, result.error);
288
- const data = result.data;
289
- assert.equal(data.matches.length, 0);
290
- });
291
- it('caseSensitive:true respects case', async () => {
292
- const { cm } = buildStub(FIXTURE);
293
- const h = new HistoryModule();
294
- h.bind(cm);
295
- const result = await h.handleToolCall(call('search', { query: 'bar', caseSensitive: true }));
296
- assert.equal(result.success, true, result.error);
297
- const data = result.data;
298
- assert.equal(data.matches.length, 0); // fixture only has "BAR", not "bar"
299
- });
300
- it('matches a regex', async () => {
301
- const { cm } = buildStub(FIXTURE);
302
- const h = new HistoryModule();
303
- h.bind(cm);
304
- const result = await h.handleToolCall(call('search', { query: '\\bworld\\b', regex: true }));
305
- assert.equal(result.success, true, result.error);
306
- const data = result.data;
307
- assert.deepEqual(data.matches.map((m) => m.id), ['m1']);
308
- });
309
- it('forcibly terminates a catastrophically-backtracking (ReDoS) regex instead of hanging', async () => {
310
- // Reviewer's repro: 32 'a's followed by a non-matching character, plus
311
- // a classic exponential-backtracking pattern. `(a+)+$` against this
312
- // input backtracks exponentially and (verified separately in an
313
- // isolated child process) has to be force-killed after several
314
- // seconds; the equivalent linear pattern `^a+$` returns instantly.
315
- // This must never block the framework's single event loop — matching
316
- // has to happen off-thread with a real, forcible deadline.
317
- const evil = 'a'.repeat(32) + '!';
318
- const { cm } = buildStub([msg('r1', 1000, 'User', [textBlock(evil)], 'c1')]);
319
- const h = new HistoryModule();
320
- h.bind(cm);
321
- const start = Date.now();
322
- const result = await h.handleToolCall(call('search', { query: '(a+)+$', regex: true, maxScan: 1 }));
323
- const elapsed = Date.now() - start;
324
- // Returns well within a bounded time (module deadline is 2s; generous
325
- // slack here for worker spawn/CI jitter) — proves the test runner
326
- // itself never hung waiting on this call.
327
- assert.ok(elapsed < 8000, `search took ${elapsed}ms — should have been forcibly terminated near the deadline`);
328
- // A cut-short match MUST be a clean, unambiguous failure, never
329
- // success:true with an empty matches array — that would be
330
- // indistinguishable from "no matches found", which is a lie.
331
- assert.equal(result.success, false);
332
- assert.equal(result.isError, true);
333
- assert.match(result.error ?? '', /timed out/i);
334
- });
335
- it('a normal regex against the same kind of input still matches correctly (worker path is not just failing everything)', async () => {
336
- const { cm } = buildStub([msg('r1', 1000, 'User', [textBlock('aaaa!')], 'c1')]);
337
- const h = new HistoryModule();
338
- h.bind(cm);
339
- const result = await h.handleToolCall(call('search', { query: '^a+!$', regex: true }));
340
- assert.equal(result.success, true, result.error);
341
- const data = result.data;
342
- assert.deepEqual(data.matches.map((m) => m.id), ['r1']);
343
- });
344
- it('returns a clean error for an invalid regex instead of throwing', async () => {
345
- const { cm } = buildStub(FIXTURE);
346
- const h = new HistoryModule();
347
- h.bind(cm);
348
- const result = await h.handleToolCall(call('search', { query: '(unclosed', regex: true }));
349
- assert.equal(result.success, false);
350
- assert.equal(result.isError, true);
351
- assert.match(result.error ?? '', /Invalid regex/);
352
- });
353
- it('reports truncated:true up front when the candidate window exceeds maxScan', async () => {
354
- const { cm } = buildStub(FIXTURE);
355
- const h = new HistoryModule();
356
- h.bind(cm);
357
- const result = await h.handleToolCall(call('search', { query: 'm', maxScan: 3 }));
358
- assert.equal(result.success, true, result.error);
359
- const data = result.data;
360
- assert.equal(data.truncated, true);
361
- assert.equal(data.candidatePoolSize, 3);
362
- assert.ok(data.scanned <= 3);
363
- });
364
- it('does not report truncated when the candidate window fits within maxScan', async () => {
365
- const { cm } = buildStub(FIXTURE);
366
- const h = new HistoryModule();
367
- h.bind(cm);
368
- const result = await h.handleToolCall(call('search', { query: 'searchterm', maxScan: 5000 }));
369
- assert.equal(result.success, true, result.error);
370
- const data = result.data;
371
- assert.equal(data.truncated, false);
372
- assert.deepEqual(data.matches.map((m) => m.id), ['m6']);
373
- });
374
- it('surfaces the capability-absent error cleanly', async () => {
375
- const { cm } = buildStub(FIXTURE, { throwUnsupported: true });
376
- const h = new HistoryModule();
377
- h.bind(cm);
378
- const result = await h.handleToolCall(call('search', { query: 'x' }));
379
- assert.equal(result.success, false);
380
- assert.equal(result.isError, true);
381
- assert.match(result.error ?? '', /Chronicle history index unsupported/);
382
- });
383
- });
384
- describe('pagination input validation', () => {
385
- // Math.min(value, max) alone only enforces an UPPER bound —
386
- // Math.min(-1, 200) is -1, not clamped up to anything — so a negative
387
- // (or non-integer/non-finite) limit/offset/maxScan would previously
388
- // reach context-manager's native query unbounded. Each of these must
389
- // now be rejected before the native call is ever made.
390
- const badValues = [
391
- ['negative', -1],
392
- ['non-integer', 1.5],
393
- ['NaN', NaN],
394
- ['Infinity', Infinity],
395
- ];
396
- for (const [label, value] of badValues) {
397
- it(`extract: rejects a ${label} limit before it reaches context-manager`, async () => {
398
- const { cm, calls } = buildStub(FIXTURE);
399
- const h = new HistoryModule();
400
- h.bind(cm);
401
- const result = await h.handleToolCall(call('extract', { limit: value }));
402
- assert.equal(result.success, false);
403
- assert.equal(result.isError, true);
404
- assert.equal(calls.length, 0, 'must reject before ever calling context-manager');
405
- });
406
- it(`extract: rejects a ${label} offset before it reaches context-manager`, async () => {
407
- const { cm, calls } = buildStub(FIXTURE);
408
- const h = new HistoryModule();
409
- h.bind(cm);
410
- const result = await h.handleToolCall(call('extract', { offset: value }));
411
- assert.equal(result.success, false);
412
- assert.equal(result.isError, true);
413
- assert.equal(calls.length, 0);
414
- });
415
- it(`search: rejects a ${label} limit before it reaches context-manager`, async () => {
416
- const { cm, calls } = buildStub(FIXTURE);
417
- const h = new HistoryModule();
418
- h.bind(cm);
419
- const result = await h.handleToolCall(call('search', { query: 'm', limit: value }));
420
- assert.equal(result.success, false);
421
- assert.equal(result.isError, true);
422
- assert.equal(calls.length, 0);
423
- });
424
- it(`search: rejects a ${label} maxScan before it reaches context-manager`, async () => {
425
- const { cm, calls } = buildStub(FIXTURE);
426
- const h = new HistoryModule();
427
- h.bind(cm);
428
- const result = await h.handleToolCall(call('search', { query: 'm', maxScan: value }));
429
- assert.equal(result.success, false);
430
- assert.equal(result.isError, true);
431
- assert.equal(calls.length, 0);
432
- });
433
- }
434
- it('extract: a real 250-message store with limit:-1 does NOT return everything (reviewer repro)', async () => {
435
- // Reviewer's exact repro shape: a store larger than the hard cap, and
436
- // a negative limit that must not bypass it.
437
- const many = Array.from({ length: 250 }, (_, i) => msg(`p${i}`, 1000 + i, 'User', [textBlock(`m${i}`)], 'c1'));
438
- const { cm } = buildStub(many);
439
- const h = new HistoryModule();
440
- h.bind(cm);
441
- const result = await h.handleToolCall(call('extract', { limit: -1 }));
442
- assert.equal(result.success, false);
443
- assert.equal(result.isError, true);
444
- });
445
- it('search: a real large candidate pool with maxScan:-2 does NOT fetch everything (reviewer repro)', async () => {
446
- const many = Array.from({ length: 248 }, (_, i) => msg(`q${i}`, 1000 + i, 'User', [textBlock(`m${i}`)], 'c1'));
447
- const { cm, calls } = buildStub(many);
448
- const h = new HistoryModule();
449
- h.bind(cm);
450
- const result = await h.handleToolCall(call('search', { query: 'm', maxScan: -2 }));
451
- assert.equal(result.success, false);
452
- assert.equal(result.isError, true);
453
- assert.equal(calls.length, 0);
454
- });
455
- });
456
- describe('channel-label retrofit (resolveChannel via ChannelRegistry)', () => {
457
- /**
458
- * Minimal ChannelRegistry-shaped stub — HistoryModule's resolveChannel()
459
- * only ever calls resolveProseTargetDurable(), so that's all this needs
460
- * to implement. `known` maps a label spec to the raw channelId it
461
- * resolves to; anything else is an unresolvable miss (mirrors
462
- * ChannelRegistry's own {error} return).
463
- */
464
- function stubRegistry(known) {
465
- return {
466
- resolveProseTargetDurable(spec) {
467
- const channelId = known[spec];
468
- return channelId !== undefined ? { channelId } : { error: `no such channel: ${spec}` };
469
- },
470
- };
471
- }
472
- it('stats: resolves a label to the raw channelId before calling context-manager', async () => {
473
- const { cm } = buildStub(FIXTURE);
474
- const h = new HistoryModule();
475
- h.bind(cm, stubRegistry({ '#c1-label': 'c1' }));
476
- const result = await h.handleToolCall(call('stats', { channelId: '#c1-label' }));
477
- assert.equal(result.success, true, result.error);
478
- const data = result.data;
479
- // Same result as passing the raw 'c1' id directly (see the plain
480
- // stats/channelId test above) — proves the label was resolved, not
481
- // passed through as a literal (nonexistent) channelId.
482
- assert.deepEqual(data.messageCountsAllTime.map((c) => c.channelId), ['c1']);
483
- assert.deepEqual(data.tokenStatsForRange.byChannel.map((c) => c.channelId), ['c1']);
484
- });
485
- it('extract: resolves a label to the raw channelId before calling context-manager', async () => {
486
- const { cm, calls } = buildStub(FIXTURE);
487
- const h = new HistoryModule();
488
- h.bind(cm, stubRegistry({ '#c1-label': 'c1' }));
489
- const result = await h.handleToolCall(call('extract', { channelId: '#c1-label', from: new Date(1500).toISOString() }));
490
- assert.equal(result.success, true, result.error);
491
- const data = result.data;
492
- assert.deepEqual(data.messages.map((m) => m.id), ['m2', 'm6']);
493
- const queryCall = calls.find((c) => c.method === 'queryMessagesByTimeAndChannel');
494
- assert.equal((queryCall?.args).channelId, 'c1', 'context-manager must see the resolved raw id, not the label');
495
- });
496
- it('search: resolves a label to the raw channelId before calling context-manager', async () => {
497
- const { cm } = buildStub(FIXTURE);
498
- const h = new HistoryModule();
499
- h.bind(cm, stubRegistry({ '#c1-label': 'c1' }));
500
- const result = await h.handleToolCall(call('search', { query: 'searchterm', channelId: '#c1-label' }));
501
- assert.equal(result.success, true, result.error);
502
- const data = result.data;
503
- assert.deepEqual(data.matches.map((m) => m.id), ['m6']);
504
- });
505
- it('an unresolvable spec is passed through unchanged (escape hatch for an already-raw channelId)', async () => {
506
- const { cm, calls } = buildStub(FIXTURE);
507
- const h = new HistoryModule();
508
- // Registry is bound but knows nothing about 'c1' as a *label* — only
509
- // resolveProseTargetDurable would be asked, and it misses.
510
- h.bind(cm, stubRegistry({}));
511
- const result = await h.handleToolCall(call('extract', { channelId: 'c1' }));
512
- assert.equal(result.success, true, result.error);
513
- const data = result.data;
514
- assert.deepEqual(data.messages.map((m) => m.id), ['m1', 'm2', 'm6']);
515
- const queryCall = calls.find((c) => c.method === 'queryMessagesByTimeAndChannel');
516
- assert.equal((queryCall?.args).channelId, 'c1');
517
- });
518
- it('a typo\'d label-shaped spec (starts with # or @) surfaces a clean error with suggestions instead of silently looking empty (finding #8)', async () => {
519
- const { cm } = buildStub(FIXTURE);
520
- const h = new HistoryModule();
521
- h.bind(cm, {
522
- resolveProseTargetDurable(spec) {
523
- if (spec === '#c1-label')
524
- return { channelId: 'c1' };
525
- // Unresolvable, but the resolver still offers a near-match
526
- // suggestion — exactly what a real ChannelRegistry miss returns.
527
- // The underlying error text deliberately mimics
528
- // resolveProseTarget's SEND-flavored DM wording ("use the
529
- // send_dm tool") — resolveChannel must not surface it verbatim
530
- // (see the next test): a read-only history tool needs its own
531
- // wording, not send-context advice.
532
- return { error: `no registered DM found for "${spec}" — use the send_dm tool`, candidates: ['#c1-label'] };
533
- },
534
- });
535
- const result = await h.handleToolCall(call('extract', { channelId: '#c1-labl' })); // typo
536
- assert.equal(result.success, false);
537
- assert.equal(result.isError, true);
538
- assert.match(result.error ?? '', /No channel history found/i);
539
- assert.match(result.error ?? '', /#c1-label/); // the suggestion made it into the error
540
- });
541
- it('never reuses the live resolver\'s send_dm-flavored error text — always uses read-only-tool wording (finding: DM error text)', async () => {
542
- const { cm } = buildStub(FIXTURE);
543
- const h = new HistoryModule();
544
- h.bind(cm, {
545
- resolveProseTargetDurable(_spec) {
546
- return { error: 'no registered DM found for "@ghost" — for someone without a registered DM channel, use the send_dm tool' };
547
- },
548
- });
549
- const result = await h.handleToolCall(call('extract', { channelId: '@ghost' }));
550
- assert.equal(result.success, false);
551
- assert.equal(result.isError, true);
552
- assert.doesNotMatch(result.error ?? '', /send_dm/, 'send-context advice must never leak into a read-only tool error');
553
- });
554
- it('a bare (non-#/@) unresolvable spec still passes through unchanged — the escape hatch is preserved for non-label-shaped input', async () => {
555
- const { cm, calls } = buildStub(FIXTURE);
556
- const h = new HistoryModule();
557
- h.bind(cm, {
558
- resolveProseTargetDurable(_spec) {
559
- return { error: 'no such channel', candidates: ['c1'] };
560
- },
561
- });
562
- // 'c1' doesn't start with '#' or '@' — even on a registry miss, this
563
- // must still be treated as an already-raw id, not an error.
564
- const result = await h.handleToolCall(call('extract', { channelId: 'c1' }));
565
- assert.equal(result.success, true, result.error);
566
- const queryCall = calls.find((c) => c.method === 'queryMessagesByTimeAndChannel');
567
- assert.equal((queryCall?.args).channelId, 'c1');
568
- });
569
- it('an unresolvable <@id>/<@!id> mention form surfaces the clean error on extract/stats/search/overview, not a silent empty result (finding: mention-form escape-hatch gap)', async () => {
570
- const { cm } = buildStub(FIXTURE);
571
- const registry = {
572
- resolveProseTargetDurable(_spec) {
573
- return { error: 'no registered DM matches the mention <@999>' };
574
- },
575
- };
576
- for (const mention of ['<@999>', '<@!999>']) {
577
- for (const toolName of ['extract', 'stats', 'search', 'overview']) {
578
- const h = new HistoryModule();
579
- h.bind(cm, registry);
580
- const input = { channelId: mention };
581
- if (toolName === 'search')
582
- input.query = 'x';
583
- const result = await h.handleToolCall(call(toolName, input));
584
- assert.equal(result.success, false, `${toolName}(${mention}) should error, not silently succeed`);
585
- assert.equal(result.isError, true);
586
- assert.match(result.error ?? '', /No channel history found/i, `${toolName}(${mention}) should surface the clean resolution error`);
587
- }
588
- }
589
- });
590
- it('regression guard: an unbound module (bind(cm) only, no registry) still accepts a raw id unchanged', async () => {
591
- const { cm, calls } = buildStub(FIXTURE);
592
- const h = new HistoryModule();
593
- h.bind(cm); // no ChannelRegistry passed — today's pre-retrofit call shape.
594
- const result = await h.handleToolCall(call('extract', { channelId: 'c1' }));
595
- assert.equal(result.success, true, result.error);
596
- const data = result.data;
597
- assert.deepEqual(data.messages.map((m) => m.id), ['m1', 'm2', 'm6']);
598
- const queryCall = calls.find((c) => c.method === 'queryMessagesByTimeAndChannel');
599
- assert.equal((queryCall?.args).channelId, 'c1');
600
- });
601
- });
602
- it('rejects tool calls before bind()', async () => {
603
- const h = new HistoryModule();
604
- const result = await h.handleToolCall(call('stats', {}));
605
- assert.equal(result.success, false);
606
- assert.equal(result.isError, true);
607
- assert.match(result.error ?? '', /not bound/);
608
- });
609
- it('rejects an unknown tool name', async () => {
610
- const { cm } = buildStub(FIXTURE);
611
- const h = new HistoryModule();
612
- h.bind(cm);
613
- const result = await h.handleToolCall(call('bogus', {}));
614
- assert.equal(result.success, false);
615
- assert.equal(result.isError, true);
616
- assert.match(result.error ?? '', /Unknown tool/);
617
- });
618
- });
619
- //# sourceMappingURL=history-module.test.js.map