@nhtio/adk 1.20260604.0 → 1.20260607.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 (358) hide show
  1. package/CHANGELOG.md +261 -0
  2. package/adk-mcp.mjs +1 -1
  3. package/batteries/embeddings/openai/adapter.cjs +1 -1
  4. package/batteries/embeddings/openai/adapter.mjs +1 -1
  5. package/batteries/embeddings/webllm/adapter.cjs +1 -1
  6. package/batteries/embeddings/webllm/adapter.mjs +1 -1
  7. package/batteries/index.d.ts +1 -0
  8. package/batteries/llm/openai_chat_completions/adapter.cjs +6 -6
  9. package/batteries/llm/openai_chat_completions/adapter.cjs.map +1 -1
  10. package/batteries/llm/openai_chat_completions/adapter.mjs +6 -6
  11. package/batteries/llm/openai_chat_completions/adapter.mjs.map +1 -1
  12. package/batteries/llm/openai_chat_completions/helpers.cjs +2 -2
  13. package/batteries/llm/openai_chat_completions/helpers.mjs +2 -2
  14. package/batteries/llm/openai_chat_completions/validation.cjs +2 -2
  15. package/batteries/llm/openai_chat_completions/validation.cjs.map +1 -1
  16. package/batteries/llm/openai_chat_completions/validation.mjs +2 -2
  17. package/batteries/llm/openai_chat_completions/validation.mjs.map +1 -1
  18. package/batteries/llm/webllm_chat_completions/adapter.cjs +6 -6
  19. package/batteries/llm/webllm_chat_completions/adapter.cjs.map +1 -1
  20. package/batteries/llm/webllm_chat_completions/adapter.mjs +6 -6
  21. package/batteries/llm/webllm_chat_completions/adapter.mjs.map +1 -1
  22. package/batteries/llm/webllm_chat_completions/validation.cjs +2 -2
  23. package/batteries/llm/webllm_chat_completions/validation.cjs.map +1 -1
  24. package/batteries/llm/webllm_chat_completions/validation.mjs +2 -2
  25. package/batteries/llm/webllm_chat_completions/validation.mjs.map +1 -1
  26. package/batteries/storage/flydrive.cjs +1 -1
  27. package/batteries/storage/flydrive.mjs +2 -2
  28. package/batteries/storage/in_memory.cjs +1 -1
  29. package/batteries/storage/in_memory.mjs +1 -1
  30. package/batteries/storage/opfs.cjs +1 -1
  31. package/batteries/storage/opfs.mjs +1 -1
  32. package/batteries/tools/color.cjs +2 -2
  33. package/batteries/tools/color.mjs +2 -2
  34. package/batteries/tools/comparison.cjs +3 -3
  35. package/batteries/tools/comparison.mjs +3 -3
  36. package/batteries/tools/data_structure.cjs +3 -3
  37. package/batteries/tools/data_structure.mjs +3 -3
  38. package/batteries/tools/datetime_extended.cjs +2 -2
  39. package/batteries/tools/datetime_extended.mjs +2 -2
  40. package/batteries/tools/datetime_math.cjs +2 -2
  41. package/batteries/tools/datetime_math.mjs +2 -2
  42. package/batteries/tools/encoding.cjs +3 -3
  43. package/batteries/tools/encoding.mjs +3 -3
  44. package/batteries/tools/formatting.cjs +3 -3
  45. package/batteries/tools/formatting.mjs +3 -3
  46. package/batteries/tools/geo_basics.cjs +2 -2
  47. package/batteries/tools/geo_basics.mjs +2 -2
  48. package/batteries/tools/math/index.d.ts +16 -5
  49. package/batteries/tools/math.cjs +340 -22
  50. package/batteries/tools/math.cjs.map +1 -1
  51. package/batteries/tools/math.mjs +338 -21
  52. package/batteries/tools/math.mjs.map +1 -1
  53. package/batteries/tools/memory.cjs +5 -5
  54. package/batteries/tools/memory.mjs +5 -5
  55. package/batteries/tools/parsing.cjs +4 -4
  56. package/batteries/tools/parsing.mjs +4 -4
  57. package/batteries/tools/retrievables.cjs +4 -4
  58. package/batteries/tools/retrievables.mjs +4 -4
  59. package/batteries/tools/standing_instructions.cjs +4 -4
  60. package/batteries/tools/standing_instructions.mjs +4 -4
  61. package/batteries/tools/statistics.cjs +4 -4
  62. package/batteries/tools/statistics.mjs +4 -4
  63. package/batteries/tools/string_processing.cjs +3 -3
  64. package/batteries/tools/string_processing.mjs +3 -3
  65. package/batteries/tools/structured_data.cjs +3 -3
  66. package/batteries/tools/structured_data.mjs +3 -3
  67. package/batteries/tools/text_analysis.cjs +3 -3
  68. package/batteries/tools/text_analysis.mjs +3 -3
  69. package/batteries/tools/text_comparison.cjs +2 -2
  70. package/batteries/tools/text_comparison.mjs +2 -2
  71. package/batteries/tools/time.cjs +2 -2
  72. package/batteries/tools/time.mjs +2 -2
  73. package/batteries/tools/unit_conversion.cjs +2 -2
  74. package/batteries/tools/unit_conversion.mjs +2 -2
  75. package/batteries/vector/arangodb/index.d.ts +38 -0
  76. package/batteries/vector/arangodb.cjs +257 -0
  77. package/batteries/vector/arangodb.cjs.map +1 -0
  78. package/batteries/vector/arangodb.mjs +255 -0
  79. package/batteries/vector/arangodb.mjs.map +1 -0
  80. package/batteries/vector/builder.cjs +297 -0
  81. package/batteries/vector/builder.cjs.map +1 -0
  82. package/batteries/vector/builder.d.ts +87 -0
  83. package/batteries/vector/builder.mjs +294 -0
  84. package/batteries/vector/builder.mjs.map +1 -0
  85. package/batteries/vector/chroma/index.d.ts +32 -0
  86. package/batteries/vector/chroma.cjs +305 -0
  87. package/batteries/vector/chroma.cjs.map +1 -0
  88. package/batteries/vector/chroma.mjs +302 -0
  89. package/batteries/vector/chroma.mjs.map +1 -0
  90. package/batteries/vector/clickhouse/index.d.ts +39 -0
  91. package/batteries/vector/clickhouse.cjs +246 -0
  92. package/batteries/vector/clickhouse.cjs.map +1 -0
  93. package/batteries/vector/clickhouse.mjs +244 -0
  94. package/batteries/vector/clickhouse.mjs.map +1 -0
  95. package/batteries/vector/cloudflare/index.d.ts +43 -0
  96. package/batteries/vector/cloudflare.cjs +397 -0
  97. package/batteries/vector/cloudflare.cjs.map +1 -0
  98. package/batteries/vector/cloudflare.mjs +395 -0
  99. package/batteries/vector/cloudflare.mjs.map +1 -0
  100. package/batteries/vector/conformance/index.d.ts +15 -0
  101. package/batteries/vector/conformance.cjs +209 -0
  102. package/batteries/vector/conformance.cjs.map +1 -0
  103. package/batteries/vector/conformance.mjs +205 -0
  104. package/batteries/vector/conformance.mjs.map +1 -0
  105. package/batteries/vector/contract.cjs +42 -0
  106. package/batteries/vector/contract.cjs.map +1 -0
  107. package/batteries/vector/contract.d.ts +39 -0
  108. package/batteries/vector/contract.mjs +40 -0
  109. package/batteries/vector/contract.mjs.map +1 -0
  110. package/batteries/vector/couchbase/index.d.ts +49 -0
  111. package/batteries/vector/couchbase.cjs +401 -0
  112. package/batteries/vector/couchbase.cjs.map +1 -0
  113. package/batteries/vector/couchbase.mjs +399 -0
  114. package/batteries/vector/couchbase.mjs.map +1 -0
  115. package/batteries/vector/duckdb/index.d.ts +33 -0
  116. package/batteries/vector/duckdb.cjs +218 -0
  117. package/batteries/vector/duckdb.cjs.map +1 -0
  118. package/batteries/vector/duckdb.mjs +216 -0
  119. package/batteries/vector/duckdb.mjs.map +1 -0
  120. package/batteries/vector/elasticsearch/index.d.ts +43 -0
  121. package/batteries/vector/elasticsearch.cjs +306 -0
  122. package/batteries/vector/elasticsearch.cjs.map +1 -0
  123. package/batteries/vector/elasticsearch.mjs +303 -0
  124. package/batteries/vector/elasticsearch.mjs.map +1 -0
  125. package/batteries/vector/exceptions.cjs +126 -0
  126. package/batteries/vector/exceptions.cjs.map +1 -0
  127. package/batteries/vector/exceptions.d.ts +142 -0
  128. package/batteries/vector/exceptions.mjs +107 -0
  129. package/batteries/vector/exceptions.mjs.map +1 -0
  130. package/batteries/vector/factory.cjs +28 -0
  131. package/batteries/vector/factory.cjs.map +1 -0
  132. package/batteries/vector/factory.d.ts +38 -0
  133. package/batteries/vector/factory.mjs +25 -0
  134. package/batteries/vector/factory.mjs.map +1 -0
  135. package/batteries/vector/filters.cjs +107 -0
  136. package/batteries/vector/filters.cjs.map +1 -0
  137. package/batteries/vector/filters.d.ts +34 -0
  138. package/batteries/vector/filters.mjs +99 -0
  139. package/batteries/vector/filters.mjs.map +1 -0
  140. package/batteries/vector/helpers.cjs +23 -0
  141. package/batteries/vector/helpers.cjs.map +1 -0
  142. package/batteries/vector/helpers.d.ts +12 -0
  143. package/batteries/vector/helpers.mjs +17 -0
  144. package/batteries/vector/helpers.mjs.map +1 -0
  145. package/batteries/vector/hnswlib/index.d.ts +35 -0
  146. package/batteries/vector/hnswlib.cjs +237 -0
  147. package/batteries/vector/hnswlib.cjs.map +1 -0
  148. package/batteries/vector/hnswlib.mjs +235 -0
  149. package/batteries/vector/hnswlib.mjs.map +1 -0
  150. package/batteries/vector/in_memory/index.d.ts +23 -0
  151. package/batteries/vector/in_memory.cjs +178 -0
  152. package/batteries/vector/in_memory.cjs.map +1 -0
  153. package/batteries/vector/in_memory.mjs +176 -0
  154. package/batteries/vector/in_memory.mjs.map +1 -0
  155. package/batteries/vector/index.d.ts +18 -0
  156. package/batteries/vector/lancedb/index.d.ts +34 -0
  157. package/batteries/vector/lancedb.cjs +224 -0
  158. package/batteries/vector/lancedb.cjs.map +1 -0
  159. package/batteries/vector/lancedb.mjs +222 -0
  160. package/batteries/vector/lancedb.mjs.map +1 -0
  161. package/batteries/vector/mariadb/index.d.ts +39 -0
  162. package/batteries/vector/mariadb.cjs +228 -0
  163. package/batteries/vector/mariadb.cjs.map +1 -0
  164. package/batteries/vector/mariadb.mjs +226 -0
  165. package/batteries/vector/mariadb.mjs.map +1 -0
  166. package/batteries/vector/meilisearch/index.d.ts +36 -0
  167. package/batteries/vector/meilisearch.cjs +242 -0
  168. package/batteries/vector/meilisearch.cjs.map +1 -0
  169. package/batteries/vector/meilisearch.mjs +240 -0
  170. package/batteries/vector/meilisearch.mjs.map +1 -0
  171. package/batteries/vector/migrate.cjs +54 -0
  172. package/batteries/vector/migrate.cjs.map +1 -0
  173. package/batteries/vector/migrate.d.ts +30 -0
  174. package/batteries/vector/migrate.mjs +52 -0
  175. package/batteries/vector/migrate.mjs.map +1 -0
  176. package/batteries/vector/milvus/index.d.ts +35 -0
  177. package/batteries/vector/milvus.cjs +357 -0
  178. package/batteries/vector/milvus.cjs.map +1 -0
  179. package/batteries/vector/milvus.mjs +354 -0
  180. package/batteries/vector/milvus.mjs.map +1 -0
  181. package/batteries/vector/mongodb/index.d.ts +46 -0
  182. package/batteries/vector/mongodb.cjs +270 -0
  183. package/batteries/vector/mongodb.cjs.map +1 -0
  184. package/batteries/vector/mongodb.mjs +268 -0
  185. package/batteries/vector/mongodb.mjs.map +1 -0
  186. package/batteries/vector/neo4j/index.d.ts +38 -0
  187. package/batteries/vector/neo4j.cjs +231 -0
  188. package/batteries/vector/neo4j.cjs.map +1 -0
  189. package/batteries/vector/neo4j.mjs +229 -0
  190. package/batteries/vector/neo4j.mjs.map +1 -0
  191. package/batteries/vector/opensearch/index.d.ts +46 -0
  192. package/batteries/vector/opensearch.cjs +316 -0
  193. package/batteries/vector/opensearch.cjs.map +1 -0
  194. package/batteries/vector/opensearch.mjs +313 -0
  195. package/batteries/vector/opensearch.mjs.map +1 -0
  196. package/batteries/vector/oracle23ai/index.d.ts +45 -0
  197. package/batteries/vector/oracle23ai.cjs +340 -0
  198. package/batteries/vector/oracle23ai.cjs.map +1 -0
  199. package/batteries/vector/oracle23ai.mjs +338 -0
  200. package/batteries/vector/oracle23ai.mjs.map +1 -0
  201. package/batteries/vector/orama/index.d.ts +23 -0
  202. package/batteries/vector/orama.cjs +272 -0
  203. package/batteries/vector/orama.cjs.map +1 -0
  204. package/batteries/vector/orama.mjs +270 -0
  205. package/batteries/vector/orama.mjs.map +1 -0
  206. package/batteries/vector/pgvector/index.d.ts +43 -0
  207. package/batteries/vector/pgvector.cjs +411 -0
  208. package/batteries/vector/pgvector.cjs.map +1 -0
  209. package/batteries/vector/pgvector.mjs +408 -0
  210. package/batteries/vector/pgvector.mjs.map +1 -0
  211. package/batteries/vector/pinecone/index.d.ts +38 -0
  212. package/batteries/vector/pinecone.cjs +415 -0
  213. package/batteries/vector/pinecone.cjs.map +1 -0
  214. package/batteries/vector/pinecone.mjs +412 -0
  215. package/batteries/vector/pinecone.mjs.map +1 -0
  216. package/batteries/vector/plan.cjs +2 -0
  217. package/batteries/vector/plan.d.ts +65 -0
  218. package/batteries/vector/plan.mjs +0 -0
  219. package/batteries/vector/qdrant/index.d.ts +34 -0
  220. package/batteries/vector/qdrant.cjs +286 -0
  221. package/batteries/vector/qdrant.cjs.map +1 -0
  222. package/batteries/vector/qdrant.mjs +284 -0
  223. package/batteries/vector/qdrant.mjs.map +1 -0
  224. package/batteries/vector/redis/index.d.ts +44 -0
  225. package/batteries/vector/redis.cjs +391 -0
  226. package/batteries/vector/redis.cjs.map +1 -0
  227. package/batteries/vector/redis.mjs +388 -0
  228. package/batteries/vector/redis.mjs.map +1 -0
  229. package/batteries/vector/retrievable.cjs +69 -0
  230. package/batteries/vector/retrievable.cjs.map +1 -0
  231. package/batteries/vector/retrievable.mjs +67 -0
  232. package/batteries/vector/retrievable.mjs.map +1 -0
  233. package/batteries/vector/retrievable_glue.d.ts +24 -0
  234. package/batteries/vector/s3vectors/index.d.ts +52 -0
  235. package/batteries/vector/s3vectors.cjs +438 -0
  236. package/batteries/vector/s3vectors.cjs.map +1 -0
  237. package/batteries/vector/s3vectors.mjs +436 -0
  238. package/batteries/vector/s3vectors.mjs.map +1 -0
  239. package/batteries/vector/schema.cjs +96 -0
  240. package/batteries/vector/schema.cjs.map +1 -0
  241. package/batteries/vector/schema.d.ts +40 -0
  242. package/batteries/vector/schema.mjs +93 -0
  243. package/batteries/vector/schema.mjs.map +1 -0
  244. package/batteries/vector/solr/index.d.ts +36 -0
  245. package/batteries/vector/solr.cjs +230 -0
  246. package/batteries/vector/solr.cjs.map +1 -0
  247. package/batteries/vector/solr.mjs +228 -0
  248. package/batteries/vector/solr.mjs.map +1 -0
  249. package/batteries/vector/sqlite_vec/index.d.ts +30 -0
  250. package/batteries/vector/sqlite_vec.cjs +318 -0
  251. package/batteries/vector/sqlite_vec.cjs.map +1 -0
  252. package/batteries/vector/sqlite_vec.mjs +316 -0
  253. package/batteries/vector/sqlite_vec.mjs.map +1 -0
  254. package/batteries/vector/surrealdb/index.d.ts +37 -0
  255. package/batteries/vector/surrealdb.cjs +230 -0
  256. package/batteries/vector/surrealdb.cjs.map +1 -0
  257. package/batteries/vector/surrealdb.mjs +228 -0
  258. package/batteries/vector/surrealdb.mjs.map +1 -0
  259. package/batteries/vector/types.cjs +2 -0
  260. package/batteries/vector/types.d.ts +100 -0
  261. package/batteries/vector/types.mjs +0 -0
  262. package/batteries/vector/typesense/index.d.ts +38 -0
  263. package/batteries/vector/typesense.cjs +272 -0
  264. package/batteries/vector/typesense.cjs.map +1 -0
  265. package/batteries/vector/typesense.mjs +270 -0
  266. package/batteries/vector/typesense.mjs.map +1 -0
  267. package/batteries/vector/validation.cjs +90 -0
  268. package/batteries/vector/validation.cjs.map +1 -0
  269. package/batteries/vector/validation.d.ts +18 -0
  270. package/batteries/vector/validation.mjs +83 -0
  271. package/batteries/vector/validation.mjs.map +1 -0
  272. package/batteries/vector/vector_store_constructor.cjs +56 -0
  273. package/batteries/vector/vector_store_constructor.cjs.map +1 -0
  274. package/batteries/vector/vector_store_constructor.d.ts +30 -0
  275. package/batteries/vector/vector_store_constructor.mjs +53 -0
  276. package/batteries/vector/vector_store_constructor.mjs.map +1 -0
  277. package/batteries/vector/vespa/index.d.ts +39 -0
  278. package/batteries/vector/vespa.cjs +423 -0
  279. package/batteries/vector/vespa.cjs.map +1 -0
  280. package/batteries/vector/vespa.mjs +421 -0
  281. package/batteries/vector/vespa.mjs.map +1 -0
  282. package/batteries/vector/weaviate/index.d.ts +57 -0
  283. package/batteries/vector/weaviate.cjs +325 -0
  284. package/batteries/vector/weaviate.cjs.map +1 -0
  285. package/batteries/vector/weaviate.mjs +322 -0
  286. package/batteries/vector/weaviate.mjs.map +1 -0
  287. package/batteries/vector.cjs +63 -0
  288. package/batteries/vector.mjs +14 -0
  289. package/batteries.cjs +62 -0
  290. package/batteries.mjs +15 -1
  291. package/{chunk-kRvK8_k2.mjs → chunk-Bpcn9VDT.mjs} +5 -1
  292. package/{common-lMrnzoyn.mjs → common-BT0nfCi9.mjs} +8 -8
  293. package/{common-lMrnzoyn.mjs.map → common-BT0nfCi9.mjs.map} +1 -1
  294. package/{common-D_e5zYsG.js → common-Cj8TaQ9U.js} +8 -8
  295. package/{common-D_e5zYsG.js.map → common-Cj8TaQ9U.js.map} +1 -1
  296. package/common.cjs +7 -7
  297. package/common.mjs +7 -7
  298. package/{dispatch_runner-CpuyATj1.js → dispatch_runner-BHBNupqp.js} +2 -2
  299. package/dispatch_runner-BHBNupqp.js.map +1 -0
  300. package/{dispatch_runner-CDF3X0nv.mjs → dispatch_runner-DPcS7Y_M.mjs} +2 -2
  301. package/dispatch_runner-DPcS7Y_M.mjs.map +1 -0
  302. package/dispatch_runner.cjs +1 -1
  303. package/dispatch_runner.mjs +1 -1
  304. package/forge.cjs +4 -4
  305. package/forge.mjs +4 -4
  306. package/guards.cjs +8 -8
  307. package/guards.mjs +8 -8
  308. package/index.cjs +12 -12
  309. package/index.mjs +12 -12
  310. package/lib/classes/tool_registry.d.ts +70 -4
  311. package/mcp/adk-docs-corpus.json +1 -1
  312. package/package.json +424 -88
  313. package/skills/adk-assembly/SKILL.md +2 -2
  314. package/{spooled_artifact-B8gIIn9h.js → spooled_artifact-BTq6Nzfy.js} +4 -4
  315. package/spooled_artifact-BTq6Nzfy.js.map +1 -0
  316. package/{spooled_artifact-CWoKUDEm.mjs → spooled_artifact-CHoZgWwI.mjs} +4 -4
  317. package/spooled_artifact-CHoZgWwI.mjs.map +1 -0
  318. package/spooled_artifact.cjs +2 -2
  319. package/spooled_artifact.mjs +2 -2
  320. package/{spooled_markdown_artifact-DQX0RCdI.js → spooled_markdown_artifact-CALSDxIx.js} +3 -3
  321. package/{spooled_markdown_artifact-DQX0RCdI.js.map → spooled_markdown_artifact-CALSDxIx.js.map} +1 -1
  322. package/{spooled_markdown_artifact-CNle4jXN.mjs → spooled_markdown_artifact-Ci5UL7l4.mjs} +3 -3
  323. package/{spooled_markdown_artifact-CNle4jXN.mjs.map → spooled_markdown_artifact-Ci5UL7l4.mjs.map} +1 -1
  324. package/src/types/evaluatex.d.ts +31 -0
  325. package/{thought-BD6AkkOr.js → thought-BbwhJ1wb.js} +4 -4
  326. package/thought-BbwhJ1wb.js.map +1 -0
  327. package/{thought-B_P8LiB6.mjs → thought-D34QQZZ9.mjs} +4 -4
  328. package/thought-D34QQZZ9.mjs.map +1 -0
  329. package/{tool-CRZSUcdP.mjs → tool-CMhaDRNd.mjs} +3 -3
  330. package/tool-CMhaDRNd.mjs.map +1 -0
  331. package/{tool-CX9vNHAw.js → tool-CVyZkFC7.js} +3 -3
  332. package/tool-CVyZkFC7.js.map +1 -0
  333. package/{tool_call-BUeMuCc6.mjs → tool_call-CV5qVNlb.mjs} +3 -3
  334. package/{tool_call-BUeMuCc6.mjs.map → tool_call-CV5qVNlb.mjs.map} +1 -1
  335. package/{tool_call--7ti-frB.js → tool_call-Db68hB7y.js} +3 -3
  336. package/{tool_call--7ti-frB.js.map → tool_call-Db68hB7y.js.map} +1 -1
  337. package/{tool_registry-BGHg6KTq.mjs → tool_registry-D1pSSlsd.mjs} +109 -22
  338. package/tool_registry-D1pSSlsd.mjs.map +1 -0
  339. package/{tool_registry-CtCQ4Xoz.js → tool_registry-DYUYqXvo.js} +109 -22
  340. package/tool_registry-DYUYqXvo.js.map +1 -0
  341. package/{turn_runner-BJTtAORU.js → turn_runner-DqWHNP80.js} +5 -5
  342. package/turn_runner-DqWHNP80.js.map +1 -0
  343. package/{turn_runner-C02LZHjt.mjs → turn_runner-fg1Wc3dK.mjs} +5 -5
  344. package/turn_runner-fg1Wc3dK.mjs.map +1 -0
  345. package/turn_runner.cjs +1 -1
  346. package/turn_runner.mjs +1 -1
  347. package/dispatch_runner-CDF3X0nv.mjs.map +0 -1
  348. package/dispatch_runner-CpuyATj1.js.map +0 -1
  349. package/spooled_artifact-B8gIIn9h.js.map +0 -1
  350. package/spooled_artifact-CWoKUDEm.mjs.map +0 -1
  351. package/thought-BD6AkkOr.js.map +0 -1
  352. package/thought-B_P8LiB6.mjs.map +0 -1
  353. package/tool-CRZSUcdP.mjs.map +0 -1
  354. package/tool-CX9vNHAw.js.map +0 -1
  355. package/tool_registry-BGHg6KTq.mjs.map +0 -1
  356. package/tool_registry-CtCQ4Xoz.js.map +0 -1
  357. package/turn_runner-BJTtAORU.js.map +0 -1
  358. package/turn_runner-C02LZHjt.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chroma.mjs","names":["#opts","#client","#collectionCache"],"sources":["../../../src/batteries/vector/chroma/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/chroma\n */\n\nimport { normalizeScore } from '../helpers'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { isFilterCondition, isRawFilter, isFilterGroup } from '../filters'\nimport {\n E_VECTOR_STORE_DRIVER_UNAVAILABLE,\n E_VECTOR_STORE_CONNECTION_FAILED,\n E_VECTOR_STORE_COLLECTION_FAILED,\n E_VECTOR_STORE_UPSERT_FAILED,\n E_VECTOR_STORE_SEARCH_FAILED,\n E_VECTOR_STORE_DELETE_FAILED,\n E_VECTOR_STORE_DIMENSION_MISMATCH,\n E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR,\n} from '../exceptions'\nimport type { VectorFilter } from '../filters'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type {\n VectorMatch,\n VectorMetadata,\n BaseVectorStoreOptions,\n VectorStoreCapabilities,\n} from '../types'\n\nexport interface ChromaVectorStoreOptions extends BaseVectorStoreOptions {\n connection?: { url?: string; host?: string; port?: number; ssl?: boolean }\n}\n\nconst getChromaClient = async () => {\n try {\n const mod = await import('chromadb')\n return mod.ChromaClient\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['chromadb'])\n }\n}\n\nconst getSpace = (metric: string): string => {\n if (metric === 'cosine') return 'cosine'\n if (metric === 'euclidean') return 'l2'\n if (metric === 'dot') return 'ip'\n return 'cosine'\n}\n\nexport const translateChromaWhere = (\n filter?: VectorFilter\n): Record<string, unknown> | undefined => {\n if (!filter) return undefined\n if (isRawFilter(filter)) {\n if (filter.$dialect === 'chroma') {\n return filter.$raw as Record<string, unknown>\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['chroma', String(filter.$dialect)])\n }\n if (isFilterCondition(filter)) {\n const { field, op, value } = filter\n if (value === undefined) {\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['chroma', op])\n }\n if (op === 'eq') {\n return { [field]: { $eq: value } }\n }\n if (op === 'ne') {\n return { [field]: { $ne: value } }\n }\n if (op === 'gt') {\n return { [field]: { $gt: value } }\n }\n if (op === 'gte') {\n return { [field]: { $gte: value } }\n }\n if (op === 'lt') {\n return { [field]: { $lt: value } }\n }\n if (op === 'lte') {\n return { [field]: { $lte: value } }\n }\n if (op === 'in') {\n return { [field]: { $in: value } }\n }\n if (op === 'nin') {\n return { [field]: { $nin: value } }\n }\n if (op === 'exists' || op === 'contains') {\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['chroma', op])\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['chroma', op])\n }\n if (isFilterGroup(filter)) {\n const { and, or, not } = filter\n if (and) {\n const children = and\n .map((f) => translateChromaWhere(f) as Record<string, unknown>)\n .filter((c) => c !== undefined)\n if (children.length === 0) return undefined\n if (children.length === 1) return children[0]\n return { $and: children }\n }\n if (or) {\n const children = or\n .map((f) => translateChromaWhere(f) as Record<string, unknown>)\n .filter((c) => c !== undefined)\n if (children.length === 0) return undefined\n if (children.length === 1) return children[0]\n return { $or: children }\n }\n if (not) {\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['chroma', 'not'])\n }\n return undefined\n }\n return undefined\n}\n\nexport class ChromaVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: true,\n rawSql: false,\n builtInEncoding: false,\n // Strongly consistent on resolve; the option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n #client: any | null = null\n #collectionCache: Map<string, any> = new Map()\n get #opts() {\n return this.options as ChromaVectorStoreOptions\n }\n\n static isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n\n async connect(): Promise<void> {\n if (this.#client) return\n const ChromaClient = await getChromaClient()\n const c = this.#opts.connection || {}\n let host: string | undefined\n let port: number | undefined\n let ssl: boolean = false\n\n if (c.url) {\n const url = new URL(c.url)\n host = url.hostname\n port = url.port ? Number.parseInt(url.port, 10) : url.protocol === 'https:' ? 443 : 80\n ssl = url.protocol === 'https:'\n } else {\n host = c.host\n port = c.port\n ssl = c.ssl || false\n }\n\n const path =\n host && port !== undefined\n ? `${ssl ? 'https://' : 'http://'}${host}${port === 80 || port === 443 ? '' : ':' + port}`\n : undefined\n\n try {\n this.#client = new ChromaClient({ path })\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n\n async close(): Promise<void> {\n this.#client = null\n this.#collectionCache.clear()\n }\n\n async getCollection(name: string): Promise<any> {\n let collection = this.#collectionCache.get(name)\n if (collection) return collection\n if (!this.#client) await this.connect()\n const metric = this.#opts.metric ?? 'cosine'\n collection = await this.#client.getOrCreateCollection({\n name,\n metadata: { 'hnsw:space': getSpace(metric) },\n })\n this.#collectionCache.set(name, collection)\n return collection\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n const name = spec.collection\n if (ifNotExists && (await this.hasCollection(name))) return\n if (await this.hasCollection(name)) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['create', 'exists'])\n }\n try {\n await this.connect()\n const metric = spec.vector.metric ?? 'cosine'\n await this.#client!.getOrCreateCollection({\n name,\n metadata: { 'hnsw:space': getSpace(metric) },\n })\n this.#collectionCache.set(name, null)\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['createCollection', String(err)])\n }\n }\n\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n if (ifExists && !(await this.hasCollection(collection))) return\n try {\n await this.connect()\n await this.#client!.deleteCollection({ name: collection })\n this.#collectionCache.delete(collection)\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', String(err)])\n }\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n if (!this.#client) await this.connect()\n try {\n const collections = await this.#client!.listCollections()\n for (const c of collections) {\n if (typeof c === 'object' ? c.name === collection : c === collection) {\n return true\n }\n }\n return false\n } catch {\n return false\n }\n }\n\n async renameCollection(from: string, to: string): Promise<void> {\n try {\n const collection = await this.getCollection(from)\n await collection.modify({ name: to })\n const cached = this.#collectionCache.get(from)\n this.#collectionCache.delete(from)\n if (cached) {\n this.#collectionCache.set(to, cached)\n }\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['renameCollection', String(err)])\n }\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const collection = await this.getCollection(plan.collection)\n const expected = this.#opts.dimensions\n const ids: string[] = []\n const embeddings: number[][] = []\n const documents: string[] = []\n const metadatas: VectorMetadata[] = []\n\n for (const r of plan.records) {\n let vector = r.vector\n if (!vector && r.document) {\n const [v] = await this.encode([r.document], 'document')\n vector = v\n }\n if (!vector) {\n throw new E_VECTOR_STORE_UPSERT_FAILED(['Record missing vector and document'])\n }\n if (expected !== undefined && vector.length !== expected) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length])\n }\n ids.push(r.id)\n embeddings.push(vector)\n documents.push(r.document ?? '')\n const md = { ...(r.metadata ?? {}), internalId: r.id }\n metadatas.push(md)\n }\n\n try {\n await collection.upsert({ ids, embeddings, documents, metadatas })\n } catch (err) {\n throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n }\n }\n\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n const collection = await this.getCollection(plan.collection)\n const metric = this.#opts.metric ?? 'cosine'\n let queryVector: number[] | undefined\n\n if (plan.near) {\n if ('vector' in plan.near) {\n queryVector = plan.near.vector\n } else if ('serverText' in plan.near) {\n const [v] = await this.encode([plan.near.serverText], 'query')\n queryVector = v\n } else if ('id' in plan.near) {\n const res = await collection.get({ ids: [plan.near.id], include: ['embeddings'] })\n if (!res.ids || res.ids.length === 0) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n const embeddings = res.embeddings || []\n if (!embeddings || embeddings.length === 0 || !embeddings[0]) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id has no vector: ' + plan.near.id])\n }\n queryVector = embeddings[0]\n }\n }\n\n const where = translateChromaWhere(plan.filter)\n\n let results: any\n if (queryVector) {\n try {\n results = await collection.query({\n queryEmbeddings: [queryVector],\n nResults: plan.topK,\n where,\n include: ['documents', 'metadatas', 'distances', 'embeddings'],\n })\n } catch (err) {\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\n } else {\n try {\n results = await collection.get({\n where,\n limit: plan.topK,\n include: ['documents', 'metadatas', 'embeddings'],\n })\n } catch (err) {\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\n }\n\n const proj = plan.projection\n const out: VectorMatch[] = []\n // `query()` returns per-query nested arrays (`ids: [[...]]`); `get()` (the filter-scan path)\n // returns flat arrays (`ids: [...]`). Unwrap one level only for the query path.\n const unwrap = (col: any): any[] => {\n if (!col) return []\n return queryVector ? (col[0] ?? []) : col\n }\n const ids = unwrap(results.ids)\n const documents = unwrap(results.documents)\n const metadatas = unwrap(results.metadatas)\n const embeddings = unwrap(results.embeddings)\n const distances = unwrap(results.distances)\n\n const start = plan.offset || 0\n const limit = plan.topK\n\n for (let i = start; i < Math.min(ids.length, start + limit); i++) {\n const match: VectorMatch = {}\n if (proj.id) {\n match.id = ids[i]\n }\n if (proj.vector && embeddings[i]) {\n match.vector = embeddings[i]\n }\n if (proj.document) {\n match.document = documents[i] ?? undefined\n }\n if (proj.metadata && metadatas[i]) {\n const rawMeta = metadatas[i] as VectorMetadata\n const { internalId, ...rest } = rawMeta\n match.metadata = rest\n }\n if (queryVector && distances && distances[i] !== undefined) {\n match.score = normalizeScore(distances[i], metric, 'distance')\n }\n out.push(match)\n }\n\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const collection = await this.getCollection(plan.collection)\n try {\n if (plan.ids) {\n await collection.delete({ ids: plan.ids })\n } else if (plan.filter) {\n const where = translateChromaWhere(plan.filter)\n if (where) {\n await collection.delete({ where })\n } else {\n await collection.delete({ where: {} })\n }\n } else {\n await collection.delete({ where: {} })\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n"],"mappings":";;;;;;;;;AA+BA,IAAM,kBAAkB,YAAY;CAClC,IAAI;EAEF,QAAO,MADW,OAAO,aACd;CACb,QAAQ;EACN,MAAM,IAAI,kCAAkC,CAAC,UAAU,CAAC;CAC1D;AACF;AAEA,IAAM,YAAY,WAA2B;CAC3C,IAAI,WAAW,UAAU,OAAO;CAChC,IAAI,WAAW,aAAa,OAAO;CACnC,IAAI,WAAW,OAAO,OAAO;CAC7B,OAAO;AACT;AAEA,IAAa,wBACX,WACwC;CACxC,IAAI,CAAC,QAAQ,OAAO,KAAA;CACpB,IAAI,YAAY,MAAM,GAAG;EACvB,IAAI,OAAO,aAAa,UACtB,OAAO,OAAO;EAEhB,MAAM,IAAI,2CAA2C,CAAC,UAAU,OAAO,OAAO,QAAQ,CAAC,CAAC;CAC1F;CACA,IAAI,kBAAkB,MAAM,GAAG;EAC7B,MAAM,EAAE,OAAO,IAAI,UAAU;EAC7B,IAAI,UAAU,KAAA,GACZ,MAAM,IAAI,2CAA2C,CAAC,UAAU,EAAE,CAAC;EAErE,IAAI,OAAO,MACT,OAAO,GAAG,QAAQ,EAAE,KAAK,MAAM,EAAE;EAEnC,IAAI,OAAO,MACT,OAAO,GAAG,QAAQ,EAAE,KAAK,MAAM,EAAE;EAEnC,IAAI,OAAO,MACT,OAAO,GAAG,QAAQ,EAAE,KAAK,MAAM,EAAE;EAEnC,IAAI,OAAO,OACT,OAAO,GAAG,QAAQ,EAAE,MAAM,MAAM,EAAE;EAEpC,IAAI,OAAO,MACT,OAAO,GAAG,QAAQ,EAAE,KAAK,MAAM,EAAE;EAEnC,IAAI,OAAO,OACT,OAAO,GAAG,QAAQ,EAAE,MAAM,MAAM,EAAE;EAEpC,IAAI,OAAO,MACT,OAAO,GAAG,QAAQ,EAAE,KAAK,MAAM,EAAE;EAEnC,IAAI,OAAO,OACT,OAAO,GAAG,QAAQ,EAAE,MAAM,MAAM,EAAE;EAEpC,IAAI,OAAO,YAAY,OAAO,YAC5B,MAAM,IAAI,2CAA2C,CAAC,UAAU,EAAE,CAAC;EAErE,MAAM,IAAI,2CAA2C,CAAC,UAAU,EAAE,CAAC;CACrE;CACA,IAAI,cAAc,MAAM,GAAG;EACzB,MAAM,EAAE,KAAK,IAAI,QAAQ;EACzB,IAAI,KAAK;GACP,MAAM,WAAW,IACd,KAAK,MAAM,qBAAqB,CAAC,CAA4B,EAC7D,QAAQ,MAAM,MAAM,KAAA,CAAS;GAChC,IAAI,SAAS,WAAW,GAAG,OAAO,KAAA;GAClC,IAAI,SAAS,WAAW,GAAG,OAAO,SAAS;GAC3C,OAAO,EAAE,MAAM,SAAS;EAC1B;EACA,IAAI,IAAI;GACN,MAAM,WAAW,GACd,KAAK,MAAM,qBAAqB,CAAC,CAA4B,EAC7D,QAAQ,MAAM,MAAM,KAAA,CAAS;GAChC,IAAI,SAAS,WAAW,GAAG,OAAO,KAAA;GAClC,IAAI,SAAS,WAAW,GAAG,OAAO,SAAS;GAC3C,OAAO,EAAE,KAAK,SAAS;EACzB;EACA,IAAI,KACF,MAAM,IAAI,2CAA2C,CAAC,UAAU,KAAK,CAAC;EAExE;CACF;AAEF;AAEA,IAAa,oBAAb,cAAuC,gBAAgB;CACrD,eAAiD;EAC/C,cAAc;EACd,cAAc;EACd,QAAQ;EACR,QAAQ;EACR,iBAAiB;EAEjB,aAAa;GAAE,cAAc;GAAO,SAAS;GAAU,OAAO,CAAC,QAAQ;EAAE;CAC3E;CACA,UAAsB;CACtB,mCAAqC,IAAI,IAAI;CAC7C,IAAIA,QAAQ;EACV,OAAO,KAAK;CACd;CAEA,OAAO,cAAuB;EAC5B,OAAO,OAAO,YAAY;CAC5B;CACA,cAAuB;EACrB,OAAO,OAAO,YAAY;CAC5B;CAEA,MAAM,UAAyB;EAC7B,IAAI,KAAKC,SAAS;EAClB,MAAM,eAAe,MAAM,gBAAgB;EAC3C,MAAM,IAAI,KAAKD,MAAM,cAAc,CAAC;EACpC,IAAI;EACJ,IAAI;EACJ,IAAI,MAAe;EAEnB,IAAI,EAAE,KAAK;GACT,MAAM,MAAM,IAAI,IAAI,EAAE,GAAG;GACzB,OAAO,IAAI;GACX,OAAO,IAAI,OAAO,OAAO,SAAS,IAAI,MAAM,EAAE,IAAI,IAAI,aAAa,WAAW,MAAM;GACpF,MAAM,IAAI,aAAa;EACzB,OAAO;GACL,OAAO,EAAE;GACT,OAAO,EAAE;GACT,MAAM,EAAE,OAAO;EACjB;EAEA,MAAM,OACJ,QAAQ,SAAS,KAAA,IACb,GAAG,MAAM,aAAa,YAAY,OAAO,SAAS,MAAM,SAAS,MAAM,KAAK,MAAM,SAClF,KAAA;EAEN,IAAI;GACF,KAAKC,UAAU,IAAI,aAAa,EAAE,KAAK,CAAC;EAC1C,SAAS,KAAK;GACZ,MAAM,IAAI,iCAAiC,CAAC,OAAO,GAAG,CAAC,CAAC;EAC1D;CACF;CAEA,MAAM,QAAuB;EAC3B,KAAKA,UAAU;EACf,KAAKC,iBAAiB,MAAM;CAC9B;CAEA,MAAM,cAAc,MAA4B;EAC9C,IAAI,aAAa,KAAKA,iBAAiB,IAAI,IAAI;EAC/C,IAAI,YAAY,OAAO;EACvB,IAAI,CAAC,KAAKD,SAAS,MAAM,KAAK,QAAQ;EACtC,MAAM,SAAS,KAAKD,MAAM,UAAU;EACpC,aAAa,MAAM,KAAKC,QAAQ,sBAAsB;GACpD;GACA,UAAU,EAAE,cAAc,SAAS,MAAM,EAAE;EAC7C,CAAC;EACD,KAAKC,iBAAiB,IAAI,MAAM,UAAU;EAC1C,OAAO;CACT;CAEA,MAAM,iBAAiB,MAAsB,aAAqC;EAChF,MAAM,OAAO,KAAK;EAClB,IAAI,eAAgB,MAAM,KAAK,cAAc,IAAI,GAAI;EACrD,IAAI,MAAM,KAAK,cAAc,IAAI,GAC/B,MAAM,IAAI,iCAAiC,CAAC,UAAU,QAAQ,CAAC;EAEjE,IAAI;GACF,MAAM,KAAK,QAAQ;GACnB,MAAM,SAAS,KAAK,OAAO,UAAU;GACrC,MAAM,KAAKD,QAAS,sBAAsB;IACxC;IACA,UAAU,EAAE,cAAc,SAAS,MAAM,EAAE;GAC7C,CAAC;GACD,KAAKC,iBAAiB,IAAI,MAAM,IAAI;EACtC,SAAS,KAAK;GACZ,MAAM,IAAI,iCAAiC,CAAC,oBAAoB,OAAO,GAAG,CAAC,CAAC;EAC9E;CACF;CAEA,MAAM,eAAe,YAAoB,UAAkC;EACzE,IAAI,YAAY,CAAE,MAAM,KAAK,cAAc,UAAU,GAAI;EACzD,IAAI;GACF,MAAM,KAAK,QAAQ;GACnB,MAAM,KAAKD,QAAS,iBAAiB,EAAE,MAAM,WAAW,CAAC;GACzD,KAAKC,iBAAiB,OAAO,UAAU;EACzC,SAAS,KAAK;GACZ,MAAM,IAAI,iCAAiC,CAAC,kBAAkB,OAAO,GAAG,CAAC,CAAC;EAC5E;CACF;CAEA,MAAM,cAAc,YAAsC;EACxD,IAAI,CAAC,KAAKD,SAAS,MAAM,KAAK,QAAQ;EACtC,IAAI;GACF,MAAM,cAAc,MAAM,KAAKA,QAAS,gBAAgB;GACxD,KAAK,MAAM,KAAK,aACd,IAAI,OAAO,MAAM,WAAW,EAAE,SAAS,aAAa,MAAM,YACxD,OAAO;GAGX,OAAO;EACT,QAAQ;GACN,OAAO;EACT;CACF;CAEA,MAAM,iBAAiB,MAAc,IAA2B;EAC9D,IAAI;GAEF,OAAM,MADmB,KAAK,cAAc,IAAI,GAC/B,OAAO,EAAE,MAAM,GAAG,CAAC;GACpC,MAAM,SAAS,KAAKC,iBAAiB,IAAI,IAAI;GAC7C,KAAKA,iBAAiB,OAAO,IAAI;GACjC,IAAI,QACF,KAAKA,iBAAiB,IAAI,IAAI,MAAM;EAExC,SAAS,KAAK;GACZ,MAAM,IAAI,iCAAiC,CAAC,oBAAoB,OAAO,GAAG,CAAC,CAAC;EAC9E;CACF;CAEA,MAAM,cAAc,MAAiC;EACnD,IAAI,KAAK,QAAQ,WAAW,GAAG;EAC/B,gBAAgB,KAAK,OAAO;EAC5B,MAAM,aAAa,MAAM,KAAK,cAAc,KAAK,UAAU;EAC3D,MAAM,WAAW,KAAKF,MAAM;EAC5B,MAAM,MAAgB,CAAC;EACvB,MAAM,aAAyB,CAAC;EAChC,MAAM,YAAsB,CAAC;EAC7B,MAAM,YAA8B,CAAC;EAErC,KAAK,MAAM,KAAK,KAAK,SAAS;GAC5B,IAAI,SAAS,EAAE;GACf,IAAI,CAAC,UAAU,EAAE,UAAU;IACzB,MAAM,CAAC,KAAK,MAAM,KAAK,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU;IACtD,SAAS;GACX;GACA,IAAI,CAAC,QACH,MAAM,IAAI,6BAA6B,CAAC,oCAAoC,CAAC;GAE/E,IAAI,aAAa,KAAA,KAAa,OAAO,WAAW,UAC9C,MAAM,IAAI,kCAAkC,CAAC,UAAU,OAAO,MAAM,CAAC;GAEvE,IAAI,KAAK,EAAE,EAAE;GACb,WAAW,KAAK,MAAM;GACtB,UAAU,KAAK,EAAE,YAAY,EAAE;GAC/B,MAAM,KAAK;IAAE,GAAI,EAAE,YAAY,CAAC;IAAI,YAAY,EAAE;GAAG;GACrD,UAAU,KAAK,EAAE;EACnB;EAEA,IAAI;GACF,MAAM,WAAW,OAAO;IAAE;IAAK;IAAY;IAAW;GAAU,CAAC;EACnE,SAAS,KAAK;GACZ,MAAM,IAAI,6BAA6B,CAAC,OAAO,GAAG,CAAC,CAAC;EACtD;CACF;CAEA,MAAM,cAAc,MAA0C;EAC5D,MAAM,aAAa,MAAM,KAAK,cAAc,KAAK,UAAU;EAC3D,MAAM,SAAS,KAAKA,MAAM,UAAU;EACpC,IAAI;EAEJ,IAAI,KAAK;OACH,YAAY,KAAK,MACnB,cAAc,KAAK,KAAK;QACnB,IAAI,gBAAgB,KAAK,MAAM;IACpC,MAAM,CAAC,KAAK,MAAM,KAAK,OAAO,CAAC,KAAK,KAAK,UAAU,GAAG,OAAO;IAC7D,cAAc;GAChB,OAAO,IAAI,QAAQ,KAAK,MAAM;IAC5B,MAAM,MAAM,MAAM,WAAW,IAAI;KAAE,KAAK,CAAC,KAAK,KAAK,EAAE;KAAG,SAAS,CAAC,YAAY;IAAE,CAAC;IACjF,IAAI,CAAC,IAAI,OAAO,IAAI,IAAI,WAAW,GACjC,MAAM,IAAI,6BAA6B,CAAC,8BAA8B,KAAK,KAAK,EAAE,CAAC;IAErF,MAAM,aAAa,IAAI,cAAc,CAAC;IACtC,IAAI,CAAC,cAAc,WAAW,WAAW,KAAK,CAAC,WAAW,IACxD,MAAM,IAAI,6BAA6B,CAAC,kCAAkC,KAAK,KAAK,EAAE,CAAC;IAEzF,cAAc,WAAW;GAC3B;;EAGF,MAAM,QAAQ,qBAAqB,KAAK,MAAM;EAE9C,IAAI;EACJ,IAAI,aACF,IAAI;GACF,UAAU,MAAM,WAAW,MAAM;IAC/B,iBAAiB,CAAC,WAAW;IAC7B,UAAU,KAAK;IACf;IACA,SAAS;KAAC;KAAa;KAAa;KAAa;IAAY;GAC/D,CAAC;EACH,SAAS,KAAK;GACZ,MAAM,IAAI,6BAA6B,CAAC,OAAO,GAAG,CAAC,CAAC;EACtD;OAEA,IAAI;GACF,UAAU,MAAM,WAAW,IAAI;IAC7B;IACA,OAAO,KAAK;IACZ,SAAS;KAAC;KAAa;KAAa;IAAY;GAClD,CAAC;EACH,SAAS,KAAK;GACZ,MAAM,IAAI,6BAA6B,CAAC,OAAO,GAAG,CAAC,CAAC;EACtD;EAGF,MAAM,OAAO,KAAK;EAClB,MAAM,MAAqB,CAAC;EAG5B,MAAM,UAAU,QAAoB;GAClC,IAAI,CAAC,KAAK,OAAO,CAAC;GAClB,OAAO,cAAe,IAAI,MAAM,CAAC,IAAK;EACxC;EACA,MAAM,MAAM,OAAO,QAAQ,GAAG;EAC9B,MAAM,YAAY,OAAO,QAAQ,SAAS;EAC1C,MAAM,YAAY,OAAO,QAAQ,SAAS;EAC1C,MAAM,aAAa,OAAO,QAAQ,UAAU;EAC5C,MAAM,YAAY,OAAO,QAAQ,SAAS;EAE1C,MAAM,QAAQ,KAAK,UAAU;EAC7B,MAAM,QAAQ,KAAK;EAEnB,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,IAAI,IAAI,QAAQ,QAAQ,KAAK,GAAG,KAAK;GAChE,MAAM,QAAqB,CAAC;GAC5B,IAAI,KAAK,IACP,MAAM,KAAK,IAAI;GAEjB,IAAI,KAAK,UAAU,WAAW,IAC5B,MAAM,SAAS,WAAW;GAE5B,IAAI,KAAK,UACP,MAAM,WAAW,UAAU,MAAM,KAAA;GAEnC,IAAI,KAAK,YAAY,UAAU,IAAI;IAEjC,MAAM,EAAE,YAAY,GAAG,SADP,UAAU;IAE1B,MAAM,WAAW;GACnB;GACA,IAAI,eAAe,aAAa,UAAU,OAAO,KAAA,GAC/C,MAAM,QAAQ,eAAe,UAAU,IAAI,QAAQ,UAAU;GAE/D,IAAI,KAAK,KAAK;EAChB;EAEA,OAAO;CACT;CAEA,MAAM,cAAc,MAAiC;EACnD,MAAM,aAAa,MAAM,KAAK,cAAc,KAAK,UAAU;EAC3D,IAAI;GACF,IAAI,KAAK,KACP,MAAM,WAAW,OAAO,EAAE,KAAK,KAAK,IAAI,CAAC;QACpC,IAAI,KAAK,QAAQ;IACtB,MAAM,QAAQ,qBAAqB,KAAK,MAAM;IAC9C,IAAI,OACF,MAAM,WAAW,OAAO,EAAE,MAAM,CAAC;SAEjC,MAAM,WAAW,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;GAEzC,OACE,MAAM,WAAW,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;EAEzC,SAAS,KAAK;GACZ,MAAM,IAAI,6BAA6B,CAAC,OAAO,GAAG,CAAC,CAAC;EACtD;CACF;AACF"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * @module @nhtio/adk/batteries/vector/clickhouse
3
+ *
4
+ * ClickHouse adapter. Vectors live in an `Array(Float32)` column; KNN uses ClickHouse's
5
+ * `cosineDistance` / `L2Distance` / negative-inner-product expressions ordered ascending.
6
+ * Metadata is a JSON `String` column, filtered with the neutral filter tree's JS reference
7
+ * evaluator for exact cross-adapter parity. Each collection is a MergeTree table.
8
+ *
9
+ * MergeTree allows duplicate keys, so upsert is delete-then-insert; writes are made
10
+ * read-after-write consistent with `mutations_sync = 2` on deletes.
11
+ *
12
+ * Driver: `@clickhouse/client` (HTTP).
13
+ */
14
+ import { BaseVectorStore } from "../contract";
15
+ import type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from "../plan";
16
+ import type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from "../types";
17
+ export interface ClickHouseVectorStoreOptions extends BaseVectorStoreOptions {
18
+ connection?: {
19
+ url?: string;
20
+ username?: string;
21
+ password?: string;
22
+ database?: string;
23
+ };
24
+ }
25
+ export declare class ClickHouseVectorStore extends BaseVectorStore {
26
+ #private;
27
+ readonly capabilities: VectorStoreCapabilities;
28
+ static isAvailable(): boolean;
29
+ isAvailable(): boolean;
30
+ connect(): Promise<void>;
31
+ close(): Promise<void>;
32
+ createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void>;
33
+ dropCollection(collection: string, ifExists: boolean): Promise<void>;
34
+ hasCollection(collection: string): Promise<boolean>;
35
+ renameCollection(from: string, to: string): Promise<void>;
36
+ executeUpsert(plan: UpsertPlan): Promise<void>;
37
+ executeSearch(plan: SearchPlan): Promise<VectorMatch[]>;
38
+ executeDelete(plan: DeletePlan): Promise<void>;
39
+ }
@@ -0,0 +1,246 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../chunk-Ble4zEEl.js");
3
+ const require_tool_registry = require("../../tool_registry-DYUYqXvo.js");
4
+ require("../../guards.cjs");
5
+ const require_batteries_vector_filters = require("./filters.cjs");
6
+ const require_batteries_vector_helpers = require("./helpers.cjs");
7
+ const require_batteries_vector_exceptions = require("./exceptions.cjs");
8
+ const require_batteries_vector_contract = require("./contract.cjs");
9
+ const require_batteries_vector_validation = require("./validation.cjs");
10
+ //#region src/batteries/vector/clickhouse/index.ts
11
+ /**
12
+ * @module @nhtio/adk/batteries/vector/clickhouse
13
+ *
14
+ * ClickHouse adapter. Vectors live in an `Array(Float32)` column; KNN uses ClickHouse's
15
+ * `cosineDistance` / `L2Distance` / negative-inner-product expressions ordered ascending.
16
+ * Metadata is a JSON `String` column, filtered with the neutral filter tree's JS reference
17
+ * evaluator for exact cross-adapter parity. Each collection is a MergeTree table.
18
+ *
19
+ * MergeTree allows duplicate keys, so upsert is delete-then-insert; writes are made
20
+ * read-after-write consistent with `mutations_sync = 2` on deletes.
21
+ *
22
+ * Driver: `@clickhouse/client` (HTTP).
23
+ */
24
+ var getClickHouseClient = async () => {
25
+ try {
26
+ return (await import("@clickhouse/client")).createClient;
27
+ } catch {
28
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_DRIVER_UNAVAILABLE(["@clickhouse/client"]);
29
+ }
30
+ };
31
+ var distanceExpr = (metric, vecLit) => metric === "euclidean" ? `L2Distance(vec, ${vecLit})` : metric === "dot" ? `-arraySum(arrayMap((a, b) -> a * b, vec, ${vecLit}))` : `cosineDistance(vec, ${vecLit})`;
32
+ var ident = (name) => "`" + name.replace(/`/g, "``") + "`";
33
+ var lit = (value) => `'${value.replace(/\\/g, "\\\\").replace(/'/g, "\\'")}'`;
34
+ var vectorLiteral = (vector) => `[${vector.map((n) => Number.isFinite(n) ? String(n) : "0").join(", ")}]`;
35
+ var ClickHouseVectorStore = class extends require_batteries_vector_contract.BaseVectorStore {
36
+ capabilities = {
37
+ transactions: false,
38
+ namedVectors: false,
39
+ rename: true,
40
+ rawSql: true,
41
+ builtInEncoding: false,
42
+ consistency: {
43
+ configurable: false,
44
+ default: "strong",
45
+ modes: ["strong"]
46
+ }
47
+ };
48
+ #client = null;
49
+ #dims = /* @__PURE__ */ new Map();
50
+ get #opts() {
51
+ return this.options;
52
+ }
53
+ static isAvailable() {
54
+ return typeof process !== "undefined";
55
+ }
56
+ isAvailable() {
57
+ return typeof process !== "undefined";
58
+ }
59
+ async connect() {
60
+ if (this.#client) return;
61
+ const createClient = await getClickHouseClient();
62
+ const c = this.#opts.connection || {};
63
+ try {
64
+ this.#client = createClient({
65
+ url: c.url ?? "http://localhost:8123",
66
+ username: c.username ?? "default",
67
+ password: c.password ?? "",
68
+ database: c.database ?? "default"
69
+ });
70
+ } catch (err) {
71
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_CONNECTION_FAILED([String(err)]);
72
+ }
73
+ }
74
+ async close() {
75
+ if (this.#client) {
76
+ await this.#client.close();
77
+ this.#client = null;
78
+ }
79
+ }
80
+ async #ensure() {
81
+ if (!this.#client) await this.connect();
82
+ return this.#client;
83
+ }
84
+ async #json(sql) {
85
+ return await (await (await this.#ensure()).query({
86
+ query: sql,
87
+ format: "JSONEachRow"
88
+ })).json();
89
+ }
90
+ async createCollection(spec, ifNotExists) {
91
+ const client = await this.#ensure();
92
+ this.#dims.set(spec.collection, spec.vector.dimensions);
93
+ const ine = ifNotExists ? "IF NOT EXISTS " : "";
94
+ try {
95
+ await client.command({ query: `CREATE TABLE ${ine}${ident(spec.collection)} (id String, vec Array(Float32), document String, metadata String) ENGINE = MergeTree() ORDER BY id` });
96
+ } catch (err) {
97
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_COLLECTION_FAILED(["createCollection", String(err)]);
98
+ }
99
+ }
100
+ async dropCollection(collection, ifExists) {
101
+ const client = await this.#ensure();
102
+ const ie = ifExists ? "IF EXISTS " : "";
103
+ try {
104
+ await client.command({ query: `DROP TABLE ${ie}${ident(collection)}` });
105
+ this.#dims.delete(collection);
106
+ } catch (err) {
107
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_COLLECTION_FAILED(["dropCollection", String(err)]);
108
+ }
109
+ }
110
+ async hasCollection(collection) {
111
+ const rows = await this.#json(`EXISTS TABLE ${ident(collection)}`);
112
+ return rows.length > 0 && (rows[0].result === 1 || rows[0].result === "1");
113
+ }
114
+ async renameCollection(from, to) {
115
+ const client = await this.#ensure();
116
+ try {
117
+ await client.command({ query: `RENAME TABLE ${ident(from)} TO ${ident(to)}` });
118
+ const d = this.#dims.get(from);
119
+ if (d !== void 0) {
120
+ this.#dims.set(to, d);
121
+ this.#dims.delete(from);
122
+ }
123
+ } catch (err) {
124
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_UNSUPPORTED_OPERATION(["renameCollection", String(err)]);
125
+ }
126
+ }
127
+ async executeUpsert(plan) {
128
+ if (plan.records.length === 0) return;
129
+ require_batteries_vector_validation.validateRecords(plan.records);
130
+ const client = await this.#ensure();
131
+ const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection);
132
+ const values = [];
133
+ const ids = [];
134
+ try {
135
+ for (const r of plan.records) {
136
+ let vector = r.vector;
137
+ if (!vector && r.document) {
138
+ const [v] = await this.encode([r.document], "document");
139
+ vector = v;
140
+ }
141
+ if (!vector) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_UPSERT_FAILED(["Record missing vector and document"]);
142
+ if (expected !== void 0 && vector.length !== expected) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length]);
143
+ ids.push(r.id);
144
+ values.push({
145
+ id: r.id,
146
+ vec: vector,
147
+ document: r.document ?? "",
148
+ metadata: r.metadata ? JSON.stringify(r.metadata) : "{}"
149
+ });
150
+ }
151
+ const idList = ids.map((id) => lit(id)).join(", ");
152
+ await client.command({
153
+ query: `DELETE FROM ${ident(plan.collection)} WHERE id IN (${idList})`,
154
+ clickhouse_settings: { mutations_sync: "2" }
155
+ });
156
+ await client.insert({
157
+ table: plan.collection,
158
+ values,
159
+ format: "JSONEachRow"
160
+ });
161
+ } catch (err) {
162
+ if (require_tool_registry.isInstanceOf(err, "E_VECTOR_STORE_DIMENSION_MISMATCH", require_batteries_vector_exceptions.E_VECTOR_STORE_DIMENSION_MISMATCH) || require_tool_registry.isInstanceOf(err, "E_VECTOR_STORE_UPSERT_FAILED", require_batteries_vector_exceptions.E_VECTOR_STORE_UPSERT_FAILED)) throw err;
163
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_UPSERT_FAILED([String(err)]);
164
+ }
165
+ }
166
+ async executeSearch(plan) {
167
+ const metric = this.#opts.metric ?? "cosine";
168
+ let queryVector;
169
+ if (plan.near) {
170
+ if ("vector" in plan.near) queryVector = plan.near.vector;
171
+ else if ("serverText" in plan.near) {
172
+ const [v] = await this.encode([plan.near.serverText], "query");
173
+ queryVector = v;
174
+ } else if ("id" in plan.near) {
175
+ const rows = await this.#json(`SELECT vec FROM ${ident(plan.collection)} WHERE id = ${lit(plan.near.id)} LIMIT 1`);
176
+ if (rows.length === 0) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_SEARCH_FAILED(["Referenced id not found: " + plan.near.id]);
177
+ queryVector = rows[0].vec;
178
+ }
179
+ }
180
+ const offset = plan.offset ?? 0;
181
+ try {
182
+ if (queryVector) {
183
+ const distExpr = distanceExpr(metric, vectorLiteral(queryVector));
184
+ const rows = await this.#json(`SELECT id, vec, document, metadata, ${distExpr} AS __dist FROM ${ident(plan.collection)}`);
185
+ const filtered = plan.filter ? rows.filter((row) => require_batteries_vector_filters.evaluateFilter(plan.filter, this.#parseMeta(row.metadata))) : rows;
186
+ filtered.sort((a, b) => Number(a.__dist) - Number(b.__dist));
187
+ return filtered.slice(offset, offset + plan.topK).map((row) => this.#project(row, plan, metric, true));
188
+ } else {
189
+ const rows = await this.#json(`SELECT id, vec, document, metadata FROM ${ident(plan.collection)}`);
190
+ return (plan.filter ? rows.filter((row) => require_batteries_vector_filters.evaluateFilter(plan.filter, this.#parseMeta(row.metadata))) : rows).slice(offset, offset + plan.topK).map((row) => this.#project(row, plan, metric, false));
191
+ }
192
+ } catch (err) {
193
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_SEARCH_FAILED([String(err)]);
194
+ }
195
+ }
196
+ #parseMeta(val) {
197
+ if (typeof val === "string") try {
198
+ return JSON.parse(val);
199
+ } catch {
200
+ return {};
201
+ }
202
+ if (val && typeof val === "object") return val;
203
+ return {};
204
+ }
205
+ #project(row, plan, metric, isKnn) {
206
+ const proj = plan.projection;
207
+ const out = {};
208
+ if (proj.id) out.id = row.id;
209
+ if (proj.vector) out.vector = row.vec.map((n) => Number(n));
210
+ if (proj.document) out.document = row.document ?? void 0;
211
+ if (proj.metadata) out.metadata = this.#parseMeta(row.metadata);
212
+ if (isKnn && row.__dist !== void 0 && row.__dist !== null) out.score = require_batteries_vector_helpers.normalizeScore(Number(row.__dist), metric, "distance");
213
+ return out;
214
+ }
215
+ async executeDelete(plan) {
216
+ const client = await this.#ensure();
217
+ const sync = { mutations_sync: "2" };
218
+ try {
219
+ if (plan.ids && plan.ids.length > 0) {
220
+ const list = plan.ids.map((id) => lit(id)).join(", ");
221
+ await client.command({
222
+ query: `DELETE FROM ${ident(plan.collection)} WHERE id IN (${list})`,
223
+ clickhouse_settings: sync
224
+ });
225
+ } else if (plan.filter) {
226
+ const targets = (await this.#json(`SELECT id, metadata FROM ${ident(plan.collection)}`)).filter((row) => require_batteries_vector_filters.evaluateFilter(plan.filter, this.#parseMeta(row.metadata))).map((row) => row.id);
227
+ if (targets.length > 0) {
228
+ const list = targets.map((id) => lit(id)).join(", ");
229
+ await client.command({
230
+ query: `DELETE FROM ${ident(plan.collection)} WHERE id IN (${list})`,
231
+ clickhouse_settings: sync
232
+ });
233
+ }
234
+ } else await client.command({
235
+ query: `DELETE FROM ${ident(plan.collection)} WHERE 1 = 1`,
236
+ clickhouse_settings: sync
237
+ });
238
+ } catch (err) {
239
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_DELETE_FAILED([String(err)]);
240
+ }
241
+ }
242
+ };
243
+ //#endregion
244
+ exports.ClickHouseVectorStore = ClickHouseVectorStore;
245
+
246
+ //# sourceMappingURL=clickhouse.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clickhouse.cjs","names":["#opts","#client","#ensure","#json","#dims","#parseMeta","#project"],"sources":["../../../src/batteries/vector/clickhouse/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/clickhouse\n *\n * ClickHouse adapter. Vectors live in an `Array(Float32)` column; KNN uses ClickHouse's\n * `cosineDistance` / `L2Distance` / negative-inner-product expressions ordered ascending.\n * Metadata is a JSON `String` column, filtered with the neutral filter tree's JS reference\n * evaluator for exact cross-adapter parity. Each collection is a MergeTree table.\n *\n * MergeTree allows duplicate keys, so upsert is delete-then-insert; writes are made\n * read-after-write consistent with `mutations_sync = 2` on deletes.\n *\n * Driver: `@clickhouse/client` (HTTP).\n */\n\nimport { evaluateFilter } from '../filters'\nimport { normalizeScore } from '../helpers'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { isInstanceOf } from '@nhtio/adk/guards'\nimport {\n E_VECTOR_STORE_DRIVER_UNAVAILABLE,\n E_VECTOR_STORE_CONNECTION_FAILED,\n E_VECTOR_STORE_COLLECTION_FAILED,\n E_VECTOR_STORE_UPSERT_FAILED,\n E_VECTOR_STORE_SEARCH_FAILED,\n E_VECTOR_STORE_DELETE_FAILED,\n E_VECTOR_STORE_DIMENSION_MISMATCH,\n E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n} from '../exceptions'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type {\n VectorMatch,\n VectorStoreCapabilities,\n BaseVectorStoreOptions,\n VectorMetadata,\n DistanceMetric,\n} from '../types'\n\nexport interface ClickHouseVectorStoreOptions extends BaseVectorStoreOptions {\n connection?: { url?: string; username?: string; password?: string; database?: string }\n}\n\nconst getClickHouseClient = async () => {\n try {\n const mod = await import('@clickhouse/client')\n return mod.createClient\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['@clickhouse/client'])\n }\n}\n\n// ClickHouse distance expression per metric (all \"lower is closer\" once negated for dot).\nconst distanceExpr = (metric: DistanceMetric, vecLit: string): string =>\n metric === 'euclidean'\n ? `L2Distance(vec, ${vecLit})`\n : metric === 'dot'\n ? `-arraySum(arrayMap((a, b) -> a * b, vec, ${vecLit}))`\n : `cosineDistance(vec, ${vecLit})`\n\n// Backtick-quote an identifier, escaping embedded backticks.\nconst ident = (name: string): string => '`' + name.replace(/`/g, '``') + '`'\n\n// Single-quoted ClickHouse string literal.\nconst lit = (value: string): string => `'${value.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`\n\n// number[] → ClickHouse array literal [1, 2, 3].\nconst vectorLiteral = (vector: number[]): string =>\n `[${vector.map((n) => (Number.isFinite(n) ? String(n) : '0')).join(', ')}]`\n\nexport class ClickHouseVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: true,\n rawSql: true,\n builtInEncoding: false,\n // Made strongly consistent via mutations_sync=2 on deletes; writes visible on resolve.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n\n #client: any | null = null\n #dims: Map<string, number> = new Map()\n\n get #opts(): ClickHouseVectorStoreOptions {\n return this.options as ClickHouseVectorStoreOptions\n }\n\n static isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n\n async connect(): Promise<void> {\n if (this.#client) return\n const createClient = await getClickHouseClient()\n const c = this.#opts.connection || {}\n try {\n this.#client = createClient({\n url: c.url ?? 'http://localhost:8123',\n username: c.username ?? 'default',\n password: c.password ?? '',\n database: c.database ?? 'default',\n })\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n\n async close(): Promise<void> {\n if (this.#client) {\n await this.#client.close()\n this.#client = null\n }\n }\n\n async #ensure(): Promise<any> {\n if (!this.#client) await this.connect()\n return this.#client!\n }\n\n async #json(sql: string): Promise<any[]> {\n const client = await this.#ensure()\n const rs = await client.query({ query: sql, format: 'JSONEachRow' })\n return (await rs.json()) as any[]\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n const client = await this.#ensure()\n this.#dims.set(spec.collection, spec.vector.dimensions)\n const ine = ifNotExists ? 'IF NOT EXISTS ' : ''\n try {\n await client.command({\n query:\n `CREATE TABLE ${ine}${ident(spec.collection)} (` +\n `id String, vec Array(Float32), document String, metadata String` +\n `) ENGINE = MergeTree() ORDER BY id`,\n })\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['createCollection', String(err)])\n }\n }\n\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n const client = await this.#ensure()\n const ie = ifExists ? 'IF EXISTS ' : ''\n try {\n await client.command({ query: `DROP TABLE ${ie}${ident(collection)}` })\n this.#dims.delete(collection)\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', String(err)])\n }\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n const rows = await this.#json(`EXISTS TABLE ${ident(collection)}`)\n return rows.length > 0 && (rows[0].result === 1 || rows[0].result === '1')\n }\n\n async renameCollection(from: string, to: string): Promise<void> {\n const client = await this.#ensure()\n try {\n await client.command({ query: `RENAME TABLE ${ident(from)} TO ${ident(to)}` })\n const d = this.#dims.get(from)\n if (d !== undefined) {\n this.#dims.set(to, d)\n this.#dims.delete(from)\n }\n } catch (err) {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', String(err)])\n }\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const client = await this.#ensure()\n const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection)\n const values: any[] = []\n const ids: string[] = []\n try {\n for (const r of plan.records) {\n let vector = r.vector\n if (!vector && r.document) {\n const [v] = await this.encode([r.document], 'document')\n vector = v\n }\n if (!vector) {\n throw new E_VECTOR_STORE_UPSERT_FAILED(['Record missing vector and document'])\n }\n if (expected !== undefined && vector.length !== expected) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length])\n }\n ids.push(r.id)\n values.push({\n id: r.id,\n vec: vector,\n document: r.document ?? '',\n metadata: r.metadata ? JSON.stringify(r.metadata) : '{}',\n })\n }\n // MergeTree allows dupes — delete the ids first (synchronously) so upsert replaces.\n const idList = ids.map((id) => lit(id)).join(', ')\n await client.command({\n query: `DELETE FROM ${ident(plan.collection)} WHERE id IN (${idList})`,\n clickhouse_settings: { mutations_sync: '2' },\n })\n await client.insert({\n table: plan.collection,\n values,\n format: 'JSONEachRow',\n })\n } catch (err) {\n if (\n isInstanceOf(err, 'E_VECTOR_STORE_DIMENSION_MISMATCH', E_VECTOR_STORE_DIMENSION_MISMATCH) ||\n isInstanceOf(err, 'E_VECTOR_STORE_UPSERT_FAILED', E_VECTOR_STORE_UPSERT_FAILED)\n ) {\n throw err\n }\n throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n }\n }\n\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n const metric = this.#opts.metric ?? 'cosine'\n let queryVector: number[] | undefined\n if (plan.near) {\n if ('vector' in plan.near) {\n queryVector = plan.near.vector\n } else if ('serverText' in plan.near) {\n const [v] = await this.encode([plan.near.serverText], 'query')\n queryVector = v\n } else if ('id' in plan.near) {\n const rows = await this.#json(\n `SELECT vec FROM ${ident(plan.collection)} WHERE id = ${lit(plan.near.id)} LIMIT 1`\n )\n if (rows.length === 0) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = rows[0].vec as number[]\n }\n }\n\n const offset = plan.offset ?? 0\n try {\n if (queryVector) {\n const distExpr = distanceExpr(metric, vectorLiteral(queryVector))\n const rows = await this.#json(\n `SELECT id, vec, document, metadata, ${distExpr} AS __dist FROM ${ident(plan.collection)}`\n )\n const filtered = plan.filter\n ? rows.filter((row) => evaluateFilter(plan.filter!, this.#parseMeta(row.metadata)))\n : rows\n filtered.sort((a, b) => Number(a.__dist) - Number(b.__dist))\n return filtered\n .slice(offset, offset + plan.topK)\n .map((row) => this.#project(row, plan, metric, true))\n } else {\n const rows = await this.#json(\n `SELECT id, vec, document, metadata FROM ${ident(plan.collection)}`\n )\n const filtered = plan.filter\n ? rows.filter((row) => evaluateFilter(plan.filter!, this.#parseMeta(row.metadata)))\n : rows\n return filtered\n .slice(offset, offset + plan.topK)\n .map((row) => this.#project(row, plan, metric, false))\n }\n } catch (err) {\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\n }\n\n #parseMeta(val: unknown): VectorMetadata {\n if (typeof val === 'string') {\n try {\n return JSON.parse(val) as VectorMetadata\n } catch {\n return {}\n }\n }\n if (val && typeof val === 'object') return val as VectorMetadata\n return {}\n }\n\n #project(row: any, plan: SearchPlan, metric: string, isKnn: boolean): VectorMatch {\n const proj = plan.projection\n const out: VectorMatch = {}\n if (proj.id) out.id = row.id as string\n if (proj.vector) out.vector = (row.vec as number[]).map((n) => Number(n))\n if (proj.document) out.document = (row.document ?? undefined) as string | undefined\n if (proj.metadata) out.metadata = this.#parseMeta(row.metadata)\n if (isKnn && row.__dist !== undefined && row.__dist !== null) {\n out.score = normalizeScore(Number(row.__dist), metric as DistanceMetric, 'distance')\n }\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const client = await this.#ensure()\n const sync = { mutations_sync: '2' as const }\n try {\n if (plan.ids && plan.ids.length > 0) {\n const list = plan.ids.map((id) => lit(id)).join(', ')\n await client.command({\n query: `DELETE FROM ${ident(plan.collection)} WHERE id IN (${list})`,\n clickhouse_settings: sync,\n })\n } else if (plan.filter) {\n const rows = await this.#json(`SELECT id, metadata FROM ${ident(plan.collection)}`)\n const targets = rows\n .filter((row) => evaluateFilter(plan.filter!, this.#parseMeta(row.metadata)))\n .map((row) => row.id as string)\n if (targets.length > 0) {\n const list = targets.map((id) => lit(id)).join(', ')\n await client.command({\n query: `DELETE FROM ${ident(plan.collection)} WHERE id IN (${list})`,\n clickhouse_settings: sync,\n })\n }\n } else {\n await client.command({\n query: `DELETE FROM ${ident(plan.collection)} WHERE 1 = 1`,\n clickhouse_settings: sync,\n })\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,244 @@
1
+ import { s as isInstanceOf } from "../../tool_registry-D1pSSlsd.mjs";
2
+ import "../../guards.mjs";
3
+ import { evaluateFilter } from "./filters.mjs";
4
+ import { normalizeScore } from "./helpers.mjs";
5
+ import { E_VECTOR_STORE_COLLECTION_FAILED, E_VECTOR_STORE_CONNECTION_FAILED, E_VECTOR_STORE_DELETE_FAILED, E_VECTOR_STORE_DIMENSION_MISMATCH, E_VECTOR_STORE_DRIVER_UNAVAILABLE, E_VECTOR_STORE_SEARCH_FAILED, E_VECTOR_STORE_UNSUPPORTED_OPERATION, E_VECTOR_STORE_UPSERT_FAILED } from "./exceptions.mjs";
6
+ import { BaseVectorStore } from "./contract.mjs";
7
+ import { validateRecords } from "./validation.mjs";
8
+ //#region src/batteries/vector/clickhouse/index.ts
9
+ /**
10
+ * @module @nhtio/adk/batteries/vector/clickhouse
11
+ *
12
+ * ClickHouse adapter. Vectors live in an `Array(Float32)` column; KNN uses ClickHouse's
13
+ * `cosineDistance` / `L2Distance` / negative-inner-product expressions ordered ascending.
14
+ * Metadata is a JSON `String` column, filtered with the neutral filter tree's JS reference
15
+ * evaluator for exact cross-adapter parity. Each collection is a MergeTree table.
16
+ *
17
+ * MergeTree allows duplicate keys, so upsert is delete-then-insert; writes are made
18
+ * read-after-write consistent with `mutations_sync = 2` on deletes.
19
+ *
20
+ * Driver: `@clickhouse/client` (HTTP).
21
+ */
22
+ var getClickHouseClient = async () => {
23
+ try {
24
+ return (await import("@clickhouse/client")).createClient;
25
+ } catch {
26
+ throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(["@clickhouse/client"]);
27
+ }
28
+ };
29
+ var distanceExpr = (metric, vecLit) => metric === "euclidean" ? `L2Distance(vec, ${vecLit})` : metric === "dot" ? `-arraySum(arrayMap((a, b) -> a * b, vec, ${vecLit}))` : `cosineDistance(vec, ${vecLit})`;
30
+ var ident = (name) => "`" + name.replace(/`/g, "``") + "`";
31
+ var lit = (value) => `'${value.replace(/\\/g, "\\\\").replace(/'/g, "\\'")}'`;
32
+ var vectorLiteral = (vector) => `[${vector.map((n) => Number.isFinite(n) ? String(n) : "0").join(", ")}]`;
33
+ var ClickHouseVectorStore = class extends BaseVectorStore {
34
+ capabilities = {
35
+ transactions: false,
36
+ namedVectors: false,
37
+ rename: true,
38
+ rawSql: true,
39
+ builtInEncoding: false,
40
+ consistency: {
41
+ configurable: false,
42
+ default: "strong",
43
+ modes: ["strong"]
44
+ }
45
+ };
46
+ #client = null;
47
+ #dims = /* @__PURE__ */ new Map();
48
+ get #opts() {
49
+ return this.options;
50
+ }
51
+ static isAvailable() {
52
+ return typeof process !== "undefined";
53
+ }
54
+ isAvailable() {
55
+ return typeof process !== "undefined";
56
+ }
57
+ async connect() {
58
+ if (this.#client) return;
59
+ const createClient = await getClickHouseClient();
60
+ const c = this.#opts.connection || {};
61
+ try {
62
+ this.#client = createClient({
63
+ url: c.url ?? "http://localhost:8123",
64
+ username: c.username ?? "default",
65
+ password: c.password ?? "",
66
+ database: c.database ?? "default"
67
+ });
68
+ } catch (err) {
69
+ throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)]);
70
+ }
71
+ }
72
+ async close() {
73
+ if (this.#client) {
74
+ await this.#client.close();
75
+ this.#client = null;
76
+ }
77
+ }
78
+ async #ensure() {
79
+ if (!this.#client) await this.connect();
80
+ return this.#client;
81
+ }
82
+ async #json(sql) {
83
+ return await (await (await this.#ensure()).query({
84
+ query: sql,
85
+ format: "JSONEachRow"
86
+ })).json();
87
+ }
88
+ async createCollection(spec, ifNotExists) {
89
+ const client = await this.#ensure();
90
+ this.#dims.set(spec.collection, spec.vector.dimensions);
91
+ const ine = ifNotExists ? "IF NOT EXISTS " : "";
92
+ try {
93
+ await client.command({ query: `CREATE TABLE ${ine}${ident(spec.collection)} (id String, vec Array(Float32), document String, metadata String) ENGINE = MergeTree() ORDER BY id` });
94
+ } catch (err) {
95
+ throw new E_VECTOR_STORE_COLLECTION_FAILED(["createCollection", String(err)]);
96
+ }
97
+ }
98
+ async dropCollection(collection, ifExists) {
99
+ const client = await this.#ensure();
100
+ const ie = ifExists ? "IF EXISTS " : "";
101
+ try {
102
+ await client.command({ query: `DROP TABLE ${ie}${ident(collection)}` });
103
+ this.#dims.delete(collection);
104
+ } catch (err) {
105
+ throw new E_VECTOR_STORE_COLLECTION_FAILED(["dropCollection", String(err)]);
106
+ }
107
+ }
108
+ async hasCollection(collection) {
109
+ const rows = await this.#json(`EXISTS TABLE ${ident(collection)}`);
110
+ return rows.length > 0 && (rows[0].result === 1 || rows[0].result === "1");
111
+ }
112
+ async renameCollection(from, to) {
113
+ const client = await this.#ensure();
114
+ try {
115
+ await client.command({ query: `RENAME TABLE ${ident(from)} TO ${ident(to)}` });
116
+ const d = this.#dims.get(from);
117
+ if (d !== void 0) {
118
+ this.#dims.set(to, d);
119
+ this.#dims.delete(from);
120
+ }
121
+ } catch (err) {
122
+ throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(["renameCollection", String(err)]);
123
+ }
124
+ }
125
+ async executeUpsert(plan) {
126
+ if (plan.records.length === 0) return;
127
+ validateRecords(plan.records);
128
+ const client = await this.#ensure();
129
+ const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection);
130
+ const values = [];
131
+ const ids = [];
132
+ try {
133
+ for (const r of plan.records) {
134
+ let vector = r.vector;
135
+ if (!vector && r.document) {
136
+ const [v] = await this.encode([r.document], "document");
137
+ vector = v;
138
+ }
139
+ if (!vector) throw new E_VECTOR_STORE_UPSERT_FAILED(["Record missing vector and document"]);
140
+ if (expected !== void 0 && vector.length !== expected) throw new E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length]);
141
+ ids.push(r.id);
142
+ values.push({
143
+ id: r.id,
144
+ vec: vector,
145
+ document: r.document ?? "",
146
+ metadata: r.metadata ? JSON.stringify(r.metadata) : "{}"
147
+ });
148
+ }
149
+ const idList = ids.map((id) => lit(id)).join(", ");
150
+ await client.command({
151
+ query: `DELETE FROM ${ident(plan.collection)} WHERE id IN (${idList})`,
152
+ clickhouse_settings: { mutations_sync: "2" }
153
+ });
154
+ await client.insert({
155
+ table: plan.collection,
156
+ values,
157
+ format: "JSONEachRow"
158
+ });
159
+ } catch (err) {
160
+ if (isInstanceOf(err, "E_VECTOR_STORE_DIMENSION_MISMATCH", E_VECTOR_STORE_DIMENSION_MISMATCH) || isInstanceOf(err, "E_VECTOR_STORE_UPSERT_FAILED", E_VECTOR_STORE_UPSERT_FAILED)) throw err;
161
+ throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)]);
162
+ }
163
+ }
164
+ async executeSearch(plan) {
165
+ const metric = this.#opts.metric ?? "cosine";
166
+ let queryVector;
167
+ if (plan.near) {
168
+ if ("vector" in plan.near) queryVector = plan.near.vector;
169
+ else if ("serverText" in plan.near) {
170
+ const [v] = await this.encode([plan.near.serverText], "query");
171
+ queryVector = v;
172
+ } else if ("id" in plan.near) {
173
+ const rows = await this.#json(`SELECT vec FROM ${ident(plan.collection)} WHERE id = ${lit(plan.near.id)} LIMIT 1`);
174
+ if (rows.length === 0) throw new E_VECTOR_STORE_SEARCH_FAILED(["Referenced id not found: " + plan.near.id]);
175
+ queryVector = rows[0].vec;
176
+ }
177
+ }
178
+ const offset = plan.offset ?? 0;
179
+ try {
180
+ if (queryVector) {
181
+ const distExpr = distanceExpr(metric, vectorLiteral(queryVector));
182
+ const rows = await this.#json(`SELECT id, vec, document, metadata, ${distExpr} AS __dist FROM ${ident(plan.collection)}`);
183
+ const filtered = plan.filter ? rows.filter((row) => evaluateFilter(plan.filter, this.#parseMeta(row.metadata))) : rows;
184
+ filtered.sort((a, b) => Number(a.__dist) - Number(b.__dist));
185
+ return filtered.slice(offset, offset + plan.topK).map((row) => this.#project(row, plan, metric, true));
186
+ } else {
187
+ const rows = await this.#json(`SELECT id, vec, document, metadata FROM ${ident(plan.collection)}`);
188
+ return (plan.filter ? rows.filter((row) => evaluateFilter(plan.filter, this.#parseMeta(row.metadata))) : rows).slice(offset, offset + plan.topK).map((row) => this.#project(row, plan, metric, false));
189
+ }
190
+ } catch (err) {
191
+ throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)]);
192
+ }
193
+ }
194
+ #parseMeta(val) {
195
+ if (typeof val === "string") try {
196
+ return JSON.parse(val);
197
+ } catch {
198
+ return {};
199
+ }
200
+ if (val && typeof val === "object") return val;
201
+ return {};
202
+ }
203
+ #project(row, plan, metric, isKnn) {
204
+ const proj = plan.projection;
205
+ const out = {};
206
+ if (proj.id) out.id = row.id;
207
+ if (proj.vector) out.vector = row.vec.map((n) => Number(n));
208
+ if (proj.document) out.document = row.document ?? void 0;
209
+ if (proj.metadata) out.metadata = this.#parseMeta(row.metadata);
210
+ if (isKnn && row.__dist !== void 0 && row.__dist !== null) out.score = normalizeScore(Number(row.__dist), metric, "distance");
211
+ return out;
212
+ }
213
+ async executeDelete(plan) {
214
+ const client = await this.#ensure();
215
+ const sync = { mutations_sync: "2" };
216
+ try {
217
+ if (plan.ids && plan.ids.length > 0) {
218
+ const list = plan.ids.map((id) => lit(id)).join(", ");
219
+ await client.command({
220
+ query: `DELETE FROM ${ident(plan.collection)} WHERE id IN (${list})`,
221
+ clickhouse_settings: sync
222
+ });
223
+ } else if (plan.filter) {
224
+ const targets = (await this.#json(`SELECT id, metadata FROM ${ident(plan.collection)}`)).filter((row) => evaluateFilter(plan.filter, this.#parseMeta(row.metadata))).map((row) => row.id);
225
+ if (targets.length > 0) {
226
+ const list = targets.map((id) => lit(id)).join(", ");
227
+ await client.command({
228
+ query: `DELETE FROM ${ident(plan.collection)} WHERE id IN (${list})`,
229
+ clickhouse_settings: sync
230
+ });
231
+ }
232
+ } else await client.command({
233
+ query: `DELETE FROM ${ident(plan.collection)} WHERE 1 = 1`,
234
+ clickhouse_settings: sync
235
+ });
236
+ } catch (err) {
237
+ throw new E_VECTOR_STORE_DELETE_FAILED([String(err)]);
238
+ }
239
+ }
240
+ };
241
+ //#endregion
242
+ export { ClickHouseVectorStore };
243
+
244
+ //# sourceMappingURL=clickhouse.mjs.map