@nhtio/adk 1.20260925.0 → 1.20260928.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (332) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/artifact_methods-Cg0go7Q4.mjs +1 -0
  3. package/artifact_methods-CxeKTocm.cjs +1 -0
  4. package/batteries/artifacts/ecmascript.cjs +1 -1
  5. package/batteries/artifacts/ecmascript.mjs +1 -1
  6. package/batteries/artifacts/toon.cjs +1 -1
  7. package/batteries/artifacts/toon.mjs +1 -1
  8. package/batteries/artifacts/xml.cjs +1 -1
  9. package/batteries/artifacts/xml.mjs +1 -1
  10. package/batteries/artifacts/yaml.cjs +1 -1
  11. package/batteries/artifacts/yaml.mjs +1 -1
  12. package/batteries/artifacts.cjs +4 -4
  13. package/batteries/artifacts.mjs +4 -4
  14. package/batteries/dev-tools/forge.cjs +3 -3
  15. package/batteries/dev-tools/forge.mjs +3 -3
  16. package/batteries/dev-tools.cjs +3 -3
  17. package/batteries/dev-tools.mjs +3 -3
  18. package/batteries/encoding.cjs +7 -7
  19. package/batteries/encoding.mjs +7 -7
  20. package/batteries/generation/gemini/adapter.cjs +1 -1
  21. package/batteries/generation/gemini/adapter.mjs +1 -1
  22. package/batteries/generation/local_diffusion/adapter.cjs +1 -1
  23. package/batteries/generation/local_diffusion/adapter.mjs +1 -1
  24. package/batteries/generation/openai/adapter.cjs +1 -1
  25. package/batteries/generation/openai/adapter.mjs +1 -1
  26. package/batteries/isolation/child_process.cjs +1 -1
  27. package/batteries/isolation/child_process.mjs +1 -1
  28. package/batteries/isolation.cjs +1 -1
  29. package/batteries/isolation.mjs +1 -1
  30. package/batteries/llm/anthropic_messages/adapter.cjs +6 -6
  31. package/batteries/llm/anthropic_messages/adapter.mjs +6 -6
  32. package/batteries/llm/anthropic_messages/count_tokens.cjs +1 -1
  33. package/batteries/llm/anthropic_messages/count_tokens.mjs +1 -1
  34. package/batteries/llm/anthropic_messages/helpers.cjs +3 -3
  35. package/batteries/llm/anthropic_messages/helpers.mjs +3 -3
  36. package/batteries/llm/anthropic_messages/validation.cjs +2 -2
  37. package/batteries/llm/anthropic_messages/validation.mjs +2 -2
  38. package/batteries/llm/anthropic_messages.cjs +2 -2
  39. package/batteries/llm/anthropic_messages.mjs +2 -2
  40. package/batteries/llm/bedrock_converse/adapter.cjs +6 -6
  41. package/batteries/llm/bedrock_converse/adapter.mjs +6 -6
  42. package/batteries/llm/bedrock_converse/helpers.cjs +1 -1
  43. package/batteries/llm/bedrock_converse/helpers.mjs +1 -1
  44. package/batteries/llm/bedrock_converse/validation.cjs +2 -2
  45. package/batteries/llm/bedrock_converse/validation.mjs +2 -2
  46. package/batteries/llm/bedrock_converse.cjs +2 -2
  47. package/batteries/llm/bedrock_converse.mjs +2 -2
  48. package/batteries/llm/claude_code_cli/adapter.cjs +7 -7
  49. package/batteries/llm/claude_code_cli/adapter.mjs +7 -7
  50. package/batteries/llm/claude_code_cli/helpers.cjs +3 -3
  51. package/batteries/llm/claude_code_cli/helpers.mjs +3 -3
  52. package/batteries/llm/claude_code_cli/validation.cjs +2 -2
  53. package/batteries/llm/claude_code_cli/validation.mjs +2 -2
  54. package/batteries/llm/claude_code_cli.cjs +2 -2
  55. package/batteries/llm/claude_code_cli.mjs +2 -2
  56. package/batteries/llm/gemini_generate_content/adapter.cjs +6 -6
  57. package/batteries/llm/gemini_generate_content/adapter.mjs +6 -6
  58. package/batteries/llm/gemini_generate_content/helpers.cjs +1 -1
  59. package/batteries/llm/gemini_generate_content/helpers.mjs +1 -1
  60. package/batteries/llm/gemini_generate_content/validation.cjs +2 -2
  61. package/batteries/llm/gemini_generate_content/validation.mjs +2 -2
  62. package/batteries/llm/gemini_generate_content.cjs +1 -1
  63. package/batteries/llm/gemini_generate_content.mjs +1 -1
  64. package/batteries/llm/litert_lm/adapter.cjs +6 -6
  65. package/batteries/llm/litert_lm/adapter.mjs +6 -6
  66. package/batteries/llm/litert_lm/helpers.cjs +3 -3
  67. package/batteries/llm/litert_lm/helpers.mjs +3 -3
  68. package/batteries/llm/litert_lm/validation.cjs +2 -2
  69. package/batteries/llm/litert_lm/validation.mjs +2 -2
  70. package/batteries/llm/litert_lm.cjs +1 -1
  71. package/batteries/llm/litert_lm.mjs +1 -1
  72. package/batteries/llm/ollama/adapter.cjs +6 -6
  73. package/batteries/llm/ollama/adapter.mjs +6 -6
  74. package/batteries/llm/ollama/helpers.cjs +4 -4
  75. package/batteries/llm/ollama/helpers.mjs +4 -4
  76. package/batteries/llm/ollama/validation.cjs +2 -2
  77. package/batteries/llm/ollama/validation.mjs +2 -2
  78. package/batteries/llm/ollama.cjs +2 -2
  79. package/batteries/llm/ollama.mjs +2 -2
  80. package/batteries/llm/openai_chat_completions/adapter.cjs +6 -6
  81. package/batteries/llm/openai_chat_completions/adapter.mjs +6 -6
  82. package/batteries/llm/openai_chat_completions/helpers.cjs +4 -4
  83. package/batteries/llm/openai_chat_completions/helpers.mjs +4 -4
  84. package/batteries/llm/openai_chat_completions/validation.cjs +2 -2
  85. package/batteries/llm/openai_chat_completions/validation.mjs +2 -2
  86. package/batteries/llm/openai_chat_completions.cjs +2 -2
  87. package/batteries/llm/openai_chat_completions.mjs +2 -2
  88. package/batteries/llm/openai_responses/adapter.cjs +6 -6
  89. package/batteries/llm/openai_responses/adapter.mjs +6 -6
  90. package/batteries/llm/openai_responses/helpers.cjs +3 -3
  91. package/batteries/llm/openai_responses/helpers.mjs +3 -3
  92. package/batteries/llm/openai_responses/validation.cjs +2 -2
  93. package/batteries/llm/openai_responses/validation.mjs +2 -2
  94. package/batteries/llm/openai_responses.cjs +2 -2
  95. package/batteries/llm/openai_responses.mjs +2 -2
  96. package/batteries/llm/transformers_js/adapter.cjs +6 -6
  97. package/batteries/llm/transformers_js/adapter.mjs +6 -6
  98. package/batteries/llm/transformers_js/helpers.cjs +3 -3
  99. package/batteries/llm/transformers_js/helpers.mjs +3 -3
  100. package/batteries/llm/transformers_js/validation.cjs +2 -2
  101. package/batteries/llm/transformers_js/validation.mjs +2 -2
  102. package/batteries/llm/transformers_js.cjs +1 -1
  103. package/batteries/llm/transformers_js.mjs +1 -1
  104. package/batteries/llm/webllm_chat_completions/adapter.cjs +6 -6
  105. package/batteries/llm/webllm_chat_completions/adapter.mjs +6 -6
  106. package/batteries/llm/webllm_chat_completions/helpers.cjs +1 -1
  107. package/batteries/llm/webllm_chat_completions/helpers.mjs +1 -1
  108. package/batteries/llm/webllm_chat_completions/validation.cjs +2 -2
  109. package/batteries/llm/webllm_chat_completions/validation.mjs +2 -2
  110. package/batteries/llm/webllm_chat_completions.cjs +2 -2
  111. package/batteries/llm/webllm_chat_completions.mjs +2 -2
  112. package/batteries/llm.cjs +2 -2
  113. package/batteries/llm.mjs +2 -2
  114. package/batteries/media/forge.cjs +4 -4
  115. package/batteries/media/forge.mjs +4 -4
  116. package/batteries/media/lint.cjs +1 -1
  117. package/batteries/media/lint.mjs +1 -1
  118. package/batteries/orchestration/cells/jexl.cjs +1 -1
  119. package/batteries/orchestration/cells/jexl.mjs +1 -1
  120. package/batteries/orchestration/cells/lua.cjs +1 -1
  121. package/batteries/orchestration/cells/lua.mjs +1 -1
  122. package/batteries/orchestration/cells/structured.cjs +1 -1
  123. package/batteries/orchestration/cells/structured.mjs +1 -1
  124. package/batteries/orchestration/dispatch_reasoner.cjs +4 -4
  125. package/batteries/orchestration/dispatch_reasoner.mjs +4 -4
  126. package/batteries/orchestration/executor.cjs +2 -2
  127. package/batteries/orchestration/executor.mjs +2 -2
  128. package/batteries/orchestration/forge.cjs +3 -3
  129. package/batteries/orchestration/forge.mjs +3 -3
  130. package/batteries/orchestration/validation.cjs +2 -2
  131. package/batteries/orchestration/validation.mjs +2 -2
  132. package/batteries/orchestration.cjs +3 -3
  133. package/batteries/orchestration.mjs +3 -3
  134. package/batteries/sandbox/js.cjs +1 -1
  135. package/batteries/sandbox/js.mjs +1 -1
  136. package/batteries/sandbox/tools.cjs +1 -1
  137. package/batteries/sandbox/tools.mjs +1 -1
  138. package/batteries/sandbox.cjs +4 -4
  139. package/batteries/sandbox.mjs +4 -4
  140. package/batteries/skills/in_memory.cjs +1 -1
  141. package/batteries/skills/in_memory.mjs +1 -1
  142. package/batteries/skills.cjs +9 -9
  143. package/batteries/skills.mjs +9 -9
  144. package/batteries/specialists/stt/transformers_js.cjs +1 -1
  145. package/batteries/specialists/stt/transformers_js.mjs +1 -1
  146. package/batteries/specialists/stt.cjs +1 -1
  147. package/batteries/specialists/stt.mjs +1 -1
  148. package/batteries/specialists.cjs +1 -1
  149. package/batteries/specialists.mjs +1 -1
  150. package/batteries/tools/_shared.cjs +2 -2
  151. package/batteries/tools/_shared.mjs +2 -2
  152. package/batteries/tools/color.cjs +2 -2
  153. package/batteries/tools/color.mjs +2 -2
  154. package/batteries/tools/comparison.cjs +2 -2
  155. package/batteries/tools/comparison.mjs +2 -2
  156. package/batteries/tools/data_structure.cjs +2 -2
  157. package/batteries/tools/data_structure.mjs +2 -2
  158. package/batteries/tools/datetime_extended.cjs +2 -2
  159. package/batteries/tools/datetime_extended.mjs +2 -2
  160. package/batteries/tools/datetime_math.cjs +2 -2
  161. package/batteries/tools/datetime_math.mjs +2 -2
  162. package/batteries/tools/encoding.cjs +2 -2
  163. package/batteries/tools/encoding.mjs +2 -2
  164. package/batteries/tools/formatting.cjs +2 -2
  165. package/batteries/tools/formatting.mjs +2 -2
  166. package/batteries/tools/geo_basics.cjs +2 -2
  167. package/batteries/tools/geo_basics.mjs +2 -2
  168. package/batteries/tools/math.cjs +2 -2
  169. package/batteries/tools/math.mjs +2 -2
  170. package/batteries/tools/memory.cjs +4 -4
  171. package/batteries/tools/memory.mjs +4 -4
  172. package/batteries/tools/parsing.cjs +3 -3
  173. package/batteries/tools/parsing.mjs +3 -3
  174. package/batteries/tools/retrievables.cjs +4 -4
  175. package/batteries/tools/retrievables.mjs +4 -4
  176. package/batteries/tools/scrapper.cjs +1 -1
  177. package/batteries/tools/scrapper.mjs +1 -1
  178. package/batteries/tools/searxng.cjs +1 -1
  179. package/batteries/tools/searxng.mjs +1 -1
  180. package/batteries/tools/standing_instructions.cjs +3 -3
  181. package/batteries/tools/standing_instructions.mjs +3 -3
  182. package/batteries/tools/statistics.cjs +3 -3
  183. package/batteries/tools/statistics.mjs +3 -3
  184. package/batteries/tools/string_processing.cjs +2 -2
  185. package/batteries/tools/string_processing.mjs +2 -2
  186. package/batteries/tools/structured_data.cjs +2 -2
  187. package/batteries/tools/structured_data.mjs +2 -2
  188. package/batteries/tools/text_analysis.cjs +3 -3
  189. package/batteries/tools/text_analysis.mjs +3 -3
  190. package/batteries/tools/text_comparison.cjs +2 -2
  191. package/batteries/tools/text_comparison.mjs +2 -2
  192. package/batteries/tools/time.cjs +2 -2
  193. package/batteries/tools/time.mjs +2 -2
  194. package/batteries/tools/unit_conversion.cjs +2 -2
  195. package/batteries/tools/unit_conversion.mjs +2 -2
  196. package/batteries/tools.cjs +2 -2
  197. package/batteries/tools.mjs +2 -2
  198. package/batteries/validation.cjs +5 -5
  199. package/batteries/validation.mjs +5 -5
  200. package/batteries/vector/conformance.cjs +59 -0
  201. package/batteries/vector/conformance.cjs.map +1 -1
  202. package/batteries/vector/conformance.mjs +59 -0
  203. package/batteries/vector/conformance.mjs.map +1 -1
  204. package/batteries/vector/lancedb.cjs +1 -1
  205. package/batteries/vector/lancedb.cjs.map +1 -1
  206. package/batteries/vector/lancedb.mjs +1 -1
  207. package/batteries/vector/lancedb.mjs.map +1 -1
  208. package/batteries/vector/retrievable.cjs +1 -1
  209. package/batteries/vector/retrievable.mjs +1 -1
  210. package/batteries/vector/sqlite_vec/index.d.ts +1 -1
  211. package/batteries/vector/sqlite_vec.cjs +19 -30
  212. package/batteries/vector/sqlite_vec.cjs.map +1 -1
  213. package/batteries/vector/sqlite_vec.mjs +20 -31
  214. package/batteries/vector/sqlite_vec.mjs.map +1 -1
  215. package/batteries.cjs +6 -6
  216. package/batteries.mjs +6 -6
  217. package/{chat_common-4huaTp6d.cjs → chat_common-CNayzS1V.cjs} +2 -2
  218. package/{chat_common-4huaTp6d.cjs.map → chat_common-CNayzS1V.cjs.map} +1 -1
  219. package/{chat_common-D_XGNjcK.mjs → chat_common-DKw8FDol.mjs} +2 -2
  220. package/{chat_common-D_XGNjcK.mjs.map → chat_common-DKw8FDol.mjs.map} +1 -1
  221. package/{common-BiRzOsxe.cjs → common-CqetsItm.cjs} +7 -7
  222. package/{common-BiRzOsxe.cjs.map → common-CqetsItm.cjs.map} +1 -1
  223. package/{common-DsLvTGmm.mjs → common-oI1niK9Z.mjs} +7 -7
  224. package/{common-DsLvTGmm.mjs.map → common-oI1niK9Z.mjs.map} +1 -1
  225. package/common.cjs +7 -7
  226. package/common.mjs +7 -7
  227. package/{dispatch_runner-DDH_dGPU.mjs → dispatch_runner-BZDXUe0G.mjs} +4 -4
  228. package/{dispatch_runner-DDH_dGPU.mjs.map → dispatch_runner-BZDXUe0G.mjs.map} +1 -1
  229. package/{dispatch_runner-C5S3KCqH.cjs → dispatch_runner-DDUxXJC3.cjs} +4 -4
  230. package/{dispatch_runner-C5S3KCqH.cjs.map → dispatch_runner-DDUxXJC3.cjs.map} +1 -1
  231. package/dispatch_runner.cjs +1 -1
  232. package/dispatch_runner.mjs +1 -1
  233. package/{ecmascript-CWLZ7bCX.mjs → ecmascript-B9Z2C24U.mjs} +5 -5
  234. package/{ecmascript-CWLZ7bCX.mjs.map → ecmascript-B9Z2C24U.mjs.map} +1 -1
  235. package/{ecmascript-BGr_0Dwn.cjs → ecmascript-BYfmjg7y.cjs} +5 -5
  236. package/{ecmascript-BGr_0Dwn.cjs.map → ecmascript-BYfmjg7y.cjs.map} +1 -1
  237. package/eslint/rules.cjs +1 -1
  238. package/eslint/rules.mjs +1 -1
  239. package/eslint.cjs +3 -3
  240. package/eslint.mjs +3 -3
  241. package/exceptions.cjs +1 -1
  242. package/exceptions.mjs +1 -1
  243. package/forge.cjs +2 -2
  244. package/forge.mjs +2 -2
  245. package/guards.cjs +7 -7
  246. package/guards.mjs +7 -7
  247. package/{helpers-BPi_iwxv.cjs → helpers-DPlh_7Bn.cjs} +3 -3
  248. package/{helpers-BPi_iwxv.cjs.map → helpers-DPlh_7Bn.cjs.map} +1 -1
  249. package/{helpers-D47G8WQb.mjs → helpers-mbn_EsDV.mjs} +3 -3
  250. package/{helpers-D47G8WQb.mjs.map → helpers-mbn_EsDV.mjs.map} +1 -1
  251. package/index.cjs +11 -11
  252. package/index.mjs +11 -11
  253. package/{isolation-B2FgKbap.cjs → isolation-B01xCIoV.cjs} +2 -2
  254. package/{isolation-B2FgKbap.cjs.map → isolation-B01xCIoV.cjs.map} +1 -1
  255. package/{isolation-BRGpiU-K.mjs → isolation-CO0NiK8R.mjs} +2 -2
  256. package/{isolation-BRGpiU-K.mjs.map → isolation-CO0NiK8R.mjs.map} +1 -1
  257. package/{manifest-B5bWMHgj.mjs → manifest-D8UTRohY.mjs} +2 -2
  258. package/{manifest-B5bWMHgj.mjs.map → manifest-D8UTRohY.mjs.map} +1 -1
  259. package/{manifest-Chjh-3s1.cjs → manifest-IP1IOJcg.cjs} +2 -2
  260. package/{manifest-Chjh-3s1.cjs.map → manifest-IP1IOJcg.cjs.map} +1 -1
  261. package/mcp/adk-docs-corpus.json +2 -2
  262. package/package.json +538 -538
  263. package/{predicates-C9jl2QPZ.cjs → predicates-Bzaa7gNI.cjs} +2 -2
  264. package/{predicates-C9jl2QPZ.cjs.map → predicates-Bzaa7gNI.cjs.map} +1 -1
  265. package/{predicates-2dZQ82LY.mjs → predicates-CM27Z3TF.mjs} +2 -2
  266. package/{predicates-2dZQ82LY.mjs.map → predicates-CM27Z3TF.mjs.map} +1 -1
  267. package/{retrievable-ReauMJxJ.cjs → retrievable-Bq-O3k6r.cjs} +3 -3
  268. package/{retrievable-ReauMJxJ.cjs.map → retrievable-Bq-O3k6r.cjs.map} +1 -1
  269. package/{retrievable-mFgC1aty.mjs → retrievable-CXTAUuuv.mjs} +3 -3
  270. package/{retrievable-mFgC1aty.mjs.map → retrievable-CXTAUuuv.mjs.map} +1 -1
  271. package/{scrapper-BsEY0Wo6.cjs → scrapper-B8xG9lTD.cjs} +5 -5
  272. package/{scrapper-BsEY0Wo6.cjs.map → scrapper-B8xG9lTD.cjs.map} +1 -1
  273. package/{scrapper-bShwZxKP.mjs → scrapper-DiQ5FfDL.mjs} +5 -5
  274. package/{scrapper-bShwZxKP.mjs.map → scrapper-DiQ5FfDL.mjs.map} +1 -1
  275. package/{searxng-CAY-bOMl.mjs → searxng-BFTJ6rTE.mjs} +5 -5
  276. package/{searxng-CAY-bOMl.mjs.map → searxng-BFTJ6rTE.mjs.map} +1 -1
  277. package/{searxng-CLF0vBMT.cjs → searxng-EJhWRnIE.cjs} +5 -5
  278. package/{searxng-CLF0vBMT.cjs.map → searxng-EJhWRnIE.cjs.map} +1 -1
  279. package/server.json +2 -2
  280. package/skills/adk-assembly/SKILL.md +2 -2
  281. package/{spooled_artifact-CFjf6ULg.cjs → spooled_artifact---DmicFW.cjs} +384 -384
  282. package/spooled_artifact---DmicFW.cjs.map +1 -0
  283. package/{spooled_artifact-B710Rb0d.mjs → spooled_artifact-Bw_7swIp.mjs} +385 -385
  284. package/spooled_artifact-Bw_7swIp.mjs.map +1 -0
  285. package/spooled_artifact.cjs +2 -2
  286. package/spooled_artifact.mjs +2 -2
  287. package/{spooled_markdown_artifact-PWppwnPQ.cjs → spooled_markdown_artifact-Rjzj-kyh.cjs} +3 -3
  288. package/{spooled_markdown_artifact-PWppwnPQ.cjs.map → spooled_markdown_artifact-Rjzj-kyh.cjs.map} +1 -1
  289. package/{spooled_markdown_artifact-1C4mmi73.mjs → spooled_markdown_artifact-vd6eNtIP.mjs} +3 -3
  290. package/{spooled_markdown_artifact-1C4mmi73.mjs.map → spooled_markdown_artifact-vd6eNtIP.mjs.map} +1 -1
  291. package/{thought-BKXwUZoq.mjs → thought-CxSaF6Xf.mjs} +3 -3
  292. package/{thought-BKXwUZoq.mjs.map → thought-CxSaF6Xf.mjs.map} +1 -1
  293. package/{thought-D5fJsxBW.cjs → thought-Dp3sMWW6.cjs} +3 -3
  294. package/{thought-D5fJsxBW.cjs.map → thought-Dp3sMWW6.cjs.map} +1 -1
  295. package/{tokenizable-DDIdXbJN.cjs → tokenizable-BcodRtoW.cjs} +29 -29
  296. package/{tokenizable-DDIdXbJN.cjs.map → tokenizable-BcodRtoW.cjs.map} +1 -1
  297. package/{tokenizable-xPXj1AQX.mjs → tokenizable-VB4Av8GF.mjs} +30 -30
  298. package/{tokenizable-xPXj1AQX.mjs.map → tokenizable-VB4Av8GF.mjs.map} +1 -1
  299. package/{tool_call-CDV5pW13.cjs → tool_call-B9px4W9k.cjs} +3 -3
  300. package/{tool_call-CDV5pW13.cjs.map → tool_call-B9px4W9k.cjs.map} +1 -1
  301. package/{tool_call-D-LqMvpU.mjs → tool_call-Cfaj-6zK.mjs} +3 -3
  302. package/{tool_call-D-LqMvpU.mjs.map → tool_call-Cfaj-6zK.mjs.map} +1 -1
  303. package/{tools-CvCMdAd7.mjs → tools-D0MBDh2R.mjs} +6 -6
  304. package/{tools-CvCMdAd7.mjs.map → tools-D0MBDh2R.mjs.map} +1 -1
  305. package/{tools-CACuuMV4.cjs → tools-aNbi6JyA.cjs} +6 -6
  306. package/{tools-CACuuMV4.cjs.map → tools-aNbi6JyA.cjs.map} +1 -1
  307. package/{toon-CCjuuzd_.mjs → toon-BSTQnHed.mjs} +6 -6
  308. package/{toon-CCjuuzd_.mjs.map → toon-BSTQnHed.mjs.map} +1 -1
  309. package/{toon-B7Q9RWJF.cjs → toon-DmLwZ6H1.cjs} +6 -6
  310. package/{toon-B7Q9RWJF.cjs.map → toon-DmLwZ6H1.cjs.map} +1 -1
  311. package/{transformers_js-DM01eAzh.cjs → transformers_js-7OzeS_Tp.cjs} +2 -2
  312. package/{transformers_js-DM01eAzh.cjs.map → transformers_js-7OzeS_Tp.cjs.map} +1 -1
  313. package/{transformers_js-BR2Ov0Su.mjs → transformers_js-p3lAkHFH.mjs} +2 -2
  314. package/{transformers_js-BR2Ov0Su.mjs.map → transformers_js-p3lAkHFH.mjs.map} +1 -1
  315. package/{turn_runner-BgPw9uqb.mjs → turn_runner-BHHD6h77.mjs} +4 -4
  316. package/{turn_runner-BgPw9uqb.mjs.map → turn_runner-BHHD6h77.mjs.map} +1 -1
  317. package/{turn_runner-CP2zxSlu.cjs → turn_runner-Dj7JsUTQ.cjs} +4 -4
  318. package/{turn_runner-CP2zxSlu.cjs.map → turn_runner-Dj7JsUTQ.cjs.map} +1 -1
  319. package/turn_runner.cjs +1 -1
  320. package/turn_runner.mjs +1 -1
  321. package/{xml-BqTTIFhv.mjs → xml-CYseDztH.mjs} +6 -6
  322. package/{xml-BqTTIFhv.mjs.map → xml-CYseDztH.mjs.map} +1 -1
  323. package/{xml-viE54OTe.cjs → xml-zJul8jMQ.cjs} +6 -6
  324. package/{xml-viE54OTe.cjs.map → xml-zJul8jMQ.cjs.map} +1 -1
  325. package/{yaml-B1So-pUR.mjs → yaml-BPBoiOjx.mjs} +6 -6
  326. package/{yaml-B1So-pUR.mjs.map → yaml-BPBoiOjx.mjs.map} +1 -1
  327. package/{yaml-cGhhPyZq.cjs → yaml-D0PzoRAr.cjs} +6 -6
  328. package/{yaml-cGhhPyZq.cjs.map → yaml-D0PzoRAr.cjs.map} +1 -1
  329. package/artifact_methods-9BemAvd4.mjs +0 -1
  330. package/artifact_methods-FKgk4q_1.cjs +0 -1
  331. package/spooled_artifact-B710Rb0d.mjs.map +0 -1
  332. package/spooled_artifact-CFjf6ULg.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"dispatch_runner-DDH_dGPU.mjs","names":["#turnToolCalls","#turnRetrievables","#doStoreRetrievable","#checkArtifactIdCollision","#doMutateRetrievable","#replaceById","#doStoreToolCall","#doMutateToolCall","#id","#turnAbortController","#stash","#systemPrompt","#standingInstructions","#turnMemories","#turnMessages","#turnThoughts","#id","#dispatchId","#iteration","#turnAbortController","#stash","#systemPrompt","#standingInstructions","#turnMemories","#turnRetrievables","#turnMessages","#turnThoughts","#turnToolCalls","#tools","#toolCallChecksums","#fetchMemories","#fetchRetrievables","#fetchMessages","#fetchThoughts","#fetchToolCalls","#fetchTools","#refreshStandingInstructions","#storeStandingInstruction","#mutateStandingInstruction","#deleteStandingInstruction","#storeMemory","#mutateMemory","#deleteMemory","#storeRetrievable","#mutateRetrievable","#deleteRetrievable","#storeMessage","#mutateMessage","#deleteMessage","#storeThought","#mutateThought","#deleteThought","#storeToolCall","#mutateToolCall","#deleteToolCall","#replaceToolCallGroup","#storeMediaBytes","#storeRetrievableBytes","#waitFor","#signalled","#nackError","#hooks","#ackHandlers","#doStoreStandingInstruction","#doMutateStandingInstruction","#doDeleteStandingInstruction","#doStoreMemory","#doMutateMemory","#doDeleteMemory","#doStoreRetrievable","#doMutateRetrievable","#doDeleteRetrievable","#doStoreMessage","#doMutateMessage","#doDeleteMessage","#doStoreThought","#doMutateThought","#doDeleteThought","#doStoreToolCall","#doMutateToolCall","#doDeleteToolCall","#doReplaceToolCallGroup","#replaceById","#checkArtifactIdCollision","#sourceCtx","#deltaQueue","#functionalHooks","#observabilityHooks","#inputPipeline","#outputPipeline","#buildContext","#wireContextHooks","#replaceById","#runDispatch","#buildHelpers","#forgeArtifactTools","#runPipeline","#flush","#isAbortError","#applyDeltaToParent"],"sources":["../src/lib/utils/retrievable_spool.ts","../src/lib/contracts/turn_runner_context.ts","../src/lib/contracts/dispatch_context.ts","../src/lib/dispatch_runner.ts"],"sourcesContent":["import { Tokenizable } from '../classes/tokenizable'\nimport { Retrievable } from '../classes/retrievable'\nimport { SpooledArtifact } from '../classes/spooled_artifact'\nimport type { SpoolReader } from '../contracts/spool_reader'\nimport type { ConduitBytes } from '../contracts/dispatch_context'\n\nexport interface RetrievableSpoolContext {\n storeRetrievableBytes: (id: string, bytes: ConduitBytes) => SpoolReader | Promise<SpoolReader>\n turnRetrievables: Set<Retrievable>\n}\n\nexport const computeTextHints = (text: string): { byteLength: number; lineCount: number } => ({\n byteLength: new TextEncoder().encode(text).byteLength,\n lineCount: text.length === 0 ? 0 : text.split('\\n').length,\n})\n\nexport async function autoSpoolRetrievable(\n ctx: Pick<RetrievableSpoolContext, 'storeRetrievableBytes'>,\n v: Retrievable\n): Promise<Retrievable> {\n if (!Tokenizable.isTokenizable(v.content) || v.content.dynamic || v.inline) return v\n const text = v.content.toString()\n const hints = computeTextHints(text)\n const reader = await ctx.storeRetrievableBytes(v.id, text)\n const Ctor = v.artifactConstructor?.() ?? SpooledArtifact\n const artifact = new Ctor(reader)\n if (typeof (artifact as { _setSizeHints?: unknown })._setSizeHints === 'function') {\n artifact._setSizeHints(hints)\n }\n // Do not spread the instance: its derived enumerable `sizeUnknown` getter is not a\n // RawRetrievable field and strict validation intentionally rejects it.\n return new Retrievable({\n id: v.id,\n content: artifact,\n trustTier: v.trustTier,\n source: v.source,\n kind: v.kind,\n score: v.score,\n createdAt: v.createdAt,\n updatedAt: v.updatedAt,\n inline: v.inline,\n artifactConstructor: v.artifactConstructor,\n })\n}\n\nexport async function normalizeRetrievables(ctx: RetrievableSpoolContext): Promise<void> {\n const records = await Promise.all(\n [...ctx.turnRetrievables].map((r) => autoSpoolRetrievable(ctx, r))\n )\n ctx.turnRetrievables.clear()\n for (const record of records) ctx.turnRetrievables.add(record)\n}\n\nexport function assertUniqueRetrievableIds(recs: ReadonlyArray<Pick<Retrievable, 'id'>>): void {\n const seen = new Set<string>()\n for (const record of recs) {\n if (seen.has(record.id)) throw new Error(`Duplicate retrievable id: ${record.id}`)\n seen.add(record.id)\n }\n}\n","import { v6 as uuidv6 } from 'uuid'\nimport { validator } from '@nhtio/validation'\nimport { Registry } from '../classes/registry'\nimport { Tokenizable } from '../classes/tokenizable'\nimport { validateOrThrow } from '../utils/validation'\nimport { isInstanceOf, isError } from '../utils/guards'\nimport { E_INVALID_TURN_CONTEXT, E_ARTIFACT_ID_COLLISION } from '../exceptions/runtime'\nimport { autoSpoolRetrievable, assertUniqueRetrievableIds } from '../utils/retrievable_spool'\nimport type { Tool } from '../classes/tool'\nimport type { Memory } from '../classes/memory'\nimport type { Message } from '../classes/message'\nimport type { Thought } from '../classes/thought'\nimport type { SpoolReader } from './spool_reader'\nimport type { MediaReader } from './media_reader'\nimport type { ToolCall } from '../classes/tool_call'\nimport type { ConduitBytes } from './dispatch_context'\nimport type { Retrievable } from '../classes/retrievable'\nimport type { ToolRegistry } from '../classes/tool_registry'\nimport type {\n EmitMessageFn,\n EmitThoughtFn,\n EmitToolCallFn,\n EmitToolExecutionEndFn,\n EmitToolExecutionStartFn,\n OpenGateFn,\n} from '../types/turn_runner'\n\n/**\n * Plain input object supplied to {@link TurnContext} at construction time.\n *\n * @remarks\n * Validated against `turnContextSchema` before the `TurnContext` instance is created.\n * Fields will grow as the turn execution model takes shape (e.g. input message, tool\n * definitions, model client config).\n */\nexport interface RawTurnContext {\n /** `AbortController` whose signal can be used to cancel the turn mid-flight. */\n turnAbortController: AbortController\n /** A registry for arbitrary additional data to be added to the context as needed; initially empty. */\n stash?: Record<string, unknown>\n /** The system prompt guiding the agent's behavior for this turn. */\n systemPrompt: string | Tokenizable\n /** Standing instructions for the agent, applied to every turn. */\n standingInstructions: (string | Tokenizable)[]\n}\n\n/**\n * A fully-resolved {@link RawTurnContext} where all optional fields have been filled in by the\n * schema (e.g. `stash` defaulted to `{}`).\n *\n * @remarks\n * This is the shape returned by `turnContextSchema` after validation — use it wherever a\n * guaranteed-present context is needed rather than the raw caller-supplied input.\n */\nexport type ResolvedTurnContext = Required<RawTurnContext>\n\n/**\n * Validator schema used to validate a {@link RawTurnContext} before constructing a {@link TurnContext}.\n *\n * @remarks\n * Validates all four fields of {@link RawTurnContext}:\n * - `turnAbortController` — required `AbortController` instance.\n * - `stash` — optional string-keyed object; defaults to `{}`.\n * - `systemPrompt` — required string or {@link @nhtio/adk!Tokenizable}, via {@link @nhtio/adk!Tokenizable.schema}.\n * - `standingInstructions` — optional array of strings or {@link @nhtio/adk!Tokenizable} instances, each\n * validated via {@link @nhtio/adk!Tokenizable.schema}; defaults to `[]`.\n *\n * Throws a `ValidationException` (via {@link validateOrThrow}) when validation fails.\n */\nexport const turnContextSchema = validator\n .object<RawTurnContext>({\n turnAbortController: validator\n .alternatives(\n validator.object().instance(AbortController as any),\n validator.function().instance(AbortController as any)\n )\n .required(),\n // eslint-disable-next-line adk/require-validator-any-required -- map value type-arg: stash holds arbitrary values; disposition is set by .default({}) on the object\n stash: validator.object().pattern(validator.string(), validator.any()).default({}),\n systemPrompt: Tokenizable.schema.required(),\n standingInstructions: validator.array().items(Tokenizable.schema).default([]),\n })\n .required()\n\n/**\n * A function that retrieves the memories relevant to the current turn.\n *\n * @remarks\n * Receives the active {@link TurnContext} so implementations can filter or rank memories\n * based on turn-specific state (e.g. the system prompt, standing instructions, or stash).\n * May be synchronous or asynchronous.\n */\nexport type MemoryRetrievalFn = (ctx: TurnContext) => Memory[] | Promise<Memory[]>\n\n/**\n * A function that retrieves the retrievable (RAG) records relevant to the current turn.\n *\n * @remarks\n * Receives the active {@link TurnContext} so implementations can rank, filter, or compose\n * retrieval results against the turn-specific state (system prompt, standing instructions, etc.).\n * The retrieval middleware that produces these records is responsible for assigning each one's\n * `trustTier` — batteries MUST NOT auto-classify retrieved content.\n * May be synchronous or asynchronous.\n */\nexport type RetrievableRetrievalFn = (ctx: TurnContext) => Retrievable[] | Promise<Retrievable[]>\n\n/**\n * A function that retrieves the conversation messages relevant to the current turn.\n *\n * @remarks\n * Receives the active {@link TurnContext} so implementations can apply turn-aware filtering or\n * windowing. Returns only `user` and `assistant` {@link @nhtio/adk!Message} entries — system instructions\n * and tool results are not part of the persisted message history.\n * May be synchronous or asynchronous.\n */\nexport type MessageRetrievalFn = (ctx: TurnContext) => Message[] | Promise<Message[]>\n\n/**\n * A function that retrieves the thought traces relevant to the current turn.\n *\n * @remarks\n * Receives the active {@link TurnContext} so implementations can apply turn-aware filtering or\n * attribution (e.g. filtering to a specific agent's identity in multi-agent conversations).\n * May be synchronous or asynchronous.\n */\nexport type ThoughtRetrievalFn = (ctx: TurnContext) => Thought[] | Promise<Thought[]>\n\n/**\n * A function that retrieves the tool call records relevant to the current turn.\n *\n * @remarks\n * Receives the active {@link TurnContext} so implementations can filter by completion state,\n * agent identity, or any other turn-specific criteria.\n * May be synchronous or asynchronous.\n */\nexport type ToolCallRetrievalFn = (ctx: TurnContext) => ToolCall[] | Promise<ToolCall[]>\n\n/**\n * A function that retrieves the tools available for the current turn.\n *\n * @remarks\n * Receives the active {@link TurnContext} so implementations can apply turn-aware filtering\n * (e.g. RBAC scopes, feature flags). May be synchronous or asynchronous.\n */\nexport type ToolsRetrievalFn = (ctx: TurnContext) => Tool[] | Promise<Tool[]>\n\n/**\n * A function that refreshes and returns the standing instructions for the current turn.\n *\n * @remarks\n * Called to re-derive standing instructions mid-turn when they may have changed.\n * May be synchronous or asynchronous.\n */\nexport type StandingInstructionsRefreshFn = (\n ctx: TurnContext\n) => (string | Tokenizable)[] | Promise<(string | Tokenizable)[]>\n\n/** Stores a new standing instruction in the persistence layer. */\nexport type StandingInstructionStoreFn = (\n ctx: TurnContext,\n v: string | Tokenizable\n) => void | Promise<void>\n\n/** Updates an existing standing instruction in the persistence layer. */\nexport type StandingInstructionMutateFn = (\n ctx: TurnContext,\n v: string | Tokenizable\n) => void | Promise<void>\n\n/** Removes a standing instruction from the persistence layer. */\nexport type StandingInstructionDeleteFn = (\n ctx: TurnContext,\n v: string | Tokenizable\n) => void | Promise<void>\n\n/** Stores a new memory in the persistence layer. */\nexport type MemoryStoreFn = (ctx: TurnContext, v: Memory) => void | Promise<void>\n\n/** Updates an existing memory in the persistence layer. */\nexport type MemoryMutateFn = (ctx: TurnContext, v: Memory) => void | Promise<void>\n\n/** Removes a memory from the persistence layer by ID. */\nexport type MemoryDeleteFn = (ctx: TurnContext, id: string) => void | Promise<void>\n\n/** Stores a new retrievable record in the persistence layer. */\nexport type RetrievableStoreFn = (ctx: TurnContext, v: Retrievable) => void | Promise<void>\n\n/** Updates an existing retrievable record in the persistence layer. */\nexport type RetrievableMutateFn = (ctx: TurnContext, v: Retrievable) => void | Promise<void>\n\n/** Removes a retrievable record from the persistence layer by ID. */\nexport type RetrievableDeleteFn = (ctx: TurnContext, id: string) => void | Promise<void>\n\n/** Stores a new message in the persistence layer. */\nexport type MessageStoreFn = (ctx: TurnContext, v: Message) => void | Promise<void>\n\n/** Updates an existing message in the persistence layer. */\nexport type MessageMutateFn = (ctx: TurnContext, v: Message) => void | Promise<void>\n\n/** Removes a message from the persistence layer by ID. */\nexport type MessageDeleteFn = (ctx: TurnContext, id: string) => void | Promise<void>\n\n/** Stores a new thought in the persistence layer. */\nexport type ThoughtStoreFn = (ctx: TurnContext, v: Thought) => void | Promise<void>\n\n/** Updates an existing thought in the persistence layer. */\nexport type ThoughtMutateFn = (ctx: TurnContext, v: Thought) => void | Promise<void>\n\n/** Removes a thought from the persistence layer by ID. */\nexport type ThoughtDeleteFn = (ctx: TurnContext, id: string) => void | Promise<void>\n\n/** Stores a new tool call in the persistence layer. */\nexport type ToolCallStoreFn = (ctx: TurnContext, v: ToolCall) => void | Promise<void>\n\n/** Updates an existing tool call in the persistence layer. */\nexport type ToolCallMutateFn = (ctx: TurnContext, v: ToolCall) => void | Promise<void>\n\n/** Removes a tool call from the persistence layer by ID. */\nexport type ToolCallDeleteFn = (ctx: TurnContext, id: string) => void | Promise<void>\n\n/** Optionally persists a complete tool-call group replacement atomically. */\nexport type ToolCallGroupReplaceFn = (\n ctx: TurnContext,\n removedIds: readonly string[],\n replacements: readonly ToolCall[]\n) => void | Promise<void>\n\n/**\n * Persists tool-generated media bytes into consumer storage and returns a {@link @nhtio/adk!MediaReader}.\n * A byte-persistence conduit, not a mutation — returns a value and touches no turn state.\n */\nexport type MediaBytesStoreFn = (\n ctx: TurnContext,\n id: string,\n bytes: ConduitBytes\n) => MediaReader | Promise<MediaReader>\n\n/**\n * Persists extracted retrievable text bytes into consumer storage and returns a\n * {@link @nhtio/adk!SpoolReader}. A byte-persistence conduit, not a mutation.\n */\nexport type RetrievableBytesStoreFn = (\n ctx: TurnContext,\n id: string,\n bytes: ConduitBytes\n) => SpoolReader | Promise<SpoolReader>\n\n/**\n * Callbacks injected into a {@link TurnContext} by `TurnRunner` at run time.\n *\n * @remarks\n * These are supplied by the `TurnRunnerConfig` and bound to the context so middleware\n * can call fetch, emit, and mutation methods directly on the context without needing a reference\n * to the runner or its emitters. Not exported — `TurnContext` is constructed internally and\n * callers never need to reference this shape.\n *\n * @internal\n */\ninterface TurnRunnerInjected {\n /** Retrieves memories relevant to this turn. */\n fetchMemories: MemoryRetrievalFn\n /** Retrieves conversation messages relevant to this turn. */\n fetchMessages: MessageRetrievalFn\n /** Retrieves thought traces relevant to this turn. */\n fetchThoughts: ThoughtRetrievalFn\n /** Retrieves tool call records relevant to this turn. */\n fetchToolCalls: ToolCallRetrievalFn\n /** Retrieves tools available for this turn. */\n fetchTools: ToolsRetrievalFn\n /** Refreshes and returns the standing instructions for this turn. */\n refreshStandingInstructions: StandingInstructionsRefreshFn\n /** Stores a new standing instruction in the persistence layer. */\n storeStandingInstruction: StandingInstructionStoreFn\n /** Updates an existing standing instruction in the persistence layer. */\n mutateStandingInstruction: StandingInstructionMutateFn\n /** Removes a standing instruction from the persistence layer. */\n deleteStandingInstruction: StandingInstructionDeleteFn\n /** Stores a new memory in the persistence layer. */\n storeMemory: MemoryStoreFn\n /** Updates an existing memory in the persistence layer. */\n mutateMemory: MemoryMutateFn\n /** Removes a memory from the persistence layer by ID. */\n deleteMemory: MemoryDeleteFn\n /** Retrieves retrievable records relevant to this turn. */\n fetchRetrievables: RetrievableRetrievalFn\n /** Stores a new retrievable record in the persistence layer. */\n storeRetrievable: RetrievableStoreFn\n /** Updates an existing retrievable record in the persistence layer. */\n mutateRetrievable: RetrievableMutateFn\n /** Removes a retrievable record from the persistence layer by ID. */\n deleteRetrievable: RetrievableDeleteFn\n /** Stores a new message in the persistence layer. */\n storeMessage: MessageStoreFn\n /** Updates an existing message in the persistence layer. */\n mutateMessage: MessageMutateFn\n /** Removes a message from the persistence layer by ID. */\n deleteMessage: MessageDeleteFn\n /** Stores a new thought in the persistence layer. */\n storeThought: ThoughtStoreFn\n /** Updates an existing thought in the persistence layer. */\n mutateThought: ThoughtMutateFn\n /** Removes a thought from the persistence layer by ID. */\n deleteThought: ThoughtDeleteFn\n /** Stores a new tool call in the persistence layer. */\n storeToolCall: ToolCallStoreFn\n /** Updates an existing tool call in the persistence layer. */\n mutateToolCall: ToolCallMutateFn\n /** Removes a tool call from the persistence layer by ID. */\n deleteToolCall: ToolCallDeleteFn\n /** Optionally persists a complete tool-call group replacement atomically. */\n replaceToolCallGroup?: ToolCallGroupReplaceFn\n /** Persists tool-generated media bytes; returns a `MediaReader`. */\n storeMediaBytes: MediaBytesStoreFn\n /** Persists extracted retrievable text bytes; returns a `SpoolReader`. */\n storeRetrievableBytes: RetrievableBytesStoreFn\n /** Emits a `message` event on the runner. */\n emitMessage: EmitMessageFn\n /** Emits a `thought` event on the runner. */\n emitThought: EmitThoughtFn\n /** Emits a `toolCall` event on the runner. */\n emitToolCall: EmitToolCallFn\n /** Emits a `toolExecutionStart` event on the observability bus. */\n emitToolExecutionStart: EmitToolExecutionStartFn\n /** Emits a `toolExecutionEnd` event on the observability bus. */\n emitToolExecutionEnd: EmitToolExecutionEndFn\n /** Opens a turn gate; `turnId` and `abortSignal` are injected by the runner. */\n openGate: OpenGateFn\n /** The turn-scoped tool registry constructed from the runner's baseline tools. */\n tools: ToolRegistry\n}\n\n/**\n * The validated, strongly-typed context object threaded through every middleware step in a\n * single agent turn.\n *\n * @remarks\n * Constructed from a {@link RawTurnContext} by {@link @nhtio/adk!TurnRunner.run}. Middleware functions\n * receive this object and use it to read and share state across pipeline steps.\n */\nexport class TurnContext {\n /**\n * Returns `true` if `value` is a {@link TurnContext} instance.\n *\n * @remarks\n * Uses {@link @nhtio/adk!isInstanceOf} for cross-realm safety. The ADK does not export the\n * `TurnContext` class itself as a constructable value — use this guard plus the\n * {@link TurnContext} type for runtime detection and TypeScript narrowing.\n *\n * @param value - The value to test.\n * @returns `true` when `value` is a {@link TurnContext} instance.\n */\n public static isTurnContext(value: unknown): value is TurnContext {\n return isInstanceOf(value, 'TurnContext', TurnContext)\n }\n\n #id: string\n #turnAbortController: AbortController\n #stash: Registry\n #systemPrompt: Tokenizable\n #standingInstructions: Set<Tokenizable>\n #turnMemories: Set<Memory>\n #turnRetrievables: Set<Retrievable>\n #turnMessages: Set<Message>\n #turnThoughts: Set<Thought>\n #turnToolCalls: Set<ToolCall>\n\n #replaceById<T extends { id: string }>(set: Set<T>, id: string, replacement: T): Set<T> {\n const next = new Set<T>()\n let inserted = false\n for (const existing of set) {\n if (existing.id === id) {\n if (!inserted) next.add(replacement)\n inserted = true\n } else next.add(existing)\n }\n if (!inserted) next.add(replacement)\n return next\n }\n\n #checkArtifactIdCollision(id: string, source: 'retrievable' | 'toolCall'): void {\n const other = source === 'retrievable' ? this.#turnToolCalls : this.#turnRetrievables\n if ([...other].some((v) => v.id === id)) throw new E_ARTIFACT_ID_COLLISION([id])\n }\n\n async #doStoreRetrievable(i: TurnRunnerInjected, v: Retrievable): Promise<Retrievable> {\n this.#checkArtifactIdCollision(v.id, 'retrievable')\n const record = await autoSpoolRetrievable(this, v)\n this.#turnRetrievables.add(record)\n await i.storeRetrievable(this, record)\n return record\n }\n async #doMutateRetrievable(i: TurnRunnerInjected, v: Retrievable): Promise<Retrievable> {\n this.#checkArtifactIdCollision(v.id, 'retrievable')\n const record = await autoSpoolRetrievable(this, v)\n this.#turnRetrievables = this.#replaceById(this.#turnRetrievables, record.id, record)\n await i.mutateRetrievable(this, record)\n return record\n }\n async #doStoreToolCall(i: TurnRunnerInjected, v: ToolCall): Promise<void> {\n this.#checkArtifactIdCollision(v.id, 'toolCall')\n this.#turnToolCalls.add(v)\n await i.storeToolCall(this, v)\n }\n async #doMutateToolCall(i: TurnRunnerInjected, v: ToolCall): Promise<void> {\n this.#checkArtifactIdCollision(v.id, 'toolCall')\n this.#turnToolCalls = this.#replaceById(this.#turnToolCalls, v.id, v)\n await i.mutateToolCall(this, v)\n }\n\n /**\n * @param raw - The raw context input validated against {@link turnContextSchema}.\n * @param injected - Runtime callbacks supplied by `TurnRunner`; bound as instance methods so\n * middleware can call fetch and emit methods directly on the context.\n * @throws {@link @nhtio/adk!E_INVALID_TURN_CONTEXT} when `raw` does not satisfy the schema.\n *\n * @internal\n */\n constructor(raw: RawTurnContext, injected: TurnRunnerInjected) {\n try {\n raw = validateOrThrow<ResolvedTurnContext>(turnContextSchema, raw, true)\n } catch (err) {\n throw new E_INVALID_TURN_CONTEXT({ cause: isError(err) ? err : undefined })\n }\n this.#id = uuidv6()\n this.#turnAbortController = raw.turnAbortController\n this.#stash = new Registry(raw.stash)\n this.#systemPrompt = Tokenizable.isTokenizable(raw.systemPrompt)\n ? raw.systemPrompt\n : new Tokenizable(raw.systemPrompt)\n this.#standingInstructions = new Set(\n (raw.standingInstructions || []).map((instr) =>\n Tokenizable.isTokenizable(instr) ? instr : new Tokenizable(instr)\n )\n )\n this.#turnMemories = new Set()\n this.#turnRetrievables = new Set()\n this.#turnMessages = new Set()\n this.#turnThoughts = new Set()\n this.#turnToolCalls = new Set()\n\n // Expose read-only properties on the instance for easy access in middleware.\n Object.defineProperties(this, {\n id: {\n get: () => this.#id,\n enumerable: true,\n configurable: false,\n },\n aborted: {\n get: () => Boolean(this.#turnAbortController.signal.aborted),\n enumerable: true,\n configurable: false,\n },\n abortSignal: {\n get: () => this.#turnAbortController.signal,\n enumerable: true,\n configurable: false,\n },\n abort: {\n value: (reason?: unknown) => this.#turnAbortController.abort(reason),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n stash: {\n get: () => this.#stash,\n enumerable: true,\n configurable: false,\n },\n systemPrompt: {\n get: () => this.#systemPrompt,\n enumerable: true,\n configurable: false,\n },\n standingInstructions: {\n get: () => this.#standingInstructions,\n enumerable: true,\n configurable: false,\n },\n turnMemories: {\n get: () => this.#turnMemories,\n enumerable: true,\n configurable: false,\n },\n turnRetrievables: {\n get: () => this.#turnRetrievables,\n enumerable: true,\n configurable: false,\n },\n turnMessages: {\n get: () => this.#turnMessages,\n enumerable: true,\n configurable: false,\n },\n turnThoughts: {\n get: () => this.#turnThoughts,\n enumerable: true,\n configurable: false,\n },\n turnToolCalls: {\n get: () => this.#turnToolCalls,\n enumerable: true,\n configurable: false,\n },\n })\n\n // Attach injected dependencies as instance methods for access in middleware.\n Object.defineProperties(this, {\n fetchMemories: {\n value: () => injected.fetchMemories(this),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n fetchMessages: {\n value: () => injected.fetchMessages(this),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n fetchThoughts: {\n value: () => injected.fetchThoughts(this),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n fetchToolCalls: {\n value: () => injected.fetchToolCalls(this),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n fetchTools: {\n value: () => injected.fetchTools(this),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n refreshStandingInstructions: {\n value: () => injected.refreshStandingInstructions(this),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n storeStandingInstruction: {\n value: (v: string | Tokenizable) => injected.storeStandingInstruction(this, v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n mutateStandingInstruction: {\n value: (v: string | Tokenizable) => injected.mutateStandingInstruction(this, v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n deleteStandingInstruction: {\n value: (v: string | Tokenizable) => injected.deleteStandingInstruction(this, v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n storeMemory: {\n value: (v: Memory) => injected.storeMemory(this, v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n mutateMemory: {\n value: (v: Memory) => injected.mutateMemory(this, v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n deleteMemory: {\n value: (id: string) => injected.deleteMemory(this, id),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n fetchRetrievables: {\n value: async () => {\n const recs = await injected.fetchRetrievables(this)\n assertUniqueRetrievableIds(recs)\n return Promise.all(recs.map((r) => autoSpoolRetrievable(this, r)))\n },\n enumerable: true,\n configurable: false,\n writable: false,\n },\n storeRetrievable: {\n value: (v: Retrievable) => this.#doStoreRetrievable(injected, v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n mutateRetrievable: {\n value: (v: Retrievable) => this.#doMutateRetrievable(injected, v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n deleteRetrievable: {\n value: (id: string) => injected.deleteRetrievable(this, id),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n storeMessage: {\n value: (v: Message) => injected.storeMessage(this, v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n mutateMessage: {\n value: (v: Message) => injected.mutateMessage(this, v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n deleteMessage: {\n value: (id: string) => injected.deleteMessage(this, id),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n storeThought: {\n value: (v: Thought) => injected.storeThought(this, v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n mutateThought: {\n value: (v: Thought) => injected.mutateThought(this, v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n deleteThought: {\n value: (id: string) => injected.deleteThought(this, id),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n storeToolCall: {\n value: (v: ToolCall) => this.#doStoreToolCall(injected, v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n mutateToolCall: {\n value: (v: ToolCall) => this.#doMutateToolCall(injected, v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n deleteToolCall: {\n value: (id: string) => injected.deleteToolCall(this, id),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n replaceToolCallGroup: {\n value: async (ids: readonly string[], replacements: readonly ToolCall[]) => {\n if (injected.replaceToolCallGroup) {\n await injected.replaceToolCallGroup(this, ids, replacements)\n } else {\n // Degrade to the ordinary persistence conduits when no transaction is available. Carry\n // the deletion progress out on the error: without it a failed repair tells a consumer\n // only THAT it failed, leaving a partially mutated store with nothing to reconcile\n // against. Mirrors DispatchContext's degraded path.\n const deletedIds: string[] = []\n try {\n for (const id of ids) {\n await injected.deleteToolCall(this, id)\n deletedIds.push(id)\n }\n for (const replacement of replacements)\n await injected.storeToolCall(this, replacement)\n } catch (error) {\n if (isError(error))\n (error as Error & { deletedIds: string[] }).deletedIds = [...deletedIds]\n throw error\n }\n }\n // Persistence committed — now bring the in-memory collection in line, on BOTH paths.\n // `#doStoreToolCall`/`#doMutateToolCall` maintain this Set; a group replacement that\n // skipped it would leave the turn holding the colliding calls it just renamed away, and\n // the next dispatch seeded from this turn would re-process them and diverge from what\n // was persisted. Replacements land at the position of the first removed member so\n // insertion order is preserved.\n const removing = new Set(ids)\n const next = new Set<ToolCall>()\n let inserted = false\n for (const tc of this.#turnToolCalls) {\n if (removing.has(tc.id)) {\n if (!inserted) {\n for (const replacement of replacements) next.add(replacement)\n inserted = true\n }\n } else next.add(tc)\n }\n if (!inserted) for (const replacement of replacements) next.add(replacement)\n this.#turnToolCalls = next\n },\n enumerable: true,\n configurable: false,\n writable: false,\n },\n storeMediaBytes: {\n value: (id: string, bytes: ConduitBytes) => injected.storeMediaBytes(this, id, bytes),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n storeRetrievableBytes: {\n value: (id: string, bytes: ConduitBytes) => injected.storeRetrievableBytes(this, id, bytes),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n emitMessage: {\n value: injected.emitMessage,\n enumerable: true,\n configurable: false,\n writable: false,\n },\n emitThought: {\n value: injected.emitThought,\n enumerable: true,\n configurable: false,\n writable: false,\n },\n emitToolCall: {\n value: injected.emitToolCall,\n enumerable: true,\n configurable: false,\n writable: false,\n },\n emitToolExecutionStart: {\n value: injected.emitToolExecutionStart,\n enumerable: true,\n configurable: false,\n writable: false,\n },\n emitToolExecutionEnd: {\n value: injected.emitToolExecutionEnd,\n enumerable: true,\n configurable: false,\n writable: false,\n },\n waitFor: {\n value: injected.openGate,\n enumerable: true,\n configurable: false,\n writable: false,\n },\n tools: {\n get: () => injected.tools,\n enumerable: true,\n configurable: false,\n },\n })\n }\n\n /** Unique identifier for this turn, generated as a UUIDv6 at construction time. */\n declare readonly id: string\n /** `true` when the turn's `AbortController` signal has fired. */\n declare readonly aborted: boolean\n /** The `AbortSignal` from the turn's `AbortController`. */\n declare readonly abortSignal: AbortSignal\n /**\n * Aborts the turn's `AbortController` with the supplied reason. Middleware should call this\n * when refusing the turn — the runner reads `aborted` between every stage and short-circuits\n * cleanly: `turnEnd` still fires, no `error` event is emitted, and during dispatch\n * `dispatchEnd.status === 'aborted'` carries the operational signal.\n */\n declare readonly abort: (reason?: unknown) => void\n /** Arbitrary key-value store that middleware can read and write across pipeline steps. */\n declare readonly stash: Registry\n /** The system prompt guiding the agent's behaviour for this turn. */\n declare readonly systemPrompt: Tokenizable\n /** Standing instructions applied to every turn, in insertion order. */\n declare readonly standingInstructions: Set<Tokenizable>\n /** Memories loaded for this turn; populated by middleware after calling `fetchMemories()`. */\n declare readonly turnMemories: Set<Memory>\n /** Retrievable records loaded for this turn; populated by middleware after calling `fetchRetrievables()`. */\n declare readonly turnRetrievables: Set<Retrievable>\n /** Conversation messages loaded for this turn; populated by middleware after calling `fetchMessages()`. */\n declare readonly turnMessages: Set<Message>\n /** Thought traces loaded for this turn; populated by middleware after calling `fetchThoughts()`. */\n declare readonly turnThoughts: Set<Thought>\n /** Tool call records loaded for this turn; populated by middleware after calling `fetchToolCalls()`. */\n declare readonly turnToolCalls: Set<ToolCall>\n /** Fetches memories relevant to this turn; delegates to the callback supplied at construction. */\n declare readonly fetchMemories: () => Memory[] | Promise<Memory[]>\n /** Fetches conversation messages relevant to this turn; delegates to the callback supplied at construction. */\n declare readonly fetchMessages: () => Message[] | Promise<Message[]>\n /** Fetches thought traces relevant to this turn; delegates to the callback supplied at construction. */\n declare readonly fetchThoughts: () => Thought[] | Promise<Thought[]>\n /** Fetches tool call records relevant to this turn; delegates to the callback supplied at construction. */\n declare readonly fetchToolCalls: () => ToolCall[] | Promise<ToolCall[]>\n /** Fetches tools available for this turn; delegates to the callback supplied at construction. */\n declare readonly fetchTools: () => Tool[] | Promise<Tool[]>\n /** Refreshes and returns the standing instructions; delegates to the callback supplied at construction. */\n declare readonly refreshStandingInstructions: () =>\n | (string | Tokenizable)[]\n | Promise<(string | Tokenizable)[]>\n /** Stores a new standing instruction in the persistence layer. */\n declare readonly storeStandingInstruction: (v: string | Tokenizable) => void | Promise<void>\n /** Updates an existing standing instruction in the persistence layer. */\n declare readonly mutateStandingInstruction: (v: string | Tokenizable) => void | Promise<void>\n /** Removes a standing instruction from the persistence layer. */\n declare readonly deleteStandingInstruction: (v: string | Tokenizable) => void | Promise<void>\n /** Stores a new memory in the persistence layer. */\n declare readonly storeMemory: (v: Memory) => void | Promise<void>\n /** Updates an existing memory in the persistence layer. */\n declare readonly mutateMemory: (v: Memory) => void | Promise<void>\n /** Removes a memory from the persistence layer by ID. */\n declare readonly deleteMemory: (id: string) => void | Promise<void>\n /** Fetches retrievable records relevant to this turn; delegates to the callback supplied at construction. */\n declare readonly fetchRetrievables: () => Retrievable[] | Promise<Retrievable[]>\n /** Stores a new retrievable record in the persistence layer. */\n declare readonly storeRetrievable: (v: Retrievable) => Promise<Retrievable>\n /** Updates an existing retrievable record in the persistence layer. */\n declare readonly mutateRetrievable: (v: Retrievable) => Promise<Retrievable>\n /** Removes a retrievable record from the persistence layer by ID. */\n declare readonly deleteRetrievable: (id: string) => void | Promise<void>\n /** Stores a new message in the persistence layer. */\n declare readonly storeMessage: (v: Message) => void | Promise<void>\n /** Updates an existing message in the persistence layer. */\n declare readonly mutateMessage: (v: Message) => void | Promise<void>\n /** Removes a message from the persistence layer by ID. */\n declare readonly deleteMessage: (id: string) => void | Promise<void>\n /** Stores a new thought in the persistence layer. */\n declare readonly storeThought: (v: Thought) => void | Promise<void>\n /** Updates an existing thought in the persistence layer. */\n declare readonly mutateThought: (v: Thought) => void | Promise<void>\n /** Removes a thought from the persistence layer by ID. */\n declare readonly deleteThought: (id: string) => void | Promise<void>\n /** Stores a new tool call in the persistence layer. */\n declare readonly storeToolCall: (v: ToolCall) => void | Promise<void>\n /** Updates an existing tool call in the persistence layer. */\n declare readonly mutateToolCall: (v: ToolCall) => void | Promise<void>\n /** Removes a tool call from the persistence layer by ID. */\n declare readonly deleteToolCall: (id: string) => void | Promise<void>\n /** Replaces a complete colliding tool-call group when storage supports it. */\n declare readonly replaceToolCallGroup: (\n ids: readonly string[],\n replacements: readonly ToolCall[]\n ) => Promise<void>\n /**\n * Persists tool-generated media bytes into consumer storage and returns a {@link @nhtio/adk!MediaReader}.\n * Low-level conduit — returns a value, touches no turn state; build a {@link @nhtio/adk!Media} from the\n * reader and persist the owning primitive separately.\n */\n declare readonly storeMediaBytes: (\n id: string,\n bytes: ConduitBytes\n ) => MediaReader | Promise<MediaReader>\n /**\n * Persists extracted retrievable text bytes into consumer storage and returns a\n * {@link @nhtio/adk!SpoolReader}. Wrap it in a {@link @nhtio/adk!SpooledArtifact} for `Retrievable.content`\n * and persist the record via {@link TurnContext.storeRetrievable} separately.\n */\n declare readonly storeRetrievableBytes: (\n id: string,\n bytes: ConduitBytes\n ) => SpoolReader | Promise<SpoolReader>\n /** Emits a `message` event on the runner; may be called at any point during the turn. */\n declare readonly emitMessage: EmitMessageFn\n /** Emits a `thought` event on the runner; may be called at any point during the turn. */\n declare readonly emitThought: EmitThoughtFn\n /** Emits a `toolCall` event on the runner; may be called at any point during the turn. */\n declare readonly emitToolCall: EmitToolCallFn\n /** Emits a `toolExecutionStart` event on the observability bus; forwarded from `DispatchContext` by `DispatchRunner` when a tool is invoked inside a dispatch. */\n declare readonly emitToolExecutionStart: EmitToolExecutionStartFn\n /** Emits a `toolExecutionEnd` event on the observability bus; forwarded from `DispatchContext` by `DispatchRunner` when a tool finishes executing inside a dispatch. */\n declare readonly emitToolExecutionEnd: EmitToolExecutionEndFn\n /** Opens a turn gate and suspends until it resolves, rejects, times out, or is aborted. */\n declare readonly waitFor: OpenGateFn\n /** Turn-scoped tool registry constructed from the runner's baseline tools; middleware may trim or extend it. */\n declare readonly tools: ToolRegistry\n}\n","import { v6 as uuidv6 } from 'uuid'\nimport { Hooks } from '@nhtio/hooks'\nimport { validator } from '@nhtio/validation'\nimport { Registry } from '../classes/registry'\nimport { Tokenizable } from '../classes/tokenizable'\nimport { validateOrThrow } from '../utils/validation'\nimport { isInstanceOf, isError } from '../utils/guards'\nimport { ToolRegistry } from '../classes/tool_registry'\nimport { autoSpoolRetrievable, assertUniqueRetrievableIds } from '../utils/retrievable_spool'\nimport {\n E_INVALID_LLM_EXECUTION_CONTEXT,\n E_LLM_EXECUTION_GATE_NOT_SUPPORTED,\n E_LLM_EXECUTION_ALREADY_SIGNALLED,\n E_ARTIFACT_ID_COLLISION,\n} from '../exceptions/runtime'\nimport type { Tool } from '../classes/tool'\nimport type { Memory } from '../classes/memory'\nimport type { Message } from '../classes/message'\nimport type { Thought } from '../classes/thought'\nimport type { SpoolReader } from './spool_reader'\nimport type { MediaReader } from './media_reader'\nimport type { ToolCall } from '../classes/tool_call'\nimport type { Retrievable } from '../classes/retrievable'\nimport type {\n DispatchContextHooks,\n DispatchContextHookRegistrations,\n} from '../types/dispatch_context'\nimport type {\n EmitMessageFn,\n EmitThoughtFn,\n EmitToolCallFn,\n EmitToolExecutionStartFn,\n EmitToolExecutionEndFn,\n OpenGateFn,\n} from '../types/turn_runner'\n\n/** Payload accepted by the byte-persistence conduits — text, raw bytes, or a stream. */\nexport type ConduitBytes = string | Uint8Array | ReadableStream<Uint8Array>\n\n// ── LLM-scoped callback fn types ─────────────────────────────────────────────\n\n/** Retrieves memories for an LLM execution context. */\nexport type DispatchMemoryRetrievalFn = (ctx: DispatchContext) => Memory[] | Promise<Memory[]>\n\n/** Retrieves messages for an LLM execution context. */\nexport type DispatchMessageRetrievalFn = (ctx: DispatchContext) => Message[] | Promise<Message[]>\n\n/** Retrieves thoughts for an LLM execution context. */\nexport type DispatchThoughtRetrievalFn = (ctx: DispatchContext) => Thought[] | Promise<Thought[]>\n\n/** Retrieves tool calls for an LLM execution context. */\nexport type DispatchToolCallRetrievalFn = (ctx: DispatchContext) => ToolCall[] | Promise<ToolCall[]>\n\n/** Retrieves tools for an LLM execution context. */\nexport type DispatchToolsRetrievalFn = (ctx: DispatchContext) => Tool[] | Promise<Tool[]>\n\n/** Refreshes and returns standing instructions for an LLM execution context. */\nexport type DispatchStandingInstructionsRefreshFn = (\n ctx: DispatchContext\n) => (string | Tokenizable)[] | Promise<(string | Tokenizable)[]>\n\n/** Stores a new standing instruction (LLM execution context variant). */\nexport type DispatchStandingInstructionStoreFn = (\n ctx: DispatchContext,\n v: string | Tokenizable\n) => void | Promise<void>\n\n/** Updates an existing standing instruction (LLM execution context variant). */\nexport type DispatchStandingInstructionMutateFn = (\n ctx: DispatchContext,\n v: string | Tokenizable\n) => void | Promise<void>\n\n/** Removes a standing instruction (LLM execution context variant). */\nexport type DispatchStandingInstructionDeleteFn = (\n ctx: DispatchContext,\n v: string | Tokenizable\n) => void | Promise<void>\n\n/** Stores a new memory (LLM execution context variant). */\nexport type DispatchMemoryStoreFn = (ctx: DispatchContext, v: Memory) => void | Promise<void>\n\n/** Updates an existing memory (LLM execution context variant). */\nexport type DispatchMemoryMutateFn = (ctx: DispatchContext, v: Memory) => void | Promise<void>\n\n/** Removes a memory by ID (LLM execution context variant). */\nexport type DispatchMemoryDeleteFn = (ctx: DispatchContext, id: string) => void | Promise<void>\n\n/** Retrieves retrievable records for an LLM execution context. */\nexport type DispatchRetrievableRetrievalFn = (\n ctx: DispatchContext\n) => Retrievable[] | Promise<Retrievable[]>\n\n/** Stores a new retrievable record (LLM execution context variant). */\nexport type DispatchRetrievableStoreFn = (\n ctx: DispatchContext,\n v: Retrievable\n) => void | Promise<void>\n\n/** Updates an existing retrievable record (LLM execution context variant). */\nexport type DispatchRetrievableMutateFn = (\n ctx: DispatchContext,\n v: Retrievable\n) => void | Promise<void>\n\n/** Removes a retrievable record by ID (LLM execution context variant). */\nexport type DispatchRetrievableDeleteFn = (ctx: DispatchContext, id: string) => void | Promise<void>\n\n/** Stores a new message (LLM execution context variant). */\nexport type DispatchMessageStoreFn = (ctx: DispatchContext, v: Message) => void | Promise<void>\n\n/** Updates an existing message (LLM execution context variant). */\nexport type DispatchMessageMutateFn = (ctx: DispatchContext, v: Message) => void | Promise<void>\n\n/** Removes a message by ID (LLM execution context variant). */\nexport type DispatchMessageDeleteFn = (ctx: DispatchContext, id: string) => void | Promise<void>\n\n/** Stores a new thought (LLM execution context variant). */\nexport type DispatchThoughtStoreFn = (ctx: DispatchContext, v: Thought) => void | Promise<void>\n\n/** Updates an existing thought (LLM execution context variant). */\nexport type DispatchThoughtMutateFn = (ctx: DispatchContext, v: Thought) => void | Promise<void>\n\n/** Removes a thought by ID (LLM execution context variant). */\nexport type DispatchThoughtDeleteFn = (ctx: DispatchContext, id: string) => void | Promise<void>\n\n/** Stores a new tool call (LLM execution context variant). */\nexport type DispatchToolCallStoreFn = (ctx: DispatchContext, v: ToolCall) => void | Promise<void>\n\n/** Updates an existing tool call (LLM execution context variant). */\nexport type DispatchToolCallMutateFn = (ctx: DispatchContext, v: ToolCall) => void | Promise<void>\n\n/** Removes a tool call by ID (LLM execution context variant). */\nexport type DispatchToolCallDeleteFn = (ctx: DispatchContext, id: string) => void | Promise<void>\n\n/** Atomically persists a replacement for a complete group of colliding tool calls. */\nexport type ToolCallGroupReplaceFn = (\n ctx: DispatchContext,\n removedIds: readonly string[],\n replacements: readonly ToolCall[]\n) => void | Promise<void>\n\n/**\n * Persists tool-generated media bytes into consumer storage and returns a {@link @nhtio/adk!MediaReader}\n * (LLM execution context variant). Unlike the `store*` mutation callbacks this returns a value and\n * does NOT add anything to the turn Sets — the handler builds a {@link @nhtio/adk!Media} from the reader\n * and persists it via `storeMessage`/`storeToolCall` separately.\n */\nexport type DispatchMediaBytesStoreFn = (\n ctx: DispatchContext,\n id: string,\n bytes: ConduitBytes\n) => MediaReader | Promise<MediaReader>\n\n/**\n * Persists extracted retrievable text bytes into consumer storage and returns a\n * {@link @nhtio/adk!SpoolReader} (LLM execution context variant). The handler wraps the reader in a\n * {@link @nhtio/adk!SpooledArtifact} for `new Retrievable({ content })` and persists the record via\n * `storeRetrievable` separately. Returns a value; does NOT touch the turn Sets.\n */\nexport type DispatchRetrievableBytesStoreFn = (\n ctx: DispatchContext,\n id: string,\n bytes: ConduitBytes\n) => SpoolReader | Promise<SpoolReader>\n\n// ── RawDispatchContext ────────────────────────────────────────────────────\n\n/**\n * Plain input object supplied to {@link DispatchContext} at construction time.\n *\n * @remarks\n * All fetch and mutation callbacks are required — every execution context must have a persistence\n * layer wired up, even in standalone mode. Optional pre-fetched arrays populate the context's Sets\n * at construction time without replacing the callbacks (the callbacks are still invoked on\n * subsequent fetch calls).\n */\nexport interface RawDispatchContext {\n /** `AbortController` whose signal can cancel execution mid-flight. */\n turnAbortController?: AbortController\n /** Arbitrary key-value store for cross-step state. */\n stash?: Record<string, unknown>\n /** The system prompt for this execution. */\n systemPrompt: string | Tokenizable\n /** Standing instructions for this execution. */\n standingInstructions?: (string | Tokenizable)[]\n\n // Pre-fetched data (optional — populates Sets at construction)\n /** Pre-fetched memories to populate the context at construction. */\n memories?: Memory[]\n /** Pre-fetched retrievable records to populate the context at construction. */\n retrievables?: Retrievable[]\n /** Pre-fetched messages to populate the context at construction. */\n messages?: Message[]\n /** Pre-fetched thoughts to populate the context at construction. */\n thoughts?: Thought[]\n /** Pre-fetched tool calls to populate the context at construction. */\n toolCalls?: ToolCall[]\n /** Pre-fetched tools to populate the tool registry at construction. */\n tools?: Tool[]\n\n // Fetch callbacks (required)\n /** Retrieves memories for this execution. */\n fetchMemories: DispatchMemoryRetrievalFn\n /** Retrieves retrievable records for this execution. */\n fetchRetrievables: DispatchRetrievableRetrievalFn\n /** Retrieves messages for this execution. */\n fetchMessages: DispatchMessageRetrievalFn\n /** Retrieves thoughts for this execution. */\n fetchThoughts: DispatchThoughtRetrievalFn\n /** Retrieves tool calls for this execution. */\n fetchToolCalls: DispatchToolCallRetrievalFn\n /** Retrieves tools for this execution. */\n fetchTools: DispatchToolsRetrievalFn\n /** Refreshes and returns standing instructions for this execution. */\n refreshStandingInstructions: DispatchStandingInstructionsRefreshFn\n\n // Mutation callbacks (required — persistence layer; called immediately on every mutation)\n /** Stores a new standing instruction. */\n storeStandingInstruction: DispatchStandingInstructionStoreFn\n /** Updates an existing standing instruction. */\n mutateStandingInstruction: DispatchStandingInstructionMutateFn\n /** Removes a standing instruction. */\n deleteStandingInstruction: DispatchStandingInstructionDeleteFn\n /** Stores a new memory. */\n storeMemory: DispatchMemoryStoreFn\n /** Updates an existing memory. */\n mutateMemory: DispatchMemoryMutateFn\n /** Removes a memory by ID. */\n deleteMemory: DispatchMemoryDeleteFn\n /** Stores a new retrievable record. */\n storeRetrievable: DispatchRetrievableStoreFn\n /** Updates an existing retrievable record. */\n mutateRetrievable: DispatchRetrievableMutateFn\n /** Removes a retrievable record by ID. */\n deleteRetrievable: DispatchRetrievableDeleteFn\n /** Stores a new message. */\n storeMessage: DispatchMessageStoreFn\n /** Updates an existing message. */\n mutateMessage: DispatchMessageMutateFn\n /** Removes a message by ID. */\n deleteMessage: DispatchMessageDeleteFn\n /** Stores a new thought. */\n storeThought: DispatchThoughtStoreFn\n /** Updates an existing thought. */\n mutateThought: DispatchThoughtMutateFn\n /** Removes a thought by ID. */\n deleteThought: DispatchThoughtDeleteFn\n /** Stores a new tool call. */\n storeToolCall: DispatchToolCallStoreFn\n /** Updates an existing tool call. */\n mutateToolCall: DispatchToolCallMutateFn\n /** Removes a tool call by ID. */\n deleteToolCall: DispatchToolCallDeleteFn\n /** Optionally replaces a complete tool-call id group in one transaction. */\n replaceToolCallGroup?: ToolCallGroupReplaceFn\n /** Persists tool-generated media bytes; returns a `MediaReader`. */\n storeMediaBytes: DispatchMediaBytesStoreFn\n /** Persists extracted retrievable text bytes; returns a `SpoolReader`. */\n storeRetrievableBytes: DispatchRetrievableBytesStoreFn\n\n /** Optional hook registrations for emit events. */\n hooks?: DispatchContextHookRegistrations\n /** Optional gate suspension function. When absent, `waitFor` rejects with {@link @nhtio/adk!E_LLM_EXECUTION_GATE_NOT_SUPPORTED}. */\n waitFor?: OpenGateFn\n}\n\nconst rawDispatchContextSchema = validator.object<RawDispatchContext>({\n turnAbortController: validator\n .alternatives(\n validator.object().instance(AbortController as any),\n validator.function().instance(AbortController as any)\n )\n .optional(),\n // eslint-disable-next-line adk/require-validator-any-required -- map value type-arg: stash holds arbitrary values; disposition is set by .default({}) on the object\n stash: validator.object().pattern(validator.string(), validator.any()).default({}),\n systemPrompt: Tokenizable.schema.required(),\n standingInstructions: validator.array().items(Tokenizable.schema).default([]),\n memories: validator.array().default([]),\n retrievables: validator.array().default([]),\n messages: validator.array().default([]),\n thoughts: validator.array().default([]),\n toolCalls: validator.array().default([]),\n tools: validator.array().default([]),\n fetchMemories: validator.function().required(),\n fetchRetrievables: validator.function().required(),\n fetchMessages: validator.function().required(),\n fetchThoughts: validator.function().required(),\n fetchToolCalls: validator.function().required(),\n fetchTools: validator.function().required(),\n refreshStandingInstructions: validator.function().required(),\n storeStandingInstruction: validator.function().required(),\n mutateStandingInstruction: validator.function().required(),\n deleteStandingInstruction: validator.function().required(),\n storeMemory: validator.function().required(),\n mutateMemory: validator.function().required(),\n deleteMemory: validator.function().required(),\n storeRetrievable: validator.function().required(),\n mutateRetrievable: validator.function().required(),\n deleteRetrievable: validator.function().required(),\n storeMessage: validator.function().required(),\n mutateMessage: validator.function().required(),\n deleteMessage: validator.function().required(),\n storeThought: validator.function().required(),\n mutateThought: validator.function().required(),\n deleteThought: validator.function().required(),\n storeToolCall: validator.function().required(),\n mutateToolCall: validator.function().required(),\n deleteToolCall: validator.function().required(),\n replaceToolCallGroup: validator.function().arity(3).optional(),\n storeMediaBytes: validator.function().required(),\n storeRetrievableBytes: validator.function().required(),\n hooks: validator.object().optional(),\n waitFor: validator.function().optional(),\n})\n\n// ── DispatchContext ───────────────────────────────────────────────────────\n\n/**\n * Context object for a single LLM execution call.\n *\n * @remarks\n * Mirrors the surface of {@link @nhtio/adk!TurnContext} but is path-agnostic — it knows nothing about a\n * parent context. Mutations apply to local Sets immediately, call persistence callbacks\n * immediately, and fire the corresponding mutation hook (`storedMemory`, `mutatedMemory`,\n * `deletedMemory`, etc.) in both standalone and derived dispatches.\n *\n * The {@link @nhtio/adk!DispatchRunner} is the only thing that creates a context with a parent\n * relationship: when dispatched with a `source: TurnContext`, the runner subscribes to the\n * mutation hooks, queues deltas internally, and flushes them to the parent's Sets at the end of\n * each iteration. The context itself remains unaware of the parent.\n *\n * Middleware/executor signals termination via {@link DispatchContext.ack} (clean completion)\n * or {@link DispatchContext.nack} (failure). Both set an internal flag the runner reads at\n * end-of-iteration to decide whether to loop or exit. {@link DispatchContext.isSignalled},\n * {@link DispatchContext.isAcked}, and {@link DispatchContext.nackError} are publicly\n * readable getters so middleware can inspect signal state and bail early.\n */\nexport class DispatchContext {\n #id: string\n #dispatchId: string\n #iteration: number\n #turnAbortController: AbortController\n #stash: Registry\n #systemPrompt: Tokenizable\n #standingInstructions: Set<Tokenizable>\n #turnMemories: Set<Memory>\n #turnRetrievables: Set<Retrievable>\n #turnMessages: Set<Message>\n #turnThoughts: Set<Thought>\n #turnToolCalls: Set<ToolCall>\n #tools: ToolRegistry\n #hooks: Hooks<DispatchContextHooks>\n #ackHandlers: Set<() => void>\n\n // Persistence callbacks\n #fetchMemories: DispatchMemoryRetrievalFn\n #fetchRetrievables: DispatchRetrievableRetrievalFn\n #fetchMessages: DispatchMessageRetrievalFn\n #fetchThoughts: DispatchThoughtRetrievalFn\n #fetchToolCalls: DispatchToolCallRetrievalFn\n #fetchTools: DispatchToolsRetrievalFn\n #refreshStandingInstructions: DispatchStandingInstructionsRefreshFn\n #storeStandingInstruction: DispatchStandingInstructionStoreFn\n #mutateStandingInstruction: DispatchStandingInstructionMutateFn\n #deleteStandingInstruction: DispatchStandingInstructionDeleteFn\n #storeMemory: DispatchMemoryStoreFn\n #mutateMemory: DispatchMemoryMutateFn\n #deleteMemory: DispatchMemoryDeleteFn\n #storeRetrievable: DispatchRetrievableStoreFn\n #mutateRetrievable: DispatchRetrievableMutateFn\n #deleteRetrievable: DispatchRetrievableDeleteFn\n #storeMessage: DispatchMessageStoreFn\n #mutateMessage: DispatchMessageMutateFn\n #deleteMessage: DispatchMessageDeleteFn\n #storeThought: DispatchThoughtStoreFn\n #mutateThought: DispatchThoughtMutateFn\n #deleteThought: DispatchThoughtDeleteFn\n #storeToolCall: DispatchToolCallStoreFn\n #mutateToolCall: DispatchToolCallMutateFn\n #deleteToolCall: DispatchToolCallDeleteFn\n #replaceToolCallGroup: ToolCallGroupReplaceFn | undefined\n #storeMediaBytes: DispatchMediaBytesStoreFn\n #storeRetrievableBytes: DispatchRetrievableBytesStoreFn\n #waitFor: OpenGateFn | undefined\n\n // Checksum frequency index for this execution\n #toolCallChecksums: Map<string, number>\n\n // Termination signal state\n #signalled: 'ack' | 'nack' | undefined\n #nackError: Error | undefined\n\n /**\n * @param raw - Raw input validated against the schema.\n * @throws {@link @nhtio/adk!E_INVALID_LLM_EXECUTION_CONTEXT} when `raw` does not satisfy the schema.\n */\n constructor(raw: RawDispatchContext) {\n let resolved: RawDispatchContext & {\n stash: Record<string, unknown>\n standingInstructions: (string | Tokenizable)[]\n memories: Memory[]\n retrievables: Retrievable[]\n messages: Message[]\n thoughts: Thought[]\n toolCalls: ToolCall[]\n tools: Tool[]\n }\n try {\n resolved = validateOrThrow(rawDispatchContextSchema, raw, true) as typeof resolved\n } catch (err) {\n throw new E_INVALID_LLM_EXECUTION_CONTEXT({ cause: isError(err) ? err : undefined })\n }\n\n this.#id = uuidv6()\n this.#dispatchId = ''\n this.#iteration = 0\n this.#turnAbortController = resolved.turnAbortController ?? new AbortController()\n this.#stash = new Registry(resolved.stash)\n this.#systemPrompt = Tokenizable.isTokenizable(resolved.systemPrompt)\n ? resolved.systemPrompt\n : new Tokenizable(resolved.systemPrompt)\n this.#standingInstructions = new Set(\n resolved.standingInstructions.map((i) =>\n Tokenizable.isTokenizable(i) ? i : new Tokenizable(i)\n )\n )\n this.#turnMemories = new Set(resolved.memories)\n this.#turnRetrievables = new Set(resolved.retrievables)\n this.#turnMessages = new Set(resolved.messages)\n this.#turnThoughts = new Set(resolved.thoughts)\n this.#turnToolCalls = new Set(resolved.toolCalls)\n this.#tools = new ToolRegistry(resolved.tools)\n this.#toolCallChecksums = new Map()\n for (const tc of resolved.toolCalls) {\n const prev = this.#toolCallChecksums.get(tc.checksum) ?? 0\n this.#toolCallChecksums.set(tc.checksum, prev + 1)\n }\n\n this.#fetchMemories = resolved.fetchMemories\n this.#fetchRetrievables = resolved.fetchRetrievables\n this.#fetchMessages = resolved.fetchMessages\n this.#fetchThoughts = resolved.fetchThoughts\n this.#fetchToolCalls = resolved.fetchToolCalls\n this.#fetchTools = resolved.fetchTools\n this.#refreshStandingInstructions = resolved.refreshStandingInstructions\n this.#storeStandingInstruction = resolved.storeStandingInstruction\n this.#mutateStandingInstruction = resolved.mutateStandingInstruction\n this.#deleteStandingInstruction = resolved.deleteStandingInstruction\n this.#storeMemory = resolved.storeMemory\n this.#mutateMemory = resolved.mutateMemory\n this.#deleteMemory = resolved.deleteMemory\n this.#storeRetrievable = resolved.storeRetrievable\n this.#mutateRetrievable = resolved.mutateRetrievable\n this.#deleteRetrievable = resolved.deleteRetrievable\n this.#storeMessage = resolved.storeMessage\n this.#mutateMessage = resolved.mutateMessage\n this.#deleteMessage = resolved.deleteMessage\n this.#storeThought = resolved.storeThought\n this.#mutateThought = resolved.mutateThought\n this.#deleteThought = resolved.deleteThought\n this.#storeToolCall = resolved.storeToolCall\n this.#mutateToolCall = resolved.mutateToolCall\n this.#deleteToolCall = resolved.deleteToolCall\n this.#replaceToolCallGroup = resolved.replaceToolCallGroup\n this.#storeMediaBytes = resolved.storeMediaBytes\n this.#storeRetrievableBytes = resolved.storeRetrievableBytes\n this.#waitFor = resolved.waitFor\n\n this.#signalled = undefined\n this.#nackError = undefined\n\n // Register hooks\n this.#hooks = new Hooks<DispatchContextHooks>()\n this.#ackHandlers = new Set()\n if (resolved.hooks) {\n const regs = resolved.hooks\n for (const key of Object.keys(regs) as (keyof DispatchContextHooks)[]) {\n const entry = regs[key]\n if (!entry) continue\n const handlers = Array.isArray(entry) ? entry : [entry]\n for (const h of handlers) {\n this.#hooks.add(key, h as any)\n }\n }\n }\n\n Object.defineProperties(this, {\n id: {\n get: () => this.#id,\n enumerable: true,\n configurable: false,\n },\n dispatchId: {\n get: () => this.#dispatchId,\n enumerable: true,\n configurable: false,\n },\n iteration: {\n get: () => this.#iteration,\n enumerable: true,\n configurable: false,\n },\n aborted: {\n get: () => Boolean(this.#turnAbortController.signal.aborted),\n enumerable: true,\n configurable: false,\n },\n abortSignal: {\n get: () => this.#turnAbortController.signal,\n enumerable: true,\n configurable: false,\n },\n abort: {\n value: (reason?: unknown) => this.#turnAbortController.abort(reason),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n isSignalled: {\n get: () => this.#signalled !== undefined,\n enumerable: true,\n configurable: false,\n },\n isAcked: {\n get: () => this.#signalled === 'ack',\n enumerable: true,\n configurable: false,\n },\n nackError: {\n get: () => this.#nackError,\n enumerable: true,\n configurable: false,\n },\n stash: {\n get: () => this.#stash,\n enumerable: true,\n configurable: false,\n },\n systemPrompt: {\n get: () => this.#systemPrompt,\n enumerable: true,\n configurable: false,\n },\n standingInstructions: {\n get: () => this.#standingInstructions,\n enumerable: true,\n configurable: false,\n },\n turnMemories: {\n get: () => this.#turnMemories,\n enumerable: true,\n configurable: false,\n },\n turnRetrievables: {\n get: () => this.#turnRetrievables,\n enumerable: true,\n configurable: false,\n },\n turnMessages: {\n get: () => this.#turnMessages,\n enumerable: true,\n configurable: false,\n },\n turnThoughts: {\n get: () => this.#turnThoughts,\n enumerable: true,\n configurable: false,\n },\n turnToolCalls: {\n get: () => this.#turnToolCalls,\n enumerable: true,\n configurable: false,\n },\n tools: {\n get: () => this.#tools,\n enumerable: true,\n configurable: false,\n },\n fetchMemories: {\n value: () => this.#fetchMemories(this),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n fetchRetrievables: {\n value: async () => {\n const recs = await this.#fetchRetrievables(this)\n assertUniqueRetrievableIds(recs)\n return Promise.all(recs.map((r) => autoSpoolRetrievable(this, r)))\n },\n enumerable: true,\n configurable: false,\n writable: false,\n },\n fetchMessages: {\n value: () => this.#fetchMessages(this),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n fetchThoughts: {\n value: () => this.#fetchThoughts(this),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n fetchToolCalls: {\n value: () => this.#fetchToolCalls(this),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n fetchTools: {\n value: () => this.#fetchTools(this),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n refreshStandingInstructions: {\n value: () => this.#refreshStandingInstructions(this),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n storeStandingInstruction: {\n value: (v: string | Tokenizable) => this.#doStoreStandingInstruction(v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n mutateStandingInstruction: {\n value: (v: string | Tokenizable) => this.#doMutateStandingInstruction(v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n deleteStandingInstruction: {\n value: (v: string | Tokenizable) => this.#doDeleteStandingInstruction(v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n storeMemory: {\n value: (v: Memory) => this.#doStoreMemory(v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n mutateMemory: {\n value: (v: Memory) => this.#doMutateMemory(v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n deleteMemory: {\n value: (id: string) => this.#doDeleteMemory(id),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n storeRetrievable: {\n value: (v: Retrievable) => this.#doStoreRetrievable(v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n mutateRetrievable: {\n value: (v: Retrievable) => this.#doMutateRetrievable(v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n deleteRetrievable: {\n value: (id: string) => this.#doDeleteRetrievable(id),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n storeMessage: {\n value: (v: Message) => this.#doStoreMessage(v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n mutateMessage: {\n value: (v: Message) => this.#doMutateMessage(v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n deleteMessage: {\n value: (id: string) => this.#doDeleteMessage(id),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n storeThought: {\n value: (v: Thought) => this.#doStoreThought(v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n mutateThought: {\n value: (v: Thought) => this.#doMutateThought(v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n deleteThought: {\n value: (id: string) => this.#doDeleteThought(id),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n storeToolCall: {\n value: (v: ToolCall) => this.#doStoreToolCall(v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n mutateToolCall: {\n value: (v: ToolCall) => this.#doMutateToolCall(v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n deleteToolCall: {\n value: (id: string) => this.#doDeleteToolCall(id),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n replaceToolCallGroup: {\n value: (ids: readonly string[], replacements: readonly ToolCall[]) =>\n this.#doReplaceToolCallGroup(ids, replacements),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n storeMediaBytes: {\n value: (id: string, bytes: ConduitBytes) => this.#storeMediaBytes(this, id, bytes),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n storeRetrievableBytes: {\n value: (id: string, bytes: ConduitBytes) => this.#storeRetrievableBytes(this, id, bytes),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n emitMessage: {\n value: (content: Parameters<EmitMessageFn>[0]) => {\n void this.#hooks.runner('message').run(content)\n },\n enumerable: true,\n configurable: false,\n writable: false,\n },\n emitThought: {\n value: (content: Parameters<EmitThoughtFn>[0]) => {\n void this.#hooks.runner('thought').run(content)\n },\n enumerable: true,\n configurable: false,\n writable: false,\n },\n emitToolCall: {\n value: (content: Parameters<EmitToolCallFn>[0]) => {\n void this.#hooks.runner('toolCall').run(content)\n },\n enumerable: true,\n configurable: false,\n writable: false,\n },\n emitToolExecutionStart: {\n value: (event: Parameters<EmitToolExecutionStartFn>[0]) => {\n void this.#hooks.runner('toolExecutionStart').run(event)\n },\n enumerable: true,\n configurable: false,\n writable: false,\n },\n emitToolExecutionEnd: {\n value: (event: Parameters<EmitToolExecutionEndFn>[0]) => {\n void this.#hooks.runner('toolExecutionEnd').run(event)\n },\n enumerable: true,\n configurable: false,\n writable: false,\n },\n waitFor: {\n value: <T>(gateRaw: Parameters<OpenGateFn>[0]): Promise<T> => {\n if (!this.#waitFor) {\n return Promise.reject(new E_LLM_EXECUTION_GATE_NOT_SUPPORTED())\n }\n return this.#waitFor<T>(gateRaw)\n },\n enumerable: true,\n configurable: false,\n writable: false,\n },\n })\n }\n\n // ── Mutation helpers ──────────────────────────────────────────────────────\n\n async #doStoreStandingInstruction(v: string | Tokenizable): Promise<void> {\n const t = Tokenizable.isTokenizable(v) ? v : new Tokenizable(v)\n this.#standingInstructions.add(t)\n await this.#storeStandingInstruction(this, v)\n void this.#hooks.runner('storedStandingInstruction').run(t)\n }\n\n async #doMutateStandingInstruction(v: string | Tokenizable): Promise<void> {\n const t = Tokenizable.isTokenizable(v) ? v : new Tokenizable(v)\n this.#standingInstructions.add(t)\n await this.#mutateStandingInstruction(this, v)\n void this.#hooks.runner('mutatedStandingInstruction').run(t)\n }\n\n async #doDeleteStandingInstruction(v: string | Tokenizable): Promise<void> {\n const t = Tokenizable.isTokenizable(v) ? v : new Tokenizable(v)\n this.#standingInstructions.delete(t)\n await this.#deleteStandingInstruction(this, v)\n void this.#hooks.runner('deletedStandingInstruction').run(t)\n }\n\n async #doStoreMemory(v: Memory): Promise<void> {\n this.#turnMemories.add(v)\n await this.#storeMemory(this, v)\n void this.#hooks.runner('storedMemory').run(v)\n }\n\n /**\n * Replaces every member of `set` sharing `id` with `replacement`, preserving the ORIGINAL\n * insertion position of the first match rather than appending at the end.\n *\n * @remarks\n * `Set.add()` compares by reference, not id — a mutated instance is a NEW object, so the stale\n * instance(s) must be found and removed or they coexist with the replacement forever. ALL\n * matches are removed, not just the first: `store*` never deduplicated ids either, so more than\n * one stale copy can already exist before a mutation runs. Rebuilding the Set (rather than\n * `delete` + `add`) additionally preserves insertion-order position: several adapters, and this\n * battery's own {@link @nhtio/adk!buildOrderingTimeline}-style helpers, use Set iteration order\n * as the deterministic tie-break for primitives sharing an identical timestamp — silently moving\n * a mutated primitive to the end of iteration order would change that tie-break for no reason\n * tied to the mutation's actual content.\n */\n #replaceById<T extends { id: string }>(set: Set<T>, id: string, replacement: T): Set<T> {\n const next = new Set<T>()\n let inserted = false\n for (const existing of set) {\n if ((existing as any).id === id) {\n if (!inserted) {\n next.add(replacement)\n inserted = true\n }\n continue\n }\n next.add(existing)\n }\n if (!inserted) next.add(replacement)\n return next\n }\n\n async #doMutateMemory(v: Memory): Promise<void> {\n this.#turnMemories = this.#replaceById(this.#turnMemories, (v as any).id, v)\n await this.#mutateMemory(this, v)\n void this.#hooks.runner('mutatedMemory').run(v)\n }\n\n async #doDeleteMemory(id: string): Promise<void> {\n for (const m of this.#turnMemories) {\n if ((m as any).id === id) {\n this.#turnMemories.delete(m)\n break\n }\n }\n await this.#deleteMemory(this, id)\n void this.#hooks.runner('deletedMemory').run(id)\n }\n\n #checkArtifactIdCollision(id: string, source: 'retrievable' | 'toolCall'): void {\n const other = source === 'retrievable' ? this.#turnToolCalls : this.#turnRetrievables\n if ([...other].some((v) => v.id === id)) throw new E_ARTIFACT_ID_COLLISION([id])\n }\n\n async #doStoreRetrievable(v: Retrievable): Promise<Retrievable> {\n this.#checkArtifactIdCollision(v.id, 'retrievable')\n const record = await autoSpoolRetrievable(this, v)\n this.#turnRetrievables.add(record)\n await this.#storeRetrievable(this, record)\n void this.#hooks.runner('storedRetrievable').run(record)\n return record\n }\n\n async #doMutateRetrievable(v: Retrievable): Promise<Retrievable> {\n this.#checkArtifactIdCollision(v.id, 'retrievable')\n const record = await autoSpoolRetrievable(this, v)\n this.#turnRetrievables = this.#replaceById(this.#turnRetrievables, record.id, record)\n await this.#mutateRetrievable(this, record)\n void this.#hooks.runner('mutatedRetrievable').run(record)\n return record\n }\n\n async #doDeleteRetrievable(id: string): Promise<void> {\n for (const r of this.#turnRetrievables) {\n if ((r as any).id === id) {\n this.#turnRetrievables.delete(r)\n break\n }\n }\n await this.#deleteRetrievable(this, id)\n void this.#hooks.runner('deletedRetrievable').run(id)\n }\n\n async #doStoreMessage(v: Message): Promise<void> {\n this.#turnMessages.add(v)\n await this.#storeMessage(this, v)\n void this.#hooks.runner('storedMessage').run(v)\n }\n\n async #doMutateMessage(v: Message): Promise<void> {\n this.#turnMessages = this.#replaceById(this.#turnMessages, (v as any).id, v)\n await this.#mutateMessage(this, v)\n void this.#hooks.runner('mutatedMessage').run(v)\n }\n\n async #doDeleteMessage(id: string): Promise<void> {\n for (const m of this.#turnMessages) {\n if ((m as any).id === id) {\n this.#turnMessages.delete(m)\n break\n }\n }\n await this.#deleteMessage(this, id)\n void this.#hooks.runner('deletedMessage').run(id)\n }\n\n async #doStoreThought(v: Thought): Promise<void> {\n this.#turnThoughts.add(v)\n await this.#storeThought(this, v)\n void this.#hooks.runner('storedThought').run(v)\n }\n\n async #doMutateThought(v: Thought): Promise<void> {\n this.#turnThoughts = this.#replaceById(this.#turnThoughts, (v as any).id, v)\n await this.#mutateThought(this, v)\n void this.#hooks.runner('mutatedThought').run(v)\n }\n\n async #doDeleteThought(id: string): Promise<void> {\n for (const t of this.#turnThoughts) {\n if ((t as any).id === id) {\n this.#turnThoughts.delete(t)\n break\n }\n }\n await this.#deleteThought(this, id)\n void this.#hooks.runner('deletedThought').run(id)\n }\n\n async #doStoreToolCall(v: ToolCall): Promise<void> {\n this.#checkArtifactIdCollision(v.id, 'toolCall')\n this.#turnToolCalls.add(v)\n const prev = this.#toolCallChecksums.get(v.checksum) ?? 0\n this.#toolCallChecksums.set(v.checksum, prev + 1)\n await this.#storeToolCall(this, v)\n void this.#hooks.runner('storedToolCall').run(v)\n }\n\n async #doMutateToolCall(v: ToolCall): Promise<void> {\n this.#checkArtifactIdCollision(v.id, 'toolCall')\n // Checksum is over tool+args, which the ORDINARY case does not change on mutation — but that\n // is a convention, not an enforced invariant: a caller can construct a replacement with a\n // different checksum (different tool/args). Reconcile #toolCallChecksums against every\n // displaced instance's ACTUAL checksum (decrement) before crediting the replacement's\n // (increment), the same way #doDeleteToolCall/#doStoreToolCall do — otherwise the map\n // silently drifts out of sync with what #turnToolCalls really contains.\n for (const tc of this.#turnToolCalls) {\n if ((tc as any).id === (v as any).id) {\n const count = this.#toolCallChecksums.get(tc.checksum) ?? 1\n if (count <= 1) this.#toolCallChecksums.delete(tc.checksum)\n else this.#toolCallChecksums.set(tc.checksum, count - 1)\n }\n }\n const prev = this.#toolCallChecksums.get(v.checksum) ?? 0\n this.#toolCallChecksums.set(v.checksum, prev + 1)\n this.#turnToolCalls = this.#replaceById(this.#turnToolCalls, (v as any).id, v)\n await this.#mutateToolCall(this, v)\n void this.#hooks.runner('mutatedToolCall').run(v)\n }\n\n async #doDeleteToolCall(id: string): Promise<void> {\n for (const tc of this.#turnToolCalls) {\n if ((tc as any).id === id) {\n this.#turnToolCalls.delete(tc)\n const count = this.#toolCallChecksums.get(tc.checksum) ?? 1\n if (count <= 1) this.#toolCallChecksums.delete(tc.checksum)\n else this.#toolCallChecksums.set(tc.checksum, count - 1)\n break\n }\n }\n await this.#deleteToolCall(this, id)\n void this.#hooks.runner('deletedToolCall').run(id)\n }\n\n /**\n * Replaces an entire colliding id group. Persistence commits before local state is changed so a\n * failed write cannot leave the context half-renamed. The fallback deletes every member before\n * storing any replacement: a consumer-side `DELETE WHERE id` must not remove a newly stored row.\n */\n async #doReplaceToolCallGroup(\n ids: readonly string[],\n replacements: readonly ToolCall[]\n ): Promise<void> {\n if (this.#replaceToolCallGroup) {\n await this.#replaceToolCallGroup(this, ids, replacements)\n } else {\n const deletedIds: string[] = []\n try {\n for (const id of ids) {\n await this.#deleteToolCall(this, id)\n deletedIds.push(id)\n }\n for (const replacement of replacements) await this.#storeToolCall(this, replacement)\n } catch (error) {\n if (isError(error)) {\n ;(error as Error & { deletedIds: string[] }).deletedIds = [...deletedIds]\n }\n throw error\n }\n }\n\n const idSet = new Set(ids)\n const next = new Set<ToolCall>()\n let inserted = false\n for (const tc of this.#turnToolCalls) {\n if (idSet.has(tc.id)) {\n if (!inserted) {\n for (const replacement of replacements) next.add(replacement)\n inserted = true\n }\n } else next.add(tc)\n }\n if (!inserted) for (const replacement of replacements) next.add(replacement)\n this.#turnToolCalls = next\n // Recompute rather than reuse mutate/delete accounting: collisions can double-count a checksum.\n this.#toolCallChecksums = new Map()\n for (const tc of this.#turnToolCalls) {\n this.#toolCallChecksums.set(tc.checksum, (this.#toolCallChecksums.get(tc.checksum) ?? 0) + 1)\n }\n for (const id of ids) void this.#hooks.runner('deletedToolCall').run(id)\n for (const replacement of replacements)\n void this.#hooks.runner('storedToolCall').run(replacement)\n }\n\n // ── Internal setters (used by DispatchRunner) ─────────────────────────\n\n /** @internal Set by {@link @nhtio/adk!DispatchRunner} after construction. */\n _setDispatchId(id: string): void {\n this.#dispatchId = id\n }\n\n /** @internal Updated by {@link @nhtio/adk!DispatchRunner} on each iteration. */\n _setIteration(n: number): void {\n this.#iteration = n\n }\n\n /** @internal Accessor used by {@link @nhtio/adk!DispatchRunner} to register forwarding handlers. */\n _getHooks(): Hooks<DispatchContextHooks> {\n return this.#hooks\n }\n\n // ── Public API ────────────────────────────────────────────────────────────\n\n /**\n * Returns how many times a tool call with the given checksum has been stored in this execution.\n *\n * @remarks\n * Checksums are computed over `tool + args` (see {@link @nhtio/adk!ToolCall.checksum}). This count lets\n * the executor detect repeat invocations of the same call without scanning the full Set.\n * Returns `0` when the checksum has not been seen.\n *\n * @param checksum - The `ToolCall.checksum` value to look up.\n */\n toolCallCount(checksum: string): number {\n return this.#toolCallChecksums.get(checksum) ?? 0\n }\n\n /**\n * Signals successful completion of this execution.\n *\n * @remarks\n * Sets the context's internal signal flag. The {@link @nhtio/adk!DispatchRunner} reads the flag at the\n * end of each iteration to decide whether to loop or exit. Calling `ack()` does NOT abort the\n * current iteration — the current pipeline and flush complete first.\n *\n * @throws {@link @nhtio/adk!E_LLM_EXECUTION_ALREADY_SIGNALLED} when the context has already been signalled\n * (whether via `ack()` or `nack()`).\n */\n ack(): void {\n if (this.#signalled !== undefined) {\n throw new E_LLM_EXECUTION_ALREADY_SIGNALLED()\n }\n this.#signalled = 'ack'\n // Sync iteration — handlers must observe each other's side-effects in registration order\n // (e.g. ToolRegistry.bindContext relies on this for ephemeral pruning). The hook bus is\n // unsuitable here because its `await` between handlers reorders sync side-effects via\n // microtask queuing.\n for (const handler of this.#ackHandlers) {\n try {\n handler()\n } catch {\n // Swallow individual handler errors so one misbehaving subscriber can't prevent the\n // others from running. Ack itself has already succeeded.\n }\n }\n }\n\n /**\n * Registers a handler to run when this context completes successfully via {@link ack}.\n *\n * @remarks\n * The handler does NOT fire on {@link nack} — failed executor runs should leave any\n * ack-tied subscriptions alone so the consumer can inspect what was registered when\n * debugging the failure. Returns an unsubscribe function; subscriptions are short-lived\n * and die with the context regardless.\n *\n * The canonical consumer is `ToolRegistry.bindContext(ctx)`, which uses this hook to drop\n * ephemeral tools (notably forged artifact-query tools from `SpooledArtifact.forgeTools(ctx)`)\n * at ctx-completion. Consumers may also register custom handlers here for any per-executor\n * cleanup.\n *\n * @param handler - Callback invoked when `ack()` is called.\n * @returns An unsubscribe function that removes the handler.\n *\n * @see {@link @nhtio/adk!ToolRegistry.bindContext}\n * @see {@link @nhtio/adk!SpooledArtifact.forgeTools}\n */\n onAck(handler: () => void): () => void {\n this.#ackHandlers.add(handler)\n return () => {\n this.#ackHandlers.delete(handler)\n }\n }\n\n /**\n * Signals failed completion of this execution, optionally with an error.\n *\n * @remarks\n * Sets the context's internal signal flag and stores the error. The {@link @nhtio/adk!DispatchRunner}\n * reads the flag at the end of each iteration and surfaces the error via the `dispatchEnd`\n * observability payload and as the rejection reason of `dispatch()`. Calling `nack()` does NOT\n * abort the current iteration — the current pipeline and flush complete first.\n *\n * @param error - Optional error describing the failure. If omitted, a generic Error is used.\n * @throws {@link @nhtio/adk!E_LLM_EXECUTION_ALREADY_SIGNALLED} when the context has already been signalled.\n */\n nack(error?: Error): void {\n if (this.#signalled !== undefined) {\n throw new E_LLM_EXECUTION_ALREADY_SIGNALLED()\n }\n this.#signalled = 'nack'\n this.#nackError = error ?? new Error('LLM execution was nacked without an explicit error.')\n }\n\n /**\n * Returns `true` if `value` is a {@link DispatchContext} instance.\n *\n * @remarks\n * Uses {@link @nhtio/adk!isInstanceOf} for cross-realm safety. The ADK does not export the\n * `DispatchContext` class itself as a constructable value — use this guard plus the\n * {@link DispatchContext} type for runtime detection and TypeScript narrowing.\n *\n * @param value - The value to test.\n * @returns `true` when `value` is a {@link DispatchContext} instance.\n */\n public static isDispatchContext(value: unknown): value is DispatchContext {\n return isInstanceOf(value, 'DispatchContext', DispatchContext)\n }\n\n // ── declare readonly (TypeScript public surface) ──────────────────────────\n\n /** Unique identifier for this execution context, generated as UUIDv6 at construction time. */\n declare readonly id: string\n /** Stable identifier for the dispatch this context belongs to; set by `DispatchRunner`. */\n declare readonly dispatchId: string\n /** 0-based iteration count within the current dispatch; updated by `DispatchRunner`. */\n declare readonly iteration: number\n /** `true` when the abort controller signal has fired. */\n declare readonly aborted: boolean\n /** The `AbortSignal` from the execution's `AbortController`. */\n declare readonly abortSignal: AbortSignal\n /**\n * Aborts the dispatch's `AbortController` with the supplied reason. Middleware should call this\n * when refusing to proceed — the runner short-circuits cleanly, `dispatchEnd.status` resolves\n * to `'aborted'`, and no `error` event is emitted.\n */\n declare readonly abort: (reason?: unknown) => void\n /** `true` once {@link DispatchContext.ack} or {@link DispatchContext.nack} has been called. */\n declare readonly isSignalled: boolean\n /** `true` when the context was signalled via {@link DispatchContext.ack}. */\n declare readonly isAcked: boolean\n /** The error stored by {@link DispatchContext.nack}, or `undefined` if not nacked. */\n declare readonly nackError: Error | undefined\n /** Arbitrary key-value store for cross-step state. */\n declare readonly stash: Registry\n /** The system prompt for this execution. */\n declare readonly systemPrompt: Tokenizable\n /** Standing instructions for this execution, in insertion order. */\n declare readonly standingInstructions: Set<Tokenizable>\n /** Memories loaded for this execution. */\n declare readonly turnMemories: Set<Memory>\n /** Retrievable records loaded for this execution. */\n declare readonly turnRetrievables: Set<Retrievable>\n /** Messages loaded for this execution. */\n declare readonly turnMessages: Set<Message>\n /** Thoughts loaded for this execution. */\n declare readonly turnThoughts: Set<Thought>\n /** Tool calls loaded for this execution. */\n declare readonly turnToolCalls: Set<ToolCall>\n /** Tool registry for this execution. */\n declare readonly tools: ToolRegistry\n /** Fetches memories; delegates to the callback supplied at construction. */\n declare readonly fetchMemories: () => Memory[] | Promise<Memory[]>\n /** Fetches retrievable records; delegates to the callback supplied at construction. */\n declare readonly fetchRetrievables: () => Retrievable[] | Promise<Retrievable[]>\n /** Fetches messages; delegates to the callback supplied at construction. */\n declare readonly fetchMessages: () => Message[] | Promise<Message[]>\n /** Fetches thoughts; delegates to the callback supplied at construction. */\n declare readonly fetchThoughts: () => Thought[] | Promise<Thought[]>\n /** Fetches tool calls; delegates to the callback supplied at construction. */\n declare readonly fetchToolCalls: () => ToolCall[] | Promise<ToolCall[]>\n /** Fetches tools; delegates to the callback supplied at construction. */\n declare readonly fetchTools: () => Tool[] | Promise<Tool[]>\n /** Refreshes and returns standing instructions. */\n declare readonly refreshStandingInstructions: () =>\n | (string | Tokenizable)[]\n | Promise<(string | Tokenizable)[]>\n /** Stores a new standing instruction in the local Set and persistence layer. */\n declare readonly storeStandingInstruction: (v: string | Tokenizable) => Promise<void>\n /** Updates an existing standing instruction in the local Set and persistence layer. */\n declare readonly mutateStandingInstruction: (v: string | Tokenizable) => Promise<void>\n /** Removes a standing instruction from the local Set and persistence layer. */\n declare readonly deleteStandingInstruction: (v: string | Tokenizable) => Promise<void>\n /** Stores a new memory in the local Set and persistence layer. */\n declare readonly storeMemory: (v: Memory) => Promise<void>\n /** Updates an existing memory in the local Set and persistence layer. */\n declare readonly mutateMemory: (v: Memory) => Promise<void>\n /** Removes a memory from the local Set and persistence layer by ID. */\n declare readonly deleteMemory: (id: string) => Promise<void>\n /** Stores a new retrievable record in the local Set and persistence layer. */\n declare readonly storeRetrievable: (v: Retrievable) => Promise<Retrievable>\n /** Updates an existing retrievable record in the local Set and persistence layer. */\n declare readonly mutateRetrievable: (v: Retrievable) => Promise<Retrievable>\n /** Removes a retrievable record from the local Set and persistence layer by ID. */\n declare readonly deleteRetrievable: (id: string) => Promise<void>\n /** Stores a new message in the local Set and persistence layer. */\n declare readonly storeMessage: (v: Message) => Promise<void>\n /** Updates an existing message in the local Set and persistence layer. */\n declare readonly mutateMessage: (v: Message) => Promise<void>\n /** Removes a message from the local Set and persistence layer by ID. */\n declare readonly deleteMessage: (id: string) => Promise<void>\n /** Stores a new thought in the local Set and persistence layer. */\n declare readonly storeThought: (v: Thought) => Promise<void>\n /** Updates an existing thought in the local Set and persistence layer. */\n declare readonly mutateThought: (v: Thought) => Promise<void>\n /** Removes a thought from the local Set and persistence layer by ID. */\n declare readonly deleteThought: (id: string) => Promise<void>\n /** Stores a new tool call in the local Set and persistence layer. */\n declare readonly storeToolCall: (v: ToolCall) => Promise<void>\n /** Updates an existing tool call in the local Set and persistence layer. */\n declare readonly mutateToolCall: (v: ToolCall) => Promise<void>\n /** Removes a tool call from the local Set and persistence layer by ID. */\n declare readonly deleteToolCall: (id: string) => Promise<void>\n /** Replaces a complete colliding tool-call group and persists the replacement. */\n declare readonly replaceToolCallGroup: (\n ids: readonly string[],\n replacements: readonly ToolCall[]\n ) => Promise<void>\n /**\n * Persists tool-generated media bytes into consumer storage and returns a {@link @nhtio/adk!MediaReader}.\n *\n * @remarks\n * This is a low-level persistence conduit, NOT a mutation: it does not add to `turnMessages`/\n * `turnToolCalls` or fire a `stored*` hook. The handler builds a {@link @nhtio/adk!Media} from the\n * returned reader (`Media.toolGenerated({ reader })`) and stores the owning primitive — a\n * {@link @nhtio/adk!Message} attachment or {@link @nhtio/adk!ToolCall} result — via the relevant\n * `store*` method separately. Persisting bytes without storing the primitive means the framework\n * never sees the media.\n */\n declare readonly storeMediaBytes: (\n id: string,\n bytes: ConduitBytes\n ) => MediaReader | Promise<MediaReader>\n /**\n * Persists extracted retrievable text bytes into consumer storage and returns a\n * {@link @nhtio/adk!SpoolReader}.\n *\n * @remarks\n * Low-level persistence conduit, same posture as {@link DispatchContext.storeMediaBytes}: returns a\n * value, touches no Sets, fires no hook. Wrap the reader in a {@link @nhtio/adk!SpooledArtifact} and\n * pass it as `Retrievable.content`, then persist the record via {@link DispatchContext.storeRetrievable}.\n */\n declare readonly storeRetrievableBytes: (\n id: string,\n bytes: ConduitBytes\n ) => SpoolReader | Promise<SpoolReader>\n /** Emits a `message` hook; fires registered handlers synchronously. */\n declare readonly emitMessage: EmitMessageFn\n /** Emits a `thought` hook; fires registered handlers synchronously. */\n declare readonly emitThought: EmitThoughtFn\n /** Emits a `toolCall` hook; fires registered handlers synchronously. */\n declare readonly emitToolCall: EmitToolCallFn\n /** Emits a `toolExecutionStart` hook; fires registered handlers synchronously. */\n declare readonly emitToolExecutionStart: EmitToolExecutionStartFn\n /** Emits a `toolExecutionEnd` hook; fires registered handlers synchronously. */\n declare readonly emitToolExecutionEnd: EmitToolExecutionEndFn\n /** Opens a gate and suspends until it resolves, rejects, times out, or is aborted. */\n declare readonly waitFor: OpenGateFn\n}\n","import { DateTime } from 'luxon'\nimport { sha256 } from 'js-sha256'\nimport { v6 as uuidv6 } from 'uuid'\nimport { Hooks } from '@nhtio/hooks'\nimport { validator } from '@nhtio/validation'\nimport { Middleware } from '@nhtio/middleware'\nimport { validateOrThrow } from './utils/validation'\nimport { isError, isInstanceOf } from './utils/guards'\nimport { ToolRegistry } from './classes/tool_registry'\nimport { canonicalStringify } from './utils/canonical_json'\nimport { SpooledArtifact } from './classes/spooled_artifact'\nimport { TurnContext } from './contracts/turn_runner_context'\nimport { DispatchContext } from './contracts/dispatch_context'\nimport { normalizeRetrievables } from './utils/retrievable_spool'\nimport { runWithEstimationWarnings } from './utils/estimation_context'\nimport {\n E_INVALID_LLM_DISPATCH_INPUT,\n E_DISPATCH_PIPELINE_ERROR,\n E_LLM_EXECUTION_EXECUTOR_ERROR,\n E_PIPELINE_SHORT_CIRCUITED,\n} from './exceptions/runtime'\nimport type { Memory } from './classes/memory'\nimport type { Message } from './classes/message'\nimport type { Thought } from './classes/thought'\nimport type { ToolCall } from './classes/tool_call'\nimport type { Retrievable } from './classes/retrievable'\nimport type { Tokenizable } from './classes/tokenizable'\nimport type { BaseException } from './classes/base_exception'\nimport type { EstimationWarning } from './utils/estimation_context'\nimport type { Runner as MiddlewareRunner } from '@nhtio/middleware'\nimport type { RawDispatchContext } from './contracts/dispatch_context'\nimport type { TurnStreamableContent, TurnToolCallContent } from './types/turn_runner'\nimport type {\n DispatchPipelineMiddlewareFn,\n DispatchExecutorFn,\n DispatchExecutorHelpers,\n DispatchExecutorLogChannel,\n DispatchExecutorLogEntry,\n DispatchExecutorLogLevel,\n LogEvent,\n WarningEvent,\n GenerationStats,\n GenerationStatsEvent,\n ContextDelta,\n DispatchRunnerFunctionalHooks,\n DispatchRunnerObservabilityHooks,\n DispatchRunnerFunctionalHookRegistrations,\n DispatchRunnerObservabilityHookRegistrations,\n} from './types/dispatch_runner'\n\n/**\n * Normalise a thrown/nacked value into an `Error` suitable for use as an exception `cause`. A strict\n * `Error` (per {@link isError}, which is cross-realm-safe) passes through unchanged; anything else — a\n * string, a plain object, a cross-realm error whose `instanceof Error` is false, a WASM/DOM value — is\n * wrapped in a real `Error` whose message is the value's best string form, with the original preserved on\n * `.cause`. This guarantees an `E_LLM_EXECUTION_EXECUTOR_ERROR` (or any wrapper) always carries a\n * meaningful, Error-shaped cause: the true failure is never reduced to the generic default message, and\n * downstream root-cause unwrapping / `isError` checks keep working.\n */\nconst toErrorCause = (value: unknown): Error => {\n if (isError(value)) return value\n let text: string\n try {\n text =\n typeof value === 'string'\n ? value\n : value === undefined\n ? 'undefined'\n : (JSON.stringify(value) ?? String(value))\n } catch {\n text = String(value)\n }\n return new Error(`non-Error thrown by executor: ${text}`, { cause: value })\n}\n\n/**\n * Build an {@link @nhtio/adk!E_LLM_EXECUTION_EXECUTOR_ERROR} whose own `message` names the underlying\n * failure, with the original preserved on `.cause`.\n *\n * @remarks\n * The cause CHAIN being intact is not the same as the failure being diagnosable: the overwhelmingly\n * common consumer habit is to log `err.message`, and a static wrapper text gives such a caller no\n * signal at all — not even the category of failure. A client-side validation error inside a battery\n * looked identical to a transport failure, an engine abort, or a bug in the executor itself.\n *\n * The static text is kept as the PREFIX so existing log greps and string matches keep working; the\n * cause text is joined to it with `: ` — the static text's own trailing period is dropped first, so the\n * result reads as one sentence instead of two run together. Appending is skipped when the cause adds\n * nothing (no message, or a message identical to the prefix) so the common case is byte-for-byte\n * unchanged.\n *\n * `cause.message` is NOT assumed to be a string, and coercing it is NOT assumed to succeed. `isError`\n * (and therefore `toErrorCause`) accepts anything Error-SHAPED via a cross-realm prototype check and\n * never validates `message`'s type, so a duck-typed or cross-realm error can carry a non-string\n * `message`. Two ways that bites, both verified:\n * - a bare `.trim()` on a non-string throws a TypeError;\n * - even a type-guarded `String()` throws when `message` is an object with a hostile\n * `toString`/`Symbol.toPrimitive`.\n *\n * Either one escapes this helper, so NO wrapper is returned: the `runner('error')` observability hook\n * never fires and both the executor error and its cause chain are lost — the exact failure class this\n * helper exists to make diagnosable. Enrichment is therefore best-effort: any failure to derive text\n * falls back to the bare static message, because a wrapper with a terse message beats no wrapper.\n *\n * `message` is assigned post-construction rather than passed in: the exception is produced by\n * `createException`, whose constructor takes only {@link @nhtio/adk!ExceptionOptions} (no message\n * override), and widening that public signature is not worth the reach of this change.\n */\nconst executorError = (value: unknown): BaseException => {\n const cause = toErrorCause(value)\n const wrapped = new E_LLM_EXECUTION_EXECUTOR_ERROR({ cause }) as unknown as BaseException\n const base = wrapped.message\n let detail = ''\n try {\n const rawDetail: unknown = cause.message\n detail = (typeof rawDetail === 'string' ? rawDetail : String(rawDetail ?? '')).trim()\n } catch {\n // Hostile `message` (throwing toString / Symbol.toPrimitive). Keep the static text and move on —\n // never let enrichment be the reason the caller loses the real error.\n detail = ''\n }\n if (detail.length > 0 && detail !== base) {\n wrapped.message = `${base.replace(/\\.$/, '')}: ${detail}`\n }\n return wrapped\n}\n\n/**\n * Plain input object supplied to {@link DispatchRunner.dispatch}.\n *\n * @remarks\n * Exactly one of `source` or `raw` is required:\n *\n * - `source` — switches to the **derived path**. The runner snapshots primitives from the\n * provided {@link @nhtio/adk!TurnContext}, wires all fetch/refresh/mutation callbacks to delegate to it,\n * forwards emits back to its buses, and bubbles mutations to its Sets at the end of every\n * iteration.\n *\n * - `raw` — switches to the **standalone path**. The runner constructs an {@link @nhtio/adk!DispatchContext}\n * directly from the provided raw input. No parent relationship exists; mutations are not bubbled.\n *\n * The `executor` is the user-provided callback that performs the actual LLM API call between the\n * input and output middleware pipelines on every iteration.\n */\nexport interface RawDispatchRunnerInput {\n /** Source {@link @nhtio/adk!TurnContext} to derive the execution context from. Mutually exclusive with `raw`. */\n source?: TurnContext\n /** Raw input for a standalone {@link @nhtio/adk!DispatchContext}. Mutually exclusive with `source`. */\n raw?: Omit<RawDispatchContext, 'hooks'>\n /** User-provided callback that makes the LLM API call. Invoked between input and output pipelines on every iteration. */\n executor: DispatchExecutorFn\n /** Input middleware functions, executed in order before the executor on every iteration. */\n turnInputPipeline?: DispatchPipelineMiddlewareFn[]\n /** Output middleware functions, executed in order after the executor on every iteration. */\n turnOutputPipeline?: DispatchPipelineMiddlewareFn[]\n /** Optional functional hook registrations: message, thought, toolCall. */\n hooks?: DispatchRunnerFunctionalHookRegistrations\n /** Optional observability hook registrations: lifecycle events + tool execution + error. */\n observers?: DispatchRunnerObservabilityHookRegistrations\n}\n\nconst dispatchInputSchema = validator.object<RawDispatchRunnerInput>({\n source: validator\n .any()\n .custom((value, helpers) => {\n if (value === undefined) return value\n if (isInstanceOf(value, 'TurnContext', TurnContext)) return value\n return helpers.error('any.invalid')\n })\n .optional(),\n raw: validator.object().unknown(true).optional(),\n executor: validator.function().required(),\n turnInputPipeline: validator.array().items(validator.function()).default([]),\n turnOutputPipeline: validator.array().items(validator.function()).default([]),\n hooks: validator.object().optional(),\n observers: validator.object().optional(),\n})\n\n/**\n * Orchestrates a single LLM execution dispatch — input pipeline → executor → output pipeline —\n * looped until middleware/executor signals completion via {@link @nhtio/adk!DispatchContext.ack} /\n * {@link @nhtio/adk!DispatchContext.nack} or the abort signal fires.\n *\n * @remarks\n * `DispatchRunner` has a private constructor and is invoked via the static `dispatch()`\n * method. Each dispatch creates a fresh single-use runner that is garbage-collected after the\n * call completes — matching the `@nhtio/hooks` GC rationale already baked into the context.\n *\n * The runner owns the relationship between an {@link @nhtio/adk!DispatchContext} and its parent\n * {@link @nhtio/adk!TurnContext} (when given a source). It subscribes to the context's mutation hooks,\n * queues `ContextDelta` entries, and flushes them to the parent's Sets at the end of every\n * iteration. Emits propagate from the context's hooks → the runner's hooks → (optionally) the\n * parent `TurnContext`'s emit methods → the `TurnRunner`'s buses.\n *\n * Two hook buses, mirroring `TurnRunner`'s pattern:\n *\n * - **Functional** (`hooks`): `message`, `thought`, `toolCall` — pipeline-affecting events\n * - **Observability** (`observers`): `iterationStart`, `iterationEnd`, `dispatchStart`,\n * `dispatchEnd`, `error`, `toolExecutionStart`, `toolExecutionEnd` — instrumentation only\n *\n * The runner has no `maxIterations`, no `maxToolCallChecksumRepeats`. Implementers use the\n * primitives — `ctx.iteration`, `ctx.toolCallCount(checksum)`, `ctx.ack()`, `ctx.nack()`,\n * `ctx.abortSignal` — to build any termination bounds they need in their own middleware.\n */\n/**\n * Module-private token gating direct construction of {@link DispatchRunner}. Callers must use\n * {@link DispatchRunner.dispatch}; the symbol is not exported, so external code cannot satisfy\n * the guard at runtime.\n */\nconst CONSTRUCT_TOKEN = Symbol('DispatchRunner.construct')\n\n/**\n * Runs a single dispatch iteration of an agentic turn: it drives the executor through the\n * input/output middleware pipelines, emitting functional and observability hook events along the\n * way. Construction is gated — obtain one via the static {@link DispatchRunner.dispatch} entry\n * point rather than `new`.\n */\nexport class DispatchRunner {\n #functionalHooks: Hooks<DispatchRunnerFunctionalHooks>\n #observabilityHooks: Hooks<DispatchRunnerObservabilityHooks>\n // The Middleware holders are built once; a FRESH Runner is derived from each\n // per dispatch iteration. A Runner is single-use — its internal cursor\n // (#currentIndex) is never reset by run() — so reusing one Runner across\n // iterations silently no-ops every pipeline after the first. The dispatch loop\n // runs the input/output pipelines once PER iteration, so it must mint a new\n // Runner each time or the citation/quality gate (and all output middleware)\n // would only ever fire on iteration 0.\n #inputPipeline: Middleware<DispatchPipelineMiddlewareFn>\n #outputPipeline: Middleware<DispatchPipelineMiddlewareFn>\n #sourceCtx: TurnContext | undefined\n #deltaQueue: ContextDelta[]\n\n /**\n * Construction is gated by an internal sentinel `token` — call the static\n * {@link DispatchRunner.dispatch} entry point instead of `new`.\n *\n * @internal\n */\n constructor(\n token: typeof CONSTRUCT_TOKEN,\n sourceCtx: TurnContext | undefined,\n turnInputPipeline: DispatchPipelineMiddlewareFn[],\n turnOutputPipeline: DispatchPipelineMiddlewareFn[],\n hooks: DispatchRunnerFunctionalHookRegistrations | undefined,\n observers: DispatchRunnerObservabilityHookRegistrations | undefined\n ) {\n if (token !== CONSTRUCT_TOKEN) {\n throw new E_INVALID_LLM_DISPATCH_INPUT()\n }\n this.#sourceCtx = sourceCtx\n this.#deltaQueue = []\n this.#functionalHooks = new Hooks<DispatchRunnerFunctionalHooks>()\n this.#observabilityHooks = new Hooks<DispatchRunnerObservabilityHooks>()\n\n const inputPipeline = new Middleware<DispatchPipelineMiddlewareFn>()\n const outputPipeline = new Middleware<DispatchPipelineMiddlewareFn>()\n const wrap =\n (fn: DispatchPipelineMiddlewareFn): DispatchPipelineMiddlewareFn =>\n (ctx, next) => {\n // Skip downstream user middlewares once an abort has been signalled. The\n // wrapper still calls next() so the pipeline reaches its terminal resolver\n // (keeping the short-circuit detector quiet); the original middleware body\n // does not run, so it has nothing to clean up.\n if (ctx.aborted) return next()\n return fn(ctx, next)\n }\n for (const fn of turnInputPipeline) inputPipeline.add(wrap(fn))\n for (const fn of turnOutputPipeline) outputPipeline.add(wrap(fn))\n // Hold the Middleware; derive a fresh Runner per iteration (see field docs).\n this.#inputPipeline = inputPipeline\n this.#outputPipeline = outputPipeline\n\n if (hooks) {\n for (const key of Object.keys(hooks) as (keyof DispatchRunnerFunctionalHooks)[]) {\n const entry = hooks[key]\n if (!entry) continue\n const handlers = Array.isArray(entry) ? entry : [entry]\n for (const h of handlers) this.#functionalHooks.add(key, h as any)\n }\n }\n if (observers) {\n for (const key of Object.keys(observers) as (keyof DispatchRunnerObservabilityHooks)[]) {\n const entry = observers[key]\n if (!entry) continue\n const handlers = Array.isArray(entry) ? entry : [entry]\n for (const h of handlers) this.#observabilityHooks.add(key, h as any)\n }\n }\n }\n\n /**\n * Returns `true` if `value` is a {@link DispatchRunner} instance.\n *\n * @remarks\n * Uses {@link @nhtio/adk!isInstanceOf} for cross-realm safety.\n *\n * @param value - The value to test.\n * @returns `true` when `value` is a {@link DispatchRunner} instance.\n */\n public static isDispatchRunner(value: unknown): value is DispatchRunner {\n return isInstanceOf(value, 'DispatchRunner', DispatchRunner)\n }\n\n /**\n * Dispatches a single LLM execution.\n *\n * @remarks\n * Constructs an {@link @nhtio/adk!DispatchContext} (derived from `source` or from `raw`), runs the\n * iteration loop, and resolves when middleware/executor signals completion via `ctx.ack()` or\n * the abort signal fires. Rejects with the nack error when middleware/executor calls\n * `ctx.nack(err)`. Pipeline and executor errors are wrapped, surfaced on the observability\n * `error` hook, and re-thrown.\n *\n * @param input - The dispatch input. Provide either `source` (derived path) or `raw` (standalone).\n * @throws {@link @nhtio/adk!E_INVALID_LLM_DISPATCH_INPUT} when the input does not satisfy validation, or\n * when neither `source` nor `raw` is provided, or when both are provided.\n */\n public static async dispatch(input: RawDispatchRunnerInput): Promise<void> {\n let resolved: RawDispatchRunnerInput & {\n turnInputPipeline: DispatchPipelineMiddlewareFn[]\n turnOutputPipeline: DispatchPipelineMiddlewareFn[]\n }\n try {\n resolved = validateOrThrow(dispatchInputSchema, input, true) as typeof resolved\n } catch (err) {\n throw new E_INVALID_LLM_DISPATCH_INPUT({\n cause: isError(err) ? err : undefined,\n })\n }\n\n if (!resolved.source && !resolved.raw) {\n throw new E_INVALID_LLM_DISPATCH_INPUT()\n }\n if (resolved.source && resolved.raw) {\n throw new E_INVALID_LLM_DISPATCH_INPUT()\n }\n\n const runner = new DispatchRunner(\n CONSTRUCT_TOKEN,\n resolved.source,\n resolved.turnInputPipeline,\n resolved.turnOutputPipeline,\n resolved.hooks,\n resolved.observers\n )\n\n const llmCtx = runner.#buildContext(resolved.source, resolved.raw)\n runner.#wireContextHooks(llmCtx)\n await normalizeRetrievables(llmCtx)\n if (resolved.source) {\n // Write the now-spooled records back onto the source TurnContext's own working set, so a\n // subsequent dispatch from the same TurnContext reuses the existing artifact handle instead\n // of re-encoding and re-storing the same plain-string content from scratch every time.\n for (const record of llmCtx.turnRetrievables) {\n runner.#replaceById(resolved.source.turnRetrievables, record.id, record)\n }\n }\n\n await runner.#runDispatch(llmCtx, resolved.executor)\n }\n\n // ── Context construction ──────────────────────────────────────────────────\n\n #buildContext(\n source: TurnContext | undefined,\n raw: Omit<RawDispatchContext, 'hooks'> | undefined\n ): DispatchContext {\n if (source) {\n const ac = new AbortController()\n source.abortSignal.addEventListener('abort', () => ac.abort(), {\n once: true,\n })\n\n const builtRaw: RawDispatchContext = {\n turnAbortController: ac,\n stash: source.stash.all(),\n systemPrompt: source.systemPrompt,\n standingInstructions: [...source.standingInstructions],\n memories: [...source.turnMemories],\n retrievables: [...source.turnRetrievables],\n messages: [...source.turnMessages],\n thoughts: [...source.turnThoughts],\n toolCalls: [...source.turnToolCalls],\n tools: source.tools.all(),\n fetchMemories: () => source.fetchMemories(),\n fetchRetrievables: () => source.fetchRetrievables(),\n fetchMessages: () => source.fetchMessages(),\n fetchThoughts: () => source.fetchThoughts(),\n fetchToolCalls: () => source.fetchToolCalls(),\n fetchTools: () => source.fetchTools(),\n refreshStandingInstructions: () => source.refreshStandingInstructions(),\n storeStandingInstruction: (_c, v) => source.storeStandingInstruction(v),\n mutateStandingInstruction: (_c, v) => source.mutateStandingInstruction(v),\n deleteStandingInstruction: (_c, v) => source.deleteStandingInstruction(v),\n storeMemory: (_c, v) => source.storeMemory(v),\n mutateMemory: (_c, v) => source.mutateMemory(v),\n deleteMemory: (_c, id) => source.deleteMemory(id),\n storeRetrievable: async (_c, v) => {\n return source.storeRetrievable(v) as unknown as Promise<void>\n },\n mutateRetrievable: async (_c, v) => {\n return source.mutateRetrievable(v) as unknown as Promise<void>\n },\n deleteRetrievable: (_c, id) => source.deleteRetrievable(id),\n storeMessage: (_c, v) => source.storeMessage(v),\n mutateMessage: (_c, v) => source.mutateMessage(v),\n deleteMessage: (_c, id) => source.deleteMessage(id),\n storeThought: (_c, v) => source.storeThought(v),\n mutateThought: (_c, v) => source.mutateThought(v),\n deleteThought: (_c, id) => source.deleteThought(id),\n storeToolCall: (_c, v) => source.storeToolCall(v),\n mutateToolCall: (_c, v) => source.mutateToolCall(v),\n deleteToolCall: (_c, id) => source.deleteToolCall(id),\n replaceToolCallGroup: (_c, ids, replacements) =>\n source.replaceToolCallGroup(ids, replacements),\n storeMediaBytes: (_c, id, bytes) => source.storeMediaBytes(id, bytes),\n storeRetrievableBytes: (_c, id, bytes) => source.storeRetrievableBytes(id, bytes),\n waitFor: source.waitFor,\n }\n return new DispatchContext(builtRaw)\n }\n\n // Standalone path — runner does not pass hooks (it registers its own forwarders below).\n return new DispatchContext(raw as RawDispatchContext)\n }\n\n // ── Wire forwarding handlers from ctx hooks to runner hooks ───────────────\n\n #wireContextHooks(llmCtx: DispatchContext): void {\n const ctxHooks = llmCtx._getHooks()\n\n // Functional forwarders: ctx → runner (functional) → (if source) → TurnContext\n ctxHooks.add('message', (c) => {\n void this.#functionalHooks.runner('message').run(c)\n if (this.#sourceCtx) this.#sourceCtx.emitMessage(c)\n })\n ctxHooks.add('thought', (c) => {\n void this.#functionalHooks.runner('thought').run(c)\n if (this.#sourceCtx) this.#sourceCtx.emitThought(c)\n })\n ctxHooks.add('toolCall', (c) => {\n void this.#functionalHooks.runner('toolCall').run(c)\n if (this.#sourceCtx) this.#sourceCtx.emitToolCall(c)\n })\n\n // Observability forwarders for tool execution lifecycle\n ctxHooks.add('toolExecutionStart', (e) => {\n void this.#observabilityHooks.runner('toolExecutionStart').run(e)\n if (this.#sourceCtx) this.#sourceCtx.emitToolExecutionStart(e)\n })\n ctxHooks.add('toolExecutionEnd', (e) => {\n void this.#observabilityHooks.runner('toolExecutionEnd').run(e)\n if (this.#sourceCtx) this.#sourceCtx.emitToolExecutionEnd(e)\n })\n\n // Mutation hooks → push to internal delta queue (only meaningful when source exists,\n // but registering unconditionally keeps the API uniform; queue is drained only in derived)\n ctxHooks.add('storedStandingInstruction', (v) => {\n this.#deltaQueue.push({\n op: 'store',\n type: 'standingInstruction',\n value: v,\n })\n })\n ctxHooks.add('mutatedStandingInstruction', (v) => {\n this.#deltaQueue.push({\n op: 'mutate',\n type: 'standingInstruction',\n value: v,\n })\n })\n ctxHooks.add('deletedStandingInstruction', (v) => {\n this.#deltaQueue.push({\n op: 'delete',\n type: 'standingInstruction',\n value: v,\n })\n })\n ctxHooks.add('storedMemory', (v) => {\n this.#deltaQueue.push({ op: 'store', type: 'memory', value: v })\n })\n ctxHooks.add('mutatedMemory', (v) => {\n this.#deltaQueue.push({ op: 'mutate', type: 'memory', value: v })\n })\n ctxHooks.add('deletedMemory', (id) => {\n this.#deltaQueue.push({ op: 'delete', type: 'memory', value: id })\n })\n ctxHooks.add('storedRetrievable', (v) => {\n this.#deltaQueue.push({ op: 'store', type: 'retrievable', value: v })\n })\n ctxHooks.add('mutatedRetrievable', (v) => {\n this.#deltaQueue.push({ op: 'mutate', type: 'retrievable', value: v })\n })\n ctxHooks.add('deletedRetrievable', (id) => {\n this.#deltaQueue.push({ op: 'delete', type: 'retrievable', value: id })\n })\n ctxHooks.add('storedMessage', (v) => {\n this.#deltaQueue.push({ op: 'store', type: 'message', value: v })\n })\n ctxHooks.add('mutatedMessage', (v) => {\n this.#deltaQueue.push({ op: 'mutate', type: 'message', value: v })\n })\n ctxHooks.add('deletedMessage', (id) => {\n this.#deltaQueue.push({ op: 'delete', type: 'message', value: id })\n })\n ctxHooks.add('storedThought', (v) => {\n this.#deltaQueue.push({ op: 'store', type: 'thought', value: v })\n })\n ctxHooks.add('mutatedThought', (v) => {\n this.#deltaQueue.push({ op: 'mutate', type: 'thought', value: v })\n })\n ctxHooks.add('deletedThought', (id) => {\n this.#deltaQueue.push({ op: 'delete', type: 'thought', value: id })\n })\n ctxHooks.add('storedToolCall', (v) => {\n this.#deltaQueue.push({ op: 'store', type: 'toolCall', value: v })\n })\n ctxHooks.add('mutatedToolCall', (v) => {\n this.#deltaQueue.push({ op: 'mutate', type: 'toolCall', value: v })\n })\n ctxHooks.add('deletedToolCall', (id) => {\n this.#deltaQueue.push({ op: 'delete', type: 'toolCall', value: id })\n })\n }\n\n // ── Helper builder ────────────────────────────────────────────────────────\n\n /**\n * Constructs an {@link @nhtio/adk!DispatchExecutorHelpers} instance bound to a single dispatch.\n *\n * @remarks\n * Per-id stream state lives on closure-captured `Map`s, so it persists across iterations of\n * the dispatch but cannot leak between dispatches (the runner itself is single-use and\n * garbage-collected after `dispatch()` returns).\n */\n #buildHelpers(ctx: DispatchContext): DispatchExecutorHelpers {\n const observabilityHooks = this.#observabilityHooks\n const makeLogEmitter =\n (level: DispatchExecutorLogLevel) =>\n (entry: DispatchExecutorLogEntry): void => {\n const event: LogEvent = {\n dispatchId: ctx.dispatchId,\n iteration: ctx.iteration,\n emittedAt: DateTime.now(),\n level,\n kind: entry.kind,\n message: entry.message,\n ...(entry.payload !== undefined ? { payload: entry.payload } : {}),\n }\n void observabilityHooks.runner('log').run(event)\n }\n const log: DispatchExecutorLogChannel = {\n trace: makeLogEmitter('trace'),\n debug: makeLogEmitter('debug'),\n info: makeLogEmitter('info'),\n warn: makeLogEmitter('warn'),\n error: makeLogEmitter('error'),\n }\n\n const reportGenerationStats = (stats: GenerationStats): void => {\n const event: GenerationStatsEvent = {\n ...stats,\n dispatchId: ctx.dispatchId,\n iteration: ctx.iteration,\n emittedAt: DateTime.now(),\n }\n void observabilityHooks.runner('generationStats').run(event)\n }\n\n const messageStreams = new Map<\n string,\n { full: string; createdAt: DateTime; isComplete: boolean }\n >()\n const thoughtStreams = new Map<\n string,\n { full: string; createdAt: DateTime; isComplete: boolean }\n >()\n const toolCallStreams = new Map<\n string,\n {\n tool?: string\n args?: unknown\n checksum?: string\n results?: unknown\n isError: boolean\n isComplete: boolean\n createdAt: DateTime\n }\n >()\n\n const buildStream = (\n store: Map<string, { full: string; createdAt: DateTime; isComplete: boolean }>,\n id: string,\n deltaText: string,\n isComplete: boolean\n ): TurnStreamableContent => {\n let entry = store.get(id)\n const now = DateTime.now()\n if (!entry) {\n entry = { full: '', createdAt: now, isComplete: false }\n store.set(id, entry)\n }\n if (entry.isComplete) {\n throw new Error(`stream \"${id}\" is already complete; further chunks are not accepted`)\n }\n entry.full = entry.full + deltaText\n entry.isComplete = isComplete\n return {\n id,\n createdAt: entry.createdAt,\n updatedAt: now,\n full: entry.full,\n aDelta: deltaText,\n isComplete,\n ...(isComplete ? { completedAt: now } : {}),\n }\n }\n\n return {\n reportMessage: (id, deltaText, opts) => {\n const isComplete = opts?.isComplete ?? false\n ctx.emitMessage(buildStream(messageStreams, id, deltaText, isComplete))\n },\n reportThought: (id, deltaText, opts) => {\n const isComplete = opts?.isComplete ?? false\n ctx.emitThought(buildStream(thoughtStreams, id, deltaText, isComplete))\n },\n reportToolCall: (id, partial) => {\n let entry = toolCallStreams.get(id)\n const now = DateTime.now()\n if (!entry) {\n entry = { isError: false, isComplete: false, createdAt: now }\n toolCallStreams.set(id, entry)\n }\n if (entry.isComplete) {\n throw new Error(`tool call \"${id}\" is already complete; further updates are not accepted`)\n }\n if (partial.tool !== undefined) entry.tool = partial.tool\n if (partial.args !== undefined) entry.args = partial.args\n if (partial.results !== undefined) entry.results = partial.results\n if (partial.isError !== undefined) entry.isError = partial.isError\n if (partial.isComplete !== undefined) entry.isComplete = partial.isComplete\n\n // Compute checksum once tool + args are both set (or recompute if either changed)\n if (entry.tool !== undefined && entry.args !== undefined) {\n entry.checksum = sha256(canonicalStringify({ tool: entry.tool, args: entry.args }))\n }\n\n const content: TurnToolCallContent = {\n id,\n tool: entry.tool ?? '',\n args: entry.args,\n checksum: entry.checksum ?? '',\n createdAt: entry.createdAt,\n updatedAt: now,\n isComplete: entry.isComplete,\n isError: entry.isError,\n ...(entry.results !== undefined ? { results: entry.results } : {}),\n ...(entry.isComplete ? { completedAt: now } : {}),\n }\n ctx.emitToolCall(content)\n },\n log,\n reportGenerationStats,\n }\n }\n\n // ── Iteration loop ────────────────────────────────────────────────────────\n\n /**\n * Forge artifact-reader tools from the current turn's tool-call results and register them into\n * `ctx.tools`, so the forged readers are first-class members of the tool set the whole dispatch-input plane\n * sees (budget passes, gates, observability). This is the GENERATION step — deterministic and generic;\n * batteries own only REPRESENTATION (rendering the declarations + resolving the model's calls).\n *\n * Called once per iteration before the input pipeline. Idempotent within a dispatch by construction:\n * 1. `pruneEphemeral()` drops the previous iteration's forged readers (whose `callId` enum is now stale —\n * new tool calls made last iteration must widen the enum).\n * 2. Collect the unique `SpooledArtifact` subclasses across `turnToolCalls` results, covering BOTH a single\n * artifact result and an array-of-artifacts result.\n * 3. `forgeTools(ctx)` per ctor, merged with `onCollision:'keep'` so a JSON subclass's base+JSON readers\n * win over a plain base forge of the same names (the subclass already composes base+JSON).\n * 4. Register each forged tool into `ctx.tools` (`overwrite:true` → idempotent re-register within a run).\n * 5. Bind ephemeral pruning to `ack` exactly once per dispatch (the forged tools are `ephemeral:true`, so\n * they are pruned when the dispatch acks — the lifecycle is unchanged from the battery-local era).\n */\n #forgeArtifactTools(ctx: DispatchContext): void {\n // 1. Drop stale forged readers from a prior iteration (their callId enum excludes newer calls).\n ctx.tools.pruneEphemeral()\n\n // 2. Collect unique SpooledArtifact subclasses producing this turn's results (single OR array results).\n const ctors = new Set<{ forgeTools: (c: DispatchContext) => ToolRegistry }>()\n for (const tc of ctx.turnToolCalls) {\n const results = (tc as { results?: unknown }).results\n const items = Array.isArray(results) ? results : [results]\n for (const item of items) {\n if (!SpooledArtifact.isSpooledArtifact(item)) continue\n const ctor = (item as SpooledArtifact).constructor as unknown as {\n forgeTools?: (c: DispatchContext) => ToolRegistry\n }\n if (typeof ctor.forgeTools === 'function') {\n ctors.add(ctor as { forgeTools: (c: DispatchContext) => ToolRegistry })\n }\n }\n }\n for (const retrievable of ctx.turnRetrievables) {\n if (retrievable.inline || !SpooledArtifact.isSpooledArtifact(retrievable.content)) continue\n const ctor = (retrievable.content as SpooledArtifact).constructor as unknown as {\n forgeTools?: (c: DispatchContext) => ToolRegistry\n }\n if (typeof ctor.forgeTools === 'function') {\n ctors.add(ctor as { forgeTools: (c: DispatchContext) => ToolRegistry })\n }\n }\n if (ctors.size === 0) return\n\n // 3. Forge each subclass's readers and combine. 'keep' = the first registry's tool wins on a name\n // collision (a JSON subclass forge composes base+JSON already, so keep it over a plain base forge).\n const forged = ToolRegistry.merge(\n [...ctors].map((c) => c.forgeTools(ctx)),\n { onCollision: 'keep' }\n )\n if (forged.all().length === 0) return\n\n // 4. Register the forged readers into ctx.tools so every downstream consumer (middleware, the executor's\n // representation step) sees the SAME set. overwrite:true keeps this idempotent across iterations.\n for (const tool of forged.all()) {\n ctx.tools.register(tool, true)\n if (forged.hidden().some((h) => h.name === tool.name)) ctx.tools.hide(tool.name)\n }\n\n // 5. Ephemeral prune fires on ack; bind exactly once per dispatch (iteration 0) to avoid stacking\n // onAck subscriptions across iterations.\n if (ctx.iteration === 0) ctx.tools.bindContext(ctx)\n }\n\n async #runDispatch(llmCtx: DispatchContext, executor: DispatchExecutorFn): Promise<void> {\n const dispatchId = uuidv6()\n llmCtx._setDispatchId(dispatchId)\n\n const dispatchStartedAt = DateTime.now()\n void this.#observabilityHooks\n .runner('dispatchStart')\n .run({ dispatchId, startedAt: dispatchStartedAt })\n\n // Helpers are constructed once per dispatch so per-id streaming state is preserved across\n // iterations, and garbage-collected with the runner so cross-dispatch state can't leak.\n const helpers = this.#buildHelpers(llmCtx)\n\n let iteration = 0\n let dispatchError: Error | undefined\n\n // Publish this dispatch's warn-sink for the duration of the run so a token estimation performed\n // anywhere within (an executor's overflow guard, a pipeline, a gate) can DEGRADE-and-warn instead of\n // throwing — the estimator reads the ambient sink (see utils/estimation_context). A dispatch is the\n // INNERMOST scope, so when it runs inside a TurnRunner this sink (which carries dispatchId/iteration)\n // takes precedence over the turn's. Non-fatal: `warning`, never `error`.\n const emitEstimationWarning = (w: EstimationWarning): void => {\n const event: WarningEvent = {\n dispatchId: llmCtx.dispatchId,\n iteration: llmCtx.iteration,\n emittedAt: DateTime.now(),\n source: 'dispatch-runner',\n kind: 'token-estimation-degraded',\n message: `token estimation for encoding \"${String(w.encoding)}\" failed; fell back to a char-based estimate`,\n error: w.error,\n payload: { encoding: w.encoding, textPreview: w.textPreview },\n }\n void this.#observabilityHooks.runner('warning').run(event)\n }\n\n await runWithEstimationWarnings(emitEstimationWarning, async () => {\n try {\n while (!llmCtx.aborted && !llmCtx.isSignalled) {\n llmCtx._setIteration(iteration)\n const iterationStartedAt = DateTime.now()\n void this.#observabilityHooks\n .runner('iterationStart')\n .run({ dispatchId, iteration, startedAt: iterationStartedAt })\n\n // Forge artifact-reader tools into ctx.tools BEFORE the input pipeline, so the forged readers are\n // first-class members of the tool set that ALL input middleware (budget/subtractive passes, gates,\n // observability taps) can measure, evaluate, and mutate — not a battery-local set invisible to the\n // dispatch-input plane. Runs per-iteration because ctx.turnToolCalls grows across iterations (an\n // artifact produced in iteration N only appears in N+1). Generation is a generic core concern;\n // batteries keep only REPRESENTATION (rendering declarations + resolving calls) and read ctx.tools.\n this.#forgeArtifactTools(llmCtx)\n\n await this.#runPipeline(this.#inputPipeline.runner(), llmCtx, 'input')\n if (llmCtx.aborted || llmCtx.isSignalled) {\n // ack mid-iteration flushes parent-mirror deltas accumulated so far;\n // nack / abort discards them so a partial iteration cannot leak\n // partial writes into the parent turn.\n if (llmCtx.isAcked && !llmCtx.aborted) {\n await this.#flush()\n } else {\n this.#deltaQueue.length = 0\n }\n break\n }\n\n try {\n await executor(llmCtx, helpers)\n } catch (err) {\n if (this.#isAbortError(err)) {\n this.#deltaQueue.length = 0\n break\n }\n // Preserve the thrown value as the cause — ALWAYS, even when it is not a strict `Error`. An\n // executor can reject with a non-Error (a string, a cross-realm error that fails `instanceof`,\n // a WASM/DOM value); the old `isError(err) ? err : undefined` DROPPED those, leaving a\n // cause-less wrapper whose only text was the generic \"…callback threw an error.\" — so the real\n // failure was unrecoverable and undiagnosable downstream. `toErrorCause` normalises any\n // non-Error into a real Error carrying its stringified value, keeping the `.cause` chain\n // Error-shaped for `isError`/root-cause unwrapping — and `executorError` additionally names\n // the failure in the wrapper's OWN message, for the many callers that only log `.message`.\n const wrapped = executorError(err)\n void this.#observabilityHooks.runner('error').run(wrapped)\n this.#deltaQueue.length = 0\n throw wrapped\n }\n\n if (llmCtx.aborted || llmCtx.isSignalled) {\n if (llmCtx.isAcked && !llmCtx.aborted) {\n await this.#flush()\n } else {\n this.#deltaQueue.length = 0\n }\n break\n }\n\n await this.#runPipeline(this.#outputPipeline.runner(), llmCtx, 'output')\n await this.#flush()\n\n const iterationEndedAt = DateTime.now()\n void this.#observabilityHooks.runner('iterationEnd').run({\n dispatchId,\n iteration,\n startedAt: iterationStartedAt,\n endedAt: iterationEndedAt,\n durationMs: iterationEndedAt.diff(iterationStartedAt).milliseconds,\n })\n\n iteration++\n }\n } catch (err) {\n dispatchError = isError(err) ? err : new Error(String(err))\n }\n\n const status: DispatchEndStatus = dispatchError\n ? 'nack'\n : llmCtx.nackError\n ? 'nack'\n : llmCtx.isAcked\n ? 'ack'\n : 'aborted'\n const finalError = dispatchError ?? llmCtx.nackError\n\n // Parity with the thrown-executor-error path: when the dispatch ends with\n // a nack whose cause we have not already emitted (i.e. `ctx.nack(error)`\n // was called explicitly, rather than the executor throwing), surface the\n // error on the observability `error` bus so observers see one unified\n // error stream regardless of how the nack was reached.\n if (!dispatchError && llmCtx.nackError) {\n const nackErr = llmCtx.nackError\n const wrapped = isInstanceOf(nackErr, 'BaseException')\n ? (nackErr as unknown as BaseException)\n : // Preserve a non-BaseException nack value as the cause too (see the executor-throw path):\n // a raw string / cross-realm error must not be dropped to a cause-less generic wrapper.\n executorError(nackErr)\n void this.#observabilityHooks.runner('error').run(wrapped)\n }\n\n const dispatchEndedAt = DateTime.now()\n void this.#observabilityHooks.runner('dispatchEnd').run({\n dispatchId,\n status,\n error: finalError,\n iterations: iteration,\n startedAt: dispatchStartedAt,\n endedAt: dispatchEndedAt,\n durationMs: dispatchEndedAt.diff(dispatchStartedAt).milliseconds,\n })\n\n if (finalError) throw finalError\n })\n }\n\n async #runPipeline(\n pipeline: MiddlewareRunner<DispatchPipelineMiddlewareFn>,\n llmCtx: DispatchContext,\n label: 'input' | 'output'\n ): Promise<void> {\n let pipelineError: Error | undefined\n let reached = false\n await pipeline\n .errorHandler(async (error) => {\n if (this.#isAbortError(error)) return\n pipelineError = new E_DISPATCH_PIPELINE_ERROR({\n cause: isError(error) ? error : undefined,\n })\n })\n .finalHandler(async () => {\n reached = true\n })\n .run((fn, next) => Promise.resolve(fn(llmCtx, next)))\n\n if (pipelineError) {\n void this.#observabilityHooks.runner('error').run(pipelineError as unknown as BaseException)\n throw pipelineError\n }\n\n if (!reached && !llmCtx.aborted && !llmCtx.isSignalled) {\n const shortCircuitError = new E_PIPELINE_SHORT_CIRCUITED([`dispatch-${label}`])\n void this.#observabilityHooks\n .runner('error')\n .run(shortCircuitError as unknown as BaseException)\n throw shortCircuitError\n }\n }\n\n #isAbortError(err: unknown): boolean {\n return isError(err) && isInstanceOf(err, 'AbortError')\n }\n\n async #flush(): Promise<void> {\n if (!this.#sourceCtx) {\n this.#deltaQueue.length = 0\n return\n }\n while (this.#deltaQueue.length > 0) {\n const delta = this.#deltaQueue.shift()!\n this.#applyDeltaToParent(delta)\n }\n }\n\n /**\n * Replaces every member of `set` sharing `id` with `replacement`, preserving the ORIGINAL\n * insertion position of the first match rather than appending at the end.\n *\n * @remarks\n * `Set.add()` compares by reference, not id — a mutated instance is a NEW object, so the stale\n * instance(s) must be removed or they coexist with the replacement forever (this is the exact\n * defect {@link @nhtio/adk!DispatchContext}'s own `#doMutate*` methods were fixed to avoid — a\n * child dispatch context's mutation is otherwise correctly deduplicated locally, but flushing\n * that mutation BACK to this parent `TurnContext`'s Sets via `#applyDeltaToParent` re-introduces\n * the identical bug if this method just appended). `set` is rebuilt in place via `clear()` +\n * re-add, rather than reassigned, since `TurnContext` exposes no setter for these Sets — only\n * `set.add`/`set.delete` are available to a caller outside the class.\n */\n #replaceById<T extends { id: string }>(set: Set<T>, id: string, replacement: T): void {\n const rebuilt: T[] = []\n let inserted = false\n for (const existing of set) {\n if ((existing as any).id === id) {\n if (!inserted) {\n rebuilt.push(replacement)\n inserted = true\n }\n continue\n }\n rebuilt.push(existing)\n }\n if (!inserted) rebuilt.push(replacement)\n set.clear()\n for (const item of rebuilt) set.add(item)\n }\n\n #applyDeltaToParent(delta: ContextDelta): void {\n const ctx = this.#sourceCtx!\n const { op, type, value } = delta\n\n if (type === 'standingInstruction') {\n const t = value as Tokenizable\n if (op === 'store' || op === 'mutate') ctx.standingInstructions.add(t)\n else ctx.standingInstructions.delete(t)\n return\n }\n if (type === 'memory') {\n if (op === 'store') ctx.turnMemories.add(value as Memory)\n else if (op === 'mutate') {\n const v = value as Memory\n this.#replaceById(ctx.turnMemories, (v as any).id, v)\n } else {\n for (const m of ctx.turnMemories) {\n if ((m as any).id === (value as any)) {\n ctx.turnMemories.delete(m)\n break\n }\n }\n }\n return\n }\n if (type === 'retrievable') {\n if (op === 'store') ctx.turnRetrievables.add(value as Retrievable)\n else if (op === 'mutate') {\n const v = value as Retrievable\n this.#replaceById(ctx.turnRetrievables, (v as any).id, v)\n } else {\n for (const r of ctx.turnRetrievables) {\n if ((r as any).id === (value as any)) {\n ctx.turnRetrievables.delete(r)\n break\n }\n }\n }\n return\n }\n if (type === 'message') {\n if (op === 'store') ctx.turnMessages.add(value as Message)\n else if (op === 'mutate') {\n const v = value as Message\n this.#replaceById(ctx.turnMessages, (v as any).id, v)\n } else {\n for (const m of ctx.turnMessages) {\n if ((m as any).id === (value as any)) {\n ctx.turnMessages.delete(m)\n break\n }\n }\n }\n return\n }\n if (type === 'thought') {\n if (op === 'store') ctx.turnThoughts.add(value as Thought)\n else if (op === 'mutate') {\n const v = value as Thought\n this.#replaceById(ctx.turnThoughts, (v as any).id, v)\n } else {\n for (const t of ctx.turnThoughts) {\n if ((t as any).id === (value as any)) {\n ctx.turnThoughts.delete(t)\n break\n }\n }\n }\n return\n }\n if (type === 'toolCall') {\n if (op === 'store') ctx.turnToolCalls.add(value as ToolCall)\n else if (op === 'mutate') {\n const v = value as ToolCall\n this.#replaceById(ctx.turnToolCalls, (v as any).id, v)\n } else {\n for (const tc of ctx.turnToolCalls) {\n if ((tc as any).id === (value as any)) {\n ctx.turnToolCalls.delete(tc)\n break\n }\n }\n }\n return\n }\n }\n}\n\ntype DispatchEndStatus = 'ack' | 'nack' | 'aborted'\n"],"mappings":";;;;;;;;;;;;AAWA,IAAa,oBAAoB,UAA6D;CAC5F,YAAY,IAAI,YAAY,EAAE,OAAO,IAAI,EAAE;CAC3C,WAAW,KAAK,WAAW,IAAI,IAAI,KAAK,MAAM,IAAI,EAAE;AACtD;AAEA,eAAsB,qBACpB,KACA,GACsB;CACtB,IAAI,CAAC,YAAY,cAAc,EAAE,OAAO,KAAK,EAAE,QAAQ,WAAW,EAAE,QAAQ,OAAO;CACnF,MAAM,OAAO,EAAE,QAAQ,SAAS;CAChC,MAAM,QAAQ,iBAAiB,IAAI;CACnC,MAAM,SAAS,MAAM,IAAI,sBAAsB,EAAE,IAAI,IAAI;CAEzD,MAAM,WAAW,MADJ,EAAE,sBAAsB,MAAK,iBAChB,MAAM;CAChC,IAAI,OAAQ,SAAyC,kBAAkB,YACrE,SAAS,cAAc,KAAK;CAI9B,OAAO,IAAI,YAAY;EACrB,IAAI,EAAE;EACN,SAAS;EACT,WAAW,EAAE;EACb,QAAQ,EAAE;EACV,MAAM,EAAE;EACR,OAAO,EAAE;EACT,WAAW,EAAE;EACb,WAAW,EAAE;EACb,QAAQ,EAAE;EACV,qBAAqB,EAAE;CACzB,CAAC;AACH;AAEA,eAAsB,sBAAsB,KAA6C;CACvF,MAAM,UAAU,MAAM,QAAQ,IAC5B,CAAC,GAAG,IAAI,gBAAgB,EAAE,KAAK,MAAM,qBAAqB,KAAK,CAAC,CAAC,CACnE;CACA,IAAI,iBAAiB,MAAM;CAC3B,KAAK,MAAM,UAAU,SAAS,IAAI,iBAAiB,IAAI,MAAM;AAC/D;AAEA,SAAgB,2BAA2B,MAAoD;CAC7F,MAAM,uBAAO,IAAI,IAAY;CAC7B,KAAK,MAAM,UAAU,MAAM;EACzB,IAAI,KAAK,IAAI,OAAO,EAAE,GAAG,MAAM,IAAI,MAAM,6BAA6B,OAAO,IAAI;EACjF,KAAK,IAAI,OAAO,EAAE;CACpB;AACF;;;;;;;;;;;;;;;;ACUA,IAAa,oBAAoB,UAC9B,OAAuB;CACtB,qBAAqB,UAClB,aACC,UAAU,OAAO,EAAE,SAAS,eAAsB,GAClD,UAAU,SAAS,EAAE,SAAS,eAAsB,CACtD,EACC,SAAS;CAEZ,OAAO,UAAU,OAAO,EAAE,QAAQ,UAAU,OAAO,GAAG,UAAU,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;CACjF,cAAc,YAAY,OAAO,SAAS;CAC1C,sBAAsB,UAAU,MAAM,EAAE,MAAM,YAAY,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC9E,CAAC,EACA,SAAS;;;;;;;;;AAiQZ,IAAa,cAAb,MAAa,YAAY;;;;;;;;;;;;CAYvB,OAAc,cAAc,OAAsC;EAChE,OAAO,aAAa,OAAO,eAAe,WAAW;CACvD;CAEA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA,aAAuC,KAAa,IAAY,aAAwB;EACtF,MAAM,uBAAO,IAAI,IAAO;EACxB,IAAI,WAAW;EACf,KAAK,MAAM,YAAY,KACrB,IAAI,SAAS,OAAO,IAAI;GACtB,IAAI,CAAC,UAAU,KAAK,IAAI,WAAW;GACnC,WAAW;EACb,OAAO,KAAK,IAAI,QAAQ;EAE1B,IAAI,CAAC,UAAU,KAAK,IAAI,WAAW;EACnC,OAAO;CACT;CAEA,0BAA0B,IAAY,QAA0C;EAE9E,IAAI,CAAC,GADS,WAAW,gBAAgB,KAAKA,iBAAiB,KAAKC,iBACvD,EAAE,MAAM,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,wBAAwB,CAAC,EAAE,CAAC;CACjF;CAEA,MAAMC,oBAAoB,GAAuB,GAAsC;EACrF,KAAKC,0BAA0B,EAAE,IAAI,aAAa;EAClD,MAAM,SAAS,MAAM,qBAAqB,MAAM,CAAC;EACjD,KAAKF,kBAAkB,IAAI,MAAM;EACjC,MAAM,EAAE,iBAAiB,MAAM,MAAM;EACrC,OAAO;CACT;CACA,MAAMG,qBAAqB,GAAuB,GAAsC;EACtF,KAAKD,0BAA0B,EAAE,IAAI,aAAa;EAClD,MAAM,SAAS,MAAM,qBAAqB,MAAM,CAAC;EACjD,KAAKF,oBAAoB,KAAKI,aAAa,KAAKJ,mBAAmB,OAAO,IAAI,MAAM;EACpF,MAAM,EAAE,kBAAkB,MAAM,MAAM;EACtC,OAAO;CACT;CACA,MAAMK,iBAAiB,GAAuB,GAA4B;EACxE,KAAKH,0BAA0B,EAAE,IAAI,UAAU;EAC/C,KAAKH,eAAe,IAAI,CAAC;EACzB,MAAM,EAAE,cAAc,MAAM,CAAC;CAC/B;CACA,MAAMO,kBAAkB,GAAuB,GAA4B;EACzE,KAAKJ,0BAA0B,EAAE,IAAI,UAAU;EAC/C,KAAKH,iBAAiB,KAAKK,aAAa,KAAKL,gBAAgB,EAAE,IAAI,CAAC;EACpE,MAAM,EAAE,eAAe,MAAM,CAAC;CAChC;;;;;;;;;CAUA,YAAY,KAAqB,UAA8B;EAC7D,IAAI;GACF,MAAM,gBAAqC,mBAAmB,KAAK,IAAI;EACzE,SAAS,KAAK;GACZ,MAAM,IAAI,uBAAuB,EAAE,OAAO,QAAQ,GAAG,IAAI,MAAM,KAAA,EAAU,CAAC;EAC5E;EACA,KAAKQ,MAAM,GAAO;EAClB,KAAKC,uBAAuB,IAAI;EAChC,KAAKC,SAAS,IAAI,SAAS,IAAI,KAAK;EACpC,KAAKC,gBAAgB,YAAY,cAAc,IAAI,YAAY,IAC3D,IAAI,eACJ,IAAI,YAAY,IAAI,YAAY;EACpC,KAAKC,wBAAwB,IAAI,KAC9B,IAAI,wBAAwB,CAAC,GAAG,KAAK,UACpC,YAAY,cAAc,KAAK,IAAI,QAAQ,IAAI,YAAY,KAAK,CAClE,CACF;EACA,KAAKC,gCAAgB,IAAI,IAAI;EAC7B,KAAKZ,oCAAoB,IAAI,IAAI;EACjC,KAAKa,gCAAgB,IAAI,IAAI;EAC7B,KAAKC,gCAAgB,IAAI,IAAI;EAC7B,KAAKf,iCAAiB,IAAI,IAAI;EAG9B,OAAO,iBAAiB,MAAM;GAC5B,IAAI;IACF,WAAW,KAAKQ;IAChB,YAAY;IACZ,cAAc;GAChB;GACA,SAAS;IACP,WAAW,QAAQ,KAAKC,qBAAqB,OAAO,OAAO;IAC3D,YAAY;IACZ,cAAc;GAChB;GACA,aAAa;IACX,WAAW,KAAKA,qBAAqB;IACrC,YAAY;IACZ,cAAc;GAChB;GACA,OAAO;IACL,QAAQ,WAAqB,KAAKA,qBAAqB,MAAM,MAAM;IACnE,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,OAAO;IACL,WAAW,KAAKC;IAChB,YAAY;IACZ,cAAc;GAChB;GACA,cAAc;IACZ,WAAW,KAAKC;IAChB,YAAY;IACZ,cAAc;GAChB;GACA,sBAAsB;IACpB,WAAW,KAAKC;IAChB,YAAY;IACZ,cAAc;GAChB;GACA,cAAc;IACZ,WAAW,KAAKC;IAChB,YAAY;IACZ,cAAc;GAChB;GACA,kBAAkB;IAChB,WAAW,KAAKZ;IAChB,YAAY;IACZ,cAAc;GAChB;GACA,cAAc;IACZ,WAAW,KAAKa;IAChB,YAAY;IACZ,cAAc;GAChB;GACA,cAAc;IACZ,WAAW,KAAKC;IAChB,YAAY;IACZ,cAAc;GAChB;GACA,eAAe;IACb,WAAW,KAAKf;IAChB,YAAY;IACZ,cAAc;GAChB;EACF,CAAC;EAGD,OAAO,iBAAiB,MAAM;GAC5B,eAAe;IACb,aAAa,SAAS,cAAc,IAAI;IACxC,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,eAAe;IACb,aAAa,SAAS,cAAc,IAAI;IACxC,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,eAAe;IACb,aAAa,SAAS,cAAc,IAAI;IACxC,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,gBAAgB;IACd,aAAa,SAAS,eAAe,IAAI;IACzC,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,YAAY;IACV,aAAa,SAAS,WAAW,IAAI;IACrC,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,6BAA6B;IAC3B,aAAa,SAAS,4BAA4B,IAAI;IACtD,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,0BAA0B;IACxB,QAAQ,MAA4B,SAAS,yBAAyB,MAAM,CAAC;IAC7E,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,2BAA2B;IACzB,QAAQ,MAA4B,SAAS,0BAA0B,MAAM,CAAC;IAC9E,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,2BAA2B;IACzB,QAAQ,MAA4B,SAAS,0BAA0B,MAAM,CAAC;IAC9E,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,aAAa;IACX,QAAQ,MAAc,SAAS,YAAY,MAAM,CAAC;IAClD,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,cAAc;IACZ,QAAQ,MAAc,SAAS,aAAa,MAAM,CAAC;IACnD,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,cAAc;IACZ,QAAQ,OAAe,SAAS,aAAa,MAAM,EAAE;IACrD,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,mBAAmB;IACjB,OAAO,YAAY;KACjB,MAAM,OAAO,MAAM,SAAS,kBAAkB,IAAI;KAClD,2BAA2B,IAAI;KAC/B,OAAO,QAAQ,IAAI,KAAK,KAAK,MAAM,qBAAqB,MAAM,CAAC,CAAC,CAAC;IACnE;IACA,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,kBAAkB;IAChB,QAAQ,MAAmB,KAAKE,oBAAoB,UAAU,CAAC;IAC/D,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,mBAAmB;IACjB,QAAQ,MAAmB,KAAKE,qBAAqB,UAAU,CAAC;IAChE,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,mBAAmB;IACjB,QAAQ,OAAe,SAAS,kBAAkB,MAAM,EAAE;IAC1D,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,cAAc;IACZ,QAAQ,MAAe,SAAS,aAAa,MAAM,CAAC;IACpD,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,eAAe;IACb,QAAQ,MAAe,SAAS,cAAc,MAAM,CAAC;IACrD,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,eAAe;IACb,QAAQ,OAAe,SAAS,cAAc,MAAM,EAAE;IACtD,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,cAAc;IACZ,QAAQ,MAAe,SAAS,aAAa,MAAM,CAAC;IACpD,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,eAAe;IACb,QAAQ,MAAe,SAAS,cAAc,MAAM,CAAC;IACrD,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,eAAe;IACb,QAAQ,OAAe,SAAS,cAAc,MAAM,EAAE;IACtD,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,eAAe;IACb,QAAQ,MAAgB,KAAKE,iBAAiB,UAAU,CAAC;IACzD,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,gBAAgB;IACd,QAAQ,MAAgB,KAAKC,kBAAkB,UAAU,CAAC;IAC1D,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,gBAAgB;IACd,QAAQ,OAAe,SAAS,eAAe,MAAM,EAAE;IACvD,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,sBAAsB;IACpB,OAAO,OAAO,KAAwB,iBAAsC;KAC1E,IAAI,SAAS,sBACX,MAAM,SAAS,qBAAqB,MAAM,KAAK,YAAY;UACtD;MAKL,MAAM,aAAuB,CAAC;MAC9B,IAAI;OACF,KAAK,MAAM,MAAM,KAAK;QACpB,MAAM,SAAS,eAAe,MAAM,EAAE;QACtC,WAAW,KAAK,EAAE;OACpB;OACA,KAAK,MAAM,eAAe,cACxB,MAAM,SAAS,cAAc,MAAM,WAAW;MAClD,SAAS,OAAO;OACd,IAAI,QAAQ,KAAK,GACf,MAA4C,aAAa,CAAC,GAAG,UAAU;OACzE,MAAM;MACR;KACF;KAOA,MAAM,WAAW,IAAI,IAAI,GAAG;KAC5B,MAAM,uBAAO,IAAI,IAAc;KAC/B,IAAI,WAAW;KACf,KAAK,MAAM,MAAM,KAAKP,gBACpB,IAAI,SAAS,IAAI,GAAG,EAAE;UAChB,CAAC,UAAU;OACb,KAAK,MAAM,eAAe,cAAc,KAAK,IAAI,WAAW;OAC5D,WAAW;MACb;YACK,KAAK,IAAI,EAAE;KAEpB,IAAI,CAAC,UAAU,KAAK,MAAM,eAAe,cAAc,KAAK,IAAI,WAAW;KAC3E,KAAKA,iBAAiB;IACxB;IACA,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,iBAAiB;IACf,QAAQ,IAAY,UAAwB,SAAS,gBAAgB,MAAM,IAAI,KAAK;IACpF,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,uBAAuB;IACrB,QAAQ,IAAY,UAAwB,SAAS,sBAAsB,MAAM,IAAI,KAAK;IAC1F,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,aAAa;IACX,OAAO,SAAS;IAChB,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,aAAa;IACX,OAAO,SAAS;IAChB,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,cAAc;IACZ,OAAO,SAAS;IAChB,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,wBAAwB;IACtB,OAAO,SAAS;IAChB,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,sBAAsB;IACpB,OAAO,SAAS;IAChB,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,SAAS;IACP,OAAO,SAAS;IAChB,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,OAAO;IACL,WAAW,SAAS;IACpB,YAAY;IACZ,cAAc;GAChB;EACF,CAAC;CACH;AAwHF;;;ACvmBA,IAAM,2BAA2B,UAAU,OAA2B;CACpE,qBAAqB,UAClB,aACC,UAAU,OAAO,EAAE,SAAS,eAAsB,GAClD,UAAU,SAAS,EAAE,SAAS,eAAsB,CACtD,EACC,SAAS;CAEZ,OAAO,UAAU,OAAO,EAAE,QAAQ,UAAU,OAAO,GAAG,UAAU,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;CACjF,cAAc,YAAY,OAAO,SAAS;CAC1C,sBAAsB,UAAU,MAAM,EAAE,MAAM,YAAY,MAAM,EAAE,QAAQ,CAAC,CAAC;CAC5E,UAAU,UAAU,MAAM,EAAE,QAAQ,CAAC,CAAC;CACtC,cAAc,UAAU,MAAM,EAAE,QAAQ,CAAC,CAAC;CAC1C,UAAU,UAAU,MAAM,EAAE,QAAQ,CAAC,CAAC;CACtC,UAAU,UAAU,MAAM,EAAE,QAAQ,CAAC,CAAC;CACtC,WAAW,UAAU,MAAM,EAAE,QAAQ,CAAC,CAAC;CACvC,OAAO,UAAU,MAAM,EAAE,QAAQ,CAAC,CAAC;CACnC,eAAe,UAAU,SAAS,EAAE,SAAS;CAC7C,mBAAmB,UAAU,SAAS,EAAE,SAAS;CACjD,eAAe,UAAU,SAAS,EAAE,SAAS;CAC7C,eAAe,UAAU,SAAS,EAAE,SAAS;CAC7C,gBAAgB,UAAU,SAAS,EAAE,SAAS;CAC9C,YAAY,UAAU,SAAS,EAAE,SAAS;CAC1C,6BAA6B,UAAU,SAAS,EAAE,SAAS;CAC3D,0BAA0B,UAAU,SAAS,EAAE,SAAS;CACxD,2BAA2B,UAAU,SAAS,EAAE,SAAS;CACzD,2BAA2B,UAAU,SAAS,EAAE,SAAS;CACzD,aAAa,UAAU,SAAS,EAAE,SAAS;CAC3C,cAAc,UAAU,SAAS,EAAE,SAAS;CAC5C,cAAc,UAAU,SAAS,EAAE,SAAS;CAC5C,kBAAkB,UAAU,SAAS,EAAE,SAAS;CAChD,mBAAmB,UAAU,SAAS,EAAE,SAAS;CACjD,mBAAmB,UAAU,SAAS,EAAE,SAAS;CACjD,cAAc,UAAU,SAAS,EAAE,SAAS;CAC5C,eAAe,UAAU,SAAS,EAAE,SAAS;CAC7C,eAAe,UAAU,SAAS,EAAE,SAAS;CAC7C,cAAc,UAAU,SAAS,EAAE,SAAS;CAC5C,eAAe,UAAU,SAAS,EAAE,SAAS;CAC7C,eAAe,UAAU,SAAS,EAAE,SAAS;CAC7C,eAAe,UAAU,SAAS,EAAE,SAAS;CAC7C,gBAAgB,UAAU,SAAS,EAAE,SAAS;CAC9C,gBAAgB,UAAU,SAAS,EAAE,SAAS;CAC9C,sBAAsB,UAAU,SAAS,EAAE,MAAM,CAAC,EAAE,SAAS;CAC7D,iBAAiB,UAAU,SAAS,EAAE,SAAS;CAC/C,uBAAuB,UAAU,SAAS,EAAE,SAAS;CACrD,OAAO,UAAU,OAAO,EAAE,SAAS;CACnC,SAAS,UAAU,SAAS,EAAE,SAAS;AACzC,CAAC;;;;;;;;;;;;;;;;;;;;;AAwBD,IAAa,kBAAb,MAAa,gBAAgB;CAC3B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CAGA;CACA;;;;;CAMA,YAAY,KAAyB;EACnC,IAAI;EAUJ,IAAI;GACF,WAAW,gBAAgB,0BAA0B,KAAK,IAAI;EAChE,SAAS,KAAK;GACZ,MAAM,IAAI,gCAAgC,EAAE,OAAO,QAAQ,GAAG,IAAI,MAAM,KAAA,EAAU,CAAC;EACrF;EAEA,KAAKgB,MAAM,GAAO;EAClB,KAAKC,cAAc;EACnB,KAAKC,aAAa;EAClB,KAAKC,uBAAuB,SAAS,uBAAuB,IAAI,gBAAgB;EAChF,KAAKC,SAAS,IAAI,SAAS,SAAS,KAAK;EACzC,KAAKC,gBAAgB,YAAY,cAAc,SAAS,YAAY,IAChE,SAAS,eACT,IAAI,YAAY,SAAS,YAAY;EACzC,KAAKC,wBAAwB,IAAI,IAC/B,SAAS,qBAAqB,KAAK,MACjC,YAAY,cAAc,CAAC,IAAI,IAAI,IAAI,YAAY,CAAC,CACtD,CACF;EACA,KAAKC,gBAAgB,IAAI,IAAI,SAAS,QAAQ;EAC9C,KAAKC,oBAAoB,IAAI,IAAI,SAAS,YAAY;EACtD,KAAKC,gBAAgB,IAAI,IAAI,SAAS,QAAQ;EAC9C,KAAKC,gBAAgB,IAAI,IAAI,SAAS,QAAQ;EAC9C,KAAKC,iBAAiB,IAAI,IAAI,SAAS,SAAS;EAChD,KAAKC,SAAS,IAAI,aAAa,SAAS,KAAK;EAC7C,KAAKC,qCAAqB,IAAI,IAAI;EAClC,KAAK,MAAM,MAAM,SAAS,WAAW;GACnC,MAAM,OAAO,KAAKA,mBAAmB,IAAI,GAAG,QAAQ,KAAK;GACzD,KAAKA,mBAAmB,IAAI,GAAG,UAAU,OAAO,CAAC;EACnD;EAEA,KAAKC,iBAAiB,SAAS;EAC/B,KAAKC,qBAAqB,SAAS;EACnC,KAAKC,iBAAiB,SAAS;EAC/B,KAAKC,iBAAiB,SAAS;EAC/B,KAAKC,kBAAkB,SAAS;EAChC,KAAKC,cAAc,SAAS;EAC5B,KAAKC,+BAA+B,SAAS;EAC7C,KAAKC,4BAA4B,SAAS;EAC1C,KAAKC,6BAA6B,SAAS;EAC3C,KAAKC,6BAA6B,SAAS;EAC3C,KAAKC,eAAe,SAAS;EAC7B,KAAKC,gBAAgB,SAAS;EAC9B,KAAKC,gBAAgB,SAAS;EAC9B,KAAKC,oBAAoB,SAAS;EAClC,KAAKC,qBAAqB,SAAS;EACnC,KAAKC,qBAAqB,SAAS;EACnC,KAAKC,gBAAgB,SAAS;EAC9B,KAAKC,iBAAiB,SAAS;EAC/B,KAAKC,iBAAiB,SAAS;EAC/B,KAAKC,gBAAgB,SAAS;EAC9B,KAAKC,iBAAiB,SAAS;EAC/B,KAAKC,iBAAiB,SAAS;EAC/B,KAAKC,iBAAiB,SAAS;EAC/B,KAAKC,kBAAkB,SAAS;EAChC,KAAKC,kBAAkB,SAAS;EAChC,KAAKC,wBAAwB,SAAS;EACtC,KAAKC,mBAAmB,SAAS;EACjC,KAAKC,yBAAyB,SAAS;EACvC,KAAKC,WAAW,SAAS;EAEzB,KAAKC,aAAa,KAAA;EAClB,KAAKC,aAAa,KAAA;EAGlB,KAAKC,SAAS,IAAI,MAA4B;EAC9C,KAAKC,+BAAe,IAAI,IAAI;EAC5B,IAAI,SAAS,OAAO;GAClB,MAAM,OAAO,SAAS;GACtB,KAAK,MAAM,OAAO,OAAO,KAAK,IAAI,GAAqC;IACrE,MAAM,QAAQ,KAAK;IACnB,IAAI,CAAC,OAAO;IACZ,MAAM,WAAW,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;IACtD,KAAK,MAAM,KAAK,UACd,KAAKD,OAAO,IAAI,KAAK,CAAQ;GAEjC;EACF;EAEA,OAAO,iBAAiB,MAAM;GAC5B,IAAI;IACF,WAAW,KAAK7C;IAChB,YAAY;IACZ,cAAc;GAChB;GACA,YAAY;IACV,WAAW,KAAKC;IAChB,YAAY;IACZ,cAAc;GAChB;GACA,WAAW;IACT,WAAW,KAAKC;IAChB,YAAY;IACZ,cAAc;GAChB;GACA,SAAS;IACP,WAAW,QAAQ,KAAKC,qBAAqB,OAAO,OAAO;IAC3D,YAAY;IACZ,cAAc;GAChB;GACA,aAAa;IACX,WAAW,KAAKA,qBAAqB;IACrC,YAAY;IACZ,cAAc;GAChB;GACA,OAAO;IACL,QAAQ,WAAqB,KAAKA,qBAAqB,MAAM,MAAM;IACnE,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,aAAa;IACX,WAAW,KAAKwC,eAAe,KAAA;IAC/B,YAAY;IACZ,cAAc;GAChB;GACA,SAAS;IACP,WAAW,KAAKA,eAAe;IAC/B,YAAY;IACZ,cAAc;GAChB;GACA,WAAW;IACT,WAAW,KAAKC;IAChB,YAAY;IACZ,cAAc;GAChB;GACA,OAAO;IACL,WAAW,KAAKxC;IAChB,YAAY;IACZ,cAAc;GAChB;GACA,cAAc;IACZ,WAAW,KAAKC;IAChB,YAAY;IACZ,cAAc;GAChB;GACA,sBAAsB;IACpB,WAAW,KAAKC;IAChB,YAAY;IACZ,cAAc;GAChB;GACA,cAAc;IACZ,WAAW,KAAKC;IAChB,YAAY;IACZ,cAAc;GAChB;GACA,kBAAkB;IAChB,WAAW,KAAKC;IAChB,YAAY;IACZ,cAAc;GAChB;GACA,cAAc;IACZ,WAAW,KAAKC;IAChB,YAAY;IACZ,cAAc;GAChB;GACA,cAAc;IACZ,WAAW,KAAKC;IAChB,YAAY;IACZ,cAAc;GAChB;GACA,eAAe;IACb,WAAW,KAAKC;IAChB,YAAY;IACZ,cAAc;GAChB;GACA,OAAO;IACL,WAAW,KAAKC;IAChB,YAAY;IACZ,cAAc;GAChB;GACA,eAAe;IACb,aAAa,KAAKE,eAAe,IAAI;IACrC,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,mBAAmB;IACjB,OAAO,YAAY;KACjB,MAAM,OAAO,MAAM,KAAKC,mBAAmB,IAAI;KAC/C,2BAA2B,IAAI;KAC/B,OAAO,QAAQ,IAAI,KAAK,KAAK,MAAM,qBAAqB,MAAM,CAAC,CAAC,CAAC;IACnE;IACA,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,eAAe;IACb,aAAa,KAAKC,eAAe,IAAI;IACrC,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,eAAe;IACb,aAAa,KAAKC,eAAe,IAAI;IACrC,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,gBAAgB;IACd,aAAa,KAAKC,gBAAgB,IAAI;IACtC,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,YAAY;IACV,aAAa,KAAKC,YAAY,IAAI;IAClC,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,6BAA6B;IAC3B,aAAa,KAAKC,6BAA6B,IAAI;IACnD,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,0BAA0B;IACxB,QAAQ,MAA4B,KAAK2B,4BAA4B,CAAC;IACtE,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,2BAA2B;IACzB,QAAQ,MAA4B,KAAKC,6BAA6B,CAAC;IACvE,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,2BAA2B;IACzB,QAAQ,MAA4B,KAAKC,6BAA6B,CAAC;IACvE,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,aAAa;IACX,QAAQ,MAAc,KAAKC,eAAe,CAAC;IAC3C,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,cAAc;IACZ,QAAQ,MAAc,KAAKC,gBAAgB,CAAC;IAC5C,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,cAAc;IACZ,QAAQ,OAAe,KAAKC,gBAAgB,EAAE;IAC9C,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,kBAAkB;IAChB,QAAQ,MAAmB,KAAKC,oBAAoB,CAAC;IACrD,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,mBAAmB;IACjB,QAAQ,MAAmB,KAAKC,qBAAqB,CAAC;IACtD,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,mBAAmB;IACjB,QAAQ,OAAe,KAAKC,qBAAqB,EAAE;IACnD,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,cAAc;IACZ,QAAQ,MAAe,KAAKC,gBAAgB,CAAC;IAC7C,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,eAAe;IACb,QAAQ,MAAe,KAAKC,iBAAiB,CAAC;IAC9C,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,eAAe;IACb,QAAQ,OAAe,KAAKC,iBAAiB,EAAE;IAC/C,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,cAAc;IACZ,QAAQ,MAAe,KAAKC,gBAAgB,CAAC;IAC7C,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,eAAe;IACb,QAAQ,MAAe,KAAKC,iBAAiB,CAAC;IAC9C,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,eAAe;IACb,QAAQ,OAAe,KAAKC,iBAAiB,EAAE;IAC/C,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,eAAe;IACb,QAAQ,MAAgB,KAAKC,iBAAiB,CAAC;IAC/C,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,gBAAgB;IACd,QAAQ,MAAgB,KAAKC,kBAAkB,CAAC;IAChD,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,gBAAgB;IACd,QAAQ,OAAe,KAAKC,kBAAkB,EAAE;IAChD,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,sBAAsB;IACpB,QAAQ,KAAwB,iBAC9B,KAAKC,wBAAwB,KAAK,YAAY;IAChD,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,iBAAiB;IACf,QAAQ,IAAY,UAAwB,KAAKzB,iBAAiB,MAAM,IAAI,KAAK;IACjF,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,uBAAuB;IACrB,QAAQ,IAAY,UAAwB,KAAKC,uBAAuB,MAAM,IAAI,KAAK;IACvF,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,aAAa;IACX,QAAQ,YAA0C;KAChD,KAAUI,OAAO,OAAO,SAAS,EAAE,IAAI,OAAO;IAChD;IACA,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,aAAa;IACX,QAAQ,YAA0C;KAChD,KAAUA,OAAO,OAAO,SAAS,EAAE,IAAI,OAAO;IAChD;IACA,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,cAAc;IACZ,QAAQ,YAA2C;KACjD,KAAUA,OAAO,OAAO,UAAU,EAAE,IAAI,OAAO;IACjD;IACA,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,wBAAwB;IACtB,QAAQ,UAAmD;KACzD,KAAUA,OAAO,OAAO,oBAAoB,EAAE,IAAI,KAAK;IACzD;IACA,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,sBAAsB;IACpB,QAAQ,UAAiD;KACvD,KAAUA,OAAO,OAAO,kBAAkB,EAAE,IAAI,KAAK;IACvD;IACA,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;GACA,SAAS;IACP,QAAW,YAAmD;KAC5D,IAAI,CAAC,KAAKH,UACR,OAAO,QAAQ,OAAO,IAAI,mCAAmC,CAAC;KAEhE,OAAO,KAAKA,SAAY,OAAO;IACjC;IACA,YAAY;IACZ,cAAc;IACd,UAAU;GACZ;EACF,CAAC;CACH;CAIA,MAAMK,4BAA4B,GAAwC;EACxE,MAAM,IAAI,YAAY,cAAc,CAAC,IAAI,IAAI,IAAI,YAAY,CAAC;EAC9D,KAAKzC,sBAAsB,IAAI,CAAC;EAChC,MAAM,KAAKe,0BAA0B,MAAM,CAAC;EAC5C,KAAUwB,OAAO,OAAO,2BAA2B,EAAE,IAAI,CAAC;CAC5D;CAEA,MAAMG,6BAA6B,GAAwC;EACzE,MAAM,IAAI,YAAY,cAAc,CAAC,IAAI,IAAI,IAAI,YAAY,CAAC;EAC9D,KAAK1C,sBAAsB,IAAI,CAAC;EAChC,MAAM,KAAKgB,2BAA2B,MAAM,CAAC;EAC7C,KAAUuB,OAAO,OAAO,4BAA4B,EAAE,IAAI,CAAC;CAC7D;CAEA,MAAMI,6BAA6B,GAAwC;EACzE,MAAM,IAAI,YAAY,cAAc,CAAC,IAAI,IAAI,IAAI,YAAY,CAAC;EAC9D,KAAK3C,sBAAsB,OAAO,CAAC;EACnC,MAAM,KAAKiB,2BAA2B,MAAM,CAAC;EAC7C,KAAUsB,OAAO,OAAO,4BAA4B,EAAE,IAAI,CAAC;CAC7D;CAEA,MAAMK,eAAe,GAA0B;EAC7C,KAAK3C,cAAc,IAAI,CAAC;EACxB,MAAM,KAAKiB,aAAa,MAAM,CAAC;EAC/B,KAAUqB,OAAO,OAAO,cAAc,EAAE,IAAI,CAAC;CAC/C;;;;;;;;;;;;;;;;CAiBA,aAAuC,KAAa,IAAY,aAAwB;EACtF,MAAM,uBAAO,IAAI,IAAO;EACxB,IAAI,WAAW;EACf,KAAK,MAAM,YAAY,KAAK;GAC1B,IAAK,SAAiB,OAAO,IAAI;IAC/B,IAAI,CAAC,UAAU;KACb,KAAK,IAAI,WAAW;KACpB,WAAW;IACb;IACA;GACF;GACA,KAAK,IAAI,QAAQ;EACnB;EACA,IAAI,CAAC,UAAU,KAAK,IAAI,WAAW;EACnC,OAAO;CACT;CAEA,MAAMM,gBAAgB,GAA0B;EAC9C,KAAK5C,gBAAgB,KAAK2D,aAAa,KAAK3D,eAAgB,EAAU,IAAI,CAAC;EAC3E,MAAM,KAAKkB,cAAc,MAAM,CAAC;EAChC,KAAUoB,OAAO,OAAO,eAAe,EAAE,IAAI,CAAC;CAChD;CAEA,MAAMO,gBAAgB,IAA2B;EAC/C,KAAK,MAAM,KAAK,KAAK7C,eACnB,IAAK,EAAU,OAAO,IAAI;GACxB,KAAKA,cAAc,OAAO,CAAC;GAC3B;EACF;EAEF,MAAM,KAAKmB,cAAc,MAAM,EAAE;EACjC,KAAUmB,OAAO,OAAO,eAAe,EAAE,IAAI,EAAE;CACjD;CAEA,0BAA0B,IAAY,QAA0C;EAE9E,IAAI,CAAC,GADS,WAAW,gBAAgB,KAAKlC,iBAAiB,KAAKH,iBACvD,EAAE,MAAM,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,wBAAwB,CAAC,EAAE,CAAC;CACjF;CAEA,MAAM6C,oBAAoB,GAAsC;EAC9D,KAAKc,0BAA0B,EAAE,IAAI,aAAa;EAClD,MAAM,SAAS,MAAM,qBAAqB,MAAM,CAAC;EACjD,KAAK3D,kBAAkB,IAAI,MAAM;EACjC,MAAM,KAAKmB,kBAAkB,MAAM,MAAM;EACzC,KAAUkB,OAAO,OAAO,mBAAmB,EAAE,IAAI,MAAM;EACvD,OAAO;CACT;CAEA,MAAMS,qBAAqB,GAAsC;EAC/D,KAAKa,0BAA0B,EAAE,IAAI,aAAa;EAClD,MAAM,SAAS,MAAM,qBAAqB,MAAM,CAAC;EACjD,KAAK3D,oBAAoB,KAAK0D,aAAa,KAAK1D,mBAAmB,OAAO,IAAI,MAAM;EACpF,MAAM,KAAKoB,mBAAmB,MAAM,MAAM;EAC1C,KAAUiB,OAAO,OAAO,oBAAoB,EAAE,IAAI,MAAM;EACxD,OAAO;CACT;CAEA,MAAMU,qBAAqB,IAA2B;EACpD,KAAK,MAAM,KAAK,KAAK/C,mBACnB,IAAK,EAAU,OAAO,IAAI;GACxB,KAAKA,kBAAkB,OAAO,CAAC;GAC/B;EACF;EAEF,MAAM,KAAKqB,mBAAmB,MAAM,EAAE;EACtC,KAAUgB,OAAO,OAAO,oBAAoB,EAAE,IAAI,EAAE;CACtD;CAEA,MAAMW,gBAAgB,GAA2B;EAC/C,KAAK/C,cAAc,IAAI,CAAC;EACxB,MAAM,KAAKqB,cAAc,MAAM,CAAC;EAChC,KAAUe,OAAO,OAAO,eAAe,EAAE,IAAI,CAAC;CAChD;CAEA,MAAMY,iBAAiB,GAA2B;EAChD,KAAKhD,gBAAgB,KAAKyD,aAAa,KAAKzD,eAAgB,EAAU,IAAI,CAAC;EAC3E,MAAM,KAAKsB,eAAe,MAAM,CAAC;EACjC,KAAUc,OAAO,OAAO,gBAAgB,EAAE,IAAI,CAAC;CACjD;CAEA,MAAMa,iBAAiB,IAA2B;EAChD,KAAK,MAAM,KAAK,KAAKjD,eACnB,IAAK,EAAU,OAAO,IAAI;GACxB,KAAKA,cAAc,OAAO,CAAC;GAC3B;EACF;EAEF,MAAM,KAAKuB,eAAe,MAAM,EAAE;EAClC,KAAUa,OAAO,OAAO,gBAAgB,EAAE,IAAI,EAAE;CAClD;CAEA,MAAMc,gBAAgB,GAA2B;EAC/C,KAAKjD,cAAc,IAAI,CAAC;EACxB,MAAM,KAAKuB,cAAc,MAAM,CAAC;EAChC,KAAUY,OAAO,OAAO,eAAe,EAAE,IAAI,CAAC;CAChD;CAEA,MAAMe,iBAAiB,GAA2B;EAChD,KAAKlD,gBAAgB,KAAKwD,aAAa,KAAKxD,eAAgB,EAAU,IAAI,CAAC;EAC3E,MAAM,KAAKwB,eAAe,MAAM,CAAC;EACjC,KAAUW,OAAO,OAAO,gBAAgB,EAAE,IAAI,CAAC;CACjD;CAEA,MAAMgB,iBAAiB,IAA2B;EAChD,KAAK,MAAM,KAAK,KAAKnD,eACnB,IAAK,EAAU,OAAO,IAAI;GACxB,KAAKA,cAAc,OAAO,CAAC;GAC3B;EACF;EAEF,MAAM,KAAKyB,eAAe,MAAM,EAAE;EAClC,KAAUU,OAAO,OAAO,gBAAgB,EAAE,IAAI,EAAE;CAClD;CAEA,MAAMiB,iBAAiB,GAA4B;EACjD,KAAKK,0BAA0B,EAAE,IAAI,UAAU;EAC/C,KAAKxD,eAAe,IAAI,CAAC;EACzB,MAAM,OAAO,KAAKE,mBAAmB,IAAI,EAAE,QAAQ,KAAK;EACxD,KAAKA,mBAAmB,IAAI,EAAE,UAAU,OAAO,CAAC;EAChD,MAAM,KAAKuB,eAAe,MAAM,CAAC;EACjC,KAAUS,OAAO,OAAO,gBAAgB,EAAE,IAAI,CAAC;CACjD;CAEA,MAAMkB,kBAAkB,GAA4B;EAClD,KAAKI,0BAA0B,EAAE,IAAI,UAAU;EAO/C,KAAK,MAAM,MAAM,KAAKxD,gBACpB,IAAK,GAAW,OAAQ,EAAU,IAAI;GACpC,MAAM,QAAQ,KAAKE,mBAAmB,IAAI,GAAG,QAAQ,KAAK;GAC1D,IAAI,SAAS,GAAG,KAAKA,mBAAmB,OAAO,GAAG,QAAQ;QACrD,KAAKA,mBAAmB,IAAI,GAAG,UAAU,QAAQ,CAAC;EACzD;EAEF,MAAM,OAAO,KAAKA,mBAAmB,IAAI,EAAE,QAAQ,KAAK;EACxD,KAAKA,mBAAmB,IAAI,EAAE,UAAU,OAAO,CAAC;EAChD,KAAKF,iBAAiB,KAAKuD,aAAa,KAAKvD,gBAAiB,EAAU,IAAI,CAAC;EAC7E,MAAM,KAAK0B,gBAAgB,MAAM,CAAC;EAClC,KAAUQ,OAAO,OAAO,iBAAiB,EAAE,IAAI,CAAC;CAClD;CAEA,MAAMmB,kBAAkB,IAA2B;EACjD,KAAK,MAAM,MAAM,KAAKrD,gBACpB,IAAK,GAAW,OAAO,IAAI;GACzB,KAAKA,eAAe,OAAO,EAAE;GAC7B,MAAM,QAAQ,KAAKE,mBAAmB,IAAI,GAAG,QAAQ,KAAK;GAC1D,IAAI,SAAS,GAAG,KAAKA,mBAAmB,OAAO,GAAG,QAAQ;QACrD,KAAKA,mBAAmB,IAAI,GAAG,UAAU,QAAQ,CAAC;GACvD;EACF;EAEF,MAAM,KAAKyB,gBAAgB,MAAM,EAAE;EACnC,KAAUO,OAAO,OAAO,iBAAiB,EAAE,IAAI,EAAE;CACnD;;;;;;CAOA,MAAMoB,wBACJ,KACA,cACe;EACf,IAAI,KAAK1B,uBACP,MAAM,KAAKA,sBAAsB,MAAM,KAAK,YAAY;OACnD;GACL,MAAM,aAAuB,CAAC;GAC9B,IAAI;IACF,KAAK,MAAM,MAAM,KAAK;KACpB,MAAM,KAAKD,gBAAgB,MAAM,EAAE;KACnC,WAAW,KAAK,EAAE;IACpB;IACA,KAAK,MAAM,eAAe,cAAc,MAAM,KAAKF,eAAe,MAAM,WAAW;GACrF,SAAS,OAAO;IACd,IAAI,QAAQ,KAAK,GACd,MAA4C,aAAa,CAAC,GAAG,UAAU;IAE1E,MAAM;GACR;EACF;EAEA,MAAM,QAAQ,IAAI,IAAI,GAAG;EACzB,MAAM,uBAAO,IAAI,IAAc;EAC/B,IAAI,WAAW;EACf,KAAK,MAAM,MAAM,KAAKzB,gBACpB,IAAI,MAAM,IAAI,GAAG,EAAE;OACb,CAAC,UAAU;IACb,KAAK,MAAM,eAAe,cAAc,KAAK,IAAI,WAAW;IAC5D,WAAW;GACb;SACK,KAAK,IAAI,EAAE;EAEpB,IAAI,CAAC,UAAU,KAAK,MAAM,eAAe,cAAc,KAAK,IAAI,WAAW;EAC3E,KAAKA,iBAAiB;EAEtB,KAAKE,qCAAqB,IAAI,IAAI;EAClC,KAAK,MAAM,MAAM,KAAKF,gBACpB,KAAKE,mBAAmB,IAAI,GAAG,WAAW,KAAKA,mBAAmB,IAAI,GAAG,QAAQ,KAAK,KAAK,CAAC;EAE9F,KAAK,MAAM,MAAM,KAAK,KAAUgC,OAAO,OAAO,iBAAiB,EAAE,IAAI,EAAE;EACvE,KAAK,MAAM,eAAe,cACxB,KAAUA,OAAO,OAAO,gBAAgB,EAAE,IAAI,WAAW;CAC7D;;CAKA,eAAe,IAAkB;EAC/B,KAAK5C,cAAc;CACrB;;CAGA,cAAc,GAAiB;EAC7B,KAAKC,aAAa;CACpB;;CAGA,YAAyC;EACvC,OAAO,KAAK2C;CACd;;;;;;;;;;;CAcA,cAAc,UAA0B;EACtC,OAAO,KAAKhC,mBAAmB,IAAI,QAAQ,KAAK;CAClD;;;;;;;;;;;;CAaA,MAAY;EACV,IAAI,KAAK8B,eAAe,KAAA,GACtB,MAAM,IAAI,kCAAkC;EAE9C,KAAKA,aAAa;EAKlB,KAAK,MAAM,WAAW,KAAKG,cACzB,IAAI;GACF,QAAQ;EACV,QAAQ,CAGR;CAEJ;;;;;;;;;;;;;;;;;;;;;CAsBA,MAAM,SAAiC;EACrC,KAAKA,aAAa,IAAI,OAAO;EAC7B,aAAa;GACX,KAAKA,aAAa,OAAO,OAAO;EAClC;CACF;;;;;;;;;;;;;CAcA,KAAK,OAAqB;EACxB,IAAI,KAAKH,eAAe,KAAA,GACtB,MAAM,IAAI,kCAAkC;EAE9C,KAAKA,aAAa;EAClB,KAAKC,aAAa,yBAAS,IAAI,MAAM,qDAAqD;CAC5F;;;;;;;;;;;;CAaA,OAAc,kBAAkB,OAA0C;EACxE,OAAO,aAAa,OAAO,mBAAmB,eAAe;CAC/D;AA6IF;;;;;;;;;;;;AChvCA,IAAM,gBAAgB,UAA0B;CAC9C,IAAI,QAAQ,KAAK,GAAG,OAAO;CAC3B,IAAI;CACJ,IAAI;EACF,OACE,OAAO,UAAU,WACb,QACA,UAAU,KAAA,IACR,cACC,KAAK,UAAU,KAAK,KAAK,OAAO,KAAK;CAChD,QAAQ;EACN,OAAO,OAAO,KAAK;CACrB;CACA,OAAO,IAAI,MAAM,iCAAiC,QAAQ,EAAE,OAAO,MAAM,CAAC;AAC5E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCA,IAAM,iBAAiB,UAAkC;CACvD,MAAM,QAAQ,aAAa,KAAK;CAChC,MAAM,UAAU,IAAI,+BAA+B,EAAE,MAAM,CAAC;CAC5D,MAAM,OAAO,QAAQ;CACrB,IAAI,SAAS;CACb,IAAI;EACF,MAAM,YAAqB,MAAM;EACjC,UAAU,OAAO,cAAc,WAAW,YAAY,OAAO,aAAa,EAAE,GAAG,KAAK;CACtF,QAAQ;EAGN,SAAS;CACX;CACA,IAAI,OAAO,SAAS,KAAK,WAAW,MAClC,QAAQ,UAAU,GAAG,KAAK,QAAQ,OAAO,EAAE,EAAE,IAAI;CAEnD,OAAO;AACT;AAoCA,IAAM,sBAAsB,UAAU,OAA+B;CACnE,QAAQ,UACL,IAAI,EACJ,QAAQ,OAAO,YAAY;EAC1B,IAAI,UAAU,KAAA,GAAW,OAAO;EAChC,IAAI,aAAa,OAAO,eAAe,WAAW,GAAG,OAAO;EAC5D,OAAO,QAAQ,MAAM,aAAa;CACpC,CAAC,EACA,SAAS;CACZ,KAAK,UAAU,OAAO,EAAE,QAAQ,IAAI,EAAE,SAAS;CAC/C,UAAU,UAAU,SAAS,EAAE,SAAS;CACxC,mBAAmB,UAAU,MAAM,EAAE,MAAM,UAAU,SAAS,CAAC,EAAE,QAAQ,CAAC,CAAC;CAC3E,oBAAoB,UAAU,MAAM,EAAE,MAAM,UAAU,SAAS,CAAC,EAAE,QAAQ,CAAC,CAAC;CAC5E,OAAO,UAAU,OAAO,EAAE,SAAS;CACnC,WAAW,UAAU,OAAO,EAAE,SAAS;AACzC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCD,IAAM,kBAAkB,OAAO,0BAA0B;;;;;;;AAQzD,IAAa,iBAAb,MAAa,eAAe;CAC1B;CACA;CAQA;CACA;CACA;CACA;;;;;;;CAQA,YACE,OACA,WACA,mBACA,oBACA,OACA,WACA;EACA,IAAI,UAAU,iBACZ,MAAM,IAAI,6BAA6B;EAEzC,KAAKwB,aAAa;EAClB,KAAKC,cAAc,CAAC;EACpB,KAAKC,mBAAmB,IAAI,MAAqC;EACjE,KAAKC,sBAAsB,IAAI,MAAwC;EAEvE,MAAM,gBAAgB,IAAI,WAAyC;EACnE,MAAM,iBAAiB,IAAI,WAAyC;EACpE,MAAM,QACH,QACA,KAAK,SAAS;GAKb,IAAI,IAAI,SAAS,OAAO,KAAK;GAC7B,OAAO,GAAG,KAAK,IAAI;EACrB;EACF,KAAK,MAAM,MAAM,mBAAmB,cAAc,IAAI,KAAK,EAAE,CAAC;EAC9D,KAAK,MAAM,MAAM,oBAAoB,eAAe,IAAI,KAAK,EAAE,CAAC;EAEhE,KAAKC,iBAAiB;EACtB,KAAKC,kBAAkB;EAEvB,IAAI,OACF,KAAK,MAAM,OAAO,OAAO,KAAK,KAAK,GAA8C;GAC/E,MAAM,QAAQ,MAAM;GACpB,IAAI,CAAC,OAAO;GACZ,MAAM,WAAW,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;GACtD,KAAK,MAAM,KAAK,UAAU,KAAKH,iBAAiB,IAAI,KAAK,CAAQ;EACnE;EAEF,IAAI,WACF,KAAK,MAAM,OAAO,OAAO,KAAK,SAAS,GAAiD;GACtF,MAAM,QAAQ,UAAU;GACxB,IAAI,CAAC,OAAO;GACZ,MAAM,WAAW,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;GACtD,KAAK,MAAM,KAAK,UAAU,KAAKC,oBAAoB,IAAI,KAAK,CAAQ;EACtE;CAEJ;;;;;;;;;;CAWA,OAAc,iBAAiB,OAAyC;EACtE,OAAO,aAAa,OAAO,kBAAkB,cAAc;CAC7D;;;;;;;;;;;;;;;CAgBA,aAAoB,SAAS,OAA8C;EACzE,IAAI;EAIJ,IAAI;GACF,WAAW,gBAAgB,qBAAqB,OAAO,IAAI;EAC7D,SAAS,KAAK;GACZ,MAAM,IAAI,6BAA6B,EACrC,OAAO,QAAQ,GAAG,IAAI,MAAM,KAAA,EAC9B,CAAC;EACH;EAEA,IAAI,CAAC,SAAS,UAAU,CAAC,SAAS,KAChC,MAAM,IAAI,6BAA6B;EAEzC,IAAI,SAAS,UAAU,SAAS,KAC9B,MAAM,IAAI,6BAA6B;EAGzC,MAAM,SAAS,IAAI,eACjB,iBACA,SAAS,QACT,SAAS,mBACT,SAAS,oBACT,SAAS,OACT,SAAS,SACX;EAEA,MAAM,SAAS,OAAOG,cAAc,SAAS,QAAQ,SAAS,GAAG;EACjE,OAAOC,kBAAkB,MAAM;EAC/B,MAAM,sBAAsB,MAAM;EAClC,IAAI,SAAS,QAIX,KAAK,MAAM,UAAU,OAAO,kBAC1B,OAAOC,aAAa,SAAS,OAAO,kBAAkB,OAAO,IAAI,MAAM;EAI3E,MAAM,OAAOC,aAAa,QAAQ,SAAS,QAAQ;CACrD;CAIA,cACE,QACA,KACiB;EACjB,IAAI,QAAQ;GACV,MAAM,KAAK,IAAI,gBAAgB;GAC/B,OAAO,YAAY,iBAAiB,eAAe,GAAG,MAAM,GAAG,EAC7D,MAAM,KACR,CAAC;GAgDD,OAAO,IAAI,gBAAgB;IA7CzB,qBAAqB;IACrB,OAAO,OAAO,MAAM,IAAI;IACxB,cAAc,OAAO;IACrB,sBAAsB,CAAC,GAAG,OAAO,oBAAoB;IACrD,UAAU,CAAC,GAAG,OAAO,YAAY;IACjC,cAAc,CAAC,GAAG,OAAO,gBAAgB;IACzC,UAAU,CAAC,GAAG,OAAO,YAAY;IACjC,UAAU,CAAC,GAAG,OAAO,YAAY;IACjC,WAAW,CAAC,GAAG,OAAO,aAAa;IACnC,OAAO,OAAO,MAAM,IAAI;IACxB,qBAAqB,OAAO,cAAc;IAC1C,yBAAyB,OAAO,kBAAkB;IAClD,qBAAqB,OAAO,cAAc;IAC1C,qBAAqB,OAAO,cAAc;IAC1C,sBAAsB,OAAO,eAAe;IAC5C,kBAAkB,OAAO,WAAW;IACpC,mCAAmC,OAAO,4BAA4B;IACtE,2BAA2B,IAAI,MAAM,OAAO,yBAAyB,CAAC;IACtE,4BAA4B,IAAI,MAAM,OAAO,0BAA0B,CAAC;IACxE,4BAA4B,IAAI,MAAM,OAAO,0BAA0B,CAAC;IACxE,cAAc,IAAI,MAAM,OAAO,YAAY,CAAC;IAC5C,eAAe,IAAI,MAAM,OAAO,aAAa,CAAC;IAC9C,eAAe,IAAI,OAAO,OAAO,aAAa,EAAE;IAChD,kBAAkB,OAAO,IAAI,MAAM;KACjC,OAAO,OAAO,iBAAiB,CAAC;IAClC;IACA,mBAAmB,OAAO,IAAI,MAAM;KAClC,OAAO,OAAO,kBAAkB,CAAC;IACnC;IACA,oBAAoB,IAAI,OAAO,OAAO,kBAAkB,EAAE;IAC1D,eAAe,IAAI,MAAM,OAAO,aAAa,CAAC;IAC9C,gBAAgB,IAAI,MAAM,OAAO,cAAc,CAAC;IAChD,gBAAgB,IAAI,OAAO,OAAO,cAAc,EAAE;IAClD,eAAe,IAAI,MAAM,OAAO,aAAa,CAAC;IAC9C,gBAAgB,IAAI,MAAM,OAAO,cAAc,CAAC;IAChD,gBAAgB,IAAI,OAAO,OAAO,cAAc,EAAE;IAClD,gBAAgB,IAAI,MAAM,OAAO,cAAc,CAAC;IAChD,iBAAiB,IAAI,MAAM,OAAO,eAAe,CAAC;IAClD,iBAAiB,IAAI,OAAO,OAAO,eAAe,EAAE;IACpD,uBAAuB,IAAI,KAAK,iBAC9B,OAAO,qBAAqB,KAAK,YAAY;IAC/C,kBAAkB,IAAI,IAAI,UAAU,OAAO,gBAAgB,IAAI,KAAK;IACpE,wBAAwB,IAAI,IAAI,UAAU,OAAO,sBAAsB,IAAI,KAAK;IAChF,SAAS,OAAO;GAES,CAAQ;EACrC;EAGA,OAAO,IAAI,gBAAgB,GAAyB;CACtD;CAIA,kBAAkB,QAA+B;EAC/C,MAAM,WAAW,OAAO,UAAU;EAGlC,SAAS,IAAI,YAAY,MAAM;GAC7B,KAAUP,iBAAiB,OAAO,SAAS,EAAE,IAAI,CAAC;GAClD,IAAI,KAAKF,YAAY,KAAKA,WAAW,YAAY,CAAC;EACpD,CAAC;EACD,SAAS,IAAI,YAAY,MAAM;GAC7B,KAAUE,iBAAiB,OAAO,SAAS,EAAE,IAAI,CAAC;GAClD,IAAI,KAAKF,YAAY,KAAKA,WAAW,YAAY,CAAC;EACpD,CAAC;EACD,SAAS,IAAI,aAAa,MAAM;GAC9B,KAAUE,iBAAiB,OAAO,UAAU,EAAE,IAAI,CAAC;GACnD,IAAI,KAAKF,YAAY,KAAKA,WAAW,aAAa,CAAC;EACrD,CAAC;EAGD,SAAS,IAAI,uBAAuB,MAAM;GACxC,KAAUG,oBAAoB,OAAO,oBAAoB,EAAE,IAAI,CAAC;GAChE,IAAI,KAAKH,YAAY,KAAKA,WAAW,uBAAuB,CAAC;EAC/D,CAAC;EACD,SAAS,IAAI,qBAAqB,MAAM;GACtC,KAAUG,oBAAoB,OAAO,kBAAkB,EAAE,IAAI,CAAC;GAC9D,IAAI,KAAKH,YAAY,KAAKA,WAAW,qBAAqB,CAAC;EAC7D,CAAC;EAID,SAAS,IAAI,8BAA8B,MAAM;GAC/C,KAAKC,YAAY,KAAK;IACpB,IAAI;IACJ,MAAM;IACN,OAAO;GACT,CAAC;EACH,CAAC;EACD,SAAS,IAAI,+BAA+B,MAAM;GAChD,KAAKA,YAAY,KAAK;IACpB,IAAI;IACJ,MAAM;IACN,OAAO;GACT,CAAC;EACH,CAAC;EACD,SAAS,IAAI,+BAA+B,MAAM;GAChD,KAAKA,YAAY,KAAK;IACpB,IAAI;IACJ,MAAM;IACN,OAAO;GACT,CAAC;EACH,CAAC;EACD,SAAS,IAAI,iBAAiB,MAAM;GAClC,KAAKA,YAAY,KAAK;IAAE,IAAI;IAAS,MAAM;IAAU,OAAO;GAAE,CAAC;EACjE,CAAC;EACD,SAAS,IAAI,kBAAkB,MAAM;GACnC,KAAKA,YAAY,KAAK;IAAE,IAAI;IAAU,MAAM;IAAU,OAAO;GAAE,CAAC;EAClE,CAAC;EACD,SAAS,IAAI,kBAAkB,OAAO;GACpC,KAAKA,YAAY,KAAK;IAAE,IAAI;IAAU,MAAM;IAAU,OAAO;GAAG,CAAC;EACnE,CAAC;EACD,SAAS,IAAI,sBAAsB,MAAM;GACvC,KAAKA,YAAY,KAAK;IAAE,IAAI;IAAS,MAAM;IAAe,OAAO;GAAE,CAAC;EACtE,CAAC;EACD,SAAS,IAAI,uBAAuB,MAAM;GACxC,KAAKA,YAAY,KAAK;IAAE,IAAI;IAAU,MAAM;IAAe,OAAO;GAAE,CAAC;EACvE,CAAC;EACD,SAAS,IAAI,uBAAuB,OAAO;GACzC,KAAKA,YAAY,KAAK;IAAE,IAAI;IAAU,MAAM;IAAe,OAAO;GAAG,CAAC;EACxE,CAAC;EACD,SAAS,IAAI,kBAAkB,MAAM;GACnC,KAAKA,YAAY,KAAK;IAAE,IAAI;IAAS,MAAM;IAAW,OAAO;GAAE,CAAC;EAClE,CAAC;EACD,SAAS,IAAI,mBAAmB,MAAM;GACpC,KAAKA,YAAY,KAAK;IAAE,IAAI;IAAU,MAAM;IAAW,OAAO;GAAE,CAAC;EACnE,CAAC;EACD,SAAS,IAAI,mBAAmB,OAAO;GACrC,KAAKA,YAAY,KAAK;IAAE,IAAI;IAAU,MAAM;IAAW,OAAO;GAAG,CAAC;EACpE,CAAC;EACD,SAAS,IAAI,kBAAkB,MAAM;GACnC,KAAKA,YAAY,KAAK;IAAE,IAAI;IAAS,MAAM;IAAW,OAAO;GAAE,CAAC;EAClE,CAAC;EACD,SAAS,IAAI,mBAAmB,MAAM;GACpC,KAAKA,YAAY,KAAK;IAAE,IAAI;IAAU,MAAM;IAAW,OAAO;GAAE,CAAC;EACnE,CAAC;EACD,SAAS,IAAI,mBAAmB,OAAO;GACrC,KAAKA,YAAY,KAAK;IAAE,IAAI;IAAU,MAAM;IAAW,OAAO;GAAG,CAAC;EACpE,CAAC;EACD,SAAS,IAAI,mBAAmB,MAAM;GACpC,KAAKA,YAAY,KAAK;IAAE,IAAI;IAAS,MAAM;IAAY,OAAO;GAAE,CAAC;EACnE,CAAC;EACD,SAAS,IAAI,oBAAoB,MAAM;GACrC,KAAKA,YAAY,KAAK;IAAE,IAAI;IAAU,MAAM;IAAY,OAAO;GAAE,CAAC;EACpE,CAAC;EACD,SAAS,IAAI,oBAAoB,OAAO;GACtC,KAAKA,YAAY,KAAK;IAAE,IAAI;IAAU,MAAM;IAAY,OAAO;GAAG,CAAC;EACrE,CAAC;CACH;;;;;;;;;CAYA,cAAc,KAA+C;EAC3D,MAAM,qBAAqB,KAAKE;EAChC,MAAM,kBACH,WACA,UAA0C;GACzC,MAAM,QAAkB;IACtB,YAAY,IAAI;IAChB,WAAW,IAAI;IACf,WAAW,SAAS,IAAI;IACxB;IACA,MAAM,MAAM;IACZ,SAAS,MAAM;IACf,GAAI,MAAM,YAAY,KAAA,IAAY,EAAE,SAAS,MAAM,QAAQ,IAAI,CAAC;GAClE;GACA,mBAAwB,OAAO,KAAK,EAAE,IAAI,KAAK;EACjD;EACF,MAAM,MAAkC;GACtC,OAAO,eAAe,OAAO;GAC7B,OAAO,eAAe,OAAO;GAC7B,MAAM,eAAe,MAAM;GAC3B,MAAM,eAAe,MAAM;GAC3B,OAAO,eAAe,OAAO;EAC/B;EAEA,MAAM,yBAAyB,UAAiC;GAC9D,MAAM,QAA8B;IAClC,GAAG;IACH,YAAY,IAAI;IAChB,WAAW,IAAI;IACf,WAAW,SAAS,IAAI;GAC1B;GACA,mBAAwB,OAAO,iBAAiB,EAAE,IAAI,KAAK;EAC7D;EAEA,MAAM,iCAAiB,IAAI,IAGzB;EACF,MAAM,iCAAiB,IAAI,IAGzB;EACF,MAAM,kCAAkB,IAAI,IAW1B;EAEF,MAAM,eACJ,OACA,IACA,WACA,eAC0B;GAC1B,IAAI,QAAQ,MAAM,IAAI,EAAE;GACxB,MAAM,MAAM,SAAS,IAAI;GACzB,IAAI,CAAC,OAAO;IACV,QAAQ;KAAE,MAAM;KAAI,WAAW;KAAK,YAAY;IAAM;IACtD,MAAM,IAAI,IAAI,KAAK;GACrB;GACA,IAAI,MAAM,YACR,MAAM,IAAI,MAAM,WAAW,GAAG,uDAAuD;GAEvF,MAAM,OAAO,MAAM,OAAO;GAC1B,MAAM,aAAa;GACnB,OAAO;IACL;IACA,WAAW,MAAM;IACjB,WAAW;IACX,MAAM,MAAM;IACZ,QAAQ;IACR;IACA,GAAI,aAAa,EAAE,aAAa,IAAI,IAAI,CAAC;GAC3C;EACF;EAEA,OAAO;GACL,gBAAgB,IAAI,WAAW,SAAS;IACtC,MAAM,aAAa,MAAM,cAAc;IACvC,IAAI,YAAY,YAAY,gBAAgB,IAAI,WAAW,UAAU,CAAC;GACxE;GACA,gBAAgB,IAAI,WAAW,SAAS;IACtC,MAAM,aAAa,MAAM,cAAc;IACvC,IAAI,YAAY,YAAY,gBAAgB,IAAI,WAAW,UAAU,CAAC;GACxE;GACA,iBAAiB,IAAI,YAAY;IAC/B,IAAI,QAAQ,gBAAgB,IAAI,EAAE;IAClC,MAAM,MAAM,SAAS,IAAI;IACzB,IAAI,CAAC,OAAO;KACV,QAAQ;MAAE,SAAS;MAAO,YAAY;MAAO,WAAW;KAAI;KAC5D,gBAAgB,IAAI,IAAI,KAAK;IAC/B;IACA,IAAI,MAAM,YACR,MAAM,IAAI,MAAM,cAAc,GAAG,wDAAwD;IAE3F,IAAI,QAAQ,SAAS,KAAA,GAAW,MAAM,OAAO,QAAQ;IACrD,IAAI,QAAQ,SAAS,KAAA,GAAW,MAAM,OAAO,QAAQ;IACrD,IAAI,QAAQ,YAAY,KAAA,GAAW,MAAM,UAAU,QAAQ;IAC3D,IAAI,QAAQ,YAAY,KAAA,GAAW,MAAM,UAAU,QAAQ;IAC3D,IAAI,QAAQ,eAAe,KAAA,GAAW,MAAM,aAAa,QAAQ;IAGjE,IAAI,MAAM,SAAS,KAAA,KAAa,MAAM,SAAS,KAAA,GAC7C,MAAM,WAAW,OAAO,mBAAmB;KAAE,MAAM,MAAM;KAAM,MAAM,MAAM;IAAK,CAAC,CAAC;IAGpF,MAAM,UAA+B;KACnC;KACA,MAAM,MAAM,QAAQ;KACpB,MAAM,MAAM;KACZ,UAAU,MAAM,YAAY;KAC5B,WAAW,MAAM;KACjB,WAAW;KACX,YAAY,MAAM;KAClB,SAAS,MAAM;KACf,GAAI,MAAM,YAAY,KAAA,IAAY,EAAE,SAAS,MAAM,QAAQ,IAAI,CAAC;KAChE,GAAI,MAAM,aAAa,EAAE,aAAa,IAAI,IAAI,CAAC;IACjD;IACA,IAAI,aAAa,OAAO;GAC1B;GACA;GACA;EACF;CACF;;;;;;;;;;;;;;;;;;CAqBA,oBAAoB,KAA4B;EAE9C,IAAI,MAAM,eAAe;EAGzB,MAAM,wBAAQ,IAAI,IAA0D;EAC5E,KAAK,MAAM,MAAM,IAAI,eAAe;GAClC,MAAM,UAAW,GAA6B;GAC9C,MAAM,QAAQ,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO;GACzD,KAAK,MAAM,QAAQ,OAAO;IACxB,IAAI,CAAC,gBAAgB,kBAAkB,IAAI,GAAG;IAC9C,MAAM,OAAQ,KAAyB;IAGvC,IAAI,OAAO,KAAK,eAAe,YAC7B,MAAM,IAAI,IAA4D;GAE1E;EACF;EACA,KAAK,MAAM,eAAe,IAAI,kBAAkB;GAC9C,IAAI,YAAY,UAAU,CAAC,gBAAgB,kBAAkB,YAAY,OAAO,GAAG;GACnF,MAAM,OAAQ,YAAY,QAA4B;GAGtD,IAAI,OAAO,KAAK,eAAe,YAC7B,MAAM,IAAI,IAA4D;EAE1E;EACA,IAAI,MAAM,SAAS,GAAG;EAItB,MAAM,SAAS,aAAa,MAC1B,CAAC,GAAG,KAAK,EAAE,KAAK,MAAM,EAAE,WAAW,GAAG,CAAC,GACvC,EAAE,aAAa,OAAO,CACxB;EACA,IAAI,OAAO,IAAI,EAAE,WAAW,GAAG;EAI/B,KAAK,MAAM,QAAQ,OAAO,IAAI,GAAG;GAC/B,IAAI,MAAM,SAAS,MAAM,IAAI;GAC7B,IAAI,OAAO,OAAO,EAAE,MAAM,MAAM,EAAE,SAAS,KAAK,IAAI,GAAG,IAAI,MAAM,KAAK,KAAK,IAAI;EACjF;EAIA,IAAI,IAAI,cAAc,GAAG,IAAI,MAAM,YAAY,GAAG;CACpD;CAEA,MAAMM,aAAa,QAAyB,UAA6C;EACvF,MAAM,aAAa,GAAO;EAC1B,OAAO,eAAe,UAAU;EAEhC,MAAM,oBAAoB,SAAS,IAAI;EACvC,KAAUN,oBACP,OAAO,eAAe,EACtB,IAAI;GAAE;GAAY,WAAW;EAAkB,CAAC;EAInD,MAAM,UAAU,KAAKO,cAAc,MAAM;EAEzC,IAAI,YAAY;EAChB,IAAI;EAOJ,MAAM,yBAAyB,MAA+B;GAC5D,MAAM,QAAsB;IAC1B,YAAY,OAAO;IACnB,WAAW,OAAO;IAClB,WAAW,SAAS,IAAI;IACxB,QAAQ;IACR,MAAM;IACN,SAAS,kCAAkC,OAAO,EAAE,QAAQ,EAAE;IAC9D,OAAO,EAAE;IACT,SAAS;KAAE,UAAU,EAAE;KAAU,aAAa,EAAE;IAAY;GAC9D;GACA,KAAUP,oBAAoB,OAAO,SAAS,EAAE,IAAI,KAAK;EAC3D;EAEA,MAAM,0BAA0B,uBAAuB,YAAY;GACjE,IAAI;IACF,OAAO,CAAC,OAAO,WAAW,CAAC,OAAO,aAAa;KAC7C,OAAO,cAAc,SAAS;KAC9B,MAAM,qBAAqB,SAAS,IAAI;KACxC,KAAUA,oBACP,OAAO,gBAAgB,EACvB,IAAI;MAAE;MAAY;MAAW,WAAW;KAAmB,CAAC;KAQ/D,KAAKQ,oBAAoB,MAAM;KAE/B,MAAM,KAAKC,aAAa,KAAKR,eAAe,OAAO,GAAG,QAAQ,OAAO;KACrE,IAAI,OAAO,WAAW,OAAO,aAAa;MAIxC,IAAI,OAAO,WAAW,CAAC,OAAO,SAC5B,MAAM,KAAKS,OAAO;WAElB,KAAKZ,YAAY,SAAS;MAE5B;KACF;KAEA,IAAI;MACF,MAAM,SAAS,QAAQ,OAAO;KAChC,SAAS,KAAK;MACZ,IAAI,KAAKa,cAAc,GAAG,GAAG;OAC3B,KAAKb,YAAY,SAAS;OAC1B;MACF;MASA,MAAM,UAAU,cAAc,GAAG;MACjC,KAAUE,oBAAoB,OAAO,OAAO,EAAE,IAAI,OAAO;MACzD,KAAKF,YAAY,SAAS;MAC1B,MAAM;KACR;KAEA,IAAI,OAAO,WAAW,OAAO,aAAa;MACxC,IAAI,OAAO,WAAW,CAAC,OAAO,SAC5B,MAAM,KAAKY,OAAO;WAElB,KAAKZ,YAAY,SAAS;MAE5B;KACF;KAEA,MAAM,KAAKW,aAAa,KAAKP,gBAAgB,OAAO,GAAG,QAAQ,QAAQ;KACvE,MAAM,KAAKQ,OAAO;KAElB,MAAM,mBAAmB,SAAS,IAAI;KACtC,KAAUV,oBAAoB,OAAO,cAAc,EAAE,IAAI;MACvD;MACA;MACA,WAAW;MACX,SAAS;MACT,YAAY,iBAAiB,KAAK,kBAAkB,EAAE;KACxD,CAAC;KAED;IACF;GACF,SAAS,KAAK;IACZ,gBAAgB,QAAQ,GAAG,IAAI,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;GAC5D;GAEA,MAAM,SAA4B,gBAC9B,SACA,OAAO,YACL,SACA,OAAO,UACL,QACA;GACR,MAAM,aAAa,iBAAiB,OAAO;GAO3C,IAAI,CAAC,iBAAiB,OAAO,WAAW;IACtC,MAAM,UAAU,OAAO;IACvB,MAAM,UAAU,aAAa,SAAS,eAAe,IAChD,UAGD,cAAc,OAAO;IACzB,KAAUA,oBAAoB,OAAO,OAAO,EAAE,IAAI,OAAO;GAC3D;GAEA,MAAM,kBAAkB,SAAS,IAAI;GACrC,KAAUA,oBAAoB,OAAO,aAAa,EAAE,IAAI;IACtD;IACA;IACA,OAAO;IACP,YAAY;IACZ,WAAW;IACX,SAAS;IACT,YAAY,gBAAgB,KAAK,iBAAiB,EAAE;GACtD,CAAC;GAED,IAAI,YAAY,MAAM;EACxB,CAAC;CACH;CAEA,MAAMS,aACJ,UACA,QACA,OACe;EACf,IAAI;EACJ,IAAI,UAAU;EACd,MAAM,SACH,aAAa,OAAO,UAAU;GAC7B,IAAI,KAAKE,cAAc,KAAK,GAAG;GAC/B,gBAAgB,IAAI,0BAA0B,EAC5C,OAAO,QAAQ,KAAK,IAAI,QAAQ,KAAA,EAClC,CAAC;EACH,CAAC,EACA,aAAa,YAAY;GACxB,UAAU;EACZ,CAAC,EACA,KAAK,IAAI,SAAS,QAAQ,QAAQ,GAAG,QAAQ,IAAI,CAAC,CAAC;EAEtD,IAAI,eAAe;GACjB,KAAUX,oBAAoB,OAAO,OAAO,EAAE,IAAI,aAAyC;GAC3F,MAAM;EACR;EAEA,IAAI,CAAC,WAAW,CAAC,OAAO,WAAW,CAAC,OAAO,aAAa;GACtD,MAAM,oBAAoB,IAAI,2BAA2B,CAAC,YAAY,OAAO,CAAC;GAC9E,KAAUA,oBACP,OAAO,OAAO,EACd,IAAI,iBAA6C;GACpD,MAAM;EACR;CACF;CAEA,cAAc,KAAuB;EACnC,OAAO,QAAQ,GAAG,KAAK,aAAa,KAAK,YAAY;CACvD;CAEA,MAAMU,SAAwB;EAC5B,IAAI,CAAC,KAAKb,YAAY;GACpB,KAAKC,YAAY,SAAS;GAC1B;EACF;EACA,OAAO,KAAKA,YAAY,SAAS,GAAG;GAClC,MAAM,QAAQ,KAAKA,YAAY,MAAM;GACrC,KAAKc,oBAAoB,KAAK;EAChC;CACF;;;;;;;;;;;;;;;CAgBA,aAAuC,KAAa,IAAY,aAAsB;EACpF,MAAM,UAAe,CAAC;EACtB,IAAI,WAAW;EACf,KAAK,MAAM,YAAY,KAAK;GAC1B,IAAK,SAAiB,OAAO,IAAI;IAC/B,IAAI,CAAC,UAAU;KACb,QAAQ,KAAK,WAAW;KACxB,WAAW;IACb;IACA;GACF;GACA,QAAQ,KAAK,QAAQ;EACvB;EACA,IAAI,CAAC,UAAU,QAAQ,KAAK,WAAW;EACvC,IAAI,MAAM;EACV,KAAK,MAAM,QAAQ,SAAS,IAAI,IAAI,IAAI;CAC1C;CAEA,oBAAoB,OAA2B;EAC7C,MAAM,MAAM,KAAKf;EACjB,MAAM,EAAE,IAAI,MAAM,UAAU;EAE5B,IAAI,SAAS,uBAAuB;GAClC,MAAM,IAAI;GACV,IAAI,OAAO,WAAW,OAAO,UAAU,IAAI,qBAAqB,IAAI,CAAC;QAChE,IAAI,qBAAqB,OAAO,CAAC;GACtC;EACF;EACA,IAAI,SAAS,UAAU;GACrB,IAAI,OAAO,SAAS,IAAI,aAAa,IAAI,KAAe;QACnD,IAAI,OAAO,UAAU;IACxB,MAAM,IAAI;IACV,KAAKQ,aAAa,IAAI,cAAe,EAAU,IAAI,CAAC;GACtD,OACE,KAAK,MAAM,KAAK,IAAI,cAClB,IAAK,EAAU,OAAQ,OAAe;IACpC,IAAI,aAAa,OAAO,CAAC;IACzB;GACF;GAGJ;EACF;EACA,IAAI,SAAS,eAAe;GAC1B,IAAI,OAAO,SAAS,IAAI,iBAAiB,IAAI,KAAoB;QAC5D,IAAI,OAAO,UAAU;IACxB,MAAM,IAAI;IACV,KAAKA,aAAa,IAAI,kBAAmB,EAAU,IAAI,CAAC;GAC1D,OACE,KAAK,MAAM,KAAK,IAAI,kBAClB,IAAK,EAAU,OAAQ,OAAe;IACpC,IAAI,iBAAiB,OAAO,CAAC;IAC7B;GACF;GAGJ;EACF;EACA,IAAI,SAAS,WAAW;GACtB,IAAI,OAAO,SAAS,IAAI,aAAa,IAAI,KAAgB;QACpD,IAAI,OAAO,UAAU;IACxB,MAAM,IAAI;IACV,KAAKA,aAAa,IAAI,cAAe,EAAU,IAAI,CAAC;GACtD,OACE,KAAK,MAAM,KAAK,IAAI,cAClB,IAAK,EAAU,OAAQ,OAAe;IACpC,IAAI,aAAa,OAAO,CAAC;IACzB;GACF;GAGJ;EACF;EACA,IAAI,SAAS,WAAW;GACtB,IAAI,OAAO,SAAS,IAAI,aAAa,IAAI,KAAgB;QACpD,IAAI,OAAO,UAAU;IACxB,MAAM,IAAI;IACV,KAAKA,aAAa,IAAI,cAAe,EAAU,IAAI,CAAC;GACtD,OACE,KAAK,MAAM,KAAK,IAAI,cAClB,IAAK,EAAU,OAAQ,OAAe;IACpC,IAAI,aAAa,OAAO,CAAC;IACzB;GACF;GAGJ;EACF;EACA,IAAI,SAAS,YAAY;GACvB,IAAI,OAAO,SAAS,IAAI,cAAc,IAAI,KAAiB;QACtD,IAAI,OAAO,UAAU;IACxB,MAAM,IAAI;IACV,KAAKA,aAAa,IAAI,eAAgB,EAAU,IAAI,CAAC;GACvD,OACE,KAAK,MAAM,MAAM,IAAI,eACnB,IAAK,GAAW,OAAQ,OAAe;IACrC,IAAI,cAAc,OAAO,EAAE;IAC3B;GACF;GAGJ;EACF;CACF;AACF"}
1
+ {"version":3,"file":"dispatch_runner-BZDXUe0G.mjs","names":["#turnToolCalls","#turnRetrievables","#doStoreRetrievable","#checkArtifactIdCollision","#doMutateRetrievable","#replaceById","#doStoreToolCall","#doMutateToolCall","#id","#turnAbortController","#stash","#systemPrompt","#standingInstructions","#turnMemories","#turnMessages","#turnThoughts","#id","#dispatchId","#iteration","#turnAbortController","#stash","#systemPrompt","#standingInstructions","#turnMemories","#turnRetrievables","#turnMessages","#turnThoughts","#turnToolCalls","#tools","#toolCallChecksums","#fetchMemories","#fetchRetrievables","#fetchMessages","#fetchThoughts","#fetchToolCalls","#fetchTools","#refreshStandingInstructions","#storeStandingInstruction","#mutateStandingInstruction","#deleteStandingInstruction","#storeMemory","#mutateMemory","#deleteMemory","#storeRetrievable","#mutateRetrievable","#deleteRetrievable","#storeMessage","#mutateMessage","#deleteMessage","#storeThought","#mutateThought","#deleteThought","#storeToolCall","#mutateToolCall","#deleteToolCall","#replaceToolCallGroup","#storeMediaBytes","#storeRetrievableBytes","#waitFor","#signalled","#nackError","#hooks","#ackHandlers","#doStoreStandingInstruction","#doMutateStandingInstruction","#doDeleteStandingInstruction","#doStoreMemory","#doMutateMemory","#doDeleteMemory","#doStoreRetrievable","#doMutateRetrievable","#doDeleteRetrievable","#doStoreMessage","#doMutateMessage","#doDeleteMessage","#doStoreThought","#doMutateThought","#doDeleteThought","#doStoreToolCall","#doMutateToolCall","#doDeleteToolCall","#doReplaceToolCallGroup","#replaceById","#checkArtifactIdCollision","#sourceCtx","#deltaQueue","#functionalHooks","#observabilityHooks","#inputPipeline","#outputPipeline","#buildContext","#wireContextHooks","#replaceById","#runDispatch","#buildHelpers","#forgeArtifactTools","#runPipeline","#flush","#isAbortError","#applyDeltaToParent"],"sources":["../src/lib/utils/retrievable_spool.ts","../src/lib/contracts/turn_runner_context.ts","../src/lib/contracts/dispatch_context.ts","../src/lib/dispatch_runner.ts"],"sourcesContent":["import { Tokenizable } from '../classes/tokenizable'\nimport { Retrievable } from '../classes/retrievable'\nimport { SpooledArtifact } from '../classes/spooled_artifact'\nimport type { SpoolReader } from '../contracts/spool_reader'\nimport type { ConduitBytes } from '../contracts/dispatch_context'\n\nexport interface RetrievableSpoolContext {\n storeRetrievableBytes: (id: string, bytes: ConduitBytes) => SpoolReader | Promise<SpoolReader>\n turnRetrievables: Set<Retrievable>\n}\n\nexport const computeTextHints = (text: string): { byteLength: number; lineCount: number } => ({\n byteLength: new TextEncoder().encode(text).byteLength,\n lineCount: text.length === 0 ? 0 : text.split('\\n').length,\n})\n\nexport async function autoSpoolRetrievable(\n ctx: Pick<RetrievableSpoolContext, 'storeRetrievableBytes'>,\n v: Retrievable\n): Promise<Retrievable> {\n if (!Tokenizable.isTokenizable(v.content) || v.content.dynamic || v.inline) return v\n const text = v.content.toString()\n const hints = computeTextHints(text)\n const reader = await ctx.storeRetrievableBytes(v.id, text)\n const Ctor = v.artifactConstructor?.() ?? SpooledArtifact\n const artifact = new Ctor(reader)\n if (typeof (artifact as { _setSizeHints?: unknown })._setSizeHints === 'function') {\n artifact._setSizeHints(hints)\n }\n // Do not spread the instance: its derived enumerable `sizeUnknown` getter is not a\n // RawRetrievable field and strict validation intentionally rejects it.\n return new Retrievable({\n id: v.id,\n content: artifact,\n trustTier: v.trustTier,\n source: v.source,\n kind: v.kind,\n score: v.score,\n createdAt: v.createdAt,\n updatedAt: v.updatedAt,\n inline: v.inline,\n artifactConstructor: v.artifactConstructor,\n })\n}\n\nexport async function normalizeRetrievables(ctx: RetrievableSpoolContext): Promise<void> {\n const records = await Promise.all(\n [...ctx.turnRetrievables].map((r) => autoSpoolRetrievable(ctx, r))\n )\n ctx.turnRetrievables.clear()\n for (const record of records) ctx.turnRetrievables.add(record)\n}\n\nexport function assertUniqueRetrievableIds(recs: ReadonlyArray<Pick<Retrievable, 'id'>>): void {\n const seen = new Set<string>()\n for (const record of recs) {\n if (seen.has(record.id)) throw new Error(`Duplicate retrievable id: ${record.id}`)\n seen.add(record.id)\n }\n}\n","import { v6 as uuidv6 } from 'uuid'\nimport { validator } from '@nhtio/validation'\nimport { Registry } from '../classes/registry'\nimport { Tokenizable } from '../classes/tokenizable'\nimport { validateOrThrow } from '../utils/validation'\nimport { isInstanceOf, isError } from '../utils/guards'\nimport { E_INVALID_TURN_CONTEXT, E_ARTIFACT_ID_COLLISION } from '../exceptions/runtime'\nimport { autoSpoolRetrievable, assertUniqueRetrievableIds } from '../utils/retrievable_spool'\nimport type { Tool } from '../classes/tool'\nimport type { Memory } from '../classes/memory'\nimport type { Message } from '../classes/message'\nimport type { Thought } from '../classes/thought'\nimport type { SpoolReader } from './spool_reader'\nimport type { MediaReader } from './media_reader'\nimport type { ToolCall } from '../classes/tool_call'\nimport type { ConduitBytes } from './dispatch_context'\nimport type { Retrievable } from '../classes/retrievable'\nimport type { ToolRegistry } from '../classes/tool_registry'\nimport type {\n EmitMessageFn,\n EmitThoughtFn,\n EmitToolCallFn,\n EmitToolExecutionEndFn,\n EmitToolExecutionStartFn,\n OpenGateFn,\n} from '../types/turn_runner'\n\n/**\n * Plain input object supplied to {@link TurnContext} at construction time.\n *\n * @remarks\n * Validated against `turnContextSchema` before the `TurnContext` instance is created.\n * Fields will grow as the turn execution model takes shape (e.g. input message, tool\n * definitions, model client config).\n */\nexport interface RawTurnContext {\n /** `AbortController` whose signal can be used to cancel the turn mid-flight. */\n turnAbortController: AbortController\n /** A registry for arbitrary additional data to be added to the context as needed; initially empty. */\n stash?: Record<string, unknown>\n /** The system prompt guiding the agent's behavior for this turn. */\n systemPrompt: string | Tokenizable\n /** Standing instructions for the agent, applied to every turn. */\n standingInstructions: (string | Tokenizable)[]\n}\n\n/**\n * A fully-resolved {@link RawTurnContext} where all optional fields have been filled in by the\n * schema (e.g. `stash` defaulted to `{}`).\n *\n * @remarks\n * This is the shape returned by `turnContextSchema` after validation — use it wherever a\n * guaranteed-present context is needed rather than the raw caller-supplied input.\n */\nexport type ResolvedTurnContext = Required<RawTurnContext>\n\n/**\n * Validator schema used to validate a {@link RawTurnContext} before constructing a {@link TurnContext}.\n *\n * @remarks\n * Validates all four fields of {@link RawTurnContext}:\n * - `turnAbortController` — required `AbortController` instance.\n * - `stash` — optional string-keyed object; defaults to `{}`.\n * - `systemPrompt` — required string or {@link @nhtio/adk!Tokenizable}, via {@link @nhtio/adk!Tokenizable.schema}.\n * - `standingInstructions` — optional array of strings or {@link @nhtio/adk!Tokenizable} instances, each\n * validated via {@link @nhtio/adk!Tokenizable.schema}; defaults to `[]`.\n *\n * Throws a `ValidationException` (via {@link validateOrThrow}) when validation fails.\n */\nexport const turnContextSchema = validator\n .object<RawTurnContext>({\n turnAbortController: validator\n .alternatives(\n validator.object().instance(AbortController as any),\n validator.function().instance(AbortController as any)\n )\n .required(),\n // eslint-disable-next-line adk/require-validator-any-required -- map value type-arg: stash holds arbitrary values; disposition is set by .default({}) on the object\n stash: validator.object().pattern(validator.string(), validator.any()).default({}),\n systemPrompt: Tokenizable.schema.required(),\n standingInstructions: validator.array().items(Tokenizable.schema).default([]),\n })\n .required()\n\n/**\n * A function that retrieves the memories relevant to the current turn.\n *\n * @remarks\n * Receives the active {@link TurnContext} so implementations can filter or rank memories\n * based on turn-specific state (e.g. the system prompt, standing instructions, or stash).\n * May be synchronous or asynchronous.\n */\nexport type MemoryRetrievalFn = (ctx: TurnContext) => Memory[] | Promise<Memory[]>\n\n/**\n * A function that retrieves the retrievable (RAG) records relevant to the current turn.\n *\n * @remarks\n * Receives the active {@link TurnContext} so implementations can rank, filter, or compose\n * retrieval results against the turn-specific state (system prompt, standing instructions, etc.).\n * The retrieval middleware that produces these records is responsible for assigning each one's\n * `trustTier` — batteries MUST NOT auto-classify retrieved content.\n * May be synchronous or asynchronous.\n */\nexport type RetrievableRetrievalFn = (ctx: TurnContext) => Retrievable[] | Promise<Retrievable[]>\n\n/**\n * A function that retrieves the conversation messages relevant to the current turn.\n *\n * @remarks\n * Receives the active {@link TurnContext} so implementations can apply turn-aware filtering or\n * windowing. Returns only `user` and `assistant` {@link @nhtio/adk!Message} entries — system instructions\n * and tool results are not part of the persisted message history.\n * May be synchronous or asynchronous.\n */\nexport type MessageRetrievalFn = (ctx: TurnContext) => Message[] | Promise<Message[]>\n\n/**\n * A function that retrieves the thought traces relevant to the current turn.\n *\n * @remarks\n * Receives the active {@link TurnContext} so implementations can apply turn-aware filtering or\n * attribution (e.g. filtering to a specific agent's identity in multi-agent conversations).\n * May be synchronous or asynchronous.\n */\nexport type ThoughtRetrievalFn = (ctx: TurnContext) => Thought[] | Promise<Thought[]>\n\n/**\n * A function that retrieves the tool call records relevant to the current turn.\n *\n * @remarks\n * Receives the active {@link TurnContext} so implementations can filter by completion state,\n * agent identity, or any other turn-specific criteria.\n * May be synchronous or asynchronous.\n */\nexport type ToolCallRetrievalFn = (ctx: TurnContext) => ToolCall[] | Promise<ToolCall[]>\n\n/**\n * A function that retrieves the tools available for the current turn.\n *\n * @remarks\n * Receives the active {@link TurnContext} so implementations can apply turn-aware filtering\n * (e.g. RBAC scopes, feature flags). May be synchronous or asynchronous.\n */\nexport type ToolsRetrievalFn = (ctx: TurnContext) => Tool[] | Promise<Tool[]>\n\n/**\n * A function that refreshes and returns the standing instructions for the current turn.\n *\n * @remarks\n * Called to re-derive standing instructions mid-turn when they may have changed.\n * May be synchronous or asynchronous.\n */\nexport type StandingInstructionsRefreshFn = (\n ctx: TurnContext\n) => (string | Tokenizable)[] | Promise<(string | Tokenizable)[]>\n\n/** Stores a new standing instruction in the persistence layer. */\nexport type StandingInstructionStoreFn = (\n ctx: TurnContext,\n v: string | Tokenizable\n) => void | Promise<void>\n\n/** Updates an existing standing instruction in the persistence layer. */\nexport type StandingInstructionMutateFn = (\n ctx: TurnContext,\n v: string | Tokenizable\n) => void | Promise<void>\n\n/** Removes a standing instruction from the persistence layer. */\nexport type StandingInstructionDeleteFn = (\n ctx: TurnContext,\n v: string | Tokenizable\n) => void | Promise<void>\n\n/** Stores a new memory in the persistence layer. */\nexport type MemoryStoreFn = (ctx: TurnContext, v: Memory) => void | Promise<void>\n\n/** Updates an existing memory in the persistence layer. */\nexport type MemoryMutateFn = (ctx: TurnContext, v: Memory) => void | Promise<void>\n\n/** Removes a memory from the persistence layer by ID. */\nexport type MemoryDeleteFn = (ctx: TurnContext, id: string) => void | Promise<void>\n\n/** Stores a new retrievable record in the persistence layer. */\nexport type RetrievableStoreFn = (ctx: TurnContext, v: Retrievable) => void | Promise<void>\n\n/** Updates an existing retrievable record in the persistence layer. */\nexport type RetrievableMutateFn = (ctx: TurnContext, v: Retrievable) => void | Promise<void>\n\n/** Removes a retrievable record from the persistence layer by ID. */\nexport type RetrievableDeleteFn = (ctx: TurnContext, id: string) => void | Promise<void>\n\n/** Stores a new message in the persistence layer. */\nexport type MessageStoreFn = (ctx: TurnContext, v: Message) => void | Promise<void>\n\n/** Updates an existing message in the persistence layer. */\nexport type MessageMutateFn = (ctx: TurnContext, v: Message) => void | Promise<void>\n\n/** Removes a message from the persistence layer by ID. */\nexport type MessageDeleteFn = (ctx: TurnContext, id: string) => void | Promise<void>\n\n/** Stores a new thought in the persistence layer. */\nexport type ThoughtStoreFn = (ctx: TurnContext, v: Thought) => void | Promise<void>\n\n/** Updates an existing thought in the persistence layer. */\nexport type ThoughtMutateFn = (ctx: TurnContext, v: Thought) => void | Promise<void>\n\n/** Removes a thought from the persistence layer by ID. */\nexport type ThoughtDeleteFn = (ctx: TurnContext, id: string) => void | Promise<void>\n\n/** Stores a new tool call in the persistence layer. */\nexport type ToolCallStoreFn = (ctx: TurnContext, v: ToolCall) => void | Promise<void>\n\n/** Updates an existing tool call in the persistence layer. */\nexport type ToolCallMutateFn = (ctx: TurnContext, v: ToolCall) => void | Promise<void>\n\n/** Removes a tool call from the persistence layer by ID. */\nexport type ToolCallDeleteFn = (ctx: TurnContext, id: string) => void | Promise<void>\n\n/** Optionally persists a complete tool-call group replacement atomically. */\nexport type ToolCallGroupReplaceFn = (\n ctx: TurnContext,\n removedIds: readonly string[],\n replacements: readonly ToolCall[]\n) => void | Promise<void>\n\n/**\n * Persists tool-generated media bytes into consumer storage and returns a {@link @nhtio/adk!MediaReader}.\n * A byte-persistence conduit, not a mutation — returns a value and touches no turn state.\n */\nexport type MediaBytesStoreFn = (\n ctx: TurnContext,\n id: string,\n bytes: ConduitBytes\n) => MediaReader | Promise<MediaReader>\n\n/**\n * Persists extracted retrievable text bytes into consumer storage and returns a\n * {@link @nhtio/adk!SpoolReader}. A byte-persistence conduit, not a mutation.\n */\nexport type RetrievableBytesStoreFn = (\n ctx: TurnContext,\n id: string,\n bytes: ConduitBytes\n) => SpoolReader | Promise<SpoolReader>\n\n/**\n * Callbacks injected into a {@link TurnContext} by `TurnRunner` at run time.\n *\n * @remarks\n * These are supplied by the `TurnRunnerConfig` and bound to the context so middleware\n * can call fetch, emit, and mutation methods directly on the context without needing a reference\n * to the runner or its emitters. Not exported — `TurnContext` is constructed internally and\n * callers never need to reference this shape.\n *\n * @internal\n */\ninterface TurnRunnerInjected {\n /** Retrieves memories relevant to this turn. */\n fetchMemories: MemoryRetrievalFn\n /** Retrieves conversation messages relevant to this turn. */\n fetchMessages: MessageRetrievalFn\n /** Retrieves thought traces relevant to this turn. */\n fetchThoughts: ThoughtRetrievalFn\n /** Retrieves tool call records relevant to this turn. */\n fetchToolCalls: ToolCallRetrievalFn\n /** Retrieves tools available for this turn. */\n fetchTools: ToolsRetrievalFn\n /** Refreshes and returns the standing instructions for this turn. */\n refreshStandingInstructions: StandingInstructionsRefreshFn\n /** Stores a new standing instruction in the persistence layer. */\n storeStandingInstruction: StandingInstructionStoreFn\n /** Updates an existing standing instruction in the persistence layer. */\n mutateStandingInstruction: StandingInstructionMutateFn\n /** Removes a standing instruction from the persistence layer. */\n deleteStandingInstruction: StandingInstructionDeleteFn\n /** Stores a new memory in the persistence layer. */\n storeMemory: MemoryStoreFn\n /** Updates an existing memory in the persistence layer. */\n mutateMemory: MemoryMutateFn\n /** Removes a memory from the persistence layer by ID. */\n deleteMemory: MemoryDeleteFn\n /** Retrieves retrievable records relevant to this turn. */\n fetchRetrievables: RetrievableRetrievalFn\n /** Stores a new retrievable record in the persistence layer. */\n storeRetrievable: RetrievableStoreFn\n /** Updates an existing retrievable record in the persistence layer. */\n mutateRetrievable: RetrievableMutateFn\n /** Removes a retrievable record from the persistence layer by ID. */\n deleteRetrievable: RetrievableDeleteFn\n /** Stores a new message in the persistence layer. */\n storeMessage: MessageStoreFn\n /** Updates an existing message in the persistence layer. */\n mutateMessage: MessageMutateFn\n /** Removes a message from the persistence layer by ID. */\n deleteMessage: MessageDeleteFn\n /** Stores a new thought in the persistence layer. */\n storeThought: ThoughtStoreFn\n /** Updates an existing thought in the persistence layer. */\n mutateThought: ThoughtMutateFn\n /** Removes a thought from the persistence layer by ID. */\n deleteThought: ThoughtDeleteFn\n /** Stores a new tool call in the persistence layer. */\n storeToolCall: ToolCallStoreFn\n /** Updates an existing tool call in the persistence layer. */\n mutateToolCall: ToolCallMutateFn\n /** Removes a tool call from the persistence layer by ID. */\n deleteToolCall: ToolCallDeleteFn\n /** Optionally persists a complete tool-call group replacement atomically. */\n replaceToolCallGroup?: ToolCallGroupReplaceFn\n /** Persists tool-generated media bytes; returns a `MediaReader`. */\n storeMediaBytes: MediaBytesStoreFn\n /** Persists extracted retrievable text bytes; returns a `SpoolReader`. */\n storeRetrievableBytes: RetrievableBytesStoreFn\n /** Emits a `message` event on the runner. */\n emitMessage: EmitMessageFn\n /** Emits a `thought` event on the runner. */\n emitThought: EmitThoughtFn\n /** Emits a `toolCall` event on the runner. */\n emitToolCall: EmitToolCallFn\n /** Emits a `toolExecutionStart` event on the observability bus. */\n emitToolExecutionStart: EmitToolExecutionStartFn\n /** Emits a `toolExecutionEnd` event on the observability bus. */\n emitToolExecutionEnd: EmitToolExecutionEndFn\n /** Opens a turn gate; `turnId` and `abortSignal` are injected by the runner. */\n openGate: OpenGateFn\n /** The turn-scoped tool registry constructed from the runner's baseline tools. */\n tools: ToolRegistry\n}\n\n/**\n * The validated, strongly-typed context object threaded through every middleware step in a\n * single agent turn.\n *\n * @remarks\n * Constructed from a {@link RawTurnContext} by {@link @nhtio/adk!TurnRunner.run}. Middleware functions\n * receive this object and use it to read and share state across pipeline steps.\n */\nexport class TurnContext {\n /**\n * Returns `true` if `value` is a {@link TurnContext} instance.\n *\n * @remarks\n * Uses {@link @nhtio/adk!isInstanceOf} for cross-realm safety. The ADK does not export the\n * `TurnContext` class itself as a constructable value — use this guard plus the\n * {@link TurnContext} type for runtime detection and TypeScript narrowing.\n *\n * @param value - The value to test.\n * @returns `true` when `value` is a {@link TurnContext} instance.\n */\n public static isTurnContext(value: unknown): value is TurnContext {\n return isInstanceOf(value, 'TurnContext', TurnContext)\n }\n\n #id: string\n #turnAbortController: AbortController\n #stash: Registry\n #systemPrompt: Tokenizable\n #standingInstructions: Set<Tokenizable>\n #turnMemories: Set<Memory>\n #turnRetrievables: Set<Retrievable>\n #turnMessages: Set<Message>\n #turnThoughts: Set<Thought>\n #turnToolCalls: Set<ToolCall>\n\n #replaceById<T extends { id: string }>(set: Set<T>, id: string, replacement: T): Set<T> {\n const next = new Set<T>()\n let inserted = false\n for (const existing of set) {\n if (existing.id === id) {\n if (!inserted) next.add(replacement)\n inserted = true\n } else next.add(existing)\n }\n if (!inserted) next.add(replacement)\n return next\n }\n\n #checkArtifactIdCollision(id: string, source: 'retrievable' | 'toolCall'): void {\n const other = source === 'retrievable' ? this.#turnToolCalls : this.#turnRetrievables\n if ([...other].some((v) => v.id === id)) throw new E_ARTIFACT_ID_COLLISION([id])\n }\n\n async #doStoreRetrievable(i: TurnRunnerInjected, v: Retrievable): Promise<Retrievable> {\n this.#checkArtifactIdCollision(v.id, 'retrievable')\n const record = await autoSpoolRetrievable(this, v)\n this.#turnRetrievables.add(record)\n await i.storeRetrievable(this, record)\n return record\n }\n async #doMutateRetrievable(i: TurnRunnerInjected, v: Retrievable): Promise<Retrievable> {\n this.#checkArtifactIdCollision(v.id, 'retrievable')\n const record = await autoSpoolRetrievable(this, v)\n this.#turnRetrievables = this.#replaceById(this.#turnRetrievables, record.id, record)\n await i.mutateRetrievable(this, record)\n return record\n }\n async #doStoreToolCall(i: TurnRunnerInjected, v: ToolCall): Promise<void> {\n this.#checkArtifactIdCollision(v.id, 'toolCall')\n this.#turnToolCalls.add(v)\n await i.storeToolCall(this, v)\n }\n async #doMutateToolCall(i: TurnRunnerInjected, v: ToolCall): Promise<void> {\n this.#checkArtifactIdCollision(v.id, 'toolCall')\n this.#turnToolCalls = this.#replaceById(this.#turnToolCalls, v.id, v)\n await i.mutateToolCall(this, v)\n }\n\n /**\n * @param raw - The raw context input validated against {@link turnContextSchema}.\n * @param injected - Runtime callbacks supplied by `TurnRunner`; bound as instance methods so\n * middleware can call fetch and emit methods directly on the context.\n * @throws {@link @nhtio/adk!E_INVALID_TURN_CONTEXT} when `raw` does not satisfy the schema.\n *\n * @internal\n */\n constructor(raw: RawTurnContext, injected: TurnRunnerInjected) {\n try {\n raw = validateOrThrow<ResolvedTurnContext>(turnContextSchema, raw, true)\n } catch (err) {\n throw new E_INVALID_TURN_CONTEXT({ cause: isError(err) ? err : undefined })\n }\n this.#id = uuidv6()\n this.#turnAbortController = raw.turnAbortController\n this.#stash = new Registry(raw.stash)\n this.#systemPrompt = Tokenizable.isTokenizable(raw.systemPrompt)\n ? raw.systemPrompt\n : new Tokenizable(raw.systemPrompt)\n this.#standingInstructions = new Set(\n (raw.standingInstructions || []).map((instr) =>\n Tokenizable.isTokenizable(instr) ? instr : new Tokenizable(instr)\n )\n )\n this.#turnMemories = new Set()\n this.#turnRetrievables = new Set()\n this.#turnMessages = new Set()\n this.#turnThoughts = new Set()\n this.#turnToolCalls = new Set()\n\n // Expose read-only properties on the instance for easy access in middleware.\n Object.defineProperties(this, {\n id: {\n get: () => this.#id,\n enumerable: true,\n configurable: false,\n },\n aborted: {\n get: () => Boolean(this.#turnAbortController.signal.aborted),\n enumerable: true,\n configurable: false,\n },\n abortSignal: {\n get: () => this.#turnAbortController.signal,\n enumerable: true,\n configurable: false,\n },\n abort: {\n value: (reason?: unknown) => this.#turnAbortController.abort(reason),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n stash: {\n get: () => this.#stash,\n enumerable: true,\n configurable: false,\n },\n systemPrompt: {\n get: () => this.#systemPrompt,\n enumerable: true,\n configurable: false,\n },\n standingInstructions: {\n get: () => this.#standingInstructions,\n enumerable: true,\n configurable: false,\n },\n turnMemories: {\n get: () => this.#turnMemories,\n enumerable: true,\n configurable: false,\n },\n turnRetrievables: {\n get: () => this.#turnRetrievables,\n enumerable: true,\n configurable: false,\n },\n turnMessages: {\n get: () => this.#turnMessages,\n enumerable: true,\n configurable: false,\n },\n turnThoughts: {\n get: () => this.#turnThoughts,\n enumerable: true,\n configurable: false,\n },\n turnToolCalls: {\n get: () => this.#turnToolCalls,\n enumerable: true,\n configurable: false,\n },\n })\n\n // Attach injected dependencies as instance methods for access in middleware.\n Object.defineProperties(this, {\n fetchMemories: {\n value: () => injected.fetchMemories(this),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n fetchMessages: {\n value: () => injected.fetchMessages(this),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n fetchThoughts: {\n value: () => injected.fetchThoughts(this),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n fetchToolCalls: {\n value: () => injected.fetchToolCalls(this),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n fetchTools: {\n value: () => injected.fetchTools(this),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n refreshStandingInstructions: {\n value: () => injected.refreshStandingInstructions(this),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n storeStandingInstruction: {\n value: (v: string | Tokenizable) => injected.storeStandingInstruction(this, v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n mutateStandingInstruction: {\n value: (v: string | Tokenizable) => injected.mutateStandingInstruction(this, v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n deleteStandingInstruction: {\n value: (v: string | Tokenizable) => injected.deleteStandingInstruction(this, v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n storeMemory: {\n value: (v: Memory) => injected.storeMemory(this, v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n mutateMemory: {\n value: (v: Memory) => injected.mutateMemory(this, v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n deleteMemory: {\n value: (id: string) => injected.deleteMemory(this, id),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n fetchRetrievables: {\n value: async () => {\n const recs = await injected.fetchRetrievables(this)\n assertUniqueRetrievableIds(recs)\n return Promise.all(recs.map((r) => autoSpoolRetrievable(this, r)))\n },\n enumerable: true,\n configurable: false,\n writable: false,\n },\n storeRetrievable: {\n value: (v: Retrievable) => this.#doStoreRetrievable(injected, v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n mutateRetrievable: {\n value: (v: Retrievable) => this.#doMutateRetrievable(injected, v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n deleteRetrievable: {\n value: (id: string) => injected.deleteRetrievable(this, id),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n storeMessage: {\n value: (v: Message) => injected.storeMessage(this, v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n mutateMessage: {\n value: (v: Message) => injected.mutateMessage(this, v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n deleteMessage: {\n value: (id: string) => injected.deleteMessage(this, id),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n storeThought: {\n value: (v: Thought) => injected.storeThought(this, v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n mutateThought: {\n value: (v: Thought) => injected.mutateThought(this, v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n deleteThought: {\n value: (id: string) => injected.deleteThought(this, id),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n storeToolCall: {\n value: (v: ToolCall) => this.#doStoreToolCall(injected, v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n mutateToolCall: {\n value: (v: ToolCall) => this.#doMutateToolCall(injected, v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n deleteToolCall: {\n value: (id: string) => injected.deleteToolCall(this, id),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n replaceToolCallGroup: {\n value: async (ids: readonly string[], replacements: readonly ToolCall[]) => {\n if (injected.replaceToolCallGroup) {\n await injected.replaceToolCallGroup(this, ids, replacements)\n } else {\n // Degrade to the ordinary persistence conduits when no transaction is available. Carry\n // the deletion progress out on the error: without it a failed repair tells a consumer\n // only THAT it failed, leaving a partially mutated store with nothing to reconcile\n // against. Mirrors DispatchContext's degraded path.\n const deletedIds: string[] = []\n try {\n for (const id of ids) {\n await injected.deleteToolCall(this, id)\n deletedIds.push(id)\n }\n for (const replacement of replacements)\n await injected.storeToolCall(this, replacement)\n } catch (error) {\n if (isError(error))\n (error as Error & { deletedIds: string[] }).deletedIds = [...deletedIds]\n throw error\n }\n }\n // Persistence committed — now bring the in-memory collection in line, on BOTH paths.\n // `#doStoreToolCall`/`#doMutateToolCall` maintain this Set; a group replacement that\n // skipped it would leave the turn holding the colliding calls it just renamed away, and\n // the next dispatch seeded from this turn would re-process them and diverge from what\n // was persisted. Replacements land at the position of the first removed member so\n // insertion order is preserved.\n const removing = new Set(ids)\n const next = new Set<ToolCall>()\n let inserted = false\n for (const tc of this.#turnToolCalls) {\n if (removing.has(tc.id)) {\n if (!inserted) {\n for (const replacement of replacements) next.add(replacement)\n inserted = true\n }\n } else next.add(tc)\n }\n if (!inserted) for (const replacement of replacements) next.add(replacement)\n this.#turnToolCalls = next\n },\n enumerable: true,\n configurable: false,\n writable: false,\n },\n storeMediaBytes: {\n value: (id: string, bytes: ConduitBytes) => injected.storeMediaBytes(this, id, bytes),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n storeRetrievableBytes: {\n value: (id: string, bytes: ConduitBytes) => injected.storeRetrievableBytes(this, id, bytes),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n emitMessage: {\n value: injected.emitMessage,\n enumerable: true,\n configurable: false,\n writable: false,\n },\n emitThought: {\n value: injected.emitThought,\n enumerable: true,\n configurable: false,\n writable: false,\n },\n emitToolCall: {\n value: injected.emitToolCall,\n enumerable: true,\n configurable: false,\n writable: false,\n },\n emitToolExecutionStart: {\n value: injected.emitToolExecutionStart,\n enumerable: true,\n configurable: false,\n writable: false,\n },\n emitToolExecutionEnd: {\n value: injected.emitToolExecutionEnd,\n enumerable: true,\n configurable: false,\n writable: false,\n },\n waitFor: {\n value: injected.openGate,\n enumerable: true,\n configurable: false,\n writable: false,\n },\n tools: {\n get: () => injected.tools,\n enumerable: true,\n configurable: false,\n },\n })\n }\n\n /** Unique identifier for this turn, generated as a UUIDv6 at construction time. */\n declare readonly id: string\n /** `true` when the turn's `AbortController` signal has fired. */\n declare readonly aborted: boolean\n /** The `AbortSignal` from the turn's `AbortController`. */\n declare readonly abortSignal: AbortSignal\n /**\n * Aborts the turn's `AbortController` with the supplied reason. Middleware should call this\n * when refusing the turn — the runner reads `aborted` between every stage and short-circuits\n * cleanly: `turnEnd` still fires, no `error` event is emitted, and during dispatch\n * `dispatchEnd.status === 'aborted'` carries the operational signal.\n */\n declare readonly abort: (reason?: unknown) => void\n /** Arbitrary key-value store that middleware can read and write across pipeline steps. */\n declare readonly stash: Registry\n /** The system prompt guiding the agent's behaviour for this turn. */\n declare readonly systemPrompt: Tokenizable\n /** Standing instructions applied to every turn, in insertion order. */\n declare readonly standingInstructions: Set<Tokenizable>\n /** Memories loaded for this turn; populated by middleware after calling `fetchMemories()`. */\n declare readonly turnMemories: Set<Memory>\n /** Retrievable records loaded for this turn; populated by middleware after calling `fetchRetrievables()`. */\n declare readonly turnRetrievables: Set<Retrievable>\n /** Conversation messages loaded for this turn; populated by middleware after calling `fetchMessages()`. */\n declare readonly turnMessages: Set<Message>\n /** Thought traces loaded for this turn; populated by middleware after calling `fetchThoughts()`. */\n declare readonly turnThoughts: Set<Thought>\n /** Tool call records loaded for this turn; populated by middleware after calling `fetchToolCalls()`. */\n declare readonly turnToolCalls: Set<ToolCall>\n /** Fetches memories relevant to this turn; delegates to the callback supplied at construction. */\n declare readonly fetchMemories: () => Memory[] | Promise<Memory[]>\n /** Fetches conversation messages relevant to this turn; delegates to the callback supplied at construction. */\n declare readonly fetchMessages: () => Message[] | Promise<Message[]>\n /** Fetches thought traces relevant to this turn; delegates to the callback supplied at construction. */\n declare readonly fetchThoughts: () => Thought[] | Promise<Thought[]>\n /** Fetches tool call records relevant to this turn; delegates to the callback supplied at construction. */\n declare readonly fetchToolCalls: () => ToolCall[] | Promise<ToolCall[]>\n /** Fetches tools available for this turn; delegates to the callback supplied at construction. */\n declare readonly fetchTools: () => Tool[] | Promise<Tool[]>\n /** Refreshes and returns the standing instructions; delegates to the callback supplied at construction. */\n declare readonly refreshStandingInstructions: () =>\n | (string | Tokenizable)[]\n | Promise<(string | Tokenizable)[]>\n /** Stores a new standing instruction in the persistence layer. */\n declare readonly storeStandingInstruction: (v: string | Tokenizable) => void | Promise<void>\n /** Updates an existing standing instruction in the persistence layer. */\n declare readonly mutateStandingInstruction: (v: string | Tokenizable) => void | Promise<void>\n /** Removes a standing instruction from the persistence layer. */\n declare readonly deleteStandingInstruction: (v: string | Tokenizable) => void | Promise<void>\n /** Stores a new memory in the persistence layer. */\n declare readonly storeMemory: (v: Memory) => void | Promise<void>\n /** Updates an existing memory in the persistence layer. */\n declare readonly mutateMemory: (v: Memory) => void | Promise<void>\n /** Removes a memory from the persistence layer by ID. */\n declare readonly deleteMemory: (id: string) => void | Promise<void>\n /** Fetches retrievable records relevant to this turn; delegates to the callback supplied at construction. */\n declare readonly fetchRetrievables: () => Retrievable[] | Promise<Retrievable[]>\n /** Stores a new retrievable record in the persistence layer. */\n declare readonly storeRetrievable: (v: Retrievable) => Promise<Retrievable>\n /** Updates an existing retrievable record in the persistence layer. */\n declare readonly mutateRetrievable: (v: Retrievable) => Promise<Retrievable>\n /** Removes a retrievable record from the persistence layer by ID. */\n declare readonly deleteRetrievable: (id: string) => void | Promise<void>\n /** Stores a new message in the persistence layer. */\n declare readonly storeMessage: (v: Message) => void | Promise<void>\n /** Updates an existing message in the persistence layer. */\n declare readonly mutateMessage: (v: Message) => void | Promise<void>\n /** Removes a message from the persistence layer by ID. */\n declare readonly deleteMessage: (id: string) => void | Promise<void>\n /** Stores a new thought in the persistence layer. */\n declare readonly storeThought: (v: Thought) => void | Promise<void>\n /** Updates an existing thought in the persistence layer. */\n declare readonly mutateThought: (v: Thought) => void | Promise<void>\n /** Removes a thought from the persistence layer by ID. */\n declare readonly deleteThought: (id: string) => void | Promise<void>\n /** Stores a new tool call in the persistence layer. */\n declare readonly storeToolCall: (v: ToolCall) => void | Promise<void>\n /** Updates an existing tool call in the persistence layer. */\n declare readonly mutateToolCall: (v: ToolCall) => void | Promise<void>\n /** Removes a tool call from the persistence layer by ID. */\n declare readonly deleteToolCall: (id: string) => void | Promise<void>\n /** Replaces a complete colliding tool-call group when storage supports it. */\n declare readonly replaceToolCallGroup: (\n ids: readonly string[],\n replacements: readonly ToolCall[]\n ) => Promise<void>\n /**\n * Persists tool-generated media bytes into consumer storage and returns a {@link @nhtio/adk!MediaReader}.\n * Low-level conduit — returns a value, touches no turn state; build a {@link @nhtio/adk!Media} from the\n * reader and persist the owning primitive separately.\n */\n declare readonly storeMediaBytes: (\n id: string,\n bytes: ConduitBytes\n ) => MediaReader | Promise<MediaReader>\n /**\n * Persists extracted retrievable text bytes into consumer storage and returns a\n * {@link @nhtio/adk!SpoolReader}. Wrap it in a {@link @nhtio/adk!SpooledArtifact} for `Retrievable.content`\n * and persist the record via {@link TurnContext.storeRetrievable} separately.\n */\n declare readonly storeRetrievableBytes: (\n id: string,\n bytes: ConduitBytes\n ) => SpoolReader | Promise<SpoolReader>\n /** Emits a `message` event on the runner; may be called at any point during the turn. */\n declare readonly emitMessage: EmitMessageFn\n /** Emits a `thought` event on the runner; may be called at any point during the turn. */\n declare readonly emitThought: EmitThoughtFn\n /** Emits a `toolCall` event on the runner; may be called at any point during the turn. */\n declare readonly emitToolCall: EmitToolCallFn\n /** Emits a `toolExecutionStart` event on the observability bus; forwarded from `DispatchContext` by `DispatchRunner` when a tool is invoked inside a dispatch. */\n declare readonly emitToolExecutionStart: EmitToolExecutionStartFn\n /** Emits a `toolExecutionEnd` event on the observability bus; forwarded from `DispatchContext` by `DispatchRunner` when a tool finishes executing inside a dispatch. */\n declare readonly emitToolExecutionEnd: EmitToolExecutionEndFn\n /** Opens a turn gate and suspends until it resolves, rejects, times out, or is aborted. */\n declare readonly waitFor: OpenGateFn\n /** Turn-scoped tool registry constructed from the runner's baseline tools; middleware may trim or extend it. */\n declare readonly tools: ToolRegistry\n}\n","import { v6 as uuidv6 } from 'uuid'\nimport { Hooks } from '@nhtio/hooks'\nimport { validator } from '@nhtio/validation'\nimport { Registry } from '../classes/registry'\nimport { Tokenizable } from '../classes/tokenizable'\nimport { validateOrThrow } from '../utils/validation'\nimport { isInstanceOf, isError } from '../utils/guards'\nimport { ToolRegistry } from '../classes/tool_registry'\nimport { autoSpoolRetrievable, assertUniqueRetrievableIds } from '../utils/retrievable_spool'\nimport {\n E_INVALID_LLM_EXECUTION_CONTEXT,\n E_LLM_EXECUTION_GATE_NOT_SUPPORTED,\n E_LLM_EXECUTION_ALREADY_SIGNALLED,\n E_ARTIFACT_ID_COLLISION,\n} from '../exceptions/runtime'\nimport type { Tool } from '../classes/tool'\nimport type { Memory } from '../classes/memory'\nimport type { Message } from '../classes/message'\nimport type { Thought } from '../classes/thought'\nimport type { SpoolReader } from './spool_reader'\nimport type { MediaReader } from './media_reader'\nimport type { ToolCall } from '../classes/tool_call'\nimport type { Retrievable } from '../classes/retrievable'\nimport type {\n DispatchContextHooks,\n DispatchContextHookRegistrations,\n} from '../types/dispatch_context'\nimport type {\n EmitMessageFn,\n EmitThoughtFn,\n EmitToolCallFn,\n EmitToolExecutionStartFn,\n EmitToolExecutionEndFn,\n OpenGateFn,\n} from '../types/turn_runner'\n\n/** Payload accepted by the byte-persistence conduits — text, raw bytes, or a stream. */\nexport type ConduitBytes = string | Uint8Array | ReadableStream<Uint8Array>\n\n// ── LLM-scoped callback fn types ─────────────────────────────────────────────\n\n/** Retrieves memories for an LLM execution context. */\nexport type DispatchMemoryRetrievalFn = (ctx: DispatchContext) => Memory[] | Promise<Memory[]>\n\n/** Retrieves messages for an LLM execution context. */\nexport type DispatchMessageRetrievalFn = (ctx: DispatchContext) => Message[] | Promise<Message[]>\n\n/** Retrieves thoughts for an LLM execution context. */\nexport type DispatchThoughtRetrievalFn = (ctx: DispatchContext) => Thought[] | Promise<Thought[]>\n\n/** Retrieves tool calls for an LLM execution context. */\nexport type DispatchToolCallRetrievalFn = (ctx: DispatchContext) => ToolCall[] | Promise<ToolCall[]>\n\n/** Retrieves tools for an LLM execution context. */\nexport type DispatchToolsRetrievalFn = (ctx: DispatchContext) => Tool[] | Promise<Tool[]>\n\n/** Refreshes and returns standing instructions for an LLM execution context. */\nexport type DispatchStandingInstructionsRefreshFn = (\n ctx: DispatchContext\n) => (string | Tokenizable)[] | Promise<(string | Tokenizable)[]>\n\n/** Stores a new standing instruction (LLM execution context variant). */\nexport type DispatchStandingInstructionStoreFn = (\n ctx: DispatchContext,\n v: string | Tokenizable\n) => void | Promise<void>\n\n/** Updates an existing standing instruction (LLM execution context variant). */\nexport type DispatchStandingInstructionMutateFn = (\n ctx: DispatchContext,\n v: string | Tokenizable\n) => void | Promise<void>\n\n/** Removes a standing instruction (LLM execution context variant). */\nexport type DispatchStandingInstructionDeleteFn = (\n ctx: DispatchContext,\n v: string | Tokenizable\n) => void | Promise<void>\n\n/** Stores a new memory (LLM execution context variant). */\nexport type DispatchMemoryStoreFn = (ctx: DispatchContext, v: Memory) => void | Promise<void>\n\n/** Updates an existing memory (LLM execution context variant). */\nexport type DispatchMemoryMutateFn = (ctx: DispatchContext, v: Memory) => void | Promise<void>\n\n/** Removes a memory by ID (LLM execution context variant). */\nexport type DispatchMemoryDeleteFn = (ctx: DispatchContext, id: string) => void | Promise<void>\n\n/** Retrieves retrievable records for an LLM execution context. */\nexport type DispatchRetrievableRetrievalFn = (\n ctx: DispatchContext\n) => Retrievable[] | Promise<Retrievable[]>\n\n/** Stores a new retrievable record (LLM execution context variant). */\nexport type DispatchRetrievableStoreFn = (\n ctx: DispatchContext,\n v: Retrievable\n) => void | Promise<void>\n\n/** Updates an existing retrievable record (LLM execution context variant). */\nexport type DispatchRetrievableMutateFn = (\n ctx: DispatchContext,\n v: Retrievable\n) => void | Promise<void>\n\n/** Removes a retrievable record by ID (LLM execution context variant). */\nexport type DispatchRetrievableDeleteFn = (ctx: DispatchContext, id: string) => void | Promise<void>\n\n/** Stores a new message (LLM execution context variant). */\nexport type DispatchMessageStoreFn = (ctx: DispatchContext, v: Message) => void | Promise<void>\n\n/** Updates an existing message (LLM execution context variant). */\nexport type DispatchMessageMutateFn = (ctx: DispatchContext, v: Message) => void | Promise<void>\n\n/** Removes a message by ID (LLM execution context variant). */\nexport type DispatchMessageDeleteFn = (ctx: DispatchContext, id: string) => void | Promise<void>\n\n/** Stores a new thought (LLM execution context variant). */\nexport type DispatchThoughtStoreFn = (ctx: DispatchContext, v: Thought) => void | Promise<void>\n\n/** Updates an existing thought (LLM execution context variant). */\nexport type DispatchThoughtMutateFn = (ctx: DispatchContext, v: Thought) => void | Promise<void>\n\n/** Removes a thought by ID (LLM execution context variant). */\nexport type DispatchThoughtDeleteFn = (ctx: DispatchContext, id: string) => void | Promise<void>\n\n/** Stores a new tool call (LLM execution context variant). */\nexport type DispatchToolCallStoreFn = (ctx: DispatchContext, v: ToolCall) => void | Promise<void>\n\n/** Updates an existing tool call (LLM execution context variant). */\nexport type DispatchToolCallMutateFn = (ctx: DispatchContext, v: ToolCall) => void | Promise<void>\n\n/** Removes a tool call by ID (LLM execution context variant). */\nexport type DispatchToolCallDeleteFn = (ctx: DispatchContext, id: string) => void | Promise<void>\n\n/** Atomically persists a replacement for a complete group of colliding tool calls. */\nexport type ToolCallGroupReplaceFn = (\n ctx: DispatchContext,\n removedIds: readonly string[],\n replacements: readonly ToolCall[]\n) => void | Promise<void>\n\n/**\n * Persists tool-generated media bytes into consumer storage and returns a {@link @nhtio/adk!MediaReader}\n * (LLM execution context variant). Unlike the `store*` mutation callbacks this returns a value and\n * does NOT add anything to the turn Sets — the handler builds a {@link @nhtio/adk!Media} from the reader\n * and persists it via `storeMessage`/`storeToolCall` separately.\n */\nexport type DispatchMediaBytesStoreFn = (\n ctx: DispatchContext,\n id: string,\n bytes: ConduitBytes\n) => MediaReader | Promise<MediaReader>\n\n/**\n * Persists extracted retrievable text bytes into consumer storage and returns a\n * {@link @nhtio/adk!SpoolReader} (LLM execution context variant). The handler wraps the reader in a\n * {@link @nhtio/adk!SpooledArtifact} for `new Retrievable({ content })` and persists the record via\n * `storeRetrievable` separately. Returns a value; does NOT touch the turn Sets.\n */\nexport type DispatchRetrievableBytesStoreFn = (\n ctx: DispatchContext,\n id: string,\n bytes: ConduitBytes\n) => SpoolReader | Promise<SpoolReader>\n\n// ── RawDispatchContext ────────────────────────────────────────────────────\n\n/**\n * Plain input object supplied to {@link DispatchContext} at construction time.\n *\n * @remarks\n * All fetch and mutation callbacks are required — every execution context must have a persistence\n * layer wired up, even in standalone mode. Optional pre-fetched arrays populate the context's Sets\n * at construction time without replacing the callbacks (the callbacks are still invoked on\n * subsequent fetch calls).\n */\nexport interface RawDispatchContext {\n /** `AbortController` whose signal can cancel execution mid-flight. */\n turnAbortController?: AbortController\n /** Arbitrary key-value store for cross-step state. */\n stash?: Record<string, unknown>\n /** The system prompt for this execution. */\n systemPrompt: string | Tokenizable\n /** Standing instructions for this execution. */\n standingInstructions?: (string | Tokenizable)[]\n\n // Pre-fetched data (optional — populates Sets at construction)\n /** Pre-fetched memories to populate the context at construction. */\n memories?: Memory[]\n /** Pre-fetched retrievable records to populate the context at construction. */\n retrievables?: Retrievable[]\n /** Pre-fetched messages to populate the context at construction. */\n messages?: Message[]\n /** Pre-fetched thoughts to populate the context at construction. */\n thoughts?: Thought[]\n /** Pre-fetched tool calls to populate the context at construction. */\n toolCalls?: ToolCall[]\n /** Pre-fetched tools to populate the tool registry at construction. */\n tools?: Tool[]\n\n // Fetch callbacks (required)\n /** Retrieves memories for this execution. */\n fetchMemories: DispatchMemoryRetrievalFn\n /** Retrieves retrievable records for this execution. */\n fetchRetrievables: DispatchRetrievableRetrievalFn\n /** Retrieves messages for this execution. */\n fetchMessages: DispatchMessageRetrievalFn\n /** Retrieves thoughts for this execution. */\n fetchThoughts: DispatchThoughtRetrievalFn\n /** Retrieves tool calls for this execution. */\n fetchToolCalls: DispatchToolCallRetrievalFn\n /** Retrieves tools for this execution. */\n fetchTools: DispatchToolsRetrievalFn\n /** Refreshes and returns standing instructions for this execution. */\n refreshStandingInstructions: DispatchStandingInstructionsRefreshFn\n\n // Mutation callbacks (required — persistence layer; called immediately on every mutation)\n /** Stores a new standing instruction. */\n storeStandingInstruction: DispatchStandingInstructionStoreFn\n /** Updates an existing standing instruction. */\n mutateStandingInstruction: DispatchStandingInstructionMutateFn\n /** Removes a standing instruction. */\n deleteStandingInstruction: DispatchStandingInstructionDeleteFn\n /** Stores a new memory. */\n storeMemory: DispatchMemoryStoreFn\n /** Updates an existing memory. */\n mutateMemory: DispatchMemoryMutateFn\n /** Removes a memory by ID. */\n deleteMemory: DispatchMemoryDeleteFn\n /** Stores a new retrievable record. */\n storeRetrievable: DispatchRetrievableStoreFn\n /** Updates an existing retrievable record. */\n mutateRetrievable: DispatchRetrievableMutateFn\n /** Removes a retrievable record by ID. */\n deleteRetrievable: DispatchRetrievableDeleteFn\n /** Stores a new message. */\n storeMessage: DispatchMessageStoreFn\n /** Updates an existing message. */\n mutateMessage: DispatchMessageMutateFn\n /** Removes a message by ID. */\n deleteMessage: DispatchMessageDeleteFn\n /** Stores a new thought. */\n storeThought: DispatchThoughtStoreFn\n /** Updates an existing thought. */\n mutateThought: DispatchThoughtMutateFn\n /** Removes a thought by ID. */\n deleteThought: DispatchThoughtDeleteFn\n /** Stores a new tool call. */\n storeToolCall: DispatchToolCallStoreFn\n /** Updates an existing tool call. */\n mutateToolCall: DispatchToolCallMutateFn\n /** Removes a tool call by ID. */\n deleteToolCall: DispatchToolCallDeleteFn\n /** Optionally replaces a complete tool-call id group in one transaction. */\n replaceToolCallGroup?: ToolCallGroupReplaceFn\n /** Persists tool-generated media bytes; returns a `MediaReader`. */\n storeMediaBytes: DispatchMediaBytesStoreFn\n /** Persists extracted retrievable text bytes; returns a `SpoolReader`. */\n storeRetrievableBytes: DispatchRetrievableBytesStoreFn\n\n /** Optional hook registrations for emit events. */\n hooks?: DispatchContextHookRegistrations\n /** Optional gate suspension function. When absent, `waitFor` rejects with {@link @nhtio/adk!E_LLM_EXECUTION_GATE_NOT_SUPPORTED}. */\n waitFor?: OpenGateFn\n}\n\nconst rawDispatchContextSchema = validator.object<RawDispatchContext>({\n turnAbortController: validator\n .alternatives(\n validator.object().instance(AbortController as any),\n validator.function().instance(AbortController as any)\n )\n .optional(),\n // eslint-disable-next-line adk/require-validator-any-required -- map value type-arg: stash holds arbitrary values; disposition is set by .default({}) on the object\n stash: validator.object().pattern(validator.string(), validator.any()).default({}),\n systemPrompt: Tokenizable.schema.required(),\n standingInstructions: validator.array().items(Tokenizable.schema).default([]),\n memories: validator.array().default([]),\n retrievables: validator.array().default([]),\n messages: validator.array().default([]),\n thoughts: validator.array().default([]),\n toolCalls: validator.array().default([]),\n tools: validator.array().default([]),\n fetchMemories: validator.function().required(),\n fetchRetrievables: validator.function().required(),\n fetchMessages: validator.function().required(),\n fetchThoughts: validator.function().required(),\n fetchToolCalls: validator.function().required(),\n fetchTools: validator.function().required(),\n refreshStandingInstructions: validator.function().required(),\n storeStandingInstruction: validator.function().required(),\n mutateStandingInstruction: validator.function().required(),\n deleteStandingInstruction: validator.function().required(),\n storeMemory: validator.function().required(),\n mutateMemory: validator.function().required(),\n deleteMemory: validator.function().required(),\n storeRetrievable: validator.function().required(),\n mutateRetrievable: validator.function().required(),\n deleteRetrievable: validator.function().required(),\n storeMessage: validator.function().required(),\n mutateMessage: validator.function().required(),\n deleteMessage: validator.function().required(),\n storeThought: validator.function().required(),\n mutateThought: validator.function().required(),\n deleteThought: validator.function().required(),\n storeToolCall: validator.function().required(),\n mutateToolCall: validator.function().required(),\n deleteToolCall: validator.function().required(),\n replaceToolCallGroup: validator.function().arity(3).optional(),\n storeMediaBytes: validator.function().required(),\n storeRetrievableBytes: validator.function().required(),\n hooks: validator.object().optional(),\n waitFor: validator.function().optional(),\n})\n\n// ── DispatchContext ───────────────────────────────────────────────────────\n\n/**\n * Context object for a single LLM execution call.\n *\n * @remarks\n * Mirrors the surface of {@link @nhtio/adk!TurnContext} but is path-agnostic — it knows nothing about a\n * parent context. Mutations apply to local Sets immediately, call persistence callbacks\n * immediately, and fire the corresponding mutation hook (`storedMemory`, `mutatedMemory`,\n * `deletedMemory`, etc.) in both standalone and derived dispatches.\n *\n * The {@link @nhtio/adk!DispatchRunner} is the only thing that creates a context with a parent\n * relationship: when dispatched with a `source: TurnContext`, the runner subscribes to the\n * mutation hooks, queues deltas internally, and flushes them to the parent's Sets at the end of\n * each iteration. The context itself remains unaware of the parent.\n *\n * Middleware/executor signals termination via {@link DispatchContext.ack} (clean completion)\n * or {@link DispatchContext.nack} (failure). Both set an internal flag the runner reads at\n * end-of-iteration to decide whether to loop or exit. {@link DispatchContext.isSignalled},\n * {@link DispatchContext.isAcked}, and {@link DispatchContext.nackError} are publicly\n * readable getters so middleware can inspect signal state and bail early.\n */\nexport class DispatchContext {\n #id: string\n #dispatchId: string\n #iteration: number\n #turnAbortController: AbortController\n #stash: Registry\n #systemPrompt: Tokenizable\n #standingInstructions: Set<Tokenizable>\n #turnMemories: Set<Memory>\n #turnRetrievables: Set<Retrievable>\n #turnMessages: Set<Message>\n #turnThoughts: Set<Thought>\n #turnToolCalls: Set<ToolCall>\n #tools: ToolRegistry\n #hooks: Hooks<DispatchContextHooks>\n #ackHandlers: Set<() => void>\n\n // Persistence callbacks\n #fetchMemories: DispatchMemoryRetrievalFn\n #fetchRetrievables: DispatchRetrievableRetrievalFn\n #fetchMessages: DispatchMessageRetrievalFn\n #fetchThoughts: DispatchThoughtRetrievalFn\n #fetchToolCalls: DispatchToolCallRetrievalFn\n #fetchTools: DispatchToolsRetrievalFn\n #refreshStandingInstructions: DispatchStandingInstructionsRefreshFn\n #storeStandingInstruction: DispatchStandingInstructionStoreFn\n #mutateStandingInstruction: DispatchStandingInstructionMutateFn\n #deleteStandingInstruction: DispatchStandingInstructionDeleteFn\n #storeMemory: DispatchMemoryStoreFn\n #mutateMemory: DispatchMemoryMutateFn\n #deleteMemory: DispatchMemoryDeleteFn\n #storeRetrievable: DispatchRetrievableStoreFn\n #mutateRetrievable: DispatchRetrievableMutateFn\n #deleteRetrievable: DispatchRetrievableDeleteFn\n #storeMessage: DispatchMessageStoreFn\n #mutateMessage: DispatchMessageMutateFn\n #deleteMessage: DispatchMessageDeleteFn\n #storeThought: DispatchThoughtStoreFn\n #mutateThought: DispatchThoughtMutateFn\n #deleteThought: DispatchThoughtDeleteFn\n #storeToolCall: DispatchToolCallStoreFn\n #mutateToolCall: DispatchToolCallMutateFn\n #deleteToolCall: DispatchToolCallDeleteFn\n #replaceToolCallGroup: ToolCallGroupReplaceFn | undefined\n #storeMediaBytes: DispatchMediaBytesStoreFn\n #storeRetrievableBytes: DispatchRetrievableBytesStoreFn\n #waitFor: OpenGateFn | undefined\n\n // Checksum frequency index for this execution\n #toolCallChecksums: Map<string, number>\n\n // Termination signal state\n #signalled: 'ack' | 'nack' | undefined\n #nackError: Error | undefined\n\n /**\n * @param raw - Raw input validated against the schema.\n * @throws {@link @nhtio/adk!E_INVALID_LLM_EXECUTION_CONTEXT} when `raw` does not satisfy the schema.\n */\n constructor(raw: RawDispatchContext) {\n let resolved: RawDispatchContext & {\n stash: Record<string, unknown>\n standingInstructions: (string | Tokenizable)[]\n memories: Memory[]\n retrievables: Retrievable[]\n messages: Message[]\n thoughts: Thought[]\n toolCalls: ToolCall[]\n tools: Tool[]\n }\n try {\n resolved = validateOrThrow(rawDispatchContextSchema, raw, true) as typeof resolved\n } catch (err) {\n throw new E_INVALID_LLM_EXECUTION_CONTEXT({ cause: isError(err) ? err : undefined })\n }\n\n this.#id = uuidv6()\n this.#dispatchId = ''\n this.#iteration = 0\n this.#turnAbortController = resolved.turnAbortController ?? new AbortController()\n this.#stash = new Registry(resolved.stash)\n this.#systemPrompt = Tokenizable.isTokenizable(resolved.systemPrompt)\n ? resolved.systemPrompt\n : new Tokenizable(resolved.systemPrompt)\n this.#standingInstructions = new Set(\n resolved.standingInstructions.map((i) =>\n Tokenizable.isTokenizable(i) ? i : new Tokenizable(i)\n )\n )\n this.#turnMemories = new Set(resolved.memories)\n this.#turnRetrievables = new Set(resolved.retrievables)\n this.#turnMessages = new Set(resolved.messages)\n this.#turnThoughts = new Set(resolved.thoughts)\n this.#turnToolCalls = new Set(resolved.toolCalls)\n this.#tools = new ToolRegistry(resolved.tools)\n this.#toolCallChecksums = new Map()\n for (const tc of resolved.toolCalls) {\n const prev = this.#toolCallChecksums.get(tc.checksum) ?? 0\n this.#toolCallChecksums.set(tc.checksum, prev + 1)\n }\n\n this.#fetchMemories = resolved.fetchMemories\n this.#fetchRetrievables = resolved.fetchRetrievables\n this.#fetchMessages = resolved.fetchMessages\n this.#fetchThoughts = resolved.fetchThoughts\n this.#fetchToolCalls = resolved.fetchToolCalls\n this.#fetchTools = resolved.fetchTools\n this.#refreshStandingInstructions = resolved.refreshStandingInstructions\n this.#storeStandingInstruction = resolved.storeStandingInstruction\n this.#mutateStandingInstruction = resolved.mutateStandingInstruction\n this.#deleteStandingInstruction = resolved.deleteStandingInstruction\n this.#storeMemory = resolved.storeMemory\n this.#mutateMemory = resolved.mutateMemory\n this.#deleteMemory = resolved.deleteMemory\n this.#storeRetrievable = resolved.storeRetrievable\n this.#mutateRetrievable = resolved.mutateRetrievable\n this.#deleteRetrievable = resolved.deleteRetrievable\n this.#storeMessage = resolved.storeMessage\n this.#mutateMessage = resolved.mutateMessage\n this.#deleteMessage = resolved.deleteMessage\n this.#storeThought = resolved.storeThought\n this.#mutateThought = resolved.mutateThought\n this.#deleteThought = resolved.deleteThought\n this.#storeToolCall = resolved.storeToolCall\n this.#mutateToolCall = resolved.mutateToolCall\n this.#deleteToolCall = resolved.deleteToolCall\n this.#replaceToolCallGroup = resolved.replaceToolCallGroup\n this.#storeMediaBytes = resolved.storeMediaBytes\n this.#storeRetrievableBytes = resolved.storeRetrievableBytes\n this.#waitFor = resolved.waitFor\n\n this.#signalled = undefined\n this.#nackError = undefined\n\n // Register hooks\n this.#hooks = new Hooks<DispatchContextHooks>()\n this.#ackHandlers = new Set()\n if (resolved.hooks) {\n const regs = resolved.hooks\n for (const key of Object.keys(regs) as (keyof DispatchContextHooks)[]) {\n const entry = regs[key]\n if (!entry) continue\n const handlers = Array.isArray(entry) ? entry : [entry]\n for (const h of handlers) {\n this.#hooks.add(key, h as any)\n }\n }\n }\n\n Object.defineProperties(this, {\n id: {\n get: () => this.#id,\n enumerable: true,\n configurable: false,\n },\n dispatchId: {\n get: () => this.#dispatchId,\n enumerable: true,\n configurable: false,\n },\n iteration: {\n get: () => this.#iteration,\n enumerable: true,\n configurable: false,\n },\n aborted: {\n get: () => Boolean(this.#turnAbortController.signal.aborted),\n enumerable: true,\n configurable: false,\n },\n abortSignal: {\n get: () => this.#turnAbortController.signal,\n enumerable: true,\n configurable: false,\n },\n abort: {\n value: (reason?: unknown) => this.#turnAbortController.abort(reason),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n isSignalled: {\n get: () => this.#signalled !== undefined,\n enumerable: true,\n configurable: false,\n },\n isAcked: {\n get: () => this.#signalled === 'ack',\n enumerable: true,\n configurable: false,\n },\n nackError: {\n get: () => this.#nackError,\n enumerable: true,\n configurable: false,\n },\n stash: {\n get: () => this.#stash,\n enumerable: true,\n configurable: false,\n },\n systemPrompt: {\n get: () => this.#systemPrompt,\n enumerable: true,\n configurable: false,\n },\n standingInstructions: {\n get: () => this.#standingInstructions,\n enumerable: true,\n configurable: false,\n },\n turnMemories: {\n get: () => this.#turnMemories,\n enumerable: true,\n configurable: false,\n },\n turnRetrievables: {\n get: () => this.#turnRetrievables,\n enumerable: true,\n configurable: false,\n },\n turnMessages: {\n get: () => this.#turnMessages,\n enumerable: true,\n configurable: false,\n },\n turnThoughts: {\n get: () => this.#turnThoughts,\n enumerable: true,\n configurable: false,\n },\n turnToolCalls: {\n get: () => this.#turnToolCalls,\n enumerable: true,\n configurable: false,\n },\n tools: {\n get: () => this.#tools,\n enumerable: true,\n configurable: false,\n },\n fetchMemories: {\n value: () => this.#fetchMemories(this),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n fetchRetrievables: {\n value: async () => {\n const recs = await this.#fetchRetrievables(this)\n assertUniqueRetrievableIds(recs)\n return Promise.all(recs.map((r) => autoSpoolRetrievable(this, r)))\n },\n enumerable: true,\n configurable: false,\n writable: false,\n },\n fetchMessages: {\n value: () => this.#fetchMessages(this),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n fetchThoughts: {\n value: () => this.#fetchThoughts(this),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n fetchToolCalls: {\n value: () => this.#fetchToolCalls(this),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n fetchTools: {\n value: () => this.#fetchTools(this),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n refreshStandingInstructions: {\n value: () => this.#refreshStandingInstructions(this),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n storeStandingInstruction: {\n value: (v: string | Tokenizable) => this.#doStoreStandingInstruction(v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n mutateStandingInstruction: {\n value: (v: string | Tokenizable) => this.#doMutateStandingInstruction(v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n deleteStandingInstruction: {\n value: (v: string | Tokenizable) => this.#doDeleteStandingInstruction(v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n storeMemory: {\n value: (v: Memory) => this.#doStoreMemory(v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n mutateMemory: {\n value: (v: Memory) => this.#doMutateMemory(v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n deleteMemory: {\n value: (id: string) => this.#doDeleteMemory(id),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n storeRetrievable: {\n value: (v: Retrievable) => this.#doStoreRetrievable(v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n mutateRetrievable: {\n value: (v: Retrievable) => this.#doMutateRetrievable(v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n deleteRetrievable: {\n value: (id: string) => this.#doDeleteRetrievable(id),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n storeMessage: {\n value: (v: Message) => this.#doStoreMessage(v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n mutateMessage: {\n value: (v: Message) => this.#doMutateMessage(v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n deleteMessage: {\n value: (id: string) => this.#doDeleteMessage(id),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n storeThought: {\n value: (v: Thought) => this.#doStoreThought(v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n mutateThought: {\n value: (v: Thought) => this.#doMutateThought(v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n deleteThought: {\n value: (id: string) => this.#doDeleteThought(id),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n storeToolCall: {\n value: (v: ToolCall) => this.#doStoreToolCall(v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n mutateToolCall: {\n value: (v: ToolCall) => this.#doMutateToolCall(v),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n deleteToolCall: {\n value: (id: string) => this.#doDeleteToolCall(id),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n replaceToolCallGroup: {\n value: (ids: readonly string[], replacements: readonly ToolCall[]) =>\n this.#doReplaceToolCallGroup(ids, replacements),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n storeMediaBytes: {\n value: (id: string, bytes: ConduitBytes) => this.#storeMediaBytes(this, id, bytes),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n storeRetrievableBytes: {\n value: (id: string, bytes: ConduitBytes) => this.#storeRetrievableBytes(this, id, bytes),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n emitMessage: {\n value: (content: Parameters<EmitMessageFn>[0]) => {\n void this.#hooks.runner('message').run(content)\n },\n enumerable: true,\n configurable: false,\n writable: false,\n },\n emitThought: {\n value: (content: Parameters<EmitThoughtFn>[0]) => {\n void this.#hooks.runner('thought').run(content)\n },\n enumerable: true,\n configurable: false,\n writable: false,\n },\n emitToolCall: {\n value: (content: Parameters<EmitToolCallFn>[0]) => {\n void this.#hooks.runner('toolCall').run(content)\n },\n enumerable: true,\n configurable: false,\n writable: false,\n },\n emitToolExecutionStart: {\n value: (event: Parameters<EmitToolExecutionStartFn>[0]) => {\n void this.#hooks.runner('toolExecutionStart').run(event)\n },\n enumerable: true,\n configurable: false,\n writable: false,\n },\n emitToolExecutionEnd: {\n value: (event: Parameters<EmitToolExecutionEndFn>[0]) => {\n void this.#hooks.runner('toolExecutionEnd').run(event)\n },\n enumerable: true,\n configurable: false,\n writable: false,\n },\n waitFor: {\n value: <T>(gateRaw: Parameters<OpenGateFn>[0]): Promise<T> => {\n if (!this.#waitFor) {\n return Promise.reject(new E_LLM_EXECUTION_GATE_NOT_SUPPORTED())\n }\n return this.#waitFor<T>(gateRaw)\n },\n enumerable: true,\n configurable: false,\n writable: false,\n },\n })\n }\n\n // ── Mutation helpers ──────────────────────────────────────────────────────\n\n async #doStoreStandingInstruction(v: string | Tokenizable): Promise<void> {\n const t = Tokenizable.isTokenizable(v) ? v : new Tokenizable(v)\n this.#standingInstructions.add(t)\n await this.#storeStandingInstruction(this, v)\n void this.#hooks.runner('storedStandingInstruction').run(t)\n }\n\n async #doMutateStandingInstruction(v: string | Tokenizable): Promise<void> {\n const t = Tokenizable.isTokenizable(v) ? v : new Tokenizable(v)\n this.#standingInstructions.add(t)\n await this.#mutateStandingInstruction(this, v)\n void this.#hooks.runner('mutatedStandingInstruction').run(t)\n }\n\n async #doDeleteStandingInstruction(v: string | Tokenizable): Promise<void> {\n const t = Tokenizable.isTokenizable(v) ? v : new Tokenizable(v)\n this.#standingInstructions.delete(t)\n await this.#deleteStandingInstruction(this, v)\n void this.#hooks.runner('deletedStandingInstruction').run(t)\n }\n\n async #doStoreMemory(v: Memory): Promise<void> {\n this.#turnMemories.add(v)\n await this.#storeMemory(this, v)\n void this.#hooks.runner('storedMemory').run(v)\n }\n\n /**\n * Replaces every member of `set` sharing `id` with `replacement`, preserving the ORIGINAL\n * insertion position of the first match rather than appending at the end.\n *\n * @remarks\n * `Set.add()` compares by reference, not id — a mutated instance is a NEW object, so the stale\n * instance(s) must be found and removed or they coexist with the replacement forever. ALL\n * matches are removed, not just the first: `store*` never deduplicated ids either, so more than\n * one stale copy can already exist before a mutation runs. Rebuilding the Set (rather than\n * `delete` + `add`) additionally preserves insertion-order position: several adapters, and this\n * battery's own {@link @nhtio/adk!buildOrderingTimeline}-style helpers, use Set iteration order\n * as the deterministic tie-break for primitives sharing an identical timestamp — silently moving\n * a mutated primitive to the end of iteration order would change that tie-break for no reason\n * tied to the mutation's actual content.\n */\n #replaceById<T extends { id: string }>(set: Set<T>, id: string, replacement: T): Set<T> {\n const next = new Set<T>()\n let inserted = false\n for (const existing of set) {\n if ((existing as any).id === id) {\n if (!inserted) {\n next.add(replacement)\n inserted = true\n }\n continue\n }\n next.add(existing)\n }\n if (!inserted) next.add(replacement)\n return next\n }\n\n async #doMutateMemory(v: Memory): Promise<void> {\n this.#turnMemories = this.#replaceById(this.#turnMemories, (v as any).id, v)\n await this.#mutateMemory(this, v)\n void this.#hooks.runner('mutatedMemory').run(v)\n }\n\n async #doDeleteMemory(id: string): Promise<void> {\n for (const m of this.#turnMemories) {\n if ((m as any).id === id) {\n this.#turnMemories.delete(m)\n break\n }\n }\n await this.#deleteMemory(this, id)\n void this.#hooks.runner('deletedMemory').run(id)\n }\n\n #checkArtifactIdCollision(id: string, source: 'retrievable' | 'toolCall'): void {\n const other = source === 'retrievable' ? this.#turnToolCalls : this.#turnRetrievables\n if ([...other].some((v) => v.id === id)) throw new E_ARTIFACT_ID_COLLISION([id])\n }\n\n async #doStoreRetrievable(v: Retrievable): Promise<Retrievable> {\n this.#checkArtifactIdCollision(v.id, 'retrievable')\n const record = await autoSpoolRetrievable(this, v)\n this.#turnRetrievables.add(record)\n await this.#storeRetrievable(this, record)\n void this.#hooks.runner('storedRetrievable').run(record)\n return record\n }\n\n async #doMutateRetrievable(v: Retrievable): Promise<Retrievable> {\n this.#checkArtifactIdCollision(v.id, 'retrievable')\n const record = await autoSpoolRetrievable(this, v)\n this.#turnRetrievables = this.#replaceById(this.#turnRetrievables, record.id, record)\n await this.#mutateRetrievable(this, record)\n void this.#hooks.runner('mutatedRetrievable').run(record)\n return record\n }\n\n async #doDeleteRetrievable(id: string): Promise<void> {\n for (const r of this.#turnRetrievables) {\n if ((r as any).id === id) {\n this.#turnRetrievables.delete(r)\n break\n }\n }\n await this.#deleteRetrievable(this, id)\n void this.#hooks.runner('deletedRetrievable').run(id)\n }\n\n async #doStoreMessage(v: Message): Promise<void> {\n this.#turnMessages.add(v)\n await this.#storeMessage(this, v)\n void this.#hooks.runner('storedMessage').run(v)\n }\n\n async #doMutateMessage(v: Message): Promise<void> {\n this.#turnMessages = this.#replaceById(this.#turnMessages, (v as any).id, v)\n await this.#mutateMessage(this, v)\n void this.#hooks.runner('mutatedMessage').run(v)\n }\n\n async #doDeleteMessage(id: string): Promise<void> {\n for (const m of this.#turnMessages) {\n if ((m as any).id === id) {\n this.#turnMessages.delete(m)\n break\n }\n }\n await this.#deleteMessage(this, id)\n void this.#hooks.runner('deletedMessage').run(id)\n }\n\n async #doStoreThought(v: Thought): Promise<void> {\n this.#turnThoughts.add(v)\n await this.#storeThought(this, v)\n void this.#hooks.runner('storedThought').run(v)\n }\n\n async #doMutateThought(v: Thought): Promise<void> {\n this.#turnThoughts = this.#replaceById(this.#turnThoughts, (v as any).id, v)\n await this.#mutateThought(this, v)\n void this.#hooks.runner('mutatedThought').run(v)\n }\n\n async #doDeleteThought(id: string): Promise<void> {\n for (const t of this.#turnThoughts) {\n if ((t as any).id === id) {\n this.#turnThoughts.delete(t)\n break\n }\n }\n await this.#deleteThought(this, id)\n void this.#hooks.runner('deletedThought').run(id)\n }\n\n async #doStoreToolCall(v: ToolCall): Promise<void> {\n this.#checkArtifactIdCollision(v.id, 'toolCall')\n this.#turnToolCalls.add(v)\n const prev = this.#toolCallChecksums.get(v.checksum) ?? 0\n this.#toolCallChecksums.set(v.checksum, prev + 1)\n await this.#storeToolCall(this, v)\n void this.#hooks.runner('storedToolCall').run(v)\n }\n\n async #doMutateToolCall(v: ToolCall): Promise<void> {\n this.#checkArtifactIdCollision(v.id, 'toolCall')\n // Checksum is over tool+args, which the ORDINARY case does not change on mutation — but that\n // is a convention, not an enforced invariant: a caller can construct a replacement with a\n // different checksum (different tool/args). Reconcile #toolCallChecksums against every\n // displaced instance's ACTUAL checksum (decrement) before crediting the replacement's\n // (increment), the same way #doDeleteToolCall/#doStoreToolCall do — otherwise the map\n // silently drifts out of sync with what #turnToolCalls really contains.\n for (const tc of this.#turnToolCalls) {\n if ((tc as any).id === (v as any).id) {\n const count = this.#toolCallChecksums.get(tc.checksum) ?? 1\n if (count <= 1) this.#toolCallChecksums.delete(tc.checksum)\n else this.#toolCallChecksums.set(tc.checksum, count - 1)\n }\n }\n const prev = this.#toolCallChecksums.get(v.checksum) ?? 0\n this.#toolCallChecksums.set(v.checksum, prev + 1)\n this.#turnToolCalls = this.#replaceById(this.#turnToolCalls, (v as any).id, v)\n await this.#mutateToolCall(this, v)\n void this.#hooks.runner('mutatedToolCall').run(v)\n }\n\n async #doDeleteToolCall(id: string): Promise<void> {\n for (const tc of this.#turnToolCalls) {\n if ((tc as any).id === id) {\n this.#turnToolCalls.delete(tc)\n const count = this.#toolCallChecksums.get(tc.checksum) ?? 1\n if (count <= 1) this.#toolCallChecksums.delete(tc.checksum)\n else this.#toolCallChecksums.set(tc.checksum, count - 1)\n break\n }\n }\n await this.#deleteToolCall(this, id)\n void this.#hooks.runner('deletedToolCall').run(id)\n }\n\n /**\n * Replaces an entire colliding id group. Persistence commits before local state is changed so a\n * failed write cannot leave the context half-renamed. The fallback deletes every member before\n * storing any replacement: a consumer-side `DELETE WHERE id` must not remove a newly stored row.\n */\n async #doReplaceToolCallGroup(\n ids: readonly string[],\n replacements: readonly ToolCall[]\n ): Promise<void> {\n if (this.#replaceToolCallGroup) {\n await this.#replaceToolCallGroup(this, ids, replacements)\n } else {\n const deletedIds: string[] = []\n try {\n for (const id of ids) {\n await this.#deleteToolCall(this, id)\n deletedIds.push(id)\n }\n for (const replacement of replacements) await this.#storeToolCall(this, replacement)\n } catch (error) {\n if (isError(error)) {\n ;(error as Error & { deletedIds: string[] }).deletedIds = [...deletedIds]\n }\n throw error\n }\n }\n\n const idSet = new Set(ids)\n const next = new Set<ToolCall>()\n let inserted = false\n for (const tc of this.#turnToolCalls) {\n if (idSet.has(tc.id)) {\n if (!inserted) {\n for (const replacement of replacements) next.add(replacement)\n inserted = true\n }\n } else next.add(tc)\n }\n if (!inserted) for (const replacement of replacements) next.add(replacement)\n this.#turnToolCalls = next\n // Recompute rather than reuse mutate/delete accounting: collisions can double-count a checksum.\n this.#toolCallChecksums = new Map()\n for (const tc of this.#turnToolCalls) {\n this.#toolCallChecksums.set(tc.checksum, (this.#toolCallChecksums.get(tc.checksum) ?? 0) + 1)\n }\n for (const id of ids) void this.#hooks.runner('deletedToolCall').run(id)\n for (const replacement of replacements)\n void this.#hooks.runner('storedToolCall').run(replacement)\n }\n\n // ── Internal setters (used by DispatchRunner) ─────────────────────────\n\n /** @internal Set by {@link @nhtio/adk!DispatchRunner} after construction. */\n _setDispatchId(id: string): void {\n this.#dispatchId = id\n }\n\n /** @internal Updated by {@link @nhtio/adk!DispatchRunner} on each iteration. */\n _setIteration(n: number): void {\n this.#iteration = n\n }\n\n /** @internal Accessor used by {@link @nhtio/adk!DispatchRunner} to register forwarding handlers. */\n _getHooks(): Hooks<DispatchContextHooks> {\n return this.#hooks\n }\n\n // ── Public API ────────────────────────────────────────────────────────────\n\n /**\n * Returns how many times a tool call with the given checksum has been stored in this execution.\n *\n * @remarks\n * Checksums are computed over `tool + args` (see {@link @nhtio/adk!ToolCall.checksum}). This count lets\n * the executor detect repeat invocations of the same call without scanning the full Set.\n * Returns `0` when the checksum has not been seen.\n *\n * @param checksum - The `ToolCall.checksum` value to look up.\n */\n toolCallCount(checksum: string): number {\n return this.#toolCallChecksums.get(checksum) ?? 0\n }\n\n /**\n * Signals successful completion of this execution.\n *\n * @remarks\n * Sets the context's internal signal flag. The {@link @nhtio/adk!DispatchRunner} reads the flag at the\n * end of each iteration to decide whether to loop or exit. Calling `ack()` does NOT abort the\n * current iteration — the current pipeline and flush complete first.\n *\n * @throws {@link @nhtio/adk!E_LLM_EXECUTION_ALREADY_SIGNALLED} when the context has already been signalled\n * (whether via `ack()` or `nack()`).\n */\n ack(): void {\n if (this.#signalled !== undefined) {\n throw new E_LLM_EXECUTION_ALREADY_SIGNALLED()\n }\n this.#signalled = 'ack'\n // Sync iteration — handlers must observe each other's side-effects in registration order\n // (e.g. ToolRegistry.bindContext relies on this for ephemeral pruning). The hook bus is\n // unsuitable here because its `await` between handlers reorders sync side-effects via\n // microtask queuing.\n for (const handler of this.#ackHandlers) {\n try {\n handler()\n } catch {\n // Swallow individual handler errors so one misbehaving subscriber can't prevent the\n // others from running. Ack itself has already succeeded.\n }\n }\n }\n\n /**\n * Registers a handler to run when this context completes successfully via {@link ack}.\n *\n * @remarks\n * The handler does NOT fire on {@link nack} — failed executor runs should leave any\n * ack-tied subscriptions alone so the consumer can inspect what was registered when\n * debugging the failure. Returns an unsubscribe function; subscriptions are short-lived\n * and die with the context regardless.\n *\n * The canonical consumer is `ToolRegistry.bindContext(ctx)`, which uses this hook to drop\n * ephemeral tools (notably forged artifact-query tools from `SpooledArtifact.forgeTools(ctx)`)\n * at ctx-completion. Consumers may also register custom handlers here for any per-executor\n * cleanup.\n *\n * @param handler - Callback invoked when `ack()` is called.\n * @returns An unsubscribe function that removes the handler.\n *\n * @see {@link @nhtio/adk!ToolRegistry.bindContext}\n * @see {@link @nhtio/adk!SpooledArtifact.forgeTools}\n */\n onAck(handler: () => void): () => void {\n this.#ackHandlers.add(handler)\n return () => {\n this.#ackHandlers.delete(handler)\n }\n }\n\n /**\n * Signals failed completion of this execution, optionally with an error.\n *\n * @remarks\n * Sets the context's internal signal flag and stores the error. The {@link @nhtio/adk!DispatchRunner}\n * reads the flag at the end of each iteration and surfaces the error via the `dispatchEnd`\n * observability payload and as the rejection reason of `dispatch()`. Calling `nack()` does NOT\n * abort the current iteration — the current pipeline and flush complete first.\n *\n * @param error - Optional error describing the failure. If omitted, a generic Error is used.\n * @throws {@link @nhtio/adk!E_LLM_EXECUTION_ALREADY_SIGNALLED} when the context has already been signalled.\n */\n nack(error?: Error): void {\n if (this.#signalled !== undefined) {\n throw new E_LLM_EXECUTION_ALREADY_SIGNALLED()\n }\n this.#signalled = 'nack'\n this.#nackError = error ?? new Error('LLM execution was nacked without an explicit error.')\n }\n\n /**\n * Returns `true` if `value` is a {@link DispatchContext} instance.\n *\n * @remarks\n * Uses {@link @nhtio/adk!isInstanceOf} for cross-realm safety. The ADK does not export the\n * `DispatchContext` class itself as a constructable value — use this guard plus the\n * {@link DispatchContext} type for runtime detection and TypeScript narrowing.\n *\n * @param value - The value to test.\n * @returns `true` when `value` is a {@link DispatchContext} instance.\n */\n public static isDispatchContext(value: unknown): value is DispatchContext {\n return isInstanceOf(value, 'DispatchContext', DispatchContext)\n }\n\n // ── declare readonly (TypeScript public surface) ──────────────────────────\n\n /** Unique identifier for this execution context, generated as UUIDv6 at construction time. */\n declare readonly id: string\n /** Stable identifier for the dispatch this context belongs to; set by `DispatchRunner`. */\n declare readonly dispatchId: string\n /** 0-based iteration count within the current dispatch; updated by `DispatchRunner`. */\n declare readonly iteration: number\n /** `true` when the abort controller signal has fired. */\n declare readonly aborted: boolean\n /** The `AbortSignal` from the execution's `AbortController`. */\n declare readonly abortSignal: AbortSignal\n /**\n * Aborts the dispatch's `AbortController` with the supplied reason. Middleware should call this\n * when refusing to proceed — the runner short-circuits cleanly, `dispatchEnd.status` resolves\n * to `'aborted'`, and no `error` event is emitted.\n */\n declare readonly abort: (reason?: unknown) => void\n /** `true` once {@link DispatchContext.ack} or {@link DispatchContext.nack} has been called. */\n declare readonly isSignalled: boolean\n /** `true` when the context was signalled via {@link DispatchContext.ack}. */\n declare readonly isAcked: boolean\n /** The error stored by {@link DispatchContext.nack}, or `undefined` if not nacked. */\n declare readonly nackError: Error | undefined\n /** Arbitrary key-value store for cross-step state. */\n declare readonly stash: Registry\n /** The system prompt for this execution. */\n declare readonly systemPrompt: Tokenizable\n /** Standing instructions for this execution, in insertion order. */\n declare readonly standingInstructions: Set<Tokenizable>\n /** Memories loaded for this execution. */\n declare readonly turnMemories: Set<Memory>\n /** Retrievable records loaded for this execution. */\n declare readonly turnRetrievables: Set<Retrievable>\n /** Messages loaded for this execution. */\n declare readonly turnMessages: Set<Message>\n /** Thoughts loaded for this execution. */\n declare readonly turnThoughts: Set<Thought>\n /** Tool calls loaded for this execution. */\n declare readonly turnToolCalls: Set<ToolCall>\n /** Tool registry for this execution. */\n declare readonly tools: ToolRegistry\n /** Fetches memories; delegates to the callback supplied at construction. */\n declare readonly fetchMemories: () => Memory[] | Promise<Memory[]>\n /** Fetches retrievable records; delegates to the callback supplied at construction. */\n declare readonly fetchRetrievables: () => Retrievable[] | Promise<Retrievable[]>\n /** Fetches messages; delegates to the callback supplied at construction. */\n declare readonly fetchMessages: () => Message[] | Promise<Message[]>\n /** Fetches thoughts; delegates to the callback supplied at construction. */\n declare readonly fetchThoughts: () => Thought[] | Promise<Thought[]>\n /** Fetches tool calls; delegates to the callback supplied at construction. */\n declare readonly fetchToolCalls: () => ToolCall[] | Promise<ToolCall[]>\n /** Fetches tools; delegates to the callback supplied at construction. */\n declare readonly fetchTools: () => Tool[] | Promise<Tool[]>\n /** Refreshes and returns standing instructions. */\n declare readonly refreshStandingInstructions: () =>\n | (string | Tokenizable)[]\n | Promise<(string | Tokenizable)[]>\n /** Stores a new standing instruction in the local Set and persistence layer. */\n declare readonly storeStandingInstruction: (v: string | Tokenizable) => Promise<void>\n /** Updates an existing standing instruction in the local Set and persistence layer. */\n declare readonly mutateStandingInstruction: (v: string | Tokenizable) => Promise<void>\n /** Removes a standing instruction from the local Set and persistence layer. */\n declare readonly deleteStandingInstruction: (v: string | Tokenizable) => Promise<void>\n /** Stores a new memory in the local Set and persistence layer. */\n declare readonly storeMemory: (v: Memory) => Promise<void>\n /** Updates an existing memory in the local Set and persistence layer. */\n declare readonly mutateMemory: (v: Memory) => Promise<void>\n /** Removes a memory from the local Set and persistence layer by ID. */\n declare readonly deleteMemory: (id: string) => Promise<void>\n /** Stores a new retrievable record in the local Set and persistence layer. */\n declare readonly storeRetrievable: (v: Retrievable) => Promise<Retrievable>\n /** Updates an existing retrievable record in the local Set and persistence layer. */\n declare readonly mutateRetrievable: (v: Retrievable) => Promise<Retrievable>\n /** Removes a retrievable record from the local Set and persistence layer by ID. */\n declare readonly deleteRetrievable: (id: string) => Promise<void>\n /** Stores a new message in the local Set and persistence layer. */\n declare readonly storeMessage: (v: Message) => Promise<void>\n /** Updates an existing message in the local Set and persistence layer. */\n declare readonly mutateMessage: (v: Message) => Promise<void>\n /** Removes a message from the local Set and persistence layer by ID. */\n declare readonly deleteMessage: (id: string) => Promise<void>\n /** Stores a new thought in the local Set and persistence layer. */\n declare readonly storeThought: (v: Thought) => Promise<void>\n /** Updates an existing thought in the local Set and persistence layer. */\n declare readonly mutateThought: (v: Thought) => Promise<void>\n /** Removes a thought from the local Set and persistence layer by ID. */\n declare readonly deleteThought: (id: string) => Promise<void>\n /** Stores a new tool call in the local Set and persistence layer. */\n declare readonly storeToolCall: (v: ToolCall) => Promise<void>\n /** Updates an existing tool call in the local Set and persistence layer. */\n declare readonly mutateToolCall: (v: ToolCall) => Promise<void>\n /** Removes a tool call from the local Set and persistence layer by ID. */\n declare readonly deleteToolCall: (id: string) => Promise<void>\n /** Replaces a complete colliding tool-call group and persists the replacement. */\n declare readonly replaceToolCallGroup: (\n ids: readonly string[],\n replacements: readonly ToolCall[]\n ) => Promise<void>\n /**\n * Persists tool-generated media bytes into consumer storage and returns a {@link @nhtio/adk!MediaReader}.\n *\n * @remarks\n * This is a low-level persistence conduit, NOT a mutation: it does not add to `turnMessages`/\n * `turnToolCalls` or fire a `stored*` hook. The handler builds a {@link @nhtio/adk!Media} from the\n * returned reader (`Media.toolGenerated({ reader })`) and stores the owning primitive — a\n * {@link @nhtio/adk!Message} attachment or {@link @nhtio/adk!ToolCall} result — via the relevant\n * `store*` method separately. Persisting bytes without storing the primitive means the framework\n * never sees the media.\n */\n declare readonly storeMediaBytes: (\n id: string,\n bytes: ConduitBytes\n ) => MediaReader | Promise<MediaReader>\n /**\n * Persists extracted retrievable text bytes into consumer storage and returns a\n * {@link @nhtio/adk!SpoolReader}.\n *\n * @remarks\n * Low-level persistence conduit, same posture as {@link DispatchContext.storeMediaBytes}: returns a\n * value, touches no Sets, fires no hook. Wrap the reader in a {@link @nhtio/adk!SpooledArtifact} and\n * pass it as `Retrievable.content`, then persist the record via {@link DispatchContext.storeRetrievable}.\n */\n declare readonly storeRetrievableBytes: (\n id: string,\n bytes: ConduitBytes\n ) => SpoolReader | Promise<SpoolReader>\n /** Emits a `message` hook; fires registered handlers synchronously. */\n declare readonly emitMessage: EmitMessageFn\n /** Emits a `thought` hook; fires registered handlers synchronously. */\n declare readonly emitThought: EmitThoughtFn\n /** Emits a `toolCall` hook; fires registered handlers synchronously. */\n declare readonly emitToolCall: EmitToolCallFn\n /** Emits a `toolExecutionStart` hook; fires registered handlers synchronously. */\n declare readonly emitToolExecutionStart: EmitToolExecutionStartFn\n /** Emits a `toolExecutionEnd` hook; fires registered handlers synchronously. */\n declare readonly emitToolExecutionEnd: EmitToolExecutionEndFn\n /** Opens a gate and suspends until it resolves, rejects, times out, or is aborted. */\n declare readonly waitFor: OpenGateFn\n}\n","import { DateTime } from 'luxon'\nimport { sha256 } from 'js-sha256'\nimport { v6 as uuidv6 } from 'uuid'\nimport { Hooks } from '@nhtio/hooks'\nimport { validator } from '@nhtio/validation'\nimport { Middleware } from '@nhtio/middleware'\nimport { validateOrThrow } from './utils/validation'\nimport { isError, isInstanceOf } from './utils/guards'\nimport { ToolRegistry } from './classes/tool_registry'\nimport { canonicalStringify } from './utils/canonical_json'\nimport { SpooledArtifact } from './classes/spooled_artifact'\nimport { TurnContext } from './contracts/turn_runner_context'\nimport { DispatchContext } from './contracts/dispatch_context'\nimport { normalizeRetrievables } from './utils/retrievable_spool'\nimport { runWithEstimationWarnings } from './utils/estimation_context'\nimport {\n E_INVALID_LLM_DISPATCH_INPUT,\n E_DISPATCH_PIPELINE_ERROR,\n E_LLM_EXECUTION_EXECUTOR_ERROR,\n E_PIPELINE_SHORT_CIRCUITED,\n} from './exceptions/runtime'\nimport type { Memory } from './classes/memory'\nimport type { Message } from './classes/message'\nimport type { Thought } from './classes/thought'\nimport type { ToolCall } from './classes/tool_call'\nimport type { Retrievable } from './classes/retrievable'\nimport type { Tokenizable } from './classes/tokenizable'\nimport type { BaseException } from './classes/base_exception'\nimport type { EstimationWarning } from './utils/estimation_context'\nimport type { Runner as MiddlewareRunner } from '@nhtio/middleware'\nimport type { RawDispatchContext } from './contracts/dispatch_context'\nimport type { TurnStreamableContent, TurnToolCallContent } from './types/turn_runner'\nimport type {\n DispatchPipelineMiddlewareFn,\n DispatchExecutorFn,\n DispatchExecutorHelpers,\n DispatchExecutorLogChannel,\n DispatchExecutorLogEntry,\n DispatchExecutorLogLevel,\n LogEvent,\n WarningEvent,\n GenerationStats,\n GenerationStatsEvent,\n ContextDelta,\n DispatchRunnerFunctionalHooks,\n DispatchRunnerObservabilityHooks,\n DispatchRunnerFunctionalHookRegistrations,\n DispatchRunnerObservabilityHookRegistrations,\n} from './types/dispatch_runner'\n\n/**\n * Normalise a thrown/nacked value into an `Error` suitable for use as an exception `cause`. A strict\n * `Error` (per {@link isError}, which is cross-realm-safe) passes through unchanged; anything else — a\n * string, a plain object, a cross-realm error whose `instanceof Error` is false, a WASM/DOM value — is\n * wrapped in a real `Error` whose message is the value's best string form, with the original preserved on\n * `.cause`. This guarantees an `E_LLM_EXECUTION_EXECUTOR_ERROR` (or any wrapper) always carries a\n * meaningful, Error-shaped cause: the true failure is never reduced to the generic default message, and\n * downstream root-cause unwrapping / `isError` checks keep working.\n */\nconst toErrorCause = (value: unknown): Error => {\n if (isError(value)) return value\n let text: string\n try {\n text =\n typeof value === 'string'\n ? value\n : value === undefined\n ? 'undefined'\n : (JSON.stringify(value) ?? String(value))\n } catch {\n text = String(value)\n }\n return new Error(`non-Error thrown by executor: ${text}`, { cause: value })\n}\n\n/**\n * Build an {@link @nhtio/adk!E_LLM_EXECUTION_EXECUTOR_ERROR} whose own `message` names the underlying\n * failure, with the original preserved on `.cause`.\n *\n * @remarks\n * The cause CHAIN being intact is not the same as the failure being diagnosable: the overwhelmingly\n * common consumer habit is to log `err.message`, and a static wrapper text gives such a caller no\n * signal at all — not even the category of failure. A client-side validation error inside a battery\n * looked identical to a transport failure, an engine abort, or a bug in the executor itself.\n *\n * The static text is kept as the PREFIX so existing log greps and string matches keep working; the\n * cause text is joined to it with `: ` — the static text's own trailing period is dropped first, so the\n * result reads as one sentence instead of two run together. Appending is skipped when the cause adds\n * nothing (no message, or a message identical to the prefix) so the common case is byte-for-byte\n * unchanged.\n *\n * `cause.message` is NOT assumed to be a string, and coercing it is NOT assumed to succeed. `isError`\n * (and therefore `toErrorCause`) accepts anything Error-SHAPED via a cross-realm prototype check and\n * never validates `message`'s type, so a duck-typed or cross-realm error can carry a non-string\n * `message`. Two ways that bites, both verified:\n * - a bare `.trim()` on a non-string throws a TypeError;\n * - even a type-guarded `String()` throws when `message` is an object with a hostile\n * `toString`/`Symbol.toPrimitive`.\n *\n * Either one escapes this helper, so NO wrapper is returned: the `runner('error')` observability hook\n * never fires and both the executor error and its cause chain are lost — the exact failure class this\n * helper exists to make diagnosable. Enrichment is therefore best-effort: any failure to derive text\n * falls back to the bare static message, because a wrapper with a terse message beats no wrapper.\n *\n * `message` is assigned post-construction rather than passed in: the exception is produced by\n * `createException`, whose constructor takes only {@link @nhtio/adk!ExceptionOptions} (no message\n * override), and widening that public signature is not worth the reach of this change.\n */\nconst executorError = (value: unknown): BaseException => {\n const cause = toErrorCause(value)\n const wrapped = new E_LLM_EXECUTION_EXECUTOR_ERROR({ cause }) as unknown as BaseException\n const base = wrapped.message\n let detail = ''\n try {\n const rawDetail: unknown = cause.message\n detail = (typeof rawDetail === 'string' ? rawDetail : String(rawDetail ?? '')).trim()\n } catch {\n // Hostile `message` (throwing toString / Symbol.toPrimitive). Keep the static text and move on —\n // never let enrichment be the reason the caller loses the real error.\n detail = ''\n }\n if (detail.length > 0 && detail !== base) {\n wrapped.message = `${base.replace(/\\.$/, '')}: ${detail}`\n }\n return wrapped\n}\n\n/**\n * Plain input object supplied to {@link DispatchRunner.dispatch}.\n *\n * @remarks\n * Exactly one of `source` or `raw` is required:\n *\n * - `source` — switches to the **derived path**. The runner snapshots primitives from the\n * provided {@link @nhtio/adk!TurnContext}, wires all fetch/refresh/mutation callbacks to delegate to it,\n * forwards emits back to its buses, and bubbles mutations to its Sets at the end of every\n * iteration.\n *\n * - `raw` — switches to the **standalone path**. The runner constructs an {@link @nhtio/adk!DispatchContext}\n * directly from the provided raw input. No parent relationship exists; mutations are not bubbled.\n *\n * The `executor` is the user-provided callback that performs the actual LLM API call between the\n * input and output middleware pipelines on every iteration.\n */\nexport interface RawDispatchRunnerInput {\n /** Source {@link @nhtio/adk!TurnContext} to derive the execution context from. Mutually exclusive with `raw`. */\n source?: TurnContext\n /** Raw input for a standalone {@link @nhtio/adk!DispatchContext}. Mutually exclusive with `source`. */\n raw?: Omit<RawDispatchContext, 'hooks'>\n /** User-provided callback that makes the LLM API call. Invoked between input and output pipelines on every iteration. */\n executor: DispatchExecutorFn\n /** Input middleware functions, executed in order before the executor on every iteration. */\n turnInputPipeline?: DispatchPipelineMiddlewareFn[]\n /** Output middleware functions, executed in order after the executor on every iteration. */\n turnOutputPipeline?: DispatchPipelineMiddlewareFn[]\n /** Optional functional hook registrations: message, thought, toolCall. */\n hooks?: DispatchRunnerFunctionalHookRegistrations\n /** Optional observability hook registrations: lifecycle events + tool execution + error. */\n observers?: DispatchRunnerObservabilityHookRegistrations\n}\n\nconst dispatchInputSchema = validator.object<RawDispatchRunnerInput>({\n source: validator\n .any()\n .custom((value, helpers) => {\n if (value === undefined) return value\n if (isInstanceOf(value, 'TurnContext', TurnContext)) return value\n return helpers.error('any.invalid')\n })\n .optional(),\n raw: validator.object().unknown(true).optional(),\n executor: validator.function().required(),\n turnInputPipeline: validator.array().items(validator.function()).default([]),\n turnOutputPipeline: validator.array().items(validator.function()).default([]),\n hooks: validator.object().optional(),\n observers: validator.object().optional(),\n})\n\n/**\n * Orchestrates a single LLM execution dispatch — input pipeline → executor → output pipeline —\n * looped until middleware/executor signals completion via {@link @nhtio/adk!DispatchContext.ack} /\n * {@link @nhtio/adk!DispatchContext.nack} or the abort signal fires.\n *\n * @remarks\n * `DispatchRunner` has a private constructor and is invoked via the static `dispatch()`\n * method. Each dispatch creates a fresh single-use runner that is garbage-collected after the\n * call completes — matching the `@nhtio/hooks` GC rationale already baked into the context.\n *\n * The runner owns the relationship between an {@link @nhtio/adk!DispatchContext} and its parent\n * {@link @nhtio/adk!TurnContext} (when given a source). It subscribes to the context's mutation hooks,\n * queues `ContextDelta` entries, and flushes them to the parent's Sets at the end of every\n * iteration. Emits propagate from the context's hooks → the runner's hooks → (optionally) the\n * parent `TurnContext`'s emit methods → the `TurnRunner`'s buses.\n *\n * Two hook buses, mirroring `TurnRunner`'s pattern:\n *\n * - **Functional** (`hooks`): `message`, `thought`, `toolCall` — pipeline-affecting events\n * - **Observability** (`observers`): `iterationStart`, `iterationEnd`, `dispatchStart`,\n * `dispatchEnd`, `error`, `toolExecutionStart`, `toolExecutionEnd` — instrumentation only\n *\n * The runner has no `maxIterations`, no `maxToolCallChecksumRepeats`. Implementers use the\n * primitives — `ctx.iteration`, `ctx.toolCallCount(checksum)`, `ctx.ack()`, `ctx.nack()`,\n * `ctx.abortSignal` — to build any termination bounds they need in their own middleware.\n */\n/**\n * Module-private token gating direct construction of {@link DispatchRunner}. Callers must use\n * {@link DispatchRunner.dispatch}; the symbol is not exported, so external code cannot satisfy\n * the guard at runtime.\n */\nconst CONSTRUCT_TOKEN = Symbol('DispatchRunner.construct')\n\n/**\n * Runs a single dispatch iteration of an agentic turn: it drives the executor through the\n * input/output middleware pipelines, emitting functional and observability hook events along the\n * way. Construction is gated — obtain one via the static {@link DispatchRunner.dispatch} entry\n * point rather than `new`.\n */\nexport class DispatchRunner {\n #functionalHooks: Hooks<DispatchRunnerFunctionalHooks>\n #observabilityHooks: Hooks<DispatchRunnerObservabilityHooks>\n // The Middleware holders are built once; a FRESH Runner is derived from each\n // per dispatch iteration. A Runner is single-use — its internal cursor\n // (#currentIndex) is never reset by run() — so reusing one Runner across\n // iterations silently no-ops every pipeline after the first. The dispatch loop\n // runs the input/output pipelines once PER iteration, so it must mint a new\n // Runner each time or the citation/quality gate (and all output middleware)\n // would only ever fire on iteration 0.\n #inputPipeline: Middleware<DispatchPipelineMiddlewareFn>\n #outputPipeline: Middleware<DispatchPipelineMiddlewareFn>\n #sourceCtx: TurnContext | undefined\n #deltaQueue: ContextDelta[]\n\n /**\n * Construction is gated by an internal sentinel `token` — call the static\n * {@link DispatchRunner.dispatch} entry point instead of `new`.\n *\n * @internal\n */\n constructor(\n token: typeof CONSTRUCT_TOKEN,\n sourceCtx: TurnContext | undefined,\n turnInputPipeline: DispatchPipelineMiddlewareFn[],\n turnOutputPipeline: DispatchPipelineMiddlewareFn[],\n hooks: DispatchRunnerFunctionalHookRegistrations | undefined,\n observers: DispatchRunnerObservabilityHookRegistrations | undefined\n ) {\n if (token !== CONSTRUCT_TOKEN) {\n throw new E_INVALID_LLM_DISPATCH_INPUT()\n }\n this.#sourceCtx = sourceCtx\n this.#deltaQueue = []\n this.#functionalHooks = new Hooks<DispatchRunnerFunctionalHooks>()\n this.#observabilityHooks = new Hooks<DispatchRunnerObservabilityHooks>()\n\n const inputPipeline = new Middleware<DispatchPipelineMiddlewareFn>()\n const outputPipeline = new Middleware<DispatchPipelineMiddlewareFn>()\n const wrap =\n (fn: DispatchPipelineMiddlewareFn): DispatchPipelineMiddlewareFn =>\n (ctx, next) => {\n // Skip downstream user middlewares once an abort has been signalled. The\n // wrapper still calls next() so the pipeline reaches its terminal resolver\n // (keeping the short-circuit detector quiet); the original middleware body\n // does not run, so it has nothing to clean up.\n if (ctx.aborted) return next()\n return fn(ctx, next)\n }\n for (const fn of turnInputPipeline) inputPipeline.add(wrap(fn))\n for (const fn of turnOutputPipeline) outputPipeline.add(wrap(fn))\n // Hold the Middleware; derive a fresh Runner per iteration (see field docs).\n this.#inputPipeline = inputPipeline\n this.#outputPipeline = outputPipeline\n\n if (hooks) {\n for (const key of Object.keys(hooks) as (keyof DispatchRunnerFunctionalHooks)[]) {\n const entry = hooks[key]\n if (!entry) continue\n const handlers = Array.isArray(entry) ? entry : [entry]\n for (const h of handlers) this.#functionalHooks.add(key, h as any)\n }\n }\n if (observers) {\n for (const key of Object.keys(observers) as (keyof DispatchRunnerObservabilityHooks)[]) {\n const entry = observers[key]\n if (!entry) continue\n const handlers = Array.isArray(entry) ? entry : [entry]\n for (const h of handlers) this.#observabilityHooks.add(key, h as any)\n }\n }\n }\n\n /**\n * Returns `true` if `value` is a {@link DispatchRunner} instance.\n *\n * @remarks\n * Uses {@link @nhtio/adk!isInstanceOf} for cross-realm safety.\n *\n * @param value - The value to test.\n * @returns `true` when `value` is a {@link DispatchRunner} instance.\n */\n public static isDispatchRunner(value: unknown): value is DispatchRunner {\n return isInstanceOf(value, 'DispatchRunner', DispatchRunner)\n }\n\n /**\n * Dispatches a single LLM execution.\n *\n * @remarks\n * Constructs an {@link @nhtio/adk!DispatchContext} (derived from `source` or from `raw`), runs the\n * iteration loop, and resolves when middleware/executor signals completion via `ctx.ack()` or\n * the abort signal fires. Rejects with the nack error when middleware/executor calls\n * `ctx.nack(err)`. Pipeline and executor errors are wrapped, surfaced on the observability\n * `error` hook, and re-thrown.\n *\n * @param input - The dispatch input. Provide either `source` (derived path) or `raw` (standalone).\n * @throws {@link @nhtio/adk!E_INVALID_LLM_DISPATCH_INPUT} when the input does not satisfy validation, or\n * when neither `source` nor `raw` is provided, or when both are provided.\n */\n public static async dispatch(input: RawDispatchRunnerInput): Promise<void> {\n let resolved: RawDispatchRunnerInput & {\n turnInputPipeline: DispatchPipelineMiddlewareFn[]\n turnOutputPipeline: DispatchPipelineMiddlewareFn[]\n }\n try {\n resolved = validateOrThrow(dispatchInputSchema, input, true) as typeof resolved\n } catch (err) {\n throw new E_INVALID_LLM_DISPATCH_INPUT({\n cause: isError(err) ? err : undefined,\n })\n }\n\n if (!resolved.source && !resolved.raw) {\n throw new E_INVALID_LLM_DISPATCH_INPUT()\n }\n if (resolved.source && resolved.raw) {\n throw new E_INVALID_LLM_DISPATCH_INPUT()\n }\n\n const runner = new DispatchRunner(\n CONSTRUCT_TOKEN,\n resolved.source,\n resolved.turnInputPipeline,\n resolved.turnOutputPipeline,\n resolved.hooks,\n resolved.observers\n )\n\n const llmCtx = runner.#buildContext(resolved.source, resolved.raw)\n runner.#wireContextHooks(llmCtx)\n await normalizeRetrievables(llmCtx)\n if (resolved.source) {\n // Write the now-spooled records back onto the source TurnContext's own working set, so a\n // subsequent dispatch from the same TurnContext reuses the existing artifact handle instead\n // of re-encoding and re-storing the same plain-string content from scratch every time.\n for (const record of llmCtx.turnRetrievables) {\n runner.#replaceById(resolved.source.turnRetrievables, record.id, record)\n }\n }\n\n await runner.#runDispatch(llmCtx, resolved.executor)\n }\n\n // ── Context construction ──────────────────────────────────────────────────\n\n #buildContext(\n source: TurnContext | undefined,\n raw: Omit<RawDispatchContext, 'hooks'> | undefined\n ): DispatchContext {\n if (source) {\n const ac = new AbortController()\n source.abortSignal.addEventListener('abort', () => ac.abort(), {\n once: true,\n })\n\n const builtRaw: RawDispatchContext = {\n turnAbortController: ac,\n stash: source.stash.all(),\n systemPrompt: source.systemPrompt,\n standingInstructions: [...source.standingInstructions],\n memories: [...source.turnMemories],\n retrievables: [...source.turnRetrievables],\n messages: [...source.turnMessages],\n thoughts: [...source.turnThoughts],\n toolCalls: [...source.turnToolCalls],\n tools: source.tools.all(),\n fetchMemories: () => source.fetchMemories(),\n fetchRetrievables: () => source.fetchRetrievables(),\n fetchMessages: () => source.fetchMessages(),\n fetchThoughts: () => source.fetchThoughts(),\n fetchToolCalls: () => source.fetchToolCalls(),\n fetchTools: () => source.fetchTools(),\n refreshStandingInstructions: () => source.refreshStandingInstructions(),\n storeStandingInstruction: (_c, v) => source.storeStandingInstruction(v),\n mutateStandingInstruction: (_c, v) => source.mutateStandingInstruction(v),\n deleteStandingInstruction: (_c, v) => source.deleteStandingInstruction(v),\n storeMemory: (_c, v) => source.storeMemory(v),\n mutateMemory: (_c, v) => source.mutateMemory(v),\n deleteMemory: (_c, id) => source.deleteMemory(id),\n storeRetrievable: async (_c, v) => {\n return source.storeRetrievable(v) as unknown as Promise<void>\n },\n mutateRetrievable: async (_c, v) => {\n return source.mutateRetrievable(v) as unknown as Promise<void>\n },\n deleteRetrievable: (_c, id) => source.deleteRetrievable(id),\n storeMessage: (_c, v) => source.storeMessage(v),\n mutateMessage: (_c, v) => source.mutateMessage(v),\n deleteMessage: (_c, id) => source.deleteMessage(id),\n storeThought: (_c, v) => source.storeThought(v),\n mutateThought: (_c, v) => source.mutateThought(v),\n deleteThought: (_c, id) => source.deleteThought(id),\n storeToolCall: (_c, v) => source.storeToolCall(v),\n mutateToolCall: (_c, v) => source.mutateToolCall(v),\n deleteToolCall: (_c, id) => source.deleteToolCall(id),\n replaceToolCallGroup: (_c, ids, replacements) =>\n source.replaceToolCallGroup(ids, replacements),\n storeMediaBytes: (_c, id, bytes) => source.storeMediaBytes(id, bytes),\n storeRetrievableBytes: (_c, id, bytes) => source.storeRetrievableBytes(id, bytes),\n waitFor: source.waitFor,\n }\n return new DispatchContext(builtRaw)\n }\n\n // Standalone path — runner does not pass hooks (it registers its own forwarders below).\n return new DispatchContext(raw as RawDispatchContext)\n }\n\n // ── Wire forwarding handlers from ctx hooks to runner hooks ───────────────\n\n #wireContextHooks(llmCtx: DispatchContext): void {\n const ctxHooks = llmCtx._getHooks()\n\n // Functional forwarders: ctx → runner (functional) → (if source) → TurnContext\n ctxHooks.add('message', (c) => {\n void this.#functionalHooks.runner('message').run(c)\n if (this.#sourceCtx) this.#sourceCtx.emitMessage(c)\n })\n ctxHooks.add('thought', (c) => {\n void this.#functionalHooks.runner('thought').run(c)\n if (this.#sourceCtx) this.#sourceCtx.emitThought(c)\n })\n ctxHooks.add('toolCall', (c) => {\n void this.#functionalHooks.runner('toolCall').run(c)\n if (this.#sourceCtx) this.#sourceCtx.emitToolCall(c)\n })\n\n // Observability forwarders for tool execution lifecycle\n ctxHooks.add('toolExecutionStart', (e) => {\n void this.#observabilityHooks.runner('toolExecutionStart').run(e)\n if (this.#sourceCtx) this.#sourceCtx.emitToolExecutionStart(e)\n })\n ctxHooks.add('toolExecutionEnd', (e) => {\n void this.#observabilityHooks.runner('toolExecutionEnd').run(e)\n if (this.#sourceCtx) this.#sourceCtx.emitToolExecutionEnd(e)\n })\n\n // Mutation hooks → push to internal delta queue (only meaningful when source exists,\n // but registering unconditionally keeps the API uniform; queue is drained only in derived)\n ctxHooks.add('storedStandingInstruction', (v) => {\n this.#deltaQueue.push({\n op: 'store',\n type: 'standingInstruction',\n value: v,\n })\n })\n ctxHooks.add('mutatedStandingInstruction', (v) => {\n this.#deltaQueue.push({\n op: 'mutate',\n type: 'standingInstruction',\n value: v,\n })\n })\n ctxHooks.add('deletedStandingInstruction', (v) => {\n this.#deltaQueue.push({\n op: 'delete',\n type: 'standingInstruction',\n value: v,\n })\n })\n ctxHooks.add('storedMemory', (v) => {\n this.#deltaQueue.push({ op: 'store', type: 'memory', value: v })\n })\n ctxHooks.add('mutatedMemory', (v) => {\n this.#deltaQueue.push({ op: 'mutate', type: 'memory', value: v })\n })\n ctxHooks.add('deletedMemory', (id) => {\n this.#deltaQueue.push({ op: 'delete', type: 'memory', value: id })\n })\n ctxHooks.add('storedRetrievable', (v) => {\n this.#deltaQueue.push({ op: 'store', type: 'retrievable', value: v })\n })\n ctxHooks.add('mutatedRetrievable', (v) => {\n this.#deltaQueue.push({ op: 'mutate', type: 'retrievable', value: v })\n })\n ctxHooks.add('deletedRetrievable', (id) => {\n this.#deltaQueue.push({ op: 'delete', type: 'retrievable', value: id })\n })\n ctxHooks.add('storedMessage', (v) => {\n this.#deltaQueue.push({ op: 'store', type: 'message', value: v })\n })\n ctxHooks.add('mutatedMessage', (v) => {\n this.#deltaQueue.push({ op: 'mutate', type: 'message', value: v })\n })\n ctxHooks.add('deletedMessage', (id) => {\n this.#deltaQueue.push({ op: 'delete', type: 'message', value: id })\n })\n ctxHooks.add('storedThought', (v) => {\n this.#deltaQueue.push({ op: 'store', type: 'thought', value: v })\n })\n ctxHooks.add('mutatedThought', (v) => {\n this.#deltaQueue.push({ op: 'mutate', type: 'thought', value: v })\n })\n ctxHooks.add('deletedThought', (id) => {\n this.#deltaQueue.push({ op: 'delete', type: 'thought', value: id })\n })\n ctxHooks.add('storedToolCall', (v) => {\n this.#deltaQueue.push({ op: 'store', type: 'toolCall', value: v })\n })\n ctxHooks.add('mutatedToolCall', (v) => {\n this.#deltaQueue.push({ op: 'mutate', type: 'toolCall', value: v })\n })\n ctxHooks.add('deletedToolCall', (id) => {\n this.#deltaQueue.push({ op: 'delete', type: 'toolCall', value: id })\n })\n }\n\n // ── Helper builder ────────────────────────────────────────────────────────\n\n /**\n * Constructs an {@link @nhtio/adk!DispatchExecutorHelpers} instance bound to a single dispatch.\n *\n * @remarks\n * Per-id stream state lives on closure-captured `Map`s, so it persists across iterations of\n * the dispatch but cannot leak between dispatches (the runner itself is single-use and\n * garbage-collected after `dispatch()` returns).\n */\n #buildHelpers(ctx: DispatchContext): DispatchExecutorHelpers {\n const observabilityHooks = this.#observabilityHooks\n const makeLogEmitter =\n (level: DispatchExecutorLogLevel) =>\n (entry: DispatchExecutorLogEntry): void => {\n const event: LogEvent = {\n dispatchId: ctx.dispatchId,\n iteration: ctx.iteration,\n emittedAt: DateTime.now(),\n level,\n kind: entry.kind,\n message: entry.message,\n ...(entry.payload !== undefined ? { payload: entry.payload } : {}),\n }\n void observabilityHooks.runner('log').run(event)\n }\n const log: DispatchExecutorLogChannel = {\n trace: makeLogEmitter('trace'),\n debug: makeLogEmitter('debug'),\n info: makeLogEmitter('info'),\n warn: makeLogEmitter('warn'),\n error: makeLogEmitter('error'),\n }\n\n const reportGenerationStats = (stats: GenerationStats): void => {\n const event: GenerationStatsEvent = {\n ...stats,\n dispatchId: ctx.dispatchId,\n iteration: ctx.iteration,\n emittedAt: DateTime.now(),\n }\n void observabilityHooks.runner('generationStats').run(event)\n }\n\n const messageStreams = new Map<\n string,\n { full: string; createdAt: DateTime; isComplete: boolean }\n >()\n const thoughtStreams = new Map<\n string,\n { full: string; createdAt: DateTime; isComplete: boolean }\n >()\n const toolCallStreams = new Map<\n string,\n {\n tool?: string\n args?: unknown\n checksum?: string\n results?: unknown\n isError: boolean\n isComplete: boolean\n createdAt: DateTime\n }\n >()\n\n const buildStream = (\n store: Map<string, { full: string; createdAt: DateTime; isComplete: boolean }>,\n id: string,\n deltaText: string,\n isComplete: boolean\n ): TurnStreamableContent => {\n let entry = store.get(id)\n const now = DateTime.now()\n if (!entry) {\n entry = { full: '', createdAt: now, isComplete: false }\n store.set(id, entry)\n }\n if (entry.isComplete) {\n throw new Error(`stream \"${id}\" is already complete; further chunks are not accepted`)\n }\n entry.full = entry.full + deltaText\n entry.isComplete = isComplete\n return {\n id,\n createdAt: entry.createdAt,\n updatedAt: now,\n full: entry.full,\n aDelta: deltaText,\n isComplete,\n ...(isComplete ? { completedAt: now } : {}),\n }\n }\n\n return {\n reportMessage: (id, deltaText, opts) => {\n const isComplete = opts?.isComplete ?? false\n ctx.emitMessage(buildStream(messageStreams, id, deltaText, isComplete))\n },\n reportThought: (id, deltaText, opts) => {\n const isComplete = opts?.isComplete ?? false\n ctx.emitThought(buildStream(thoughtStreams, id, deltaText, isComplete))\n },\n reportToolCall: (id, partial) => {\n let entry = toolCallStreams.get(id)\n const now = DateTime.now()\n if (!entry) {\n entry = { isError: false, isComplete: false, createdAt: now }\n toolCallStreams.set(id, entry)\n }\n if (entry.isComplete) {\n throw new Error(`tool call \"${id}\" is already complete; further updates are not accepted`)\n }\n if (partial.tool !== undefined) entry.tool = partial.tool\n if (partial.args !== undefined) entry.args = partial.args\n if (partial.results !== undefined) entry.results = partial.results\n if (partial.isError !== undefined) entry.isError = partial.isError\n if (partial.isComplete !== undefined) entry.isComplete = partial.isComplete\n\n // Compute checksum once tool + args are both set (or recompute if either changed)\n if (entry.tool !== undefined && entry.args !== undefined) {\n entry.checksum = sha256(canonicalStringify({ tool: entry.tool, args: entry.args }))\n }\n\n const content: TurnToolCallContent = {\n id,\n tool: entry.tool ?? '',\n args: entry.args,\n checksum: entry.checksum ?? '',\n createdAt: entry.createdAt,\n updatedAt: now,\n isComplete: entry.isComplete,\n isError: entry.isError,\n ...(entry.results !== undefined ? { results: entry.results } : {}),\n ...(entry.isComplete ? { completedAt: now } : {}),\n }\n ctx.emitToolCall(content)\n },\n log,\n reportGenerationStats,\n }\n }\n\n // ── Iteration loop ────────────────────────────────────────────────────────\n\n /**\n * Forge artifact-reader tools from the current turn's tool-call results and register them into\n * `ctx.tools`, so the forged readers are first-class members of the tool set the whole dispatch-input plane\n * sees (budget passes, gates, observability). This is the GENERATION step — deterministic and generic;\n * batteries own only REPRESENTATION (rendering the declarations + resolving the model's calls).\n *\n * Called once per iteration before the input pipeline. Idempotent within a dispatch by construction:\n * 1. `pruneEphemeral()` drops the previous iteration's forged readers (whose `callId` enum is now stale —\n * new tool calls made last iteration must widen the enum).\n * 2. Collect the unique `SpooledArtifact` subclasses across `turnToolCalls` results, covering BOTH a single\n * artifact result and an array-of-artifacts result.\n * 3. `forgeTools(ctx)` per ctor, merged with `onCollision:'keep'` so a JSON subclass's base+JSON readers\n * win over a plain base forge of the same names (the subclass already composes base+JSON).\n * 4. Register each forged tool into `ctx.tools` (`overwrite:true` → idempotent re-register within a run).\n * 5. Bind ephemeral pruning to `ack` exactly once per dispatch (the forged tools are `ephemeral:true`, so\n * they are pruned when the dispatch acks — the lifecycle is unchanged from the battery-local era).\n */\n #forgeArtifactTools(ctx: DispatchContext): void {\n // 1. Drop stale forged readers from a prior iteration (their callId enum excludes newer calls).\n ctx.tools.pruneEphemeral()\n\n // 2. Collect unique SpooledArtifact subclasses producing this turn's results (single OR array results).\n const ctors = new Set<{ forgeTools: (c: DispatchContext) => ToolRegistry }>()\n for (const tc of ctx.turnToolCalls) {\n const results = (tc as { results?: unknown }).results\n const items = Array.isArray(results) ? results : [results]\n for (const item of items) {\n if (!SpooledArtifact.isSpooledArtifact(item)) continue\n const ctor = (item as SpooledArtifact).constructor as unknown as {\n forgeTools?: (c: DispatchContext) => ToolRegistry\n }\n if (typeof ctor.forgeTools === 'function') {\n ctors.add(ctor as { forgeTools: (c: DispatchContext) => ToolRegistry })\n }\n }\n }\n for (const retrievable of ctx.turnRetrievables) {\n if (retrievable.inline || !SpooledArtifact.isSpooledArtifact(retrievable.content)) continue\n const ctor = (retrievable.content as SpooledArtifact).constructor as unknown as {\n forgeTools?: (c: DispatchContext) => ToolRegistry\n }\n if (typeof ctor.forgeTools === 'function') {\n ctors.add(ctor as { forgeTools: (c: DispatchContext) => ToolRegistry })\n }\n }\n if (ctors.size === 0) return\n\n // 3. Forge each subclass's readers and combine. 'keep' = the first registry's tool wins on a name\n // collision (a JSON subclass forge composes base+JSON already, so keep it over a plain base forge).\n const forged = ToolRegistry.merge(\n [...ctors].map((c) => c.forgeTools(ctx)),\n { onCollision: 'keep' }\n )\n if (forged.all().length === 0) return\n\n // 4. Register the forged readers into ctx.tools so every downstream consumer (middleware, the executor's\n // representation step) sees the SAME set. overwrite:true keeps this idempotent across iterations.\n for (const tool of forged.all()) {\n ctx.tools.register(tool, true)\n if (forged.hidden().some((h) => h.name === tool.name)) ctx.tools.hide(tool.name)\n }\n\n // 5. Ephemeral prune fires on ack; bind exactly once per dispatch (iteration 0) to avoid stacking\n // onAck subscriptions across iterations.\n if (ctx.iteration === 0) ctx.tools.bindContext(ctx)\n }\n\n async #runDispatch(llmCtx: DispatchContext, executor: DispatchExecutorFn): Promise<void> {\n const dispatchId = uuidv6()\n llmCtx._setDispatchId(dispatchId)\n\n const dispatchStartedAt = DateTime.now()\n void this.#observabilityHooks\n .runner('dispatchStart')\n .run({ dispatchId, startedAt: dispatchStartedAt })\n\n // Helpers are constructed once per dispatch so per-id streaming state is preserved across\n // iterations, and garbage-collected with the runner so cross-dispatch state can't leak.\n const helpers = this.#buildHelpers(llmCtx)\n\n let iteration = 0\n let dispatchError: Error | undefined\n\n // Publish this dispatch's warn-sink for the duration of the run so a token estimation performed\n // anywhere within (an executor's overflow guard, a pipeline, a gate) can DEGRADE-and-warn instead of\n // throwing — the estimator reads the ambient sink (see utils/estimation_context). A dispatch is the\n // INNERMOST scope, so when it runs inside a TurnRunner this sink (which carries dispatchId/iteration)\n // takes precedence over the turn's. Non-fatal: `warning`, never `error`.\n const emitEstimationWarning = (w: EstimationWarning): void => {\n const event: WarningEvent = {\n dispatchId: llmCtx.dispatchId,\n iteration: llmCtx.iteration,\n emittedAt: DateTime.now(),\n source: 'dispatch-runner',\n kind: 'token-estimation-degraded',\n message: `token estimation for encoding \"${String(w.encoding)}\" failed; fell back to a char-based estimate`,\n error: w.error,\n payload: { encoding: w.encoding, textPreview: w.textPreview },\n }\n void this.#observabilityHooks.runner('warning').run(event)\n }\n\n await runWithEstimationWarnings(emitEstimationWarning, async () => {\n try {\n while (!llmCtx.aborted && !llmCtx.isSignalled) {\n llmCtx._setIteration(iteration)\n const iterationStartedAt = DateTime.now()\n void this.#observabilityHooks\n .runner('iterationStart')\n .run({ dispatchId, iteration, startedAt: iterationStartedAt })\n\n // Forge artifact-reader tools into ctx.tools BEFORE the input pipeline, so the forged readers are\n // first-class members of the tool set that ALL input middleware (budget/subtractive passes, gates,\n // observability taps) can measure, evaluate, and mutate — not a battery-local set invisible to the\n // dispatch-input plane. Runs per-iteration because ctx.turnToolCalls grows across iterations (an\n // artifact produced in iteration N only appears in N+1). Generation is a generic core concern;\n // batteries keep only REPRESENTATION (rendering declarations + resolving calls) and read ctx.tools.\n this.#forgeArtifactTools(llmCtx)\n\n await this.#runPipeline(this.#inputPipeline.runner(), llmCtx, 'input')\n if (llmCtx.aborted || llmCtx.isSignalled) {\n // ack mid-iteration flushes parent-mirror deltas accumulated so far;\n // nack / abort discards them so a partial iteration cannot leak\n // partial writes into the parent turn.\n if (llmCtx.isAcked && !llmCtx.aborted) {\n await this.#flush()\n } else {\n this.#deltaQueue.length = 0\n }\n break\n }\n\n try {\n await executor(llmCtx, helpers)\n } catch (err) {\n if (this.#isAbortError(err)) {\n this.#deltaQueue.length = 0\n break\n }\n // Preserve the thrown value as the cause — ALWAYS, even when it is not a strict `Error`. An\n // executor can reject with a non-Error (a string, a cross-realm error that fails `instanceof`,\n // a WASM/DOM value); the old `isError(err) ? err : undefined` DROPPED those, leaving a\n // cause-less wrapper whose only text was the generic \"…callback threw an error.\" — so the real\n // failure was unrecoverable and undiagnosable downstream. `toErrorCause` normalises any\n // non-Error into a real Error carrying its stringified value, keeping the `.cause` chain\n // Error-shaped for `isError`/root-cause unwrapping — and `executorError` additionally names\n // the failure in the wrapper's OWN message, for the many callers that only log `.message`.\n const wrapped = executorError(err)\n void this.#observabilityHooks.runner('error').run(wrapped)\n this.#deltaQueue.length = 0\n throw wrapped\n }\n\n if (llmCtx.aborted || llmCtx.isSignalled) {\n if (llmCtx.isAcked && !llmCtx.aborted) {\n await this.#flush()\n } else {\n this.#deltaQueue.length = 0\n }\n break\n }\n\n await this.#runPipeline(this.#outputPipeline.runner(), llmCtx, 'output')\n await this.#flush()\n\n const iterationEndedAt = DateTime.now()\n void this.#observabilityHooks.runner('iterationEnd').run({\n dispatchId,\n iteration,\n startedAt: iterationStartedAt,\n endedAt: iterationEndedAt,\n durationMs: iterationEndedAt.diff(iterationStartedAt).milliseconds,\n })\n\n iteration++\n }\n } catch (err) {\n dispatchError = isError(err) ? err : new Error(String(err))\n }\n\n const status: DispatchEndStatus = dispatchError\n ? 'nack'\n : llmCtx.nackError\n ? 'nack'\n : llmCtx.isAcked\n ? 'ack'\n : 'aborted'\n const finalError = dispatchError ?? llmCtx.nackError\n\n // Parity with the thrown-executor-error path: when the dispatch ends with\n // a nack whose cause we have not already emitted (i.e. `ctx.nack(error)`\n // was called explicitly, rather than the executor throwing), surface the\n // error on the observability `error` bus so observers see one unified\n // error stream regardless of how the nack was reached.\n if (!dispatchError && llmCtx.nackError) {\n const nackErr = llmCtx.nackError\n const wrapped = isInstanceOf(nackErr, 'BaseException')\n ? (nackErr as unknown as BaseException)\n : // Preserve a non-BaseException nack value as the cause too (see the executor-throw path):\n // a raw string / cross-realm error must not be dropped to a cause-less generic wrapper.\n executorError(nackErr)\n void this.#observabilityHooks.runner('error').run(wrapped)\n }\n\n const dispatchEndedAt = DateTime.now()\n void this.#observabilityHooks.runner('dispatchEnd').run({\n dispatchId,\n status,\n error: finalError,\n iterations: iteration,\n startedAt: dispatchStartedAt,\n endedAt: dispatchEndedAt,\n durationMs: dispatchEndedAt.diff(dispatchStartedAt).milliseconds,\n })\n\n if (finalError) throw finalError\n })\n }\n\n async #runPipeline(\n pipeline: MiddlewareRunner<DispatchPipelineMiddlewareFn>,\n llmCtx: DispatchContext,\n label: 'input' | 'output'\n ): Promise<void> {\n let pipelineError: Error | undefined\n let reached = false\n await pipeline\n .errorHandler(async (error) => {\n if (this.#isAbortError(error)) return\n pipelineError = new E_DISPATCH_PIPELINE_ERROR({\n cause: isError(error) ? error : undefined,\n })\n })\n .finalHandler(async () => {\n reached = true\n })\n .run((fn, next) => Promise.resolve(fn(llmCtx, next)))\n\n if (pipelineError) {\n void this.#observabilityHooks.runner('error').run(pipelineError as unknown as BaseException)\n throw pipelineError\n }\n\n if (!reached && !llmCtx.aborted && !llmCtx.isSignalled) {\n const shortCircuitError = new E_PIPELINE_SHORT_CIRCUITED([`dispatch-${label}`])\n void this.#observabilityHooks\n .runner('error')\n .run(shortCircuitError as unknown as BaseException)\n throw shortCircuitError\n }\n }\n\n #isAbortError(err: unknown): boolean {\n return isError(err) && isInstanceOf(err, 'AbortError')\n }\n\n async #flush(): Promise<void> {\n if (!this.#sourceCtx) {\n this.#deltaQueue.length = 0\n return\n }\n while (this.#deltaQueue.length > 0) {\n const delta = this.#deltaQueue.shift()!\n this.#applyDeltaToParent(delta)\n }\n }\n\n /**\n * Replaces every member of `set` sharing `id` with `replacement`, preserving the ORIGINAL\n * insertion position of the first match rather than appending at the end.\n *\n * @remarks\n * `Set.add()` compares by reference, not id — a mutated instance is a NEW object, so the stale\n * instance(s) must be removed or they coexist with the replacement forever (this is the exact\n * defect {@link @nhtio/adk!DispatchContext}'s own `#doMutate*` methods were fixed to avoid — a\n * child dispatch context's mutation is otherwise correctly deduplicated locally, but flushing\n * that mutation BACK to this parent `TurnContext`'s Sets via `#applyDeltaToParent` re-introduces\n * the identical bug if this method just appended). `set` is rebuilt in place via `clear()` +\n * re-add, rather than reassigned, since `TurnContext` exposes no setter for these Sets — only\n * `set.add`/`set.delete` are available to a caller outside the class.\n */\n #replaceById<T extends { id: string }>(set: Set<T>, id: string, replacement: T): void {\n const rebuilt: T[] = []\n let inserted = false\n for (const existing of set) {\n if ((existing as any).id === id) {\n if (!inserted) {\n rebuilt.push(replacement)\n inserted = true\n }\n continue\n }\n rebuilt.push(existing)\n }\n if (!inserted) rebuilt.push(replacement)\n set.clear()\n for (const item of rebuilt) set.add(item)\n }\n\n #applyDeltaToParent(delta: ContextDelta): void {\n const ctx = this.#sourceCtx!\n const { op, type, value } = delta\n\n if (type === 'standingInstruction') {\n const t = value as Tokenizable\n if (op === 'store' || op === 'mutate') ctx.standingInstructions.add(t)\n else ctx.standingInstructions.delete(t)\n return\n }\n if (type === 'memory') {\n if (op === 'store') ctx.turnMemories.add(value as Memory)\n else if (op === 'mutate') {\n const v = value as Memory\n this.#replaceById(ctx.turnMemories, (v as any).id, v)\n } else {\n for (const m of ctx.turnMemories) {\n if ((m as any).id === (value as any)) {\n ctx.turnMemories.delete(m)\n break\n }\n }\n }\n return\n }\n if (type === 'retrievable') {\n if (op === 'store') ctx.turnRetrievables.add(value as Retrievable)\n else if (op === 'mutate') {\n const v = value as Retrievable\n this.#replaceById(ctx.turnRetrievables, (v as any).id, v)\n } else {\n for (const r of ctx.turnRetrievables) {\n if ((r as any).id === (value as any)) {\n ctx.turnRetrievables.delete(r)\n break\n }\n }\n }\n return\n }\n if (type === 'message') {\n if (op === 'store') ctx.turnMessages.add(value as Message)\n else if (op === 'mutate') {\n const v = value as Message\n this.#replaceById(ctx.turnMessages, (v as any).id, v)\n } else {\n for (const m of ctx.turnMessages) {\n if ((m as any).id === (value as any)) {\n ctx.turnMessages.delete(m)\n break\n }\n }\n }\n return\n }\n if (type === 'thought') {\n if (op === 'store') ctx.turnThoughts.add(value as Thought)\n else if (op === 'mutate') {\n const v = value as Thought\n this.#replaceById(ctx.turnThoughts, (v as any).id, v)\n } else {\n for (const t of ctx.turnThoughts) {\n if ((t as any).id === (value as any)) {\n ctx.turnThoughts.delete(t)\n break\n }\n }\n }\n return\n }\n if (type === 'toolCall') {\n if (op === 'store') ctx.turnToolCalls.add(value as ToolCall)\n else if (op === 'mutate') {\n const v = value as ToolCall\n this.#replaceById(ctx.turnToolCalls, (v as any).id, v)\n } else {\n for (const tc of ctx.turnToolCalls) {\n if ((tc as any).id === (value as any)) {\n ctx.turnToolCalls.delete(tc)\n break\n }\n }\n }\n return\n }\n }\n}\n\ntype DispatchEndStatus = 'ack' | 'nack' | 'aborted'\n"],"mappings":"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"}