@nhtio/adk 1.20260607.2 → 1.20260609.1

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 (521) hide show
  1. package/CHANGELOG.md +230 -0
  2. package/batteries/embeddings/openai/adapter.cjs +1 -1
  3. package/batteries/embeddings/openai/adapter.mjs +1 -1
  4. package/batteries/embeddings/openai/exceptions.cjs +1 -1
  5. package/batteries/embeddings/openai/exceptions.mjs +1 -1
  6. package/batteries/embeddings/openai/types.d.ts +7 -0
  7. package/batteries/embeddings/webllm/adapter.cjs +1 -1
  8. package/batteries/embeddings/webllm/adapter.mjs +1 -1
  9. package/batteries/embeddings/webllm/exceptions.cjs +1 -1
  10. package/batteries/embeddings/webllm/exceptions.mjs +1 -1
  11. package/batteries/llm/chat_common/helpers.d.ts +165 -0
  12. package/batteries/llm/chat_common/types.d.ts +309 -0
  13. package/batteries/llm/index.d.ts +5 -0
  14. package/batteries/llm/ollama/adapter.cjs +736 -0
  15. package/batteries/llm/ollama/adapter.cjs.map +1 -0
  16. package/batteries/llm/ollama/adapter.d.ts +64 -0
  17. package/batteries/llm/ollama/adapter.mjs +734 -0
  18. package/batteries/llm/ollama/adapter.mjs.map +1 -0
  19. package/batteries/llm/ollama/exceptions.cjs +105 -0
  20. package/batteries/llm/ollama/exceptions.cjs.map +1 -0
  21. package/batteries/llm/ollama/exceptions.d.ts +112 -0
  22. package/batteries/llm/ollama/exceptions.mjs +96 -0
  23. package/batteries/llm/ollama/exceptions.mjs.map +1 -0
  24. package/batteries/llm/ollama/helpers.cjs +487 -0
  25. package/batteries/llm/ollama/helpers.cjs.map +1 -0
  26. package/batteries/llm/ollama/helpers.d.ts +158 -0
  27. package/batteries/llm/ollama/helpers.mjs +450 -0
  28. package/batteries/llm/ollama/helpers.mjs.map +1 -0
  29. package/batteries/llm/ollama/index.d.ts +29 -0
  30. package/batteries/llm/ollama/types.cjs +2 -0
  31. package/batteries/llm/ollama/types.d.ts +334 -0
  32. package/batteries/llm/ollama/types.mjs +0 -0
  33. package/batteries/llm/ollama/validation.cjs +130 -0
  34. package/batteries/llm/ollama/validation.cjs.map +1 -0
  35. package/batteries/llm/ollama/validation.d.ts +31 -0
  36. package/batteries/llm/ollama/validation.mjs +127 -0
  37. package/batteries/llm/ollama/validation.mjs.map +1 -0
  38. package/batteries/llm/ollama.cjs +54 -0
  39. package/batteries/llm/ollama.mjs +6 -0
  40. package/batteries/llm/openai_chat_completions/adapter.cjs +36 -19
  41. package/batteries/llm/openai_chat_completions/adapter.cjs.map +1 -1
  42. package/batteries/llm/openai_chat_completions/adapter.mjs +23 -6
  43. package/batteries/llm/openai_chat_completions/adapter.mjs.map +1 -1
  44. package/batteries/llm/openai_chat_completions/exceptions.cjs +1 -1
  45. package/batteries/llm/openai_chat_completions/exceptions.mjs +1 -1
  46. package/batteries/llm/openai_chat_completions/helpers.cjs +80 -320
  47. package/batteries/llm/openai_chat_completions/helpers.cjs.map +1 -1
  48. package/batteries/llm/openai_chat_completions/helpers.d.ts +68 -144
  49. package/batteries/llm/openai_chat_completions/helpers.mjs +40 -280
  50. package/batteries/llm/openai_chat_completions/helpers.mjs.map +1 -1
  51. package/batteries/llm/openai_chat_completions/types.d.ts +273 -181
  52. package/batteries/llm/openai_chat_completions/validation.cjs +2 -2
  53. package/batteries/llm/openai_chat_completions/validation.cjs.map +1 -1
  54. package/batteries/llm/openai_chat_completions/validation.mjs +2 -2
  55. package/batteries/llm/openai_chat_completions/validation.mjs.map +1 -1
  56. package/batteries/llm/openai_chat_completions.cjs +29 -28
  57. package/batteries/llm/openai_chat_completions.mjs +2 -1
  58. package/batteries/llm/webllm_chat_completions/adapter.cjs +38 -19
  59. package/batteries/llm/webllm_chat_completions/adapter.cjs.map +1 -1
  60. package/batteries/llm/webllm_chat_completions/adapter.d.ts +18 -0
  61. package/batteries/llm/webllm_chat_completions/adapter.mjs +25 -6
  62. package/batteries/llm/webllm_chat_completions/adapter.mjs.map +1 -1
  63. package/batteries/llm/webllm_chat_completions/exceptions.cjs +1 -1
  64. package/batteries/llm/webllm_chat_completions/exceptions.mjs +1 -1
  65. package/batteries/llm/webllm_chat_completions/helpers.cjs +29 -28
  66. package/batteries/llm/webllm_chat_completions/helpers.mjs +2 -1
  67. package/batteries/llm/webllm_chat_completions/types.d.ts +21 -0
  68. package/batteries/llm/webllm_chat_completions/validation.cjs +13 -1
  69. package/batteries/llm/webllm_chat_completions/validation.cjs.map +1 -1
  70. package/batteries/llm/webllm_chat_completions/validation.d.ts +12 -0
  71. package/batteries/llm/webllm_chat_completions/validation.mjs +13 -1
  72. package/batteries/llm/webllm_chat_completions/validation.mjs.map +1 -1
  73. package/batteries/llm/webllm_chat_completions.cjs +29 -28
  74. package/batteries/llm/webllm_chat_completions.mjs +2 -1
  75. package/batteries/llm.cjs +44 -28
  76. package/batteries/llm.mjs +9 -4
  77. package/batteries/storage/flydrive.cjs +1 -1
  78. package/batteries/storage/flydrive.mjs +1 -1
  79. package/batteries/storage/in_memory/index.d.ts +1 -1
  80. package/batteries/storage/in_memory.cjs +2 -2
  81. package/batteries/storage/in_memory.cjs.map +1 -1
  82. package/batteries/storage/in_memory.mjs +2 -2
  83. package/batteries/storage/in_memory.mjs.map +1 -1
  84. package/batteries/storage/opfs/index.d.ts +19 -0
  85. package/batteries/storage/opfs.cjs +1 -1
  86. package/batteries/storage/opfs.cjs.map +1 -1
  87. package/batteries/storage/opfs.mjs +1 -1
  88. package/batteries/storage/opfs.mjs.map +1 -1
  89. package/batteries/tools/_shared/index.d.ts +121 -0
  90. package/batteries/tools/_shared.cjs +157 -0
  91. package/batteries/tools/_shared.cjs.map +1 -0
  92. package/batteries/tools/_shared.mjs +149 -0
  93. package/batteries/tools/_shared.mjs.map +1 -0
  94. package/batteries/tools/color.cjs +3 -2
  95. package/batteries/tools/color.cjs.map +1 -1
  96. package/batteries/tools/color.mjs +3 -2
  97. package/batteries/tools/color.mjs.map +1 -1
  98. package/batteries/tools/comparison.cjs +4 -3
  99. package/batteries/tools/comparison.cjs.map +1 -1
  100. package/batteries/tools/comparison.mjs +4 -3
  101. package/batteries/tools/comparison.mjs.map +1 -1
  102. package/batteries/tools/data_structure.cjs +30 -10
  103. package/batteries/tools/data_structure.cjs.map +1 -1
  104. package/batteries/tools/data_structure.mjs +30 -10
  105. package/batteries/tools/data_structure.mjs.map +1 -1
  106. package/batteries/tools/datetime_extended.cjs +5 -10
  107. package/batteries/tools/datetime_extended.cjs.map +1 -1
  108. package/batteries/tools/datetime_extended.mjs +5 -10
  109. package/batteries/tools/datetime_extended.mjs.map +1 -1
  110. package/batteries/tools/datetime_math.cjs +2 -2
  111. package/batteries/tools/datetime_math.mjs +2 -2
  112. package/batteries/tools/encoding.cjs +13 -4
  113. package/batteries/tools/encoding.cjs.map +1 -1
  114. package/batteries/tools/encoding.mjs +13 -4
  115. package/batteries/tools/encoding.mjs.map +1 -1
  116. package/batteries/tools/formatting.cjs +4 -4
  117. package/batteries/tools/formatting.cjs.map +1 -1
  118. package/batteries/tools/formatting.mjs +4 -4
  119. package/batteries/tools/formatting.mjs.map +1 -1
  120. package/batteries/tools/geo_basics.cjs +2 -2
  121. package/batteries/tools/geo_basics.mjs +2 -2
  122. package/batteries/tools/index.d.ts +3 -0
  123. package/batteries/tools/math.cjs +10 -8
  124. package/batteries/tools/math.cjs.map +1 -1
  125. package/batteries/tools/math.mjs +10 -8
  126. package/batteries/tools/math.mjs.map +1 -1
  127. package/batteries/tools/memory.cjs +5 -5
  128. package/batteries/tools/memory.mjs +5 -5
  129. package/batteries/tools/parsing.cjs +9 -5
  130. package/batteries/tools/parsing.cjs.map +1 -1
  131. package/batteries/tools/parsing.mjs +9 -5
  132. package/batteries/tools/parsing.mjs.map +1 -1
  133. package/batteries/tools/retrievables.cjs +4 -4
  134. package/batteries/tools/retrievables.mjs +4 -4
  135. package/batteries/tools/scrapper/exceptions.d.ts +21 -0
  136. package/batteries/tools/scrapper/index.d.ts +172 -0
  137. package/batteries/tools/scrapper/shared.d.ts +139 -0
  138. package/batteries/tools/scrapper.cjs +8 -0
  139. package/batteries/tools/scrapper.mjs +2 -0
  140. package/batteries/tools/searxng/exceptions.d.ts +21 -0
  141. package/batteries/tools/searxng/index.d.ts +177 -0
  142. package/batteries/tools/searxng.cjs +6 -0
  143. package/batteries/tools/searxng.mjs +2 -0
  144. package/batteries/tools/standing_instructions.cjs +4 -4
  145. package/batteries/tools/standing_instructions.mjs +4 -4
  146. package/batteries/tools/statistics.cjs +54 -43
  147. package/batteries/tools/statistics.cjs.map +1 -1
  148. package/batteries/tools/statistics.mjs +54 -43
  149. package/batteries/tools/statistics.mjs.map +1 -1
  150. package/batteries/tools/string_processing.cjs +5 -5
  151. package/batteries/tools/string_processing.cjs.map +1 -1
  152. package/batteries/tools/string_processing.mjs +5 -5
  153. package/batteries/tools/string_processing.mjs.map +1 -1
  154. package/batteries/tools/structured_data.cjs +8 -13
  155. package/batteries/tools/structured_data.cjs.map +1 -1
  156. package/batteries/tools/structured_data.mjs +8 -13
  157. package/batteries/tools/structured_data.mjs.map +1 -1
  158. package/batteries/tools/text_analysis.cjs +3 -3
  159. package/batteries/tools/text_analysis.mjs +3 -3
  160. package/batteries/tools/text_comparison.cjs +2 -2
  161. package/batteries/tools/text_comparison.mjs +2 -2
  162. package/batteries/tools/time.cjs +2 -2
  163. package/batteries/tools/time.mjs +2 -2
  164. package/batteries/tools/unit_conversion.cjs +10 -8
  165. package/batteries/tools/unit_conversion.cjs.map +1 -1
  166. package/batteries/tools/unit_conversion.mjs +10 -8
  167. package/batteries/tools/unit_conversion.mjs.map +1 -1
  168. package/batteries/tools/web_retrieval/index.d.ts +186 -0
  169. package/batteries/tools/web_retrieval.cjs +206 -0
  170. package/batteries/tools/web_retrieval.cjs.map +1 -0
  171. package/batteries/tools/web_retrieval.mjs +201 -0
  172. package/batteries/tools/web_retrieval.mjs.map +1 -0
  173. package/batteries/tools.cjs +15 -0
  174. package/batteries/tools.mjs +4 -1
  175. package/batteries/vector/arangodb/index.d.ts +2 -0
  176. package/batteries/vector/arangodb.cjs +2 -1
  177. package/batteries/vector/arangodb.cjs.map +1 -1
  178. package/batteries/vector/arangodb.mjs +2 -1
  179. package/batteries/vector/arangodb.mjs.map +1 -1
  180. package/batteries/vector/builder.cjs +31 -0
  181. package/batteries/vector/builder.cjs.map +1 -1
  182. package/batteries/vector/builder.d.ts +58 -0
  183. package/batteries/vector/builder.mjs +31 -0
  184. package/batteries/vector/builder.mjs.map +1 -1
  185. package/batteries/vector/chroma/index.d.ts +4 -0
  186. package/batteries/vector/chroma.cjs +3 -0
  187. package/batteries/vector/chroma.cjs.map +1 -1
  188. package/batteries/vector/chroma.mjs +3 -0
  189. package/batteries/vector/chroma.mjs.map +1 -1
  190. package/batteries/vector/clickhouse/index.d.ts +2 -0
  191. package/batteries/vector/clickhouse.cjs +2 -1
  192. package/batteries/vector/clickhouse.cjs.map +1 -1
  193. package/batteries/vector/clickhouse.mjs +2 -1
  194. package/batteries/vector/clickhouse.mjs.map +1 -1
  195. package/batteries/vector/cloudflare/index.d.ts +2 -0
  196. package/batteries/vector/cloudflare.cjs +2 -1
  197. package/batteries/vector/cloudflare.cjs.map +1 -1
  198. package/batteries/vector/cloudflare.mjs +2 -1
  199. package/batteries/vector/cloudflare.mjs.map +1 -1
  200. package/batteries/vector/conformance/index.d.ts +22 -0
  201. package/batteries/vector/conformance.cjs +22 -0
  202. package/batteries/vector/conformance.cjs.map +1 -1
  203. package/batteries/vector/conformance.mjs +22 -0
  204. package/batteries/vector/conformance.mjs.map +1 -1
  205. package/batteries/vector/contract.cjs +22 -0
  206. package/batteries/vector/contract.cjs.map +1 -1
  207. package/batteries/vector/contract.d.ts +51 -0
  208. package/batteries/vector/contract.mjs +22 -0
  209. package/batteries/vector/contract.mjs.map +1 -1
  210. package/batteries/vector/couchbase/index.d.ts +2 -0
  211. package/batteries/vector/couchbase.cjs +2 -1
  212. package/batteries/vector/couchbase.cjs.map +1 -1
  213. package/batteries/vector/couchbase.mjs +2 -1
  214. package/batteries/vector/couchbase.mjs.map +1 -1
  215. package/batteries/vector/duckdb/index.d.ts +2 -0
  216. package/batteries/vector/duckdb.cjs +2 -1
  217. package/batteries/vector/duckdb.cjs.map +1 -1
  218. package/batteries/vector/duckdb.mjs +2 -1
  219. package/batteries/vector/duckdb.mjs.map +1 -1
  220. package/batteries/vector/elasticsearch/index.d.ts +2 -0
  221. package/batteries/vector/elasticsearch.cjs +2 -1
  222. package/batteries/vector/elasticsearch.cjs.map +1 -1
  223. package/batteries/vector/elasticsearch.mjs +2 -1
  224. package/batteries/vector/elasticsearch.mjs.map +1 -1
  225. package/batteries/vector/exceptions.cjs +1 -1
  226. package/batteries/vector/exceptions.mjs +1 -1
  227. package/batteries/vector/factory.cjs +6 -0
  228. package/batteries/vector/factory.cjs.map +1 -1
  229. package/batteries/vector/factory.d.ts +14 -0
  230. package/batteries/vector/factory.mjs +6 -0
  231. package/batteries/vector/factory.mjs.map +1 -1
  232. package/batteries/vector/filters.cjs +22 -1
  233. package/batteries/vector/filters.cjs.map +1 -1
  234. package/batteries/vector/filters.d.ts +38 -0
  235. package/batteries/vector/filters.mjs +22 -1
  236. package/batteries/vector/filters.mjs.map +1 -1
  237. package/batteries/vector/helpers.cjs +13 -0
  238. package/batteries/vector/helpers.cjs.map +1 -1
  239. package/batteries/vector/helpers.d.ts +14 -0
  240. package/batteries/vector/helpers.mjs +13 -0
  241. package/batteries/vector/helpers.mjs.map +1 -1
  242. package/batteries/vector/hnswlib/index.d.ts +2 -0
  243. package/batteries/vector/hnswlib.cjs +2 -1
  244. package/batteries/vector/hnswlib.cjs.map +1 -1
  245. package/batteries/vector/hnswlib.mjs +2 -1
  246. package/batteries/vector/hnswlib.mjs.map +1 -1
  247. package/batteries/vector/in_memory/index.d.ts +1 -0
  248. package/batteries/vector/in_memory.cjs +1 -0
  249. package/batteries/vector/in_memory.cjs.map +1 -1
  250. package/batteries/vector/in_memory.mjs +1 -0
  251. package/batteries/vector/in_memory.mjs.map +1 -1
  252. package/batteries/vector/lancedb/index.d.ts +2 -0
  253. package/batteries/vector/lancedb.cjs +2 -1
  254. package/batteries/vector/lancedb.cjs.map +1 -1
  255. package/batteries/vector/lancedb.mjs +2 -1
  256. package/batteries/vector/lancedb.mjs.map +1 -1
  257. package/batteries/vector/mariadb/index.d.ts +2 -0
  258. package/batteries/vector/mariadb.cjs +2 -1
  259. package/batteries/vector/mariadb.cjs.map +1 -1
  260. package/batteries/vector/mariadb.mjs +2 -1
  261. package/batteries/vector/mariadb.mjs.map +1 -1
  262. package/batteries/vector/meilisearch/index.d.ts +2 -0
  263. package/batteries/vector/meilisearch.cjs +2 -1
  264. package/batteries/vector/meilisearch.cjs.map +1 -1
  265. package/batteries/vector/meilisearch.mjs +2 -1
  266. package/batteries/vector/meilisearch.mjs.map +1 -1
  267. package/batteries/vector/migrate.cjs +18 -1
  268. package/batteries/vector/migrate.cjs.map +1 -1
  269. package/batteries/vector/migrate.d.ts +31 -0
  270. package/batteries/vector/migrate.mjs +18 -1
  271. package/batteries/vector/migrate.mjs.map +1 -1
  272. package/batteries/vector/milvus/index.d.ts +5 -0
  273. package/batteries/vector/milvus.cjs +4 -0
  274. package/batteries/vector/milvus.cjs.map +1 -1
  275. package/batteries/vector/milvus.mjs +4 -0
  276. package/batteries/vector/milvus.mjs.map +1 -1
  277. package/batteries/vector/mongodb/index.d.ts +2 -0
  278. package/batteries/vector/mongodb.cjs +2 -1
  279. package/batteries/vector/mongodb.cjs.map +1 -1
  280. package/batteries/vector/mongodb.mjs +2 -1
  281. package/batteries/vector/mongodb.mjs.map +1 -1
  282. package/batteries/vector/neo4j/index.d.ts +2 -0
  283. package/batteries/vector/neo4j.cjs +2 -1
  284. package/batteries/vector/neo4j.cjs.map +1 -1
  285. package/batteries/vector/neo4j.mjs +2 -1
  286. package/batteries/vector/neo4j.mjs.map +1 -1
  287. package/batteries/vector/opensearch/index.d.ts +2 -0
  288. package/batteries/vector/opensearch.cjs +2 -1
  289. package/batteries/vector/opensearch.cjs.map +1 -1
  290. package/batteries/vector/opensearch.mjs +2 -1
  291. package/batteries/vector/opensearch.mjs.map +1 -1
  292. package/batteries/vector/oracle23ai/index.d.ts +2 -0
  293. package/batteries/vector/oracle23ai.cjs +2 -1
  294. package/batteries/vector/oracle23ai.cjs.map +1 -1
  295. package/batteries/vector/oracle23ai.mjs +2 -1
  296. package/batteries/vector/oracle23ai.mjs.map +1 -1
  297. package/batteries/vector/orama/index.d.ts +1 -0
  298. package/batteries/vector/orama.cjs +1 -0
  299. package/batteries/vector/orama.cjs.map +1 -1
  300. package/batteries/vector/orama.mjs +1 -0
  301. package/batteries/vector/orama.mjs.map +1 -1
  302. package/batteries/vector/pgvector/index.d.ts +9 -2
  303. package/batteries/vector/pgvector.cjs +4 -0
  304. package/batteries/vector/pgvector.cjs.map +1 -1
  305. package/batteries/vector/pgvector.mjs +4 -0
  306. package/batteries/vector/pgvector.mjs.map +1 -1
  307. package/batteries/vector/pinecone/index.d.ts +5 -0
  308. package/batteries/vector/pinecone.cjs +3 -1
  309. package/batteries/vector/pinecone.cjs.map +1 -1
  310. package/batteries/vector/pinecone.mjs +3 -1
  311. package/batteries/vector/pinecone.mjs.map +1 -1
  312. package/batteries/vector/plan.d.ts +27 -0
  313. package/batteries/vector/qdrant/index.d.ts +5 -0
  314. package/batteries/vector/qdrant.cjs +4 -0
  315. package/batteries/vector/qdrant.cjs.map +1 -1
  316. package/batteries/vector/qdrant.mjs +4 -0
  317. package/batteries/vector/qdrant.mjs.map +1 -1
  318. package/batteries/vector/redis/index.d.ts +2 -0
  319. package/batteries/vector/redis.cjs +2 -1
  320. package/batteries/vector/redis.cjs.map +1 -1
  321. package/batteries/vector/redis.mjs +2 -1
  322. package/batteries/vector/redis.mjs.map +1 -1
  323. package/batteries/vector/retrievable.cjs +9 -1
  324. package/batteries/vector/retrievable.cjs.map +1 -1
  325. package/batteries/vector/retrievable.mjs +9 -1
  326. package/batteries/vector/retrievable.mjs.map +1 -1
  327. package/batteries/vector/retrievable_glue.d.ts +21 -0
  328. package/batteries/vector/s3vectors/index.d.ts +2 -0
  329. package/batteries/vector/s3vectors.cjs +2 -1
  330. package/batteries/vector/s3vectors.cjs.map +1 -1
  331. package/batteries/vector/s3vectors.mjs +2 -1
  332. package/batteries/vector/s3vectors.mjs.map +1 -1
  333. package/batteries/vector/schema.cjs +28 -0
  334. package/batteries/vector/schema.cjs.map +1 -1
  335. package/batteries/vector/schema.d.ts +39 -0
  336. package/batteries/vector/schema.mjs +28 -0
  337. package/batteries/vector/schema.mjs.map +1 -1
  338. package/batteries/vector/solr/index.d.ts +2 -0
  339. package/batteries/vector/solr.cjs +2 -1
  340. package/batteries/vector/solr.cjs.map +1 -1
  341. package/batteries/vector/solr.mjs +2 -1
  342. package/batteries/vector/solr.mjs.map +1 -1
  343. package/batteries/vector/sqlite_vec/index.d.ts +6 -3
  344. package/batteries/vector/sqlite_vec.cjs +2 -0
  345. package/batteries/vector/sqlite_vec.cjs.map +1 -1
  346. package/batteries/vector/sqlite_vec.mjs +2 -0
  347. package/batteries/vector/sqlite_vec.mjs.map +1 -1
  348. package/batteries/vector/surrealdb/index.d.ts +2 -0
  349. package/batteries/vector/surrealdb.cjs +2 -1
  350. package/batteries/vector/surrealdb.cjs.map +1 -1
  351. package/batteries/vector/surrealdb.mjs +2 -1
  352. package/batteries/vector/surrealdb.mjs.map +1 -1
  353. package/batteries/vector/types.d.ts +27 -0
  354. package/batteries/vector/typesense/index.d.ts +2 -0
  355. package/batteries/vector/typesense.cjs +2 -1
  356. package/batteries/vector/typesense.cjs.map +1 -1
  357. package/batteries/vector/typesense.mjs +2 -1
  358. package/batteries/vector/typesense.mjs.map +1 -1
  359. package/batteries/vector/validation.cjs +14 -0
  360. package/batteries/vector/validation.cjs.map +1 -1
  361. package/batteries/vector/validation.d.ts +14 -0
  362. package/batteries/vector/validation.mjs +14 -0
  363. package/batteries/vector/validation.mjs.map +1 -1
  364. package/batteries/vector/vector_store_constructor.cjs +1 -1
  365. package/batteries/vector/vector_store_constructor.cjs.map +1 -1
  366. package/batteries/vector/vector_store_constructor.d.ts +1 -1
  367. package/batteries/vector/vector_store_constructor.mjs +1 -1
  368. package/batteries/vector/vector_store_constructor.mjs.map +1 -1
  369. package/batteries/vector/vespa/index.d.ts +2 -0
  370. package/batteries/vector/vespa.cjs +2 -1
  371. package/batteries/vector/vespa.cjs.map +1 -1
  372. package/batteries/vector/vespa.mjs +2 -1
  373. package/batteries/vector/vespa.mjs.map +1 -1
  374. package/batteries/vector/weaviate/index.d.ts +2 -0
  375. package/batteries/vector/weaviate.cjs +2 -1
  376. package/batteries/vector/weaviate.cjs.map +1 -1
  377. package/batteries/vector/weaviate.mjs +2 -1
  378. package/batteries/vector/weaviate.mjs.map +1 -1
  379. package/batteries.cjs +58 -28
  380. package/batteries.mjs +12 -5
  381. package/{common-BT0nfCi9.mjs → common-DYDUi99O.mjs} +9 -9
  382. package/common-DYDUi99O.mjs.map +1 -0
  383. package/{common-Cj8TaQ9U.js → common-DZl3ADJs.js} +9 -9
  384. package/common-DZl3ADJs.js.map +1 -0
  385. package/common.cjs +7 -7
  386. package/common.mjs +7 -7
  387. package/{dispatch_runner-DPcS7Y_M.mjs → dispatch_runner--ZhdDWRZ.mjs} +27 -5
  388. package/{dispatch_runner-DPcS7Y_M.mjs.map → dispatch_runner--ZhdDWRZ.mjs.map} +1 -1
  389. package/{dispatch_runner-BHBNupqp.js → dispatch_runner-nHDKkxye.js} +27 -5
  390. package/{dispatch_runner-BHBNupqp.js.map → dispatch_runner-nHDKkxye.js.map} +1 -1
  391. package/dispatch_runner.cjs +1 -1
  392. package/dispatch_runner.d.ts +1 -1
  393. package/dispatch_runner.mjs +1 -1
  394. package/eslint/rules/artifact_tool_forbids_artifact_constructor.cjs +1 -0
  395. package/eslint/rules/artifact_tool_forbids_artifact_constructor.cjs.map +1 -1
  396. package/eslint/rules/artifact_tool_forbids_artifact_constructor.d.ts +1 -0
  397. package/eslint/rules/artifact_tool_forbids_artifact_constructor.mjs +1 -0
  398. package/eslint/rules/artifact_tool_forbids_artifact_constructor.mjs.map +1 -1
  399. package/eslint/rules/no_model_in_tool_handler.cjs +1 -0
  400. package/eslint/rules/no_model_in_tool_handler.cjs.map +1 -1
  401. package/eslint/rules/no_model_in_tool_handler.d.ts +1 -0
  402. package/eslint/rules/no_model_in_tool_handler.mjs +1 -0
  403. package/eslint/rules/no_model_in_tool_handler.mjs.map +1 -1
  404. package/eslint/rules/require_validator_any_required.cjs +1 -0
  405. package/eslint/rules/require_validator_any_required.cjs.map +1 -1
  406. package/eslint/rules/require_validator_any_required.d.ts +1 -0
  407. package/eslint/rules/require_validator_any_required.mjs +1 -0
  408. package/eslint/rules/require_validator_any_required.mjs.map +1 -1
  409. package/eslint/rules/thought_payload_requires_replay_tag.cjs +1 -0
  410. package/eslint/rules/thought_payload_requires_replay_tag.cjs.map +1 -1
  411. package/eslint/rules/thought_payload_requires_replay_tag.d.ts +1 -0
  412. package/eslint/rules/thought_payload_requires_replay_tag.mjs +1 -0
  413. package/eslint/rules/thought_payload_requires_replay_tag.mjs.map +1 -1
  414. package/eslint/rules/token_encoding_requires_context_window.cjs +1 -0
  415. package/eslint/rules/token_encoding_requires_context_window.cjs.map +1 -1
  416. package/eslint/rules/token_encoding_requires_context_window.d.ts +1 -0
  417. package/eslint/rules/token_encoding_requires_context_window.mjs +1 -0
  418. package/eslint/rules/token_encoding_requires_context_window.mjs.map +1 -1
  419. package/eslint/rules.cjs +1 -1
  420. package/eslint/rules.mjs +1 -1
  421. package/eslint.cjs +2 -2
  422. package/eslint.mjs +2 -2
  423. package/{exceptions-BeWH2FwP.mjs → exceptions-BDhN0Xzr.mjs} +3 -2
  424. package/exceptions-BDhN0Xzr.mjs.map +1 -0
  425. package/{exceptions-CitH5wZI.js → exceptions-BRXrUKiW.js} +3 -2
  426. package/exceptions-BRXrUKiW.js.map +1 -0
  427. package/exceptions.cjs +2 -2
  428. package/exceptions.mjs +2 -2
  429. package/factories.cjs +1 -1
  430. package/factories.mjs +1 -1
  431. package/forge.cjs +4 -4
  432. package/forge.d.ts +1 -1
  433. package/forge.mjs +4 -4
  434. package/guards.cjs +9 -9
  435. package/guards.mjs +9 -9
  436. package/helpers-DSTFxTiC.js +497 -0
  437. package/helpers-DSTFxTiC.js.map +1 -0
  438. package/helpers-xhrQbMAG.mjs +306 -0
  439. package/helpers-xhrQbMAG.mjs.map +1 -0
  440. package/index.cjs +12 -12
  441. package/index.mjs +12 -12
  442. package/lib/classes/base_exception.d.ts +1 -0
  443. package/lib/classes/media.d.ts +10 -0
  444. package/lib/classes/retrievable.d.ts +1 -1
  445. package/lib/classes/spooled_json_artifact.d.ts +1 -1
  446. package/lib/classes/spooled_markdown_artifact.d.ts +1 -0
  447. package/lib/classes/tokenizable.d.ts +3 -0
  448. package/lib/classes/tool.d.ts +8 -0
  449. package/lib/classes/turn_gate.d.ts +6 -0
  450. package/lib/dispatch_runner.d.ts +4 -32
  451. package/lib/helpers/bignum.cjs +82 -0
  452. package/lib/helpers/bignum.cjs.map +1 -0
  453. package/lib/helpers/bignum.d.ts +52 -0
  454. package/lib/helpers/bignum.mjs +74 -0
  455. package/lib/helpers/bignum.mjs.map +1 -0
  456. package/lib/turn_runner.d.ts +1 -1
  457. package/lib/types/dispatch_runner.d.ts +83 -0
  458. package/lib/utils/exceptions.d.ts +1 -1
  459. package/lib/utils/retry.cjs.map +1 -1
  460. package/lib/utils/retry.d.ts +2 -0
  461. package/lib/utils/retry.mjs.map +1 -1
  462. package/mcp/adk-docs-corpus.json +1 -1
  463. package/package.json +259 -204
  464. package/{runtime-j92CNi5z.mjs → runtime-Bz5zA8wc.mjs} +2 -2
  465. package/{runtime-j92CNi5z.mjs.map → runtime-Bz5zA8wc.mjs.map} +1 -1
  466. package/{runtime-MFFcJrRv.js → runtime-DslE1aBw.js} +2 -2
  467. package/{runtime-MFFcJrRv.js.map → runtime-DslE1aBw.js.map} +1 -1
  468. package/scrapper-BHM1mCde.mjs +432 -0
  469. package/scrapper-BHM1mCde.mjs.map +1 -0
  470. package/scrapper-BeweWurk.js +462 -0
  471. package/scrapper-BeweWurk.js.map +1 -0
  472. package/searxng-BJFulNcK.mjs +247 -0
  473. package/searxng-BJFulNcK.mjs.map +1 -0
  474. package/searxng-B_D--V5q.js +265 -0
  475. package/searxng-B_D--V5q.js.map +1 -0
  476. package/skills/adk-assembly/SKILL.md +2 -2
  477. package/{spooled_artifact-CHoZgWwI.mjs → spooled_artifact-7eePq7JA.mjs} +5 -5
  478. package/{spooled_artifact-CHoZgWwI.mjs.map → spooled_artifact-7eePq7JA.mjs.map} +1 -1
  479. package/{spooled_artifact-BTq6Nzfy.js → spooled_artifact-DX8LLyUX.js} +5 -5
  480. package/{spooled_artifact-BTq6Nzfy.js.map → spooled_artifact-DX8LLyUX.js.map} +1 -1
  481. package/spooled_artifact.cjs +2 -2
  482. package/spooled_artifact.mjs +2 -2
  483. package/{spooled_markdown_artifact-CALSDxIx.js → spooled_markdown_artifact-ClX72lek.js} +4 -4
  484. package/spooled_markdown_artifact-ClX72lek.js.map +1 -0
  485. package/{spooled_markdown_artifact-Ci5UL7l4.mjs → spooled_markdown_artifact-wkrBF3oX.mjs} +4 -4
  486. package/spooled_markdown_artifact-wkrBF3oX.mjs.map +1 -0
  487. package/{thought-D34QQZZ9.mjs → thought-B_vxAiKU.mjs} +5 -5
  488. package/{thought-D34QQZZ9.mjs.map → thought-B_vxAiKU.mjs.map} +1 -1
  489. package/{thought-BbwhJ1wb.js → thought-DLwpF7MI.js} +5 -5
  490. package/{thought-BbwhJ1wb.js.map → thought-DLwpF7MI.js.map} +1 -1
  491. package/{tool-CVyZkFC7.js → tool-D5WGVIcI.js} +4 -4
  492. package/{tool-CVyZkFC7.js.map → tool-D5WGVIcI.js.map} +1 -1
  493. package/{tool-CMhaDRNd.mjs → tool-wMYMVl60.mjs} +4 -4
  494. package/{tool-CMhaDRNd.mjs.map → tool-wMYMVl60.mjs.map} +1 -1
  495. package/{tool_call-CV5qVNlb.mjs → tool_call-B4-_-vjG.mjs} +5 -5
  496. package/tool_call-B4-_-vjG.mjs.map +1 -0
  497. package/{tool_call-Db68hB7y.js → tool_call-DixVlW40.js} +5 -5
  498. package/tool_call-DixVlW40.js.map +1 -0
  499. package/{tool_registry-D1pSSlsd.mjs → tool_registry-791Vrjtf.mjs} +4 -3
  500. package/tool_registry-791Vrjtf.mjs.map +1 -0
  501. package/{tool_registry-DYUYqXvo.js → tool_registry-CKJPze3j.js} +4 -3
  502. package/tool_registry-CKJPze3j.js.map +1 -0
  503. package/{turn_runner-DqWHNP80.js → turn_runner-HXImLGIn.js} +7 -7
  504. package/turn_runner-HXImLGIn.js.map +1 -0
  505. package/{turn_runner-fg1Wc3dK.mjs → turn_runner-ZyYO-Kti.mjs} +7 -7
  506. package/turn_runner-ZyYO-Kti.mjs.map +1 -0
  507. package/turn_runner.cjs +1 -1
  508. package/turn_runner.mjs +1 -1
  509. package/types.d.ts +1 -1
  510. package/common-BT0nfCi9.mjs.map +0 -1
  511. package/common-Cj8TaQ9U.js.map +0 -1
  512. package/exceptions-BeWH2FwP.mjs.map +0 -1
  513. package/exceptions-CitH5wZI.js.map +0 -1
  514. package/spooled_markdown_artifact-CALSDxIx.js.map +0 -1
  515. package/spooled_markdown_artifact-Ci5UL7l4.mjs.map +0 -1
  516. package/tool_call-CV5qVNlb.mjs.map +0 -1
  517. package/tool_call-Db68hB7y.js.map +0 -1
  518. package/tool_registry-D1pSSlsd.mjs.map +0 -1
  519. package/tool_registry-DYUYqXvo.js.map +0 -1
  520. package/turn_runner-DqWHNP80.js.map +0 -1
  521. package/turn_runner-fg1Wc3dK.mjs.map +0 -1
@@ -1,9 +1,9 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_chunk = require("../../chunk-Ble4zEEl.js");
3
- const require_tool_registry = require("../../tool_registry-DYUYqXvo.js");
4
- const require_tool = require("../../tool-CVyZkFC7.js");
5
- require("../../common-Cj8TaQ9U.js");
6
- const require_spooled_markdown_artifact = require("../../spooled_markdown_artifact-CALSDxIx.js");
3
+ const require_tool_registry = require("../../tool_registry-CKJPze3j.js");
4
+ const require_tool = require("../../tool-D5WGVIcI.js");
5
+ require("../../common-DZl3ADJs.js");
6
+ const require_spooled_markdown_artifact = require("../../spooled_markdown_artifact-ClX72lek.js");
7
7
  require("../../guards.cjs");
8
8
  let _nhtio_validation = require("@nhtio/validation");
9
9
  let js_yaml = require("js-yaml");
@@ -73,7 +73,11 @@ var parseYamlTool = new require_tool.Tool({
73
73
  const { text } = args;
74
74
  try {
75
75
  const parsed = (0, js_yaml.load)(text);
76
- return JSON.stringify(parsed, null, 2);
76
+ if (parsed === void 0) return "null";
77
+ return JSON.stringify(parsed, (_key, value) => {
78
+ if (typeof value === "number" && !Number.isFinite(value)) return Number.isNaN(value) ? ".NaN" : value > 0 ? ".inf" : "-.inf";
79
+ return value;
80
+ }, 2);
77
81
  } catch (err) {
78
82
  return `Error: Invalid YAML — ${require_tool_registry.isError(err) ? err.message : String(err)}`;
79
83
  }
@@ -1 +1 @@
1
- {"version":3,"file":"parsing.cjs","names":[],"sources":["../../../src/batteries/tools/parsing/index.ts"],"sourcesContent":["/**\n * Pre-constructed tools for parsing CSV, TSV, JSON, YAML, and other structured text formats.\n *\n * @module @nhtio/adk/batteries/tools/parsing\n *\n * @remarks\n * Pre-constructed bundled tools for the `parsing` category. Import individually, the whole\n * category, or import every tool via `@nhtio/adk/batteries`.\n */\n\nimport { load as parseYaml } from 'js-yaml'\nimport { default as Papa } from 'papaparse'\nimport { isError } from '@nhtio/adk/guards'\nimport { validator } from '@nhtio/validation'\nimport { Tool, SpooledJsonArtifact } from '@nhtio/adk/common'\n\n/**\n * Parse a CSV or TSV string into a JSON array.\n *\n * @remarks\n * With `has_header: true` (default), each row becomes an object keyed by column name. Without a\n * header, rows are returned as positional arrays. `delimiter` auto-detects when omitted; pass\n * `\"\\t\"` for TSV. Rows are clipped to `limit` (default 1000, max 10000). Parse warnings are\n * prepended to the output.\n */\nexport const parseCsvTool = new Tool({\n name: 'parse_csv',\n description:\n 'Parse a CSV or TSV string into a JSON array. With a header row, returns objects keyed by column name. Without, returns arrays of values.',\n inputSchema: validator.object({\n text: validator.string().required().description('CSV or TSV text to parse'),\n has_header: validator\n .boolean()\n .default(true)\n .description('First row is a header row (default: true)'),\n delimiter: validator\n .string()\n .default('')\n .allow('')\n .description('Field delimiter — auto-detected if omitted. Use \"\\\\t\" for TSV.'),\n limit: validator.number().default(1000).description('Maximum rows to return (default: 1000)'),\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args) => {\n const {\n text,\n has_header: hasHeader,\n delimiter,\n limit: rawLimit,\n } = args as {\n text: string\n has_header: boolean\n delimiter: string\n limit: number\n }\n const limit = Math.min(10_000, Math.max(1, Math.floor(rawLimit)))\n\n try {\n const result = Papa.parse<unknown>(text.trim(), {\n header: hasHeader,\n delimiter: delimiter || undefined,\n skipEmptyLines: true,\n dynamicTyping: true,\n })\n\n const rows = (result.data as unknown[]).slice(0, limit)\n const warnings =\n result.errors.length > 0\n ? `Parse warnings: ${result.errors\n .slice(0, 3)\n .map((e) => e.message)\n .join('; ')}\\n\\n`\n : ''\n const truncated =\n result.data.length > limit ? `\\n\\n(Showing ${limit} of ${result.data.length} rows)` : ''\n\n return warnings + JSON.stringify(rows, null, 2) + truncated\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Parse a YAML string into JSON.\n *\n * @remarks\n * Returns a pretty-printed JSON representation of the parsed YAML document. Invalid YAML\n * returns an error string.\n */\nexport const parseYamlTool = new Tool({\n name: 'parse_yaml',\n description: 'Parse a YAML string and return the equivalent JSON.',\n inputSchema: validator.object({\n text: validator.string().required().description('YAML text to parse'),\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args) => {\n const { text } = args as { text: string }\n try {\n const parsed = parseYaml(text)\n return JSON.stringify(parsed, null, 2)\n } catch (err) {\n return `Error: Invalid YAML — ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Extract key-value pairs from text.\n *\n * @remarks\n * Handles `.env` files, config files, and query strings. `kv_delimiter` chooses the\n * key→value separator (`=`, `:`, or `auto`); `pair_delimiter` selects how pairs are separated\n * (`newline`, `comma`, `semicolon`, `ampersand`). Surrounding single or double quotes around\n * values are stripped. Comment lines starting with `#` are skipped by default.\n */\nexport const parseKvTool = new Tool({\n name: 'parse_kv',\n description:\n 'Extract key-value pairs from text (e.g. .env files, config files, query strings). Returns a JSON object.',\n inputSchema: validator.object({\n text: validator.string().required().description('Text containing key-value pairs'),\n kv_delimiter: validator\n .string()\n .valid('=', ':', 'auto')\n .default('auto')\n .description('Separator between key and value (default: auto-detect)'),\n pair_delimiter: validator\n .string()\n .valid('newline', 'comma', 'semicolon', 'ampersand')\n .default('newline')\n .description('Separator between pairs (default: newline)'),\n skip_comments: validator\n .boolean()\n .default(true)\n .description('Skip lines starting with # (default: true)'),\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args) => {\n const {\n text,\n kv_delimiter: kvDelim,\n pair_delimiter: pairDelimKey,\n skip_comments: skipComments,\n } = args as {\n text: string\n kv_delimiter: string\n pair_delimiter: string\n skip_comments: boolean\n }\n\n const pairDelimMap: Record<string, string> = {\n newline: '\\n',\n comma: ',',\n semicolon: ';',\n ampersand: '&',\n }\n const pairDelim = pairDelimMap[pairDelimKey] ?? '\\n'\n\n const result: Record<string, string> = {}\n\n for (const raw of text.split(pairDelim)) {\n const line = raw.trim()\n if (line === '') continue\n if (skipComments && line.startsWith('#')) continue\n\n const delim =\n kvDelim === 'auto' ? (line.includes('=') ? '=' : line.includes(':') ? ':' : null) : kvDelim\n if (!delim) continue\n\n const sepIdx = line.indexOf(delim)\n if (sepIdx === -1) continue\n\n const key = line.slice(0, sepIdx).trim()\n let value = line.slice(sepIdx + delim.length).trim()\n\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1)\n }\n\n if (key) result[key] = value\n }\n\n return JSON.stringify(result, null, 2)\n },\n})\n\n/**\n * Detect the most likely field delimiter in a CSV-like text sample.\n *\n * @remarks\n * Tries comma, tab, semicolon, pipe, and colon. Scores each by mean field count divided by\n * variance (so consistent row widths beat noisy splits). Looks at up to the first 20 lines of\n * the first 5000 characters.\n */\nexport const detectDelimiterTool = new Tool({\n name: 'detect_delimiter',\n description: 'Detect the most likely field delimiter in a CSV-like text sample.',\n inputSchema: validator.object({\n text: validator.string().required().description('Sample of the delimited text to analyze'),\n }),\n handler: async (args) => {\n const { text } = args as { text: string }\n const sample = text.slice(0, 5000)\n const lines = sample\n .split('\\n')\n .map((l) => l.trim())\n .filter((l) => l.length > 0)\n .slice(0, 20)\n\n if (lines.length === 0) return 'Error: No lines to analyze.'\n\n const candidates: Array<{ delim: string; name: string }> = [\n { delim: ',', name: 'comma' },\n { delim: '\\t', name: 'tab' },\n { delim: ';', name: 'semicolon' },\n { delim: '|', name: 'pipe' },\n { delim: ':', name: 'colon' },\n ]\n\n let best = { name: 'comma', delim: ',', score: -1, avgFields: 0 }\n\n for (const { delim, name } of candidates) {\n const counts = lines.map((l) => l.split(delim).length - 1)\n const avg = counts.reduce((a, b) => a + b, 0) / counts.length\n if (avg === 0) continue\n const fieldVariance = counts.reduce((a, b) => a + (b - avg) ** 2, 0) / counts.length\n const score = avg / (1 + fieldVariance)\n if (score > best.score) {\n best = { name, delim, score, avgFields: Number.parseFloat((avg + 1).toFixed(1)) }\n }\n }\n\n return `Detected delimiter: ${best.name} (\"${best.delim === '\\t' ? '\\\\t' : best.delim}\") — ~${best.avgFields} fields per row`\n },\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"parsing.cjs","names":[],"sources":["../../../src/batteries/tools/parsing/index.ts"],"sourcesContent":["/**\n * Pre-constructed tools for parsing CSV, TSV, JSON, YAML, and other structured text formats.\n *\n * @module @nhtio/adk/batteries/tools/parsing\n *\n * @remarks\n * Pre-constructed bundled tools for the `parsing` category. Import individually, the whole\n * category, or import every tool via `@nhtio/adk/batteries`.\n */\n\nimport { load as parseYaml } from 'js-yaml'\nimport { default as Papa } from 'papaparse'\nimport { isError } from '@nhtio/adk/guards'\nimport { validator } from '@nhtio/validation'\nimport { Tool, SpooledJsonArtifact } from '@nhtio/adk/common'\n\n/**\n * Parse a CSV or TSV string into a JSON array.\n *\n * @remarks\n * With `has_header: true` (default), each row becomes an object keyed by column name. Without a\n * header, rows are returned as positional arrays. `delimiter` auto-detects when omitted; pass\n * `\"\\t\"` for TSV. Rows are clipped to `limit` (default 1000, max 10000). Parse warnings are\n * prepended to the output.\n */\nexport const parseCsvTool = new Tool({\n name: 'parse_csv',\n description:\n 'Parse a CSV or TSV string into a JSON array. With a header row, returns objects keyed by column name. Without, returns arrays of values.',\n inputSchema: validator.object({\n text: validator.string().required().description('CSV or TSV text to parse'),\n has_header: validator\n .boolean()\n .default(true)\n .description('First row is a header row (default: true)'),\n delimiter: validator\n .string()\n .default('')\n .allow('')\n .description('Field delimiter — auto-detected if omitted. Use \"\\\\t\" for TSV.'),\n limit: validator.number().default(1000).description('Maximum rows to return (default: 1000)'),\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args) => {\n const {\n text,\n has_header: hasHeader,\n delimiter,\n limit: rawLimit,\n } = args as {\n text: string\n has_header: boolean\n delimiter: string\n limit: number\n }\n const limit = Math.min(10_000, Math.max(1, Math.floor(rawLimit)))\n\n try {\n const result = Papa.parse<unknown>(text.trim(), {\n header: hasHeader,\n delimiter: delimiter || undefined,\n skipEmptyLines: true,\n dynamicTyping: true,\n })\n\n const rows = (result.data as unknown[]).slice(0, limit)\n const warnings =\n result.errors.length > 0\n ? `Parse warnings: ${result.errors\n .slice(0, 3)\n .map((e) => e.message)\n .join('; ')}\\n\\n`\n : ''\n const truncated =\n result.data.length > limit ? `\\n\\n(Showing ${limit} of ${result.data.length} rows)` : ''\n\n return warnings + JSON.stringify(rows, null, 2) + truncated\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Parse a YAML string into JSON.\n *\n * @remarks\n * Returns a pretty-printed JSON representation of the parsed YAML document. Invalid YAML\n * returns an error string.\n */\nexport const parseYamlTool = new Tool({\n name: 'parse_yaml',\n description: 'Parse a YAML string and return the equivalent JSON.',\n inputSchema: validator.object({\n text: validator.string().required().description('YAML text to parse'),\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args) => {\n const { text } = args as { text: string }\n try {\n const parsed = parseYaml(text)\n // An empty / whitespace-only / BOM-only document parses to `undefined`, and\n // `JSON.stringify(undefined)` returns the JS value `undefined` (not a string), breaking the\n // tool's string-return contract. Normalise that empty document to JSON `null`.\n if (parsed === undefined) return 'null'\n // YAML permits .NaN / .inf / -.inf, which `JSON.stringify` would silently turn into `null`,\n // losing the value. Render non-finite numbers as their YAML token strings so the information\n // survives the JSON round-trip instead of being corrupted to null.\n return JSON.stringify(\n parsed,\n (_key, value) => {\n if (typeof value === 'number' && !Number.isFinite(value)) {\n return Number.isNaN(value) ? '.NaN' : value > 0 ? '.inf' : '-.inf'\n }\n return value\n },\n 2\n )\n } catch (err) {\n return `Error: Invalid YAML — ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Extract key-value pairs from text.\n *\n * @remarks\n * Handles `.env` files, config files, and query strings. `kv_delimiter` chooses the\n * key→value separator (`=`, `:`, or `auto`); `pair_delimiter` selects how pairs are separated\n * (`newline`, `comma`, `semicolon`, `ampersand`). Surrounding single or double quotes around\n * values are stripped. Comment lines starting with `#` are skipped by default.\n */\nexport const parseKvTool = new Tool({\n name: 'parse_kv',\n description:\n 'Extract key-value pairs from text (e.g. .env files, config files, query strings). Returns a JSON object.',\n inputSchema: validator.object({\n text: validator.string().required().description('Text containing key-value pairs'),\n kv_delimiter: validator\n .string()\n .valid('=', ':', 'auto')\n .default('auto')\n .description('Separator between key and value (default: auto-detect)'),\n pair_delimiter: validator\n .string()\n .valid('newline', 'comma', 'semicolon', 'ampersand')\n .default('newline')\n .description('Separator between pairs (default: newline)'),\n skip_comments: validator\n .boolean()\n .default(true)\n .description('Skip lines starting with # (default: true)'),\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args) => {\n const {\n text,\n kv_delimiter: kvDelim,\n pair_delimiter: pairDelimKey,\n skip_comments: skipComments,\n } = args as {\n text: string\n kv_delimiter: string\n pair_delimiter: string\n skip_comments: boolean\n }\n\n const pairDelimMap: Record<string, string> = {\n newline: '\\n',\n comma: ',',\n semicolon: ';',\n ampersand: '&',\n }\n const pairDelim = pairDelimMap[pairDelimKey] ?? '\\n'\n\n const result: Record<string, string> = {}\n\n for (const raw of text.split(pairDelim)) {\n const line = raw.trim()\n if (line === '') continue\n if (skipComments && line.startsWith('#')) continue\n\n const delim =\n kvDelim === 'auto' ? (line.includes('=') ? '=' : line.includes(':') ? ':' : null) : kvDelim\n if (!delim) continue\n\n const sepIdx = line.indexOf(delim)\n if (sepIdx === -1) continue\n\n const key = line.slice(0, sepIdx).trim()\n let value = line.slice(sepIdx + delim.length).trim()\n\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1)\n }\n\n if (key) result[key] = value\n }\n\n return JSON.stringify(result, null, 2)\n },\n})\n\n/**\n * Detect the most likely field delimiter in a CSV-like text sample.\n *\n * @remarks\n * Tries comma, tab, semicolon, pipe, and colon. Scores each by mean field count divided by\n * variance (so consistent row widths beat noisy splits). Looks at up to the first 20 lines of\n * the first 5000 characters.\n */\nexport const detectDelimiterTool = new Tool({\n name: 'detect_delimiter',\n description: 'Detect the most likely field delimiter in a CSV-like text sample.',\n inputSchema: validator.object({\n text: validator.string().required().description('Sample of the delimited text to analyze'),\n }),\n handler: async (args) => {\n const { text } = args as { text: string }\n const sample = text.slice(0, 5000)\n const lines = sample\n .split('\\n')\n .map((l) => l.trim())\n .filter((l) => l.length > 0)\n .slice(0, 20)\n\n if (lines.length === 0) return 'Error: No lines to analyze.'\n\n const candidates: Array<{ delim: string; name: string }> = [\n { delim: ',', name: 'comma' },\n { delim: '\\t', name: 'tab' },\n { delim: ';', name: 'semicolon' },\n { delim: '|', name: 'pipe' },\n { delim: ':', name: 'colon' },\n ]\n\n let best = { name: 'comma', delim: ',', score: -1, avgFields: 0 }\n\n for (const { delim, name } of candidates) {\n const counts = lines.map((l) => l.split(delim).length - 1)\n const avg = counts.reduce((a, b) => a + b, 0) / counts.length\n if (avg === 0) continue\n const fieldVariance = counts.reduce((a, b) => a + (b - avg) ** 2, 0) / counts.length\n const score = avg / (1 + fieldVariance)\n if (score > best.score) {\n best = { name, delim, score, avgFields: Number.parseFloat((avg + 1).toFixed(1)) }\n }\n }\n\n return `Detected delimiter: ${best.name} (\"${best.delim === '\\t' ? '\\\\t' : best.delim}\") — ~${best.avgFields} fields per row`\n },\n})\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import { o as isError } from "../../tool_registry-D1pSSlsd.mjs";
2
- import { t as Tool } from "../../tool-CMhaDRNd.mjs";
3
- import "../../common-BT0nfCi9.mjs";
4
- import { n as SpooledJsonArtifact } from "../../spooled_markdown_artifact-Ci5UL7l4.mjs";
1
+ import { o as isError } from "../../tool_registry-791Vrjtf.mjs";
2
+ import { t as Tool } from "../../tool-wMYMVl60.mjs";
3
+ import "../../common-DYDUi99O.mjs";
4
+ import { n as SpooledJsonArtifact } from "../../spooled_markdown_artifact-wkrBF3oX.mjs";
5
5
  import "../../guards.mjs";
6
6
  import { validator } from "@nhtio/validation";
7
7
  import { load } from "js-yaml";
@@ -70,7 +70,11 @@ var parseYamlTool = new Tool({
70
70
  const { text } = args;
71
71
  try {
72
72
  const parsed = load(text);
73
- return JSON.stringify(parsed, null, 2);
73
+ if (parsed === void 0) return "null";
74
+ return JSON.stringify(parsed, (_key, value) => {
75
+ if (typeof value === "number" && !Number.isFinite(value)) return Number.isNaN(value) ? ".NaN" : value > 0 ? ".inf" : "-.inf";
76
+ return value;
77
+ }, 2);
74
78
  } catch (err) {
75
79
  return `Error: Invalid YAML — ${isError(err) ? err.message : String(err)}`;
76
80
  }
@@ -1 +1 @@
1
- {"version":3,"file":"parsing.mjs","names":[],"sources":["../../../src/batteries/tools/parsing/index.ts"],"sourcesContent":["/**\n * Pre-constructed tools for parsing CSV, TSV, JSON, YAML, and other structured text formats.\n *\n * @module @nhtio/adk/batteries/tools/parsing\n *\n * @remarks\n * Pre-constructed bundled tools for the `parsing` category. Import individually, the whole\n * category, or import every tool via `@nhtio/adk/batteries`.\n */\n\nimport { load as parseYaml } from 'js-yaml'\nimport { default as Papa } from 'papaparse'\nimport { isError } from '@nhtio/adk/guards'\nimport { validator } from '@nhtio/validation'\nimport { Tool, SpooledJsonArtifact } from '@nhtio/adk/common'\n\n/**\n * Parse a CSV or TSV string into a JSON array.\n *\n * @remarks\n * With `has_header: true` (default), each row becomes an object keyed by column name. Without a\n * header, rows are returned as positional arrays. `delimiter` auto-detects when omitted; pass\n * `\"\\t\"` for TSV. Rows are clipped to `limit` (default 1000, max 10000). Parse warnings are\n * prepended to the output.\n */\nexport const parseCsvTool = new Tool({\n name: 'parse_csv',\n description:\n 'Parse a CSV or TSV string into a JSON array. With a header row, returns objects keyed by column name. Without, returns arrays of values.',\n inputSchema: validator.object({\n text: validator.string().required().description('CSV or TSV text to parse'),\n has_header: validator\n .boolean()\n .default(true)\n .description('First row is a header row (default: true)'),\n delimiter: validator\n .string()\n .default('')\n .allow('')\n .description('Field delimiter — auto-detected if omitted. Use \"\\\\t\" for TSV.'),\n limit: validator.number().default(1000).description('Maximum rows to return (default: 1000)'),\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args) => {\n const {\n text,\n has_header: hasHeader,\n delimiter,\n limit: rawLimit,\n } = args as {\n text: string\n has_header: boolean\n delimiter: string\n limit: number\n }\n const limit = Math.min(10_000, Math.max(1, Math.floor(rawLimit)))\n\n try {\n const result = Papa.parse<unknown>(text.trim(), {\n header: hasHeader,\n delimiter: delimiter || undefined,\n skipEmptyLines: true,\n dynamicTyping: true,\n })\n\n const rows = (result.data as unknown[]).slice(0, limit)\n const warnings =\n result.errors.length > 0\n ? `Parse warnings: ${result.errors\n .slice(0, 3)\n .map((e) => e.message)\n .join('; ')}\\n\\n`\n : ''\n const truncated =\n result.data.length > limit ? `\\n\\n(Showing ${limit} of ${result.data.length} rows)` : ''\n\n return warnings + JSON.stringify(rows, null, 2) + truncated\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Parse a YAML string into JSON.\n *\n * @remarks\n * Returns a pretty-printed JSON representation of the parsed YAML document. Invalid YAML\n * returns an error string.\n */\nexport const parseYamlTool = new Tool({\n name: 'parse_yaml',\n description: 'Parse a YAML string and return the equivalent JSON.',\n inputSchema: validator.object({\n text: validator.string().required().description('YAML text to parse'),\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args) => {\n const { text } = args as { text: string }\n try {\n const parsed = parseYaml(text)\n return JSON.stringify(parsed, null, 2)\n } catch (err) {\n return `Error: Invalid YAML — ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Extract key-value pairs from text.\n *\n * @remarks\n * Handles `.env` files, config files, and query strings. `kv_delimiter` chooses the\n * key→value separator (`=`, `:`, or `auto`); `pair_delimiter` selects how pairs are separated\n * (`newline`, `comma`, `semicolon`, `ampersand`). Surrounding single or double quotes around\n * values are stripped. Comment lines starting with `#` are skipped by default.\n */\nexport const parseKvTool = new Tool({\n name: 'parse_kv',\n description:\n 'Extract key-value pairs from text (e.g. .env files, config files, query strings). Returns a JSON object.',\n inputSchema: validator.object({\n text: validator.string().required().description('Text containing key-value pairs'),\n kv_delimiter: validator\n .string()\n .valid('=', ':', 'auto')\n .default('auto')\n .description('Separator between key and value (default: auto-detect)'),\n pair_delimiter: validator\n .string()\n .valid('newline', 'comma', 'semicolon', 'ampersand')\n .default('newline')\n .description('Separator between pairs (default: newline)'),\n skip_comments: validator\n .boolean()\n .default(true)\n .description('Skip lines starting with # (default: true)'),\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args) => {\n const {\n text,\n kv_delimiter: kvDelim,\n pair_delimiter: pairDelimKey,\n skip_comments: skipComments,\n } = args as {\n text: string\n kv_delimiter: string\n pair_delimiter: string\n skip_comments: boolean\n }\n\n const pairDelimMap: Record<string, string> = {\n newline: '\\n',\n comma: ',',\n semicolon: ';',\n ampersand: '&',\n }\n const pairDelim = pairDelimMap[pairDelimKey] ?? '\\n'\n\n const result: Record<string, string> = {}\n\n for (const raw of text.split(pairDelim)) {\n const line = raw.trim()\n if (line === '') continue\n if (skipComments && line.startsWith('#')) continue\n\n const delim =\n kvDelim === 'auto' ? (line.includes('=') ? '=' : line.includes(':') ? ':' : null) : kvDelim\n if (!delim) continue\n\n const sepIdx = line.indexOf(delim)\n if (sepIdx === -1) continue\n\n const key = line.slice(0, sepIdx).trim()\n let value = line.slice(sepIdx + delim.length).trim()\n\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1)\n }\n\n if (key) result[key] = value\n }\n\n return JSON.stringify(result, null, 2)\n },\n})\n\n/**\n * Detect the most likely field delimiter in a CSV-like text sample.\n *\n * @remarks\n * Tries comma, tab, semicolon, pipe, and colon. Scores each by mean field count divided by\n * variance (so consistent row widths beat noisy splits). Looks at up to the first 20 lines of\n * the first 5000 characters.\n */\nexport const detectDelimiterTool = new Tool({\n name: 'detect_delimiter',\n description: 'Detect the most likely field delimiter in a CSV-like text sample.',\n inputSchema: validator.object({\n text: validator.string().required().description('Sample of the delimited text to analyze'),\n }),\n handler: async (args) => {\n const { text } = args as { text: string }\n const sample = text.slice(0, 5000)\n const lines = sample\n .split('\\n')\n .map((l) => l.trim())\n .filter((l) => l.length > 0)\n .slice(0, 20)\n\n if (lines.length === 0) return 'Error: No lines to analyze.'\n\n const candidates: Array<{ delim: string; name: string }> = [\n { delim: ',', name: 'comma' },\n { delim: '\\t', name: 'tab' },\n { delim: ';', name: 'semicolon' },\n { delim: '|', name: 'pipe' },\n { delim: ':', name: 'colon' },\n ]\n\n let best = { name: 'comma', delim: ',', score: -1, avgFields: 0 }\n\n for (const { delim, name } of candidates) {\n const counts = lines.map((l) => l.split(delim).length - 1)\n const avg = counts.reduce((a, b) => a + b, 0) / counts.length\n if (avg === 0) continue\n const fieldVariance = counts.reduce((a, b) => a + (b - avg) ** 2, 0) / counts.length\n const score = avg / (1 + fieldVariance)\n if (score > best.score) {\n best = { name, delim, score, avgFields: Number.parseFloat((avg + 1).toFixed(1)) }\n }\n }\n\n return `Detected delimiter: ${best.name} (\"${best.delim === '\\t' ? '\\\\t' : best.delim}\") — ~${best.avgFields} fields per row`\n },\n})\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAyBA,IAAa,eAAe,IAAI,KAAK;CACnC,MAAM;CACN,aACE;CACF,aAAa,UAAU,OAAO;EAC5B,MAAM,UAAU,OAAO,EAAE,SAAS,EAAE,YAAY,0BAA0B;EAC1E,YAAY,UACT,QAAQ,EACR,QAAQ,IAAI,EACZ,YAAY,2CAA2C;EAC1D,WAAW,UACR,OAAO,EACP,QAAQ,EAAE,EACV,MAAM,EAAE,EACR,YAAY,kEAAgE;EAC/E,OAAO,UAAU,OAAO,EAAE,QAAQ,GAAI,EAAE,YAAY,wCAAwC;CAC9F,CAAC;CACD,2BAA2B;CAC3B,SAAS,OAAO,SAAS;EACvB,MAAM,EACJ,MACA,YAAY,WACZ,WACA,OAAO,aACL;EAMJ,MAAM,QAAQ,KAAK,IAAI,KAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,CAAC,CAAC;EAEhE,IAAI;GACF,MAAM,SAAS,KAAK,MAAe,KAAK,KAAK,GAAG;IAC9C,QAAQ;IACR,WAAW,aAAa,KAAA;IACxB,gBAAgB;IAChB,eAAe;GACjB,CAAC;GAED,MAAM,OAAQ,OAAO,KAAmB,MAAM,GAAG,KAAK;GACtD,MAAM,WACJ,OAAO,OAAO,SAAS,IACnB,mBAAmB,OAAO,OACvB,MAAM,GAAG,CAAC,EACV,KAAK,MAAM,EAAE,OAAO,EACpB,KAAK,IAAI,EAAE,QACd;GACN,MAAM,YACJ,OAAO,KAAK,SAAS,QAAQ,gBAAgB,MAAM,MAAM,OAAO,KAAK,OAAO,UAAU;GAExF,OAAO,WAAW,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI;EACpD,SAAS,KAAK;GACZ,OAAO,UAAU,QAAQ,GAAG,IAAI,IAAI,UAAU,OAAO,GAAG;EAC1D;CACF;AACF,CAAC;;;;;;;;AASD,IAAa,gBAAgB,IAAI,KAAK;CACpC,MAAM;CACN,aAAa;CACb,aAAa,UAAU,OAAO,EAC5B,MAAM,UAAU,OAAO,EAAE,SAAS,EAAE,YAAY,oBAAoB,EACtE,CAAC;CACD,2BAA2B;CAC3B,SAAS,OAAO,SAAS;EACvB,MAAM,EAAE,SAAS;EACjB,IAAI;GACF,MAAM,SAAS,KAAU,IAAI;GAC7B,OAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;EACvC,SAAS,KAAK;GACZ,OAAO,yBAAyB,QAAQ,GAAG,IAAI,IAAI,UAAU,OAAO,GAAG;EACzE;CACF;AACF,CAAC;;;;;;;;;;AAWD,IAAa,cAAc,IAAI,KAAK;CAClC,MAAM;CACN,aACE;CACF,aAAa,UAAU,OAAO;EAC5B,MAAM,UAAU,OAAO,EAAE,SAAS,EAAE,YAAY,iCAAiC;EACjF,cAAc,UACX,OAAO,EACP,MAAM,KAAK,KAAK,MAAM,EACtB,QAAQ,MAAM,EACd,YAAY,wDAAwD;EACvE,gBAAgB,UACb,OAAO,EACP,MAAM,WAAW,SAAS,aAAa,WAAW,EAClD,QAAQ,SAAS,EACjB,YAAY,4CAA4C;EAC3D,eAAe,UACZ,QAAQ,EACR,QAAQ,IAAI,EACZ,YAAY,4CAA4C;CAC7D,CAAC;CACD,2BAA2B;CAC3B,SAAS,OAAO,SAAS;EACvB,MAAM,EACJ,MACA,cAAc,SACd,gBAAgB,cAChB,eAAe,iBACb;EAaJ,MAAM,YAAY;GALhB,SAAS;GACT,OAAO;GACP,WAAW;GACX,WAAW;EAEK,EAAa,iBAAiB;EAEhD,MAAM,SAAiC,CAAC;EAExC,KAAK,MAAM,OAAO,KAAK,MAAM,SAAS,GAAG;GACvC,MAAM,OAAO,IAAI,KAAK;GACtB,IAAI,SAAS,IAAI;GACjB,IAAI,gBAAgB,KAAK,WAAW,GAAG,GAAG;GAE1C,MAAM,QACJ,YAAY,SAAU,KAAK,SAAS,GAAG,IAAI,MAAM,KAAK,SAAS,GAAG,IAAI,MAAM,OAAQ;GACtF,IAAI,CAAC,OAAO;GAEZ,MAAM,SAAS,KAAK,QAAQ,KAAK;GACjC,IAAI,WAAW,IAAI;GAEnB,MAAM,MAAM,KAAK,MAAM,GAAG,MAAM,EAAE,KAAK;GACvC,IAAI,QAAQ,KAAK,MAAM,SAAS,MAAM,MAAM,EAAE,KAAK;GAEnD,IACG,MAAM,WAAW,IAAG,KAAK,MAAM,SAAS,IAAG,KAC3C,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,GAE5C,QAAQ,MAAM,MAAM,GAAG,EAAE;GAG3B,IAAI,KAAK,OAAO,OAAO;EACzB;EAEA,OAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;CACvC;AACF,CAAC;;;;;;;;;AAUD,IAAa,sBAAsB,IAAI,KAAK;CAC1C,MAAM;CACN,aAAa;CACb,aAAa,UAAU,OAAO,EAC5B,MAAM,UAAU,OAAO,EAAE,SAAS,EAAE,YAAY,yCAAyC,EAC3F,CAAC;CACD,SAAS,OAAO,SAAS;EACvB,MAAM,EAAE,SAAS;EAEjB,MAAM,QADS,KAAK,MAAM,GAAG,GACf,EACX,MAAM,IAAI,EACV,KAAK,MAAM,EAAE,KAAK,CAAC,EACnB,QAAQ,MAAM,EAAE,SAAS,CAAC,EAC1B,MAAM,GAAG,EAAE;EAEd,IAAI,MAAM,WAAW,GAAG,OAAO;EAE/B,MAAM,aAAqD;GACzD;IAAE,OAAO;IAAK,MAAM;GAAQ;GAC5B;IAAE,OAAO;IAAM,MAAM;GAAM;GAC3B;IAAE,OAAO;IAAK,MAAM;GAAY;GAChC;IAAE,OAAO;IAAK,MAAM;GAAO;GAC3B;IAAE,OAAO;IAAK,MAAM;GAAQ;EAC9B;EAEA,IAAI,OAAO;GAAE,MAAM;GAAS,OAAO;GAAK,OAAO;GAAI,WAAW;EAAE;EAEhE,KAAK,MAAM,EAAE,OAAO,UAAU,YAAY;GACxC,MAAM,SAAS,MAAM,KAAK,MAAM,EAAE,MAAM,KAAK,EAAE,SAAS,CAAC;GACzD,MAAM,MAAM,OAAO,QAAQ,GAAG,MAAM,IAAI,GAAG,CAAC,IAAI,OAAO;GACvD,IAAI,QAAQ,GAAG;GAEf,MAAM,QAAQ,OAAO,IADC,OAAO,QAAQ,GAAG,MAAM,KAAK,IAAI,QAAQ,GAAG,CAAC,IAAI,OAAO;GAE9E,IAAI,QAAQ,KAAK,OACf,OAAO;IAAE;IAAM;IAAO;IAAO,WAAW,OAAO,YAAY,MAAM,GAAG,QAAQ,CAAC,CAAC;GAAE;EAEpF;EAEA,OAAO,uBAAuB,KAAK,KAAK,KAAK,KAAK,UAAU,MAAO,QAAQ,KAAK,MAAM,QAAQ,KAAK,UAAU;CAC/G;AACF,CAAC"}
1
+ {"version":3,"file":"parsing.mjs","names":[],"sources":["../../../src/batteries/tools/parsing/index.ts"],"sourcesContent":["/**\n * Pre-constructed tools for parsing CSV, TSV, JSON, YAML, and other structured text formats.\n *\n * @module @nhtio/adk/batteries/tools/parsing\n *\n * @remarks\n * Pre-constructed bundled tools for the `parsing` category. Import individually, the whole\n * category, or import every tool via `@nhtio/adk/batteries`.\n */\n\nimport { load as parseYaml } from 'js-yaml'\nimport { default as Papa } from 'papaparse'\nimport { isError } from '@nhtio/adk/guards'\nimport { validator } from '@nhtio/validation'\nimport { Tool, SpooledJsonArtifact } from '@nhtio/adk/common'\n\n/**\n * Parse a CSV or TSV string into a JSON array.\n *\n * @remarks\n * With `has_header: true` (default), each row becomes an object keyed by column name. Without a\n * header, rows are returned as positional arrays. `delimiter` auto-detects when omitted; pass\n * `\"\\t\"` for TSV. Rows are clipped to `limit` (default 1000, max 10000). Parse warnings are\n * prepended to the output.\n */\nexport const parseCsvTool = new Tool({\n name: 'parse_csv',\n description:\n 'Parse a CSV or TSV string into a JSON array. With a header row, returns objects keyed by column name. Without, returns arrays of values.',\n inputSchema: validator.object({\n text: validator.string().required().description('CSV or TSV text to parse'),\n has_header: validator\n .boolean()\n .default(true)\n .description('First row is a header row (default: true)'),\n delimiter: validator\n .string()\n .default('')\n .allow('')\n .description('Field delimiter — auto-detected if omitted. Use \"\\\\t\" for TSV.'),\n limit: validator.number().default(1000).description('Maximum rows to return (default: 1000)'),\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args) => {\n const {\n text,\n has_header: hasHeader,\n delimiter,\n limit: rawLimit,\n } = args as {\n text: string\n has_header: boolean\n delimiter: string\n limit: number\n }\n const limit = Math.min(10_000, Math.max(1, Math.floor(rawLimit)))\n\n try {\n const result = Papa.parse<unknown>(text.trim(), {\n header: hasHeader,\n delimiter: delimiter || undefined,\n skipEmptyLines: true,\n dynamicTyping: true,\n })\n\n const rows = (result.data as unknown[]).slice(0, limit)\n const warnings =\n result.errors.length > 0\n ? `Parse warnings: ${result.errors\n .slice(0, 3)\n .map((e) => e.message)\n .join('; ')}\\n\\n`\n : ''\n const truncated =\n result.data.length > limit ? `\\n\\n(Showing ${limit} of ${result.data.length} rows)` : ''\n\n return warnings + JSON.stringify(rows, null, 2) + truncated\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Parse a YAML string into JSON.\n *\n * @remarks\n * Returns a pretty-printed JSON representation of the parsed YAML document. Invalid YAML\n * returns an error string.\n */\nexport const parseYamlTool = new Tool({\n name: 'parse_yaml',\n description: 'Parse a YAML string and return the equivalent JSON.',\n inputSchema: validator.object({\n text: validator.string().required().description('YAML text to parse'),\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args) => {\n const { text } = args as { text: string }\n try {\n const parsed = parseYaml(text)\n // An empty / whitespace-only / BOM-only document parses to `undefined`, and\n // `JSON.stringify(undefined)` returns the JS value `undefined` (not a string), breaking the\n // tool's string-return contract. Normalise that empty document to JSON `null`.\n if (parsed === undefined) return 'null'\n // YAML permits .NaN / .inf / -.inf, which `JSON.stringify` would silently turn into `null`,\n // losing the value. Render non-finite numbers as their YAML token strings so the information\n // survives the JSON round-trip instead of being corrupted to null.\n return JSON.stringify(\n parsed,\n (_key, value) => {\n if (typeof value === 'number' && !Number.isFinite(value)) {\n return Number.isNaN(value) ? '.NaN' : value > 0 ? '.inf' : '-.inf'\n }\n return value\n },\n 2\n )\n } catch (err) {\n return `Error: Invalid YAML — ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Extract key-value pairs from text.\n *\n * @remarks\n * Handles `.env` files, config files, and query strings. `kv_delimiter` chooses the\n * key→value separator (`=`, `:`, or `auto`); `pair_delimiter` selects how pairs are separated\n * (`newline`, `comma`, `semicolon`, `ampersand`). Surrounding single or double quotes around\n * values are stripped. Comment lines starting with `#` are skipped by default.\n */\nexport const parseKvTool = new Tool({\n name: 'parse_kv',\n description:\n 'Extract key-value pairs from text (e.g. .env files, config files, query strings). Returns a JSON object.',\n inputSchema: validator.object({\n text: validator.string().required().description('Text containing key-value pairs'),\n kv_delimiter: validator\n .string()\n .valid('=', ':', 'auto')\n .default('auto')\n .description('Separator between key and value (default: auto-detect)'),\n pair_delimiter: validator\n .string()\n .valid('newline', 'comma', 'semicolon', 'ampersand')\n .default('newline')\n .description('Separator between pairs (default: newline)'),\n skip_comments: validator\n .boolean()\n .default(true)\n .description('Skip lines starting with # (default: true)'),\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args) => {\n const {\n text,\n kv_delimiter: kvDelim,\n pair_delimiter: pairDelimKey,\n skip_comments: skipComments,\n } = args as {\n text: string\n kv_delimiter: string\n pair_delimiter: string\n skip_comments: boolean\n }\n\n const pairDelimMap: Record<string, string> = {\n newline: '\\n',\n comma: ',',\n semicolon: ';',\n ampersand: '&',\n }\n const pairDelim = pairDelimMap[pairDelimKey] ?? '\\n'\n\n const result: Record<string, string> = {}\n\n for (const raw of text.split(pairDelim)) {\n const line = raw.trim()\n if (line === '') continue\n if (skipComments && line.startsWith('#')) continue\n\n const delim =\n kvDelim === 'auto' ? (line.includes('=') ? '=' : line.includes(':') ? ':' : null) : kvDelim\n if (!delim) continue\n\n const sepIdx = line.indexOf(delim)\n if (sepIdx === -1) continue\n\n const key = line.slice(0, sepIdx).trim()\n let value = line.slice(sepIdx + delim.length).trim()\n\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1)\n }\n\n if (key) result[key] = value\n }\n\n return JSON.stringify(result, null, 2)\n },\n})\n\n/**\n * Detect the most likely field delimiter in a CSV-like text sample.\n *\n * @remarks\n * Tries comma, tab, semicolon, pipe, and colon. Scores each by mean field count divided by\n * variance (so consistent row widths beat noisy splits). Looks at up to the first 20 lines of\n * the first 5000 characters.\n */\nexport const detectDelimiterTool = new Tool({\n name: 'detect_delimiter',\n description: 'Detect the most likely field delimiter in a CSV-like text sample.',\n inputSchema: validator.object({\n text: validator.string().required().description('Sample of the delimited text to analyze'),\n }),\n handler: async (args) => {\n const { text } = args as { text: string }\n const sample = text.slice(0, 5000)\n const lines = sample\n .split('\\n')\n .map((l) => l.trim())\n .filter((l) => l.length > 0)\n .slice(0, 20)\n\n if (lines.length === 0) return 'Error: No lines to analyze.'\n\n const candidates: Array<{ delim: string; name: string }> = [\n { delim: ',', name: 'comma' },\n { delim: '\\t', name: 'tab' },\n { delim: ';', name: 'semicolon' },\n { delim: '|', name: 'pipe' },\n { delim: ':', name: 'colon' },\n ]\n\n let best = { name: 'comma', delim: ',', score: -1, avgFields: 0 }\n\n for (const { delim, name } of candidates) {\n const counts = lines.map((l) => l.split(delim).length - 1)\n const avg = counts.reduce((a, b) => a + b, 0) / counts.length\n if (avg === 0) continue\n const fieldVariance = counts.reduce((a, b) => a + (b - avg) ** 2, 0) / counts.length\n const score = avg / (1 + fieldVariance)\n if (score > best.score) {\n best = { name, delim, score, avgFields: Number.parseFloat((avg + 1).toFixed(1)) }\n }\n }\n\n return `Detected delimiter: ${best.name} (\"${best.delim === '\\t' ? '\\\\t' : best.delim}\") — ~${best.avgFields} fields per row`\n },\n})\n"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  require("../../chunk-Ble4zEEl.js");
3
- const require_tool_registry = require("../../tool_registry-DYUYqXvo.js");
4
- const require_tool = require("../../tool-CVyZkFC7.js");
5
- const require_common = require("../../common-Cj8TaQ9U.js");
6
- const require_spooled_markdown_artifact = require("../../spooled_markdown_artifact-CALSDxIx.js");
3
+ const require_tool_registry = require("../../tool_registry-CKJPze3j.js");
4
+ const require_tool = require("../../tool-D5WGVIcI.js");
5
+ const require_common = require("../../common-DZl3ADJs.js");
6
+ const require_spooled_markdown_artifact = require("../../spooled_markdown_artifact-ClX72lek.js");
7
7
  require("../../guards.cjs");
8
8
  let _nhtio_validation = require("@nhtio/validation");
9
9
  let luxon = require("luxon");
@@ -1,7 +1,7 @@
1
- import { o as isError } from "../../tool_registry-D1pSSlsd.mjs";
2
- import { t as Tool } from "../../tool-CMhaDRNd.mjs";
3
- import { o as Retrievable } from "../../common-BT0nfCi9.mjs";
4
- import { n as SpooledJsonArtifact } from "../../spooled_markdown_artifact-Ci5UL7l4.mjs";
1
+ import { o as isError } from "../../tool_registry-791Vrjtf.mjs";
2
+ import { t as Tool } from "../../tool-wMYMVl60.mjs";
3
+ import { o as Retrievable } from "../../common-DYDUi99O.mjs";
4
+ import { n as SpooledJsonArtifact } from "../../spooled_markdown_artifact-wkrBF3oX.mjs";
5
5
  import "../../guards.mjs";
6
6
  import { validator } from "@nhtio/validation";
7
7
  import { DateTime } from "luxon";
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Battery-scoped exception constructors for the Scrapper web-extraction tool.
3
+ *
4
+ * @remarks
5
+ * Battery-scoped exception classes owned by the Scrapper tool battery (not the ADK core). Minted
6
+ * via `createException` from `@nhtio/adk/factories` and re-exported from the battery's barrel
7
+ * (`@nhtio/adk/batteries/tools/scrapper`). This file intentionally carries **no** `@module` tag:
8
+ * it is an internal sibling relative-imported by `index.ts`, so it does not mint its own
9
+ * `…/scrapper/exceptions` entrypoint (whose `exceptions` leaf basename would collide with sibling
10
+ * batteries under the `vite-plugin-dts` rolled-up `.d.ts` rule).
11
+ */
12
+ /**
13
+ * Thrown when a Scrapper factory receives invalid configuration.
14
+ *
15
+ * @remarks
16
+ * Fatal: config bugs (missing/unparseable `instanceUrl`, a bad `artifact` resolver, or an async
17
+ * resolver passed to a `*Sync` factory) fail loud at factory-call time rather than at first scrape.
18
+ */
19
+ export declare const E_INVALID_SCRAPPER_CONFIG: import("../../../factories").CreatedException<[
20
+ string
21
+ ]>;
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Factories for configured Scrapper web-extraction tools (article + links).
3
+ *
4
+ * @module @nhtio/adk/batteries/tools/scrapper
5
+ *
6
+ * @remarks
7
+ * [Scrapper](https://github.com/amerkurev/scrapper) is a self-hosted service that loads a page in a
8
+ * real headless browser and extracts either the readable article (`/api/article`) or the page's
9
+ * links (`/api/links`). It gives an agent browser-grade reading power — JS-rendered pages a
10
+ * renderless fetcher can't see — but as a **stateless** HTTP call: each request runs in a fresh
11
+ * incognito context, stores no session or credentials, and shares nothing with any other call.
12
+ *
13
+ * Like the SearXNG battery, this exports **factories** (not ready-made `Tool` constants), because a
14
+ * scrape tool needs per-deployment config (instance URL + custom auth headers). Two verbs, each with
15
+ * an async factory ({@link createScrapperArticleTool} / {@link createScrapperLinksTool}, accepting a
16
+ * dynamic-import `artifact` resolver) and a sync variant ({@link createScrapperArticleToolSync} /
17
+ * {@link createScrapperLinksToolSync}). Because these are factories, they MUST NOT be bulk-registered
18
+ * via `Object.values(batteries)` — call one, then register the returned tool.
19
+ *
20
+ * @see https://github.com/amerkurev/scrapper
21
+ */
22
+ import { type ScrapperBaseConfig } from "./shared";
23
+ import type { Tool } from "../../../forge";
24
+ import type { ArtifactResolver, SyncArtifactResolver } from "../_shared/index";
25
+ export { E_INVALID_SCRAPPER_CONFIG } from "./exceptions";
26
+ export type { ScrapperRequestContext, ScrapperResponseContext, ScrapperInputMiddlewareFn, ScrapperOutputMiddlewareFn, } from "./shared";
27
+ /** Model-facing params common to both verbs (snake_case; mapped to kebab on the wire). */
28
+ export interface ScrapperCommonParams {
29
+ /** Return a cached result when available instead of re-scraping. */
30
+ cache?: boolean;
31
+ /** Capture a screenshot; the result carries a `screenshotUri`. */
32
+ screenshot?: boolean;
33
+ /** Run in an incognito browser context (no persisted browsing data). Default true upstream. */
34
+ incognito?: boolean;
35
+ /** Browser navigation timeout in ms (`0` disables). Distinct from the tool's own fetch timeout. */
36
+ timeout?: number;
37
+ /** When navigation is considered finished. */
38
+ wait_until?: 'load' | 'domcontentloaded' | 'networkidle' | 'commit';
39
+ /** Wait this many ms after load before parsing. */
40
+ sleep?: number;
41
+ /** Scroll down N pixels for lazy-loading pages. Requires a positive `sleep`. */
42
+ scroll_down?: number;
43
+ /** Emulated device, e.g. `Desktop Chrome`. Overrides individual viewport/UA settings. */
44
+ device?: string;
45
+ /** Explicit user-agent (prefer `device`). */
46
+ user_agent?: string;
47
+ /** Extra headers the SCRAPER's browser sends to the TARGET site, `K:v;K2:v2` (NOT instance auth). */
48
+ extra_http_headers?: string;
49
+ /** Upstream proxy, e.g. `http://host:3128` or `socks5://host:1080`. */
50
+ proxy_server?: string;
51
+ }
52
+ /** Model-facing params for `/api/article`. */
53
+ export interface ScrapperArticleParams extends ScrapperCommonParams {
54
+ /** Populate `fullContent` with the page's full HTML. */
55
+ full_content?: boolean;
56
+ }
57
+ /** Model-facing params for `/api/links`. */
58
+ export interface ScrapperLinksParams extends ScrapperCommonParams {
59
+ /** Median link-text length threshold for the link parser. */
60
+ text_len_threshold?: number;
61
+ /** Median words-per-link threshold for the link parser. */
62
+ words_threshold?: number;
63
+ }
64
+ /** A normalised Scrapper article (loose/nullable upstream). */
65
+ export interface ScrapperArticle {
66
+ /** The page URL the article was extracted from. */
67
+ url?: string;
68
+ /** Article title. */
69
+ title?: string;
70
+ /** Author / byline metadata. */
71
+ byline?: string;
72
+ /** Short excerpt or description of the article. */
73
+ excerpt?: string;
74
+ /** Name of the site the article came from. */
75
+ siteName?: string;
76
+ /** Detected content language. */
77
+ lang?: string;
78
+ /** Character count of the extracted article text. */
79
+ length?: number;
80
+ /** Publication time, when the page exposed one. */
81
+ publishedTime?: string;
82
+ /** Scrapper's own date field for the result. */
83
+ date?: string;
84
+ /** Article text with HTML stripped. */
85
+ textContent?: string;
86
+ /** Processed article HTML; present when the caller requested it. */
87
+ content?: string;
88
+ /** Full page HTML; present only when `full_content` was set. */
89
+ fullContent?: string;
90
+ /** Screenshot URI; present only when `screenshot` was set. */
91
+ screenshotUri?: string;
92
+ }
93
+ /** A single link from `/api/links` (verified live: `{ url, text }`). */
94
+ export interface ScrapperLink {
95
+ /** The link's target URL. */
96
+ url?: string;
97
+ /** The link's anchor text. */
98
+ text?: string;
99
+ }
100
+ /** A normalised Scrapper links payload. */
101
+ export interface ScrapperLinks {
102
+ /** The page URL the links were collected from. */
103
+ url?: string;
104
+ /** The page title. */
105
+ title?: string;
106
+ /** The page's domain. */
107
+ domain?: string;
108
+ /** Scrapper's own date field for the result. */
109
+ date?: string;
110
+ /** The collected links, each `{ url, text }`. */
111
+ links: ScrapperLink[];
112
+ /** Screenshot URI; present only when `screenshot` was set. */
113
+ screenshotUri?: string;
114
+ }
115
+ /** Async-factory config for `/api/article` (full `artifact` resolver, incl. dynamic import). */
116
+ export type ScrapperArticleConfig = ScrapperBaseConfig<ScrapperArticleParams, ScrapperArticle, ArtifactResolver>;
117
+ /** Sync-factory config for `/api/article` (`artifact` narrowed to the sync subset). */
118
+ export type ScrapperArticleConfigSync = ScrapperBaseConfig<ScrapperArticleParams, ScrapperArticle, SyncArtifactResolver>;
119
+ /** Async-factory config for `/api/links`. */
120
+ export type ScrapperLinksConfig = ScrapperBaseConfig<ScrapperLinksParams, ScrapperLinks, ArtifactResolver>;
121
+ /** Sync-factory config for `/api/links`. */
122
+ export type ScrapperLinksConfigSync = ScrapperBaseConfig<ScrapperLinksParams, ScrapperLinks, SyncArtifactResolver>;
123
+ /**
124
+ * Create a configured Scrapper **article** {@link Tool} (async — accepts a dynamic-import `artifact`).
125
+ *
126
+ * @remarks
127
+ * Async because `artifact` may be an async / dynamic-import resolver, which must resolve to the sync
128
+ * `() => Ctor` `Tool.artifactConstructor` requires before the tool is built. For the common case,
129
+ * use {@link createScrapperArticleToolSync} and skip the `await`.
130
+ *
131
+ * @warning
132
+ * Two distinct "headers": `config.headers` authenticates to the Scrapper *instance*; the
133
+ * `extra_http_headers` *parameter* is what the scraper's browser sends to the *target site* — do not
134
+ * conflate them. Also note `scroll_down` requires a positive `sleep`, and `resultUri`/`screenshotUri`
135
+ * are instance-relative and may come back `http://` even over HTTPS — do not assume they match
136
+ * `instanceUrl`.
137
+ *
138
+ * @param config - Instance URL, instance-auth headers, output policy, `artifact` resolver,
139
+ * per-parameter disposition (`fixed`/`defaults`/`fixedQuery`), and middleware pipelines.
140
+ * @returns A promise of a `Tool` ready to register in a `ToolRegistry`.
141
+ * @throws {@link E_INVALID_SCRAPPER_CONFIG} when `instanceUrl` or `artifact` is invalid.
142
+ */
143
+ export declare const createScrapperArticleTool: (config: ScrapperArticleConfig) => Promise<Tool>;
144
+ /**
145
+ * Synchronous {@link createScrapperArticleTool} — `artifact` narrowed to the sync subset.
146
+ *
147
+ * @param config - Same as {@link createScrapperArticleTool}, with a sync-only `artifact`.
148
+ * @returns A `Tool` ready to register in a `ToolRegistry`.
149
+ * @throws {@link E_INVALID_SCRAPPER_CONFIG} when `instanceUrl` or `artifact` is invalid (incl. an async resolver).
150
+ */
151
+ export declare const createScrapperArticleToolSync: (config: ScrapperArticleConfigSync) => Tool;
152
+ /**
153
+ * Create a configured Scrapper **links** {@link Tool} (async — accepts a dynamic-import `artifact`).
154
+ *
155
+ * @remarks
156
+ * See {@link createScrapperArticleTool} for the two-headers caveat and the async rationale. Each
157
+ * `links` item is `{ url, text }`.
158
+ *
159
+ * @param config - Instance URL, instance-auth headers, output policy, `artifact` resolver,
160
+ * per-parameter disposition, and middleware pipelines.
161
+ * @returns A promise of a `Tool` ready to register in a `ToolRegistry`.
162
+ * @throws {@link E_INVALID_SCRAPPER_CONFIG} when `instanceUrl` or `artifact` is invalid.
163
+ */
164
+ export declare const createScrapperLinksTool: (config: ScrapperLinksConfig) => Promise<Tool>;
165
+ /**
166
+ * Synchronous {@link createScrapperLinksTool} — `artifact` narrowed to the sync subset.
167
+ *
168
+ * @param config - Same as {@link createScrapperLinksTool}, with a sync-only `artifact`.
169
+ * @returns A `Tool` ready to register in a `ToolRegistry`.
170
+ * @throws {@link E_INVALID_SCRAPPER_CONFIG} when `instanceUrl` or `artifact` is invalid (incl. an async resolver).
171
+ */
172
+ export declare const createScrapperLinksToolSync: (config: ScrapperLinksConfigSync) => Tool;
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Internal core shared by both Scrapper verbs (article / links).
3
+ *
4
+ * @remarks
5
+ * No `@module` tag — this is a sibling of `index.ts`, relative-imported, not its own entrypoint.
6
+ * Houses the per-parameter disposition machinery (schema building from `fixed`/`defaults`), the
7
+ * snake→kebab wire mapping, the request/response contexts, and the `fetch`+pipeline handler core.
8
+ * Generic harness helpers (artifact/header resolution, pipeline runners) come from `../_shared`.
9
+ */
10
+ import { Tool } from "../../../forge";
11
+ import { type ToolHeaders, type ToolHeadersResolver, type SpooledArtifactCtor } from "../_shared/index";
12
+ import type { Schema } from '@nhtio/validation';
13
+ import type { NextFn } from '@nhtio/middleware';
14
+ /** Throw the battery-scoped config error. */
15
+ export declare const failConfig: (reason: string) => never;
16
+ /** The wire type of a Scrapper query parameter — controls serialisation. */
17
+ export type ScrapperParamType = 'string' | 'number' | 'boolean';
18
+ /**
19
+ * One curated, model-facing Scrapper parameter: its snake_case key (used in the model schema and
20
+ * in `fixed`/`defaults`), its kebab-case wire name, its type, the base validator, and a description.
21
+ */
22
+ export interface ScrapperParamSpec {
23
+ /** snake_case key as seen by the model and in `config.fixed` / `config.defaults`. */
24
+ key: string;
25
+ /** kebab-case name sent to the Scrapper API. */
26
+ wire: string;
27
+ /** Wire type, controlling string/number/boolean serialisation. */
28
+ type: ScrapperParamType;
29
+ /** Base `@nhtio/validation` schema (no `.required()`/`.default()`/`.optional()` applied yet). */
30
+ schema: Schema;
31
+ /** Human-readable description surfaced to the model. */
32
+ description: string;
33
+ }
34
+ /**
35
+ * Build the model-facing input schema from a verb's param specs and the factory's disposition.
36
+ * `url` is always required. A `fixed` param is omitted (the model can't set it); a `defaults` param
37
+ * gets `.default(value)`; everything else is `.optional()`.
38
+ */
39
+ export declare const buildScrapperSchema: (specs: ScrapperParamSpec[], fixed: Record<string, unknown> | undefined, defaults: Record<string, unknown> | undefined, extra?: Record<string, Schema>) => Schema;
40
+ /**
41
+ * Assemble the wire-kebab query params for one request: each spec's value is `fixed` (if pinned)
42
+ * else the validated model/default value; then `fixedQuery` raw passthrough is layered on. `url`
43
+ * is handled separately (it is the search target, never pinned).
44
+ */
45
+ export declare const buildWireParams: (args: Record<string, unknown>, specs: ScrapperParamSpec[], fixed: Record<string, unknown> | undefined, fixedQuery: Record<string, string> | undefined) => Record<string, string>;
46
+ /**
47
+ * Mutable context handed to each input-pipeline stage **before** the HTTP request is sent.
48
+ * Identical for both verbs.
49
+ */
50
+ export interface ScrapperRequestContext {
51
+ /** The tool's name (read-only). */
52
+ readonly toolName: string;
53
+ /** The target page URL (the `url` argument). Mutable. */
54
+ url: string;
55
+ /** Wire-kebab query params (everything except `url`). Mutable. */
56
+ params: Record<string, string>;
57
+ /** Resolved request headers sent to the SCRAPPER INSTANCE (auth). Mutable. */
58
+ headers: ToolHeaders;
59
+ /** The Scrapper instance base URL (read-only). */
60
+ readonly instanceUrl: string;
61
+ /** Cross-stage scratch space; also carried onto the response context. */
62
+ readonly stash: Map<string, unknown>;
63
+ /** Skip the fetch and return `result` verbatim as the tool's output (e.g. a cache hit). */
64
+ shortCircuit(result: string): void;
65
+ }
66
+ /**
67
+ * Mutable context handed to each output-pipeline stage **after** the response JSON is parsed.
68
+ *
69
+ * @typeParam R - The verb's normalised result type (article object or links payload).
70
+ */
71
+ export interface ScrapperResponseContext<R> {
72
+ /** The tool's name (read-only). */
73
+ readonly toolName: string;
74
+ /** The request context as it was sent (post-input-pipeline). */
75
+ readonly request: ScrapperRequestContext;
76
+ /** The parsed Scrapper JSON body. Mutable (used when `format` is `raw`). */
77
+ raw: unknown;
78
+ /** The normalised result. Mutable — reshape, redact, enrich. */
79
+ result: R;
80
+ /** The effective payload shape for this call. */
81
+ format: 'normalized' | 'raw';
82
+ /** When set, used verbatim as the tool's output (overrides serialisation). */
83
+ output?: string;
84
+ /** Cross-stage scratch space; carried over from the request context. */
85
+ readonly stash: Map<string, unknown>;
86
+ }
87
+ /** An input-pipeline stage. Onion middleware over {@link ScrapperRequestContext}. */
88
+ export type ScrapperInputMiddlewareFn = (ctx: ScrapperRequestContext, next: NextFn) => void | Promise<void>;
89
+ /** An output-pipeline stage over a verb's {@link ScrapperResponseContext}. */
90
+ export type ScrapperOutputMiddlewareFn<R> = (ctx: ScrapperResponseContext<R>, next: NextFn) => void | Promise<void>;
91
+ /** Configuration common to every Scrapper factory. `A` is the accepted `artifact` resolver type. */
92
+ export interface ScrapperBaseConfig<P, R, A> {
93
+ /** Base URL of the Scrapper instance, e.g. `https://scrapper.example.org`. Required. */
94
+ instanceUrl: string;
95
+ /** Headers sent to the Scrapper INSTANCE for auth (X-API-Key / Basic) — static or resolver. */
96
+ headers?: ToolHeaders | ToolHeadersResolver;
97
+ /** The tool's own `fetch` AbortController timeout in ms. Default `65_000` (> Scrapper's 60s browser default). */
98
+ requestTimeoutMs?: number;
99
+ /** Output shape. `normalized`/`raw` pin it; `either` (default) exposes a `format` arg to the model. */
100
+ resultFormat?: 'normalized' | 'raw' | 'either';
101
+ /** Spool-artifact resolver for the output. Default `() => SpooledJsonArtifact`. */
102
+ artifact?: A;
103
+ /** Tool name override. */
104
+ name?: string;
105
+ /** Tool description override. */
106
+ description?: string;
107
+ /** Pinned params — sent always, removed from the model schema. */
108
+ fixed?: Partial<P>;
109
+ /** Model-overridable default param values. */
110
+ defaults?: Partial<P>;
111
+ /** Raw, un-modeled wire params (kebab keys) — always sent, never model-visible. Keeps the battery generic. */
112
+ fixedQuery?: Record<string, string>;
113
+ /** Stages run before the HTTP request. See {@link ScrapperRequestContext}. */
114
+ inputPipeline?: ScrapperInputMiddlewareFn[];
115
+ /** Stages run after the response is parsed. See {@link ScrapperResponseContext}. */
116
+ outputPipeline?: ScrapperOutputMiddlewareFn<R>[];
117
+ }
118
+ /** Verb-specific wiring passed to {@link assembleScrapperTool}. */
119
+ export interface ScrapperVerb<R> {
120
+ /** Scrapper endpoint path, e.g. `/api/article`. */
121
+ endpoint: string;
122
+ /** The curated param specs for this verb. */
123
+ specs: ScrapperParamSpec[];
124
+ /** Default tool name (`scrapper_article` / `scrapper_links`). */
125
+ defaultName: string;
126
+ /** Default tool description. */
127
+ defaultDescription: string;
128
+ /** Map a parsed Scrapper body to the verb's normalised result. */
129
+ normalize: (body: Record<string, unknown>) => R;
130
+ }
131
+ /**
132
+ * Build a configured Scrapper {@link Tool} from validated config + an already-resolved sync
133
+ * artifact constructor. Shared by every verb and by both the async and sync factories.
134
+ */
135
+ export declare const assembleScrapperTool: <P, R>(verb: ScrapperVerb<R>, config: ScrapperBaseConfig<P, R, unknown>, instanceUrl: string, artifactConstructor: () => SpooledArtifactCtor) => Tool;
136
+ /** Validate `instanceUrl` and return the trailing-slash-normalised base. */
137
+ export declare const validateScrapperInstanceUrl: (config: {
138
+ instanceUrl?: string;
139
+ }) => string;
@@ -0,0 +1,8 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../chunk-Ble4zEEl.js");
3
+ const require_scrapper = require("../../scrapper-BeweWurk.js");
4
+ exports.E_INVALID_SCRAPPER_CONFIG = require_scrapper.E_INVALID_SCRAPPER_CONFIG;
5
+ exports.createScrapperArticleTool = require_scrapper.createScrapperArticleTool;
6
+ exports.createScrapperArticleToolSync = require_scrapper.createScrapperArticleToolSync;
7
+ exports.createScrapperLinksTool = require_scrapper.createScrapperLinksTool;
8
+ exports.createScrapperLinksToolSync = require_scrapper.createScrapperLinksToolSync;
@@ -0,0 +1,2 @@
1
+ import { a as E_INVALID_SCRAPPER_CONFIG, i as createScrapperLinksToolSync, n as createScrapperArticleToolSync, r as createScrapperLinksTool, t as createScrapperArticleTool } from "../../scrapper-BHM1mCde.mjs";
2
+ export { E_INVALID_SCRAPPER_CONFIG, createScrapperArticleTool, createScrapperArticleToolSync, createScrapperLinksTool, createScrapperLinksToolSync };
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Battery-scoped exception constructors for the SearXNG search tool.
3
+ *
4
+ * @remarks
5
+ * Battery-scoped exception classes owned by the SearXNG tool battery (not the ADK core). Minted
6
+ * via `createException` from `@nhtio/adk/factories` and re-exported from the battery's barrel
7
+ * (`@nhtio/adk/batteries/tools/searxng`). This file intentionally carries **no** `@module` tag:
8
+ * it is an internal sibling relative-imported by `index.ts`, so it does not mint its own
9
+ * `…/searxng/exceptions` entrypoint (whose `exceptions` leaf basename would collide with sibling
10
+ * batteries under the `vite-plugin-dts` rolled-up `.d.ts` rule).
11
+ */
12
+ /**
13
+ * Thrown when {@link createSearxngSearchTool} receives invalid configuration.
14
+ *
15
+ * @remarks
16
+ * Fatal: config bugs (missing or unparseable `instanceUrl`) fail loud at factory-call time
17
+ * rather than at the first search.
18
+ */
19
+ export declare const E_INVALID_SEARXNG_CONFIG: import("../../../factories").CreatedException<[
20
+ string
21
+ ]>;