@nhtio/adk 1.20260607.2 → 1.20260609.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (501) hide show
  1. package/CHANGELOG.md +185 -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/color.cjs +3 -2
  90. package/batteries/tools/color.cjs.map +1 -1
  91. package/batteries/tools/color.mjs +3 -2
  92. package/batteries/tools/color.mjs.map +1 -1
  93. package/batteries/tools/comparison.cjs +4 -3
  94. package/batteries/tools/comparison.cjs.map +1 -1
  95. package/batteries/tools/comparison.mjs +4 -3
  96. package/batteries/tools/comparison.mjs.map +1 -1
  97. package/batteries/tools/data_structure.cjs +30 -10
  98. package/batteries/tools/data_structure.cjs.map +1 -1
  99. package/batteries/tools/data_structure.mjs +30 -10
  100. package/batteries/tools/data_structure.mjs.map +1 -1
  101. package/batteries/tools/datetime_extended.cjs +5 -10
  102. package/batteries/tools/datetime_extended.cjs.map +1 -1
  103. package/batteries/tools/datetime_extended.mjs +5 -10
  104. package/batteries/tools/datetime_extended.mjs.map +1 -1
  105. package/batteries/tools/datetime_math.cjs +2 -2
  106. package/batteries/tools/datetime_math.mjs +2 -2
  107. package/batteries/tools/encoding.cjs +13 -4
  108. package/batteries/tools/encoding.cjs.map +1 -1
  109. package/batteries/tools/encoding.mjs +13 -4
  110. package/batteries/tools/encoding.mjs.map +1 -1
  111. package/batteries/tools/formatting.cjs +4 -4
  112. package/batteries/tools/formatting.cjs.map +1 -1
  113. package/batteries/tools/formatting.mjs +4 -4
  114. package/batteries/tools/formatting.mjs.map +1 -1
  115. package/batteries/tools/geo_basics.cjs +2 -2
  116. package/batteries/tools/geo_basics.mjs +2 -2
  117. package/batteries/tools/index.d.ts +1 -0
  118. package/batteries/tools/math.cjs +10 -8
  119. package/batteries/tools/math.cjs.map +1 -1
  120. package/batteries/tools/math.mjs +10 -8
  121. package/batteries/tools/math.mjs.map +1 -1
  122. package/batteries/tools/memory.cjs +5 -5
  123. package/batteries/tools/memory.mjs +5 -5
  124. package/batteries/tools/parsing.cjs +9 -5
  125. package/batteries/tools/parsing.cjs.map +1 -1
  126. package/batteries/tools/parsing.mjs +9 -5
  127. package/batteries/tools/parsing.mjs.map +1 -1
  128. package/batteries/tools/retrievables.cjs +4 -4
  129. package/batteries/tools/retrievables.mjs +4 -4
  130. package/batteries/tools/searxng/exceptions.d.ts +21 -0
  131. package/batteries/tools/searxng/index.d.ts +150 -0
  132. package/batteries/tools/searxng.cjs +5 -0
  133. package/batteries/tools/searxng.mjs +2 -0
  134. package/batteries/tools/standing_instructions.cjs +4 -4
  135. package/batteries/tools/standing_instructions.mjs +4 -4
  136. package/batteries/tools/statistics.cjs +54 -43
  137. package/batteries/tools/statistics.cjs.map +1 -1
  138. package/batteries/tools/statistics.mjs +54 -43
  139. package/batteries/tools/statistics.mjs.map +1 -1
  140. package/batteries/tools/string_processing.cjs +5 -5
  141. package/batteries/tools/string_processing.cjs.map +1 -1
  142. package/batteries/tools/string_processing.mjs +5 -5
  143. package/batteries/tools/string_processing.mjs.map +1 -1
  144. package/batteries/tools/structured_data.cjs +8 -13
  145. package/batteries/tools/structured_data.cjs.map +1 -1
  146. package/batteries/tools/structured_data.mjs +8 -13
  147. package/batteries/tools/structured_data.mjs.map +1 -1
  148. package/batteries/tools/text_analysis.cjs +3 -3
  149. package/batteries/tools/text_analysis.mjs +3 -3
  150. package/batteries/tools/text_comparison.cjs +2 -2
  151. package/batteries/tools/text_comparison.mjs +2 -2
  152. package/batteries/tools/time.cjs +2 -2
  153. package/batteries/tools/time.mjs +2 -2
  154. package/batteries/tools/unit_conversion.cjs +10 -8
  155. package/batteries/tools/unit_conversion.cjs.map +1 -1
  156. package/batteries/tools/unit_conversion.mjs +10 -8
  157. package/batteries/tools/unit_conversion.mjs.map +1 -1
  158. package/batteries/tools.cjs +3 -0
  159. package/batteries/tools.mjs +2 -1
  160. package/batteries/vector/arangodb/index.d.ts +2 -0
  161. package/batteries/vector/arangodb.cjs +2 -1
  162. package/batteries/vector/arangodb.cjs.map +1 -1
  163. package/batteries/vector/arangodb.mjs +2 -1
  164. package/batteries/vector/arangodb.mjs.map +1 -1
  165. package/batteries/vector/builder.cjs +31 -0
  166. package/batteries/vector/builder.cjs.map +1 -1
  167. package/batteries/vector/builder.d.ts +58 -0
  168. package/batteries/vector/builder.mjs +31 -0
  169. package/batteries/vector/builder.mjs.map +1 -1
  170. package/batteries/vector/chroma/index.d.ts +4 -0
  171. package/batteries/vector/chroma.cjs +3 -0
  172. package/batteries/vector/chroma.cjs.map +1 -1
  173. package/batteries/vector/chroma.mjs +3 -0
  174. package/batteries/vector/chroma.mjs.map +1 -1
  175. package/batteries/vector/clickhouse/index.d.ts +2 -0
  176. package/batteries/vector/clickhouse.cjs +2 -1
  177. package/batteries/vector/clickhouse.cjs.map +1 -1
  178. package/batteries/vector/clickhouse.mjs +2 -1
  179. package/batteries/vector/clickhouse.mjs.map +1 -1
  180. package/batteries/vector/cloudflare/index.d.ts +2 -0
  181. package/batteries/vector/cloudflare.cjs +2 -1
  182. package/batteries/vector/cloudflare.cjs.map +1 -1
  183. package/batteries/vector/cloudflare.mjs +2 -1
  184. package/batteries/vector/cloudflare.mjs.map +1 -1
  185. package/batteries/vector/conformance/index.d.ts +22 -0
  186. package/batteries/vector/conformance.cjs +22 -0
  187. package/batteries/vector/conformance.cjs.map +1 -1
  188. package/batteries/vector/conformance.mjs +22 -0
  189. package/batteries/vector/conformance.mjs.map +1 -1
  190. package/batteries/vector/contract.cjs +22 -0
  191. package/batteries/vector/contract.cjs.map +1 -1
  192. package/batteries/vector/contract.d.ts +51 -0
  193. package/batteries/vector/contract.mjs +22 -0
  194. package/batteries/vector/contract.mjs.map +1 -1
  195. package/batteries/vector/couchbase/index.d.ts +2 -0
  196. package/batteries/vector/couchbase.cjs +2 -1
  197. package/batteries/vector/couchbase.cjs.map +1 -1
  198. package/batteries/vector/couchbase.mjs +2 -1
  199. package/batteries/vector/couchbase.mjs.map +1 -1
  200. package/batteries/vector/duckdb/index.d.ts +2 -0
  201. package/batteries/vector/duckdb.cjs +2 -1
  202. package/batteries/vector/duckdb.cjs.map +1 -1
  203. package/batteries/vector/duckdb.mjs +2 -1
  204. package/batteries/vector/duckdb.mjs.map +1 -1
  205. package/batteries/vector/elasticsearch/index.d.ts +2 -0
  206. package/batteries/vector/elasticsearch.cjs +2 -1
  207. package/batteries/vector/elasticsearch.cjs.map +1 -1
  208. package/batteries/vector/elasticsearch.mjs +2 -1
  209. package/batteries/vector/elasticsearch.mjs.map +1 -1
  210. package/batteries/vector/exceptions.cjs +1 -1
  211. package/batteries/vector/exceptions.mjs +1 -1
  212. package/batteries/vector/factory.cjs +6 -0
  213. package/batteries/vector/factory.cjs.map +1 -1
  214. package/batteries/vector/factory.d.ts +14 -0
  215. package/batteries/vector/factory.mjs +6 -0
  216. package/batteries/vector/factory.mjs.map +1 -1
  217. package/batteries/vector/filters.cjs +22 -1
  218. package/batteries/vector/filters.cjs.map +1 -1
  219. package/batteries/vector/filters.d.ts +38 -0
  220. package/batteries/vector/filters.mjs +22 -1
  221. package/batteries/vector/filters.mjs.map +1 -1
  222. package/batteries/vector/helpers.cjs +13 -0
  223. package/batteries/vector/helpers.cjs.map +1 -1
  224. package/batteries/vector/helpers.d.ts +14 -0
  225. package/batteries/vector/helpers.mjs +13 -0
  226. package/batteries/vector/helpers.mjs.map +1 -1
  227. package/batteries/vector/hnswlib/index.d.ts +2 -0
  228. package/batteries/vector/hnswlib.cjs +2 -1
  229. package/batteries/vector/hnswlib.cjs.map +1 -1
  230. package/batteries/vector/hnswlib.mjs +2 -1
  231. package/batteries/vector/hnswlib.mjs.map +1 -1
  232. package/batteries/vector/in_memory/index.d.ts +1 -0
  233. package/batteries/vector/in_memory.cjs +1 -0
  234. package/batteries/vector/in_memory.cjs.map +1 -1
  235. package/batteries/vector/in_memory.mjs +1 -0
  236. package/batteries/vector/in_memory.mjs.map +1 -1
  237. package/batteries/vector/lancedb/index.d.ts +2 -0
  238. package/batteries/vector/lancedb.cjs +2 -1
  239. package/batteries/vector/lancedb.cjs.map +1 -1
  240. package/batteries/vector/lancedb.mjs +2 -1
  241. package/batteries/vector/lancedb.mjs.map +1 -1
  242. package/batteries/vector/mariadb/index.d.ts +2 -0
  243. package/batteries/vector/mariadb.cjs +2 -1
  244. package/batteries/vector/mariadb.cjs.map +1 -1
  245. package/batteries/vector/mariadb.mjs +2 -1
  246. package/batteries/vector/mariadb.mjs.map +1 -1
  247. package/batteries/vector/meilisearch/index.d.ts +2 -0
  248. package/batteries/vector/meilisearch.cjs +2 -1
  249. package/batteries/vector/meilisearch.cjs.map +1 -1
  250. package/batteries/vector/meilisearch.mjs +2 -1
  251. package/batteries/vector/meilisearch.mjs.map +1 -1
  252. package/batteries/vector/migrate.cjs +18 -1
  253. package/batteries/vector/migrate.cjs.map +1 -1
  254. package/batteries/vector/migrate.d.ts +31 -0
  255. package/batteries/vector/migrate.mjs +18 -1
  256. package/batteries/vector/migrate.mjs.map +1 -1
  257. package/batteries/vector/milvus/index.d.ts +5 -0
  258. package/batteries/vector/milvus.cjs +4 -0
  259. package/batteries/vector/milvus.cjs.map +1 -1
  260. package/batteries/vector/milvus.mjs +4 -0
  261. package/batteries/vector/milvus.mjs.map +1 -1
  262. package/batteries/vector/mongodb/index.d.ts +2 -0
  263. package/batteries/vector/mongodb.cjs +2 -1
  264. package/batteries/vector/mongodb.cjs.map +1 -1
  265. package/batteries/vector/mongodb.mjs +2 -1
  266. package/batteries/vector/mongodb.mjs.map +1 -1
  267. package/batteries/vector/neo4j/index.d.ts +2 -0
  268. package/batteries/vector/neo4j.cjs +2 -1
  269. package/batteries/vector/neo4j.cjs.map +1 -1
  270. package/batteries/vector/neo4j.mjs +2 -1
  271. package/batteries/vector/neo4j.mjs.map +1 -1
  272. package/batteries/vector/opensearch/index.d.ts +2 -0
  273. package/batteries/vector/opensearch.cjs +2 -1
  274. package/batteries/vector/opensearch.cjs.map +1 -1
  275. package/batteries/vector/opensearch.mjs +2 -1
  276. package/batteries/vector/opensearch.mjs.map +1 -1
  277. package/batteries/vector/oracle23ai/index.d.ts +2 -0
  278. package/batteries/vector/oracle23ai.cjs +2 -1
  279. package/batteries/vector/oracle23ai.cjs.map +1 -1
  280. package/batteries/vector/oracle23ai.mjs +2 -1
  281. package/batteries/vector/oracle23ai.mjs.map +1 -1
  282. package/batteries/vector/orama/index.d.ts +1 -0
  283. package/batteries/vector/orama.cjs +1 -0
  284. package/batteries/vector/orama.cjs.map +1 -1
  285. package/batteries/vector/orama.mjs +1 -0
  286. package/batteries/vector/orama.mjs.map +1 -1
  287. package/batteries/vector/pgvector/index.d.ts +9 -2
  288. package/batteries/vector/pgvector.cjs +4 -0
  289. package/batteries/vector/pgvector.cjs.map +1 -1
  290. package/batteries/vector/pgvector.mjs +4 -0
  291. package/batteries/vector/pgvector.mjs.map +1 -1
  292. package/batteries/vector/pinecone/index.d.ts +5 -0
  293. package/batteries/vector/pinecone.cjs +3 -1
  294. package/batteries/vector/pinecone.cjs.map +1 -1
  295. package/batteries/vector/pinecone.mjs +3 -1
  296. package/batteries/vector/pinecone.mjs.map +1 -1
  297. package/batteries/vector/plan.d.ts +27 -0
  298. package/batteries/vector/qdrant/index.d.ts +5 -0
  299. package/batteries/vector/qdrant.cjs +4 -0
  300. package/batteries/vector/qdrant.cjs.map +1 -1
  301. package/batteries/vector/qdrant.mjs +4 -0
  302. package/batteries/vector/qdrant.mjs.map +1 -1
  303. package/batteries/vector/redis/index.d.ts +2 -0
  304. package/batteries/vector/redis.cjs +2 -1
  305. package/batteries/vector/redis.cjs.map +1 -1
  306. package/batteries/vector/redis.mjs +2 -1
  307. package/batteries/vector/redis.mjs.map +1 -1
  308. package/batteries/vector/retrievable.cjs +9 -1
  309. package/batteries/vector/retrievable.cjs.map +1 -1
  310. package/batteries/vector/retrievable.mjs +9 -1
  311. package/batteries/vector/retrievable.mjs.map +1 -1
  312. package/batteries/vector/retrievable_glue.d.ts +21 -0
  313. package/batteries/vector/s3vectors/index.d.ts +2 -0
  314. package/batteries/vector/s3vectors.cjs +2 -1
  315. package/batteries/vector/s3vectors.cjs.map +1 -1
  316. package/batteries/vector/s3vectors.mjs +2 -1
  317. package/batteries/vector/s3vectors.mjs.map +1 -1
  318. package/batteries/vector/schema.cjs +28 -0
  319. package/batteries/vector/schema.cjs.map +1 -1
  320. package/batteries/vector/schema.d.ts +39 -0
  321. package/batteries/vector/schema.mjs +28 -0
  322. package/batteries/vector/schema.mjs.map +1 -1
  323. package/batteries/vector/solr/index.d.ts +2 -0
  324. package/batteries/vector/solr.cjs +2 -1
  325. package/batteries/vector/solr.cjs.map +1 -1
  326. package/batteries/vector/solr.mjs +2 -1
  327. package/batteries/vector/solr.mjs.map +1 -1
  328. package/batteries/vector/sqlite_vec/index.d.ts +6 -3
  329. package/batteries/vector/sqlite_vec.cjs +2 -0
  330. package/batteries/vector/sqlite_vec.cjs.map +1 -1
  331. package/batteries/vector/sqlite_vec.mjs +2 -0
  332. package/batteries/vector/sqlite_vec.mjs.map +1 -1
  333. package/batteries/vector/surrealdb/index.d.ts +2 -0
  334. package/batteries/vector/surrealdb.cjs +2 -1
  335. package/batteries/vector/surrealdb.cjs.map +1 -1
  336. package/batteries/vector/surrealdb.mjs +2 -1
  337. package/batteries/vector/surrealdb.mjs.map +1 -1
  338. package/batteries/vector/types.d.ts +27 -0
  339. package/batteries/vector/typesense/index.d.ts +2 -0
  340. package/batteries/vector/typesense.cjs +2 -1
  341. package/batteries/vector/typesense.cjs.map +1 -1
  342. package/batteries/vector/typesense.mjs +2 -1
  343. package/batteries/vector/typesense.mjs.map +1 -1
  344. package/batteries/vector/validation.cjs +14 -0
  345. package/batteries/vector/validation.cjs.map +1 -1
  346. package/batteries/vector/validation.d.ts +14 -0
  347. package/batteries/vector/validation.mjs +14 -0
  348. package/batteries/vector/validation.mjs.map +1 -1
  349. package/batteries/vector/vector_store_constructor.cjs +1 -1
  350. package/batteries/vector/vector_store_constructor.cjs.map +1 -1
  351. package/batteries/vector/vector_store_constructor.d.ts +1 -1
  352. package/batteries/vector/vector_store_constructor.mjs +1 -1
  353. package/batteries/vector/vector_store_constructor.mjs.map +1 -1
  354. package/batteries/vector/vespa/index.d.ts +2 -0
  355. package/batteries/vector/vespa.cjs +2 -1
  356. package/batteries/vector/vespa.cjs.map +1 -1
  357. package/batteries/vector/vespa.mjs +2 -1
  358. package/batteries/vector/vespa.mjs.map +1 -1
  359. package/batteries/vector/weaviate/index.d.ts +2 -0
  360. package/batteries/vector/weaviate.cjs +2 -1
  361. package/batteries/vector/weaviate.cjs.map +1 -1
  362. package/batteries/vector/weaviate.mjs +2 -1
  363. package/batteries/vector/weaviate.mjs.map +1 -1
  364. package/batteries.cjs +46 -28
  365. package/batteries.mjs +10 -5
  366. package/{common-BT0nfCi9.mjs → common-DYDUi99O.mjs} +9 -9
  367. package/common-DYDUi99O.mjs.map +1 -0
  368. package/{common-Cj8TaQ9U.js → common-DZl3ADJs.js} +9 -9
  369. package/common-DZl3ADJs.js.map +1 -0
  370. package/common.cjs +7 -7
  371. package/common.d.ts +1 -1
  372. package/common.mjs +7 -7
  373. package/{dispatch_runner-DPcS7Y_M.mjs → dispatch_runner--ZhdDWRZ.mjs} +27 -5
  374. package/{dispatch_runner-DPcS7Y_M.mjs.map → dispatch_runner--ZhdDWRZ.mjs.map} +1 -1
  375. package/{dispatch_runner-BHBNupqp.js → dispatch_runner-nHDKkxye.js} +27 -5
  376. package/{dispatch_runner-BHBNupqp.js.map → dispatch_runner-nHDKkxye.js.map} +1 -1
  377. package/dispatch_runner.cjs +1 -1
  378. package/dispatch_runner.d.ts +1 -1
  379. package/dispatch_runner.mjs +1 -1
  380. package/eslint/rules/artifact_tool_forbids_artifact_constructor.cjs +1 -0
  381. package/eslint/rules/artifact_tool_forbids_artifact_constructor.cjs.map +1 -1
  382. package/eslint/rules/artifact_tool_forbids_artifact_constructor.d.ts +1 -0
  383. package/eslint/rules/artifact_tool_forbids_artifact_constructor.mjs +1 -0
  384. package/eslint/rules/artifact_tool_forbids_artifact_constructor.mjs.map +1 -1
  385. package/eslint/rules/no_model_in_tool_handler.cjs +1 -0
  386. package/eslint/rules/no_model_in_tool_handler.cjs.map +1 -1
  387. package/eslint/rules/no_model_in_tool_handler.d.ts +1 -0
  388. package/eslint/rules/no_model_in_tool_handler.mjs +1 -0
  389. package/eslint/rules/no_model_in_tool_handler.mjs.map +1 -1
  390. package/eslint/rules/require_validator_any_required.cjs +1 -0
  391. package/eslint/rules/require_validator_any_required.cjs.map +1 -1
  392. package/eslint/rules/require_validator_any_required.d.ts +1 -0
  393. package/eslint/rules/require_validator_any_required.mjs +1 -0
  394. package/eslint/rules/require_validator_any_required.mjs.map +1 -1
  395. package/eslint/rules/thought_payload_requires_replay_tag.cjs +1 -0
  396. package/eslint/rules/thought_payload_requires_replay_tag.cjs.map +1 -1
  397. package/eslint/rules/thought_payload_requires_replay_tag.d.ts +1 -0
  398. package/eslint/rules/thought_payload_requires_replay_tag.mjs +1 -0
  399. package/eslint/rules/thought_payload_requires_replay_tag.mjs.map +1 -1
  400. package/eslint/rules/token_encoding_requires_context_window.cjs +1 -0
  401. package/eslint/rules/token_encoding_requires_context_window.cjs.map +1 -1
  402. package/eslint/rules/token_encoding_requires_context_window.d.ts +1 -0
  403. package/eslint/rules/token_encoding_requires_context_window.mjs +1 -0
  404. package/eslint/rules/token_encoding_requires_context_window.mjs.map +1 -1
  405. package/eslint.cjs +1 -1
  406. package/eslint.mjs +1 -1
  407. package/{exceptions-BeWH2FwP.mjs → exceptions-BDhN0Xzr.mjs} +3 -2
  408. package/exceptions-BDhN0Xzr.mjs.map +1 -0
  409. package/{exceptions-CitH5wZI.js → exceptions-BRXrUKiW.js} +3 -2
  410. package/exceptions-BRXrUKiW.js.map +1 -0
  411. package/exceptions.cjs +2 -2
  412. package/exceptions.mjs +2 -2
  413. package/factories.cjs +1 -1
  414. package/factories.mjs +1 -1
  415. package/forge.cjs +4 -4
  416. package/forge.d.ts +1 -1
  417. package/forge.mjs +4 -4
  418. package/guards.cjs +9 -9
  419. package/guards.mjs +9 -9
  420. package/helpers-DSTFxTiC.js +497 -0
  421. package/helpers-DSTFxTiC.js.map +1 -0
  422. package/helpers-xhrQbMAG.mjs +306 -0
  423. package/helpers-xhrQbMAG.mjs.map +1 -0
  424. package/index.cjs +13 -13
  425. package/index.mjs +13 -13
  426. package/lib/classes/base_exception.d.ts +1 -0
  427. package/lib/classes/media.d.ts +10 -0
  428. package/lib/classes/retrievable.d.ts +1 -1
  429. package/lib/classes/spooled_json_artifact.d.ts +1 -1
  430. package/lib/classes/spooled_markdown_artifact.d.ts +1 -0
  431. package/lib/classes/tokenizable.d.ts +3 -0
  432. package/lib/classes/tool.d.ts +8 -0
  433. package/lib/classes/turn_gate.d.ts +6 -0
  434. package/lib/dispatch_runner.d.ts +4 -32
  435. package/lib/helpers/bignum.cjs +82 -0
  436. package/lib/helpers/bignum.cjs.map +1 -0
  437. package/lib/helpers/bignum.d.ts +52 -0
  438. package/lib/helpers/bignum.mjs +74 -0
  439. package/lib/helpers/bignum.mjs.map +1 -0
  440. package/lib/turn_runner.d.ts +1 -1
  441. package/lib/types/dispatch_runner.d.ts +83 -0
  442. package/lib/utils/exceptions.d.ts +1 -1
  443. package/lib/utils/retry.cjs.map +1 -1
  444. package/lib/utils/retry.d.ts +2 -0
  445. package/lib/utils/retry.mjs.map +1 -1
  446. package/mcp/adk-docs-corpus.json +1 -1
  447. package/package.json +264 -224
  448. package/{runtime-j92CNi5z.mjs → runtime-Bz5zA8wc.mjs} +2 -2
  449. package/{runtime-j92CNi5z.mjs.map → runtime-Bz5zA8wc.mjs.map} +1 -1
  450. package/{runtime-MFFcJrRv.js → runtime-DslE1aBw.js} +2 -2
  451. package/{runtime-MFFcJrRv.js.map → runtime-DslE1aBw.js.map} +1 -1
  452. package/searxng-Bkrwhwhw.js +269 -0
  453. package/searxng-Bkrwhwhw.js.map +1 -0
  454. package/searxng-CyA-nEu5.mjs +257 -0
  455. package/searxng-CyA-nEu5.mjs.map +1 -0
  456. package/skills/adk-assembly/SKILL.md +2 -2
  457. package/{spooled_artifact-CHoZgWwI.mjs → spooled_artifact-7eePq7JA.mjs} +5 -5
  458. package/{spooled_artifact-CHoZgWwI.mjs.map → spooled_artifact-7eePq7JA.mjs.map} +1 -1
  459. package/{spooled_artifact-BTq6Nzfy.js → spooled_artifact-DX8LLyUX.js} +5 -5
  460. package/{spooled_artifact-BTq6Nzfy.js.map → spooled_artifact-DX8LLyUX.js.map} +1 -1
  461. package/spooled_artifact.cjs +2 -2
  462. package/spooled_artifact.mjs +2 -2
  463. package/{spooled_markdown_artifact-CALSDxIx.js → spooled_markdown_artifact-ClX72lek.js} +4 -4
  464. package/spooled_markdown_artifact-ClX72lek.js.map +1 -0
  465. package/{spooled_markdown_artifact-Ci5UL7l4.mjs → spooled_markdown_artifact-wkrBF3oX.mjs} +4 -4
  466. package/spooled_markdown_artifact-wkrBF3oX.mjs.map +1 -0
  467. package/{thought-D34QQZZ9.mjs → thought-B_vxAiKU.mjs} +5 -5
  468. package/{thought-D34QQZZ9.mjs.map → thought-B_vxAiKU.mjs.map} +1 -1
  469. package/{thought-BbwhJ1wb.js → thought-DLwpF7MI.js} +5 -5
  470. package/{thought-BbwhJ1wb.js.map → thought-DLwpF7MI.js.map} +1 -1
  471. package/{tool-CVyZkFC7.js → tool-D5WGVIcI.js} +4 -4
  472. package/{tool-CVyZkFC7.js.map → tool-D5WGVIcI.js.map} +1 -1
  473. package/{tool-CMhaDRNd.mjs → tool-wMYMVl60.mjs} +4 -4
  474. package/{tool-CMhaDRNd.mjs.map → tool-wMYMVl60.mjs.map} +1 -1
  475. package/{tool_call-CV5qVNlb.mjs → tool_call-B4-_-vjG.mjs} +5 -5
  476. package/tool_call-B4-_-vjG.mjs.map +1 -0
  477. package/{tool_call-Db68hB7y.js → tool_call-DixVlW40.js} +5 -5
  478. package/tool_call-DixVlW40.js.map +1 -0
  479. package/{tool_registry-D1pSSlsd.mjs → tool_registry-791Vrjtf.mjs} +4 -3
  480. package/tool_registry-791Vrjtf.mjs.map +1 -0
  481. package/{tool_registry-DYUYqXvo.js → tool_registry-CKJPze3j.js} +4 -3
  482. package/tool_registry-CKJPze3j.js.map +1 -0
  483. package/{turn_runner-DqWHNP80.js → turn_runner-HXImLGIn.js} +7 -7
  484. package/turn_runner-HXImLGIn.js.map +1 -0
  485. package/{turn_runner-fg1Wc3dK.mjs → turn_runner-ZyYO-Kti.mjs} +7 -7
  486. package/turn_runner-ZyYO-Kti.mjs.map +1 -0
  487. package/turn_runner.cjs +1 -1
  488. package/turn_runner.mjs +1 -1
  489. package/types.d.ts +1 -1
  490. package/common-BT0nfCi9.mjs.map +0 -1
  491. package/common-Cj8TaQ9U.js.map +0 -1
  492. package/exceptions-BeWH2FwP.mjs.map +0 -1
  493. package/exceptions-CitH5wZI.js.map +0 -1
  494. package/spooled_markdown_artifact-CALSDxIx.js.map +0 -1
  495. package/spooled_markdown_artifact-Ci5UL7l4.mjs.map +0 -1
  496. package/tool_call-CV5qVNlb.mjs.map +0 -1
  497. package/tool_call-Db68hB7y.js.map +0 -1
  498. package/tool_registry-D1pSSlsd.mjs.map +0 -1
  499. package/tool_registry-DYUYqXvo.js.map +0 -1
  500. package/turn_runner-DqWHNP80.js.map +0 -1
  501. package/turn_runner-fg1Wc3dK.mjs.map +0 -1
@@ -0,0 +1,150 @@
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 a **factory**,
9
+ * {@link createSearxngSearchTool}. A search tool has to talk to a *specific* SearXNG instance,
10
+ * usually behind custom authentication, so it needs per-deployment configuration (a base URL
11
+ * and headers) that cannot be baked in at module load.
12
+ *
13
+ * Because this module exports a factory rather than a `Tool` instance, it MUST NOT be
14
+ * bulk-registered via `Object.values(batteries)`. Call the factory first, then register the
15
+ * returned tool: `new ToolRegistry([createSearxngSearchTool({ instanceUrl })])`.
16
+ *
17
+ * @see https://docs.searxng.org/dev/search_api.html
18
+ */
19
+ import { Tool, type ArtifactConstructorResolver } from "../../../common";
20
+ import type { NextFn } from '@nhtio/middleware';
21
+ export { E_INVALID_SEARXNG_CONFIG } from "./exceptions";
22
+ /** A static set of request headers (used for custom authentication). */
23
+ export type SearxngHeaders = Record<string, string>;
24
+ /**
25
+ * A resolver returning request headers, sync or async. Use this form when the auth token is
26
+ * refreshable — the resolver runs on every search, so a fresh token can be minted per call.
27
+ */
28
+ export type SearxngHeadersResolver = () => SearxngHeaders | Promise<SearxngHeaders>;
29
+ /** The output shape the tool serialises. `either` lets the model pick per call. */
30
+ export type SearxngResultFormat = 'normalized' | 'raw' | 'either';
31
+ /**
32
+ * A single normalised SearXNG result. SearXNG result items are deliberately untyped upstream,
33
+ * so every field except a best-effort `title`/`url` is optional.
34
+ */
35
+ export interface SearxngResult {
36
+ /** Result title, when the source engine provided one. */
37
+ title?: string;
38
+ /** Result URL, when the source engine provided one. */
39
+ url?: string;
40
+ /** Snippet / summary text for the result. */
41
+ content?: string;
42
+ /** The SearXNG engine that produced this result (e.g. `google`, `duckduckgo`). */
43
+ engine?: string;
44
+ /** Relevance score as reported by SearXNG (higher is more relevant). */
45
+ score?: number;
46
+ /** Publication date, when the source engine exposed one (ISO-ish string, engine-dependent). */
47
+ publishedDate?: string;
48
+ }
49
+ /**
50
+ * Mutable context handed to each input-pipeline stage **before** the HTTP request is sent.
51
+ *
52
+ * @remarks
53
+ * Stages mutate this in place (onion `(ctx, next)` style) to adjust the outgoing request —
54
+ * inject or rotate auth headers, force a language, rewrite the query — or call
55
+ * {@link SearxngRequestContext.shortCircuit} to skip the fetch entirely (e.g. a cache hit).
56
+ */
57
+ export interface SearxngRequestContext {
58
+ /** The tool's name (read-only). */
59
+ readonly toolName: string;
60
+ /** The search query. Mutable. */
61
+ query: string;
62
+ /** Extra SearXNG query parameters (`categories`, `engines`, `language`, …). Mutable. */
63
+ params: Record<string, string>;
64
+ /** Resolved request headers. Mutable — inject, redact, or rotate auth here. */
65
+ headers: SearxngHeaders;
66
+ /** The target instance base URL (read-only). */
67
+ readonly instanceUrl: string;
68
+ /** Cross-stage scratch space; also carried onto the response context. */
69
+ readonly stash: Map<string, unknown>;
70
+ /** Skip the fetch and return `result` verbatim as the tool's output. */
71
+ shortCircuit(result: string): void;
72
+ }
73
+ /**
74
+ * Mutable context handed to each output-pipeline stage **after** the response JSON is parsed.
75
+ *
76
+ * @remarks
77
+ * Stages reshape, redact, enrich, or re-rank {@link SearxngResponseContext.results}, mutate the
78
+ * raw body, or set {@link SearxngResponseContext.output} to override the serialised string
79
+ * verbatim (e.g. to render markdown that matches a markdown `artifactConstructor`).
80
+ */
81
+ export interface SearxngResponseContext {
82
+ /** The tool's name (read-only). */
83
+ readonly toolName: string;
84
+ /** The request context as it was sent (post-input-pipeline). */
85
+ readonly request: SearxngRequestContext;
86
+ /** The parsed SearXNG JSON body. Mutable (used when `format` is `raw`). */
87
+ raw: unknown;
88
+ /** The normalised result list. Mutable — filter, redact, or re-rank. */
89
+ results: SearxngResult[];
90
+ /** The effective payload shape for this call. */
91
+ format: 'normalized' | 'raw';
92
+ /** When set, used verbatim as the tool's output (overrides serialisation). */
93
+ output?: string;
94
+ /** Cross-stage scratch space; carried over from the request context. */
95
+ readonly stash: Map<string, unknown>;
96
+ }
97
+ /** An input-pipeline stage. Onion middleware over {@link SearxngRequestContext}. */
98
+ export type SearxngInputMiddlewareFn = (ctx: SearxngRequestContext, next: NextFn) => void | Promise<void>;
99
+ /** An output-pipeline stage. Onion middleware over {@link SearxngResponseContext}. */
100
+ export type SearxngOutputMiddlewareFn = (ctx: SearxngResponseContext, next: NextFn) => void | Promise<void>;
101
+ /** Configuration for {@link createSearxngSearchTool}. */
102
+ export interface SearxngToolConfig {
103
+ /** Base URL of the SearXNG instance, e.g. `https://searx.example.org`. Required. */
104
+ instanceUrl: string;
105
+ /** Custom request headers — a static object or a (sync/async) resolver for refreshable auth. */
106
+ headers?: SearxngHeaders | SearxngHeadersResolver;
107
+ /** Request timeout in milliseconds. Default `10_000`. */
108
+ timeout?: number;
109
+ /**
110
+ * Output shape. `normalized`/`raw` pin the shape (the model cannot change it); `either`
111
+ * (default) exposes a `format` argument so the model chooses per call.
112
+ */
113
+ resultFormat?: SearxngResultFormat;
114
+ /** Tool name. Default `searxng_search`. */
115
+ name?: string;
116
+ /** Tool description override. */
117
+ description?: string;
118
+ /**
119
+ * Spool artifact constructor for the tool's output. Default `() => SpooledJsonArtifact`.
120
+ * Pass `() => SpooledMarkdownArtifact` (paired with an output stage that renders markdown into
121
+ * `ctx.output`) or `() => SpooledArtifact` for plain text.
122
+ */
123
+ artifactConstructor?: ArtifactConstructorResolver;
124
+ /** Stages run before the HTTP request. See {@link SearxngRequestContext}. */
125
+ inputPipeline?: SearxngInputMiddlewareFn[];
126
+ /** Stages run after the response is parsed. See {@link SearxngResponseContext}. */
127
+ outputPipeline?: SearxngOutputMiddlewareFn[];
128
+ }
129
+ /**
130
+ * Create a configured SearXNG search {@link Tool}.
131
+ *
132
+ * @remarks
133
+ * The handler always requests `format=json`. Note that SearXNG ships with JSON output
134
+ * **disabled** by default (it is abused by bots); an instance that has not enabled
135
+ * `search.formats: [json]` in its `settings.yml` answers with HTTP 403, which the tool returns
136
+ * as a graceful `Error:` string naming the setting.
137
+ *
138
+ * @warning
139
+ * Do not trust the `number_of_results` field for a result count — SearXNG frequently reports `0`
140
+ * in JSON output even when `results` is non-empty. This is a long-standing upstream quirk, not a
141
+ * tool defect (see {@link https://github.com/searxng/searxng/issues/2987 | searxng#2987} and
142
+ * {@link https://github.com/searxng/searxng/issues/2457 | searxng#2457}). The tool passes the
143
+ * field through verbatim; use `results.length` as the authoritative count.
144
+ *
145
+ * @param config - The instance URL, optional custom headers, output-format policy, artifact
146
+ * type, and input/output middleware pipelines. See {@link SearxngToolConfig}.
147
+ * @returns A `Tool` ready to register in a `ToolRegistry`.
148
+ * @throws {@link E_INVALID_SEARXNG_CONFIG} when `instanceUrl` is missing or unparseable.
149
+ */
150
+ export declare const createSearxngSearchTool: (config: SearxngToolConfig) => Tool;
@@ -0,0 +1,5 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../chunk-Ble4zEEl.js");
3
+ const require_searxng = require("../../searxng-Bkrwhwhw.js");
4
+ exports.E_INVALID_SEARXNG_CONFIG = require_searxng.E_INVALID_SEARXNG_CONFIG;
5
+ exports.createSearxngSearchTool = require_searxng.createSearxngSearchTool;
@@ -0,0 +1,2 @@
1
+ import { n as E_INVALID_SEARXNG_CONFIG, t as createSearxngSearchTool } from "../../searxng-CyA-nEu5.mjs";
2
+ export { E_INVALID_SEARXNG_CONFIG, createSearxngSearchTool };
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+CA,SAAS,aAAa,OAA8C;CAClE,IAAI,CAAC,MAAM,QAAQ,KAAK,GAAG,OAAO,EAAE,OAAO,qCAAqC;CAChF,IAAI,MAAM,WAAW,GAAG,OAAO,EAAE,OAAO,0CAA0C;CAClF,OAAO;AACT;;AAGA,IAAM,iBAAiB,kBAAA,UACpB,OAAO,EACP,QAAA,CAAyB,EACzB,YAAY,qDAAwE;;;;;;;;;AAUvF,IAAa,oBAAoB,IAAI,aAAA,KAAK;CACxC,MAAM;CACN,aACE;CACF,aAAa,kBAAA,UAAU,OAAO;EAC5B,SAAS,kBAAA,UAAU,MAAM,EAAE,MAAM,kBAAA,UAAU,OAAO,CAAC,EAAE,SAAS,EAAE,YAAY,kBAAkB;EAC9F,WAAW;CACb,CAAC;CACD,2BAA2B,kCAAA;CAC3B,SAAS,OAAO,SAAS;EACvB,MAAM,EAAE,SAAS,cAAc;EAC/B,MAAM,OAAO,aAAa,OAAO;EACjC,IAAI,WAAW,MAAM,OAAO,UAAU,KAAK;EAE3C,MAAM,SAAS,CAAC,GAAG,IAAI,EAAE,MAAM,GAAG,MAAM,IAAI,CAAC;EAC7C,MAAM,WAAA,GAAA,kBAAA,MAAe,IAAI;EAMzB,MAAM,OAAO,MAAsB,2BAAA,UAAU,GAAG,SAAS;EAEzD,OAAO,KAAK,UACV;GACE,OAAO,KAAK;GACZ,KAAK,2BAAA,UAAU,2BAAA,OAAO,IAAI,GAAG,SAAS;GACtC,MAAA,GAAA,kBAAA,KAAS,IAAI;GACb,MAAA,GAAA,kBAAA,KAAS,IAAI;GACb,QAAA,GAAA,kBAAA,KAAW,IAAI,KAAA,GAAA,kBAAA,KAAQ,IAAI;GAC3B,MAAM,2BAAA,UAAU,2BAAA,QAAQ,IAAI,GAAG,SAAS;GACxC,SAAA,GAAA,kBAAA,QAAe,IAAI;GACnB,MAAM;GACN,UAAU,KAAA,GAAA,kBAAA,UAAa,IAAI,CAAC;GAC5B,SAAS,KAAA,GAAA,kBAAA,mBAAsB,IAAI,CAAC;GACpC,KAAA,GAAA,kBAAA,UAAa,QAAQ,GAAI;GACzB,KAAA,GAAA,kBAAA,UAAa,QAAQ,EAAG;GACxB,KAAA,GAAA,kBAAA,UAAa,QAAQ,GAAI;GACzB,MAAA,GAAA,kBAAA,oBAAwB,IAAI;GAC5B,MAAA,GAAA,kBAAA,UAAc,QAAQ,EAAG;GACzB,MAAA,GAAA,kBAAA,UAAc,QAAQ,EAAG;GACzB,MAAA,GAAA,kBAAA,UAAc,QAAQ,GAAI;GAC1B,MAAA,GAAA,kBAAA,UAAc,QAAQ,GAAI;EAC5B,GACA,MACA,CACF;CACF;AACF,CAAC;;;;;;;;AASD,IAAa,qBAAqB,IAAI,aAAA,KAAK;CACzC,MAAM;CACN,aACE;CACF,aAAa,kBAAA,UAAU,OAAO;EAC5B,GAAG,kBAAA,UACA,MAAM,EACN,MAAM,kBAAA,UAAU,OAAO,CAAC,EACxB,SAAS,EACT,YAAY,mCAAmC;EAClD,GAAG,kBAAA,UACA,MAAM,EACN,MAAM,kBAAA,UAAU,OAAO,CAAC,EACxB,SAAS,EACT,YAAY,sDAAsD;CACvE,CAAC;CACD,SAAS,OAAO,SAAS;EACvB,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS;EAC7B,MAAM,IAAI,aAAa,IAAI;EAC3B,IAAI,WAAW,GAAG,OAAO,eAAe,EAAE;EAC1C,MAAM,IAAI,aAAa,IAAI;EAC3B,IAAI,WAAW,GAAG,OAAO,eAAe,EAAE;EAE1C,IAAI,EAAE,WAAW,EAAE,QACjB,OAAO,6CAA6C,EAAE,OAAO,OAAO,EAAE,OAAO;EAC/E,IAAI,EAAE,SAAS,GAAG,OAAO;EAKzB,KAAA,GAAA,kBAAA,mBAAsB,CAAC,MAAM,MAAA,GAAA,kBAAA,mBAAuB,CAAC,MAAM,GACzD,OAAO;EAGT,IAAI;GACF,MAAM,KAAA,GAAA,kBAAA,mBAAsB,GAAG,CAAC;GAChC,MAAM,OAAO,KAAK,IAAI,CAAC;GACvB,MAAM,YAAY,IAAI,IAAI,aAAa,IAAI,IAAI,aAAa;GAC5D,MAAM,WACJ,QAAQ,KACJ,gBACA,QAAQ,KACN,WACA,QAAQ,KACN,aACA,QAAQ,KACN,SACA;GACZ,OAAO,OAAO,EAAE,QAAQ,CAAC,EAAE,UAAU,IAAI,IAAI,KAAK,QAAQ,CAAC,EAAE,0CAA0C,SAAS,GAAG,UAAU;EAC/H,SAAS,KAAK;GACZ,OAAO,UAAU,sBAAA,QAAQ,GAAG,IAAI,IAAI,UAAU,OAAO,GAAG;EAC1D;CACF;AACF,CAAC;;;;;;;;;;AAWD,IAAa,qBAAqB,IAAI,aAAA,KAAK;CACzC,MAAM;CACN,aACE;CACF,aAAa,kBAAA,UAAU,OAAO;EAC5B,SAAS,kBAAA,UAAU,MAAM,EAAE,MAAM,kBAAA,UAAU,OAAO,CAAC,EAAE,SAAS,EAAE,YAAY,kBAAkB;EAC9F,WAAW,kBAAA,UACR,OAAO,EACP,MACC,qBACA,qBACA,4BACA,iBACA,eACA,cACA,QACA,gBACA,iBACF,EACC,SAAS,EACT,YAAY,yBAAyB;EACxC,QAAQ,kBAAA,UAAU,OAAO,EAAE,QAAQ,CAAC,EAAE,YAAY,2CAA2C;EAC7F,WAAW,kBAAA,UACR,OAAO,EACP,QAAQ,CAAG,EACX,YAAY,uDAAuD;EACtE,WAAW;CACb,CAAC;CACD,SAAS,OAAO,SAAS;EACvB,MAAM,EAAE,SAAS,WAAW,QAAQ,WAAW,cAAc;EAO7D,MAAM,OAAO,aAAa,OAAO;EACjC,IAAI,WAAW,MAAM,OAAO,UAAU,KAAK;EAG3C,MAAM,SAAS,MAAsB,OAAO,WAAW,2BAAA,UAAU,GAAG,SAAS,CAAC;EAE9E,QAAQ,WAAR;GACE,KAAK,qBAAqB;IACxB,MAAM,MAAA,GAAA,kBAAA,KAAS,IAAI;IACnB,MAAM,MAAA,GAAA,kBAAA,KAAS,IAAI;IACnB,IAAI,OAAO,IAAI,OAAO,KAAK,UAAU,KAAK,UAAU,CAAC,CAAC;IACtD,OAAO,KAAK,UAAU,KAAK,KAAK,MAAM,OAAO,IAAI,OAAO,KAAK,GAAG,CAAC,CAAC;GACpE;GAEA,KAAK,qBAAqB;IACxB,MAAM,KAAA,GAAA,kBAAA,MAAS,IAAI;IACnB,MAAM,MAAA,GAAA,kBAAA,mBAAuB,IAAI;IACjC,IAAI,OAAO,GAAG,OAAO,KAAK,UAAU,KAAK,UAAU,CAAC,CAAC;IACrD,OAAO,KAAK,UAAU,KAAK,KAAK,MAAM,OAAA,GAAA,kBAAA,QAAa,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;GAChE;GAEA,KAAK,4BAA4B;IAC/B,MAAM,SAAA,GAAA,kBAAA,KAAY,IAAI;IACtB,IAAI,UAAU,GAAG,OAAO,KAAK,UAAU,KAAK,UAAU,CAAC,CAAC;IACxD,OAAO,KAAK,UAAU,KAAK,KAAK,MAAM,MAAO,IAAI,QAAS,GAAG,CAAC,CAAC;GACjE;GAEA,KAAK,iBAKH,OAAO,KAAK,UACV,KAAK,KAAK,GAAG,MAAM;IACjB,MAAM,MAAM,2BAAA,OAAO,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC;IACvC,MAAM,QAAQ,2BAAA,YAAY,GAAG;IAG7B,IAAI,OAAO,SAAS,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,OAAO,kBACtD,OAAO,MAAM,KAAK;IAEpB,OAAO,2BAAA,UAAU,KAAK,SAAS;GACjC,CAAC,CACH;GAGF,KAAK,eAAe;IAClB,MAAM,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,CAAC;IACxC,OAAO,KAAK,UACV,KAAK,KAAK,GAAG,MAAM;KAEjB,OAAO,OAAA,GAAA,kBAAA,MADO,KAAK,MAAM,KAAK,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,IAAI,CACnC,CAAK,CAAC;IAC1B,CAAC,CACH;GACF;GAEA,KAAK,cAAc;IACjB,MAAM,UAA6B,CAAC,IAAI;IACxC,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAC/B,IAAI,KAAK,IAAI,OAAO,GAClB,QAAQ,KAAK,IAAI;SAEjB,QAAQ,KACN,OAAO,aACF,KAAK,KAAK,KAAK,IAAI,MAAM,KAAK,IAAI,KAAK,IAAI,EAAE,IAAK,KAAK,QAAQ,CAAC,CACrE,CACF;IAGJ,OAAO,KAAK,UAAU,OAAO;GAC/B;GAEA,KAAK,QAAQ;IACX,MAAM,SAAS,CAAC,GAAG,IAAI,EAAE,MAAM,GAAG,MAAM,IAAI,CAAC;IAC7C,OAAO,KAAK,UAAU,KAAK,KAAK,MAAM,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;GAC9D;GAEA,KAAK,gBAAgB;IACnB,MAAM,SAAS,CAAC,GAAG,IAAI,EAAE,MAAM,GAAG,MAAM,IAAI,CAAC;IAC7C,MAAM,MAAA,GAAA,kBAAA,UAAc,QAAQ,GAAI;IAChC,MAAM,MAAA,GAAA,kBAAA,UAAc,QAAQ,GAAI;IAChC,MAAM,MAAM,KAAK;IACjB,MAAM,KAAK,KAAK,MAAM;IACtB,MAAM,KAAK,KAAK,MAAM;IACtB,MAAM,WAAW,KACd,KAAK,GAAG,OAAO;KAAE,OAAO;KAAG,OAAO;IAAE,EAAE,EACtC,QAAQ,EAAE,YAAY,QAAQ,MAAM,QAAQ,EAAE;IACjD,IAAI,SAAS,WAAW,GAAG,OAAO;IAClC,OAAO,GAAG,SAAS,OAAO,yBAAyB,SAAS,KAAK,MAAM,MAAM,EAAE,MAAM,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI;GACjH;GAEA,KAAK,mBAAmB;IACtB,MAAM,KAAA,GAAA,kBAAA,MAAS,IAAI;IACnB,MAAM,MAAA,GAAA,kBAAA,mBAAuB,IAAI;IACjC,MAAM,WAAW,KACd,KAAK,GAAG,OAAO;KAAE,OAAO;KAAG,OAAO;KAAG,GAAG,OAAO,IAAI,IAAI,KAAK,KAAA,GAAA,kBAAA,QAAW,GAAG,GAAG,EAAE,CAAC;IAAE,EAAE,EACpF,QAAQ,MAAM,EAAE,IAAI,SAAS;IAChC,IAAI,SAAS,WAAW,GAAG,OAAO,+BAA+B,UAAU;IAC3E,OAAO,GAAG,SAAS,OAAO,8BAA8B,UAAU,MAAM,SAAS,KAAK,MAAM,MAAM,EAAE,MAAM,MAAM,EAAE,MAAM,QAAQ,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,EAAE,KAAK,IAAI;GAC9J;GAEA,SACE,OAAO,6BAA6B,UAAU;EAClD;CACF;AACF,CAAC;;;;;;;;;AAUD,IAAa,qBAAqB,IAAI,aAAA,KAAK;CACzC,MAAM;CACN,aAAa;CACb,aAAa,kBAAA,UAAU,OAAO;EAC5B,SAAS,kBAAA,UAAU,MAAM,EAAE,MAAM,kBAAA,UAAU,OAAO,CAAC,EAAE,SAAS,EAAE,YAAY,kBAAkB;EAC9F,MAAM,kBAAA,UAAU,OAAO,EAAE,QAAQ,EAAE,EAAE,YAAY,wCAAwC;EACzF,WAAW;CACb,CAAC;CACD,SAAS,OAAO,SAAS;EACvB,MAAM,EAAE,SAAS,MAAM,cAAc;EAKrC,MAAM,OAAO,aAAa,OAAO;EACjC,IAAI,WAAW,MAAM,OAAO,UAAU,KAAK;EAE3C,MAAM,WAAW,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,IAAI,CAAC,CAAC;EAE5D,IAAI;GACF,MAAM,UAAA,GAAA,kBAAA,qBAA6B,MAAM,QAAQ;GACjD,MAAM,OAAiB,CAAC;GACxB,MAAM,kBAAkB;IACtB,IAAI,IAAI;IACR,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,SAAS,GAAG,KAAK;KAC1C,MAAM,SAAS,MAAM,OAAO,SAAS;KACrC,MAAM,QAAQ,KAAK,QAAQ,MACzB,SAAS,KAAK,OAAO,MAAM,KAAK,OAAO,IAAI,KAAK,KAAK,OAAO,MAAM,IAAI,OAAO,IAAI,EACnF,EAAE;KACF,IAAI,QAAQ,GAAG,IAAI;IACrB;IACA,OAAO;GACT,GAAG;GAEH,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,SAAS,GAAG,KAAK;IAC1C,MAAM,SAAS,MAAM,OAAO,SAAS;IACrC,MAAM,QAAQ,KAAK,QAAQ,MACzB,SAAS,KAAK,OAAO,MAAM,KAAK,OAAO,IAAI,KAAK,KAAK,OAAO,MAAM,IAAI,OAAO,IAAI,EACnF,EAAE;IACF,MAAM,OAAQ,QAAQ,KAAK,SAAU,KAAK,QAAQ,CAAC;IACnD,MAAM,MAAM,IAAI,OAAO,WAAW,IAAI,KAAK,MAAO,QAAQ,WAAY,EAAE,IAAI,CAAC;IAC7E,MAAM,QAAQ,IAAI,2BAAA,UAAU,OAAO,IAAI,SAAS,EAAE,IAAI,2BAAA,UAAU,OAAO,IAAI,IAAI,SAAS,IAAI,SAAS,MAAM;IAC3G,KAAK,KAAK,GAAG,MAAM,OAAO,EAAE,EAAE,GAAG,OAAO,KAAK,EAAE,SAAS,CAAC,EAAE,IAAI,IAAI,SAAS,CAAC,EAAE,KAAK,KAAK;GAC3F;GAEA,OAAO,KAAK,KAAK,IAAI;EACvB,SAAS,KAAK;GACZ,OAAO,UAAU,sBAAA,QAAQ,GAAG,IAAI,IAAI,UAAU,OAAO,GAAG;EAC1D;CACF;AACF,CAAC"}