@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,218 @@
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/duckdb/index.ts
11
+ /**
12
+ * @module @nhtio/adk/batteries/vector/duckdb
13
+ *
14
+ * In-process DuckDB adapter (like sqlite_vec — no server). Uses the `vss` community
15
+ * extension for vector distance functions over a `FLOAT[N]` column; metadata lives in a
16
+ * `JSON` column filtered with DuckDB's `json_extract*` functions. Each collection is a
17
+ * table; the document and id are plain columns.
18
+ *
19
+ * Driver: `@duckdb/node-api` (promise-based). Path defaults to `:memory:`.
20
+ */
21
+ var getDuckDB = async () => {
22
+ try {
23
+ return (await import("@duckdb/node-api")).DuckDBInstance;
24
+ } catch {
25
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_DRIVER_UNAVAILABLE(["@duckdb/node-api"]);
26
+ }
27
+ };
28
+ var distanceFn = (metric) => metric === "euclidean" ? "array_distance" : metric === "dot" ? "array_negative_inner_product" : "array_cosine_distance";
29
+ var ident = (name) => `"${name.replace(/"/g, "\"\"")}"`;
30
+ var lit = (value) => `'${value.replace(/'/g, "''")}'`;
31
+ var vectorLiteral = (vector) => `[${vector.map((n) => Number.isFinite(n) ? String(n) : "0").join(", ")}]::FLOAT[${vector.length}]`;
32
+ var DuckDBVectorStore = class extends require_batteries_vector_contract.BaseVectorStore {
33
+ capabilities = {
34
+ transactions: true,
35
+ namedVectors: false,
36
+ rename: true,
37
+ rawSql: true,
38
+ builtInEncoding: false,
39
+ consistency: {
40
+ configurable: false,
41
+ default: "strong",
42
+ modes: ["strong"]
43
+ }
44
+ };
45
+ #instance = null;
46
+ #conn = 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.#conn) return;
59
+ const DuckDBInstance = await getDuckDB();
60
+ const path = this.#opts.connection?.path ?? ":memory:";
61
+ try {
62
+ this.#instance = await DuckDBInstance.create(path);
63
+ this.#conn = await this.#instance.connect();
64
+ await this.#conn.run("INSTALL vss;");
65
+ await this.#conn.run("LOAD vss;");
66
+ } catch (err) {
67
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_CONNECTION_FAILED([String(err)]);
68
+ }
69
+ }
70
+ async close() {
71
+ this.#conn = null;
72
+ this.#instance = null;
73
+ }
74
+ async #ensure() {
75
+ if (!this.#conn) await this.connect();
76
+ return this.#conn;
77
+ }
78
+ async #rows(sql) {
79
+ return (await (await this.#ensure()).runAndReadAll(sql)).getRows();
80
+ }
81
+ async createCollection(spec, ifNotExists) {
82
+ const conn = await this.#ensure();
83
+ this.#dims.set(spec.collection, spec.vector.dimensions);
84
+ const ine = ifNotExists ? "IF NOT EXISTS " : "";
85
+ try {
86
+ await conn.run(`CREATE TABLE ${ine}${ident(spec.collection)} (id VARCHAR PRIMARY KEY, vec FLOAT[${spec.vector.dimensions}], document VARCHAR, metadata JSON)`);
87
+ } catch (err) {
88
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_COLLECTION_FAILED(["createCollection", String(err)]);
89
+ }
90
+ }
91
+ async dropCollection(collection, ifExists) {
92
+ const conn = await this.#ensure();
93
+ const ie = ifExists ? "IF EXISTS " : "";
94
+ try {
95
+ await conn.run(`DROP TABLE ${ie}${ident(collection)}`);
96
+ this.#dims.delete(collection);
97
+ } catch (err) {
98
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_COLLECTION_FAILED(["dropCollection", String(err)]);
99
+ }
100
+ }
101
+ async hasCollection(collection) {
102
+ return (await this.#rows(`SELECT 1 FROM information_schema.tables WHERE table_name = ${lit(collection)}`)).length > 0;
103
+ }
104
+ async renameCollection(from, to) {
105
+ const conn = await this.#ensure();
106
+ try {
107
+ await conn.run(`ALTER TABLE ${ident(from)} RENAME TO ${ident(to)}`);
108
+ const d = this.#dims.get(from);
109
+ if (d !== void 0) {
110
+ this.#dims.set(to, d);
111
+ this.#dims.delete(from);
112
+ }
113
+ } catch (err) {
114
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_UNSUPPORTED_OPERATION(["renameCollection", String(err)]);
115
+ }
116
+ }
117
+ async executeUpsert(plan) {
118
+ if (plan.records.length === 0) return;
119
+ require_batteries_vector_validation.validateRecords(plan.records);
120
+ const conn = await this.#ensure();
121
+ const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection);
122
+ try {
123
+ for (const r of plan.records) {
124
+ let vector = r.vector;
125
+ if (!vector && r.document) {
126
+ const [v] = await this.encode([r.document], "document");
127
+ vector = v;
128
+ }
129
+ if (!vector) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_UPSERT_FAILED(["Record missing vector and document"]);
130
+ if (expected !== void 0 && vector.length !== expected) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length]);
131
+ const meta = r.metadata ? JSON.stringify(r.metadata) : "{}";
132
+ const doc = r.document === void 0 ? "NULL" : lit(r.document);
133
+ await conn.run(`DELETE FROM ${ident(plan.collection)} WHERE id = ${lit(r.id)}`);
134
+ await conn.run(`INSERT INTO ${ident(plan.collection)} (id, vec, document, metadata) VALUES (${lit(r.id)}, ${vectorLiteral(vector)}, ${doc}, ${lit(meta)}::JSON)`);
135
+ }
136
+ } catch (err) {
137
+ 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;
138
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_UPSERT_FAILED([String(err)]);
139
+ }
140
+ }
141
+ async executeSearch(plan) {
142
+ const metric = this.#opts.metric ?? "cosine";
143
+ let queryVector;
144
+ if (plan.near) {
145
+ if ("vector" in plan.near) queryVector = plan.near.vector;
146
+ else if ("serverText" in plan.near) {
147
+ const [v] = await this.encode([plan.near.serverText], "query");
148
+ queryVector = v;
149
+ } else if ("id" in plan.near) {
150
+ const rows = await this.#rows(`SELECT vec FROM ${ident(plan.collection)} WHERE id = ${lit(plan.near.id)}`);
151
+ if (rows.length === 0) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_SEARCH_FAILED(["Referenced id not found: " + plan.near.id]);
152
+ queryVector = this.#unwrapVector(rows[0][0]);
153
+ }
154
+ }
155
+ const offset = plan.offset ?? 0;
156
+ try {
157
+ if (queryVector) {
158
+ const distExpr = `${distanceFn(metric)}(vec, ${vectorLiteral(queryVector)})`;
159
+ const rows = await this.#rows(`SELECT id, vec, document, metadata, ${distExpr} AS __dist FROM ${ident(plan.collection)}`);
160
+ const filtered = plan.filter ? rows.filter((row) => require_batteries_vector_filters.evaluateFilter(plan.filter, this.#parseMeta(row[3]))) : rows;
161
+ filtered.sort((a, b) => Number(a[4]) - Number(b[4]));
162
+ return filtered.slice(offset, offset + plan.topK).map((row) => this.#project(row, plan, metric, true));
163
+ } else {
164
+ const rows = await this.#rows(`SELECT id, vec, document, metadata, NULL AS __dist FROM ${ident(plan.collection)}`);
165
+ return (plan.filter ? rows.filter((row) => require_batteries_vector_filters.evaluateFilter(plan.filter, this.#parseMeta(row[3]))) : rows).slice(offset, offset + plan.topK).map((row) => this.#project(row, plan, metric, false));
166
+ }
167
+ } catch (err) {
168
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_SEARCH_FAILED([String(err)]);
169
+ }
170
+ }
171
+ #unwrapVector(val) {
172
+ if (val && typeof val === "object" && Array.isArray(val.items)) return val.items;
173
+ if (Array.isArray(val)) return val;
174
+ return [];
175
+ }
176
+ #parseMeta(val) {
177
+ if (val === null || val === void 0) return {};
178
+ if (typeof val === "string") try {
179
+ return JSON.parse(val);
180
+ } catch {
181
+ return {};
182
+ }
183
+ if (typeof val === "object") return val;
184
+ return {};
185
+ }
186
+ #project(row, plan, metric, isKnn) {
187
+ const [id, vec, document, metadata, dist] = row;
188
+ const proj = plan.projection;
189
+ const out = {};
190
+ if (proj.id) out.id = id;
191
+ if (proj.vector) out.vector = this.#unwrapVector(vec);
192
+ if (proj.document) out.document = document ?? void 0;
193
+ if (proj.metadata) out.metadata = this.#parseMeta(metadata);
194
+ if (isKnn && dist !== null && dist !== void 0) out.score = require_batteries_vector_helpers.normalizeScore(Number(dist), metric, "distance");
195
+ return out;
196
+ }
197
+ async executeDelete(plan) {
198
+ const conn = await this.#ensure();
199
+ try {
200
+ if (plan.ids && plan.ids.length > 0) {
201
+ const list = plan.ids.map((id) => lit(id)).join(", ");
202
+ await conn.run(`DELETE FROM ${ident(plan.collection)} WHERE id IN (${list})`);
203
+ } else if (plan.filter) {
204
+ const targets = (await this.#rows(`SELECT id, metadata FROM ${ident(plan.collection)}`)).filter((row) => require_batteries_vector_filters.evaluateFilter(plan.filter, this.#parseMeta(row[1]))).map((row) => row[0]);
205
+ if (targets.length > 0) {
206
+ const list = targets.map((id) => lit(id)).join(", ");
207
+ await conn.run(`DELETE FROM ${ident(plan.collection)} WHERE id IN (${list})`);
208
+ }
209
+ } else await conn.run(`DELETE FROM ${ident(plan.collection)}`);
210
+ } catch (err) {
211
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_DELETE_FAILED([String(err)]);
212
+ }
213
+ }
214
+ };
215
+ //#endregion
216
+ exports.DuckDBVectorStore = DuckDBVectorStore;
217
+
218
+ //# sourceMappingURL=duckdb.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duckdb.cjs","names":["#opts","#conn","#instance","#ensure","#rows","#dims","#unwrapVector","#parseMeta","#project"],"sources":["../../../src/batteries/vector/duckdb/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/duckdb\n *\n * In-process DuckDB adapter (like sqlite_vec — no server). Uses the `vss` community\n * extension for vector distance functions over a `FLOAT[N]` column; metadata lives in a\n * `JSON` column filtered with DuckDB's `json_extract*` functions. Each collection is a\n * table; the document and id are plain columns.\n *\n * Driver: `@duckdb/node-api` (promise-based). Path defaults to `:memory:`.\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 DuckDBVectorStoreOptions extends BaseVectorStoreOptions {\n connection?: { path?: string }\n}\n\nconst getDuckDB = async () => {\n try {\n const mod = await import('@duckdb/node-api')\n return mod.DuckDBInstance\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['@duckdb/node-api'])\n }\n}\n\n// DuckDB vss distance function per metric (all return a distance — lower is closer).\nconst distanceFn = (metric: DistanceMetric): string =>\n metric === 'euclidean'\n ? 'array_distance'\n : metric === 'dot'\n ? 'array_negative_inner_product'\n : 'array_cosine_distance'\n\n// A double-quoted SQL identifier (table/column), escaping embedded quotes.\nconst ident = (name: string): string => `\"${name.replace(/\"/g, '\"\"')}\"`\n\n// A single-quoted SQL string literal, escaping embedded quotes.\nconst lit = (value: string): string => `'${value.replace(/'/g, \"''\")}'`\n\n// Render a number[] as a DuckDB FLOAT[N] array literal: [1.0, 2.0, ...]::FLOAT[N].\nconst vectorLiteral = (vector: number[]): string =>\n `[${vector.map((n) => (Number.isFinite(n) ? String(n) : '0')).join(', ')}]::FLOAT[${vector.length}]`\n\nexport class DuckDBVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: true,\n namedVectors: false,\n rename: true,\n rawSql: true,\n builtInEncoding: false,\n // In-process and synchronous: a write is visible on resolve. The option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n\n #instance: any | null = null\n #conn: any | null = null\n #dims: Map<string, number> = new Map()\n\n get #opts(): DuckDBVectorStoreOptions {\n return this.options as DuckDBVectorStoreOptions\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.#conn) return\n const DuckDBInstance = await getDuckDB()\n const path = this.#opts.connection?.path ?? ':memory:'\n try {\n this.#instance = await DuckDBInstance.create(path)\n this.#conn = await this.#instance.connect()\n // vss provides the array_*_distance vector functions.\n await this.#conn.run('INSTALL vss;')\n await this.#conn.run('LOAD vss;')\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n\n async close(): Promise<void> {\n // @duckdb/node-api connections are GC-managed; drop references.\n this.#conn = null\n this.#instance = null\n }\n\n async #ensure(): Promise<any> {\n if (!this.#conn) await this.connect()\n return this.#conn!\n }\n\n async #rows(sql: string): Promise<any[][]> {\n const conn = await this.#ensure()\n const reader = await conn.runAndReadAll(sql)\n return reader.getRows()\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n const conn = await this.#ensure()\n this.#dims.set(spec.collection, spec.vector.dimensions)\n const ine = ifNotExists ? 'IF NOT EXISTS ' : ''\n try {\n await conn.run(\n `CREATE TABLE ${ine}${ident(spec.collection)} (` +\n `id VARCHAR PRIMARY KEY, ` +\n `vec FLOAT[${spec.vector.dimensions}], ` +\n `document VARCHAR, ` +\n `metadata JSON)`\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 conn = await this.#ensure()\n const ie = ifExists ? 'IF EXISTS ' : ''\n try {\n await conn.run(`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.#rows(\n `SELECT 1 FROM information_schema.tables WHERE table_name = ${lit(collection)}`\n )\n return rows.length > 0\n }\n\n async renameCollection(from: string, to: string): Promise<void> {\n const conn = await this.#ensure()\n try {\n await conn.run(`ALTER TABLE ${ident(from)} RENAME 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 conn = await this.#ensure()\n const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection)\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 const meta = r.metadata ? JSON.stringify(r.metadata) : '{}'\n const doc = r.document === undefined ? 'NULL' : lit(r.document)\n // DuckDB upsert: delete-then-insert keeps it simple and dialect-portable.\n await conn.run(`DELETE FROM ${ident(plan.collection)} WHERE id = ${lit(r.id)}`)\n await conn.run(\n `INSERT INTO ${ident(plan.collection)} (id, vec, document, metadata) VALUES (` +\n `${lit(r.id)}, ${vectorLiteral(vector)}, ${doc}, ${lit(meta)}::JSON)`\n )\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.#rows(\n `SELECT vec FROM ${ident(plan.collection)} WHERE id = ${lit(plan.near.id)}`\n )\n if (rows.length === 0) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = this.#unwrapVector(rows[0][0])\n }\n }\n\n const offset = plan.offset ?? 0\n try {\n if (queryVector) {\n // Compute distance in DuckDB (vss), then apply the neutral filter with the JS\n // reference evaluator before sorting + limiting — so similarity + filter semantics\n // exactly match every other adapter. DuckDB scans are fast at the in-process scale.\n const fn = distanceFn(metric)\n const distExpr = `${fn}(vec, ${vectorLiteral(queryVector)})`\n const rows = await this.#rows(\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[3])))\n : rows\n filtered.sort((a, b) => Number(a[4]) - Number(b[4]))\n return filtered\n .slice(offset, offset + plan.topK)\n .map((row) => this.#project(row, plan, metric, true))\n } else {\n // Filter-scan: no similarity, just the neutral filter (JS evaluator) + limit.\n const rows = await this.#rows(\n `SELECT id, vec, document, metadata, NULL AS __dist FROM ${ident(plan.collection)}`\n )\n const filtered = plan.filter\n ? rows.filter((row) => evaluateFilter(plan.filter!, this.#parseMeta(row[3])))\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 #unwrapVector(val: unknown): number[] {\n // DuckDB FLOAT[] comes back as { items: number[] } via node-api.\n if (val && typeof val === 'object' && Array.isArray((val as any).items)) {\n return (val as any).items as number[]\n }\n if (Array.isArray(val)) return val as number[]\n return []\n }\n\n #parseMeta(val: unknown): VectorMetadata {\n if (val === null || val === undefined) return {}\n if (typeof val === 'string') {\n try {\n return JSON.parse(val) as VectorMetadata\n } catch {\n return {}\n }\n }\n if (typeof val === 'object') return val as VectorMetadata\n return {}\n }\n\n #project(row: any[], plan: SearchPlan, metric: string, isKnn: boolean): VectorMatch {\n // Row order: id, vec, document, metadata, __dist\n const [id, vec, document, metadata, dist] = row\n const proj = plan.projection\n const out: VectorMatch = {}\n if (proj.id) out.id = id as string\n if (proj.vector) out.vector = this.#unwrapVector(vec)\n if (proj.document) out.document = (document ?? undefined) as string | undefined\n if (proj.metadata) out.metadata = this.#parseMeta(metadata)\n if (isKnn && dist !== null && dist !== undefined) {\n out.score = normalizeScore(Number(dist), metric as DistanceMetric, 'distance')\n }\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const conn = await this.#ensure()\n try {\n if (plan.ids && plan.ids.length > 0) {\n const list = plan.ids.map((id) => lit(id)).join(', ')\n await conn.run(`DELETE FROM ${ident(plan.collection)} WHERE id IN (${list})`)\n } else if (plan.filter) {\n // Resolve target ids in JS via the reference evaluator, then delete by id.\n const rows = await this.#rows(`SELECT id, metadata FROM ${ident(plan.collection)}`)\n const targets = rows\n .filter((row) => evaluateFilter(plan.filter!, this.#parseMeta(row[1])))\n .map((row) => row[0] as string)\n if (targets.length > 0) {\n const list = targets.map((id) => lit(id)).join(', ')\n await conn.run(`DELETE FROM ${ident(plan.collection)} WHERE id IN (${list})`)\n }\n } else {\n await conn.run(`DELETE FROM ${ident(plan.collection)}`)\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,216 @@
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/duckdb/index.ts
9
+ /**
10
+ * @module @nhtio/adk/batteries/vector/duckdb
11
+ *
12
+ * In-process DuckDB adapter (like sqlite_vec — no server). Uses the `vss` community
13
+ * extension for vector distance functions over a `FLOAT[N]` column; metadata lives in a
14
+ * `JSON` column filtered with DuckDB's `json_extract*` functions. Each collection is a
15
+ * table; the document and id are plain columns.
16
+ *
17
+ * Driver: `@duckdb/node-api` (promise-based). Path defaults to `:memory:`.
18
+ */
19
+ var getDuckDB = async () => {
20
+ try {
21
+ return (await import("@duckdb/node-api")).DuckDBInstance;
22
+ } catch {
23
+ throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(["@duckdb/node-api"]);
24
+ }
25
+ };
26
+ var distanceFn = (metric) => metric === "euclidean" ? "array_distance" : metric === "dot" ? "array_negative_inner_product" : "array_cosine_distance";
27
+ var ident = (name) => `"${name.replace(/"/g, "\"\"")}"`;
28
+ var lit = (value) => `'${value.replace(/'/g, "''")}'`;
29
+ var vectorLiteral = (vector) => `[${vector.map((n) => Number.isFinite(n) ? String(n) : "0").join(", ")}]::FLOAT[${vector.length}]`;
30
+ var DuckDBVectorStore = class extends BaseVectorStore {
31
+ capabilities = {
32
+ transactions: true,
33
+ namedVectors: false,
34
+ rename: true,
35
+ rawSql: true,
36
+ builtInEncoding: false,
37
+ consistency: {
38
+ configurable: false,
39
+ default: "strong",
40
+ modes: ["strong"]
41
+ }
42
+ };
43
+ #instance = null;
44
+ #conn = null;
45
+ #dims = /* @__PURE__ */ new Map();
46
+ get #opts() {
47
+ return this.options;
48
+ }
49
+ static isAvailable() {
50
+ return typeof process !== "undefined";
51
+ }
52
+ isAvailable() {
53
+ return typeof process !== "undefined";
54
+ }
55
+ async connect() {
56
+ if (this.#conn) return;
57
+ const DuckDBInstance = await getDuckDB();
58
+ const path = this.#opts.connection?.path ?? ":memory:";
59
+ try {
60
+ this.#instance = await DuckDBInstance.create(path);
61
+ this.#conn = await this.#instance.connect();
62
+ await this.#conn.run("INSTALL vss;");
63
+ await this.#conn.run("LOAD vss;");
64
+ } catch (err) {
65
+ throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)]);
66
+ }
67
+ }
68
+ async close() {
69
+ this.#conn = null;
70
+ this.#instance = null;
71
+ }
72
+ async #ensure() {
73
+ if (!this.#conn) await this.connect();
74
+ return this.#conn;
75
+ }
76
+ async #rows(sql) {
77
+ return (await (await this.#ensure()).runAndReadAll(sql)).getRows();
78
+ }
79
+ async createCollection(spec, ifNotExists) {
80
+ const conn = await this.#ensure();
81
+ this.#dims.set(spec.collection, spec.vector.dimensions);
82
+ const ine = ifNotExists ? "IF NOT EXISTS " : "";
83
+ try {
84
+ await conn.run(`CREATE TABLE ${ine}${ident(spec.collection)} (id VARCHAR PRIMARY KEY, vec FLOAT[${spec.vector.dimensions}], document VARCHAR, metadata JSON)`);
85
+ } catch (err) {
86
+ throw new E_VECTOR_STORE_COLLECTION_FAILED(["createCollection", String(err)]);
87
+ }
88
+ }
89
+ async dropCollection(collection, ifExists) {
90
+ const conn = await this.#ensure();
91
+ const ie = ifExists ? "IF EXISTS " : "";
92
+ try {
93
+ await conn.run(`DROP TABLE ${ie}${ident(collection)}`);
94
+ this.#dims.delete(collection);
95
+ } catch (err) {
96
+ throw new E_VECTOR_STORE_COLLECTION_FAILED(["dropCollection", String(err)]);
97
+ }
98
+ }
99
+ async hasCollection(collection) {
100
+ return (await this.#rows(`SELECT 1 FROM information_schema.tables WHERE table_name = ${lit(collection)}`)).length > 0;
101
+ }
102
+ async renameCollection(from, to) {
103
+ const conn = await this.#ensure();
104
+ try {
105
+ await conn.run(`ALTER TABLE ${ident(from)} RENAME TO ${ident(to)}`);
106
+ const d = this.#dims.get(from);
107
+ if (d !== void 0) {
108
+ this.#dims.set(to, d);
109
+ this.#dims.delete(from);
110
+ }
111
+ } catch (err) {
112
+ throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(["renameCollection", String(err)]);
113
+ }
114
+ }
115
+ async executeUpsert(plan) {
116
+ if (plan.records.length === 0) return;
117
+ validateRecords(plan.records);
118
+ const conn = await this.#ensure();
119
+ const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection);
120
+ try {
121
+ for (const r of plan.records) {
122
+ let vector = r.vector;
123
+ if (!vector && r.document) {
124
+ const [v] = await this.encode([r.document], "document");
125
+ vector = v;
126
+ }
127
+ if (!vector) throw new E_VECTOR_STORE_UPSERT_FAILED(["Record missing vector and document"]);
128
+ if (expected !== void 0 && vector.length !== expected) throw new E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length]);
129
+ const meta = r.metadata ? JSON.stringify(r.metadata) : "{}";
130
+ const doc = r.document === void 0 ? "NULL" : lit(r.document);
131
+ await conn.run(`DELETE FROM ${ident(plan.collection)} WHERE id = ${lit(r.id)}`);
132
+ await conn.run(`INSERT INTO ${ident(plan.collection)} (id, vec, document, metadata) VALUES (${lit(r.id)}, ${vectorLiteral(vector)}, ${doc}, ${lit(meta)}::JSON)`);
133
+ }
134
+ } catch (err) {
135
+ 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;
136
+ throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)]);
137
+ }
138
+ }
139
+ async executeSearch(plan) {
140
+ const metric = this.#opts.metric ?? "cosine";
141
+ let queryVector;
142
+ if (plan.near) {
143
+ if ("vector" in plan.near) queryVector = plan.near.vector;
144
+ else if ("serverText" in plan.near) {
145
+ const [v] = await this.encode([plan.near.serverText], "query");
146
+ queryVector = v;
147
+ } else if ("id" in plan.near) {
148
+ const rows = await this.#rows(`SELECT vec FROM ${ident(plan.collection)} WHERE id = ${lit(plan.near.id)}`);
149
+ if (rows.length === 0) throw new E_VECTOR_STORE_SEARCH_FAILED(["Referenced id not found: " + plan.near.id]);
150
+ queryVector = this.#unwrapVector(rows[0][0]);
151
+ }
152
+ }
153
+ const offset = plan.offset ?? 0;
154
+ try {
155
+ if (queryVector) {
156
+ const distExpr = `${distanceFn(metric)}(vec, ${vectorLiteral(queryVector)})`;
157
+ const rows = await this.#rows(`SELECT id, vec, document, metadata, ${distExpr} AS __dist FROM ${ident(plan.collection)}`);
158
+ const filtered = plan.filter ? rows.filter((row) => evaluateFilter(plan.filter, this.#parseMeta(row[3]))) : rows;
159
+ filtered.sort((a, b) => Number(a[4]) - Number(b[4]));
160
+ return filtered.slice(offset, offset + plan.topK).map((row) => this.#project(row, plan, metric, true));
161
+ } else {
162
+ const rows = await this.#rows(`SELECT id, vec, document, metadata, NULL AS __dist FROM ${ident(plan.collection)}`);
163
+ return (plan.filter ? rows.filter((row) => evaluateFilter(plan.filter, this.#parseMeta(row[3]))) : rows).slice(offset, offset + plan.topK).map((row) => this.#project(row, plan, metric, false));
164
+ }
165
+ } catch (err) {
166
+ throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)]);
167
+ }
168
+ }
169
+ #unwrapVector(val) {
170
+ if (val && typeof val === "object" && Array.isArray(val.items)) return val.items;
171
+ if (Array.isArray(val)) return val;
172
+ return [];
173
+ }
174
+ #parseMeta(val) {
175
+ if (val === null || val === void 0) return {};
176
+ if (typeof val === "string") try {
177
+ return JSON.parse(val);
178
+ } catch {
179
+ return {};
180
+ }
181
+ if (typeof val === "object") return val;
182
+ return {};
183
+ }
184
+ #project(row, plan, metric, isKnn) {
185
+ const [id, vec, document, metadata, dist] = row;
186
+ const proj = plan.projection;
187
+ const out = {};
188
+ if (proj.id) out.id = id;
189
+ if (proj.vector) out.vector = this.#unwrapVector(vec);
190
+ if (proj.document) out.document = document ?? void 0;
191
+ if (proj.metadata) out.metadata = this.#parseMeta(metadata);
192
+ if (isKnn && dist !== null && dist !== void 0) out.score = normalizeScore(Number(dist), metric, "distance");
193
+ return out;
194
+ }
195
+ async executeDelete(plan) {
196
+ const conn = await this.#ensure();
197
+ try {
198
+ if (plan.ids && plan.ids.length > 0) {
199
+ const list = plan.ids.map((id) => lit(id)).join(", ");
200
+ await conn.run(`DELETE FROM ${ident(plan.collection)} WHERE id IN (${list})`);
201
+ } else if (plan.filter) {
202
+ const targets = (await this.#rows(`SELECT id, metadata FROM ${ident(plan.collection)}`)).filter((row) => evaluateFilter(plan.filter, this.#parseMeta(row[1]))).map((row) => row[0]);
203
+ if (targets.length > 0) {
204
+ const list = targets.map((id) => lit(id)).join(", ");
205
+ await conn.run(`DELETE FROM ${ident(plan.collection)} WHERE id IN (${list})`);
206
+ }
207
+ } else await conn.run(`DELETE FROM ${ident(plan.collection)}`);
208
+ } catch (err) {
209
+ throw new E_VECTOR_STORE_DELETE_FAILED([String(err)]);
210
+ }
211
+ }
212
+ };
213
+ //#endregion
214
+ export { DuckDBVectorStore };
215
+
216
+ //# sourceMappingURL=duckdb.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duckdb.mjs","names":["#opts","#conn","#instance","#ensure","#rows","#dims","#unwrapVector","#parseMeta","#project"],"sources":["../../../src/batteries/vector/duckdb/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/duckdb\n *\n * In-process DuckDB adapter (like sqlite_vec — no server). Uses the `vss` community\n * extension for vector distance functions over a `FLOAT[N]` column; metadata lives in a\n * `JSON` column filtered with DuckDB's `json_extract*` functions. Each collection is a\n * table; the document and id are plain columns.\n *\n * Driver: `@duckdb/node-api` (promise-based). Path defaults to `:memory:`.\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 DuckDBVectorStoreOptions extends BaseVectorStoreOptions {\n connection?: { path?: string }\n}\n\nconst getDuckDB = async () => {\n try {\n const mod = await import('@duckdb/node-api')\n return mod.DuckDBInstance\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['@duckdb/node-api'])\n }\n}\n\n// DuckDB vss distance function per metric (all return a distance — lower is closer).\nconst distanceFn = (metric: DistanceMetric): string =>\n metric === 'euclidean'\n ? 'array_distance'\n : metric === 'dot'\n ? 'array_negative_inner_product'\n : 'array_cosine_distance'\n\n// A double-quoted SQL identifier (table/column), escaping embedded quotes.\nconst ident = (name: string): string => `\"${name.replace(/\"/g, '\"\"')}\"`\n\n// A single-quoted SQL string literal, escaping embedded quotes.\nconst lit = (value: string): string => `'${value.replace(/'/g, \"''\")}'`\n\n// Render a number[] as a DuckDB FLOAT[N] array literal: [1.0, 2.0, ...]::FLOAT[N].\nconst vectorLiteral = (vector: number[]): string =>\n `[${vector.map((n) => (Number.isFinite(n) ? String(n) : '0')).join(', ')}]::FLOAT[${vector.length}]`\n\nexport class DuckDBVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: true,\n namedVectors: false,\n rename: true,\n rawSql: true,\n builtInEncoding: false,\n // In-process and synchronous: a write is visible on resolve. The option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n\n #instance: any | null = null\n #conn: any | null = null\n #dims: Map<string, number> = new Map()\n\n get #opts(): DuckDBVectorStoreOptions {\n return this.options as DuckDBVectorStoreOptions\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.#conn) return\n const DuckDBInstance = await getDuckDB()\n const path = this.#opts.connection?.path ?? ':memory:'\n try {\n this.#instance = await DuckDBInstance.create(path)\n this.#conn = await this.#instance.connect()\n // vss provides the array_*_distance vector functions.\n await this.#conn.run('INSTALL vss;')\n await this.#conn.run('LOAD vss;')\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n\n async close(): Promise<void> {\n // @duckdb/node-api connections are GC-managed; drop references.\n this.#conn = null\n this.#instance = null\n }\n\n async #ensure(): Promise<any> {\n if (!this.#conn) await this.connect()\n return this.#conn!\n }\n\n async #rows(sql: string): Promise<any[][]> {\n const conn = await this.#ensure()\n const reader = await conn.runAndReadAll(sql)\n return reader.getRows()\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n const conn = await this.#ensure()\n this.#dims.set(spec.collection, spec.vector.dimensions)\n const ine = ifNotExists ? 'IF NOT EXISTS ' : ''\n try {\n await conn.run(\n `CREATE TABLE ${ine}${ident(spec.collection)} (` +\n `id VARCHAR PRIMARY KEY, ` +\n `vec FLOAT[${spec.vector.dimensions}], ` +\n `document VARCHAR, ` +\n `metadata JSON)`\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 conn = await this.#ensure()\n const ie = ifExists ? 'IF EXISTS ' : ''\n try {\n await conn.run(`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.#rows(\n `SELECT 1 FROM information_schema.tables WHERE table_name = ${lit(collection)}`\n )\n return rows.length > 0\n }\n\n async renameCollection(from: string, to: string): Promise<void> {\n const conn = await this.#ensure()\n try {\n await conn.run(`ALTER TABLE ${ident(from)} RENAME 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 conn = await this.#ensure()\n const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection)\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 const meta = r.metadata ? JSON.stringify(r.metadata) : '{}'\n const doc = r.document === undefined ? 'NULL' : lit(r.document)\n // DuckDB upsert: delete-then-insert keeps it simple and dialect-portable.\n await conn.run(`DELETE FROM ${ident(plan.collection)} WHERE id = ${lit(r.id)}`)\n await conn.run(\n `INSERT INTO ${ident(plan.collection)} (id, vec, document, metadata) VALUES (` +\n `${lit(r.id)}, ${vectorLiteral(vector)}, ${doc}, ${lit(meta)}::JSON)`\n )\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.#rows(\n `SELECT vec FROM ${ident(plan.collection)} WHERE id = ${lit(plan.near.id)}`\n )\n if (rows.length === 0) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = this.#unwrapVector(rows[0][0])\n }\n }\n\n const offset = plan.offset ?? 0\n try {\n if (queryVector) {\n // Compute distance in DuckDB (vss), then apply the neutral filter with the JS\n // reference evaluator before sorting + limiting — so similarity + filter semantics\n // exactly match every other adapter. DuckDB scans are fast at the in-process scale.\n const fn = distanceFn(metric)\n const distExpr = `${fn}(vec, ${vectorLiteral(queryVector)})`\n const rows = await this.#rows(\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[3])))\n : rows\n filtered.sort((a, b) => Number(a[4]) - Number(b[4]))\n return filtered\n .slice(offset, offset + plan.topK)\n .map((row) => this.#project(row, plan, metric, true))\n } else {\n // Filter-scan: no similarity, just the neutral filter (JS evaluator) + limit.\n const rows = await this.#rows(\n `SELECT id, vec, document, metadata, NULL AS __dist FROM ${ident(plan.collection)}`\n )\n const filtered = plan.filter\n ? rows.filter((row) => evaluateFilter(plan.filter!, this.#parseMeta(row[3])))\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 #unwrapVector(val: unknown): number[] {\n // DuckDB FLOAT[] comes back as { items: number[] } via node-api.\n if (val && typeof val === 'object' && Array.isArray((val as any).items)) {\n return (val as any).items as number[]\n }\n if (Array.isArray(val)) return val as number[]\n return []\n }\n\n #parseMeta(val: unknown): VectorMetadata {\n if (val === null || val === undefined) return {}\n if (typeof val === 'string') {\n try {\n return JSON.parse(val) as VectorMetadata\n } catch {\n return {}\n }\n }\n if (typeof val === 'object') return val as VectorMetadata\n return {}\n }\n\n #project(row: any[], plan: SearchPlan, metric: string, isKnn: boolean): VectorMatch {\n // Row order: id, vec, document, metadata, __dist\n const [id, vec, document, metadata, dist] = row\n const proj = plan.projection\n const out: VectorMatch = {}\n if (proj.id) out.id = id as string\n if (proj.vector) out.vector = this.#unwrapVector(vec)\n if (proj.document) out.document = (document ?? undefined) as string | undefined\n if (proj.metadata) out.metadata = this.#parseMeta(metadata)\n if (isKnn && dist !== null && dist !== undefined) {\n out.score = normalizeScore(Number(dist), metric as DistanceMetric, 'distance')\n }\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const conn = await this.#ensure()\n try {\n if (plan.ids && plan.ids.length > 0) {\n const list = plan.ids.map((id) => lit(id)).join(', ')\n await conn.run(`DELETE FROM ${ident(plan.collection)} WHERE id IN (${list})`)\n } else if (plan.filter) {\n // Resolve target ids in JS via the reference evaluator, then delete by id.\n const rows = await this.#rows(`SELECT id, metadata FROM ${ident(plan.collection)}`)\n const targets = rows\n .filter((row) => evaluateFilter(plan.filter!, this.#parseMeta(row[1])))\n .map((row) => row[0] as string)\n if (targets.length > 0) {\n const list = targets.map((id) => lit(id)).join(', ')\n await conn.run(`DELETE FROM ${ident(plan.collection)} WHERE id IN (${list})`)\n }\n } else {\n await conn.run(`DELETE FROM ${ident(plan.collection)}`)\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,43 @@
1
+ /**
2
+ * @module @nhtio/adk/batteries/vector/elasticsearch
3
+ *
4
+ * Elasticsearch 8 adapter — each collection is an index with a `dense_vector` field; KNN uses ES8's
5
+ * top-level `knn` search clause with an optional `filter`; the neutral filter tree compiles to bool/term/range
6
+ * over `metadata.*`. Distinct from the opensearch adapter (which speaks OpenSearch's `knn_vector`/`query.knn` dialect).
7
+ */
8
+ import { BaseVectorStore } from "../contract";
9
+ import type { VectorFilter } from "../filters";
10
+ import type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from "../plan";
11
+ import type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from "../types";
12
+ export interface ElasticsearchVectorStoreOptions extends BaseVectorStoreOptions {
13
+ connection?: {
14
+ node?: string;
15
+ auth?: {
16
+ username: string;
17
+ password: string;
18
+ } | {
19
+ apiKey: string;
20
+ };
21
+ client?: unknown;
22
+ };
23
+ }
24
+ /**
25
+ * Compile the neutral filter tree to an Elasticsearch bool-query clause over `metadata.*`.
26
+ * String values use the `.keyword` sub-field for exact match; numbers use range/term.
27
+ */
28
+ export declare const translateElasticsearchFilter: (filter?: VectorFilter) => Record<string, unknown> | undefined;
29
+ export declare class ElasticsearchVectorStore extends BaseVectorStore {
30
+ #private;
31
+ readonly capabilities: VectorStoreCapabilities;
32
+ static isAvailable(): boolean;
33
+ isAvailable(): boolean;
34
+ connect(): Promise<void>;
35
+ close(): Promise<void>;
36
+ createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void>;
37
+ dropCollection(collection: string, ifExists: boolean): Promise<void>;
38
+ hasCollection(collection: string): Promise<boolean>;
39
+ renameCollection(_from: string, _to: string): Promise<void>;
40
+ executeUpsert(plan: UpsertPlan): Promise<void>;
41
+ executeSearch(plan: SearchPlan): Promise<VectorMatch[]>;
42
+ executeDelete(plan: DeletePlan): Promise<void>;
43
+ }