@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
@@ -0,0 +1,177 @@
1
+ /**
2
+ * Factory for a configured SearXNG metasearch tool.
3
+ *
4
+ * @module @nhtio/adk/batteries/tools/searxng
5
+ *
6
+ * @remarks
7
+ * Unlike the other bundled tool categories — every one of which exports a ready-made,
8
+ * stateless `Tool` constant — the SearXNG battery exports **factories**,
9
+ * {@link createSearxngSearchTool} (async) and {@link createSearxngSearchToolSync}. A search tool
10
+ * has to talk to a *specific* SearXNG instance, usually behind custom authentication, so it needs
11
+ * per-deployment configuration (a base URL and headers) that cannot be baked in at module load.
12
+ *
13
+ * Because this module exports factories rather than `Tool` instances, they MUST NOT be
14
+ * bulk-registered via `Object.values(batteries)`. Call a factory first, then register the
15
+ * returned tool: `new ToolRegistry([await createSearxngSearchTool({ instanceUrl })])`.
16
+ *
17
+ * @see https://docs.searxng.org/dev/search_api.html
18
+ */
19
+ import { Tool } from "../../../forge";
20
+ import { type ArtifactResolver, type SyncArtifactResolver } from "../_shared/index";
21
+ import type { NextFn } from '@nhtio/middleware';
22
+ export { E_INVALID_SEARXNG_CONFIG } from "./exceptions";
23
+ /** A static set of request headers (used for custom authentication). */
24
+ export type SearxngHeaders = Record<string, string>;
25
+ /**
26
+ * A resolver returning request headers, sync or async. Use this form when the auth token is
27
+ * refreshable — the resolver runs on every search, so a fresh token can be minted per call.
28
+ */
29
+ export type SearxngHeadersResolver = () => SearxngHeaders | Promise<SearxngHeaders>;
30
+ /** The output shape the tool serialises. `either` lets the model pick per call. */
31
+ export type SearxngResultFormat = 'normalized' | 'raw' | 'either';
32
+ /**
33
+ * A single normalised SearXNG result. SearXNG result items are deliberately untyped upstream,
34
+ * so every field except a best-effort `title`/`url` is optional.
35
+ */
36
+ export interface SearxngResult {
37
+ /** Result title, when the source engine provided one. */
38
+ title?: string;
39
+ /** Result URL, when the source engine provided one. */
40
+ url?: string;
41
+ /** Snippet / summary text for the result. */
42
+ content?: string;
43
+ /** The SearXNG engine that produced this result (e.g. `google`, `duckduckgo`). */
44
+ engine?: string;
45
+ /** Relevance score as reported by SearXNG (higher is more relevant). */
46
+ score?: number;
47
+ /** Publication date, when the source engine exposed one (ISO-ish string, engine-dependent). */
48
+ publishedDate?: string;
49
+ }
50
+ /**
51
+ * Mutable context handed to each input-pipeline stage **before** the HTTP request is sent.
52
+ *
53
+ * @remarks
54
+ * Stages mutate this in place (onion `(ctx, next)` style) to adjust the outgoing request —
55
+ * inject or rotate auth headers, force a language, rewrite the query — or call
56
+ * {@link SearxngRequestContext.shortCircuit} to skip the fetch entirely (e.g. a cache hit).
57
+ */
58
+ export interface SearxngRequestContext {
59
+ /** The tool's name (read-only). */
60
+ readonly toolName: string;
61
+ /** The search query. Mutable. */
62
+ query: string;
63
+ /** Extra SearXNG query parameters (`categories`, `engines`, `language`, …). Mutable. */
64
+ params: Record<string, string>;
65
+ /** Resolved request headers. Mutable — inject, redact, or rotate auth here. */
66
+ headers: SearxngHeaders;
67
+ /** The target instance base URL (read-only). */
68
+ readonly instanceUrl: string;
69
+ /** Cross-stage scratch space; also carried onto the response context. */
70
+ readonly stash: Map<string, unknown>;
71
+ /** Skip the fetch and return `result` verbatim as the tool's output. */
72
+ shortCircuit(result: string): void;
73
+ }
74
+ /**
75
+ * Mutable context handed to each output-pipeline stage **after** the response JSON is parsed.
76
+ *
77
+ * @remarks
78
+ * Stages reshape, redact, enrich, or re-rank {@link SearxngResponseContext.results}, mutate the
79
+ * raw body, or set {@link SearxngResponseContext.output} to override the serialised string
80
+ * verbatim (e.g. to render markdown that matches a markdown `artifact` resolver).
81
+ */
82
+ export interface SearxngResponseContext {
83
+ /** The tool's name (read-only). */
84
+ readonly toolName: string;
85
+ /** The request context as it was sent (post-input-pipeline). */
86
+ readonly request: SearxngRequestContext;
87
+ /** The parsed SearXNG JSON body. Mutable (used when `format` is `raw`). */
88
+ raw: unknown;
89
+ /** The normalised result list. Mutable — filter, redact, or re-rank. */
90
+ results: SearxngResult[];
91
+ /** The effective payload shape for this call. */
92
+ format: 'normalized' | 'raw';
93
+ /** When set, used verbatim as the tool's output (overrides serialisation). */
94
+ output?: string;
95
+ /** Cross-stage scratch space; carried over from the request context. */
96
+ readonly stash: Map<string, unknown>;
97
+ }
98
+ /** An input-pipeline stage. Onion middleware over {@link SearxngRequestContext}. */
99
+ export type SearxngInputMiddlewareFn = (ctx: SearxngRequestContext, next: NextFn) => void | Promise<void>;
100
+ /** An output-pipeline stage. Onion middleware over {@link SearxngResponseContext}. */
101
+ export type SearxngOutputMiddlewareFn = (ctx: SearxngResponseContext, next: NextFn) => void | Promise<void>;
102
+ /**
103
+ * Configuration for {@link createSearxngSearchTool} (async) and
104
+ * {@link createSearxngSearchToolSync} (sync — `artifact` narrowed to the sync subset).
105
+ *
106
+ * @typeParam A - The {@link ArtifactResolver} variant accepted: the full resolver (async factory)
107
+ * or the sync subset ({@link createSearxngSearchToolSync}).
108
+ */
109
+ export interface SearxngToolConfig<A = ArtifactResolver> {
110
+ /** Base URL of the SearXNG instance, e.g. `https://searx.example.org`. Required. */
111
+ instanceUrl: string;
112
+ /** Custom request headers — a static object or a (sync/async) resolver for refreshable auth. */
113
+ headers?: SearxngHeaders | SearxngHeadersResolver;
114
+ /** Request timeout in milliseconds. Default `10_000`. */
115
+ timeout?: number;
116
+ /**
117
+ * Output shape. `normalized`/`raw` pin the shape (the model cannot change it); `either`
118
+ * (default) exposes a `format` argument so the model chooses per call.
119
+ */
120
+ resultFormat?: SearxngResultFormat;
121
+ /** Tool name. Default `searxng_search`. */
122
+ name?: string;
123
+ /** Tool description override. */
124
+ description?: string;
125
+ /**
126
+ * Spool-artifact resolver for the tool's output. Default `() => SpooledJsonArtifact`. Accepts a
127
+ * constructor, a sync resolver, or — via {@link createSearxngSearchTool} — an async /
128
+ * dynamic-import resolver. Pass `() => SpooledMarkdownArtifact` (paired with an output stage that
129
+ * renders markdown into `ctx.output`) or `() => SpooledArtifact` for plain text.
130
+ */
131
+ artifact?: A;
132
+ /** Stages run before the HTTP request. See {@link SearxngRequestContext}. */
133
+ inputPipeline?: SearxngInputMiddlewareFn[];
134
+ /** Stages run after the response is parsed. See {@link SearxngResponseContext}. */
135
+ outputPipeline?: SearxngOutputMiddlewareFn[];
136
+ }
137
+ /**
138
+ * Create a configured SearXNG search {@link Tool} (async — accepts a dynamic-import `artifact`).
139
+ *
140
+ * @remarks
141
+ * Async because `artifact` may be an async / dynamic-import resolver, which must be resolved to the
142
+ * sync `() => Ctor` that `Tool.artifactConstructor` requires before the tool is built (the
143
+ * wrap-site invokes it synchronously). For the common case where you reference the artifact class
144
+ * directly, use {@link createSearxngSearchToolSync} and skip the `await`.
145
+ *
146
+ * The handler always requests `format=json`. Note that SearXNG ships with JSON output
147
+ * **disabled** by default (it is abused by bots); an instance that has not enabled
148
+ * `search.formats: [json]` in its `settings.yml` answers with HTTP 403, which the tool returns
149
+ * as a graceful `Error:` string naming the setting.
150
+ *
151
+ * @warning
152
+ * Do not trust the `number_of_results` field for a result count — SearXNG frequently reports `0`
153
+ * in JSON output even when `results` is non-empty. This is a long-standing upstream quirk, not a
154
+ * tool defect (see {@link https://github.com/searxng/searxng/issues/2987 | searxng#2987} and
155
+ * {@link https://github.com/searxng/searxng/issues/2457 | searxng#2457}). The tool passes the
156
+ * field through verbatim; use `results.length` as the authoritative count.
157
+ *
158
+ * @param config - The instance URL, optional custom headers, output-format policy, `artifact`
159
+ * resolver, and input/output middleware pipelines. See {@link SearxngToolConfig}.
160
+ * @returns A promise of a `Tool` ready to register in a `ToolRegistry`.
161
+ * @throws {@link E_INVALID_SEARXNG_CONFIG} when `instanceUrl` or `artifact` is invalid.
162
+ */
163
+ export declare const createSearxngSearchTool: (config: SearxngToolConfig<ArtifactResolver>) => Promise<Tool>;
164
+ /**
165
+ * Synchronous {@link createSearxngSearchTool} — the ergonomic common path.
166
+ *
167
+ * @remarks
168
+ * `artifact` is narrowed to the sync subset (a constructor or a sync resolver). Passing an async
169
+ * resolver is a compile-time type error and a runtime {@link E_INVALID_SEARXNG_CONFIG}; for
170
+ * dynamic-import resolvers use the async {@link createSearxngSearchTool}. See its docs for the
171
+ * `number_of_results` caveat and 403/JSON-disabled behaviour.
172
+ *
173
+ * @param config - Same as {@link SearxngToolConfig}, with `artifact` restricted to the sync subset.
174
+ * @returns A `Tool` ready to register in a `ToolRegistry`.
175
+ * @throws {@link E_INVALID_SEARXNG_CONFIG} when `instanceUrl` or `artifact` is invalid (incl. an async resolver).
176
+ */
177
+ export declare const createSearxngSearchToolSync: (config: SearxngToolConfig<SyncArtifactResolver>) => Tool;
@@ -0,0 +1,6 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../chunk-Ble4zEEl.js");
3
+ const require_searxng = require("../../searxng-B_D--V5q.js");
4
+ exports.E_INVALID_SEARXNG_CONFIG = require_searxng.E_INVALID_SEARXNG_CONFIG;
5
+ exports.createSearxngSearchTool = require_searxng.createSearxngSearchTool;
6
+ exports.createSearxngSearchToolSync = require_searxng.createSearxngSearchToolSync;
@@ -0,0 +1,2 @@
1
+ import { n as createSearxngSearchToolSync, r as E_INVALID_SEARXNG_CONFIG, t as createSearxngSearchTool } from "../../searxng-BJFulNcK.mjs";
2
+ export { E_INVALID_SEARXNG_CONFIG, createSearxngSearchTool, createSearxngSearchToolSync };
@@ -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
- 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
  //#region src/batteries/tools/standing_instructions/index.ts
@@ -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
  //#region src/batteries/tools/standing_instructions/index.ts
@@ -1,10 +1,11 @@
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
- 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
+ const require_lib_helpers_bignum = require("../../lib/helpers/bignum.cjs");
8
9
  let _nhtio_validation = require("@nhtio/validation");
9
10
  let simple_statistics = require("simple-statistics");
10
11
  //#region src/batteries/tools/statistics/index.ts
@@ -17,18 +18,24 @@ let simple_statistics = require("simple-statistics");
17
18
  * Pre-constructed bundled tools for the `statistics` category. Import individually, the whole
18
19
  * category, or import every tool via `@nhtio/adk/batteries`.
19
20
  */
21
+ /**
22
+ * Normalise the `numbers`/`x`/`y` input to a `number[]`.
23
+ *
24
+ * @remarks
25
+ * The input schema is `validator.array().items(validator.number())`, which already rejects
26
+ * `NaN`, `±Infinity`, and magnitudes `> Number.MAX_SAFE_INTEGER` before the handler runs — so by
27
+ * the time a value reaches here it is a finite, in-range float64. This guard only enforces
28
+ * non-emptiness (and defensively re-checks the array shape). It deliberately NO LONGER silently
29
+ * drops non-finite entries: those can't arrive through the typed schema, and a silent filter hid
30
+ * real input errors.
31
+ */
20
32
  function parseNumbers(input) {
21
- let arr = input;
22
- if (typeof input === "string") try {
23
- arr = JSON.parse(input);
24
- } catch {
25
- return { error: "Invalid JSON — expected an array of numbers." };
26
- }
27
- if (!Array.isArray(arr)) return { error: "Input must be a JSON array of numbers." };
28
- const nums = arr.filter((v) => typeof v === "number" && Number.isFinite(v));
29
- if (nums.length === 0) return { error: "No finite numbers found in the array." };
30
- return nums;
33
+ if (!Array.isArray(input)) return { error: "Input must be an array of numbers." };
34
+ if (input.length === 0) return { error: "Array must contain at least one number." };
35
+ return input;
31
36
  }
37
+ /** Shared `precision` schema fragment (significant digits for numeric output, default 8). */
38
+ var precisionField = _nhtio_validation.validator.number().default(8).description(`Significant digits for numeric output (default: 8).`);
32
39
  /**
33
40
  * Compute descriptive statistics for a JSON array of numbers.
34
41
  *
@@ -40,25 +47,29 @@ function parseNumbers(input) {
40
47
  var statsDescribeTool = new require_tool.Tool({
41
48
  name: "stats_describe",
42
49
  description: "Compute descriptive statistics for a numeric array: count, sum, min, max, range, mean, median, mode, variance, standard deviation, quartiles (Q1–Q3), IQR, and key percentiles.",
43
- inputSchema: _nhtio_validation.validator.object({ numbers: _nhtio_validation.validator.string().required().description("JSON array of numbers") }),
50
+ inputSchema: _nhtio_validation.validator.object({
51
+ numbers: _nhtio_validation.validator.array().items(_nhtio_validation.validator.number()).required().description("Array of numbers"),
52
+ precision: precisionField
53
+ }),
44
54
  artifactConstructor: () => require_spooled_markdown_artifact.SpooledJsonArtifact,
45
55
  handler: async (args) => {
46
- const { numbers } = args;
56
+ const { numbers, precision } = args;
47
57
  const nums = parseNumbers(numbers);
48
58
  if ("error" in nums) return `Error: ${nums.error}`;
49
59
  const sorted = [...nums].sort((a, b) => a - b);
50
60
  const modeVal = (0, simple_statistics.mode)(nums);
61
+ const fmt = (n) => require_lib_helpers_bignum.formatBig(n, precision);
51
62
  return JSON.stringify({
52
63
  count: nums.length,
53
- sum: Number.parseFloat((0, simple_statistics.sum)(nums).toPrecision(12)),
64
+ sum: require_lib_helpers_bignum.formatBig(require_lib_helpers_bignum.bigSum(nums), precision),
54
65
  min: (0, simple_statistics.min)(nums),
55
66
  max: (0, simple_statistics.max)(nums),
56
67
  range: (0, simple_statistics.max)(nums) - (0, simple_statistics.min)(nums),
57
- mean: Number.parseFloat((0, simple_statistics.mean)(nums).toPrecision(10)),
68
+ mean: require_lib_helpers_bignum.formatBig(require_lib_helpers_bignum.bigMean(nums), precision),
58
69
  median: (0, simple_statistics.median)(nums),
59
70
  mode: modeVal,
60
- variance: Number.parseFloat((0, simple_statistics.variance)(nums).toPrecision(8)),
61
- std_dev: Number.parseFloat((0, simple_statistics.standardDeviation)(nums).toPrecision(8)),
71
+ variance: fmt((0, simple_statistics.variance)(nums)),
72
+ std_dev: fmt((0, simple_statistics.standardDeviation)(nums)),
62
73
  q1: (0, simple_statistics.quantile)(sorted, .25),
63
74
  q2: (0, simple_statistics.quantile)(sorted, .5),
64
75
  q3: (0, simple_statistics.quantile)(sorted, .75),
@@ -81,8 +92,8 @@ var statsCorrelateTool = new require_tool.Tool({
81
92
  name: "stats_correlate",
82
93
  description: "Compute the Pearson correlation coefficient between two numeric arrays. Returns the r value (-1 to 1), r², and a plain-English interpretation.",
83
94
  inputSchema: _nhtio_validation.validator.object({
84
- x: _nhtio_validation.validator.string().required().description("JSON array of numbers (first variable)"),
85
- y: _nhtio_validation.validator.string().required().description("JSON array of numbers (second variable, same length as x)")
95
+ x: _nhtio_validation.validator.array().items(_nhtio_validation.validator.number()).required().description("Array of numbers (first variable)"),
96
+ y: _nhtio_validation.validator.array().items(_nhtio_validation.validator.number()).required().description("Array of numbers (second variable, same length as x)")
86
97
  }),
87
98
  handler: async (args) => {
88
99
  const { x: rawX, y: rawY } = args;
@@ -92,6 +103,7 @@ var statsCorrelateTool = new require_tool.Tool({
92
103
  if ("error" in y) return `Error in y: ${y.error}`;
93
104
  if (x.length !== y.length) return `Error: Arrays must be the same length (x: ${x.length}, y: ${y.length}).`;
94
105
  if (x.length < 2) return "Error: At least 2 data points required.";
106
+ if ((0, simple_statistics.standardDeviation)(x) === 0 || (0, simple_statistics.standardDeviation)(y) === 0) return "Correlation is undefined: at least one variable is constant (zero variance), so Pearson r cannot be computed.";
95
107
  try {
96
108
  const r = (0, simple_statistics.sampleCorrelation)(x, y);
97
109
  const absR = Math.abs(r);
@@ -116,47 +128,45 @@ var statsTransformTool = new require_tool.Tool({
116
128
  name: "stats_transform",
117
129
  description: "Transform a numeric array: normalize (min-max or z-score), compute running totals, rolling averages, percent change between consecutive values, rank each value, or detect outliers.",
118
130
  inputSchema: _nhtio_validation.validator.object({
119
- numbers: _nhtio_validation.validator.string().required().description("JSON array of numbers"),
131
+ numbers: _nhtio_validation.validator.array().items(_nhtio_validation.validator.number()).required().description("Array of numbers"),
120
132
  operation: _nhtio_validation.validator.string().valid("normalize_min_max", "normalize_z_score", "normalize_percent_of_sum", "running_total", "rolling_avg", "pct_change", "rank", "outliers_iqr", "outliers_zscore").required().description("Transformation to apply"),
121
133
  window: _nhtio_validation.validator.number().default(3).description("For rolling_avg: window size (default: 3)"),
122
- threshold: _nhtio_validation.validator.number().default(3).description("For outliers_zscore: z-score threshold (default: 3.0)")
134
+ threshold: _nhtio_validation.validator.number().default(3).description("For outliers_zscore: z-score threshold (default: 3.0)"),
135
+ precision: precisionField
123
136
  }),
124
137
  handler: async (args) => {
125
- const { numbers, operation, window, threshold } = args;
138
+ const { numbers, operation, window, threshold, precision } = args;
126
139
  const nums = parseNumbers(numbers);
127
140
  if ("error" in nums) return `Error: ${nums.error}`;
141
+ const round = (n) => Number.parseFloat(require_lib_helpers_bignum.formatBig(n, precision));
128
142
  switch (operation) {
129
143
  case "normalize_min_max": {
130
144
  const lo = (0, simple_statistics.min)(nums);
131
145
  const hi = (0, simple_statistics.max)(nums);
132
146
  if (lo === hi) return JSON.stringify(nums.map(() => 0));
133
- return JSON.stringify(nums.map((v) => Number.parseFloat(((v - lo) / (hi - lo)).toFixed(8))));
147
+ return JSON.stringify(nums.map((v) => round((v - lo) / (hi - lo))));
134
148
  }
135
149
  case "normalize_z_score": {
136
150
  const m = (0, simple_statistics.mean)(nums);
137
151
  const sd = (0, simple_statistics.standardDeviation)(nums);
138
152
  if (sd === 0) return JSON.stringify(nums.map(() => 0));
139
- return JSON.stringify(nums.map((v) => Number.parseFloat((0, simple_statistics.zScore)(v, m, sd).toFixed(8))));
153
+ return JSON.stringify(nums.map((v) => round((0, simple_statistics.zScore)(v, m, sd))));
140
154
  }
141
155
  case "normalize_percent_of_sum": {
142
156
  const total = (0, simple_statistics.sum)(nums);
143
157
  if (total === 0) return JSON.stringify(nums.map(() => 0));
144
- return JSON.stringify(nums.map((v) => Number.parseFloat((v / total * 100).toFixed(4))));
145
- }
146
- case "running_total": {
147
- const totals = [];
148
- let acc = 0;
149
- for (const v of nums) {
150
- acc += v;
151
- totals.push(Number.parseFloat(acc.toPrecision(12)));
152
- }
153
- return JSON.stringify(totals);
158
+ return JSON.stringify(nums.map((v) => round(v / total * 100)));
154
159
  }
160
+ case "running_total": return JSON.stringify(nums.map((_, i) => {
161
+ const big = require_lib_helpers_bignum.bigSum(nums.slice(0, i + 1));
162
+ const asNum = require_lib_helpers_bignum.bigToNumber(big);
163
+ if (Number.isFinite(asNum) && Math.abs(asNum) <= Number.MAX_SAFE_INTEGER) return round(asNum);
164
+ return require_lib_helpers_bignum.formatBig(big, precision);
165
+ }));
155
166
  case "rolling_avg": {
156
167
  const w = Math.max(1, Math.floor(window));
157
168
  return JSON.stringify(nums.map((_, i) => {
158
- const slice = nums.slice(Math.max(0, i - w + 1), i + 1);
159
- return Number.parseFloat((0, simple_statistics.mean)(slice).toPrecision(8));
169
+ return round((0, simple_statistics.mean)(nums.slice(Math.max(0, i - w + 1), i + 1)));
160
170
  }));
161
171
  }
162
172
  case "pct_change": {
@@ -210,11 +220,12 @@ var statsHistogramTool = new require_tool.Tool({
210
220
  name: "stats_histogram",
211
221
  description: "Bin a numeric array into equal-width histogram buckets and display counts.",
212
222
  inputSchema: _nhtio_validation.validator.object({
213
- numbers: _nhtio_validation.validator.string().required().description("JSON array of numbers"),
214
- bins: _nhtio_validation.validator.number().default(10).description("Number of bins (default: 10, max: 100)")
223
+ numbers: _nhtio_validation.validator.array().items(_nhtio_validation.validator.number()).required().description("Array of numbers"),
224
+ bins: _nhtio_validation.validator.number().default(10).description("Number of bins (default: 10, max: 100)"),
225
+ precision: precisionField
215
226
  }),
216
227
  handler: async (args) => {
217
- const { numbers, bins } = args;
228
+ const { numbers, bins, precision } = args;
218
229
  const nums = parseNumbers(numbers);
219
230
  if ("error" in nums) return `Error: ${nums.error}`;
220
231
  const binCount = Math.max(2, Math.min(100, Math.floor(bins)));
@@ -235,7 +246,7 @@ var statsHistogramTool = new require_tool.Tool({
235
246
  const count = nums.filter((v) => isLast ? v >= breaks[i] && v <= breaks[i + 1] : v >= breaks[i] && v < breaks[i + 1]).length;
236
247
  const pct = (count / nums.length * 100).toFixed(1);
237
248
  const bar = "█".repeat(maxCount > 0 ? Math.round(count / maxCount * 20) : 0);
238
- const range = `[${breaks[i].toPrecision(4)}, ${breaks[i + 1].toPrecision(4)}${isLast ? "]" : ")"}`;
249
+ const range = `[${require_lib_helpers_bignum.formatBig(breaks[i], precision)}, ${require_lib_helpers_bignum.formatBig(breaks[i + 1], precision)}${isLast ? "]" : ")"}`;
239
250
  rows.push(`${range.padEnd(22)} ${String(count).padStart(4)} (${pct.padStart(5)}%) ${bar}`);
240
251
  }
241
252
  return rows.join("\n");
@@ -1 +1 @@
1
- {"version":3,"file":"statistics.cjs","names":[],"sources":["../../../src/batteries/tools/statistics/index.ts"],"sourcesContent":["/**\n * Pre-constructed tools for descriptive statistics, correlation, quantiles, and numeric summaries.\n *\n * @module @nhtio/adk/batteries/tools/statistics\n *\n * @remarks\n * Pre-constructed bundled tools for the `statistics` category. Import individually, the whole\n * category, or import every tool via `@nhtio/adk/batteries`.\n */\n\nimport { isError } from '@nhtio/adk/guards'\nimport { validator } from '@nhtio/validation'\nimport { Tool, SpooledJsonArtifact } from '@nhtio/adk/common'\nimport {\n equalIntervalBreaks,\n interquartileRange,\n max,\n mean,\n median,\n min,\n mode,\n quantile,\n sampleCorrelation,\n standardDeviation,\n sum,\n variance,\n zScore,\n} from 'simple-statistics'\n\nfunction parseNumbers(input: unknown): number[] | { error: string } {\n let arr: unknown = input\n if (typeof input === 'string') {\n try {\n arr = JSON.parse(input)\n } catch {\n return { error: 'Invalid JSON — expected an array of numbers.' }\n }\n }\n if (!Array.isArray(arr)) return { error: 'Input must be a JSON array of numbers.' }\n const nums = (arr as unknown[]).filter(\n (v): v is number => typeof v === 'number' && Number.isFinite(v)\n )\n if (nums.length === 0) return { error: 'No finite numbers found in the array.' }\n return nums\n}\n\n/**\n * Compute descriptive statistics for a JSON array of numbers.\n *\n * @remarks\n * Returns count, sum, min/max/range, mean, median, mode, variance, standard deviation,\n * quartiles (Q1/Q2/Q3), IQR, and key percentiles (P10/P90/P95/P99) as a pretty-printed JSON\n * object. Non-numeric and non-finite entries are silently filtered.\n */\nexport const statsDescribeTool = new Tool({\n name: 'stats_describe',\n description:\n 'Compute descriptive statistics for a numeric array: count, sum, min, max, range, mean, median, mode, variance, standard deviation, quartiles (Q1–Q3), IQR, and key percentiles.',\n inputSchema: validator.object({\n numbers: validator.string().required().description('JSON array of numbers'),\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args) => {\n const { numbers } = args as { numbers: string }\n const nums = parseNumbers(numbers)\n if ('error' in nums) return `Error: ${nums.error}`\n\n const sorted = [...nums].sort((a, b) => a - b)\n const modeVal = mode(nums)\n\n return JSON.stringify(\n {\n count: nums.length,\n sum: Number.parseFloat(sum(nums).toPrecision(12)),\n min: min(nums),\n max: max(nums),\n range: max(nums) - min(nums),\n mean: Number.parseFloat(mean(nums).toPrecision(10)),\n median: median(nums),\n mode: modeVal,\n variance: Number.parseFloat(variance(nums).toPrecision(8)),\n std_dev: Number.parseFloat(standardDeviation(nums).toPrecision(8)),\n q1: quantile(sorted, 0.25),\n q2: quantile(sorted, 0.5),\n q3: quantile(sorted, 0.75),\n iqr: interquartileRange(nums),\n p10: quantile(sorted, 0.1),\n p90: quantile(sorted, 0.9),\n p95: quantile(sorted, 0.95),\n p99: quantile(sorted, 0.99),\n },\n null,\n 2\n )\n },\n})\n\n/**\n * Compute the Pearson correlation coefficient between two numeric arrays.\n *\n * @remarks\n * Returns `r`, `r²` (as a percentage of explained variance), and a plain-English interpretation\n * of strength and direction. Arrays must be the same length and contain at least two points.\n */\nexport const statsCorrelateTool = new Tool({\n name: 'stats_correlate',\n description:\n 'Compute the Pearson correlation coefficient between two numeric arrays. Returns the r value (-1 to 1), r², and a plain-English interpretation.',\n inputSchema: validator.object({\n x: validator.string().required().description('JSON array of numbers (first variable)'),\n y: validator\n .string()\n .required()\n .description('JSON array of numbers (second variable, same length as x)'),\n }),\n handler: async (args) => {\n const { x: rawX, y: rawY } = args as { x: string; y: string }\n const x = parseNumbers(rawX)\n if ('error' in x) return `Error in x: ${x.error}`\n const y = parseNumbers(rawY)\n if ('error' in y) return `Error in y: ${y.error}`\n\n if (x.length !== y.length)\n return `Error: Arrays must be the same length (x: ${x.length}, y: ${y.length}).`\n if (x.length < 2) return 'Error: At least 2 data points required.'\n\n try {\n const r = sampleCorrelation(x, y)\n const absR = Math.abs(r)\n const direction = r > 0 ? 'positive' : r < 0 ? 'negative' : 'no'\n const strength =\n absR >= 0.9\n ? 'very strong'\n : absR >= 0.7\n ? 'strong'\n : absR >= 0.5\n ? 'moderate'\n : absR >= 0.3\n ? 'weak'\n : 'very weak / negligible'\n return `r = ${r.toFixed(6)}\\nr² = ${(r * r * 100).toFixed(2)}% (explained variance)\\nInterpretation: ${strength} ${direction} correlation`\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Transform a numeric array — normalise, smooth, rank, or detect outliers.\n *\n * @remarks\n * Supported operations: `normalize_min_max`, `normalize_z_score`, `normalize_percent_of_sum`,\n * `running_total`, `rolling_avg`, `pct_change`, `rank`, `outliers_iqr`, `outliers_zscore`. Most\n * operations return a JSON array of transformed values; outlier operations return a\n * human-readable report.\n */\nexport const statsTransformTool = new Tool({\n name: 'stats_transform',\n description:\n 'Transform a numeric array: normalize (min-max or z-score), compute running totals, rolling averages, percent change between consecutive values, rank each value, or detect outliers.',\n inputSchema: validator.object({\n numbers: validator.string().required().description('JSON array of numbers'),\n operation: validator\n .string()\n .valid(\n 'normalize_min_max',\n 'normalize_z_score',\n 'normalize_percent_of_sum',\n 'running_total',\n 'rolling_avg',\n 'pct_change',\n 'rank',\n 'outliers_iqr',\n 'outliers_zscore'\n )\n .required()\n .description('Transformation to apply'),\n window: validator.number().default(3).description('For rolling_avg: window size (default: 3)'),\n threshold: validator\n .number()\n .default(3.0)\n .description('For outliers_zscore: z-score threshold (default: 3.0)'),\n }),\n handler: async (args) => {\n const { numbers, operation, window, threshold } = args as {\n numbers: string\n operation: string\n window: number\n threshold: number\n }\n const nums = parseNumbers(numbers)\n if ('error' in nums) return `Error: ${nums.error}`\n\n switch (operation) {\n case 'normalize_min_max': {\n const lo = min(nums)\n const hi = max(nums)\n if (lo === hi) return JSON.stringify(nums.map(() => 0))\n return JSON.stringify(nums.map((v) => Number.parseFloat(((v - lo) / (hi - lo)).toFixed(8))))\n }\n\n case 'normalize_z_score': {\n const m = mean(nums)\n const sd = standardDeviation(nums)\n if (sd === 0) return JSON.stringify(nums.map(() => 0))\n return JSON.stringify(nums.map((v) => Number.parseFloat(zScore(v, m, sd).toFixed(8))))\n }\n\n case 'normalize_percent_of_sum': {\n const total = sum(nums)\n if (total === 0) return JSON.stringify(nums.map(() => 0))\n return JSON.stringify(nums.map((v) => Number.parseFloat(((v / total) * 100).toFixed(4))))\n }\n\n case 'running_total': {\n const totals: number[] = []\n let acc = 0\n for (const v of nums) {\n acc += v\n totals.push(Number.parseFloat(acc.toPrecision(12)))\n }\n return JSON.stringify(totals)\n }\n\n case 'rolling_avg': {\n const w = Math.max(1, Math.floor(window))\n return JSON.stringify(\n nums.map((_, i) => {\n const slice = nums.slice(Math.max(0, i - w + 1), i + 1)\n return Number.parseFloat(mean(slice).toPrecision(8))\n })\n )\n }\n\n case 'pct_change': {\n const changes: (number | null)[] = [null]\n for (let i = 1; i < nums.length; i++) {\n if (nums[i - 1] === 0) {\n changes.push(null)\n } else {\n changes.push(\n Number.parseFloat(\n (((nums[i] - nums[i - 1]) / Math.abs(nums[i - 1])) * 100).toFixed(4)\n )\n )\n }\n }\n return JSON.stringify(changes)\n }\n\n case 'rank': {\n const sorted = [...nums].sort((a, b) => a - b)\n return JSON.stringify(nums.map((v) => sorted.indexOf(v) + 1))\n }\n\n case 'outliers_iqr': {\n const sorted = [...nums].sort((a, b) => a - b)\n const q1 = quantile(sorted, 0.25)\n const q3 = quantile(sorted, 0.75)\n const iqr = q3 - q1\n const lo = q1 - 1.5 * iqr\n const hi = q3 + 1.5 * iqr\n const outliers = nums\n .map((v, i) => ({ index: i, value: v }))\n .filter(({ value }) => value < lo || value > hi)\n if (outliers.length === 0) return 'No outliers detected (IQR method).'\n return `${outliers.length} outlier(s) detected:\\n${outliers.map((o) => ` [${o.index}] = ${o.value}`).join('\\n')}`\n }\n\n case 'outliers_zscore': {\n const m = mean(nums)\n const sd = standardDeviation(nums)\n const outliers = nums\n .map((v, i) => ({ index: i, value: v, z: sd === 0 ? 0 : Math.abs(zScore(v, m, sd)) }))\n .filter((o) => o.z > threshold)\n if (outliers.length === 0) return `No outliers detected (|z| > ${threshold}).`\n return `${outliers.length} outlier(s) detected (|z| > ${threshold}):\\n${outliers.map((o) => ` [${o.index}] = ${o.value} (z = ${o.z.toFixed(3)})`).join('\\n')}`\n }\n\n default:\n return `Error: Unknown operation \"${operation}\".`\n }\n },\n})\n\n/**\n * Bin a numeric array into equal-width histogram buckets.\n *\n * @remarks\n * Output is a text histogram showing each bin's range, count, percentage of total, and a bar\n * chart. The last bin is inclusive on both ends; preceding bins are half-open. `bins` is clamped\n * to `[2, 100]`.\n */\nexport const statsHistogramTool = new Tool({\n name: 'stats_histogram',\n description: 'Bin a numeric array into equal-width histogram buckets and display counts.',\n inputSchema: validator.object({\n numbers: validator.string().required().description('JSON array of numbers'),\n bins: validator.number().default(10).description('Number of bins (default: 10, max: 100)'),\n }),\n handler: async (args) => {\n const { numbers, bins } = args as { numbers: string; bins: number }\n const nums = parseNumbers(numbers)\n if ('error' in nums) return `Error: ${nums.error}`\n\n const binCount = Math.max(2, Math.min(100, Math.floor(bins)))\n\n try {\n const breaks = equalIntervalBreaks(nums, binCount)\n const rows: string[] = []\n const maxCount = (() => {\n let m = 0\n for (let i = 0; i < breaks.length - 1; i++) {\n const isLast = i === breaks.length - 2\n const count = nums.filter((v) =>\n isLast ? v >= breaks[i] && v <= breaks[i + 1] : v >= breaks[i] && v < breaks[i + 1]\n ).length\n if (count > m) m = count\n }\n return m\n })()\n\n for (let i = 0; i < breaks.length - 1; i++) {\n const isLast = i === breaks.length - 2\n const count = nums.filter((v) =>\n isLast ? v >= breaks[i] && v <= breaks[i + 1] : v >= breaks[i] && v < breaks[i + 1]\n ).length\n const pct = ((count / nums.length) * 100).toFixed(1)\n const bar = '█'.repeat(maxCount > 0 ? Math.round((count / maxCount) * 20) : 0)\n const range = `[${breaks[i].toPrecision(4)}, ${breaks[i + 1].toPrecision(4)}${isLast ? ']' : ')'}`\n rows.push(`${range.padEnd(22)} ${String(count).padStart(4)} (${pct.padStart(5)}%) ${bar}`)\n }\n\n return rows.join('\\n')\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"statistics.cjs","names":[],"sources":["../../../src/batteries/tools/statistics/index.ts"],"sourcesContent":["/**\n * Pre-constructed tools for descriptive statistics, correlation, quantiles, and numeric summaries.\n *\n * @module @nhtio/adk/batteries/tools/statistics\n *\n * @remarks\n * Pre-constructed bundled tools for the `statistics` category. Import individually, the whole\n * category, or import every tool via `@nhtio/adk/batteries`.\n */\n\nimport { isError } from '@nhtio/adk/guards'\nimport { validator } from '@nhtio/validation'\nimport { Tool, SpooledJsonArtifact } from '@nhtio/adk/common'\nimport {\n bigSum,\n bigMean,\n formatBig,\n bigToNumber,\n DEFAULT_PRECISION,\n} from '@nhtio/adk/lib/helpers/bignum'\nimport {\n equalIntervalBreaks,\n interquartileRange,\n max,\n mean,\n median,\n min,\n mode,\n quantile,\n sampleCorrelation,\n standardDeviation,\n sum,\n variance,\n zScore,\n} from 'simple-statistics'\n\n/**\n * Normalise the `numbers`/`x`/`y` input to a `number[]`.\n *\n * @remarks\n * The input schema is `validator.array().items(validator.number())`, which already rejects\n * `NaN`, `±Infinity`, and magnitudes `> Number.MAX_SAFE_INTEGER` before the handler runs — so by\n * the time a value reaches here it is a finite, in-range float64. This guard only enforces\n * non-emptiness (and defensively re-checks the array shape). It deliberately NO LONGER silently\n * drops non-finite entries: those can't arrive through the typed schema, and a silent filter hid\n * real input errors.\n */\nfunction parseNumbers(input: unknown): number[] | { error: string } {\n if (!Array.isArray(input)) return { error: 'Input must be an array of numbers.' }\n if (input.length === 0) return { error: 'Array must contain at least one number.' }\n return input as number[]\n}\n\n/** Shared `precision` schema fragment (significant digits for numeric output, default 8). */\nconst precisionField = validator\n .number()\n .default(DEFAULT_PRECISION)\n .description(`Significant digits for numeric output (default: ${DEFAULT_PRECISION}).`)\n\n/**\n * Compute descriptive statistics for a JSON array of numbers.\n *\n * @remarks\n * Returns count, sum, min/max/range, mean, median, mode, variance, standard deviation,\n * quartiles (Q1/Q2/Q3), IQR, and key percentiles (P10/P90/P95/P99) as a pretty-printed JSON\n * object. Non-numeric and non-finite entries are silently filtered.\n */\nexport const statsDescribeTool = new Tool({\n name: 'stats_describe',\n description:\n 'Compute descriptive statistics for a numeric array: count, sum, min, max, range, mean, median, mode, variance, standard deviation, quartiles (Q1–Q3), IQR, and key percentiles.',\n inputSchema: validator.object({\n numbers: validator.array().items(validator.number()).required().description('Array of numbers'),\n precision: precisionField,\n }),\n artifactConstructor: () => SpooledJsonArtifact,\n handler: async (args) => {\n const { numbers, precision } = args as { numbers: number[]; precision: number }\n const nums = parseNumbers(numbers)\n if ('error' in nums) return `Error: ${nums.error}`\n\n const sorted = [...nums].sort((a, b) => a - b)\n const modeVal = mode(nums)\n // Computed aggregates (sum/mean/variance/std_dev) are emitted as `precision`-significant-digit\n // STRINGS via BigNumber: this is lossless (no toPrecision round-trip) and overflow-safe (a sum\n // exceeding float64 stays exact, e.g. 2e308 instead of Infinity). Order statistics\n // (min/max/median/quartiles/range) are always input elements or midpoints — in-range by\n // construction — so they remain numbers.\n const fmt = (n: number): string => formatBig(n, precision)\n\n return JSON.stringify(\n {\n count: nums.length,\n sum: formatBig(bigSum(nums), precision),\n min: min(nums),\n max: max(nums),\n range: max(nums) - min(nums),\n mean: formatBig(bigMean(nums), precision),\n median: median(nums),\n mode: modeVal,\n variance: fmt(variance(nums)),\n std_dev: fmt(standardDeviation(nums)),\n q1: quantile(sorted, 0.25),\n q2: quantile(sorted, 0.5),\n q3: quantile(sorted, 0.75),\n iqr: interquartileRange(nums),\n p10: quantile(sorted, 0.1),\n p90: quantile(sorted, 0.9),\n p95: quantile(sorted, 0.95),\n p99: quantile(sorted, 0.99),\n },\n null,\n 2\n )\n },\n})\n\n/**\n * Compute the Pearson correlation coefficient between two numeric arrays.\n *\n * @remarks\n * Returns `r`, `r²` (as a percentage of explained variance), and a plain-English interpretation\n * of strength and direction. Arrays must be the same length and contain at least two points.\n */\nexport const statsCorrelateTool = new Tool({\n name: 'stats_correlate',\n description:\n 'Compute the Pearson correlation coefficient between two numeric arrays. Returns the r value (-1 to 1), r², and a plain-English interpretation.',\n inputSchema: validator.object({\n x: validator\n .array()\n .items(validator.number())\n .required()\n .description('Array of numbers (first variable)'),\n y: validator\n .array()\n .items(validator.number())\n .required()\n .description('Array of numbers (second variable, same length as x)'),\n }),\n handler: async (args) => {\n const { x: rawX, y: rawY } = args as { x: number[]; y: number[] }\n const x = parseNumbers(rawX)\n if ('error' in x) return `Error in x: ${x.error}`\n const y = parseNumbers(rawY)\n if ('error' in y) return `Error in y: ${y.error}`\n\n if (x.length !== y.length)\n return `Error: Arrays must be the same length (x: ${x.length}, y: ${y.length}).`\n if (x.length < 2) return 'Error: At least 2 data points required.'\n\n // Pearson r is undefined when either variable has zero variance (constant) — the formula\n // divides by a standard deviation of 0. Report that explicitly instead of emitting `r = NaN`,\n // which reads like a real (negligible) correlation.\n if (standardDeviation(x) === 0 || standardDeviation(y) === 0) {\n return 'Correlation is undefined: at least one variable is constant (zero variance), so Pearson r cannot be computed.'\n }\n\n try {\n const r = sampleCorrelation(x, y)\n const absR = Math.abs(r)\n const direction = r > 0 ? 'positive' : r < 0 ? 'negative' : 'no'\n const strength =\n absR >= 0.9\n ? 'very strong'\n : absR >= 0.7\n ? 'strong'\n : absR >= 0.5\n ? 'moderate'\n : absR >= 0.3\n ? 'weak'\n : 'very weak / negligible'\n return `r = ${r.toFixed(6)}\\nr² = ${(r * r * 100).toFixed(2)}% (explained variance)\\nInterpretation: ${strength} ${direction} correlation`\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n\n/**\n * Transform a numeric array — normalise, smooth, rank, or detect outliers.\n *\n * @remarks\n * Supported operations: `normalize_min_max`, `normalize_z_score`, `normalize_percent_of_sum`,\n * `running_total`, `rolling_avg`, `pct_change`, `rank`, `outliers_iqr`, `outliers_zscore`. Most\n * operations return a JSON array of transformed values; outlier operations return a\n * human-readable report.\n */\nexport const statsTransformTool = new Tool({\n name: 'stats_transform',\n description:\n 'Transform a numeric array: normalize (min-max or z-score), compute running totals, rolling averages, percent change between consecutive values, rank each value, or detect outliers.',\n inputSchema: validator.object({\n numbers: validator.array().items(validator.number()).required().description('Array of numbers'),\n operation: validator\n .string()\n .valid(\n 'normalize_min_max',\n 'normalize_z_score',\n 'normalize_percent_of_sum',\n 'running_total',\n 'rolling_avg',\n 'pct_change',\n 'rank',\n 'outliers_iqr',\n 'outliers_zscore'\n )\n .required()\n .description('Transformation to apply'),\n window: validator.number().default(3).description('For rolling_avg: window size (default: 3)'),\n threshold: validator\n .number()\n .default(3.0)\n .description('For outliers_zscore: z-score threshold (default: 3.0)'),\n precision: precisionField,\n }),\n handler: async (args) => {\n const { numbers, operation, window, threshold, precision } = args as {\n numbers: number[]\n operation: string\n window: number\n threshold: number\n precision: number\n }\n const nums = parseNumbers(numbers)\n if ('error' in nums) return `Error: ${nums.error}`\n\n // Round a float to `precision` significant digits without the toPrecision/parse noise.\n const round = (n: number): number => Number.parseFloat(formatBig(n, precision))\n\n switch (operation) {\n case 'normalize_min_max': {\n const lo = min(nums)\n const hi = max(nums)\n if (lo === hi) return JSON.stringify(nums.map(() => 0))\n return JSON.stringify(nums.map((v) => round((v - lo) / (hi - lo))))\n }\n\n case 'normalize_z_score': {\n const m = mean(nums)\n const sd = standardDeviation(nums)\n if (sd === 0) return JSON.stringify(nums.map(() => 0))\n return JSON.stringify(nums.map((v) => round(zScore(v, m, sd))))\n }\n\n case 'normalize_percent_of_sum': {\n const total = sum(nums)\n if (total === 0) return JSON.stringify(nums.map(() => 0))\n return JSON.stringify(nums.map((v) => round((v / total) * 100)))\n }\n\n case 'running_total': {\n // Each prefix sum is computed exactly via BigNumber (so a cumulative total exceeding\n // float64 stays exact instead of overflowing to Infinity). Each entry is a plain number\n // when it fits float64 (the common case), or a precise string when it would otherwise\n // overflow to Infinity → JSON null.\n return JSON.stringify(\n nums.map((_, i) => {\n const big = bigSum(nums.slice(0, i + 1))\n const asNum = bigToNumber(big)\n // Number only when exactly representable; otherwise the exact string (covers both\n // overflow and the silent-rounding gap above 2^53).\n if (Number.isFinite(asNum) && Math.abs(asNum) <= Number.MAX_SAFE_INTEGER) {\n return round(asNum)\n }\n return formatBig(big, precision)\n })\n )\n }\n\n case 'rolling_avg': {\n const w = Math.max(1, Math.floor(window))\n return JSON.stringify(\n nums.map((_, i) => {\n const slice = nums.slice(Math.max(0, i - w + 1), i + 1)\n return round(mean(slice))\n })\n )\n }\n\n case 'pct_change': {\n const changes: (number | null)[] = [null]\n for (let i = 1; i < nums.length; i++) {\n if (nums[i - 1] === 0) {\n changes.push(null)\n } else {\n changes.push(\n Number.parseFloat(\n (((nums[i] - nums[i - 1]) / Math.abs(nums[i - 1])) * 100).toFixed(4)\n )\n )\n }\n }\n return JSON.stringify(changes)\n }\n\n case 'rank': {\n const sorted = [...nums].sort((a, b) => a - b)\n return JSON.stringify(nums.map((v) => sorted.indexOf(v) + 1))\n }\n\n case 'outliers_iqr': {\n const sorted = [...nums].sort((a, b) => a - b)\n const q1 = quantile(sorted, 0.25)\n const q3 = quantile(sorted, 0.75)\n const iqr = q3 - q1\n const lo = q1 - 1.5 * iqr\n const hi = q3 + 1.5 * iqr\n const outliers = nums\n .map((v, i) => ({ index: i, value: v }))\n .filter(({ value }) => value < lo || value > hi)\n if (outliers.length === 0) return 'No outliers detected (IQR method).'\n return `${outliers.length} outlier(s) detected:\\n${outliers.map((o) => ` [${o.index}] = ${o.value}`).join('\\n')}`\n }\n\n case 'outliers_zscore': {\n const m = mean(nums)\n const sd = standardDeviation(nums)\n const outliers = nums\n .map((v, i) => ({ index: i, value: v, z: sd === 0 ? 0 : Math.abs(zScore(v, m, sd)) }))\n .filter((o) => o.z > threshold)\n if (outliers.length === 0) return `No outliers detected (|z| > ${threshold}).`\n return `${outliers.length} outlier(s) detected (|z| > ${threshold}):\\n${outliers.map((o) => ` [${o.index}] = ${o.value} (z = ${o.z.toFixed(3)})`).join('\\n')}`\n }\n\n default:\n return `Error: Unknown operation \"${operation}\".`\n }\n },\n})\n\n/**\n * Bin a numeric array into equal-width histogram buckets.\n *\n * @remarks\n * Output is a text histogram showing each bin's range, count, percentage of total, and a bar\n * chart. The last bin is inclusive on both ends; preceding bins are half-open. `bins` is clamped\n * to `[2, 100]`.\n */\nexport const statsHistogramTool = new Tool({\n name: 'stats_histogram',\n description: 'Bin a numeric array into equal-width histogram buckets and display counts.',\n inputSchema: validator.object({\n numbers: validator.array().items(validator.number()).required().description('Array of numbers'),\n bins: validator.number().default(10).description('Number of bins (default: 10, max: 100)'),\n precision: precisionField,\n }),\n handler: async (args) => {\n const { numbers, bins, precision } = args as {\n numbers: number[]\n bins: number\n precision: number\n }\n const nums = parseNumbers(numbers)\n if ('error' in nums) return `Error: ${nums.error}`\n\n const binCount = Math.max(2, Math.min(100, Math.floor(bins)))\n\n try {\n const breaks = equalIntervalBreaks(nums, binCount)\n const rows: string[] = []\n const maxCount = (() => {\n let m = 0\n for (let i = 0; i < breaks.length - 1; i++) {\n const isLast = i === breaks.length - 2\n const count = nums.filter((v) =>\n isLast ? v >= breaks[i] && v <= breaks[i + 1] : v >= breaks[i] && v < breaks[i + 1]\n ).length\n if (count > m) m = count\n }\n return m\n })()\n\n for (let i = 0; i < breaks.length - 1; i++) {\n const isLast = i === breaks.length - 2\n const count = nums.filter((v) =>\n isLast ? v >= breaks[i] && v <= breaks[i + 1] : v >= breaks[i] && v < breaks[i + 1]\n ).length\n const pct = ((count / nums.length) * 100).toFixed(1)\n const bar = '█'.repeat(maxCount > 0 ? Math.round((count / maxCount) * 20) : 0)\n const range = `[${formatBig(breaks[i], precision)}, ${formatBig(breaks[i + 1], precision)}${isLast ? ']' : ')'}`\n rows.push(`${range.padEnd(22)} ${String(count).padStart(4)} (${pct.padStart(5)}%) ${bar}`)\n }\n\n return rows.join('\\n')\n } catch (err) {\n return `Error: ${isError(err) ? err.message : String(err)}`\n }\n },\n})\n"],"mappings":"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"}