@nhtio/adk 0.1.0-master-2a4e1bd2 → 0.1.0-master-cd595e6f

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 (413) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/artifact_methods-CJDQ5Lv-.mjs +1 -0
  3. package/artifact_methods-D6k_82r3.js +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 +2 -2
  17. package/batteries/dev-tools.mjs +2 -2
  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/browser.d.ts +1 -1
  27. package/batteries/isolation/child_process/transport.d.ts +2 -2
  28. package/batteries/isolation/child_process.cjs +4 -4
  29. package/batteries/isolation/child_process.cjs.map +1 -1
  30. package/batteries/isolation/child_process.mjs +4 -4
  31. package/batteries/isolation/child_process.mjs.map +1 -1
  32. package/batteries/isolation/codec.d.ts +2 -2
  33. package/batteries/isolation/crash_policy.d.ts +1 -1
  34. package/batteries/isolation/isolate_function.d.ts +2 -2
  35. package/batteries/isolation/protocol.d.ts +4 -4
  36. package/batteries/isolation/serve.d.ts +2 -2
  37. package/batteries/isolation/types.d.ts +4 -4
  38. package/batteries/isolation.cjs +1 -1
  39. package/batteries/isolation.mjs +1 -1
  40. package/batteries/llm/anthropic_messages/adapter.cjs +6 -6
  41. package/batteries/llm/anthropic_messages/adapter.cjs.map +1 -1
  42. package/batteries/llm/anthropic_messages/adapter.mjs +6 -6
  43. package/batteries/llm/anthropic_messages/adapter.mjs.map +1 -1
  44. package/batteries/llm/anthropic_messages/count_tokens.cjs +1 -1
  45. package/batteries/llm/anthropic_messages/count_tokens.mjs +1 -1
  46. package/batteries/llm/anthropic_messages/helpers.cjs +3 -3
  47. package/batteries/llm/anthropic_messages/helpers.mjs +3 -3
  48. package/batteries/llm/anthropic_messages/types.d.ts +2 -2
  49. package/batteries/llm/anthropic_messages/validation.cjs +3 -3
  50. package/batteries/llm/anthropic_messages/validation.cjs.map +1 -1
  51. package/batteries/llm/anthropic_messages/validation.mjs +3 -3
  52. package/batteries/llm/anthropic_messages/validation.mjs.map +1 -1
  53. package/batteries/llm/anthropic_messages.cjs +2 -2
  54. package/batteries/llm/anthropic_messages.mjs +2 -2
  55. package/batteries/llm/bedrock_converse/adapter.cjs +29 -7
  56. package/batteries/llm/bedrock_converse/adapter.cjs.map +1 -1
  57. package/batteries/llm/bedrock_converse/adapter.mjs +30 -8
  58. package/batteries/llm/bedrock_converse/adapter.mjs.map +1 -1
  59. package/batteries/llm/bedrock_converse/exceptions.cjs +3 -0
  60. package/batteries/llm/bedrock_converse/exceptions.cjs.map +1 -1
  61. package/batteries/llm/bedrock_converse/exceptions.d.ts +6 -0
  62. package/batteries/llm/bedrock_converse/exceptions.mjs +3 -1
  63. package/batteries/llm/bedrock_converse/exceptions.mjs.map +1 -1
  64. package/batteries/llm/bedrock_converse/helpers.cjs +1 -1
  65. package/batteries/llm/bedrock_converse/helpers.mjs +1 -1
  66. package/batteries/llm/bedrock_converse/types.d.ts +6 -2
  67. package/batteries/llm/bedrock_converse/validation.cjs +7 -1
  68. package/batteries/llm/bedrock_converse/validation.cjs.map +1 -1
  69. package/batteries/llm/bedrock_converse/validation.mjs +7 -1
  70. package/batteries/llm/bedrock_converse/validation.mjs.map +1 -1
  71. package/batteries/llm/bedrock_converse.cjs +2 -2
  72. package/batteries/llm/bedrock_converse.mjs +2 -2
  73. package/batteries/llm/claude_code_cli/adapter.cjs +6 -6
  74. package/batteries/llm/claude_code_cli/adapter.cjs.map +1 -1
  75. package/batteries/llm/claude_code_cli/adapter.mjs +6 -6
  76. package/batteries/llm/claude_code_cli/adapter.mjs.map +1 -1
  77. package/batteries/llm/claude_code_cli/helpers.cjs +3 -3
  78. package/batteries/llm/claude_code_cli/helpers.mjs +3 -3
  79. package/batteries/llm/claude_code_cli/types.d.ts +3 -2
  80. package/batteries/llm/claude_code_cli/validation.cjs +3 -3
  81. package/batteries/llm/claude_code_cli/validation.cjs.map +1 -1
  82. package/batteries/llm/claude_code_cli/validation.mjs +3 -3
  83. package/batteries/llm/claude_code_cli/validation.mjs.map +1 -1
  84. package/batteries/llm/claude_code_cli.cjs +1 -1
  85. package/batteries/llm/claude_code_cli.mjs +1 -1
  86. package/batteries/llm/gemini_generate_content/adapter.cjs +29 -7
  87. package/batteries/llm/gemini_generate_content/adapter.cjs.map +1 -1
  88. package/batteries/llm/gemini_generate_content/adapter.mjs +30 -8
  89. package/batteries/llm/gemini_generate_content/adapter.mjs.map +1 -1
  90. package/batteries/llm/gemini_generate_content/exceptions.cjs +3 -0
  91. package/batteries/llm/gemini_generate_content/exceptions.cjs.map +1 -1
  92. package/batteries/llm/gemini_generate_content/exceptions.d.ts +6 -0
  93. package/batteries/llm/gemini_generate_content/exceptions.mjs +3 -1
  94. package/batteries/llm/gemini_generate_content/exceptions.mjs.map +1 -1
  95. package/batteries/llm/gemini_generate_content/helpers.cjs +1 -1
  96. package/batteries/llm/gemini_generate_content/helpers.mjs +1 -1
  97. package/batteries/llm/gemini_generate_content/types.d.ts +7 -3
  98. package/batteries/llm/gemini_generate_content/validation.cjs +11 -2
  99. package/batteries/llm/gemini_generate_content/validation.cjs.map +1 -1
  100. package/batteries/llm/gemini_generate_content/validation.mjs +11 -2
  101. package/batteries/llm/gemini_generate_content/validation.mjs.map +1 -1
  102. package/batteries/llm/gemini_generate_content.cjs +1 -1
  103. package/batteries/llm/gemini_generate_content.mjs +1 -1
  104. package/batteries/llm/litert_lm/adapter.cjs +6 -6
  105. package/batteries/llm/litert_lm/adapter.cjs.map +1 -1
  106. package/batteries/llm/litert_lm/adapter.mjs +6 -6
  107. package/batteries/llm/litert_lm/adapter.mjs.map +1 -1
  108. package/batteries/llm/litert_lm/helpers.cjs +3 -3
  109. package/batteries/llm/litert_lm/helpers.mjs +3 -3
  110. package/batteries/llm/litert_lm/types.d.ts +2 -2
  111. package/batteries/llm/litert_lm/validation.cjs +3 -3
  112. package/batteries/llm/litert_lm/validation.cjs.map +1 -1
  113. package/batteries/llm/litert_lm/validation.mjs +3 -3
  114. package/batteries/llm/litert_lm/validation.mjs.map +1 -1
  115. package/batteries/llm/litert_lm.cjs +1 -1
  116. package/batteries/llm/litert_lm.mjs +1 -1
  117. package/batteries/llm/ollama/adapter.cjs +6 -6
  118. package/batteries/llm/ollama/adapter.cjs.map +1 -1
  119. package/batteries/llm/ollama/adapter.mjs +6 -6
  120. package/batteries/llm/ollama/adapter.mjs.map +1 -1
  121. package/batteries/llm/ollama/helpers.cjs +4 -4
  122. package/batteries/llm/ollama/helpers.mjs +4 -4
  123. package/batteries/llm/ollama/types.d.ts +2 -2
  124. package/batteries/llm/ollama/validation.cjs +3 -3
  125. package/batteries/llm/ollama/validation.cjs.map +1 -1
  126. package/batteries/llm/ollama/validation.mjs +3 -3
  127. package/batteries/llm/ollama/validation.mjs.map +1 -1
  128. package/batteries/llm/ollama.cjs +2 -2
  129. package/batteries/llm/ollama.mjs +2 -2
  130. package/batteries/llm/openai_chat_completions/adapter.cjs +6 -6
  131. package/batteries/llm/openai_chat_completions/adapter.cjs.map +1 -1
  132. package/batteries/llm/openai_chat_completions/adapter.mjs +6 -6
  133. package/batteries/llm/openai_chat_completions/adapter.mjs.map +1 -1
  134. package/batteries/llm/openai_chat_completions/helpers.cjs +4 -4
  135. package/batteries/llm/openai_chat_completions/helpers.mjs +4 -4
  136. package/batteries/llm/openai_chat_completions/types.d.ts +2 -2
  137. package/batteries/llm/openai_chat_completions/validation.cjs +3 -3
  138. package/batteries/llm/openai_chat_completions/validation.cjs.map +1 -1
  139. package/batteries/llm/openai_chat_completions/validation.mjs +3 -3
  140. package/batteries/llm/openai_chat_completions/validation.mjs.map +1 -1
  141. package/batteries/llm/openai_chat_completions.cjs +2 -2
  142. package/batteries/llm/openai_chat_completions.mjs +2 -2
  143. package/batteries/llm/openai_responses/adapter.cjs +6 -6
  144. package/batteries/llm/openai_responses/adapter.cjs.map +1 -1
  145. package/batteries/llm/openai_responses/adapter.mjs +6 -6
  146. package/batteries/llm/openai_responses/adapter.mjs.map +1 -1
  147. package/batteries/llm/openai_responses/helpers.cjs +3 -3
  148. package/batteries/llm/openai_responses/helpers.mjs +3 -3
  149. package/batteries/llm/openai_responses/types.d.ts +2 -2
  150. package/batteries/llm/openai_responses/validation.cjs +3 -3
  151. package/batteries/llm/openai_responses/validation.cjs.map +1 -1
  152. package/batteries/llm/openai_responses/validation.mjs +3 -3
  153. package/batteries/llm/openai_responses/validation.mjs.map +1 -1
  154. package/batteries/llm/openai_responses.cjs +2 -2
  155. package/batteries/llm/openai_responses.mjs +2 -2
  156. package/batteries/llm/transformers_js/adapter.cjs +6 -6
  157. package/batteries/llm/transformers_js/adapter.cjs.map +1 -1
  158. package/batteries/llm/transformers_js/adapter.mjs +6 -6
  159. package/batteries/llm/transformers_js/adapter.mjs.map +1 -1
  160. package/batteries/llm/transformers_js/helpers.cjs +3 -3
  161. package/batteries/llm/transformers_js/helpers.mjs +3 -3
  162. package/batteries/llm/transformers_js/types.d.ts +2 -2
  163. package/batteries/llm/transformers_js/validation.cjs +3 -3
  164. package/batteries/llm/transformers_js/validation.cjs.map +1 -1
  165. package/batteries/llm/transformers_js/validation.mjs +3 -3
  166. package/batteries/llm/transformers_js/validation.mjs.map +1 -1
  167. package/batteries/llm/transformers_js.cjs +1 -1
  168. package/batteries/llm/transformers_js.mjs +1 -1
  169. package/batteries/llm/webllm_chat_completions/adapter.cjs +6 -6
  170. package/batteries/llm/webllm_chat_completions/adapter.cjs.map +1 -1
  171. package/batteries/llm/webllm_chat_completions/adapter.mjs +6 -6
  172. package/batteries/llm/webllm_chat_completions/adapter.mjs.map +1 -1
  173. package/batteries/llm/webllm_chat_completions/helpers.cjs +1 -1
  174. package/batteries/llm/webllm_chat_completions/helpers.mjs +1 -1
  175. package/batteries/llm/webllm_chat_completions/validation.cjs +3 -3
  176. package/batteries/llm/webllm_chat_completions/validation.cjs.map +1 -1
  177. package/batteries/llm/webllm_chat_completions/validation.mjs +3 -3
  178. package/batteries/llm/webllm_chat_completions/validation.mjs.map +1 -1
  179. package/batteries/llm/webllm_chat_completions.cjs +2 -2
  180. package/batteries/llm/webllm_chat_completions.mjs +2 -2
  181. package/batteries/llm.cjs +2 -2
  182. package/batteries/llm.mjs +2 -2
  183. package/batteries/media/builder.d.ts +3 -0
  184. package/batteries/media/contracts.cjs.map +1 -1
  185. package/batteries/media/contracts.d.ts +40 -1
  186. package/batteries/media/contracts.mjs.map +1 -1
  187. package/batteries/media/engines/sharp.cjs +36 -2
  188. package/batteries/media/engines/sharp.cjs.map +1 -1
  189. package/batteries/media/engines/sharp.mjs +36 -2
  190. package/batteries/media/engines/sharp.mjs.map +1 -1
  191. package/batteries/media/forge.cjs +5 -5
  192. package/batteries/media/forge.mjs +5 -5
  193. package/batteries/media/index.d.ts +1 -1
  194. package/batteries/media/lint.cjs +3 -2
  195. package/batteries/media/lint.cjs.map +1 -1
  196. package/batteries/media/lint.mjs +3 -2
  197. package/batteries/media/lint.mjs.map +1 -1
  198. package/batteries/media.cjs +66 -2
  199. package/batteries/media.cjs.map +1 -1
  200. package/batteries/media.mjs +66 -2
  201. package/batteries/media.mjs.map +1 -1
  202. package/batteries/orchestration/conformance.cjs +123 -74
  203. package/batteries/orchestration/conformance.cjs.map +1 -1
  204. package/batteries/orchestration/conformance.d.ts +10 -8
  205. package/batteries/orchestration/conformance.mjs +54 -5
  206. package/batteries/orchestration/conformance.mjs.map +1 -1
  207. package/batteries/orchestration/dispatch_reasoner.cjs +4 -4
  208. package/batteries/orchestration/dispatch_reasoner.mjs +4 -4
  209. package/batteries/orchestration/executor.cjs +2 -2
  210. package/batteries/orchestration/executor.mjs +2 -2
  211. package/batteries/orchestration/forge.cjs +4 -4
  212. package/batteries/orchestration/forge.mjs +4 -4
  213. package/batteries/orchestration/validation.cjs +2 -2
  214. package/batteries/orchestration/validation.mjs +2 -2
  215. package/batteries/orchestration.cjs +4 -4
  216. package/batteries/orchestration.mjs +4 -4
  217. package/batteries/sandbox/contracts/policy_enforcer.d.ts +13 -1
  218. package/batteries/sandbox/js/compartment.d.ts +7 -2
  219. package/batteries/sandbox/js/exceptions.d.ts +4 -0
  220. package/batteries/sandbox/js/runner.d.ts +1 -1
  221. package/batteries/sandbox/js/service.d.ts +1 -1
  222. package/batteries/sandbox/js/ses_contracts.d.ts +4 -3
  223. package/batteries/sandbox/js.cjs +17 -8
  224. package/batteries/sandbox/js.cjs.map +1 -1
  225. package/batteries/sandbox/js.mjs +17 -9
  226. package/batteries/sandbox/js.mjs.map +1 -1
  227. package/batteries/sandbox/manager.d.ts +4 -3
  228. package/batteries/sandbox/node/srt_enforcer.d.ts +1 -1
  229. package/batteries/sandbox/node.cjs +36 -12
  230. package/batteries/sandbox/node.cjs.map +1 -1
  231. package/batteries/sandbox/node.mjs +36 -12
  232. package/batteries/sandbox/node.mjs.map +1 -1
  233. package/batteries/sandbox/tools.cjs +1 -1
  234. package/batteries/sandbox/tools.mjs +1 -1
  235. package/batteries/sandbox/types.d.ts +10 -1
  236. package/batteries/sandbox.cjs +27 -9
  237. package/batteries/sandbox.cjs.map +1 -1
  238. package/batteries/sandbox.mjs +28 -11
  239. package/batteries/sandbox.mjs.map +1 -1
  240. package/batteries/skills.cjs +9 -9
  241. package/batteries/skills.mjs +9 -9
  242. package/batteries/tools/_shared.cjs +1 -1
  243. package/batteries/tools/_shared.mjs +1 -1
  244. package/batteries/tools/color.cjs +2 -2
  245. package/batteries/tools/color.mjs +2 -2
  246. package/batteries/tools/comparison.cjs +2 -2
  247. package/batteries/tools/comparison.mjs +2 -2
  248. package/batteries/tools/data_structure.cjs +2 -2
  249. package/batteries/tools/data_structure.mjs +2 -2
  250. package/batteries/tools/datetime_extended.cjs +3 -3
  251. package/batteries/tools/datetime_extended.mjs +3 -3
  252. package/batteries/tools/datetime_math.cjs +3 -3
  253. package/batteries/tools/datetime_math.mjs +3 -3
  254. package/batteries/tools/encoding.cjs +2 -2
  255. package/batteries/tools/encoding.mjs +2 -2
  256. package/batteries/tools/formatting.cjs +2 -2
  257. package/batteries/tools/formatting.mjs +2 -2
  258. package/batteries/tools/geo_basics.cjs +2 -2
  259. package/batteries/tools/geo_basics.mjs +2 -2
  260. package/batteries/tools/math.cjs +2 -2
  261. package/batteries/tools/math.mjs +2 -2
  262. package/batteries/tools/memory.cjs +5 -5
  263. package/batteries/tools/memory.mjs +5 -5
  264. package/batteries/tools/parsing.cjs +3 -3
  265. package/batteries/tools/parsing.mjs +3 -3
  266. package/batteries/tools/retrievables.cjs +5 -5
  267. package/batteries/tools/retrievables.mjs +5 -5
  268. package/batteries/tools/scrapper.cjs +1 -1
  269. package/batteries/tools/scrapper.mjs +1 -1
  270. package/batteries/tools/searxng.cjs +1 -1
  271. package/batteries/tools/searxng.mjs +1 -1
  272. package/batteries/tools/standing_instructions.cjs +3 -3
  273. package/batteries/tools/standing_instructions.mjs +3 -3
  274. package/batteries/tools/statistics.cjs +3 -3
  275. package/batteries/tools/statistics.mjs +3 -3
  276. package/batteries/tools/string_processing.cjs +2 -2
  277. package/batteries/tools/string_processing.mjs +2 -2
  278. package/batteries/tools/structured_data.cjs +2 -2
  279. package/batteries/tools/structured_data.mjs +2 -2
  280. package/batteries/tools/text_analysis.cjs +3 -3
  281. package/batteries/tools/text_analysis.mjs +3 -3
  282. package/batteries/tools/text_comparison.cjs +2 -2
  283. package/batteries/tools/text_comparison.mjs +2 -2
  284. package/batteries/tools/time.cjs +3 -3
  285. package/batteries/tools/time.mjs +3 -3
  286. package/batteries/tools/unit_conversion.cjs +2 -2
  287. package/batteries/tools/unit_conversion.mjs +2 -2
  288. package/batteries/tools.cjs +2 -2
  289. package/batteries/tools.mjs +2 -2
  290. package/batteries/validation.cjs +5 -5
  291. package/batteries/validation.mjs +5 -5
  292. package/batteries/vector/conformance/index.d.ts +11 -16
  293. package/batteries/vector/conformance.cjs +107 -36
  294. package/batteries/vector/conformance.cjs.map +1 -1
  295. package/batteries/vector/conformance.mjs +84 -13
  296. package/batteries/vector/conformance.mjs.map +1 -1
  297. package/batteries/vector/retrievable.cjs +1 -1
  298. package/batteries/vector/retrievable.mjs +1 -1
  299. package/batteries.cjs +5 -5
  300. package/batteries.mjs +5 -5
  301. package/{chat_common-DbbIESdo.mjs → chat_common-CmKV5Dz4.mjs} +2 -2
  302. package/{chat_common-DbbIESdo.mjs.map → chat_common-CmKV5Dz4.mjs.map} +1 -1
  303. package/{chat_common-B3O3zz-i.js → chat_common-Dpan9moo.js} +2 -2
  304. package/{chat_common-B3O3zz-i.js.map → chat_common-Dpan9moo.js.map} +1 -1
  305. package/{common-v9Jo9M5k.mjs → common-BpdHIpQE.mjs} +7 -7
  306. package/{common-v9Jo9M5k.mjs.map → common-BpdHIpQE.mjs.map} +1 -1
  307. package/{common-BV3HGeLj.js → common-H44Ik9ou.js} +7 -7
  308. package/{common-BV3HGeLj.js.map → common-H44Ik9ou.js.map} +1 -1
  309. package/common.cjs +7 -7
  310. package/common.mjs +7 -7
  311. package/{dispatch_runner-CbNyqSMy.mjs → dispatch_runner-BZDXUe0G.mjs} +5 -5
  312. package/{dispatch_runner-CbNyqSMy.mjs.map → dispatch_runner-BZDXUe0G.mjs.map} +1 -1
  313. package/{dispatch_runner-Bl3Xwebu.js → dispatch_runner-CKhm-scw.js} +5 -5
  314. package/{dispatch_runner-Bl3Xwebu.js.map → dispatch_runner-CKhm-scw.js.map} +1 -1
  315. package/dispatch_runner.cjs +1 -1
  316. package/dispatch_runner.mjs +1 -1
  317. package/{ecmascript-BSnvyY8T.js → ecmascript-CCtgamDh.js} +3 -3
  318. package/{ecmascript-BSnvyY8T.js.map → ecmascript-CCtgamDh.js.map} +1 -1
  319. package/{ecmascript-CZ7_YKfZ.mjs → ecmascript-DcmUQ9Jx.mjs} +3 -3
  320. package/{ecmascript-CZ7_YKfZ.mjs.map → ecmascript-DcmUQ9Jx.mjs.map} +1 -1
  321. package/eslint.cjs +1 -1
  322. package/eslint.mjs +1 -1
  323. package/exceptions.cjs +1 -1
  324. package/exceptions.mjs +1 -1
  325. package/forge.cjs +2 -2
  326. package/forge.mjs +2 -2
  327. package/guards.cjs +7 -7
  328. package/guards.mjs +7 -7
  329. package/{helpers-CDmLDBq5.mjs → helpers-BH7HTtkD.mjs} +3 -3
  330. package/{helpers-CDmLDBq5.mjs.map → helpers-BH7HTtkD.mjs.map} +1 -1
  331. package/{helpers-Tvvwpx1M.js → helpers-CEjjkXso.js} +3 -3
  332. package/{helpers-Tvvwpx1M.js.map → helpers-CEjjkXso.js.map} +1 -1
  333. package/index.cjs +10 -10
  334. package/index.mjs +10 -10
  335. package/{isolation-BQCTQYZ_.js → isolation-7Jrcucgc.js} +11 -11
  336. package/isolation-7Jrcucgc.js.map +1 -0
  337. package/{isolation-7xbkc12r.mjs → isolation-CO0NiK8R.mjs} +11 -11
  338. package/isolation-CO0NiK8R.mjs.map +1 -0
  339. package/lib/classes/tokenizable.d.ts +2 -3
  340. package/mcp/adk-docs-corpus.json +2 -2
  341. package/package.json +469 -469
  342. package/{retrievable-C5dXuDhD.js → retrievable-BTwjmPnl.js} +3 -3
  343. package/{retrievable-C5dXuDhD.js.map → retrievable-BTwjmPnl.js.map} +1 -1
  344. package/{retrievable-gl_TIHnX.mjs → retrievable-CXTAUuuv.mjs} +3 -3
  345. package/{retrievable-gl_TIHnX.mjs.map → retrievable-CXTAUuuv.mjs.map} +1 -1
  346. package/{scrapper-DD6-_2u-.js → scrapper-CJexXXK-.js} +4 -4
  347. package/{scrapper-DD6-_2u-.js.map → scrapper-CJexXXK-.js.map} +1 -1
  348. package/{scrapper-u_orpxIB.mjs → scrapper-DiQ5FfDL.mjs} +4 -4
  349. package/{scrapper-u_orpxIB.mjs.map → scrapper-DiQ5FfDL.mjs.map} +1 -1
  350. package/{searxng-fVdJUCK2.mjs → searxng-BFTJ6rTE.mjs} +4 -4
  351. package/{searxng-fVdJUCK2.mjs.map → searxng-BFTJ6rTE.mjs.map} +1 -1
  352. package/{searxng-C7GK0Nrz.js → searxng-DzlGZG4V.js} +4 -4
  353. package/{searxng-C7GK0Nrz.js.map → searxng-DzlGZG4V.js.map} +1 -1
  354. package/server.json +2 -2
  355. package/skills/adk-assembly/SKILL.md +2 -2
  356. package/{spooled_artifact-DriNQRj7.js → spooled_artifact-BpcesRBv.js} +384 -384
  357. package/spooled_artifact-BpcesRBv.js.map +1 -0
  358. package/{spooled_artifact-BkueYJhR.mjs → spooled_artifact-Bw_7swIp.mjs} +385 -385
  359. package/spooled_artifact-Bw_7swIp.mjs.map +1 -0
  360. package/spooled_artifact.cjs +2 -2
  361. package/spooled_artifact.mjs +2 -2
  362. package/{spooled_markdown_artifact-CfHRZUkl.mjs → spooled_markdown_artifact-vd6eNtIP.mjs} +3 -3
  363. package/{spooled_markdown_artifact-CfHRZUkl.mjs.map → spooled_markdown_artifact-vd6eNtIP.mjs.map} +1 -1
  364. package/{spooled_markdown_artifact-C_VkCDhF.js → spooled_markdown_artifact-wJPnE8Ij.js} +3 -3
  365. package/{spooled_markdown_artifact-C_VkCDhF.js.map → spooled_markdown_artifact-wJPnE8Ij.js.map} +1 -1
  366. package/{thought-B8JAi3-W.mjs → thought-BE1KGEhV.mjs} +3 -3
  367. package/{thought-B8JAi3-W.mjs.map → thought-BE1KGEhV.mjs.map} +1 -1
  368. package/{thought--fRgOwTP.js → thought-bS7O9O5H.js} +3 -3
  369. package/{thought--fRgOwTP.js.map → thought-bS7O9O5H.js.map} +1 -1
  370. package/{tokenizable-CWW7iSrD.js → tokenizable-BMZuGWRd.js} +35 -29
  371. package/tokenizable-BMZuGWRd.js.map +1 -0
  372. package/{tokenizable-DLMP68ZV.mjs → tokenizable-VB4Av8GF.mjs} +36 -30
  373. package/tokenizable-VB4Av8GF.mjs.map +1 -0
  374. package/{tool_call-CPjyvkm4.mjs → tool_call-Cfaj-6zK.mjs} +4 -4
  375. package/{tool_call-CPjyvkm4.mjs.map → tool_call-Cfaj-6zK.mjs.map} +1 -1
  376. package/{tool_call-DgqVwL5n.js → tool_call-Fs_Uh5wQ.js} +4 -4
  377. package/{tool_call-DgqVwL5n.js.map → tool_call-Fs_Uh5wQ.js.map} +1 -1
  378. package/{tools-BmLzkvNr.mjs → tools-B3_8C78Q.mjs} +6 -6
  379. package/{tools-BmLzkvNr.mjs.map → tools-B3_8C78Q.mjs.map} +1 -1
  380. package/{tools-DmcIe2Cb.js → tools-CqOcmHR8.js} +6 -6
  381. package/{tools-DmcIe2Cb.js.map → tools-CqOcmHR8.js.map} +1 -1
  382. package/{toon-BvTQsKdN.mjs → toon-BSlr88px.mjs} +5 -5
  383. package/{toon-BvTQsKdN.mjs.map → toon-BSlr88px.mjs.map} +1 -1
  384. package/{toon-B05eKx-q.js → toon-D71tkyI3.js} +5 -5
  385. package/{toon-B05eKx-q.js.map → toon-D71tkyI3.js.map} +1 -1
  386. package/{turn_runner-DEGCvfVZ.mjs → turn_runner-BHHD6h77.mjs} +5 -5
  387. package/{turn_runner-DEGCvfVZ.mjs.map → turn_runner-BHHD6h77.mjs.map} +1 -1
  388. package/{turn_runner-DT8TseR4.js → turn_runner-DhLI7OTH.js} +5 -5
  389. package/{turn_runner-DT8TseR4.js.map → turn_runner-DhLI7OTH.js.map} +1 -1
  390. package/turn_runner.cjs +1 -1
  391. package/turn_runner.mjs +1 -1
  392. package/types-D6X_aUIb.mjs.map +1 -1
  393. package/types-DrSosVaM.js.map +1 -1
  394. package/{validate-lzy9nG_E.mjs → validate-Bi7FGjoq.mjs} +13 -1
  395. package/{validate-lzy9nG_E.mjs.map → validate-Bi7FGjoq.mjs.map} +1 -1
  396. package/{validate-CdOS7S2u.js → validate-CkQI-48O.js} +13 -1
  397. package/{validate-CdOS7S2u.js.map → validate-CkQI-48O.js.map} +1 -1
  398. package/{xml-DDTIMpY3.js → xml-BeNvlifb.js} +5 -5
  399. package/{xml-DDTIMpY3.js.map → xml-BeNvlifb.js.map} +1 -1
  400. package/{xml-VhJ4NrMB.mjs → xml-vyCZZiF_.mjs} +5 -5
  401. package/{xml-VhJ4NrMB.mjs.map → xml-vyCZZiF_.mjs.map} +1 -1
  402. package/{yaml-Cx16IYJq.js → yaml-DhLLa2cj.js} +5 -5
  403. package/{yaml-Cx16IYJq.js.map → yaml-DhLLa2cj.js.map} +1 -1
  404. package/{yaml-Du4wFGzL.mjs → yaml-Dtz0Bd7J.mjs} +5 -5
  405. package/{yaml-Du4wFGzL.mjs.map → yaml-Dtz0Bd7J.mjs.map} +1 -1
  406. package/artifact_methods-BMCahBLn.mjs +0 -1
  407. package/artifact_methods-f_bSy4kX.js +0 -1
  408. package/isolation-7xbkc12r.mjs.map +0 -1
  409. package/isolation-BQCTQYZ_.js.map +0 -1
  410. package/spooled_artifact-BkueYJhR.mjs.map +0 -1
  411. package/spooled_artifact-DriNQRj7.js.map +0 -1
  412. package/tokenizable-CWW7iSrD.js.map +0 -1
  413. package/tokenizable-DLMP68ZV.mjs.map +0 -1
@@ -1,7 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  require("../../chunk-Cek0wNdY.js");
3
3
  const require_tool_parsers = require("../../tool_parsers-csSBFWob.js");
4
- const require_helpers = require("../../helpers-Tvvwpx1M.js");
4
+ const require_helpers = require("../../helpers-CEjjkXso.js");
5
5
  const require_batteries_llm_openai_chat_completions_helpers = require("./openai_chat_completions/helpers.cjs");
6
6
  const require_gpu_budget = require("../../gpu_budget-BBIUyLoj.js");
7
7
  const require_lifecycle = require("../../lifecycle-vYQJ2rmf.js");
@@ -1,5 +1,5 @@
1
1
  import { C as mistralToolCallParser, D as qwen3CoderToolCallParser, E as pythonicToolCallParser, O as resolveToolCallParser, T as phiToolCallParser, b as hermesToolCallParser, i as createAutoToolCallParser, n as DEFAULT_TOOL_CALL_PARSER_ORDER, t as BUNDLED_TOOL_CALL_PARSERS, v as gemmaToolCallParser, w as noneToolCallParser, x as llama3JsonToolCallParser, y as gptOssToolCallParser } from "../../tool_parsers-DgZhgxV8.mjs";
2
- import { A as renderMemories, C as looksLikeSpooledArtifact, D as renderArtifactHandleBody, F as renderThirdPartyPrivateRetrievables, I as renderThirdPartyPublicRetrievables, L as renderThought, M as renderRetrievableSafetyDirective, N as renderRetrievables, O as renderChatCompletionsSystemPrompt, P as renderStandingInstructions, R as renderTrustedContent, _ as defaultRenderUntrustedContent, c as defaultRenderMemories, d as defaultRenderRetrievables, f as defaultRenderStandingInstructions, g as defaultRenderTrustedContent, h as defaultRenderThought, i as defaultFilterThoughts, k as renderFirstPartyRetrievables, m as defaultRenderThirdPartyPublicRetrievables, o as defaultRenderChatCompletionsSystemPrompt, p as defaultRenderThirdPartyPrivateRetrievables, r as defaultDescriptionToChatCompletionsJsonSchema, s as defaultRenderFirstPartyRetrievables, u as defaultRenderRetrievableSafetyDirective, x as filterThoughts, y as descriptionToChatCompletionsJsonSchema, z as renderUntrustedContent } from "../../helpers-CDmLDBq5.mjs";
2
+ import { A as renderMemories, C as looksLikeSpooledArtifact, D as renderArtifactHandleBody, F as renderThirdPartyPrivateRetrievables, I as renderThirdPartyPublicRetrievables, L as renderThought, M as renderRetrievableSafetyDirective, N as renderRetrievables, O as renderChatCompletionsSystemPrompt, P as renderStandingInstructions, R as renderTrustedContent, _ as defaultRenderUntrustedContent, c as defaultRenderMemories, d as defaultRenderRetrievables, f as defaultRenderStandingInstructions, g as defaultRenderTrustedContent, h as defaultRenderThought, i as defaultFilterThoughts, k as renderFirstPartyRetrievables, m as defaultRenderThirdPartyPublicRetrievables, o as defaultRenderChatCompletionsSystemPrompt, p as defaultRenderThirdPartyPrivateRetrievables, r as defaultDescriptionToChatCompletionsJsonSchema, s as defaultRenderFirstPartyRetrievables, u as defaultRenderRetrievableSafetyDirective, x as filterThoughts, y as descriptionToChatCompletionsJsonSchema, z as renderUntrustedContent } from "../../helpers-BH7HTtkD.mjs";
3
3
  import { extractReasoningFields } from "./openai_chat_completions/helpers.mjs";
4
4
  import { C as resolveReasoningParser, S as noneReasoningParser, _ as gemmaChannelReasoningParser, a as defaultResolveGenerationOptions, b as makeHarmonyAnalysisReasoningParser, c as DEFAULT_REASONING_PARSER_ORDER, i as GENERATION_DEFAULTS, l as buildBundledReasoningParsers, n as isGpuOutOfMemoryError, o as resolveGenerationOptions, r as probeGpuBudget, s as BUNDLED_REASONING_PARSERS, t as instrumentGpuBuffers, u as createAutoReasoningParser, v as harmonyAnalysisReasoningParser, w as thinkTagReasoningParser, x as makeThinkTagReasoningParser, y as makeGemmaChannelReasoningParser } from "../../gpu_budget-Bi2nUUil.mjs";
5
5
  import { n as emitLifecycle, t as defaultEmitLifecycle } from "../../lifecycle-C4kwYJ-N.mjs";
@@ -1,16 +1,16 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  require("../../../chunk-Cek0wNdY.js");
3
3
  const require_guards = require("../../../guards-05Uq3J4M.js");
4
- const require_tokenizable = require("../../../tokenizable-CWW7iSrD.js");
5
- const require_spooled_artifact = require("../../../spooled_artifact-DriNQRj7.js");
6
- const require_thought = require("../../../thought--fRgOwTP.js");
7
- const require_tool_call = require("../../../tool_call-DgqVwL5n.js");
8
- require("../../../common-BV3HGeLj.js");
4
+ const require_tokenizable = require("../../../tokenizable-BMZuGWRd.js");
5
+ const require_spooled_artifact = require("../../../spooled_artifact-BpcesRBv.js");
6
+ const require_thought = require("../../../thought-bS7O9O5H.js");
7
+ const require_tool_call = require("../../../tool_call-Fs_Uh5wQ.js");
8
+ require("../../../common-H44Ik9ou.js");
9
9
  require("../../../guards.cjs");
10
10
  const require_lib_utils_retry = require("../../../lib/utils/retry.cjs");
11
11
  const require_tool_parsers = require("../../../tool_parsers-csSBFWob.js");
12
12
  const require_batteries_storage_in_memory = require("../../storage/in_memory.cjs");
13
- const require_helpers = require("../../../helpers-Tvvwpx1M.js");
13
+ const require_helpers = require("../../../helpers-CEjjkXso.js");
14
14
  const require_batteries_llm_ollama_exceptions = require("./exceptions.cjs");
15
15
  const require_batteries_llm_ollama_validation = require("./validation.cjs");
16
16
  const require_batteries_llm_ollama_helpers = require("./helpers.cjs");
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.cjs","names":["#baseline"],"sources":["../../../../src/batteries/llm/ollama/adapter.ts"],"sourcesContent":["/**\n * Cross-environment executor adapter for the native Ollama `/api/chat` endpoint.\n *\n * @module @nhtio/adk/batteries/llm/ollama/adapter\n *\n * @remarks\n * Native Ollama LLM adapter targeting `/api/chat` (NOT the OpenAI-compat `/v1` layer — the\n * `openai_chat_completions` battery already covers `/v1`). Works against both LOCAL Ollama\n * (`http://localhost:11434`, no auth) and CLOUD Ollama (`https://ollama.com`, `Authorization:\n * Bearer <apiKey>`); the only difference is `baseURL` + the auth header. Native is HTTP-only — a\n * Unix-socket deployment is reached via a custom `fetch` or an external bridge, not an adapter\n * option.\n *\n * Structurally a sibling of the OpenAI Chat Completions adapter, with the native-wire divergences:\n *\n * - Request body: generation params are NESTED under `options`; `think` / `format` / `keep_alive`\n * are top-level native controls; ADK control fields are stripped before sending.\n * - Streaming: NDJSON (newline-delimited JSON objects), terminated in-band by `done: true` — there\n * is no SSE `data:` framing and no `[DONE]` sentinel. Whole `tool_calls` arrive per chunk (no\n * delta accumulation).\n * - Reasoning: the single native `message.thinking` field (no multi-field precedence dance).\n * - Tool calls: `arguments` is already a JSON OBJECT (no `JSON.parse`); native calls carry no `id`,\n * so the adapter synthesizes one (uuidv6) for correlation / checksum / spool keying. Tool-result\n * history messages use `tool_name` (the originating tool), not `tool_call_id`.\n * - Generation stats: the terminal `done: true` object's token counts + nanosecond durations +\n * `done_reason` are surfaced via `helpers.reportGenerationStats`.\n */\n\nimport { DateTime } from 'luxon'\nimport { sha256 } from 'js-sha256'\nimport { v6 as uuidv6 } from 'uuid'\nimport { validateOptions } from './validation'\nimport { isError, isInstanceOf, isObject } from '@nhtio/adk/guards'\nimport { resolveToolCallParser } from '../chat_common/tool_parsers'\nimport { canonicalStringify } from '../../../lib/utils/canonical_json'\nimport { InMemorySpoolStore } from '@nhtio/adk/batteries/storage/in_memory'\nimport { looksLikeSpooledArtifact, normalizeToolName } from '../chat_common/helpers'\nimport {\n computeBackoff,\n sleepWithJitter,\n parseRetryAfter,\n linkAbortSignals,\n} from '../../../lib/utils/retry'\nimport {\n Tokenizable,\n ToolCall,\n Message,\n Thought,\n SpooledArtifact,\n Media,\n ArtifactTool,\n} from '@nhtio/adk/common'\nimport {\n E_INVALID_OLLAMA_OPTIONS,\n E_OLLAMA_CONTEXT_OVERFLOW,\n E_OLLAMA_HTTP_ERROR,\n E_OLLAMA_STREAM_ERROR,\n E_OLLAMA_STREAM_STALLED,\n E_OLLAMA_REQUEST_TIMEOUT,\n E_OLLAMA_INVALID_TOOL_CALL_ARGS,\n} from './exceptions'\nimport {\n defaultDescriptionToChatCompletionsJsonSchema,\n defaultRenderUntrustedContent,\n defaultRenderTrustedContent,\n defaultRenderStandingInstructions,\n defaultRenderMemories,\n defaultRenderRetrievables,\n defaultRenderRetrievableHandleBody,\n defaultRenderRetrievableSafetyDirective,\n defaultRenderFirstPartyRetrievables,\n defaultRenderThirdPartyPublicRetrievables,\n defaultRenderThirdPartyPrivateRetrievables,\n defaultRenderThought,\n defaultFilterThoughts,\n defaultToolsToChatCompletionsTools,\n defaultRenderChatCompletionsSystemPrompt,\n defaultRenderOllamaTimelineMessage,\n defaultRenderOllamaToolCallResult,\n defaultBuildOllamaHistory,\n ollamaToolsFromTools,\n} from './helpers'\nimport type { DispatchContext } from '@nhtio/adk/types'\nimport type { Tool, Memory, TokenEncoding } from '@nhtio/adk/common'\nimport type {\n DispatchExecutorFn,\n DispatchExecutorHelpers,\n GenerationStats,\n} from '@nhtio/adk/dispatch_runner'\nimport type {\n OllamaAdapterOptions,\n OllamaHelpers,\n OllamaChatRequestBody,\n OllamaChatStreamChunk,\n OllamaChatResponse,\n OllamaToolCall,\n OllamaRuntimeOptions,\n} from './types'\n\n// ─── An assembled native tool call (id synthesized; args already an object) ───\n// NOTE: unlike the OpenAI adapter, the request body is assembled EXPLICITLY (model / messages /\n// stream / think / format / keep_alive / options / tools) rather than by spreading non-control\n// keys, because native generation params live nested under `options`, not at the top level. So\n// there is no ADK_CONTROL_KEYS strip-set here.\n\ninterface AssembledOllamaToolCall {\n id: string\n name: string\n args: Record<string, unknown>\n}\n\n// ─── Option merging ───────────────────────────────────────────────────────────\n\nconst mergeRecord = <T extends Record<string, unknown>>(\n layers: ReadonlyArray<T | undefined>\n): T | undefined => {\n let merged: T | undefined\n for (const layer of layers) {\n if (!layer) continue\n merged = { ...(merged ?? ({} as T)), ...layer }\n }\n return merged\n}\n\nconst mergeOptions = (\n baseline: OllamaAdapterOptions,\n exec: Partial<OllamaAdapterOptions> | undefined,\n stash: Partial<OllamaAdapterOptions> | undefined\n): Partial<OllamaAdapterOptions> => {\n const layers = [baseline as Partial<OllamaAdapterOptions>, exec ?? {}, stash ?? {}]\n const out: Record<string, unknown> = {}\n for (const layer of layers) {\n for (const [k, v] of Object.entries(layer)) {\n if (v === undefined) continue\n if (k === 'headers' || k === 'helpers' || k === 'retry' || k === 'options') continue\n out[k] = v\n }\n }\n const headers = mergeRecord(layers.map((l) => l.headers as Record<string, string> | undefined))\n if (headers !== undefined) out.headers = headers\n const helpers = mergeRecord(layers.map((l) => l.helpers as Record<string, unknown> | undefined))\n if (helpers !== undefined) out.helpers = helpers\n const retry = mergeRecord(layers.map((l) => l.retry as Record<string, unknown> | undefined))\n if (retry !== undefined) out.retry = retry\n // Nested runtime `options` merge key-by-key, like headers — a stash override that sets one\n // sampling param should not clear the others set in the constructor.\n const runtime = mergeRecord(layers.map((l) => l.options as Record<string, unknown> | undefined))\n if (runtime !== undefined) out.options = runtime\n return out as Partial<OllamaAdapterOptions>\n}\n\n// ─── Helper resolution ────────────────────────────────────────────────────────\n\nconst resolveHelpers = (overrides: Partial<OllamaHelpers> | undefined): OllamaHelpers => {\n const src = overrides ?? {}\n return {\n descriptionToChatCompletionsJsonSchema:\n src.descriptionToChatCompletionsJsonSchema ?? defaultDescriptionToChatCompletionsJsonSchema,\n renderUntrustedContent: src.renderUntrustedContent ?? defaultRenderUntrustedContent,\n renderTrustedContent: src.renderTrustedContent ?? defaultRenderTrustedContent,\n renderStandingInstructions: src.renderStandingInstructions ?? defaultRenderStandingInstructions,\n renderMemories: src.renderMemories ?? defaultRenderMemories,\n renderRetrievables: src.renderRetrievables ?? defaultRenderRetrievables,\n renderRetrievableHandleBody:\n src.renderRetrievableHandleBody ?? defaultRenderRetrievableHandleBody,\n renderRetrievableSafetyDirective:\n src.renderRetrievableSafetyDirective ?? defaultRenderRetrievableSafetyDirective,\n renderFirstPartyRetrievables:\n src.renderFirstPartyRetrievables ?? defaultRenderFirstPartyRetrievables,\n renderThirdPartyPublicRetrievables:\n src.renderThirdPartyPublicRetrievables ?? defaultRenderThirdPartyPublicRetrievables,\n renderThirdPartyPrivateRetrievables:\n src.renderThirdPartyPrivateRetrievables ?? defaultRenderThirdPartyPrivateRetrievables,\n renderThought: src.renderThought ?? defaultRenderThought,\n filterThoughts: src.filterThoughts ?? defaultFilterThoughts,\n toolsToChatCompletionsTools:\n src.toolsToChatCompletionsTools ?? defaultToolsToChatCompletionsTools,\n renderChatCompletionsSystemPrompt:\n src.renderChatCompletionsSystemPrompt ?? defaultRenderChatCompletionsSystemPrompt,\n renderOllamaTimelineMessage:\n src.renderOllamaTimelineMessage ?? defaultRenderOllamaTimelineMessage,\n renderOllamaToolCallResult: src.renderOllamaToolCallResult ?? defaultRenderOllamaToolCallResult,\n buildOllamaHistory: src.buildOllamaHistory ?? defaultBuildOllamaHistory,\n }\n}\n\n// ─── ID / checksum / time helpers ─────────────────────────────────────────────\n\nconst computeChecksum = (tool: string, args: unknown): string =>\n sha256(canonicalStringify({ tool, args }))\n\nconst nowIso = (): string => DateTime.now().toISO() ?? new Date().toISOString()\n\nconst estimateTokensOf = async (\n value: { estimateTokens: (encoding: TokenEncoding) => number | Promise<number> },\n encoding: TokenEncoding\n): Promise<number> => Promise.resolve(value.estimateTokens(encoding))\n\n// ─── Generation-stats extraction ──────────────────────────────────────────────\n\nconst extractGenerationStats = (\n src: OllamaChatStreamChunk | OllamaChatResponse,\n model: string\n): GenerationStats => {\n const stats: GenerationStats = { provider: 'ollama', model: src.model ?? model, raw: { ...src } }\n if (typeof src.prompt_eval_count === 'number') stats.promptTokens = src.prompt_eval_count\n if (typeof src.eval_count === 'number') stats.completionTokens = src.eval_count\n if (typeof src.prompt_eval_count === 'number' && typeof src.eval_count === 'number') {\n stats.totalTokens = src.prompt_eval_count + src.eval_count\n }\n if (typeof src.total_duration === 'number') stats.totalDurationNs = src.total_duration\n if (typeof src.load_duration === 'number') stats.loadDurationNs = src.load_duration\n if (typeof src.prompt_eval_duration === 'number') {\n stats.promptEvalDurationNs = src.prompt_eval_duration\n }\n if (typeof src.eval_duration === 'number') stats.evalDurationNs = src.eval_duration\n if (typeof src.done_reason === 'string') stats.finishReason = src.done_reason\n return stats\n}\n\n// ─── Adapter class ────────────────────────────────────────────────────────────\n\n/**\n * Opinionated cross-environment LLM adapter for the native Ollama `/api/chat` wire shape.\n *\n * @remarks\n * Construction validates options eagerly via {@link validateOptions} and throws\n * {@link @nhtio/adk/batteries/llm/ollama!E_INVALID_OLLAMA_OPTIONS} on failure. The returned instance is reusable: call\n * {@link OllamaAdapter.executor} once per `DispatchRunner` configuration to obtain a\n * {@link @nhtio/adk!DispatchExecutorFn} bound to the baseline plus optional executor-scope\n * overrides. Per-iteration overrides live on `ctx.stash.ollama` and take highest precedence;\n * `headers`, `helpers`, `retry`, and the nested runtime `options` merge key-by-key across all three\n * layers, every other field is replaced wholesale at the highest layer that sets it.\n */\nexport class OllamaAdapter {\n /** Customary key for per-iteration overrides on `ctx.stash`. */\n public static readonly STASH_KEY = 'ollama' as const\n\n readonly #baseline: OllamaAdapterOptions\n\n /**\n * @param options - Constructor-baseline options. Re-validated on every iteration after\n * per-dispatch and per-iteration overrides are layered in.\n * @throws {@link @nhtio/adk/batteries/llm/ollama!E_INVALID_OLLAMA_OPTIONS} when `options` does not satisfy `ollamaOptionsSchema`.\n */\n constructor(options: unknown) {\n this.#baseline = validateOptions(options)\n }\n\n /**\n * Returns a {@link @nhtio/adk!DispatchExecutorFn} bound to this adapter's baseline plus optional\n * executor-scope overrides.\n *\n * @param overrides - Optional executor-scope overrides. Higher precedence than the baseline,\n * lower precedence than `ctx.stash[STASH_KEY]`.\n */\n executor(overrides?: Partial<OllamaAdapterOptions>): DispatchExecutorFn {\n const baseline = this.#baseline\n const adapterClass = OllamaAdapter\n return async (ctx: DispatchContext, helpers: DispatchExecutorHelpers): Promise<void> => {\n const localWarn = (msg: string): void => {\n helpers.log.warn({ kind: 'helper-warning', message: msg })\n }\n\n // ── Step 1: merge & validate ──────────────────────────────────────────\n const stashRaw = ctx.stash.get(adapterClass.STASH_KEY, {}) as unknown\n const stashOverrides =\n stashRaw && typeof stashRaw === 'object' ? (stashRaw as Partial<OllamaAdapterOptions>) : {}\n const merged = validateOptions(mergeOptions(baseline, overrides, stashOverrides))\n\n // Cross-field invariant: tokenEncoding non-null requires contextWindow.\n if (merged.tokenEncoding !== null && merged.contextWindow === undefined) {\n throw new E_INVALID_OLLAMA_OPTIONS([\n 'tokenEncoding is non-null but contextWindow is undefined',\n ])\n }\n\n // ── Step 2: resolve helpers ───────────────────────────────────────────\n const resolvedHelpers = resolveHelpers(merged.helpers)\n\n // ── Step 3: artifact-reader tools ─────────────────────────────────────\n // Forged by the DispatchRunner CORE into `ctx.tools` before the input pipeline runs (generation is a\n // generic core concern; this battery owns only representation). Read the pre-forged `ctx.tools`\n // directly — no local merge, no bindContext here.\n\n // ── Step 4: pre-render tool-call results ──────────────────────────────\n // Key by primitive identity: duplicate ids must not cross-wire pre-rendered results.\n const renderedToolCallResults = new Map<ToolCall, string>()\n for (const tc of ctx.turnToolCalls) {\n const rendered = await resolvedHelpers.renderOllamaToolCallResult({\n toolCall: tc,\n results: tc.results as\n | Tokenizable\n | SpooledArtifact\n | SpooledArtifact[]\n | Media\n | Media[],\n tool: ctx.tools.get(tc.tool) as Tool | ArtifactTool | undefined,\n renderUntrustedContent: resolvedHelpers.renderUntrustedContent,\n renderTrustedContent: resolvedHelpers.renderTrustedContent,\n unsupportedMediaPolicy: merged.unsupportedMediaPolicy ?? 'throw',\n warn: localWarn,\n })\n renderedToolCallResults.set(tc, rendered)\n }\n\n // ── Step 5: context window enforcement ────────────────────────────────\n if (merged.tokenEncoding !== null && merged.contextWindow !== undefined) {\n const encoding = merged.tokenEncoding as TokenEncoding\n let spTokens = await estimateTokensOf(ctx.systemPrompt, encoding)\n let siTokens = 0\n for (const si of ctx.standingInstructions) {\n siTokens += await estimateTokensOf(si, encoding)\n }\n let memTokens = 0\n for (const mem of ctx.turnMemories as Set<Memory>) {\n memTokens += await estimateTokensOf(mem.content, encoding)\n }\n let retTokens = 0\n for (const r of ctx.turnRetrievables) {\n retTokens +=\n !r.inline && SpooledArtifact.isSpooledArtifact(r.content) && r.content.hasSizeHints()\n ? r.content.estimateHandleTokens(\n r.id,\n encoding,\n resolvedHelpers.renderRetrievableHandleBody\n )\n : await estimateTokensOf(r.content, encoding)\n }\n let tlTokens = 0\n for (const msg of ctx.turnMessages) {\n if (msg.content !== undefined) {\n tlTokens += await estimateTokensOf(msg.content, encoding)\n }\n }\n for (const th of ctx.turnThoughts) {\n tlTokens += await estimateTokensOf(th.content, encoding)\n }\n for (const rendered of renderedToolCallResults.values()) {\n tlTokens += await estimateTokensOf(new Tokenizable(rendered), encoding)\n }\n // Tool DECLARATIONS: Ollama renders the `tools` array through the MODEL'S OWN Go chat template\n // (the `.Tools` template variable), which is per-model and lives SERVER-side — there is no single\n // fixed conversion to reproduce client-side (seeing the exact string needs `ollama show` / debug\n // logs; evaluating the model's Go template via /api/show is deliberately out of scope for a guard\n // backstop). Tally the serialized wire `tools` JSON as an honest FLOOR. Without this the guard\n // undercounts a tool-heavy prompt by the entire declaration block.\n let toolTokens = 0\n const visibleTools = ctx.tools.visible()\n if (visibleTools.length > 0) {\n const toolsJson = JSON.stringify(\n ollamaToolsFromTools(visibleTools, {\n descriptionToChatCompletionsJsonSchema:\n resolvedHelpers.descriptionToChatCompletionsJsonSchema,\n })\n )\n toolTokens = await estimateTokensOf(new Tokenizable(toolsJson), encoding)\n }\n const total = spTokens + siTokens + memTokens + retTokens + tlTokens + toolTokens\n const perBucketObj = {\n systemPrompt: spTokens,\n standingInstructions: siTokens,\n memories: memTokens,\n retrievables: retTokens,\n timeline: tlTokens,\n tools: toolTokens,\n }\n helpers.log.debug({\n kind: 'context-window-usage',\n message: `Context window usage: ${total}/${merged.contextWindow} tokens`,\n payload: { total, limit: merged.contextWindow, encoding, perBucket: perBucketObj },\n })\n if (total > merged.contextWindow) {\n throw new E_OLLAMA_CONTEXT_OVERFLOW([\n total,\n merged.contextWindow,\n encoding,\n JSON.stringify(perBucketObj),\n ])\n }\n }\n\n // ── Step 6: build request body ────────────────────────────────────────\n const { messages: wireMessages, reasoningPayloads } =\n await resolvedHelpers.buildOllamaHistory({\n systemPrompt: ctx.systemPrompt,\n standingInstructions: ctx.standingInstructions,\n memories: ctx.turnMemories,\n retrievables: ctx.turnRetrievables,\n messages: ctx.turnMessages,\n thoughts: ctx.turnThoughts,\n toolCalls: ctx.turnToolCalls,\n tools: ctx.tools,\n renderedToolCallResults,\n bucketOrder: merged.bucketOrder ?? [\n 'standingInstructions',\n 'memories',\n 'retrievables',\n 'timeline',\n ],\n selfIdentity: merged.selfIdentity ?? 'assistant',\n thoughtSurfacing: merged.thoughtSurfacing ?? 'all-self',\n replayCompatibility: merged.replayCompatibility ?? [],\n renderOllamaToolCallResult: resolvedHelpers.renderOllamaToolCallResult,\n renderChatCompletionsSystemPrompt: resolvedHelpers.renderChatCompletionsSystemPrompt,\n renderStandingInstructions: resolvedHelpers.renderStandingInstructions,\n renderMemories: resolvedHelpers.renderMemories,\n renderRetrievables: resolvedHelpers.renderRetrievables,\n renderRetrievableHandleBody: resolvedHelpers.renderRetrievableHandleBody,\n renderRetrievableSafetyDirective: resolvedHelpers.renderRetrievableSafetyDirective,\n renderFirstPartyRetrievables: resolvedHelpers.renderFirstPartyRetrievables,\n renderThirdPartyPublicRetrievables: resolvedHelpers.renderThirdPartyPublicRetrievables,\n renderThirdPartyPrivateRetrievables: resolvedHelpers.renderThirdPartyPrivateRetrievables,\n renderOllamaTimelineMessage: resolvedHelpers.renderOllamaTimelineMessage,\n renderThought: resolvedHelpers.renderThought,\n filterThoughts: resolvedHelpers.filterThoughts,\n renderUntrustedContent: resolvedHelpers.renderUntrustedContent,\n renderTrustedContent: resolvedHelpers.renderTrustedContent,\n unsupportedMediaPolicy: merged.unsupportedMediaPolicy ?? 'throw',\n warn: localWarn,\n })\n\n const stream = merged.stream ?? true\n const body: OllamaChatRequestBody = {\n model: merged.model,\n messages: wireMessages,\n stream,\n }\n // Native top-level controls — included only when defined. `think` is conditional-presence:\n // omitted → absent; `false` → think:false; truthy/effort → verbatim.\n if (merged.think !== undefined) body.think = merged.think\n if (merged.format !== undefined) body.format = merged.format\n if (merged.keep_alive !== undefined) body.keep_alive = merged.keep_alive\n if (merged.options !== undefined) body.options = merged.options as OllamaRuntimeOptions\n const toolsArr = ctx.tools.visible()\n if (toolsArr.length > 0) {\n body.tools = ollamaToolsFromTools(toolsArr, {\n descriptionToChatCompletionsJsonSchema:\n resolvedHelpers.descriptionToChatCompletionsJsonSchema,\n })\n }\n if (reasoningPayloads.length > 0) {\n body._adk_reasoning_payloads = reasoningPayloads\n }\n\n // One id for this whole generation — correlates the TO tap (onPromptAssembled) with the FROM tap\n // (onRawGeneration) below.\n const dispatchStreamId = uuidv6()\n\n // Prompt-assembled observability tap: the EXACT request body going TO Ollama, the instant it is built\n // and BEFORE the POST. Mirror of onRawGeneration. Handed back AS-IS — no redaction — and swallow\n // observer errors so it can never corrupt the generation path.\n if (merged.onPromptAssembled) {\n try {\n merged.onPromptAssembled({\n battery: 'ollama',\n kind: 'request-body',\n messages: body.messages,\n tools: body.tools,\n requestBody: body,\n streamed: stream,\n streamId: dispatchStreamId,\n })\n } catch {\n /* observer errors are non-fatal */\n }\n }\n\n // ── Step 7: POST with retry / timeout loop ────────────────────────────\n const rawBase = merged.baseURL ?? 'http://localhost:11434'\n const baseURL = rawBase.endsWith('/') ? rawBase.slice(0, -1) : rawBase\n const url = `${baseURL}/api/chat`\n\n const headers: Record<string, string> = { 'Content-Type': 'application/json' }\n if (stream) headers['Accept'] = 'application/x-ndjson'\n if (merged.apiKey) headers['Authorization'] = `Bearer ${merged.apiKey}`\n if (merged.headers) Object.assign(headers, merged.headers)\n\n const retryCfg = {\n maxAttempts: merged.retry?.maxAttempts ?? 1,\n baseDelayMs: merged.retry?.baseDelayMs ?? 500,\n maxDelayMs: merged.retry?.maxDelayMs ?? 30_000,\n retriableStatuses: merged.retry?.retriableStatuses ?? [429, 502, 503, 504],\n honorRetryAfter: merged.retry?.honorRetryAfter ?? true,\n }\n\n const fetchFn = merged.fetch ?? globalThis.fetch\n const maxAttempts = retryCfg.maxAttempts\n\n let response: Response | undefined\n let attempt = 1\n let disposeLink: () => void = () => {}\n while (attempt <= maxAttempts) {\n if (ctx.abortSignal.aborted) return\n\n const internalController = new AbortController()\n let timeoutHandle: ReturnType<typeof setTimeout> | undefined\n const requestTimeoutMs = merged.requestTimeoutMs ?? 0\n if (requestTimeoutMs > 0) {\n timeoutHandle = setTimeout(() => internalController.abort(), requestTimeoutMs)\n }\n disposeLink()\n const { signal: linkedSignal, dispose: disposeCurrentLink } = linkAbortSignals([\n ctx.abortSignal,\n internalController.signal,\n ])\n disposeLink = disposeCurrentLink\n\n try {\n response = await fetchFn(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: linkedSignal,\n })\n } catch (err) {\n if (timeoutHandle !== undefined) clearTimeout(timeoutHandle)\n if (ctx.abortSignal.aborted) return\n if (internalController.signal.aborted) {\n helpers.log.warn({\n kind: 'request-timeout',\n message: `Request timed out after ${requestTimeoutMs}ms on attempt ${attempt}/${maxAttempts}`,\n payload: { requestTimeoutMs, attempt, maxAttempts },\n })\n if (attempt < maxAttempts) {\n const delay = computeBackoff(attempt, retryCfg)\n await sleepWithJitter(delay, ctx.abortSignal)\n attempt += 1\n continue\n }\n ctx.nack(new E_OLLAMA_REQUEST_TIMEOUT([requestTimeoutMs]))\n return\n }\n helpers.log.error({\n kind: 'transport-error',\n message: `Transport failure on attempt ${attempt}/${maxAttempts}: ${isError(err) ? err.message : String(err)}`,\n payload: { attempt, maxAttempts, detail: isError(err) ? err.message : String(err) },\n })\n ctx.nack(new E_OLLAMA_HTTP_ERROR([0, isError(err) ? err.message : String(err)]))\n return\n }\n\n if (timeoutHandle !== undefined) clearTimeout(timeoutHandle)\n\n if (!response.ok) {\n const status = response.status\n const retriable = retryCfg.retriableStatuses.includes(status)\n if (retriable && attempt < maxAttempts) {\n let delay = computeBackoff(attempt, retryCfg)\n if (retryCfg.honorRetryAfter !== false) {\n const ra = response.headers.get('Retry-After')\n if (ra) {\n const raMs = parseRetryAfter(ra)\n if (raMs > 0) delay = Math.min(Math.max(delay, raMs), retryCfg.maxDelayMs)\n }\n }\n helpers.log.warn({\n kind: 'retry-attempt',\n message: `HTTP ${status} on attempt ${attempt}/${maxAttempts}; retrying in ~${delay}ms`,\n payload: {\n reason: 'http-status',\n status,\n delayMs: delay,\n attempt: attempt + 1,\n maxAttempts,\n },\n })\n await sleepWithJitter(delay, ctx.abortSignal)\n attempt += 1\n continue\n }\n const errBody = await response.text().catch(() => '')\n helpers.log.error({\n kind: 'http-error',\n message: `HTTP ${status} (terminal): ${errBody.slice(0, 256)}`,\n payload: { status, body: errBody, attempt, maxAttempts, retriable },\n })\n ctx.nack(new E_OLLAMA_HTTP_ERROR([status, errBody]))\n return\n }\n\n break\n }\n\n if (!response) return\n\n const spoolStore = merged.spoolStore ?? new InMemorySpoolStore()\n const selfIdentity = merged.selfIdentity ?? 'assistant'\n\n // ── Inner helper: persist + execute one assembled tool call ───────────\n const executeAndPersistToolCall = async (call: AssembledOllamaToolCall): Promise<void> => {\n // Resolve the provider id once at ingress so reporting, persistence, and spooling agree.\n const callId = merged.toolCallIdFilter?.(call.id, ctx) ?? call.id\n const tool = ctx.tools.get(call.name)\n // Native /api/chat delivers `arguments` already parsed as an object. Validate it IS an\n // object (defensive against a non-conformant server/proxy emitting an array/null/primitive)\n // — there is no JSON.parse step. A non-object short-circuits to a persisted error ToolCall.\n let args: Record<string, unknown> = {}\n let parseError: InstanceType<typeof E_OLLAMA_INVALID_TOOL_CALL_ARGS> | undefined\n if (isObject(call.args)) {\n args = call.args\n } else {\n const receivedKind = Array.isArray(call.args)\n ? 'array'\n : call.args === null\n ? 'null'\n : typeof call.args\n parseError = new E_OLLAMA_INVALID_TOOL_CALL_ARGS([\n `must be a JSON object; received ${receivedKind}`,\n JSON.stringify(call.args),\n ])\n }\n const completedAt = nowIso()\n if (parseError !== undefined) {\n const toolName = normalizeToolName(call.name)\n const results = new Tokenizable(parseError.message)\n helpers.reportToolCall(callId, { tool: toolName, args })\n helpers.reportToolCall(callId, { results, isError: true, isComplete: true })\n await ctx.storeToolCall(\n new ToolCall({\n id: callId,\n tool: toolName,\n args,\n checksum: computeChecksum(toolName, args),\n isComplete: true,\n isError: true,\n results,\n createdAt: completedAt,\n updatedAt: completedAt,\n completedAt,\n })\n )\n return\n }\n if (!tool) {\n const toolName = normalizeToolName(call.name)\n const available = ctx.tools\n .all()\n .map((t) => t.name)\n .sort()\n const errText =\n available.length > 0\n ? `Tool not found: ${toolName}. Available tools: ${available.join(', ')}.`\n : `Tool not found: ${toolName}. No tools are available this turn.`\n const results = new Tokenizable(errText)\n helpers.reportToolCall(callId, { tool: toolName, args })\n helpers.reportToolCall(callId, { results, isError: true, isComplete: true })\n await ctx.storeToolCall(\n new ToolCall({\n id: callId,\n tool: toolName,\n args,\n checksum: computeChecksum(toolName, args),\n isComplete: true,\n isError: true,\n results,\n createdAt: completedAt,\n updatedAt: completedAt,\n completedAt,\n })\n )\n return\n }\n helpers.reportToolCall(callId, { tool: tool.name, args })\n const isArtifactTool = ArtifactTool.isArtifactTool(tool)\n let results: Tokenizable | SpooledArtifact | SpooledArtifact[] | Media | Media[] =\n new Tokenizable('')\n let toolHadError = false\n try {\n const raw = await tool.executor(ctx)(args)\n if (isArtifactTool) {\n if (Tokenizable.isTokenizable(raw)) {\n results = raw\n } else if (typeof raw === 'string') {\n results = new Tokenizable(raw)\n } else {\n throw new Error(\n `ArtifactTool \"${tool.name}\" returned a non-string/non-Tokenizable value`\n )\n }\n } else if (Media.isMedia(raw)) {\n results = raw\n } else if (Array.isArray(raw) && raw.length > 0 && raw.every((m) => Media.isMedia(m))) {\n results = raw as Media[]\n } else if (looksLikeSpooledArtifact(raw)) {\n results = raw as SpooledArtifact\n } else if (typeof raw === 'string' || isInstanceOf(raw, 'Uint8Array', Uint8Array)) {\n const reader = await spoolStore.write(callId, raw as string | Uint8Array)\n const ArtifactCtor = (tool as Tool).artifactConstructor?.() ?? SpooledArtifact\n results = new ArtifactCtor(reader)\n } else {\n const reader = await spoolStore.write(callId, String(raw))\n const ArtifactCtor = (tool as Tool).artifactConstructor?.() ?? SpooledArtifact\n results = new ArtifactCtor(reader)\n }\n } catch (err) {\n toolHadError = true\n let detailMsg = isError(err) ? err.message : String(err)\n if (\n isError(err) &&\n isError(err.cause) &&\n err.cause.message &&\n err.cause.message !== err.message\n ) {\n detailMsg = `${detailMsg} ${err.cause.message}`\n }\n results = new Tokenizable(detailMsg)\n }\n helpers.reportToolCall(callId, { results, isError: toolHadError, isComplete: true })\n const completedAt2 = nowIso()\n await ctx.storeToolCall(\n new ToolCall({\n id: callId,\n tool: tool.name,\n args,\n checksum: computeChecksum(tool.name, args),\n isComplete: true,\n isError: toolHadError,\n results,\n fromArtifactTool: isArtifactTool,\n // ArtifactTool results are the documented exception: they inline the slice the model queried\n // from a prior artifact (handing back a handle to a query result would be recursion). Every\n // other result keeps the secure default (inline:false → handle).\n inline: isArtifactTool,\n createdAt: completedAt2,\n updatedAt: completedAt2,\n completedAt: completedAt2,\n })\n )\n }\n\n // FALLBACK tool-call recovery. Native /api/chat tool-calling is authoritative; this is consulted\n // ONLY when the provider returned zero structured calls AND the caller opted in via\n // `localToolCallParser`. Small models routinely emit a call in a surface form the server template\n // misses (`<call:name{…}`, a ```json block, bare `name\\nkey: value`), landing it in `content` with\n // empty `tool_calls`. Pure parse — returns the assembled calls (empty when disabled or no match) so\n // each call site can reflect them in the onRawGeneration tap and then execute. Fully\n // backward-compatible: absent option → `[]` → today's native-only behaviour.\n const parseFallbackToolCalls = (content: string): AssembledOllamaToolCall[] => {\n if (merged.localToolCallParser === undefined) return []\n if (typeof content !== 'string' || content.length === 0) return []\n const parser = resolveToolCallParser(merged.localToolCallParser)\n const toolNames = ctx.tools.visible().map((t) => t.name)\n return parser(content, { toolNames }).calls.map((c) => ({\n id: uuidv6(),\n name: c.name,\n args: c.arguments as Record<string, unknown>,\n }))\n }\n\n // ── Step 8: streaming path (NDJSON) ───────────────────────────────────\n if (stream) {\n if (!response.body) {\n ctx.nack(new E_OLLAMA_STREAM_ERROR(['response has no body']))\n return\n }\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n const streamId = dispatchStreamId\n\n let buffer = ''\n let idleTimer: ReturnType<typeof setTimeout> | undefined\n let stalled = false\n let partialMessageContent = ''\n let sawMessageDelta = false\n let partialThinking = ''\n let sawThinking = false\n let doneSeen = false\n const collectedToolCalls: AssembledOllamaToolCall[] = []\n const thoughtStreamId = `${streamId}:thought`\n\n const idleMs = merged.streamIdleTimeoutMs ?? 0\n const armIdleTimer = (): void => {\n if (idleMs <= 0) return\n if (idleTimer) clearTimeout(idleTimer)\n idleTimer = setTimeout(() => {\n stalled = true\n helpers.log.warn({\n kind: 'stream-idle-timeout',\n message: `NDJSON stream went idle for ${idleMs}ms; cancelling`,\n payload: { idleMs },\n })\n reader.cancel().catch(() => {})\n }, idleMs)\n }\n const clearIdleTimer = (): void => {\n if (idleTimer) {\n clearTimeout(idleTimer)\n idleTimer = undefined\n }\n }\n\n const drainAndPersist = async (\n statsSrc: OllamaChatStreamChunk | undefined\n ): Promise<void> => {\n if (sawMessageDelta) {\n helpers.reportMessage(streamId, '', { isComplete: true })\n await ctx.storeMessage(\n new Message({\n id: streamId,\n role: 'assistant',\n content: partialMessageContent,\n identity: selfIdentity,\n createdAt: nowIso(),\n updatedAt: nowIso(),\n })\n )\n }\n if (sawThinking) {\n helpers.reportThought(thoughtStreamId, '', { isComplete: true })\n await ctx.storeThought(\n new Thought({\n id: thoughtStreamId,\n content: partialThinking,\n identity: selfIdentity,\n createdAt: nowIso(),\n updatedAt: nowIso(),\n })\n )\n }\n if (statsSrc !== undefined) {\n helpers.reportGenerationStats(extractGenerationStats(statsSrc, merged.model))\n }\n\n // Fallback recovery (opt-in): if the server returned no structured calls, try to parse one out\n // of the accumulated `content`. Consulted only when native calls are absent, so the provider\n // always wins.\n const fallbackCalls =\n collectedToolCalls.length === 0 ? parseFallbackToolCalls(partialMessageContent) : []\n const effectiveCalls = collectedToolCalls.length > 0 ? collectedToolCalls : fallbackCalls\n\n // Raw-generation observability tap (FROM Ollama) — streaming path. `rawText`/`cleanedText` are\n // the accumulated assistant content; `toolCalls` are the calls this dispatch will act on\n // (native, or fallback-recovered — args already an object). Fired once at stream drain;\n // observer errors swallowed.\n if (merged.onRawGeneration) {\n try {\n merged.onRawGeneration({\n rawText: partialMessageContent,\n cleanedText: partialMessageContent,\n reasoning: sawThinking ? [partialThinking] : [],\n toolCalls: effectiveCalls.map((c) => ({\n name: c.name,\n arguments: c.args as never,\n })),\n streamed: true,\n streamId: dispatchStreamId,\n })\n } catch {\n /* observer errors are non-fatal */\n }\n }\n\n if (effectiveCalls.length === 0) {\n if (merged.autoAck) ctx.ack()\n return\n }\n for (const call of effectiveCalls) {\n if (ctx.abortSignal.aborted) return\n await executeAndPersistToolCall(call)\n }\n }\n\n const handleChunk = (chunk: OllamaChatStreamChunk): void => {\n const m = chunk.message\n if (m) {\n if (typeof m.content === 'string' && m.content.length > 0) {\n sawMessageDelta = true\n partialMessageContent += m.content\n helpers.reportMessage(streamId, m.content)\n }\n if (typeof m.thinking === 'string' && m.thinking.length > 0) {\n sawThinking = true\n partialThinking += m.thinking\n helpers.reportThought(thoughtStreamId, m.thinking)\n }\n if (Array.isArray(m.tool_calls)) {\n for (const tc of m.tool_calls) {\n collectedToolCalls.push({\n id: uuidv6(),\n name: tc.function?.name ?? '',\n args: (tc.function?.arguments ?? {}) as Record<string, unknown>,\n })\n }\n }\n }\n }\n\n const parseLine = (line: string): OllamaChatStreamChunk | undefined => {\n const trimmed = line.trim()\n if (trimmed.length === 0) return undefined\n try {\n return JSON.parse(trimmed) as OllamaChatStreamChunk\n } catch {\n helpers.log.trace({\n kind: 'ndjson-parse-failure',\n message: 'Failed to parse NDJSON line as JSON; skipping',\n payload: { linePreview: trimmed.slice(0, 256) },\n })\n return undefined\n }\n }\n\n try {\n armIdleTimer()\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n armIdleTimer()\n if (ctx.abortSignal.aborted) {\n clearIdleTimer()\n return\n }\n buffer += decoder.decode(value, { stream: true })\n let nl = buffer.indexOf('\\n')\n while (nl !== -1) {\n const line = buffer.slice(0, nl)\n buffer = buffer.slice(nl + 1)\n const chunk = parseLine(line)\n if (chunk !== undefined) {\n handleChunk(chunk)\n if (chunk.done === true) {\n doneSeen = true\n clearIdleTimer()\n await drainAndPersist(chunk)\n return\n }\n }\n nl = buffer.indexOf('\\n')\n }\n }\n clearIdleTimer()\n if (stalled) {\n ctx.nack(new E_OLLAMA_STREAM_STALLED([idleMs]))\n return\n }\n // Flush any residual non-newline-terminated final line.\n if (!doneSeen && buffer.trim().length > 0) {\n const chunk = parseLine(buffer)\n buffer = ''\n if (chunk !== undefined) {\n handleChunk(chunk)\n if (chunk.done === true) {\n await drainAndPersist(chunk)\n return\n }\n }\n }\n if (!doneSeen) {\n helpers.log.warn({\n kind: 'ndjson-eof-without-done',\n message: 'NDJSON stream ended without a done:true chunk; draining accumulated state',\n })\n await drainAndPersist(undefined)\n }\n } catch (err) {\n clearIdleTimer()\n if (ctx.abortSignal.aborted) return\n if (stalled) {\n ctx.nack(new E_OLLAMA_STREAM_STALLED([idleMs]))\n return\n }\n helpers.log.error({\n kind: 'stream-error',\n message: `NDJSON stream failed: ${isError(err) ? err.message : String(err)}`,\n payload: { detail: isError(err) ? err.message : String(err) },\n })\n ctx.nack(new E_OLLAMA_STREAM_ERROR([isError(err) ? err.message : String(err)]))\n return\n }\n return\n }\n\n // ── Step 9: non-streaming path ────────────────────────────────────────\n let parsed: OllamaChatResponse\n try {\n parsed = (await response.json()) as OllamaChatResponse\n } catch (err) {\n ctx.nack(new E_OLLAMA_STREAM_ERROR([isError(err) ? err.message : String(err)]))\n return\n }\n const responseId = uuidv6()\n const msg = parsed.message\n\n if (msg && typeof msg.content === 'string' && msg.content.length > 0) {\n const messageId = `${responseId}:message`\n helpers.reportMessage(messageId, msg.content, { isComplete: true })\n await ctx.storeMessage(\n new Message({\n id: messageId,\n role: 'assistant',\n content: msg.content,\n identity: selfIdentity,\n createdAt: nowIso(),\n updatedAt: nowIso(),\n })\n )\n }\n if (msg && typeof msg.thinking === 'string' && msg.thinking.length > 0) {\n const thoughtId = `${responseId}:thought`\n helpers.reportThought(thoughtId, msg.thinking, { isComplete: true })\n await ctx.storeThought(\n new Thought({\n id: thoughtId,\n content: msg.thinking,\n identity: selfIdentity,\n createdAt: nowIso(),\n updatedAt: nowIso(),\n })\n )\n }\n\n helpers.reportGenerationStats(extractGenerationStats(parsed, merged.model))\n\n const rawCalls: OllamaToolCall[] = msg?.tool_calls ?? []\n const content = typeof msg?.content === 'string' ? msg.content : ''\n\n // Fallback recovery (opt-in): if the server returned no structured calls, try to parse one out of\n // the assistant `content`. Consulted only when native calls are absent, so the provider always wins.\n const nativeCalls: AssembledOllamaToolCall[] = rawCalls.map((tc) => ({\n id: uuidv6(),\n name: tc.function?.name ?? '',\n args: (tc.function?.arguments ?? {}) as Record<string, unknown>,\n }))\n const calls = nativeCalls.length > 0 ? nativeCalls : parseFallbackToolCalls(content)\n\n // Raw-generation observability tap (FROM Ollama) — non-streaming path. `rawText`/`cleanedText` are\n // the returned assistant content; `toolCalls` are the calls this dispatch will act on (native, or\n // fallback-recovered — args already an object). Fired once per terminal generation; observer errors\n // swallowed.\n if (merged.onRawGeneration) {\n try {\n merged.onRawGeneration({\n rawText: content,\n cleanedText: content,\n reasoning:\n typeof msg?.thinking === 'string' && msg.thinking.length > 0 ? [msg.thinking] : [],\n toolCalls: calls.map((c) => ({\n name: c.name,\n arguments: c.args as never,\n })),\n streamed: false,\n streamId: dispatchStreamId,\n })\n } catch {\n /* observer errors are non-fatal */\n }\n }\n\n if (calls.length === 0) {\n if (merged.autoAck) ctx.ack()\n return\n }\n for (const call of calls) {\n if (ctx.abortSignal.aborted) return\n await executeAndPersistToolCall(call)\n }\n }\n }\n\n /**\n * Returns `true` when `value` is an {@link OllamaAdapter} instance.\n */\n public static isOllamaAdapter(value: unknown): value is OllamaAdapter {\n return isInstanceOf(value, 'OllamaAdapter', OllamaAdapter)\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"adapter.cjs","names":["#baseline"],"sources":["../../../../src/batteries/llm/ollama/adapter.ts"],"sourcesContent":["/**\n * Cross-environment executor adapter for the native Ollama `/api/chat` endpoint.\n *\n * @module @nhtio/adk/batteries/llm/ollama/adapter\n *\n * @remarks\n * Native Ollama LLM adapter targeting `/api/chat` (NOT the OpenAI-compat `/v1` layer — the\n * `openai_chat_completions` battery already covers `/v1`). Works against both LOCAL Ollama\n * (`http://localhost:11434`, no auth) and CLOUD Ollama (`https://ollama.com`, `Authorization:\n * Bearer <apiKey>`); the only difference is `baseURL` + the auth header. Native is HTTP-only — a\n * Unix-socket deployment is reached via a custom `fetch` or an external bridge, not an adapter\n * option.\n *\n * Structurally a sibling of the OpenAI Chat Completions adapter, with the native-wire divergences:\n *\n * - Request body: generation params are NESTED under `options`; `think` / `format` / `keep_alive`\n * are top-level native controls; ADK control fields are stripped before sending.\n * - Streaming: NDJSON (newline-delimited JSON objects), terminated in-band by `done: true` — there\n * is no SSE `data:` framing and no `[DONE]` sentinel. Whole `tool_calls` arrive per chunk (no\n * delta accumulation).\n * - Reasoning: the single native `message.thinking` field (no multi-field precedence dance).\n * - Tool calls: `arguments` is already a JSON OBJECT (no `JSON.parse`); native calls carry no `id`,\n * so the adapter synthesizes one (uuidv6) for correlation / checksum / spool keying. Tool-result\n * history messages use `tool_name` (the originating tool), not `tool_call_id`.\n * - Generation stats: the terminal `done: true` object's token counts + nanosecond durations +\n * `done_reason` are surfaced via `helpers.reportGenerationStats`.\n */\n\nimport { DateTime } from 'luxon'\nimport { sha256 } from 'js-sha256'\nimport { v6 as uuidv6 } from 'uuid'\nimport { validateOptions } from './validation'\nimport { isError, isInstanceOf, isObject } from '@nhtio/adk/guards'\nimport { resolveToolCallParser } from '../chat_common/tool_parsers'\nimport { canonicalStringify } from '../../../lib/utils/canonical_json'\nimport { InMemorySpoolStore } from '@nhtio/adk/batteries/storage/in_memory'\nimport { looksLikeSpooledArtifact, normalizeToolName } from '../chat_common/helpers'\nimport {\n computeBackoff,\n sleepWithJitter,\n parseRetryAfter,\n linkAbortSignals,\n} from '../../../lib/utils/retry'\nimport {\n Tokenizable,\n ToolCall,\n Message,\n Thought,\n SpooledArtifact,\n Media,\n ArtifactTool,\n} from '@nhtio/adk/common'\nimport {\n E_INVALID_OLLAMA_OPTIONS,\n E_OLLAMA_CONTEXT_OVERFLOW,\n E_OLLAMA_HTTP_ERROR,\n E_OLLAMA_STREAM_ERROR,\n E_OLLAMA_STREAM_STALLED,\n E_OLLAMA_REQUEST_TIMEOUT,\n E_OLLAMA_INVALID_TOOL_CALL_ARGS,\n} from './exceptions'\nimport {\n defaultDescriptionToChatCompletionsJsonSchema,\n defaultRenderUntrustedContent,\n defaultRenderTrustedContent,\n defaultRenderStandingInstructions,\n defaultRenderMemories,\n defaultRenderRetrievables,\n defaultRenderRetrievableHandleBody,\n defaultRenderRetrievableSafetyDirective,\n defaultRenderFirstPartyRetrievables,\n defaultRenderThirdPartyPublicRetrievables,\n defaultRenderThirdPartyPrivateRetrievables,\n defaultRenderThought,\n defaultFilterThoughts,\n defaultToolsToChatCompletionsTools,\n defaultRenderChatCompletionsSystemPrompt,\n defaultRenderOllamaTimelineMessage,\n defaultRenderOllamaToolCallResult,\n defaultBuildOllamaHistory,\n ollamaToolsFromTools,\n} from './helpers'\nimport type { Tool, Memory } from '@nhtio/adk/common'\nimport type { DispatchContext } from '@nhtio/adk/types'\nimport type { TokenEncoding, TokenEncodingId } from '@nhtio/adk/types'\nimport type {\n DispatchExecutorFn,\n DispatchExecutorHelpers,\n GenerationStats,\n} from '@nhtio/adk/dispatch_runner'\nimport type {\n OllamaAdapterOptions,\n OllamaHelpers,\n OllamaChatRequestBody,\n OllamaChatStreamChunk,\n OllamaChatResponse,\n OllamaToolCall,\n OllamaRuntimeOptions,\n} from './types'\n\n// ─── An assembled native tool call (id synthesized; args already an object) ───\n// NOTE: unlike the OpenAI adapter, the request body is assembled EXPLICITLY (model / messages /\n// stream / think / format / keep_alive / options / tools) rather than by spreading non-control\n// keys, because native generation params live nested under `options`, not at the top level. So\n// there is no ADK_CONTROL_KEYS strip-set here.\n\ninterface AssembledOllamaToolCall {\n id: string\n name: string\n args: Record<string, unknown>\n}\n\n// ─── Option merging ───────────────────────────────────────────────────────────\n\nconst mergeRecord = <T extends Record<string, unknown>>(\n layers: ReadonlyArray<T | undefined>\n): T | undefined => {\n let merged: T | undefined\n for (const layer of layers) {\n if (!layer) continue\n merged = { ...(merged ?? ({} as T)), ...layer }\n }\n return merged\n}\n\nconst mergeOptions = (\n baseline: OllamaAdapterOptions,\n exec: Partial<OllamaAdapterOptions> | undefined,\n stash: Partial<OllamaAdapterOptions> | undefined\n): Partial<OllamaAdapterOptions> => {\n const layers = [baseline as Partial<OllamaAdapterOptions>, exec ?? {}, stash ?? {}]\n const out: Record<string, unknown> = {}\n for (const layer of layers) {\n for (const [k, v] of Object.entries(layer)) {\n if (v === undefined) continue\n if (k === 'headers' || k === 'helpers' || k === 'retry' || k === 'options') continue\n out[k] = v\n }\n }\n const headers = mergeRecord(layers.map((l) => l.headers as Record<string, string> | undefined))\n if (headers !== undefined) out.headers = headers\n const helpers = mergeRecord(layers.map((l) => l.helpers as Record<string, unknown> | undefined))\n if (helpers !== undefined) out.helpers = helpers\n const retry = mergeRecord(layers.map((l) => l.retry as Record<string, unknown> | undefined))\n if (retry !== undefined) out.retry = retry\n // Nested runtime `options` merge key-by-key, like headers — a stash override that sets one\n // sampling param should not clear the others set in the constructor.\n const runtime = mergeRecord(layers.map((l) => l.options as Record<string, unknown> | undefined))\n if (runtime !== undefined) out.options = runtime\n return out as Partial<OllamaAdapterOptions>\n}\n\n// ─── Helper resolution ────────────────────────────────────────────────────────\n\nconst resolveHelpers = (overrides: Partial<OllamaHelpers> | undefined): OllamaHelpers => {\n const src = overrides ?? {}\n return {\n descriptionToChatCompletionsJsonSchema:\n src.descriptionToChatCompletionsJsonSchema ?? defaultDescriptionToChatCompletionsJsonSchema,\n renderUntrustedContent: src.renderUntrustedContent ?? defaultRenderUntrustedContent,\n renderTrustedContent: src.renderTrustedContent ?? defaultRenderTrustedContent,\n renderStandingInstructions: src.renderStandingInstructions ?? defaultRenderStandingInstructions,\n renderMemories: src.renderMemories ?? defaultRenderMemories,\n renderRetrievables: src.renderRetrievables ?? defaultRenderRetrievables,\n renderRetrievableHandleBody:\n src.renderRetrievableHandleBody ?? defaultRenderRetrievableHandleBody,\n renderRetrievableSafetyDirective:\n src.renderRetrievableSafetyDirective ?? defaultRenderRetrievableSafetyDirective,\n renderFirstPartyRetrievables:\n src.renderFirstPartyRetrievables ?? defaultRenderFirstPartyRetrievables,\n renderThirdPartyPublicRetrievables:\n src.renderThirdPartyPublicRetrievables ?? defaultRenderThirdPartyPublicRetrievables,\n renderThirdPartyPrivateRetrievables:\n src.renderThirdPartyPrivateRetrievables ?? defaultRenderThirdPartyPrivateRetrievables,\n renderThought: src.renderThought ?? defaultRenderThought,\n filterThoughts: src.filterThoughts ?? defaultFilterThoughts,\n toolsToChatCompletionsTools:\n src.toolsToChatCompletionsTools ?? defaultToolsToChatCompletionsTools,\n renderChatCompletionsSystemPrompt:\n src.renderChatCompletionsSystemPrompt ?? defaultRenderChatCompletionsSystemPrompt,\n renderOllamaTimelineMessage:\n src.renderOllamaTimelineMessage ?? defaultRenderOllamaTimelineMessage,\n renderOllamaToolCallResult: src.renderOllamaToolCallResult ?? defaultRenderOllamaToolCallResult,\n buildOllamaHistory: src.buildOllamaHistory ?? defaultBuildOllamaHistory,\n }\n}\n\n// ─── ID / checksum / time helpers ─────────────────────────────────────────────\n\nconst computeChecksum = (tool: string, args: unknown): string =>\n sha256(canonicalStringify({ tool, args }))\n\nconst nowIso = (): string => DateTime.now().toISO() ?? new Date().toISOString()\n\nconst estimateTokensOf = async (\n value: { estimateTokens: (encoding: TokenEncoding) => number | Promise<number> },\n encoding: TokenEncodingId\n): Promise<number> => Promise.resolve(value.estimateTokens(encoding as TokenEncoding))\n\n// ─── Generation-stats extraction ──────────────────────────────────────────────\n\nconst extractGenerationStats = (\n src: OllamaChatStreamChunk | OllamaChatResponse,\n model: string\n): GenerationStats => {\n const stats: GenerationStats = { provider: 'ollama', model: src.model ?? model, raw: { ...src } }\n if (typeof src.prompt_eval_count === 'number') stats.promptTokens = src.prompt_eval_count\n if (typeof src.eval_count === 'number') stats.completionTokens = src.eval_count\n if (typeof src.prompt_eval_count === 'number' && typeof src.eval_count === 'number') {\n stats.totalTokens = src.prompt_eval_count + src.eval_count\n }\n if (typeof src.total_duration === 'number') stats.totalDurationNs = src.total_duration\n if (typeof src.load_duration === 'number') stats.loadDurationNs = src.load_duration\n if (typeof src.prompt_eval_duration === 'number') {\n stats.promptEvalDurationNs = src.prompt_eval_duration\n }\n if (typeof src.eval_duration === 'number') stats.evalDurationNs = src.eval_duration\n if (typeof src.done_reason === 'string') stats.finishReason = src.done_reason\n return stats\n}\n\n// ─── Adapter class ────────────────────────────────────────────────────────────\n\n/**\n * Opinionated cross-environment LLM adapter for the native Ollama `/api/chat` wire shape.\n *\n * @remarks\n * Construction validates options eagerly via {@link validateOptions} and throws\n * {@link @nhtio/adk/batteries/llm/ollama!E_INVALID_OLLAMA_OPTIONS} on failure. The returned instance is reusable: call\n * {@link OllamaAdapter.executor} once per `DispatchRunner` configuration to obtain a\n * {@link @nhtio/adk!DispatchExecutorFn} bound to the baseline plus optional executor-scope\n * overrides. Per-iteration overrides live on `ctx.stash.ollama` and take highest precedence;\n * `headers`, `helpers`, `retry`, and the nested runtime `options` merge key-by-key across all three\n * layers, every other field is replaced wholesale at the highest layer that sets it.\n */\nexport class OllamaAdapter {\n /** Customary key for per-iteration overrides on `ctx.stash`. */\n public static readonly STASH_KEY = 'ollama' as const\n\n readonly #baseline: OllamaAdapterOptions\n\n /**\n * @param options - Constructor-baseline options. Re-validated on every iteration after\n * per-dispatch and per-iteration overrides are layered in.\n * @throws {@link @nhtio/adk/batteries/llm/ollama!E_INVALID_OLLAMA_OPTIONS} when `options` does not satisfy `ollamaOptionsSchema`.\n */\n constructor(options: unknown) {\n this.#baseline = validateOptions(options)\n }\n\n /**\n * Returns a {@link @nhtio/adk!DispatchExecutorFn} bound to this adapter's baseline plus optional\n * executor-scope overrides.\n *\n * @param overrides - Optional executor-scope overrides. Higher precedence than the baseline,\n * lower precedence than `ctx.stash[STASH_KEY]`.\n */\n executor(overrides?: Partial<OllamaAdapterOptions>): DispatchExecutorFn {\n const baseline = this.#baseline\n const adapterClass = OllamaAdapter\n return async (ctx: DispatchContext, helpers: DispatchExecutorHelpers): Promise<void> => {\n const localWarn = (msg: string): void => {\n helpers.log.warn({ kind: 'helper-warning', message: msg })\n }\n\n // ── Step 1: merge & validate ──────────────────────────────────────────\n const stashRaw = ctx.stash.get(adapterClass.STASH_KEY, {}) as unknown\n const stashOverrides =\n stashRaw && typeof stashRaw === 'object' ? (stashRaw as Partial<OllamaAdapterOptions>) : {}\n const merged = validateOptions(mergeOptions(baseline, overrides, stashOverrides))\n\n // Cross-field invariant: tokenEncoding non-null requires contextWindow.\n if (merged.tokenEncoding !== null && merged.contextWindow === undefined) {\n throw new E_INVALID_OLLAMA_OPTIONS([\n 'tokenEncoding is non-null but contextWindow is undefined',\n ])\n }\n\n // ── Step 2: resolve helpers ───────────────────────────────────────────\n const resolvedHelpers = resolveHelpers(merged.helpers)\n\n // ── Step 3: artifact-reader tools ─────────────────────────────────────\n // Forged by the DispatchRunner CORE into `ctx.tools` before the input pipeline runs (generation is a\n // generic core concern; this battery owns only representation). Read the pre-forged `ctx.tools`\n // directly — no local merge, no bindContext here.\n\n // ── Step 4: pre-render tool-call results ──────────────────────────────\n // Key by primitive identity: duplicate ids must not cross-wire pre-rendered results.\n const renderedToolCallResults = new Map<ToolCall, string>()\n for (const tc of ctx.turnToolCalls) {\n const rendered = await resolvedHelpers.renderOllamaToolCallResult({\n toolCall: tc,\n results: tc.results as\n | Tokenizable\n | SpooledArtifact\n | SpooledArtifact[]\n | Media\n | Media[],\n tool: ctx.tools.get(tc.tool) as Tool | ArtifactTool | undefined,\n renderUntrustedContent: resolvedHelpers.renderUntrustedContent,\n renderTrustedContent: resolvedHelpers.renderTrustedContent,\n unsupportedMediaPolicy: merged.unsupportedMediaPolicy ?? 'throw',\n warn: localWarn,\n })\n renderedToolCallResults.set(tc, rendered)\n }\n\n // ── Step 5: context window enforcement ────────────────────────────────\n if (merged.tokenEncoding !== null && merged.contextWindow !== undefined) {\n const encoding = merged.tokenEncoding as TokenEncodingId\n let spTokens = await estimateTokensOf(ctx.systemPrompt, encoding)\n let siTokens = 0\n for (const si of ctx.standingInstructions) {\n siTokens += await estimateTokensOf(si, encoding)\n }\n let memTokens = 0\n for (const mem of ctx.turnMemories as Set<Memory>) {\n memTokens += await estimateTokensOf(mem.content, encoding)\n }\n let retTokens = 0\n for (const r of ctx.turnRetrievables) {\n retTokens +=\n !r.inline && SpooledArtifact.isSpooledArtifact(r.content) && r.content.hasSizeHints()\n ? r.content.estimateHandleTokens(\n r.id,\n encoding as TokenEncoding,\n resolvedHelpers.renderRetrievableHandleBody\n )\n : await estimateTokensOf(r.content, encoding)\n }\n let tlTokens = 0\n for (const msg of ctx.turnMessages) {\n if (msg.content !== undefined) {\n tlTokens += await estimateTokensOf(msg.content, encoding)\n }\n }\n for (const th of ctx.turnThoughts) {\n tlTokens += await estimateTokensOf(th.content, encoding)\n }\n for (const rendered of renderedToolCallResults.values()) {\n tlTokens += await estimateTokensOf(new Tokenizable(rendered), encoding)\n }\n // Tool DECLARATIONS: Ollama renders the `tools` array through the MODEL'S OWN Go chat template\n // (the `.Tools` template variable), which is per-model and lives SERVER-side — there is no single\n // fixed conversion to reproduce client-side (seeing the exact string needs `ollama show` / debug\n // logs; evaluating the model's Go template via /api/show is deliberately out of scope for a guard\n // backstop). Tally the serialized wire `tools` JSON as an honest FLOOR. Without this the guard\n // undercounts a tool-heavy prompt by the entire declaration block.\n let toolTokens = 0\n const visibleTools = ctx.tools.visible()\n if (visibleTools.length > 0) {\n const toolsJson = JSON.stringify(\n ollamaToolsFromTools(visibleTools, {\n descriptionToChatCompletionsJsonSchema:\n resolvedHelpers.descriptionToChatCompletionsJsonSchema,\n })\n )\n toolTokens = await estimateTokensOf(new Tokenizable(toolsJson), encoding)\n }\n const total = spTokens + siTokens + memTokens + retTokens + tlTokens + toolTokens\n const perBucketObj = {\n systemPrompt: spTokens,\n standingInstructions: siTokens,\n memories: memTokens,\n retrievables: retTokens,\n timeline: tlTokens,\n tools: toolTokens,\n }\n helpers.log.debug({\n kind: 'context-window-usage',\n message: `Context window usage: ${total}/${merged.contextWindow} tokens`,\n payload: { total, limit: merged.contextWindow, encoding, perBucket: perBucketObj },\n })\n if (total > merged.contextWindow) {\n throw new E_OLLAMA_CONTEXT_OVERFLOW([\n total,\n merged.contextWindow,\n encoding,\n JSON.stringify(perBucketObj),\n ])\n }\n }\n\n // ── Step 6: build request body ────────────────────────────────────────\n const { messages: wireMessages, reasoningPayloads } =\n await resolvedHelpers.buildOllamaHistory({\n systemPrompt: ctx.systemPrompt,\n standingInstructions: ctx.standingInstructions,\n memories: ctx.turnMemories,\n retrievables: ctx.turnRetrievables,\n messages: ctx.turnMessages,\n thoughts: ctx.turnThoughts,\n toolCalls: ctx.turnToolCalls,\n tools: ctx.tools,\n renderedToolCallResults,\n bucketOrder: merged.bucketOrder ?? [\n 'standingInstructions',\n 'memories',\n 'retrievables',\n 'timeline',\n ],\n selfIdentity: merged.selfIdentity ?? 'assistant',\n thoughtSurfacing: merged.thoughtSurfacing ?? 'all-self',\n replayCompatibility: merged.replayCompatibility ?? [],\n renderOllamaToolCallResult: resolvedHelpers.renderOllamaToolCallResult,\n renderChatCompletionsSystemPrompt: resolvedHelpers.renderChatCompletionsSystemPrompt,\n renderStandingInstructions: resolvedHelpers.renderStandingInstructions,\n renderMemories: resolvedHelpers.renderMemories,\n renderRetrievables: resolvedHelpers.renderRetrievables,\n renderRetrievableHandleBody: resolvedHelpers.renderRetrievableHandleBody,\n renderRetrievableSafetyDirective: resolvedHelpers.renderRetrievableSafetyDirective,\n renderFirstPartyRetrievables: resolvedHelpers.renderFirstPartyRetrievables,\n renderThirdPartyPublicRetrievables: resolvedHelpers.renderThirdPartyPublicRetrievables,\n renderThirdPartyPrivateRetrievables: resolvedHelpers.renderThirdPartyPrivateRetrievables,\n renderOllamaTimelineMessage: resolvedHelpers.renderOllamaTimelineMessage,\n renderThought: resolvedHelpers.renderThought,\n filterThoughts: resolvedHelpers.filterThoughts,\n renderUntrustedContent: resolvedHelpers.renderUntrustedContent,\n renderTrustedContent: resolvedHelpers.renderTrustedContent,\n unsupportedMediaPolicy: merged.unsupportedMediaPolicy ?? 'throw',\n warn: localWarn,\n })\n\n const stream = merged.stream ?? true\n const body: OllamaChatRequestBody = {\n model: merged.model,\n messages: wireMessages,\n stream,\n }\n // Native top-level controls — included only when defined. `think` is conditional-presence:\n // omitted → absent; `false` → think:false; truthy/effort → verbatim.\n if (merged.think !== undefined) body.think = merged.think\n if (merged.format !== undefined) body.format = merged.format\n if (merged.keep_alive !== undefined) body.keep_alive = merged.keep_alive\n if (merged.options !== undefined) body.options = merged.options as OllamaRuntimeOptions\n const toolsArr = ctx.tools.visible()\n if (toolsArr.length > 0) {\n body.tools = ollamaToolsFromTools(toolsArr, {\n descriptionToChatCompletionsJsonSchema:\n resolvedHelpers.descriptionToChatCompletionsJsonSchema,\n })\n }\n if (reasoningPayloads.length > 0) {\n body._adk_reasoning_payloads = reasoningPayloads\n }\n\n // One id for this whole generation — correlates the TO tap (onPromptAssembled) with the FROM tap\n // (onRawGeneration) below.\n const dispatchStreamId = uuidv6()\n\n // Prompt-assembled observability tap: the EXACT request body going TO Ollama, the instant it is built\n // and BEFORE the POST. Mirror of onRawGeneration. Handed back AS-IS — no redaction — and swallow\n // observer errors so it can never corrupt the generation path.\n if (merged.onPromptAssembled) {\n try {\n merged.onPromptAssembled({\n battery: 'ollama',\n kind: 'request-body',\n messages: body.messages,\n tools: body.tools,\n requestBody: body,\n streamed: stream,\n streamId: dispatchStreamId,\n })\n } catch {\n /* observer errors are non-fatal */\n }\n }\n\n // ── Step 7: POST with retry / timeout loop ────────────────────────────\n const rawBase = merged.baseURL ?? 'http://localhost:11434'\n const baseURL = rawBase.endsWith('/') ? rawBase.slice(0, -1) : rawBase\n const url = `${baseURL}/api/chat`\n\n const headers: Record<string, string> = { 'Content-Type': 'application/json' }\n if (stream) headers['Accept'] = 'application/x-ndjson'\n if (merged.apiKey) headers['Authorization'] = `Bearer ${merged.apiKey}`\n if (merged.headers) Object.assign(headers, merged.headers)\n\n const retryCfg = {\n maxAttempts: merged.retry?.maxAttempts ?? 1,\n baseDelayMs: merged.retry?.baseDelayMs ?? 500,\n maxDelayMs: merged.retry?.maxDelayMs ?? 30_000,\n retriableStatuses: merged.retry?.retriableStatuses ?? [429, 502, 503, 504],\n honorRetryAfter: merged.retry?.honorRetryAfter ?? true,\n }\n\n const fetchFn = merged.fetch ?? globalThis.fetch\n const maxAttempts = retryCfg.maxAttempts\n\n let response: Response | undefined\n let attempt = 1\n let disposeLink: () => void = () => {}\n while (attempt <= maxAttempts) {\n if (ctx.abortSignal.aborted) return\n\n const internalController = new AbortController()\n let timeoutHandle: ReturnType<typeof setTimeout> | undefined\n const requestTimeoutMs = merged.requestTimeoutMs ?? 0\n if (requestTimeoutMs > 0) {\n timeoutHandle = setTimeout(() => internalController.abort(), requestTimeoutMs)\n }\n disposeLink()\n const { signal: linkedSignal, dispose: disposeCurrentLink } = linkAbortSignals([\n ctx.abortSignal,\n internalController.signal,\n ])\n disposeLink = disposeCurrentLink\n\n try {\n response = await fetchFn(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: linkedSignal,\n })\n } catch (err) {\n if (timeoutHandle !== undefined) clearTimeout(timeoutHandle)\n if (ctx.abortSignal.aborted) return\n if (internalController.signal.aborted) {\n helpers.log.warn({\n kind: 'request-timeout',\n message: `Request timed out after ${requestTimeoutMs}ms on attempt ${attempt}/${maxAttempts}`,\n payload: { requestTimeoutMs, attempt, maxAttempts },\n })\n if (attempt < maxAttempts) {\n const delay = computeBackoff(attempt, retryCfg)\n await sleepWithJitter(delay, ctx.abortSignal)\n attempt += 1\n continue\n }\n ctx.nack(new E_OLLAMA_REQUEST_TIMEOUT([requestTimeoutMs]))\n return\n }\n helpers.log.error({\n kind: 'transport-error',\n message: `Transport failure on attempt ${attempt}/${maxAttempts}: ${isError(err) ? err.message : String(err)}`,\n payload: { attempt, maxAttempts, detail: isError(err) ? err.message : String(err) },\n })\n ctx.nack(new E_OLLAMA_HTTP_ERROR([0, isError(err) ? err.message : String(err)]))\n return\n }\n\n if (timeoutHandle !== undefined) clearTimeout(timeoutHandle)\n\n if (!response.ok) {\n const status = response.status\n const retriable = retryCfg.retriableStatuses.includes(status)\n if (retriable && attempt < maxAttempts) {\n let delay = computeBackoff(attempt, retryCfg)\n if (retryCfg.honorRetryAfter !== false) {\n const ra = response.headers.get('Retry-After')\n if (ra) {\n const raMs = parseRetryAfter(ra)\n if (raMs > 0) delay = Math.min(Math.max(delay, raMs), retryCfg.maxDelayMs)\n }\n }\n helpers.log.warn({\n kind: 'retry-attempt',\n message: `HTTP ${status} on attempt ${attempt}/${maxAttempts}; retrying in ~${delay}ms`,\n payload: {\n reason: 'http-status',\n status,\n delayMs: delay,\n attempt: attempt + 1,\n maxAttempts,\n },\n })\n await sleepWithJitter(delay, ctx.abortSignal)\n attempt += 1\n continue\n }\n const errBody = await response.text().catch(() => '')\n helpers.log.error({\n kind: 'http-error',\n message: `HTTP ${status} (terminal): ${errBody.slice(0, 256)}`,\n payload: { status, body: errBody, attempt, maxAttempts, retriable },\n })\n ctx.nack(new E_OLLAMA_HTTP_ERROR([status, errBody]))\n return\n }\n\n break\n }\n\n if (!response) return\n\n const spoolStore = merged.spoolStore ?? new InMemorySpoolStore()\n const selfIdentity = merged.selfIdentity ?? 'assistant'\n\n // ── Inner helper: persist + execute one assembled tool call ───────────\n const executeAndPersistToolCall = async (call: AssembledOllamaToolCall): Promise<void> => {\n // Resolve the provider id once at ingress so reporting, persistence, and spooling agree.\n const callId = merged.toolCallIdFilter?.(call.id, ctx) ?? call.id\n const tool = ctx.tools.get(call.name)\n // Native /api/chat delivers `arguments` already parsed as an object. Validate it IS an\n // object (defensive against a non-conformant server/proxy emitting an array/null/primitive)\n // — there is no JSON.parse step. A non-object short-circuits to a persisted error ToolCall.\n let args: Record<string, unknown> = {}\n let parseError: InstanceType<typeof E_OLLAMA_INVALID_TOOL_CALL_ARGS> | undefined\n if (isObject(call.args)) {\n args = call.args\n } else {\n const receivedKind = Array.isArray(call.args)\n ? 'array'\n : call.args === null\n ? 'null'\n : typeof call.args\n parseError = new E_OLLAMA_INVALID_TOOL_CALL_ARGS([\n `must be a JSON object; received ${receivedKind}`,\n JSON.stringify(call.args),\n ])\n }\n const completedAt = nowIso()\n if (parseError !== undefined) {\n const toolName = normalizeToolName(call.name)\n const results = new Tokenizable(parseError.message)\n helpers.reportToolCall(callId, { tool: toolName, args })\n helpers.reportToolCall(callId, { results, isError: true, isComplete: true })\n await ctx.storeToolCall(\n new ToolCall({\n id: callId,\n tool: toolName,\n args,\n checksum: computeChecksum(toolName, args),\n isComplete: true,\n isError: true,\n results,\n createdAt: completedAt,\n updatedAt: completedAt,\n completedAt,\n })\n )\n return\n }\n if (!tool) {\n const toolName = normalizeToolName(call.name)\n const available = ctx.tools\n .all()\n .map((t) => t.name)\n .sort()\n const errText =\n available.length > 0\n ? `Tool not found: ${toolName}. Available tools: ${available.join(', ')}.`\n : `Tool not found: ${toolName}. No tools are available this turn.`\n const results = new Tokenizable(errText)\n helpers.reportToolCall(callId, { tool: toolName, args })\n helpers.reportToolCall(callId, { results, isError: true, isComplete: true })\n await ctx.storeToolCall(\n new ToolCall({\n id: callId,\n tool: toolName,\n args,\n checksum: computeChecksum(toolName, args),\n isComplete: true,\n isError: true,\n results,\n createdAt: completedAt,\n updatedAt: completedAt,\n completedAt,\n })\n )\n return\n }\n helpers.reportToolCall(callId, { tool: tool.name, args })\n const isArtifactTool = ArtifactTool.isArtifactTool(tool)\n let results: Tokenizable | SpooledArtifact | SpooledArtifact[] | Media | Media[] =\n new Tokenizable('')\n let toolHadError = false\n try {\n const raw = await tool.executor(ctx)(args)\n if (isArtifactTool) {\n if (Tokenizable.isTokenizable(raw)) {\n results = raw\n } else if (typeof raw === 'string') {\n results = new Tokenizable(raw)\n } else {\n throw new Error(\n `ArtifactTool \"${tool.name}\" returned a non-string/non-Tokenizable value`\n )\n }\n } else if (Media.isMedia(raw)) {\n results = raw\n } else if (Array.isArray(raw) && raw.length > 0 && raw.every((m) => Media.isMedia(m))) {\n results = raw as Media[]\n } else if (looksLikeSpooledArtifact(raw)) {\n results = raw as SpooledArtifact\n } else if (typeof raw === 'string' || isInstanceOf(raw, 'Uint8Array', Uint8Array)) {\n const reader = await spoolStore.write(callId, raw as string | Uint8Array)\n const ArtifactCtor = (tool as Tool).artifactConstructor?.() ?? SpooledArtifact\n results = new ArtifactCtor(reader)\n } else {\n const reader = await spoolStore.write(callId, String(raw))\n const ArtifactCtor = (tool as Tool).artifactConstructor?.() ?? SpooledArtifact\n results = new ArtifactCtor(reader)\n }\n } catch (err) {\n toolHadError = true\n let detailMsg = isError(err) ? err.message : String(err)\n if (\n isError(err) &&\n isError(err.cause) &&\n err.cause.message &&\n err.cause.message !== err.message\n ) {\n detailMsg = `${detailMsg} ${err.cause.message}`\n }\n results = new Tokenizable(detailMsg)\n }\n helpers.reportToolCall(callId, { results, isError: toolHadError, isComplete: true })\n const completedAt2 = nowIso()\n await ctx.storeToolCall(\n new ToolCall({\n id: callId,\n tool: tool.name,\n args,\n checksum: computeChecksum(tool.name, args),\n isComplete: true,\n isError: toolHadError,\n results,\n fromArtifactTool: isArtifactTool,\n // ArtifactTool results are the documented exception: they inline the slice the model queried\n // from a prior artifact (handing back a handle to a query result would be recursion). Every\n // other result keeps the secure default (inline:false → handle).\n inline: isArtifactTool,\n createdAt: completedAt2,\n updatedAt: completedAt2,\n completedAt: completedAt2,\n })\n )\n }\n\n // FALLBACK tool-call recovery. Native /api/chat tool-calling is authoritative; this is consulted\n // ONLY when the provider returned zero structured calls AND the caller opted in via\n // `localToolCallParser`. Small models routinely emit a call in a surface form the server template\n // misses (`<call:name{…}`, a ```json block, bare `name\\nkey: value`), landing it in `content` with\n // empty `tool_calls`. Pure parse — returns the assembled calls (empty when disabled or no match) so\n // each call site can reflect them in the onRawGeneration tap and then execute. Fully\n // backward-compatible: absent option → `[]` → today's native-only behaviour.\n const parseFallbackToolCalls = (content: string): AssembledOllamaToolCall[] => {\n if (merged.localToolCallParser === undefined) return []\n if (typeof content !== 'string' || content.length === 0) return []\n const parser = resolveToolCallParser(merged.localToolCallParser)\n const toolNames = ctx.tools.visible().map((t) => t.name)\n return parser(content, { toolNames }).calls.map((c) => ({\n id: uuidv6(),\n name: c.name,\n args: c.arguments as Record<string, unknown>,\n }))\n }\n\n // ── Step 8: streaming path (NDJSON) ───────────────────────────────────\n if (stream) {\n if (!response.body) {\n ctx.nack(new E_OLLAMA_STREAM_ERROR(['response has no body']))\n return\n }\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n const streamId = dispatchStreamId\n\n let buffer = ''\n let idleTimer: ReturnType<typeof setTimeout> | undefined\n let stalled = false\n let partialMessageContent = ''\n let sawMessageDelta = false\n let partialThinking = ''\n let sawThinking = false\n let doneSeen = false\n const collectedToolCalls: AssembledOllamaToolCall[] = []\n const thoughtStreamId = `${streamId}:thought`\n\n const idleMs = merged.streamIdleTimeoutMs ?? 0\n const armIdleTimer = (): void => {\n if (idleMs <= 0) return\n if (idleTimer) clearTimeout(idleTimer)\n idleTimer = setTimeout(() => {\n stalled = true\n helpers.log.warn({\n kind: 'stream-idle-timeout',\n message: `NDJSON stream went idle for ${idleMs}ms; cancelling`,\n payload: { idleMs },\n })\n reader.cancel().catch(() => {})\n }, idleMs)\n }\n const clearIdleTimer = (): void => {\n if (idleTimer) {\n clearTimeout(idleTimer)\n idleTimer = undefined\n }\n }\n\n const drainAndPersist = async (\n statsSrc: OllamaChatStreamChunk | undefined\n ): Promise<void> => {\n if (sawMessageDelta) {\n helpers.reportMessage(streamId, '', { isComplete: true })\n await ctx.storeMessage(\n new Message({\n id: streamId,\n role: 'assistant',\n content: partialMessageContent,\n identity: selfIdentity,\n createdAt: nowIso(),\n updatedAt: nowIso(),\n })\n )\n }\n if (sawThinking) {\n helpers.reportThought(thoughtStreamId, '', { isComplete: true })\n await ctx.storeThought(\n new Thought({\n id: thoughtStreamId,\n content: partialThinking,\n identity: selfIdentity,\n createdAt: nowIso(),\n updatedAt: nowIso(),\n })\n )\n }\n if (statsSrc !== undefined) {\n helpers.reportGenerationStats(extractGenerationStats(statsSrc, merged.model))\n }\n\n // Fallback recovery (opt-in): if the server returned no structured calls, try to parse one out\n // of the accumulated `content`. Consulted only when native calls are absent, so the provider\n // always wins.\n const fallbackCalls =\n collectedToolCalls.length === 0 ? parseFallbackToolCalls(partialMessageContent) : []\n const effectiveCalls = collectedToolCalls.length > 0 ? collectedToolCalls : fallbackCalls\n\n // Raw-generation observability tap (FROM Ollama) — streaming path. `rawText`/`cleanedText` are\n // the accumulated assistant content; `toolCalls` are the calls this dispatch will act on\n // (native, or fallback-recovered — args already an object). Fired once at stream drain;\n // observer errors swallowed.\n if (merged.onRawGeneration) {\n try {\n merged.onRawGeneration({\n rawText: partialMessageContent,\n cleanedText: partialMessageContent,\n reasoning: sawThinking ? [partialThinking] : [],\n toolCalls: effectiveCalls.map((c) => ({\n name: c.name,\n arguments: c.args as never,\n })),\n streamed: true,\n streamId: dispatchStreamId,\n })\n } catch {\n /* observer errors are non-fatal */\n }\n }\n\n if (effectiveCalls.length === 0) {\n if (merged.autoAck) ctx.ack()\n return\n }\n for (const call of effectiveCalls) {\n if (ctx.abortSignal.aborted) return\n await executeAndPersistToolCall(call)\n }\n }\n\n const handleChunk = (chunk: OllamaChatStreamChunk): void => {\n const m = chunk.message\n if (m) {\n if (typeof m.content === 'string' && m.content.length > 0) {\n sawMessageDelta = true\n partialMessageContent += m.content\n helpers.reportMessage(streamId, m.content)\n }\n if (typeof m.thinking === 'string' && m.thinking.length > 0) {\n sawThinking = true\n partialThinking += m.thinking\n helpers.reportThought(thoughtStreamId, m.thinking)\n }\n if (Array.isArray(m.tool_calls)) {\n for (const tc of m.tool_calls) {\n collectedToolCalls.push({\n id: uuidv6(),\n name: tc.function?.name ?? '',\n args: (tc.function?.arguments ?? {}) as Record<string, unknown>,\n })\n }\n }\n }\n }\n\n const parseLine = (line: string): OllamaChatStreamChunk | undefined => {\n const trimmed = line.trim()\n if (trimmed.length === 0) return undefined\n try {\n return JSON.parse(trimmed) as OllamaChatStreamChunk\n } catch {\n helpers.log.trace({\n kind: 'ndjson-parse-failure',\n message: 'Failed to parse NDJSON line as JSON; skipping',\n payload: { linePreview: trimmed.slice(0, 256) },\n })\n return undefined\n }\n }\n\n try {\n armIdleTimer()\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n armIdleTimer()\n if (ctx.abortSignal.aborted) {\n clearIdleTimer()\n return\n }\n buffer += decoder.decode(value, { stream: true })\n let nl = buffer.indexOf('\\n')\n while (nl !== -1) {\n const line = buffer.slice(0, nl)\n buffer = buffer.slice(nl + 1)\n const chunk = parseLine(line)\n if (chunk !== undefined) {\n handleChunk(chunk)\n if (chunk.done === true) {\n doneSeen = true\n clearIdleTimer()\n await drainAndPersist(chunk)\n return\n }\n }\n nl = buffer.indexOf('\\n')\n }\n }\n clearIdleTimer()\n if (stalled) {\n ctx.nack(new E_OLLAMA_STREAM_STALLED([idleMs]))\n return\n }\n // Flush any residual non-newline-terminated final line.\n if (!doneSeen && buffer.trim().length > 0) {\n const chunk = parseLine(buffer)\n buffer = ''\n if (chunk !== undefined) {\n handleChunk(chunk)\n if (chunk.done === true) {\n await drainAndPersist(chunk)\n return\n }\n }\n }\n if (!doneSeen) {\n helpers.log.warn({\n kind: 'ndjson-eof-without-done',\n message: 'NDJSON stream ended without a done:true chunk; draining accumulated state',\n })\n await drainAndPersist(undefined)\n }\n } catch (err) {\n clearIdleTimer()\n if (ctx.abortSignal.aborted) return\n if (stalled) {\n ctx.nack(new E_OLLAMA_STREAM_STALLED([idleMs]))\n return\n }\n helpers.log.error({\n kind: 'stream-error',\n message: `NDJSON stream failed: ${isError(err) ? err.message : String(err)}`,\n payload: { detail: isError(err) ? err.message : String(err) },\n })\n ctx.nack(new E_OLLAMA_STREAM_ERROR([isError(err) ? err.message : String(err)]))\n return\n }\n return\n }\n\n // ── Step 9: non-streaming path ────────────────────────────────────────\n let parsed: OllamaChatResponse\n try {\n parsed = (await response.json()) as OllamaChatResponse\n } catch (err) {\n ctx.nack(new E_OLLAMA_STREAM_ERROR([isError(err) ? err.message : String(err)]))\n return\n }\n const responseId = uuidv6()\n const msg = parsed.message\n\n if (msg && typeof msg.content === 'string' && msg.content.length > 0) {\n const messageId = `${responseId}:message`\n helpers.reportMessage(messageId, msg.content, { isComplete: true })\n await ctx.storeMessage(\n new Message({\n id: messageId,\n role: 'assistant',\n content: msg.content,\n identity: selfIdentity,\n createdAt: nowIso(),\n updatedAt: nowIso(),\n })\n )\n }\n if (msg && typeof msg.thinking === 'string' && msg.thinking.length > 0) {\n const thoughtId = `${responseId}:thought`\n helpers.reportThought(thoughtId, msg.thinking, { isComplete: true })\n await ctx.storeThought(\n new Thought({\n id: thoughtId,\n content: msg.thinking,\n identity: selfIdentity,\n createdAt: nowIso(),\n updatedAt: nowIso(),\n })\n )\n }\n\n helpers.reportGenerationStats(extractGenerationStats(parsed, merged.model))\n\n const rawCalls: OllamaToolCall[] = msg?.tool_calls ?? []\n const content = typeof msg?.content === 'string' ? msg.content : ''\n\n // Fallback recovery (opt-in): if the server returned no structured calls, try to parse one out of\n // the assistant `content`. Consulted only when native calls are absent, so the provider always wins.\n const nativeCalls: AssembledOllamaToolCall[] = rawCalls.map((tc) => ({\n id: uuidv6(),\n name: tc.function?.name ?? '',\n args: (tc.function?.arguments ?? {}) as Record<string, unknown>,\n }))\n const calls = nativeCalls.length > 0 ? nativeCalls : parseFallbackToolCalls(content)\n\n // Raw-generation observability tap (FROM Ollama) — non-streaming path. `rawText`/`cleanedText` are\n // the returned assistant content; `toolCalls` are the calls this dispatch will act on (native, or\n // fallback-recovered — args already an object). Fired once per terminal generation; observer errors\n // swallowed.\n if (merged.onRawGeneration) {\n try {\n merged.onRawGeneration({\n rawText: content,\n cleanedText: content,\n reasoning:\n typeof msg?.thinking === 'string' && msg.thinking.length > 0 ? [msg.thinking] : [],\n toolCalls: calls.map((c) => ({\n name: c.name,\n arguments: c.args as never,\n })),\n streamed: false,\n streamId: dispatchStreamId,\n })\n } catch {\n /* observer errors are non-fatal */\n }\n }\n\n if (calls.length === 0) {\n if (merged.autoAck) ctx.ack()\n return\n }\n for (const call of calls) {\n if (ctx.abortSignal.aborted) return\n await executeAndPersistToolCall(call)\n }\n }\n }\n\n /**\n * Returns `true` when `value` is an {@link OllamaAdapter} instance.\n */\n public static isOllamaAdapter(value: unknown): value is OllamaAdapter {\n return isInstanceOf(value, 'OllamaAdapter', OllamaAdapter)\n }\n}\n"],"mappings":"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"}
@@ -1,14 +1,14 @@
1
1
  import { n as isInstanceOf, r as isObject, t as isError } from "../../../guards-BEpY7lBI.mjs";
2
- import { r as Tokenizable } from "../../../tokenizable-DLMP68ZV.mjs";
3
- import { d as ArtifactTool, h as canonicalStringify, t as SpooledArtifact } from "../../../spooled_artifact-BkueYJhR.mjs";
4
- import { n as Message, t as Thought } from "../../../thought-B8JAi3-W.mjs";
5
- import { n as Media, t as ToolCall } from "../../../tool_call-CPjyvkm4.mjs";
6
- import "../../../common-v9Jo9M5k.mjs";
2
+ import { r as Tokenizable } from "../../../tokenizable-VB4Av8GF.mjs";
3
+ import { f as ArtifactTool, h as canonicalStringify, t as SpooledArtifact } from "../../../spooled_artifact-Bw_7swIp.mjs";
4
+ import { n as Message, t as Thought } from "../../../thought-BE1KGEhV.mjs";
5
+ import { n as Media, t as ToolCall } from "../../../tool_call-Cfaj-6zK.mjs";
6
+ import "../../../common-BpdHIpQE.mjs";
7
7
  import "../../../guards.mjs";
8
8
  import { computeBackoff, linkAbortSignals, parseRetryAfter, sleepWithJitter } from "../../../lib/utils/retry.mjs";
9
9
  import { O as resolveToolCallParser } from "../../../tool_parsers-DgZhgxV8.mjs";
10
10
  import { InMemorySpoolStore } from "../../storage/in_memory.mjs";
11
- import { C as looksLikeSpooledArtifact, E as normalizeToolName, _ as defaultRenderUntrustedContent, c as defaultRenderMemories, d as defaultRenderRetrievables, f as defaultRenderStandingInstructions, g as defaultRenderTrustedContent, h as defaultRenderThought, i as defaultFilterThoughts, l as defaultRenderRetrievableHandleBody, m as defaultRenderThirdPartyPublicRetrievables, o as defaultRenderChatCompletionsSystemPrompt, p as defaultRenderThirdPartyPrivateRetrievables, r as defaultDescriptionToChatCompletionsJsonSchema, s as defaultRenderFirstPartyRetrievables, u as defaultRenderRetrievableSafetyDirective, v as defaultToolsToChatCompletionsTools } from "../../../helpers-CDmLDBq5.mjs";
11
+ import { C as looksLikeSpooledArtifact, E as normalizeToolName, _ as defaultRenderUntrustedContent, c as defaultRenderMemories, d as defaultRenderRetrievables, f as defaultRenderStandingInstructions, g as defaultRenderTrustedContent, h as defaultRenderThought, i as defaultFilterThoughts, l as defaultRenderRetrievableHandleBody, m as defaultRenderThirdPartyPublicRetrievables, o as defaultRenderChatCompletionsSystemPrompt, p as defaultRenderThirdPartyPrivateRetrievables, r as defaultDescriptionToChatCompletionsJsonSchema, s as defaultRenderFirstPartyRetrievables, u as defaultRenderRetrievableSafetyDirective, v as defaultToolsToChatCompletionsTools } from "../../../helpers-BH7HTtkD.mjs";
12
12
  import { E_INVALID_OLLAMA_OPTIONS, E_OLLAMA_CONTEXT_OVERFLOW, E_OLLAMA_HTTP_ERROR, E_OLLAMA_INVALID_TOOL_CALL_ARGS, E_OLLAMA_REQUEST_TIMEOUT, E_OLLAMA_STREAM_ERROR, E_OLLAMA_STREAM_STALLED } from "./exceptions.mjs";
13
13
  import { validateOptions } from "./validation.mjs";
14
14
  import { defaultBuildOllamaHistory, defaultRenderOllamaTimelineMessage, defaultRenderOllamaToolCallResult, ollamaToolsFromTools } from "./helpers.mjs";