@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,8 +1,8 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  require("../../../chunk-Cek0wNdY.js");
3
- const require_tool_call = require("../../../tool_call-DgqVwL5n.js");
4
- require("../../../common-BV3HGeLj.js");
5
- const require_helpers = require("../../../helpers-Tvvwpx1M.js");
3
+ const require_tool_call = require("../../../tool_call-Fs_Uh5wQ.js");
4
+ require("../../../common-H44Ik9ou.js");
5
+ const require_helpers = require("../../../helpers-CEjjkXso.js");
6
6
  const require_batteries_llm_claude_code_cli_exceptions = require("./exceptions.cjs");
7
7
  //#region src/batteries/llm/claude_code_cli/helpers.ts
8
8
  /**
@@ -1,6 +1,6 @@
1
- import { n as Media } from "../../../tool_call-CPjyvkm4.mjs";
2
- import "../../../common-v9Jo9M5k.mjs";
3
- import { A as renderMemories, B as retrievableToAttrs, C as looksLikeSpooledArtifact, D as renderArtifactHandleBody, F as renderThirdPartyPrivateRetrievables, G as toolsToChatCompletionsTools, H as sanitizeFilenameForDescription, I as renderThirdPartyPublicRetrievables, L as renderThought, M as renderRetrievableSafetyDirective, N as renderRetrievables, O as renderChatCompletionsSystemPrompt, P as renderStandingInstructions, R as renderTrustedContent, S as floorTrustTier, T as neutraliseDeveloperRulesTag, U as sanitizeMimeType, _ as defaultRenderUntrustedContent, a as defaultRenderArtifactHandleBody, b as escapeXmlAttribute, c as defaultRenderMemories, d as defaultRenderRetrievables, f as defaultRenderStandingInstructions, g as defaultRenderTrustedContent, h as defaultRenderThought, i as defaultFilterThoughts, j as renderRetrievableHandleBody, k as renderFirstPartyRetrievables, l as defaultRenderRetrievableHandleBody, m as defaultRenderThirdPartyPublicRetrievables, o as defaultRenderChatCompletionsSystemPrompt, p as defaultRenderThirdPartyPrivateRetrievables, r as defaultDescriptionToChatCompletionsJsonSchema, s as defaultRenderFirstPartyRetrievables, u as defaultRenderRetrievableSafetyDirective, v as defaultToolsToChatCompletionsTools, w as memoryToAttrs, x as filterThoughts, y as descriptionToChatCompletionsJsonSchema, z as renderUntrustedContent } from "../../../helpers-CDmLDBq5.mjs";
1
+ import { n as Media } from "../../../tool_call-Cfaj-6zK.mjs";
2
+ import "../../../common-BpdHIpQE.mjs";
3
+ import { A as renderMemories, B as retrievableToAttrs, C as looksLikeSpooledArtifact, D as renderArtifactHandleBody, F as renderThirdPartyPrivateRetrievables, G as toolsToChatCompletionsTools, H as sanitizeFilenameForDescription, I as renderThirdPartyPublicRetrievables, L as renderThought, M as renderRetrievableSafetyDirective, N as renderRetrievables, O as renderChatCompletionsSystemPrompt, P as renderStandingInstructions, R as renderTrustedContent, S as floorTrustTier, T as neutraliseDeveloperRulesTag, U as sanitizeMimeType, _ as defaultRenderUntrustedContent, a as defaultRenderArtifactHandleBody, b as escapeXmlAttribute, c as defaultRenderMemories, d as defaultRenderRetrievables, f as defaultRenderStandingInstructions, g as defaultRenderTrustedContent, h as defaultRenderThought, i as defaultFilterThoughts, j as renderRetrievableHandleBody, k as renderFirstPartyRetrievables, l as defaultRenderRetrievableHandleBody, m as defaultRenderThirdPartyPublicRetrievables, o as defaultRenderChatCompletionsSystemPrompt, p as defaultRenderThirdPartyPrivateRetrievables, r as defaultDescriptionToChatCompletionsJsonSchema, s as defaultRenderFirstPartyRetrievables, u as defaultRenderRetrievableSafetyDirective, v as defaultToolsToChatCompletionsTools, w as memoryToAttrs, x as filterThoughts, y as descriptionToChatCompletionsJsonSchema, z as renderUntrustedContent } from "../../../helpers-BH7HTtkD.mjs";
4
4
  import { E_CLAUDE_CODE_CLI_UNSUPPORTED_MEDIA_MODALITY } from "./exceptions.mjs";
5
5
  //#region src/batteries/llm/claude_code_cli/helpers.ts
6
6
  /**
@@ -12,7 +12,8 @@
12
12
  * harnesses) and is re-exported here for convenience.
13
13
  */
14
14
  import type { ClaudeCodeCliExtraArg } from "./wire";
15
- import type { SpoolStore, TokenEncoding } from "../../../common";
15
+ import type { SpoolStore } from "../../../common";
16
+ import type { TokenEncodingId } from "../../../types";
16
17
  import type { ChatCompletionsBucketOrder, UnsupportedMediaPolicy, ChatHelpersCommon } from "../chat_common/types";
17
18
  import type { Tokenizable, Memory, Message, Thought, ToolCall, Retrievable, Tool, ArtifactTool, ToolRegistry, SpooledArtifact, Media } from "../../../common";
18
19
  export type { DescriptionLike, JsonSchema, UntrustedContentAttrs, TrustedContentAttrs, StandingInstructionAttrs, MemoryAttrs, RetrievableAttrs, ThoughtAttrs, ChatCompletionsBucketLabel, ChatCompletionsBucketOrder, ChatCompletionsTool, UnsupportedMediaPolicy, ChatCompletionsRetryConfig, ChatHelpersCommon, } from "../chat_common/types";
@@ -168,7 +169,7 @@ export interface ClaudeCodeCliAdapterOptions {
168
169
  /** Size of the model's token context window for the ADK pre-flight guard. */
169
170
  contextWindow?: number;
170
171
  /** Tokenizer encoding configuration for token counting. */
171
- tokenEncoding?: TokenEncoding | null;
172
+ tokenEncoding?: TokenEncodingId | null;
172
173
  /**
173
174
  * @deprecated Single-turn dispatch is the fixed battery contract. Only `1` is accepted; the
174
175
  * option is ignored because argv always carries `--max-turns 1`.
@@ -1,7 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  require("../../../chunk-Cek0wNdY.js");
3
- const require_tokenizable = require("../../../tokenizable-CWW7iSrD.js");
4
- const require_common = require("../../../common-BV3HGeLj.js");
3
+ const require_tokenizable = require("../../../tokenizable-BMZuGWRd.js");
4
+ const require_common = require("../../../common-H44Ik9ou.js");
5
5
  require("../../../guards.cjs");
6
6
  const require_batteries_llm_claude_code_cli_exceptions = require("./exceptions.cjs");
7
7
  let _nhtio_validation = require("@nhtio/validation");
@@ -13,7 +13,7 @@ var bucketOrderSchema = _nhtio_validation.validator.array().items(bucketLabelSch
13
13
  "retrievables",
14
14
  "timeline"
15
15
  ]);
16
- var tokenEncodingSchema = _nhtio_validation.validator.alternatives(_nhtio_validation.validator.string().valid(...require_tokenizable.TokenEncoding), _nhtio_validation.validator.any().valid(null).optional()).default(null);
16
+ var tokenEncodingSchema = _nhtio_validation.validator.alternatives(_nhtio_validation.validator.string().min(1).description(`Known encodings: ${require_tokenizable.TokenEncoding.join(", ")}`), _nhtio_validation.validator.any().valid(null).optional()).default(null);
17
17
  var unsupportedMediaPolicySchema = _nhtio_validation.validator.alternatives(_nhtio_validation.validator.string().valid("throw", "fallback-stash", "synthetic-description"), _nhtio_validation.validator.object({
18
18
  mode: _nhtio_validation.validator.string().valid("fallback-stash").required(),
19
19
  stashKeys: _nhtio_validation.validator.array().items(_nhtio_validation.validator.string().min(1)).required()
@@ -1 +1 @@
1
- {"version":3,"file":"validation.cjs","names":[],"sources":["../../../../src/batteries/llm/claude_code_cli/validation.ts"],"sourcesContent":["/**\n * Runtime validation schema and wrapper for Claude Code CLI adapter options.\n *\n * @module @nhtio/adk/batteries/llm/claude_code_cli/validation\n *\n * @remarks\n * Schema and call-site wrapper for validating `ClaudeCodeCliAdapterOptions`. Used at construction\n * time and at the start of every iteration against the merged options shape (stash > executor >\n * constructor). Throws `E_INVALID_CLAUDE_CODE_CLI_OPTIONS` on failure — same hard-fail policy as\n * every other ADK contract.\n *\n * Three invariants enforced here that have no equivalent in the other LLM batteries:\n * - `apiKey`/`authToken` are mutually exclusive AND at least one is required (`.xor`).\n * - `extraArgs` entries are validated against a strict six-flag allowlist, with per-flag value\n * arity, and every value string is rejected if it starts with `-` — the fix for the `--betas`\n * variadic-value injection hazard (a value string spelling another flag would otherwise reach\n * the CLI's own argv parser as a distinct token).\n * - `process.platform` is checked at validation time: this battery is POSIX-only in v1 (reliable\n * process-group control requires POSIX process groups), mirroring\n * `src/batteries/sandbox/node/srt_enforcer.ts`'s own platform-boundary precedent.\n */\n\nimport { isError } from '@nhtio/adk/guards'\nimport { validator, ValidationError } from '@nhtio/validation'\nimport { E_INVALID_CLAUDE_CODE_CLI_OPTIONS } from './exceptions'\nimport { byteStoreSchema, TokenEncoding } from '@nhtio/adk/common'\nimport type { ClaudeCodeCliAdapterOptions } from './types'\n\n// ─── Sub-schemas ──────────────────────────────────────────────────────────────\n\nconst bucketLabelSchema = validator\n .string()\n .valid('standingInstructions', 'memories', 'retrievables', 'timeline')\n\nconst bucketOrderSchema = validator\n .array()\n .items(bucketLabelSchema)\n .unique()\n .default(['standingInstructions', 'memories', 'retrievables', 'timeline'])\n\nconst tokenEncodingSchema = validator\n .alternatives(validator.string().valid(...TokenEncoding), validator.any().valid(null).optional())\n .default(null)\n\nconst unsupportedMediaPolicySchema = validator\n .alternatives(\n validator.string().valid('throw', 'fallback-stash', 'synthetic-description'),\n validator\n .object({\n mode: validator.string().valid('fallback-stash').required(),\n stashKeys: validator.array().items(validator.string().min(1)).required(),\n })\n .unknown(false)\n )\n .default('throw')\n\nconst helperSchema = validator.function()\n\nconst helpersSchema = validator\n .object({\n descriptionToChatCompletionsJsonSchema: helperSchema.optional(),\n renderUntrustedContent: helperSchema.optional(),\n renderTrustedContent: helperSchema.optional(),\n renderStandingInstructions: helperSchema.optional(),\n renderMemories: helperSchema.optional(),\n renderRetrievables: helperSchema.optional(),\n renderRetrievableHandleBody: helperSchema.optional(),\n renderRetrievableSafetyDirective: helperSchema.optional(),\n renderFirstPartyRetrievables: helperSchema.optional(),\n renderThirdPartyPublicRetrievables: helperSchema.optional(),\n renderThirdPartyPrivateRetrievables: helperSchema.optional(),\n renderThought: helperSchema.optional(),\n filterThoughts: helperSchema.optional(),\n toolsToChatCompletionsTools: helperSchema.optional(),\n renderChatCompletionsSystemPrompt: helperSchema.optional(),\n renderClaudeCodeCliTimelineMessage: helperSchema.optional(),\n renderClaudeCodeCliToolCallResult: helperSchema.optional(),\n buildClaudeCodeCliPrompt: helperSchema.optional(),\n })\n .unknown(false)\n\n// `extraArgs`: a structured allowlist, not a flat string[]. Every value string, in every\n// position, is rejected if it starts with `-` — the fix for the --betas injection hazard.\nconst NOT_A_FLAG_RE = /^(?!-).+$/\n\nconst singleValueSchema = validator.string().min(1).pattern(NOT_A_FLAG_RE)\nconst multiValueSchema = validator\n .array()\n .items(validator.string().min(1).pattern(NOT_A_FLAG_RE))\n .min(1)\n\nconst extraArgSchema = validator\n .alternatives(\n // --betas is the only flag accepting a string[] value.\n validator\n .object({\n flag: validator.string().valid('--betas').required(),\n value: multiValueSchema.required(),\n })\n .unknown(false),\n // --prompt-suggestions is the only flag with an OPTIONAL value.\n validator\n .object({\n flag: validator.string().valid('--prompt-suggestions').required(),\n value: singleValueSchema.optional(),\n })\n .unknown(false),\n // Every remaining allowlisted flag requires a single non-empty, non-flag-shaped string value.\n validator\n .object({\n flag: validator.string().valid('--effort', '--agent', '--json-schema', '--name').required(),\n value: singleValueSchema.required(),\n })\n .unknown(false)\n )\n .required()\n\nconst extraArgsSchema = validator.array().items(extraArgSchema).optional()\n\n// ─── Top-level schema ─────────────────────────────────────────────────────────\n\n/**\n * Validator schema for `ClaudeCodeCliAdapterOptions`. Used by `validateOptions` at construction\n * time and again at the start of every iteration after options have been merged (stash > executor\n * > constructor). Rejects unknown top-level keys so typos fail loud.\n */\nexport const claudeCodeCliOptionsSchema = validator\n .object<ClaudeCodeCliAdapterOptions>({\n // ADK control\n execa: validator.function().optional(),\n wrapperPath: validator.string().optional(),\n claudeBin: validator.string().default('claude'),\n appendSystemPrompt: validator.string().optional(),\n apiKey: validator.string().optional(),\n authToken: validator.string().optional(),\n baseURL: validator.string().optional(),\n cwd: validator.string().optional(),\n addDir: validator.array().items(validator.string().min(1)).optional(),\n disallowedTools: validator.array().items(validator.string().min(1)).default([]),\n maxTurns: validator\n .number()\n .valid(1)\n .messages({\n 'any.only':\n 'maxTurns is deprecated and inert: single-turn dispatch is the fixed battery contract; ' +\n 'only maxTurns: 1 is accepted, and the option is ignored because argv always carries --max-turns 1.',\n })\n .optional(),\n contextWindow: validator.number().integer().min(1).optional(),\n tokenEncoding: tokenEncodingSchema,\n maxBudgetUsd: validator.number().min(0).optional(),\n fallbackModel: validator.array().items(validator.string().min(1)).optional(),\n selfIdentity: validator.string().min(1).default('assistant'),\n autoAck: validator.boolean().default(false),\n forwardSubagentText: validator.boolean().default(false),\n bucketOrder: bucketOrderSchema,\n thoughtSurfacing: validator\n .string()\n .valid('all-self', 'latest-self', 'all')\n .default('all-self'),\n replayCompatibility: validator.array().items(validator.string().min(1)).default([]),\n helpers: helpersSchema.optional(),\n spoolStore: byteStoreSchema.optional(),\n unsupportedMediaPolicy: unsupportedMediaPolicySchema,\n unsupportedResultMediaPolicy: unsupportedMediaPolicySchema,\n extraArgs: extraArgsSchema,\n\n // CLI-native safety caps / timeouts\n streamIdleTimeoutMs: validator.number().integer().min(0).default(60_000),\n startupTimeoutMs: validator.number().integer().min(0).default(45_000),\n disposeGraceMs: validator.number().integer().min(0).default(2_000),\n mcpToolIdleTimeoutMs: validator.number().integer().min(0).optional(),\n disableTelemetry: validator.boolean().optional(),\n disableErrorReporting: validator.boolean().optional(),\n disableNonessentialTraffic: validator.boolean().optional(),\n\n // Required\n model: validator.string().required(),\n })\n .unknown(false)\n // Exactly one of apiKey/authToken must be set.\n .xor('apiKey', 'authToken')\n // POSIX-only in v1: reliable process-group control requires POSIX process groups, mirroring\n // src/batteries/sandbox/node/srt_enforcer.ts's own platform-boundary precedent — refuse rather\n // than silently degrade.\n .custom((value, helpers) => {\n // POSIX-only in v1: reliable process-group control requires process.kill(-pid, signal),\n // which has no Windows equivalent — refuse rather than silently degrade, mirroring\n // src/batteries/sandbox/node/srt_enforcer.ts's own platform-boundary precedent.\n if (process.platform !== 'darwin' && process.platform !== 'linux') {\n return helpers.error('any.invalid')\n }\n return value\n })\n\nconst isValidationError = (value: unknown): value is ValidationError =>\n isError(value) && Array.isArray((value as ValidationError).details)\n\nconst formatValidationDetails = (err: ValidationError): string =>\n err.details.map((d) => d.message).join(' and ')\n\n/**\n * Validates an arbitrary input against `claudeCodeCliOptionsSchema` and returns the resolved\n * options shape. Throws `E_INVALID_CLAUDE_CODE_CLI_OPTIONS` (carrying the validator's error\n * report on `cause`) on failure.\n *\n * @param input - The raw options object to validate.\n * @returns The resolved options object with defaults filled in.\n */\nexport const validateOptions = (input: unknown): ClaudeCodeCliAdapterOptions => {\n const { value, error } = claudeCodeCliOptionsSchema.validate(input, {\n abortEarly: false,\n convert: false,\n })\n if (error) {\n throw new E_INVALID_CLAUDE_CODE_CLI_OPTIONS([formatValidationDetails(error)], { cause: error })\n }\n return value as ClaudeCodeCliAdapterOptions\n}\n\n// suppress unused import warning when the alias isn't referenced\nvoid isValidationError\n"],"mappings":"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"}
1
+ {"version":3,"file":"validation.cjs","names":[],"sources":["../../../../src/batteries/llm/claude_code_cli/validation.ts"],"sourcesContent":["/**\n * Runtime validation schema and wrapper for Claude Code CLI adapter options.\n *\n * @module @nhtio/adk/batteries/llm/claude_code_cli/validation\n *\n * @remarks\n * Schema and call-site wrapper for validating `ClaudeCodeCliAdapterOptions`. Used at construction\n * time and at the start of every iteration against the merged options shape (stash > executor >\n * constructor). Throws `E_INVALID_CLAUDE_CODE_CLI_OPTIONS` on failure — same hard-fail policy as\n * every other ADK contract.\n *\n * Three invariants enforced here that have no equivalent in the other LLM batteries:\n * - `apiKey`/`authToken` are mutually exclusive AND at least one is required (`.xor`).\n * - `extraArgs` entries are validated against a strict six-flag allowlist, with per-flag value\n * arity, and every value string is rejected if it starts with `-` — the fix for the `--betas`\n * variadic-value injection hazard (a value string spelling another flag would otherwise reach\n * the CLI's own argv parser as a distinct token).\n * - `process.platform` is checked at validation time: this battery is POSIX-only in v1 (reliable\n * process-group control requires POSIX process groups), mirroring\n * `src/batteries/sandbox/node/srt_enforcer.ts`'s own platform-boundary precedent.\n */\n\nimport { isError } from '@nhtio/adk/guards'\nimport { validator, ValidationError } from '@nhtio/validation'\nimport { E_INVALID_CLAUDE_CODE_CLI_OPTIONS } from './exceptions'\nimport { byteStoreSchema, TokenEncoding } from '@nhtio/adk/common'\nimport type { ClaudeCodeCliAdapterOptions } from './types'\n\n// ─── Sub-schemas ──────────────────────────────────────────────────────────────\n\nconst bucketLabelSchema = validator\n .string()\n .valid('standingInstructions', 'memories', 'retrievables', 'timeline')\n\nconst bucketOrderSchema = validator\n .array()\n .items(bucketLabelSchema)\n .unique()\n .default(['standingInstructions', 'memories', 'retrievables', 'timeline'])\n\nconst tokenEncodingSchema = validator\n .alternatives(\n // Known values are suggestions from the canonical list, not a whitelist: consumers may provide\n // a custom or newer tokenizer name. The field accepts any non-empty string, explicit null, or\n // absent (undefined = \"no token counting\"). `.optional()` preserves the null/undefined\n // disposition required by adk/require-validator-any-required.\n validator\n .string()\n .min(1)\n .description(`Known encodings: ${TokenEncoding.join(', ')}`),\n validator.any().valid(null).optional()\n )\n .default(null)\n\nconst unsupportedMediaPolicySchema = validator\n .alternatives(\n validator.string().valid('throw', 'fallback-stash', 'synthetic-description'),\n validator\n .object({\n mode: validator.string().valid('fallback-stash').required(),\n stashKeys: validator.array().items(validator.string().min(1)).required(),\n })\n .unknown(false)\n )\n .default('throw')\n\nconst helperSchema = validator.function()\n\nconst helpersSchema = validator\n .object({\n descriptionToChatCompletionsJsonSchema: helperSchema.optional(),\n renderUntrustedContent: helperSchema.optional(),\n renderTrustedContent: helperSchema.optional(),\n renderStandingInstructions: helperSchema.optional(),\n renderMemories: helperSchema.optional(),\n renderRetrievables: helperSchema.optional(),\n renderRetrievableHandleBody: helperSchema.optional(),\n renderRetrievableSafetyDirective: helperSchema.optional(),\n renderFirstPartyRetrievables: helperSchema.optional(),\n renderThirdPartyPublicRetrievables: helperSchema.optional(),\n renderThirdPartyPrivateRetrievables: helperSchema.optional(),\n renderThought: helperSchema.optional(),\n filterThoughts: helperSchema.optional(),\n toolsToChatCompletionsTools: helperSchema.optional(),\n renderChatCompletionsSystemPrompt: helperSchema.optional(),\n renderClaudeCodeCliTimelineMessage: helperSchema.optional(),\n renderClaudeCodeCliToolCallResult: helperSchema.optional(),\n buildClaudeCodeCliPrompt: helperSchema.optional(),\n })\n .unknown(false)\n\n// `extraArgs`: a structured allowlist, not a flat string[]. Every value string, in every\n// position, is rejected if it starts with `-` — the fix for the --betas injection hazard.\nconst NOT_A_FLAG_RE = /^(?!-).+$/\n\nconst singleValueSchema = validator.string().min(1).pattern(NOT_A_FLAG_RE)\nconst multiValueSchema = validator\n .array()\n .items(validator.string().min(1).pattern(NOT_A_FLAG_RE))\n .min(1)\n\nconst extraArgSchema = validator\n .alternatives(\n // --betas is the only flag accepting a string[] value.\n validator\n .object({\n flag: validator.string().valid('--betas').required(),\n value: multiValueSchema.required(),\n })\n .unknown(false),\n // --prompt-suggestions is the only flag with an OPTIONAL value.\n validator\n .object({\n flag: validator.string().valid('--prompt-suggestions').required(),\n value: singleValueSchema.optional(),\n })\n .unknown(false),\n // Every remaining allowlisted flag requires a single non-empty, non-flag-shaped string value.\n validator\n .object({\n flag: validator.string().valid('--effort', '--agent', '--json-schema', '--name').required(),\n value: singleValueSchema.required(),\n })\n .unknown(false)\n )\n .required()\n\nconst extraArgsSchema = validator.array().items(extraArgSchema).optional()\n\n// ─── Top-level schema ─────────────────────────────────────────────────────────\n\n/**\n * Validator schema for `ClaudeCodeCliAdapterOptions`. Used by `validateOptions` at construction\n * time and again at the start of every iteration after options have been merged (stash > executor\n * > constructor). Rejects unknown top-level keys so typos fail loud.\n */\nexport const claudeCodeCliOptionsSchema = validator\n .object<ClaudeCodeCliAdapterOptions>({\n // ADK control\n execa: validator.function().optional(),\n wrapperPath: validator.string().optional(),\n claudeBin: validator.string().default('claude'),\n appendSystemPrompt: validator.string().optional(),\n apiKey: validator.string().optional(),\n authToken: validator.string().optional(),\n baseURL: validator.string().optional(),\n cwd: validator.string().optional(),\n addDir: validator.array().items(validator.string().min(1)).optional(),\n disallowedTools: validator.array().items(validator.string().min(1)).default([]),\n maxTurns: validator\n .number()\n .valid(1)\n .messages({\n 'any.only':\n 'maxTurns is deprecated and inert: single-turn dispatch is the fixed battery contract; ' +\n 'only maxTurns: 1 is accepted, and the option is ignored because argv always carries --max-turns 1.',\n })\n .optional(),\n contextWindow: validator.number().integer().min(1).optional(),\n tokenEncoding: tokenEncodingSchema,\n maxBudgetUsd: validator.number().min(0).optional(),\n fallbackModel: validator.array().items(validator.string().min(1)).optional(),\n selfIdentity: validator.string().min(1).default('assistant'),\n autoAck: validator.boolean().default(false),\n forwardSubagentText: validator.boolean().default(false),\n bucketOrder: bucketOrderSchema,\n thoughtSurfacing: validator\n .string()\n .valid('all-self', 'latest-self', 'all')\n .default('all-self'),\n replayCompatibility: validator.array().items(validator.string().min(1)).default([]),\n helpers: helpersSchema.optional(),\n spoolStore: byteStoreSchema.optional(),\n unsupportedMediaPolicy: unsupportedMediaPolicySchema,\n unsupportedResultMediaPolicy: unsupportedMediaPolicySchema,\n extraArgs: extraArgsSchema,\n\n // CLI-native safety caps / timeouts\n streamIdleTimeoutMs: validator.number().integer().min(0).default(60_000),\n startupTimeoutMs: validator.number().integer().min(0).default(45_000),\n disposeGraceMs: validator.number().integer().min(0).default(2_000),\n mcpToolIdleTimeoutMs: validator.number().integer().min(0).optional(),\n disableTelemetry: validator.boolean().optional(),\n disableErrorReporting: validator.boolean().optional(),\n disableNonessentialTraffic: validator.boolean().optional(),\n\n // Required\n model: validator.string().required(),\n })\n .unknown(false)\n // Exactly one of apiKey/authToken must be set.\n .xor('apiKey', 'authToken')\n // POSIX-only in v1: reliable process-group control requires POSIX process groups, mirroring\n // src/batteries/sandbox/node/srt_enforcer.ts's own platform-boundary precedent — refuse rather\n // than silently degrade.\n .custom((value, helpers) => {\n // POSIX-only in v1: reliable process-group control requires process.kill(-pid, signal),\n // which has no Windows equivalent — refuse rather than silently degrade, mirroring\n // src/batteries/sandbox/node/srt_enforcer.ts's own platform-boundary precedent.\n if (process.platform !== 'darwin' && process.platform !== 'linux') {\n return helpers.error('any.invalid')\n }\n return value\n })\n\nconst isValidationError = (value: unknown): value is ValidationError =>\n isError(value) && Array.isArray((value as ValidationError).details)\n\nconst formatValidationDetails = (err: ValidationError): string =>\n err.details.map((d) => d.message).join(' and ')\n\n/**\n * Validates an arbitrary input against `claudeCodeCliOptionsSchema` and returns the resolved\n * options shape. Throws `E_INVALID_CLAUDE_CODE_CLI_OPTIONS` (carrying the validator's error\n * report on `cause`) on failure.\n *\n * @param input - The raw options object to validate.\n * @returns The resolved options object with defaults filled in.\n */\nexport const validateOptions = (input: unknown): ClaudeCodeCliAdapterOptions => {\n const { value, error } = claudeCodeCliOptionsSchema.validate(input, {\n abortEarly: false,\n convert: false,\n })\n if (error) {\n throw new E_INVALID_CLAUDE_CODE_CLI_OPTIONS([formatValidationDetails(error)], { cause: error })\n }\n return value as ClaudeCodeCliAdapterOptions\n}\n\n// suppress unused import warning when the alias isn't referenced\nvoid isValidationError\n"],"mappings":";;;;;;;;AA8BA,IAAM,oBAAoB,kBAAA,UACvB,OAAO,EACP,MAAM,wBAAwB,YAAY,gBAAgB,UAAU;AAEvE,IAAM,oBAAoB,kBAAA,UACvB,MAAM,EACN,MAAM,iBAAiB,EACvB,OAAO,EACP,QAAQ;CAAC;CAAwB;CAAY;CAAgB;AAAU,CAAC;AAE3E,IAAM,sBAAsB,kBAAA,UACzB,aAKC,kBAAA,UACG,OAAO,EACP,IAAI,CAAC,EACL,YAAY,oBAAoB,oBAAA,cAAc,KAAK,IAAI,GAAG,GAC7D,kBAAA,UAAU,IAAI,EAAE,MAAM,IAAI,EAAE,SAAS,CACvC,EACC,QAAQ,IAAI;AAEf,IAAM,+BAA+B,kBAAA,UAClC,aACC,kBAAA,UAAU,OAAO,EAAE,MAAM,SAAS,kBAAkB,uBAAuB,GAC3E,kBAAA,UACG,OAAO;CACN,MAAM,kBAAA,UAAU,OAAO,EAAE,MAAM,gBAAgB,EAAE,SAAS;CAC1D,WAAW,kBAAA,UAAU,MAAM,EAAE,MAAM,kBAAA,UAAU,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS;AACzE,CAAC,EACA,QAAQ,KAAK,CAClB,EACC,QAAQ,OAAO;AAElB,IAAM,eAAe,kBAAA,UAAU,SAAS;AAExC,IAAM,gBAAgB,kBAAA,UACnB,OAAO;CACN,wCAAwC,aAAa,SAAS;CAC9D,wBAAwB,aAAa,SAAS;CAC9C,sBAAsB,aAAa,SAAS;CAC5C,4BAA4B,aAAa,SAAS;CAClD,gBAAgB,aAAa,SAAS;CACtC,oBAAoB,aAAa,SAAS;CAC1C,6BAA6B,aAAa,SAAS;CACnD,kCAAkC,aAAa,SAAS;CACxD,8BAA8B,aAAa,SAAS;CACpD,oCAAoC,aAAa,SAAS;CAC1D,qCAAqC,aAAa,SAAS;CAC3D,eAAe,aAAa,SAAS;CACrC,gBAAgB,aAAa,SAAS;CACtC,6BAA6B,aAAa,SAAS;CACnD,mCAAmC,aAAa,SAAS;CACzD,oCAAoC,aAAa,SAAS;CAC1D,mCAAmC,aAAa,SAAS;CACzD,0BAA0B,aAAa,SAAS;AAClD,CAAC,EACA,QAAQ,KAAK;AAIhB,IAAM,gBAAgB;AAEtB,IAAM,oBAAoB,kBAAA,UAAU,OAAO,EAAE,IAAI,CAAC,EAAE,QAAQ,aAAa;AACzE,IAAM,mBAAmB,kBAAA,UACtB,MAAM,EACN,MAAM,kBAAA,UAAU,OAAO,EAAE,IAAI,CAAC,EAAE,QAAQ,aAAa,CAAC,EACtD,IAAI,CAAC;AAER,IAAM,iBAAiB,kBAAA,UACpB,aAEC,kBAAA,UACG,OAAO;CACN,MAAM,kBAAA,UAAU,OAAO,EAAE,MAAM,SAAS,EAAE,SAAS;CACnD,OAAO,iBAAiB,SAAS;AACnC,CAAC,EACA,QAAQ,KAAK,GAEhB,kBAAA,UACG,OAAO;CACN,MAAM,kBAAA,UAAU,OAAO,EAAE,MAAM,sBAAsB,EAAE,SAAS;CAChE,OAAO,kBAAkB,SAAS;AACpC,CAAC,EACA,QAAQ,KAAK,GAEhB,kBAAA,UACG,OAAO;CACN,MAAM,kBAAA,UAAU,OAAO,EAAE,MAAM,YAAY,WAAW,iBAAiB,QAAQ,EAAE,SAAS;CAC1F,OAAO,kBAAkB,SAAS;AACpC,CAAC,EACA,QAAQ,KAAK,CAClB,EACC,SAAS;AAEZ,IAAM,kBAAkB,kBAAA,UAAU,MAAM,EAAE,MAAM,cAAc,EAAE,SAAS;;;;;;AASzE,IAAa,6BAA6B,kBAAA,UACvC,OAAoC;CAEnC,OAAO,kBAAA,UAAU,SAAS,EAAE,SAAS;CACrC,aAAa,kBAAA,UAAU,OAAO,EAAE,SAAS;CACzC,WAAW,kBAAA,UAAU,OAAO,EAAE,QAAQ,QAAQ;CAC9C,oBAAoB,kBAAA,UAAU,OAAO,EAAE,SAAS;CAChD,QAAQ,kBAAA,UAAU,OAAO,EAAE,SAAS;CACpC,WAAW,kBAAA,UAAU,OAAO,EAAE,SAAS;CACvC,SAAS,kBAAA,UAAU,OAAO,EAAE,SAAS;CACrC,KAAK,kBAAA,UAAU,OAAO,EAAE,SAAS;CACjC,QAAQ,kBAAA,UAAU,MAAM,EAAE,MAAM,kBAAA,UAAU,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS;CACpE,iBAAiB,kBAAA,UAAU,MAAM,EAAE,MAAM,kBAAA,UAAU,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;CAC9E,UAAU,kBAAA,UACP,OAAO,EACP,MAAM,CAAC,EACP,SAAS,EACR,YACE,2LAEJ,CAAC,EACA,SAAS;CACZ,eAAe,kBAAA,UAAU,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,SAAS;CAC5D,eAAe;CACf,cAAc,kBAAA,UAAU,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;CACjD,eAAe,kBAAA,UAAU,MAAM,EAAE,MAAM,kBAAA,UAAU,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS;CAC3E,cAAc,kBAAA,UAAU,OAAO,EAAE,IAAI,CAAC,EAAE,QAAQ,WAAW;CAC3D,SAAS,kBAAA,UAAU,QAAQ,EAAE,QAAQ,KAAK;CAC1C,qBAAqB,kBAAA,UAAU,QAAQ,EAAE,QAAQ,KAAK;CACtD,aAAa;CACb,kBAAkB,kBAAA,UACf,OAAO,EACP,MAAM,YAAY,eAAe,KAAK,EACtC,QAAQ,UAAU;CACrB,qBAAqB,kBAAA,UAAU,MAAM,EAAE,MAAM,kBAAA,UAAU,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;CAClF,SAAS,cAAc,SAAS;CAChC,YAAY,eAAA,gBAAgB,SAAS;CACrC,wBAAwB;CACxB,8BAA8B;CAC9B,WAAW;CAGX,qBAAqB,kBAAA,UAAU,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAM;CACvE,kBAAkB,kBAAA,UAAU,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,QAAQ,IAAM;CACpE,gBAAgB,kBAAA,UAAU,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAK;CACjE,sBAAsB,kBAAA,UAAU,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,SAAS;CACnE,kBAAkB,kBAAA,UAAU,QAAQ,EAAE,SAAS;CAC/C,uBAAuB,kBAAA,UAAU,QAAQ,EAAE,SAAS;CACpD,4BAA4B,kBAAA,UAAU,QAAQ,EAAE,SAAS;CAGzD,OAAO,kBAAA,UAAU,OAAO,EAAE,SAAS;AACrC,CAAC,EACA,QAAQ,KAAK,EAEb,IAAI,UAAU,WAAW,EAIzB,QAAQ,OAAO,YAAY;CAI1B,IAAI,QAAQ,aAAa,YAAY,QAAQ,aAAa,SACxD,OAAO,QAAQ,MAAM,aAAa;CAEpC,OAAO;AACT,CAAC;AAKH,IAAM,2BAA2B,QAC/B,IAAI,QAAQ,KAAK,MAAM,EAAE,OAAO,EAAE,KAAK,OAAO;;;;;;;;;AAUhD,IAAa,mBAAmB,UAAgD;CAC9E,MAAM,EAAE,OAAO,UAAU,2BAA2B,SAAS,OAAO;EAClE,YAAY;EACZ,SAAS;CACX,CAAC;CACD,IAAI,OACF,MAAM,IAAI,iDAAA,kCAAkC,CAAC,wBAAwB,KAAK,CAAC,GAAG,EAAE,OAAO,MAAM,CAAC;CAEhG,OAAO;AACT"}
@@ -1,5 +1,5 @@
1
- import { n as TokenEncoding } from "../../../tokenizable-DLMP68ZV.mjs";
2
- import { o as byteStoreSchema } from "../../../common-v9Jo9M5k.mjs";
1
+ import { n as TokenEncoding } from "../../../tokenizable-VB4Av8GF.mjs";
2
+ import { o as byteStoreSchema } from "../../../common-BpdHIpQE.mjs";
3
3
  import "../../../guards.mjs";
4
4
  import { E_INVALID_CLAUDE_CODE_CLI_OPTIONS } from "./exceptions.mjs";
5
5
  import { validator } from "@nhtio/validation";
@@ -11,7 +11,7 @@ var bucketOrderSchema = validator.array().items(bucketLabelSchema).unique().defa
11
11
  "retrievables",
12
12
  "timeline"
13
13
  ]);
14
- var tokenEncodingSchema = validator.alternatives(validator.string().valid(...TokenEncoding), validator.any().valid(null).optional()).default(null);
14
+ var tokenEncodingSchema = validator.alternatives(validator.string().min(1).description(`Known encodings: ${TokenEncoding.join(", ")}`), validator.any().valid(null).optional()).default(null);
15
15
  var unsupportedMediaPolicySchema = validator.alternatives(validator.string().valid("throw", "fallback-stash", "synthetic-description"), validator.object({
16
16
  mode: validator.string().valid("fallback-stash").required(),
17
17
  stashKeys: validator.array().items(validator.string().min(1)).required()
@@ -1 +1 @@
1
- {"version":3,"file":"validation.mjs","names":[],"sources":["../../../../src/batteries/llm/claude_code_cli/validation.ts"],"sourcesContent":["/**\n * Runtime validation schema and wrapper for Claude Code CLI adapter options.\n *\n * @module @nhtio/adk/batteries/llm/claude_code_cli/validation\n *\n * @remarks\n * Schema and call-site wrapper for validating `ClaudeCodeCliAdapterOptions`. Used at construction\n * time and at the start of every iteration against the merged options shape (stash > executor >\n * constructor). Throws `E_INVALID_CLAUDE_CODE_CLI_OPTIONS` on failure — same hard-fail policy as\n * every other ADK contract.\n *\n * Three invariants enforced here that have no equivalent in the other LLM batteries:\n * - `apiKey`/`authToken` are mutually exclusive AND at least one is required (`.xor`).\n * - `extraArgs` entries are validated against a strict six-flag allowlist, with per-flag value\n * arity, and every value string is rejected if it starts with `-` — the fix for the `--betas`\n * variadic-value injection hazard (a value string spelling another flag would otherwise reach\n * the CLI's own argv parser as a distinct token).\n * - `process.platform` is checked at validation time: this battery is POSIX-only in v1 (reliable\n * process-group control requires POSIX process groups), mirroring\n * `src/batteries/sandbox/node/srt_enforcer.ts`'s own platform-boundary precedent.\n */\n\nimport { isError } from '@nhtio/adk/guards'\nimport { validator, ValidationError } from '@nhtio/validation'\nimport { E_INVALID_CLAUDE_CODE_CLI_OPTIONS } from './exceptions'\nimport { byteStoreSchema, TokenEncoding } from '@nhtio/adk/common'\nimport type { ClaudeCodeCliAdapterOptions } from './types'\n\n// ─── Sub-schemas ──────────────────────────────────────────────────────────────\n\nconst bucketLabelSchema = validator\n .string()\n .valid('standingInstructions', 'memories', 'retrievables', 'timeline')\n\nconst bucketOrderSchema = validator\n .array()\n .items(bucketLabelSchema)\n .unique()\n .default(['standingInstructions', 'memories', 'retrievables', 'timeline'])\n\nconst tokenEncodingSchema = validator\n .alternatives(validator.string().valid(...TokenEncoding), validator.any().valid(null).optional())\n .default(null)\n\nconst unsupportedMediaPolicySchema = validator\n .alternatives(\n validator.string().valid('throw', 'fallback-stash', 'synthetic-description'),\n validator\n .object({\n mode: validator.string().valid('fallback-stash').required(),\n stashKeys: validator.array().items(validator.string().min(1)).required(),\n })\n .unknown(false)\n )\n .default('throw')\n\nconst helperSchema = validator.function()\n\nconst helpersSchema = validator\n .object({\n descriptionToChatCompletionsJsonSchema: helperSchema.optional(),\n renderUntrustedContent: helperSchema.optional(),\n renderTrustedContent: helperSchema.optional(),\n renderStandingInstructions: helperSchema.optional(),\n renderMemories: helperSchema.optional(),\n renderRetrievables: helperSchema.optional(),\n renderRetrievableHandleBody: helperSchema.optional(),\n renderRetrievableSafetyDirective: helperSchema.optional(),\n renderFirstPartyRetrievables: helperSchema.optional(),\n renderThirdPartyPublicRetrievables: helperSchema.optional(),\n renderThirdPartyPrivateRetrievables: helperSchema.optional(),\n renderThought: helperSchema.optional(),\n filterThoughts: helperSchema.optional(),\n toolsToChatCompletionsTools: helperSchema.optional(),\n renderChatCompletionsSystemPrompt: helperSchema.optional(),\n renderClaudeCodeCliTimelineMessage: helperSchema.optional(),\n renderClaudeCodeCliToolCallResult: helperSchema.optional(),\n buildClaudeCodeCliPrompt: helperSchema.optional(),\n })\n .unknown(false)\n\n// `extraArgs`: a structured allowlist, not a flat string[]. Every value string, in every\n// position, is rejected if it starts with `-` — the fix for the --betas injection hazard.\nconst NOT_A_FLAG_RE = /^(?!-).+$/\n\nconst singleValueSchema = validator.string().min(1).pattern(NOT_A_FLAG_RE)\nconst multiValueSchema = validator\n .array()\n .items(validator.string().min(1).pattern(NOT_A_FLAG_RE))\n .min(1)\n\nconst extraArgSchema = validator\n .alternatives(\n // --betas is the only flag accepting a string[] value.\n validator\n .object({\n flag: validator.string().valid('--betas').required(),\n value: multiValueSchema.required(),\n })\n .unknown(false),\n // --prompt-suggestions is the only flag with an OPTIONAL value.\n validator\n .object({\n flag: validator.string().valid('--prompt-suggestions').required(),\n value: singleValueSchema.optional(),\n })\n .unknown(false),\n // Every remaining allowlisted flag requires a single non-empty, non-flag-shaped string value.\n validator\n .object({\n flag: validator.string().valid('--effort', '--agent', '--json-schema', '--name').required(),\n value: singleValueSchema.required(),\n })\n .unknown(false)\n )\n .required()\n\nconst extraArgsSchema = validator.array().items(extraArgSchema).optional()\n\n// ─── Top-level schema ─────────────────────────────────────────────────────────\n\n/**\n * Validator schema for `ClaudeCodeCliAdapterOptions`. Used by `validateOptions` at construction\n * time and again at the start of every iteration after options have been merged (stash > executor\n * > constructor). Rejects unknown top-level keys so typos fail loud.\n */\nexport const claudeCodeCliOptionsSchema = validator\n .object<ClaudeCodeCliAdapterOptions>({\n // ADK control\n execa: validator.function().optional(),\n wrapperPath: validator.string().optional(),\n claudeBin: validator.string().default('claude'),\n appendSystemPrompt: validator.string().optional(),\n apiKey: validator.string().optional(),\n authToken: validator.string().optional(),\n baseURL: validator.string().optional(),\n cwd: validator.string().optional(),\n addDir: validator.array().items(validator.string().min(1)).optional(),\n disallowedTools: validator.array().items(validator.string().min(1)).default([]),\n maxTurns: validator\n .number()\n .valid(1)\n .messages({\n 'any.only':\n 'maxTurns is deprecated and inert: single-turn dispatch is the fixed battery contract; ' +\n 'only maxTurns: 1 is accepted, and the option is ignored because argv always carries --max-turns 1.',\n })\n .optional(),\n contextWindow: validator.number().integer().min(1).optional(),\n tokenEncoding: tokenEncodingSchema,\n maxBudgetUsd: validator.number().min(0).optional(),\n fallbackModel: validator.array().items(validator.string().min(1)).optional(),\n selfIdentity: validator.string().min(1).default('assistant'),\n autoAck: validator.boolean().default(false),\n forwardSubagentText: validator.boolean().default(false),\n bucketOrder: bucketOrderSchema,\n thoughtSurfacing: validator\n .string()\n .valid('all-self', 'latest-self', 'all')\n .default('all-self'),\n replayCompatibility: validator.array().items(validator.string().min(1)).default([]),\n helpers: helpersSchema.optional(),\n spoolStore: byteStoreSchema.optional(),\n unsupportedMediaPolicy: unsupportedMediaPolicySchema,\n unsupportedResultMediaPolicy: unsupportedMediaPolicySchema,\n extraArgs: extraArgsSchema,\n\n // CLI-native safety caps / timeouts\n streamIdleTimeoutMs: validator.number().integer().min(0).default(60_000),\n startupTimeoutMs: validator.number().integer().min(0).default(45_000),\n disposeGraceMs: validator.number().integer().min(0).default(2_000),\n mcpToolIdleTimeoutMs: validator.number().integer().min(0).optional(),\n disableTelemetry: validator.boolean().optional(),\n disableErrorReporting: validator.boolean().optional(),\n disableNonessentialTraffic: validator.boolean().optional(),\n\n // Required\n model: validator.string().required(),\n })\n .unknown(false)\n // Exactly one of apiKey/authToken must be set.\n .xor('apiKey', 'authToken')\n // POSIX-only in v1: reliable process-group control requires POSIX process groups, mirroring\n // src/batteries/sandbox/node/srt_enforcer.ts's own platform-boundary precedent — refuse rather\n // than silently degrade.\n .custom((value, helpers) => {\n // POSIX-only in v1: reliable process-group control requires process.kill(-pid, signal),\n // which has no Windows equivalent — refuse rather than silently degrade, mirroring\n // src/batteries/sandbox/node/srt_enforcer.ts's own platform-boundary precedent.\n if (process.platform !== 'darwin' && process.platform !== 'linux') {\n return helpers.error('any.invalid')\n }\n return value\n })\n\nconst isValidationError = (value: unknown): value is ValidationError =>\n isError(value) && Array.isArray((value as ValidationError).details)\n\nconst formatValidationDetails = (err: ValidationError): string =>\n err.details.map((d) => d.message).join(' and ')\n\n/**\n * Validates an arbitrary input against `claudeCodeCliOptionsSchema` and returns the resolved\n * options shape. Throws `E_INVALID_CLAUDE_CODE_CLI_OPTIONS` (carrying the validator's error\n * report on `cause`) on failure.\n *\n * @param input - The raw options object to validate.\n * @returns The resolved options object with defaults filled in.\n */\nexport const validateOptions = (input: unknown): ClaudeCodeCliAdapterOptions => {\n const { value, error } = claudeCodeCliOptionsSchema.validate(input, {\n abortEarly: false,\n convert: false,\n })\n if (error) {\n throw new E_INVALID_CLAUDE_CODE_CLI_OPTIONS([formatValidationDetails(error)], { cause: error })\n }\n return value as ClaudeCodeCliAdapterOptions\n}\n\n// suppress unused import warning when the alias isn't referenced\nvoid isValidationError\n"],"mappings":"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"}
1
+ {"version":3,"file":"validation.mjs","names":[],"sources":["../../../../src/batteries/llm/claude_code_cli/validation.ts"],"sourcesContent":["/**\n * Runtime validation schema and wrapper for Claude Code CLI adapter options.\n *\n * @module @nhtio/adk/batteries/llm/claude_code_cli/validation\n *\n * @remarks\n * Schema and call-site wrapper for validating `ClaudeCodeCliAdapterOptions`. Used at construction\n * time and at the start of every iteration against the merged options shape (stash > executor >\n * constructor). Throws `E_INVALID_CLAUDE_CODE_CLI_OPTIONS` on failure — same hard-fail policy as\n * every other ADK contract.\n *\n * Three invariants enforced here that have no equivalent in the other LLM batteries:\n * - `apiKey`/`authToken` are mutually exclusive AND at least one is required (`.xor`).\n * - `extraArgs` entries are validated against a strict six-flag allowlist, with per-flag value\n * arity, and every value string is rejected if it starts with `-` — the fix for the `--betas`\n * variadic-value injection hazard (a value string spelling another flag would otherwise reach\n * the CLI's own argv parser as a distinct token).\n * - `process.platform` is checked at validation time: this battery is POSIX-only in v1 (reliable\n * process-group control requires POSIX process groups), mirroring\n * `src/batteries/sandbox/node/srt_enforcer.ts`'s own platform-boundary precedent.\n */\n\nimport { isError } from '@nhtio/adk/guards'\nimport { validator, ValidationError } from '@nhtio/validation'\nimport { E_INVALID_CLAUDE_CODE_CLI_OPTIONS } from './exceptions'\nimport { byteStoreSchema, TokenEncoding } from '@nhtio/adk/common'\nimport type { ClaudeCodeCliAdapterOptions } from './types'\n\n// ─── Sub-schemas ──────────────────────────────────────────────────────────────\n\nconst bucketLabelSchema = validator\n .string()\n .valid('standingInstructions', 'memories', 'retrievables', 'timeline')\n\nconst bucketOrderSchema = validator\n .array()\n .items(bucketLabelSchema)\n .unique()\n .default(['standingInstructions', 'memories', 'retrievables', 'timeline'])\n\nconst tokenEncodingSchema = validator\n .alternatives(\n // Known values are suggestions from the canonical list, not a whitelist: consumers may provide\n // a custom or newer tokenizer name. The field accepts any non-empty string, explicit null, or\n // absent (undefined = \"no token counting\"). `.optional()` preserves the null/undefined\n // disposition required by adk/require-validator-any-required.\n validator\n .string()\n .min(1)\n .description(`Known encodings: ${TokenEncoding.join(', ')}`),\n validator.any().valid(null).optional()\n )\n .default(null)\n\nconst unsupportedMediaPolicySchema = validator\n .alternatives(\n validator.string().valid('throw', 'fallback-stash', 'synthetic-description'),\n validator\n .object({\n mode: validator.string().valid('fallback-stash').required(),\n stashKeys: validator.array().items(validator.string().min(1)).required(),\n })\n .unknown(false)\n )\n .default('throw')\n\nconst helperSchema = validator.function()\n\nconst helpersSchema = validator\n .object({\n descriptionToChatCompletionsJsonSchema: helperSchema.optional(),\n renderUntrustedContent: helperSchema.optional(),\n renderTrustedContent: helperSchema.optional(),\n renderStandingInstructions: helperSchema.optional(),\n renderMemories: helperSchema.optional(),\n renderRetrievables: helperSchema.optional(),\n renderRetrievableHandleBody: helperSchema.optional(),\n renderRetrievableSafetyDirective: helperSchema.optional(),\n renderFirstPartyRetrievables: helperSchema.optional(),\n renderThirdPartyPublicRetrievables: helperSchema.optional(),\n renderThirdPartyPrivateRetrievables: helperSchema.optional(),\n renderThought: helperSchema.optional(),\n filterThoughts: helperSchema.optional(),\n toolsToChatCompletionsTools: helperSchema.optional(),\n renderChatCompletionsSystemPrompt: helperSchema.optional(),\n renderClaudeCodeCliTimelineMessage: helperSchema.optional(),\n renderClaudeCodeCliToolCallResult: helperSchema.optional(),\n buildClaudeCodeCliPrompt: helperSchema.optional(),\n })\n .unknown(false)\n\n// `extraArgs`: a structured allowlist, not a flat string[]. Every value string, in every\n// position, is rejected if it starts with `-` — the fix for the --betas injection hazard.\nconst NOT_A_FLAG_RE = /^(?!-).+$/\n\nconst singleValueSchema = validator.string().min(1).pattern(NOT_A_FLAG_RE)\nconst multiValueSchema = validator\n .array()\n .items(validator.string().min(1).pattern(NOT_A_FLAG_RE))\n .min(1)\n\nconst extraArgSchema = validator\n .alternatives(\n // --betas is the only flag accepting a string[] value.\n validator\n .object({\n flag: validator.string().valid('--betas').required(),\n value: multiValueSchema.required(),\n })\n .unknown(false),\n // --prompt-suggestions is the only flag with an OPTIONAL value.\n validator\n .object({\n flag: validator.string().valid('--prompt-suggestions').required(),\n value: singleValueSchema.optional(),\n })\n .unknown(false),\n // Every remaining allowlisted flag requires a single non-empty, non-flag-shaped string value.\n validator\n .object({\n flag: validator.string().valid('--effort', '--agent', '--json-schema', '--name').required(),\n value: singleValueSchema.required(),\n })\n .unknown(false)\n )\n .required()\n\nconst extraArgsSchema = validator.array().items(extraArgSchema).optional()\n\n// ─── Top-level schema ─────────────────────────────────────────────────────────\n\n/**\n * Validator schema for `ClaudeCodeCliAdapterOptions`. Used by `validateOptions` at construction\n * time and again at the start of every iteration after options have been merged (stash > executor\n * > constructor). Rejects unknown top-level keys so typos fail loud.\n */\nexport const claudeCodeCliOptionsSchema = validator\n .object<ClaudeCodeCliAdapterOptions>({\n // ADK control\n execa: validator.function().optional(),\n wrapperPath: validator.string().optional(),\n claudeBin: validator.string().default('claude'),\n appendSystemPrompt: validator.string().optional(),\n apiKey: validator.string().optional(),\n authToken: validator.string().optional(),\n baseURL: validator.string().optional(),\n cwd: validator.string().optional(),\n addDir: validator.array().items(validator.string().min(1)).optional(),\n disallowedTools: validator.array().items(validator.string().min(1)).default([]),\n maxTurns: validator\n .number()\n .valid(1)\n .messages({\n 'any.only':\n 'maxTurns is deprecated and inert: single-turn dispatch is the fixed battery contract; ' +\n 'only maxTurns: 1 is accepted, and the option is ignored because argv always carries --max-turns 1.',\n })\n .optional(),\n contextWindow: validator.number().integer().min(1).optional(),\n tokenEncoding: tokenEncodingSchema,\n maxBudgetUsd: validator.number().min(0).optional(),\n fallbackModel: validator.array().items(validator.string().min(1)).optional(),\n selfIdentity: validator.string().min(1).default('assistant'),\n autoAck: validator.boolean().default(false),\n forwardSubagentText: validator.boolean().default(false),\n bucketOrder: bucketOrderSchema,\n thoughtSurfacing: validator\n .string()\n .valid('all-self', 'latest-self', 'all')\n .default('all-self'),\n replayCompatibility: validator.array().items(validator.string().min(1)).default([]),\n helpers: helpersSchema.optional(),\n spoolStore: byteStoreSchema.optional(),\n unsupportedMediaPolicy: unsupportedMediaPolicySchema,\n unsupportedResultMediaPolicy: unsupportedMediaPolicySchema,\n extraArgs: extraArgsSchema,\n\n // CLI-native safety caps / timeouts\n streamIdleTimeoutMs: validator.number().integer().min(0).default(60_000),\n startupTimeoutMs: validator.number().integer().min(0).default(45_000),\n disposeGraceMs: validator.number().integer().min(0).default(2_000),\n mcpToolIdleTimeoutMs: validator.number().integer().min(0).optional(),\n disableTelemetry: validator.boolean().optional(),\n disableErrorReporting: validator.boolean().optional(),\n disableNonessentialTraffic: validator.boolean().optional(),\n\n // Required\n model: validator.string().required(),\n })\n .unknown(false)\n // Exactly one of apiKey/authToken must be set.\n .xor('apiKey', 'authToken')\n // POSIX-only in v1: reliable process-group control requires POSIX process groups, mirroring\n // src/batteries/sandbox/node/srt_enforcer.ts's own platform-boundary precedent — refuse rather\n // than silently degrade.\n .custom((value, helpers) => {\n // POSIX-only in v1: reliable process-group control requires process.kill(-pid, signal),\n // which has no Windows equivalent — refuse rather than silently degrade, mirroring\n // src/batteries/sandbox/node/srt_enforcer.ts's own platform-boundary precedent.\n if (process.platform !== 'darwin' && process.platform !== 'linux') {\n return helpers.error('any.invalid')\n }\n return value\n })\n\nconst isValidationError = (value: unknown): value is ValidationError =>\n isError(value) && Array.isArray((value as ValidationError).details)\n\nconst formatValidationDetails = (err: ValidationError): string =>\n err.details.map((d) => d.message).join(' and ')\n\n/**\n * Validates an arbitrary input against `claudeCodeCliOptionsSchema` and returns the resolved\n * options shape. Throws `E_INVALID_CLAUDE_CODE_CLI_OPTIONS` (carrying the validator's error\n * report on `cause`) on failure.\n *\n * @param input - The raw options object to validate.\n * @returns The resolved options object with defaults filled in.\n */\nexport const validateOptions = (input: unknown): ClaudeCodeCliAdapterOptions => {\n const { value, error } = claudeCodeCliOptionsSchema.validate(input, {\n abortEarly: false,\n convert: false,\n })\n if (error) {\n throw new E_INVALID_CLAUDE_CODE_CLI_OPTIONS([formatValidationDetails(error)], { cause: error })\n }\n return value as ClaudeCodeCliAdapterOptions\n}\n\n// suppress unused import warning when the alias isn't referenced\nvoid isValidationError\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  require("../../chunk-Cek0wNdY.js");
3
- const require_helpers = require("../../helpers-Tvvwpx1M.js");
3
+ const require_helpers = require("../../helpers-CEjjkXso.js");
4
4
  const require_batteries_llm_claude_code_cli_exceptions = require("./claude_code_cli/exceptions.cjs");
5
5
  const require_batteries_llm_claude_code_cli_validation = require("./claude_code_cli/validation.cjs");
6
6
  const require_batteries_llm_claude_code_cli_helpers = require("./claude_code_cli/helpers.cjs");
@@ -1,4 +1,4 @@
1
- import { A as renderMemories, D as renderArtifactHandleBody, F as renderThirdPartyPrivateRetrievables, G as toolsToChatCompletionsTools, I as renderThirdPartyPublicRetrievables, L as renderThought, M as renderRetrievableSafetyDirective, N as renderRetrievables, O as renderChatCompletionsSystemPrompt, P as renderStandingInstructions, R as renderTrustedContent, _ as defaultRenderUntrustedContent, a as defaultRenderArtifactHandleBody, c as defaultRenderMemories, d as defaultRenderRetrievables, f as defaultRenderStandingInstructions, g as defaultRenderTrustedContent, h as defaultRenderThought, i as defaultFilterThoughts, j as renderRetrievableHandleBody, k as renderFirstPartyRetrievables, l as defaultRenderRetrievableHandleBody, m as defaultRenderThirdPartyPublicRetrievables, o as defaultRenderChatCompletionsSystemPrompt, p as defaultRenderThirdPartyPrivateRetrievables, r as defaultDescriptionToChatCompletionsJsonSchema, s as defaultRenderFirstPartyRetrievables, u as defaultRenderRetrievableSafetyDirective, v as defaultToolsToChatCompletionsTools, x as filterThoughts, y as descriptionToChatCompletionsJsonSchema, z as renderUntrustedContent } from "../../helpers-CDmLDBq5.mjs";
1
+ import { A as renderMemories, D as renderArtifactHandleBody, F as renderThirdPartyPrivateRetrievables, G as toolsToChatCompletionsTools, I as renderThirdPartyPublicRetrievables, L as renderThought, M as renderRetrievableSafetyDirective, N as renderRetrievables, O as renderChatCompletionsSystemPrompt, P as renderStandingInstructions, R as renderTrustedContent, _ as defaultRenderUntrustedContent, a as defaultRenderArtifactHandleBody, c as defaultRenderMemories, d as defaultRenderRetrievables, f as defaultRenderStandingInstructions, g as defaultRenderTrustedContent, h as defaultRenderThought, i as defaultFilterThoughts, j as renderRetrievableHandleBody, k as renderFirstPartyRetrievables, l as defaultRenderRetrievableHandleBody, m as defaultRenderThirdPartyPublicRetrievables, o as defaultRenderChatCompletionsSystemPrompt, p as defaultRenderThirdPartyPrivateRetrievables, r as defaultDescriptionToChatCompletionsJsonSchema, s as defaultRenderFirstPartyRetrievables, u as defaultRenderRetrievableSafetyDirective, v as defaultToolsToChatCompletionsTools, x as filterThoughts, y as descriptionToChatCompletionsJsonSchema, z as renderUntrustedContent } from "../../helpers-BH7HTtkD.mjs";
2
2
  import { E_CLAUDE_CODE_CLI_BINARY_NOT_FOUND, E_CLAUDE_CODE_CLI_CONTEXT_OVERFLOW, E_CLAUDE_CODE_CLI_MCP_BRIDGE_STARTUP_FAILED, E_CLAUDE_CODE_CLI_PROCESS_EXITED_NONZERO, E_CLAUDE_CODE_CLI_STARTUP_TIMEOUT, E_CLAUDE_CODE_CLI_STREAM_ERROR, E_CLAUDE_CODE_CLI_STREAM_STALLED, E_CLAUDE_CODE_CLI_TURN_FAILED, E_CLAUDE_CODE_CLI_UNSUPPORTED_MEDIA_MODALITY, E_CLAUDE_CODE_CLI_WRAPPER_CRASHED, E_CLAUDE_CODE_CLI_WRAPPER_SPAWN_ERROR, E_INVALID_CLAUDE_CODE_CLI_OPTIONS } from "./claude_code_cli/exceptions.mjs";
3
3
  import { claudeCodeCliOptionsSchema, validateOptions } from "./claude_code_cli/validation.mjs";
4
4
  import { buildClaudeCodeCliPrompt, defaultBuildClaudeCodeCliPrompt, defaultRenderClaudeCodeCliTimelineMessage, defaultRenderClaudeCodeCliToolCallResult, renderClaudeCodeCliTimelineMessage, renderClaudeCodeCliToolCallResult } from "./claude_code_cli/helpers.mjs";
@@ -1,14 +1,14 @@
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_tool_parsers = require("../../../tool_parsers-csSBFWob.js");
11
- const require_helpers = require("../../../helpers-Tvvwpx1M.js");
11
+ const require_helpers = require("../../../helpers-CEjjkXso.js");
12
12
  const require_batteries_llm_gemini_generate_content_exceptions = require("./exceptions.cjs");
13
13
  const require_batteries_llm_gemini_generate_content_validation = require("./validation.cjs");
14
14
  const require_batteries_llm_gemini_generate_content_helpers = require("./helpers.cjs");
@@ -43,6 +43,7 @@ var DEFAULT_BASE_URL = "https://generativelanguage.googleapis.com/v1beta";
43
43
  * Gemini reasoning session. See the option's TSDoc for why this is the default.
44
44
  */
45
45
  var DEFAULT_SENTINEL = "skip_thought_signature_validator";
46
+ var estimateTokensOf = async (value, encoding) => Promise.resolve(value.estimateTokens(encoding));
46
47
  var computeChecksum = (tool, args) => (0, js_sha256.sha256)(`${tool}:${require_spooled_artifact.canonicalStringify(args)}`);
47
48
  /** Merge the three option layers, later winning. */
48
49
  var mergeOptions = (...layers) => {
@@ -120,6 +121,7 @@ var GeminiGenerateContentAdapter = class GeminiGenerateContentAdapter {
120
121
  };
121
122
  const stashRaw = ctx.stash.get(adapterClass.STASH_KEY, {});
122
123
  const merged = require_batteries_llm_gemini_generate_content_validation.validateOptions(mergeOptions(baseline, overrides, require_guards.isObject(stashRaw) ? stashRaw : {}));
124
+ if (merged.tokenEncoding !== void 0 && merged.tokenEncoding !== null && merged.contextWindow === void 0) throw new require_batteries_llm_gemini_generate_content_exceptions.E_INVALID_GEMINI_GENERATE_CONTENT_OPTIONS(["tokenEncoding is non-null but contextWindow is undefined"]);
123
125
  const resolved = resolveHelpers(merged.helpers);
124
126
  const selfIdentity = "assistant";
125
127
  const dispatchStreamId = (0, uuid.v6)();
@@ -133,6 +135,26 @@ var GeminiGenerateContentAdapter = class GeminiGenerateContentAdapter {
133
135
  unsupportedMediaPolicy: merged.unsupportedMediaPolicy ?? "throw",
134
136
  warn
135
137
  }));
138
+ if (merged.tokenEncoding !== void 0 && merged.tokenEncoding !== null && merged.contextWindow !== void 0) {
139
+ const encoding = merged.tokenEncoding;
140
+ let total = await estimateTokensOf(ctx.systemPrompt, encoding);
141
+ for (const value of ctx.standingInstructions) total += await estimateTokensOf(value, encoding);
142
+ for (const memory of ctx.turnMemories) total += await estimateTokensOf(memory.content, encoding);
143
+ for (const retrievable of ctx.turnRetrievables) total += await estimateTokensOf(retrievable.inline ? retrievable.content : new require_tokenizable.Tokenizable(`[Reference available: ${retrievable.id}]`), encoding);
144
+ for (const message of ctx.turnMessages) if (message.content !== void 0) total += await estimateTokensOf(message.content, encoding);
145
+ for (const thought of ctx.turnThoughts) total += await estimateTokensOf(thought.content, encoding);
146
+ for (const result of renderedToolCallResults.values()) total += await estimateTokensOf(new require_tokenizable.Tokenizable(JSON.stringify(result)), encoding);
147
+ const tools = ctx.tools.visible();
148
+ if (tools.length > 0) {
149
+ const toolTokens = await estimateTokensOf(new require_tokenizable.Tokenizable(JSON.stringify(resolved.toolsToGeminiTools(tools))), encoding);
150
+ total += Math.ceil(toolTokens * 1.5);
151
+ }
152
+ if (total + (merged.maxOutputTokens ?? 0) > merged.contextWindow) throw new require_batteries_llm_gemini_generate_content_exceptions.E_GEMINI_GENERATE_CONTENT_CONTEXT_OVERFLOW([
153
+ total + (merged.maxOutputTokens ?? 0),
154
+ merged.contextWindow,
155
+ encoding
156
+ ]);
157
+ }
136
158
  const request = await resolved.buildGeminiRequest({
137
159
  systemPrompt: ctx.systemPrompt,
138
160
  standingInstructions: ctx.standingInstructions,
@@ -264,7 +286,7 @@ var GeminiGenerateContentAdapter = class GeminiGenerateContentAdapter {
264
286
  message: `generation ended with finishReason=${finishReason ?? "unknown"} and no function calls`,
265
287
  payload: { finishReason: finishReason ?? "unknown" }
266
288
  });
267
- ctx.ack();
289
+ if (merged.autoAck) ctx.ack();
268
290
  return;
269
291
  }
270
292
  for (const call of calls) {
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.cjs","names":["#baseline"],"sources":["../../../../src/batteries/llm/gemini_generate_content/adapter.ts"],"sourcesContent":["/**\n * Cross-environment executor adapter for Google's native Gemini `generateContent` endpoint.\n *\n * @module @nhtio/adk/batteries/llm/gemini_generate_content/adapter\n *\n * @remarks\n * Targets `POST {baseURL}/models/{model}:generateContent` (and `:streamGenerateContent` when\n * `stream` is set) — Gemini's OWN wire format, not an OpenAI-compatible façade in front of it.\n *\n * That distinction is the reason this battery exists. Pointing `openai_chat_completions` at a\n * Gemini-compatible gateway means some translator, not the ADK, decides how your primitives become\n * `contents[]` — including whether a `thoughtSignature` is stamped, whether consecutive same-role\n * turns get merged, and how a tool result is correlated to its call. For ordinary use that is fine.\n * For anything that needs to reason about what the VENDOR actually received — an ordering guard, a\n * wire-shape audit, a bug report against Google — the translation has to be ours and observable.\n * See the validation battery's \"Which API surface a rule applies to\" guide.\n *\n * Options layer exactly as the other batteries: constructor baseline → `executor()` overrides →\n * per-iteration `ctx.stash.geminiGenerateContent`, re-validated each iteration.\n */\n\nimport { DateTime } from 'luxon'\nimport { sha256 } from 'js-sha256'\nimport { v6 as uuidv6 } from 'uuid'\nimport { validateOptions } from './validation'\nimport { normalizeToolName } from '../chat_common/helpers'\nimport { isError, isObject, isInstanceOf } from '@nhtio/adk/guards'\nimport { resolveToolCallParser } from '../chat_common/tool_parsers'\nimport { canonicalStringify } from '../../../lib/utils/canonical_json'\nimport { ArtifactTool, Media, Message, Thought, Tokenizable, ToolCall } from '@nhtio/adk/common'\nimport {\n E_GEMINI_INVALID_TOOL_CALL_ARGS,\n E_GEMINI_MISSING_THOUGHT_SIGNATURE,\n E_GEMINI_REQUEST_FAILED,\n E_GEMINI_STREAM_ERROR,\n} from './exceptions'\nimport {\n DEFAULT_GEMINI_BUCKET_ORDER,\n buildGeminiRequest,\n extractGeminiGeneration,\n mediaToGeminiInlineData,\n renderGeminiToolResult,\n toolsToGeminiTools,\n} from './helpers'\nimport {\n descriptionToChatCompletionsJsonSchema,\n filterThoughts,\n renderChatCompletionsSystemPrompt,\n renderFirstPartyRetrievables,\n renderMemories,\n renderRetrievableSafetyDirective,\n renderRetrievables,\n renderStandingInstructions,\n renderThirdPartyPrivateRetrievables,\n renderThirdPartyPublicRetrievables,\n renderThought,\n renderTrustedContent,\n renderUntrustedContent,\n} from '../chat_common/helpers'\nimport type { DispatchContext } from '@nhtio/adk/types'\nimport type { SpooledArtifact, Tool } from '@nhtio/adk/common'\nimport type { DispatchExecutorFn, DispatchExecutorHelpers } from '@nhtio/adk/types'\nimport type {\n GeminiGenerateContentAdapterOptions,\n GeminiGenerateContentHelpers,\n GeminiGenerateContentResponse,\n} from './types'\n\nconst nowIso = (): string => DateTime.now().toISO() ?? new Date().toISOString()\n\nconst DEFAULT_BASE_URL = 'https://generativelanguage.googleapis.com/v1beta'\n/**\n * Google's documented portable sentinel for replaying tool history that did not originate from a\n * Gemini reasoning session. See the option's TSDoc for why this is the default.\n */\nconst DEFAULT_SENTINEL = 'skip_thought_signature_validator'\n\nconst computeChecksum = (tool: string, args: Record<string, unknown>): string =>\n sha256(`${tool}:${canonicalStringify(args)}`)\n\n/** Merge the three option layers, later winning. */\nconst mergeOptions = (\n ...layers: Array<Partial<GeminiGenerateContentAdapterOptions> | undefined>\n): Partial<GeminiGenerateContentAdapterOptions> => {\n const out: Record<string, unknown> = {}\n for (const layer of layers) {\n if (!layer) continue\n for (const [k, v] of Object.entries(layer)) if (v !== undefined) out[k] = v\n }\n return out as Partial<GeminiGenerateContentAdapterOptions>\n}\n\n/** Fill every injectable helper, preferring the caller's override. */\nconst resolveHelpers = (\n overrides: Partial<GeminiGenerateContentHelpers> | undefined\n): GeminiGenerateContentHelpers => {\n const src = (overrides ?? {}) as Record<string, unknown>\n const pick = <T>(key: string, fallback: T): T => (src[key] as T | undefined) ?? fallback\n return {\n descriptionToChatCompletionsJsonSchema: pick(\n 'descriptionToChatCompletionsJsonSchema',\n descriptionToChatCompletionsJsonSchema\n ),\n renderUntrustedContent: pick('renderUntrustedContent', renderUntrustedContent),\n renderTrustedContent: pick('renderTrustedContent', renderTrustedContent),\n renderStandingInstructions: pick('renderStandingInstructions', renderStandingInstructions),\n renderMemories: pick('renderMemories', renderMemories),\n renderRetrievables: pick('renderRetrievables', renderRetrievables),\n renderRetrievableSafetyDirective: pick(\n 'renderRetrievableSafetyDirective',\n renderRetrievableSafetyDirective\n ),\n renderFirstPartyRetrievables: pick(\n 'renderFirstPartyRetrievables',\n renderFirstPartyRetrievables\n ),\n renderThirdPartyPublicRetrievables: pick(\n 'renderThirdPartyPublicRetrievables',\n renderThirdPartyPublicRetrievables\n ),\n renderThirdPartyPrivateRetrievables: pick(\n 'renderThirdPartyPrivateRetrievables',\n renderThirdPartyPrivateRetrievables\n ),\n renderThought: pick('renderThought', renderThought),\n filterThoughts: pick('filterThoughts', filterThoughts),\n renderChatCompletionsSystemPrompt: pick(\n 'renderChatCompletionsSystemPrompt',\n renderChatCompletionsSystemPrompt\n ),\n toolsToGeminiTools: pick('toolsToGeminiTools', toolsToGeminiTools),\n renderGeminiToolResult: pick('renderGeminiToolResult', renderGeminiToolResult),\n buildGeminiRequest: pick('buildGeminiRequest', buildGeminiRequest),\n } as GeminiGenerateContentHelpers\n}\n\n/**\n * Native Gemini `generateContent` executor adapter.\n *\n * @example\n * ```ts\n * const adapter = new GeminiGenerateContentAdapter({\n * model: 'gemini-2.5-flash-lite',\n * apiKey: process.env.GEMINI_API_KEY,\n * })\n * const runner = new TurnRunner({ executorCallback: adapter.executor(), ... })\n * ```\n */\nexport class GeminiGenerateContentAdapter {\n /** Per-iteration override key on `ctx.stash`. */\n public static readonly STASH_KEY = 'geminiGenerateContent' as const\n\n readonly #baseline: GeminiGenerateContentAdapterOptions\n\n /**\n * @param options - Constructor-baseline options, re-validated每 iteration after overrides merge.\n * @throws {@link E_INVALID_GEMINI_GENERATE_CONTENT_OPTIONS} when `options` is invalid.\n */\n constructor(options: unknown) {\n this.#baseline = validateOptions(options)\n }\n\n /** Narrowing guard for cross-realm instances. */\n public static isGeminiGenerateContentAdapter(\n value: unknown\n ): value is GeminiGenerateContentAdapter {\n return isInstanceOf(value, 'GeminiGenerateContentAdapter', GeminiGenerateContentAdapter)\n }\n\n /**\n * Build a {@link DispatchExecutorFn} bound to the baseline plus optional executor-scope overrides.\n *\n * @param overrides - Higher precedence than the baseline, lower than `ctx.stash`.\n */\n executor(overrides?: Partial<GeminiGenerateContentAdapterOptions>): DispatchExecutorFn {\n const baseline = this.#baseline\n const adapterClass = GeminiGenerateContentAdapter\n return async (ctx: DispatchContext, helpers: DispatchExecutorHelpers): Promise<void> => {\n const warn = (message: string): void => {\n helpers.log.warn({ kind: 'helper-warning', message })\n }\n\n // ── merge & validate ────────────────────────────────────────────────\n const stashRaw = ctx.stash.get(adapterClass.STASH_KEY, {}) as unknown\n const stashOverrides = isObject(stashRaw)\n ? (stashRaw as Partial<GeminiGenerateContentAdapterOptions>)\n : {}\n const merged = validateOptions(mergeOptions(baseline, overrides, stashOverrides))\n const resolved = resolveHelpers(merged.helpers)\n const selfIdentity = 'assistant'\n const dispatchStreamId = uuidv6()\n\n // ── pre-render tool results ─────────────────────────────────────────\n // Gemini wants an OBJECT in functionResponse.response, so results are rendered ahead of\n // assembly and keyed by the live ToolCall instance. Keying by id lets a duplicate id\n // overwrite an earlier result before assembly.\n const renderedToolCallResults = new Map<ToolCall, Record<string, unknown>>()\n for (const tc of ctx.turnToolCalls) {\n renderedToolCallResults.set(\n tc,\n await resolved.renderGeminiToolResult({\n toolCall: tc,\n results: tc.results as never,\n tool: ctx.tools.get(tc.tool) as Tool | ArtifactTool | undefined,\n renderUntrustedContent: resolved.renderUntrustedContent,\n renderTrustedContent: resolved.renderTrustedContent,\n unsupportedMediaPolicy: merged.unsupportedMediaPolicy ?? 'throw',\n warn,\n })\n )\n }\n\n // ── assemble ────────────────────────────────────────────────────────\n const request = await resolved.buildGeminiRequest({\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 ?? (DEFAULT_GEMINI_BUCKET_ORDER as never),\n selfIdentity,\n thoughtSurfacing: merged.thoughtSurfacing ?? 'all-self',\n replayCompatibility: [],\n thoughtSignatureSentinel:\n merged.thoughtSignatureSentinel === undefined\n ? DEFAULT_SENTINEL\n : merged.thoughtSignatureSentinel,\n helpers: resolved,\n decodeMedia: mediaToGeminiInlineData,\n unsupportedMediaPolicy: merged.unsupportedMediaPolicy,\n warn,\n })\n\n const generationConfig = {\n ...(merged.maxOutputTokens !== undefined\n ? { maxOutputTokens: merged.maxOutputTokens }\n : {}),\n ...(merged.temperature !== undefined ? { temperature: merged.temperature } : {}),\n ...(merged.topP !== undefined ? { topP: merged.topP } : {}),\n ...(merged.topK !== undefined ? { topK: merged.topK } : {}),\n ...(merged.stopSequences ? { stopSequences: merged.stopSequences } : {}),\n ...(merged.thinkingConfig ? { thinkingConfig: merged.thinkingConfig } : {}),\n }\n const body = {\n ...request,\n ...(Object.keys(generationConfig).length > 0 ? { generationConfig } : {}),\n ...(merged.toolConfig ? { toolConfig: merged.toolConfig } : {}),\n ...(merged.safetySettings ? { safetySettings: merged.safetySettings } : {}),\n }\n\n // Prompt-assembled tap: the EXACT body about to be POSTed. An ADK-control key — stripped\n // from the wire request, never sent. Observer errors are swallowed so a tap can never\n // corrupt a generation.\n if (merged.onPromptAssembled) {\n try {\n merged.onPromptAssembled({\n battery: 'gemini_generate_content',\n kind: 'request-body',\n messages: body.contents,\n tools: body.tools,\n requestBody: body,\n streamed: merged.stream === true,\n streamId: dispatchStreamId,\n })\n } catch {\n /* observer errors are non-fatal */\n }\n }\n\n // ── dispatch ────────────────────────────────────────────────────────\n const base = (merged.baseURL ?? DEFAULT_BASE_URL).replace(/\\/$/, '')\n const action = merged.stream === true ? 'streamGenerateContent' : 'generateContent'\n const url = `${base}/models/${merged.model}:${action}`\n const headers: Record<string, string> = { 'Content-Type': 'application/json' }\n if (merged.apiKey) {\n // Google's own endpoint wants x-goog-api-key; several gateways in front of it accept only\n // Authorization, hence the switch rather than sending both.\n if (merged.useBearerAuth === true) headers.Authorization = `Bearer ${merged.apiKey}`\n else headers['x-goog-api-key'] = merged.apiKey\n }\n\n const doFetch = merged.fetch ?? globalThis.fetch\n let parsed: GeminiGenerateContentResponse\n try {\n const res = await doFetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: merged.timeoutMs ? AbortSignal.timeout(merged.timeoutMs) : ctx.abortSignal,\n })\n const text = await res.text()\n if (!res.ok) {\n // Classify the vendor's own signature rejection separately — it is actionable, and\n // Gemini's generic INVALID_ARGUMENT body gives a caller nothing to act on.\n if (/thought_signature|thoughtSignature/i.test(text)) {\n ctx.nack(new E_GEMINI_MISSING_THOUGHT_SIGNATURE([text.slice(0, 400)]))\n return\n }\n ctx.nack(new E_GEMINI_REQUEST_FAILED([res.status, text.slice(0, 400)]))\n return\n }\n parsed = JSON.parse(text) as GeminiGenerateContentResponse\n } catch (err) {\n ctx.nack(new E_GEMINI_STREAM_ERROR([isError(err) ? err.message : String(err)]))\n return\n }\n\n // ── interpret ───────────────────────────────────────────────────────\n const { text, reasoning, functionCalls, finishReason } = extractGeminiGeneration(parsed)\n const responseId = uuidv6()\n\n if (text.length > 0) {\n const messageId = `${responseId}:message`\n helpers.reportMessage(messageId, text, { isComplete: true })\n await ctx.storeMessage(\n new Message({\n id: messageId,\n role: 'assistant',\n content: text,\n identity: selfIdentity,\n createdAt: nowIso(),\n updatedAt: nowIso(),\n })\n )\n }\n if (reasoning.length > 0) {\n const thoughtId = `${responseId}:thought`\n helpers.reportThought(thoughtId, reasoning, { isComplete: true })\n await ctx.storeThought(\n new Thought({\n id: thoughtId,\n content: reasoning,\n identity: selfIdentity,\n createdAt: nowIso(),\n updatedAt: nowIso(),\n })\n )\n }\n\n // Fallback recovery: only consulted when the provider returned NO structured calls, so a\n // native functionCall always wins over a parsed one.\n let calls = functionCalls.map((c) => ({ id: uuidv6(), name: c.name, args: c.args }))\n if (calls.length === 0 && merged.localToolCallParser !== undefined && text.length > 0) {\n const parser = resolveToolCallParser(merged.localToolCallParser)\n // The parser returns { calls, cleanedText } — not an iterable of calls — and the\n // second argument carries the tool names actually offered this turn so a parser can\n // reject a hallucinated name rather than manufacture a call for it.\n const recovered = parser(text, { toolNames: ctx.tools.all().map((t) => t.name) })\n for (const call of recovered.calls) {\n calls.push({\n id: uuidv6(),\n name: call.name,\n args: (call.arguments ?? {}) as Record<string, unknown>,\n })\n }\n }\n\n if (merged.onRawGeneration) {\n try {\n merged.onRawGeneration({\n rawText: text,\n cleanedText: text,\n reasoning: reasoning.length > 0 ? [reasoning] : [],\n toolCalls: calls.map((c) => ({ name: c.name, arguments: c.args as never })),\n streamed: merged.stream === true,\n streamId: dispatchStreamId,\n })\n } catch {\n /* observer errors are non-fatal */\n }\n }\n\n if (calls.length === 0) {\n // `finishReason` is recorded for the caller; an empty generation is NOT an error here —\n // it is a real vendor outcome and the runner decides what to do with it.\n helpers.log.trace({\n kind: 'gemini-finish',\n message: `generation ended with finishReason=${finishReason ?? 'unknown'} and no function calls`,\n payload: { finishReason: finishReason ?? 'unknown' },\n })\n ctx.ack()\n return\n }\n\n for (const call of calls) {\n if (ctx.abortSignal.aborted) return\n const toolName = normalizeToolName(call.name)\n const tool = ctx.tools.get(toolName) as Tool | ArtifactTool | undefined\n const completedAt = nowIso()\n\n if (!isObject(call.args)) {\n const results = new Tokenizable(\n new E_GEMINI_INVALID_TOOL_CALL_ARGS([JSON.stringify(call.args)]).message\n )\n helpers.reportToolCall(call.id, { tool: toolName, args: {} })\n helpers.reportToolCall(call.id, { results, isError: true, isComplete: true })\n await ctx.storeToolCall(\n new ToolCall({\n id: call.id,\n tool: toolName,\n args: {},\n checksum: computeChecksum(toolName, {}),\n isComplete: true,\n isError: true,\n results,\n createdAt: completedAt,\n updatedAt: completedAt,\n completedAt,\n })\n )\n continue\n }\n\n if (!tool) {\n const available = ctx.tools\n .all()\n .map((t) => t.name)\n .sort()\n const results = new Tokenizable(\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 )\n helpers.reportToolCall(call.id, { tool: toolName, args: call.args })\n helpers.reportToolCall(call.id, { results, isError: true, isComplete: true })\n await ctx.storeToolCall(\n new ToolCall({\n id: call.id,\n tool: toolName,\n args: call.args,\n checksum: computeChecksum(toolName, call.args),\n isComplete: true,\n isError: true,\n results,\n createdAt: completedAt,\n updatedAt: completedAt,\n completedAt,\n })\n )\n continue\n }\n\n helpers.reportToolCall(call.id, { tool: tool.name, args: call.args })\n let results: Tokenizable | SpooledArtifact | SpooledArtifact[] | Media | Media[] =\n new Tokenizable('')\n let isToolError = false\n try {\n const raw = await tool.executor(ctx)(call.args)\n results = Tokenizable.isTokenizable(raw)\n ? raw\n : new Tokenizable(typeof raw === 'string' ? raw : JSON.stringify(raw ?? ''))\n } catch (err) {\n isToolError = true\n results = new Tokenizable(isError(err) ? err.message : String(err))\n }\n const finishedAt = nowIso()\n helpers.reportToolCall(call.id, { results, isError: isToolError, isComplete: true })\n await ctx.storeToolCall(\n new ToolCall({\n id: call.id,\n tool: tool.name,\n args: call.args,\n checksum: computeChecksum(tool.name, call.args),\n isComplete: true,\n isError: isToolError,\n results,\n createdAt: finishedAt,\n updatedAt: finishedAt,\n completedAt: finishedAt,\n })\n )\n }\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"adapter.cjs","names":["#baseline"],"sources":["../../../../src/batteries/llm/gemini_generate_content/adapter.ts"],"sourcesContent":["/**\n * Cross-environment executor adapter for Google's native Gemini `generateContent` endpoint.\n *\n * @module @nhtio/adk/batteries/llm/gemini_generate_content/adapter\n *\n * @remarks\n * Targets `POST {baseURL}/models/{model}:generateContent` (and `:streamGenerateContent` when\n * `stream` is set) — Gemini's OWN wire format, not an OpenAI-compatible façade in front of it.\n *\n * That distinction is the reason this battery exists. Pointing `openai_chat_completions` at a\n * Gemini-compatible gateway means some translator, not the ADK, decides how your primitives become\n * `contents[]` — including whether a `thoughtSignature` is stamped, whether consecutive same-role\n * turns get merged, and how a tool result is correlated to its call. For ordinary use that is fine.\n * For anything that needs to reason about what the VENDOR actually received — an ordering guard, a\n * wire-shape audit, a bug report against Google — the translation has to be ours and observable.\n * See the validation battery's \"Which API surface a rule applies to\" guide.\n *\n * Options layer exactly as the other batteries: constructor baseline → `executor()` overrides →\n * per-iteration `ctx.stash.geminiGenerateContent`, re-validated each iteration.\n */\n\nimport { DateTime } from 'luxon'\nimport { sha256 } from 'js-sha256'\nimport { v6 as uuidv6 } from 'uuid'\nimport { validateOptions } from './validation'\nimport { normalizeToolName } from '../chat_common/helpers'\nimport { isError, isObject, isInstanceOf } from '@nhtio/adk/guards'\nimport { resolveToolCallParser } from '../chat_common/tool_parsers'\nimport { canonicalStringify } from '../../../lib/utils/canonical_json'\nimport { ArtifactTool, Media, Message, Thought, Tokenizable, ToolCall } from '@nhtio/adk/common'\nimport {\n DEFAULT_GEMINI_BUCKET_ORDER,\n buildGeminiRequest,\n extractGeminiGeneration,\n mediaToGeminiInlineData,\n renderGeminiToolResult,\n toolsToGeminiTools,\n} from './helpers'\nimport {\n E_GEMINI_GENERATE_CONTENT_CONTEXT_OVERFLOW,\n E_INVALID_GEMINI_GENERATE_CONTENT_OPTIONS,\n E_GEMINI_INVALID_TOOL_CALL_ARGS,\n E_GEMINI_MISSING_THOUGHT_SIGNATURE,\n E_GEMINI_REQUEST_FAILED,\n E_GEMINI_STREAM_ERROR,\n} from './exceptions'\nimport {\n descriptionToChatCompletionsJsonSchema,\n filterThoughts,\n renderChatCompletionsSystemPrompt,\n renderFirstPartyRetrievables,\n renderMemories,\n renderRetrievableSafetyDirective,\n renderRetrievables,\n renderStandingInstructions,\n renderThirdPartyPrivateRetrievables,\n renderThirdPartyPublicRetrievables,\n renderThought,\n renderTrustedContent,\n renderUntrustedContent,\n} from '../chat_common/helpers'\nimport type { DispatchContext } from '@nhtio/adk/types'\nimport type { Memory, SpooledArtifact, Tool } from '@nhtio/adk/common'\nimport type { TokenEncoding, TokenEncodingId } from '@nhtio/adk/types'\nimport type { DispatchExecutorFn, DispatchExecutorHelpers } from '@nhtio/adk/types'\nimport type {\n GeminiGenerateContentAdapterOptions,\n GeminiGenerateContentHelpers,\n GeminiGenerateContentResponse,\n} from './types'\n\nconst nowIso = (): string => DateTime.now().toISO() ?? new Date().toISOString()\n\nconst DEFAULT_BASE_URL = 'https://generativelanguage.googleapis.com/v1beta'\n/**\n * Google's documented portable sentinel for replaying tool history that did not originate from a\n * Gemini reasoning session. See the option's TSDoc for why this is the default.\n */\nconst DEFAULT_SENTINEL = 'skip_thought_signature_validator'\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\nconst computeChecksum = (tool: string, args: Record<string, unknown>): string =>\n sha256(`${tool}:${canonicalStringify(args)}`)\n\n/** Merge the three option layers, later winning. */\nconst mergeOptions = (\n ...layers: Array<Partial<GeminiGenerateContentAdapterOptions> | undefined>\n): Partial<GeminiGenerateContentAdapterOptions> => {\n const out: Record<string, unknown> = {}\n for (const layer of layers) {\n if (!layer) continue\n for (const [k, v] of Object.entries(layer)) if (v !== undefined) out[k] = v\n }\n return out as Partial<GeminiGenerateContentAdapterOptions>\n}\n\n/** Fill every injectable helper, preferring the caller's override. */\nconst resolveHelpers = (\n overrides: Partial<GeminiGenerateContentHelpers> | undefined\n): GeminiGenerateContentHelpers => {\n const src = (overrides ?? {}) as Record<string, unknown>\n const pick = <T>(key: string, fallback: T): T => (src[key] as T | undefined) ?? fallback\n return {\n descriptionToChatCompletionsJsonSchema: pick(\n 'descriptionToChatCompletionsJsonSchema',\n descriptionToChatCompletionsJsonSchema\n ),\n renderUntrustedContent: pick('renderUntrustedContent', renderUntrustedContent),\n renderTrustedContent: pick('renderTrustedContent', renderTrustedContent),\n renderStandingInstructions: pick('renderStandingInstructions', renderStandingInstructions),\n renderMemories: pick('renderMemories', renderMemories),\n renderRetrievables: pick('renderRetrievables', renderRetrievables),\n renderRetrievableSafetyDirective: pick(\n 'renderRetrievableSafetyDirective',\n renderRetrievableSafetyDirective\n ),\n renderFirstPartyRetrievables: pick(\n 'renderFirstPartyRetrievables',\n renderFirstPartyRetrievables\n ),\n renderThirdPartyPublicRetrievables: pick(\n 'renderThirdPartyPublicRetrievables',\n renderThirdPartyPublicRetrievables\n ),\n renderThirdPartyPrivateRetrievables: pick(\n 'renderThirdPartyPrivateRetrievables',\n renderThirdPartyPrivateRetrievables\n ),\n renderThought: pick('renderThought', renderThought),\n filterThoughts: pick('filterThoughts', filterThoughts),\n renderChatCompletionsSystemPrompt: pick(\n 'renderChatCompletionsSystemPrompt',\n renderChatCompletionsSystemPrompt\n ),\n toolsToGeminiTools: pick('toolsToGeminiTools', toolsToGeminiTools),\n renderGeminiToolResult: pick('renderGeminiToolResult', renderGeminiToolResult),\n buildGeminiRequest: pick('buildGeminiRequest', buildGeminiRequest),\n } as GeminiGenerateContentHelpers\n}\n\n/**\n * Native Gemini `generateContent` executor adapter.\n *\n * @example\n * ```ts\n * const adapter = new GeminiGenerateContentAdapter({\n * model: 'gemini-2.5-flash-lite',\n * apiKey: process.env.GEMINI_API_KEY,\n * })\n * const runner = new TurnRunner({ executorCallback: adapter.executor(), ... })\n * ```\n */\nexport class GeminiGenerateContentAdapter {\n /** Per-iteration override key on `ctx.stash`. */\n public static readonly STASH_KEY = 'geminiGenerateContent' as const\n\n readonly #baseline: GeminiGenerateContentAdapterOptions\n\n /**\n * @param options - Constructor-baseline options, re-validated每 iteration after overrides merge.\n * @throws {@link E_INVALID_GEMINI_GENERATE_CONTENT_OPTIONS} when `options` is invalid.\n */\n constructor(options: unknown) {\n this.#baseline = validateOptions(options)\n }\n\n /** Narrowing guard for cross-realm instances. */\n public static isGeminiGenerateContentAdapter(\n value: unknown\n ): value is GeminiGenerateContentAdapter {\n return isInstanceOf(value, 'GeminiGenerateContentAdapter', GeminiGenerateContentAdapter)\n }\n\n /**\n * Build a {@link DispatchExecutorFn} bound to the baseline plus optional executor-scope overrides.\n *\n * @param overrides - Higher precedence than the baseline, lower than `ctx.stash`.\n */\n executor(overrides?: Partial<GeminiGenerateContentAdapterOptions>): DispatchExecutorFn {\n const baseline = this.#baseline\n const adapterClass = GeminiGenerateContentAdapter\n return async (ctx: DispatchContext, helpers: DispatchExecutorHelpers): Promise<void> => {\n const warn = (message: string): void => {\n helpers.log.warn({ kind: 'helper-warning', message })\n }\n\n // ── merge & validate ────────────────────────────────────────────────\n const stashRaw = ctx.stash.get(adapterClass.STASH_KEY, {}) as unknown\n const stashOverrides = isObject(stashRaw)\n ? (stashRaw as Partial<GeminiGenerateContentAdapterOptions>)\n : {}\n const merged = validateOptions(mergeOptions(baseline, overrides, stashOverrides))\n if (\n merged.tokenEncoding !== undefined &&\n merged.tokenEncoding !== null &&\n merged.contextWindow === undefined\n ) {\n throw new E_INVALID_GEMINI_GENERATE_CONTENT_OPTIONS([\n 'tokenEncoding is non-null but contextWindow is undefined',\n ])\n }\n const resolved = resolveHelpers(merged.helpers)\n const selfIdentity = 'assistant'\n const dispatchStreamId = uuidv6()\n\n // ── pre-render tool results ─────────────────────────────────────────\n // Gemini wants an OBJECT in functionResponse.response, so results are rendered ahead of\n // assembly and keyed by the live ToolCall instance. Keying by id lets a duplicate id\n // overwrite an earlier result before assembly.\n const renderedToolCallResults = new Map<ToolCall, Record<string, unknown>>()\n for (const tc of ctx.turnToolCalls) {\n renderedToolCallResults.set(\n tc,\n await resolved.renderGeminiToolResult({\n toolCall: tc,\n results: tc.results as never,\n tool: ctx.tools.get(tc.tool) as Tool | ArtifactTool | undefined,\n renderUntrustedContent: resolved.renderUntrustedContent,\n renderTrustedContent: resolved.renderTrustedContent,\n unsupportedMediaPolicy: merged.unsupportedMediaPolicy ?? 'throw',\n warn,\n })\n )\n }\n\n // ── context window enforcement ───────────────────────────────────────\n if (\n merged.tokenEncoding !== undefined &&\n merged.tokenEncoding !== null &&\n merged.contextWindow !== undefined\n ) {\n const encoding = merged.tokenEncoding\n let total = await estimateTokensOf(ctx.systemPrompt, encoding)\n for (const value of ctx.standingInstructions)\n total += await estimateTokensOf(value, encoding)\n for (const memory of ctx.turnMemories as Set<Memory>) {\n total += await estimateTokensOf(memory.content, encoding)\n }\n for (const retrievable of ctx.turnRetrievables) {\n total += await estimateTokensOf(\n retrievable.inline\n ? (retrievable.content as any)\n : new Tokenizable(`[Reference available: ${retrievable.id}]`),\n encoding\n )\n }\n for (const message of ctx.turnMessages) {\n if (message.content !== undefined)\n total += await estimateTokensOf(message.content, encoding)\n }\n for (const thought of ctx.turnThoughts)\n total += await estimateTokensOf(thought.content, encoding)\n for (const result of renderedToolCallResults.values()) {\n total += await estimateTokensOf(new Tokenizable(JSON.stringify(result)), encoding)\n }\n const tools = ctx.tools.visible()\n // Tool DECLARATIONS: the Gemini wire ships tools as an array, which the PROVIDER\n // serializes server-side into the model's own format. Tally the tokens of the wire\n // tools JSON (`JSON.stringify`) as an honest FLOOR — a truthful lower bound. We add\n // a highly conservative 50% margin to cover JSON structural overhead and nested formatting.\n if (tools.length > 0) {\n const toolTokens = await estimateTokensOf(\n new Tokenizable(JSON.stringify(resolved.toolsToGeminiTools(tools))),\n encoding\n )\n total += Math.ceil(toolTokens * 1.5)\n }\n if (total + (merged.maxOutputTokens ?? 0) > merged.contextWindow) {\n throw new E_GEMINI_GENERATE_CONTENT_CONTEXT_OVERFLOW([\n total + (merged.maxOutputTokens ?? 0),\n merged.contextWindow,\n encoding,\n ])\n }\n }\n\n // ── assemble ────────────────────────────────────────────────────────\n const request = await resolved.buildGeminiRequest({\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 ?? (DEFAULT_GEMINI_BUCKET_ORDER as never),\n selfIdentity,\n thoughtSurfacing: merged.thoughtSurfacing ?? 'all-self',\n replayCompatibility: [],\n thoughtSignatureSentinel:\n merged.thoughtSignatureSentinel === undefined\n ? DEFAULT_SENTINEL\n : merged.thoughtSignatureSentinel,\n helpers: resolved,\n decodeMedia: mediaToGeminiInlineData,\n unsupportedMediaPolicy: merged.unsupportedMediaPolicy,\n warn,\n })\n\n const generationConfig = {\n ...(merged.maxOutputTokens !== undefined\n ? { maxOutputTokens: merged.maxOutputTokens }\n : {}),\n ...(merged.temperature !== undefined ? { temperature: merged.temperature } : {}),\n ...(merged.topP !== undefined ? { topP: merged.topP } : {}),\n ...(merged.topK !== undefined ? { topK: merged.topK } : {}),\n ...(merged.stopSequences ? { stopSequences: merged.stopSequences } : {}),\n ...(merged.thinkingConfig ? { thinkingConfig: merged.thinkingConfig } : {}),\n }\n const body = {\n ...request,\n ...(Object.keys(generationConfig).length > 0 ? { generationConfig } : {}),\n ...(merged.toolConfig ? { toolConfig: merged.toolConfig } : {}),\n ...(merged.safetySettings ? { safetySettings: merged.safetySettings } : {}),\n }\n\n // Prompt-assembled tap: the EXACT body about to be POSTed. An ADK-control key — stripped\n // from the wire request, never sent. Observer errors are swallowed so a tap can never\n // corrupt a generation.\n if (merged.onPromptAssembled) {\n try {\n merged.onPromptAssembled({\n battery: 'gemini_generate_content',\n kind: 'request-body',\n messages: body.contents,\n tools: body.tools,\n requestBody: body,\n streamed: merged.stream === true,\n streamId: dispatchStreamId,\n })\n } catch {\n /* observer errors are non-fatal */\n }\n }\n\n // ── dispatch ────────────────────────────────────────────────────────\n const base = (merged.baseURL ?? DEFAULT_BASE_URL).replace(/\\/$/, '')\n const action = merged.stream === true ? 'streamGenerateContent' : 'generateContent'\n const url = `${base}/models/${merged.model}:${action}`\n const headers: Record<string, string> = { 'Content-Type': 'application/json' }\n if (merged.apiKey) {\n // Google's own endpoint wants x-goog-api-key; several gateways in front of it accept only\n // Authorization, hence the switch rather than sending both.\n if (merged.useBearerAuth === true) headers.Authorization = `Bearer ${merged.apiKey}`\n else headers['x-goog-api-key'] = merged.apiKey\n }\n\n const doFetch = merged.fetch ?? globalThis.fetch\n let parsed: GeminiGenerateContentResponse\n try {\n const res = await doFetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: merged.timeoutMs ? AbortSignal.timeout(merged.timeoutMs) : ctx.abortSignal,\n })\n const text = await res.text()\n if (!res.ok) {\n // Classify the vendor's own signature rejection separately — it is actionable, and\n // Gemini's generic INVALID_ARGUMENT body gives a caller nothing to act on.\n if (/thought_signature|thoughtSignature/i.test(text)) {\n ctx.nack(new E_GEMINI_MISSING_THOUGHT_SIGNATURE([text.slice(0, 400)]))\n return\n }\n ctx.nack(new E_GEMINI_REQUEST_FAILED([res.status, text.slice(0, 400)]))\n return\n }\n parsed = JSON.parse(text) as GeminiGenerateContentResponse\n } catch (err) {\n ctx.nack(new E_GEMINI_STREAM_ERROR([isError(err) ? err.message : String(err)]))\n return\n }\n\n // ── interpret ───────────────────────────────────────────────────────\n const { text, reasoning, functionCalls, finishReason } = extractGeminiGeneration(parsed)\n const responseId = uuidv6()\n\n if (text.length > 0) {\n const messageId = `${responseId}:message`\n helpers.reportMessage(messageId, text, { isComplete: true })\n await ctx.storeMessage(\n new Message({\n id: messageId,\n role: 'assistant',\n content: text,\n identity: selfIdentity,\n createdAt: nowIso(),\n updatedAt: nowIso(),\n })\n )\n }\n if (reasoning.length > 0) {\n const thoughtId = `${responseId}:thought`\n helpers.reportThought(thoughtId, reasoning, { isComplete: true })\n await ctx.storeThought(\n new Thought({\n id: thoughtId,\n content: reasoning,\n identity: selfIdentity,\n createdAt: nowIso(),\n updatedAt: nowIso(),\n })\n )\n }\n\n // Fallback recovery: only consulted when the provider returned NO structured calls, so a\n // native functionCall always wins over a parsed one.\n let calls = functionCalls.map((c) => ({ id: uuidv6(), name: c.name, args: c.args }))\n if (calls.length === 0 && merged.localToolCallParser !== undefined && text.length > 0) {\n const parser = resolveToolCallParser(merged.localToolCallParser)\n // The parser returns { calls, cleanedText } — not an iterable of calls — and the\n // second argument carries the tool names actually offered this turn so a parser can\n // reject a hallucinated name rather than manufacture a call for it.\n const recovered = parser(text, { toolNames: ctx.tools.all().map((t) => t.name) })\n for (const call of recovered.calls) {\n calls.push({\n id: uuidv6(),\n name: call.name,\n args: (call.arguments ?? {}) as Record<string, unknown>,\n })\n }\n }\n\n if (merged.onRawGeneration) {\n try {\n merged.onRawGeneration({\n rawText: text,\n cleanedText: text,\n reasoning: reasoning.length > 0 ? [reasoning] : [],\n toolCalls: calls.map((c) => ({ name: c.name, arguments: c.args as never })),\n streamed: merged.stream === true,\n streamId: dispatchStreamId,\n })\n } catch {\n /* observer errors are non-fatal */\n }\n }\n\n if (calls.length === 0) {\n // `finishReason` is recorded for the caller; an empty generation is NOT an error here —\n // it is a real vendor outcome and the runner decides what to do with it.\n helpers.log.trace({\n kind: 'gemini-finish',\n message: `generation ended with finishReason=${finishReason ?? 'unknown'} and no function calls`,\n payload: { finishReason: finishReason ?? 'unknown' },\n })\n if (merged.autoAck) ctx.ack()\n return\n }\n\n for (const call of calls) {\n if (ctx.abortSignal.aborted) return\n const toolName = normalizeToolName(call.name)\n const tool = ctx.tools.get(toolName) as Tool | ArtifactTool | undefined\n const completedAt = nowIso()\n\n if (!isObject(call.args)) {\n const results = new Tokenizable(\n new E_GEMINI_INVALID_TOOL_CALL_ARGS([JSON.stringify(call.args)]).message\n )\n helpers.reportToolCall(call.id, { tool: toolName, args: {} })\n helpers.reportToolCall(call.id, { results, isError: true, isComplete: true })\n await ctx.storeToolCall(\n new ToolCall({\n id: call.id,\n tool: toolName,\n args: {},\n checksum: computeChecksum(toolName, {}),\n isComplete: true,\n isError: true,\n results,\n createdAt: completedAt,\n updatedAt: completedAt,\n completedAt,\n })\n )\n continue\n }\n\n if (!tool) {\n const available = ctx.tools\n .all()\n .map((t) => t.name)\n .sort()\n const results = new Tokenizable(\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 )\n helpers.reportToolCall(call.id, { tool: toolName, args: call.args })\n helpers.reportToolCall(call.id, { results, isError: true, isComplete: true })\n await ctx.storeToolCall(\n new ToolCall({\n id: call.id,\n tool: toolName,\n args: call.args,\n checksum: computeChecksum(toolName, call.args),\n isComplete: true,\n isError: true,\n results,\n createdAt: completedAt,\n updatedAt: completedAt,\n completedAt,\n })\n )\n continue\n }\n\n helpers.reportToolCall(call.id, { tool: tool.name, args: call.args })\n let results: Tokenizable | SpooledArtifact | SpooledArtifact[] | Media | Media[] =\n new Tokenizable('')\n let isToolError = false\n try {\n const raw = await tool.executor(ctx)(call.args)\n results = Tokenizable.isTokenizable(raw)\n ? raw\n : new Tokenizable(typeof raw === 'string' ? raw : JSON.stringify(raw ?? ''))\n } catch (err) {\n isToolError = true\n results = new Tokenizable(isError(err) ? err.message : String(err))\n }\n const finishedAt = nowIso()\n helpers.reportToolCall(call.id, { results, isError: isToolError, isComplete: true })\n await ctx.storeToolCall(\n new ToolCall({\n id: call.id,\n tool: tool.name,\n args: call.args,\n checksum: computeChecksum(tool.name, call.args),\n isComplete: true,\n isError: isToolError,\n results,\n createdAt: finishedAt,\n updatedAt: finishedAt,\n completedAt: finishedAt,\n })\n )\n }\n }\n }\n}\n"],"mappings":"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"}
@@ -1,13 +1,13 @@
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 { h as canonicalStringify } from "../../../spooled_artifact-BkueYJhR.mjs";
4
- import { n as Message, t as Thought } from "../../../thought-B8JAi3-W.mjs";
5
- import { t as ToolCall } from "../../../tool_call-CPjyvkm4.mjs";
6
- import "../../../common-v9Jo9M5k.mjs";
2
+ import { r as Tokenizable } from "../../../tokenizable-VB4Av8GF.mjs";
3
+ import { h as canonicalStringify } from "../../../spooled_artifact-Bw_7swIp.mjs";
4
+ import { n as Message, t as Thought } from "../../../thought-BE1KGEhV.mjs";
5
+ import { t as ToolCall } from "../../../tool_call-Cfaj-6zK.mjs";
6
+ import "../../../common-BpdHIpQE.mjs";
7
7
  import "../../../guards.mjs";
8
8
  import { O as resolveToolCallParser } from "../../../tool_parsers-DgZhgxV8.mjs";
9
- import { A as renderMemories, E as normalizeToolName, F as renderThirdPartyPrivateRetrievables, I as renderThirdPartyPublicRetrievables, L as renderThought, M as renderRetrievableSafetyDirective, N as renderRetrievables, O as renderChatCompletionsSystemPrompt, P as renderStandingInstructions, R as renderTrustedContent, k as renderFirstPartyRetrievables, x as filterThoughts, y as descriptionToChatCompletionsJsonSchema, z as renderUntrustedContent } from "../../../helpers-CDmLDBq5.mjs";
10
- import { E_GEMINI_INVALID_TOOL_CALL_ARGS, E_GEMINI_MISSING_THOUGHT_SIGNATURE, E_GEMINI_REQUEST_FAILED, E_GEMINI_STREAM_ERROR } from "./exceptions.mjs";
9
+ import { A as renderMemories, E as normalizeToolName, F as renderThirdPartyPrivateRetrievables, I as renderThirdPartyPublicRetrievables, L as renderThought, M as renderRetrievableSafetyDirective, N as renderRetrievables, O as renderChatCompletionsSystemPrompt, P as renderStandingInstructions, R as renderTrustedContent, k as renderFirstPartyRetrievables, x as filterThoughts, y as descriptionToChatCompletionsJsonSchema, z as renderUntrustedContent } from "../../../helpers-BH7HTtkD.mjs";
10
+ import { E_GEMINI_GENERATE_CONTENT_CONTEXT_OVERFLOW, E_GEMINI_INVALID_TOOL_CALL_ARGS, E_GEMINI_MISSING_THOUGHT_SIGNATURE, E_GEMINI_REQUEST_FAILED, E_GEMINI_STREAM_ERROR, E_INVALID_GEMINI_GENERATE_CONTENT_OPTIONS } from "./exceptions.mjs";
11
11
  import { validateOptions } from "./validation.mjs";
12
12
  import { DEFAULT_GEMINI_BUCKET_ORDER, buildGeminiRequest, extractGeminiGeneration, mediaToGeminiInlineData, renderGeminiToolResult, toolsToGeminiTools } from "./helpers.mjs";
13
13
  import { DateTime } from "luxon";
@@ -41,6 +41,7 @@ var DEFAULT_BASE_URL = "https://generativelanguage.googleapis.com/v1beta";
41
41
  * Gemini reasoning session. See the option's TSDoc for why this is the default.
42
42
  */
43
43
  var DEFAULT_SENTINEL = "skip_thought_signature_validator";
44
+ var estimateTokensOf = async (value, encoding) => Promise.resolve(value.estimateTokens(encoding));
44
45
  var computeChecksum = (tool, args) => sha256(`${tool}:${canonicalStringify(args)}`);
45
46
  /** Merge the three option layers, later winning. */
46
47
  var mergeOptions = (...layers) => {
@@ -118,6 +119,7 @@ var GeminiGenerateContentAdapter = class GeminiGenerateContentAdapter {
118
119
  };
119
120
  const stashRaw = ctx.stash.get(adapterClass.STASH_KEY, {});
120
121
  const merged = validateOptions(mergeOptions(baseline, overrides, isObject(stashRaw) ? stashRaw : {}));
122
+ if (merged.tokenEncoding !== void 0 && merged.tokenEncoding !== null && merged.contextWindow === void 0) throw new E_INVALID_GEMINI_GENERATE_CONTENT_OPTIONS(["tokenEncoding is non-null but contextWindow is undefined"]);
121
123
  const resolved = resolveHelpers(merged.helpers);
122
124
  const selfIdentity = "assistant";
123
125
  const dispatchStreamId = v6();
@@ -131,6 +133,26 @@ var GeminiGenerateContentAdapter = class GeminiGenerateContentAdapter {
131
133
  unsupportedMediaPolicy: merged.unsupportedMediaPolicy ?? "throw",
132
134
  warn
133
135
  }));
136
+ if (merged.tokenEncoding !== void 0 && merged.tokenEncoding !== null && merged.contextWindow !== void 0) {
137
+ const encoding = merged.tokenEncoding;
138
+ let total = await estimateTokensOf(ctx.systemPrompt, encoding);
139
+ for (const value of ctx.standingInstructions) total += await estimateTokensOf(value, encoding);
140
+ for (const memory of ctx.turnMemories) total += await estimateTokensOf(memory.content, encoding);
141
+ for (const retrievable of ctx.turnRetrievables) total += await estimateTokensOf(retrievable.inline ? retrievable.content : new Tokenizable(`[Reference available: ${retrievable.id}]`), encoding);
142
+ for (const message of ctx.turnMessages) if (message.content !== void 0) total += await estimateTokensOf(message.content, encoding);
143
+ for (const thought of ctx.turnThoughts) total += await estimateTokensOf(thought.content, encoding);
144
+ for (const result of renderedToolCallResults.values()) total += await estimateTokensOf(new Tokenizable(JSON.stringify(result)), encoding);
145
+ const tools = ctx.tools.visible();
146
+ if (tools.length > 0) {
147
+ const toolTokens = await estimateTokensOf(new Tokenizable(JSON.stringify(resolved.toolsToGeminiTools(tools))), encoding);
148
+ total += Math.ceil(toolTokens * 1.5);
149
+ }
150
+ if (total + (merged.maxOutputTokens ?? 0) > merged.contextWindow) throw new E_GEMINI_GENERATE_CONTENT_CONTEXT_OVERFLOW([
151
+ total + (merged.maxOutputTokens ?? 0),
152
+ merged.contextWindow,
153
+ encoding
154
+ ]);
155
+ }
134
156
  const request = await resolved.buildGeminiRequest({
135
157
  systemPrompt: ctx.systemPrompt,
136
158
  standingInstructions: ctx.standingInstructions,
@@ -262,7 +284,7 @@ var GeminiGenerateContentAdapter = class GeminiGenerateContentAdapter {
262
284
  message: `generation ended with finishReason=${finishReason ?? "unknown"} and no function calls`,
263
285
  payload: { finishReason: finishReason ?? "unknown" }
264
286
  });
265
- ctx.ack();
287
+ if (merged.autoAck) ctx.ack();
266
288
  return;
267
289
  }
268
290
  for (const call of calls) {