@nhtio/adk 1.20260607.2 → 1.20260609.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (501) hide show
  1. package/CHANGELOG.md +185 -0
  2. package/batteries/embeddings/openai/adapter.cjs +1 -1
  3. package/batteries/embeddings/openai/adapter.mjs +1 -1
  4. package/batteries/embeddings/openai/exceptions.cjs +1 -1
  5. package/batteries/embeddings/openai/exceptions.mjs +1 -1
  6. package/batteries/embeddings/openai/types.d.ts +7 -0
  7. package/batteries/embeddings/webllm/adapter.cjs +1 -1
  8. package/batteries/embeddings/webllm/adapter.mjs +1 -1
  9. package/batteries/embeddings/webllm/exceptions.cjs +1 -1
  10. package/batteries/embeddings/webllm/exceptions.mjs +1 -1
  11. package/batteries/llm/chat_common/helpers.d.ts +165 -0
  12. package/batteries/llm/chat_common/types.d.ts +309 -0
  13. package/batteries/llm/index.d.ts +5 -0
  14. package/batteries/llm/ollama/adapter.cjs +736 -0
  15. package/batteries/llm/ollama/adapter.cjs.map +1 -0
  16. package/batteries/llm/ollama/adapter.d.ts +64 -0
  17. package/batteries/llm/ollama/adapter.mjs +734 -0
  18. package/batteries/llm/ollama/adapter.mjs.map +1 -0
  19. package/batteries/llm/ollama/exceptions.cjs +105 -0
  20. package/batteries/llm/ollama/exceptions.cjs.map +1 -0
  21. package/batteries/llm/ollama/exceptions.d.ts +112 -0
  22. package/batteries/llm/ollama/exceptions.mjs +96 -0
  23. package/batteries/llm/ollama/exceptions.mjs.map +1 -0
  24. package/batteries/llm/ollama/helpers.cjs +487 -0
  25. package/batteries/llm/ollama/helpers.cjs.map +1 -0
  26. package/batteries/llm/ollama/helpers.d.ts +158 -0
  27. package/batteries/llm/ollama/helpers.mjs +450 -0
  28. package/batteries/llm/ollama/helpers.mjs.map +1 -0
  29. package/batteries/llm/ollama/index.d.ts +29 -0
  30. package/batteries/llm/ollama/types.cjs +2 -0
  31. package/batteries/llm/ollama/types.d.ts +334 -0
  32. package/batteries/llm/ollama/types.mjs +0 -0
  33. package/batteries/llm/ollama/validation.cjs +130 -0
  34. package/batteries/llm/ollama/validation.cjs.map +1 -0
  35. package/batteries/llm/ollama/validation.d.ts +31 -0
  36. package/batteries/llm/ollama/validation.mjs +127 -0
  37. package/batteries/llm/ollama/validation.mjs.map +1 -0
  38. package/batteries/llm/ollama.cjs +54 -0
  39. package/batteries/llm/ollama.mjs +6 -0
  40. package/batteries/llm/openai_chat_completions/adapter.cjs +36 -19
  41. package/batteries/llm/openai_chat_completions/adapter.cjs.map +1 -1
  42. package/batteries/llm/openai_chat_completions/adapter.mjs +23 -6
  43. package/batteries/llm/openai_chat_completions/adapter.mjs.map +1 -1
  44. package/batteries/llm/openai_chat_completions/exceptions.cjs +1 -1
  45. package/batteries/llm/openai_chat_completions/exceptions.mjs +1 -1
  46. package/batteries/llm/openai_chat_completions/helpers.cjs +80 -320
  47. package/batteries/llm/openai_chat_completions/helpers.cjs.map +1 -1
  48. package/batteries/llm/openai_chat_completions/helpers.d.ts +68 -144
  49. package/batteries/llm/openai_chat_completions/helpers.mjs +40 -280
  50. package/batteries/llm/openai_chat_completions/helpers.mjs.map +1 -1
  51. package/batteries/llm/openai_chat_completions/types.d.ts +273 -181
  52. package/batteries/llm/openai_chat_completions/validation.cjs +2 -2
  53. package/batteries/llm/openai_chat_completions/validation.cjs.map +1 -1
  54. package/batteries/llm/openai_chat_completions/validation.mjs +2 -2
  55. package/batteries/llm/openai_chat_completions/validation.mjs.map +1 -1
  56. package/batteries/llm/openai_chat_completions.cjs +29 -28
  57. package/batteries/llm/openai_chat_completions.mjs +2 -1
  58. package/batteries/llm/webllm_chat_completions/adapter.cjs +38 -19
  59. package/batteries/llm/webllm_chat_completions/adapter.cjs.map +1 -1
  60. package/batteries/llm/webllm_chat_completions/adapter.d.ts +18 -0
  61. package/batteries/llm/webllm_chat_completions/adapter.mjs +25 -6
  62. package/batteries/llm/webllm_chat_completions/adapter.mjs.map +1 -1
  63. package/batteries/llm/webllm_chat_completions/exceptions.cjs +1 -1
  64. package/batteries/llm/webllm_chat_completions/exceptions.mjs +1 -1
  65. package/batteries/llm/webllm_chat_completions/helpers.cjs +29 -28
  66. package/batteries/llm/webllm_chat_completions/helpers.mjs +2 -1
  67. package/batteries/llm/webllm_chat_completions/types.d.ts +21 -0
  68. package/batteries/llm/webllm_chat_completions/validation.cjs +13 -1
  69. package/batteries/llm/webllm_chat_completions/validation.cjs.map +1 -1
  70. package/batteries/llm/webllm_chat_completions/validation.d.ts +12 -0
  71. package/batteries/llm/webllm_chat_completions/validation.mjs +13 -1
  72. package/batteries/llm/webllm_chat_completions/validation.mjs.map +1 -1
  73. package/batteries/llm/webllm_chat_completions.cjs +29 -28
  74. package/batteries/llm/webllm_chat_completions.mjs +2 -1
  75. package/batteries/llm.cjs +44 -28
  76. package/batteries/llm.mjs +9 -4
  77. package/batteries/storage/flydrive.cjs +1 -1
  78. package/batteries/storage/flydrive.mjs +1 -1
  79. package/batteries/storage/in_memory/index.d.ts +1 -1
  80. package/batteries/storage/in_memory.cjs +2 -2
  81. package/batteries/storage/in_memory.cjs.map +1 -1
  82. package/batteries/storage/in_memory.mjs +2 -2
  83. package/batteries/storage/in_memory.mjs.map +1 -1
  84. package/batteries/storage/opfs/index.d.ts +19 -0
  85. package/batteries/storage/opfs.cjs +1 -1
  86. package/batteries/storage/opfs.cjs.map +1 -1
  87. package/batteries/storage/opfs.mjs +1 -1
  88. package/batteries/storage/opfs.mjs.map +1 -1
  89. package/batteries/tools/color.cjs +3 -2
  90. package/batteries/tools/color.cjs.map +1 -1
  91. package/batteries/tools/color.mjs +3 -2
  92. package/batteries/tools/color.mjs.map +1 -1
  93. package/batteries/tools/comparison.cjs +4 -3
  94. package/batteries/tools/comparison.cjs.map +1 -1
  95. package/batteries/tools/comparison.mjs +4 -3
  96. package/batteries/tools/comparison.mjs.map +1 -1
  97. package/batteries/tools/data_structure.cjs +30 -10
  98. package/batteries/tools/data_structure.cjs.map +1 -1
  99. package/batteries/tools/data_structure.mjs +30 -10
  100. package/batteries/tools/data_structure.mjs.map +1 -1
  101. package/batteries/tools/datetime_extended.cjs +5 -10
  102. package/batteries/tools/datetime_extended.cjs.map +1 -1
  103. package/batteries/tools/datetime_extended.mjs +5 -10
  104. package/batteries/tools/datetime_extended.mjs.map +1 -1
  105. package/batteries/tools/datetime_math.cjs +2 -2
  106. package/batteries/tools/datetime_math.mjs +2 -2
  107. package/batteries/tools/encoding.cjs +13 -4
  108. package/batteries/tools/encoding.cjs.map +1 -1
  109. package/batteries/tools/encoding.mjs +13 -4
  110. package/batteries/tools/encoding.mjs.map +1 -1
  111. package/batteries/tools/formatting.cjs +4 -4
  112. package/batteries/tools/formatting.cjs.map +1 -1
  113. package/batteries/tools/formatting.mjs +4 -4
  114. package/batteries/tools/formatting.mjs.map +1 -1
  115. package/batteries/tools/geo_basics.cjs +2 -2
  116. package/batteries/tools/geo_basics.mjs +2 -2
  117. package/batteries/tools/index.d.ts +1 -0
  118. package/batteries/tools/math.cjs +10 -8
  119. package/batteries/tools/math.cjs.map +1 -1
  120. package/batteries/tools/math.mjs +10 -8
  121. package/batteries/tools/math.mjs.map +1 -1
  122. package/batteries/tools/memory.cjs +5 -5
  123. package/batteries/tools/memory.mjs +5 -5
  124. package/batteries/tools/parsing.cjs +9 -5
  125. package/batteries/tools/parsing.cjs.map +1 -1
  126. package/batteries/tools/parsing.mjs +9 -5
  127. package/batteries/tools/parsing.mjs.map +1 -1
  128. package/batteries/tools/retrievables.cjs +4 -4
  129. package/batteries/tools/retrievables.mjs +4 -4
  130. package/batteries/tools/searxng/exceptions.d.ts +21 -0
  131. package/batteries/tools/searxng/index.d.ts +150 -0
  132. package/batteries/tools/searxng.cjs +5 -0
  133. package/batteries/tools/searxng.mjs +2 -0
  134. package/batteries/tools/standing_instructions.cjs +4 -4
  135. package/batteries/tools/standing_instructions.mjs +4 -4
  136. package/batteries/tools/statistics.cjs +54 -43
  137. package/batteries/tools/statistics.cjs.map +1 -1
  138. package/batteries/tools/statistics.mjs +54 -43
  139. package/batteries/tools/statistics.mjs.map +1 -1
  140. package/batteries/tools/string_processing.cjs +5 -5
  141. package/batteries/tools/string_processing.cjs.map +1 -1
  142. package/batteries/tools/string_processing.mjs +5 -5
  143. package/batteries/tools/string_processing.mjs.map +1 -1
  144. package/batteries/tools/structured_data.cjs +8 -13
  145. package/batteries/tools/structured_data.cjs.map +1 -1
  146. package/batteries/tools/structured_data.mjs +8 -13
  147. package/batteries/tools/structured_data.mjs.map +1 -1
  148. package/batteries/tools/text_analysis.cjs +3 -3
  149. package/batteries/tools/text_analysis.mjs +3 -3
  150. package/batteries/tools/text_comparison.cjs +2 -2
  151. package/batteries/tools/text_comparison.mjs +2 -2
  152. package/batteries/tools/time.cjs +2 -2
  153. package/batteries/tools/time.mjs +2 -2
  154. package/batteries/tools/unit_conversion.cjs +10 -8
  155. package/batteries/tools/unit_conversion.cjs.map +1 -1
  156. package/batteries/tools/unit_conversion.mjs +10 -8
  157. package/batteries/tools/unit_conversion.mjs.map +1 -1
  158. package/batteries/tools.cjs +3 -0
  159. package/batteries/tools.mjs +2 -1
  160. package/batteries/vector/arangodb/index.d.ts +2 -0
  161. package/batteries/vector/arangodb.cjs +2 -1
  162. package/batteries/vector/arangodb.cjs.map +1 -1
  163. package/batteries/vector/arangodb.mjs +2 -1
  164. package/batteries/vector/arangodb.mjs.map +1 -1
  165. package/batteries/vector/builder.cjs +31 -0
  166. package/batteries/vector/builder.cjs.map +1 -1
  167. package/batteries/vector/builder.d.ts +58 -0
  168. package/batteries/vector/builder.mjs +31 -0
  169. package/batteries/vector/builder.mjs.map +1 -1
  170. package/batteries/vector/chroma/index.d.ts +4 -0
  171. package/batteries/vector/chroma.cjs +3 -0
  172. package/batteries/vector/chroma.cjs.map +1 -1
  173. package/batteries/vector/chroma.mjs +3 -0
  174. package/batteries/vector/chroma.mjs.map +1 -1
  175. package/batteries/vector/clickhouse/index.d.ts +2 -0
  176. package/batteries/vector/clickhouse.cjs +2 -1
  177. package/batteries/vector/clickhouse.cjs.map +1 -1
  178. package/batteries/vector/clickhouse.mjs +2 -1
  179. package/batteries/vector/clickhouse.mjs.map +1 -1
  180. package/batteries/vector/cloudflare/index.d.ts +2 -0
  181. package/batteries/vector/cloudflare.cjs +2 -1
  182. package/batteries/vector/cloudflare.cjs.map +1 -1
  183. package/batteries/vector/cloudflare.mjs +2 -1
  184. package/batteries/vector/cloudflare.mjs.map +1 -1
  185. package/batteries/vector/conformance/index.d.ts +22 -0
  186. package/batteries/vector/conformance.cjs +22 -0
  187. package/batteries/vector/conformance.cjs.map +1 -1
  188. package/batteries/vector/conformance.mjs +22 -0
  189. package/batteries/vector/conformance.mjs.map +1 -1
  190. package/batteries/vector/contract.cjs +22 -0
  191. package/batteries/vector/contract.cjs.map +1 -1
  192. package/batteries/vector/contract.d.ts +51 -0
  193. package/batteries/vector/contract.mjs +22 -0
  194. package/batteries/vector/contract.mjs.map +1 -1
  195. package/batteries/vector/couchbase/index.d.ts +2 -0
  196. package/batteries/vector/couchbase.cjs +2 -1
  197. package/batteries/vector/couchbase.cjs.map +1 -1
  198. package/batteries/vector/couchbase.mjs +2 -1
  199. package/batteries/vector/couchbase.mjs.map +1 -1
  200. package/batteries/vector/duckdb/index.d.ts +2 -0
  201. package/batteries/vector/duckdb.cjs +2 -1
  202. package/batteries/vector/duckdb.cjs.map +1 -1
  203. package/batteries/vector/duckdb.mjs +2 -1
  204. package/batteries/vector/duckdb.mjs.map +1 -1
  205. package/batteries/vector/elasticsearch/index.d.ts +2 -0
  206. package/batteries/vector/elasticsearch.cjs +2 -1
  207. package/batteries/vector/elasticsearch.cjs.map +1 -1
  208. package/batteries/vector/elasticsearch.mjs +2 -1
  209. package/batteries/vector/elasticsearch.mjs.map +1 -1
  210. package/batteries/vector/exceptions.cjs +1 -1
  211. package/batteries/vector/exceptions.mjs +1 -1
  212. package/batteries/vector/factory.cjs +6 -0
  213. package/batteries/vector/factory.cjs.map +1 -1
  214. package/batteries/vector/factory.d.ts +14 -0
  215. package/batteries/vector/factory.mjs +6 -0
  216. package/batteries/vector/factory.mjs.map +1 -1
  217. package/batteries/vector/filters.cjs +22 -1
  218. package/batteries/vector/filters.cjs.map +1 -1
  219. package/batteries/vector/filters.d.ts +38 -0
  220. package/batteries/vector/filters.mjs +22 -1
  221. package/batteries/vector/filters.mjs.map +1 -1
  222. package/batteries/vector/helpers.cjs +13 -0
  223. package/batteries/vector/helpers.cjs.map +1 -1
  224. package/batteries/vector/helpers.d.ts +14 -0
  225. package/batteries/vector/helpers.mjs +13 -0
  226. package/batteries/vector/helpers.mjs.map +1 -1
  227. package/batteries/vector/hnswlib/index.d.ts +2 -0
  228. package/batteries/vector/hnswlib.cjs +2 -1
  229. package/batteries/vector/hnswlib.cjs.map +1 -1
  230. package/batteries/vector/hnswlib.mjs +2 -1
  231. package/batteries/vector/hnswlib.mjs.map +1 -1
  232. package/batteries/vector/in_memory/index.d.ts +1 -0
  233. package/batteries/vector/in_memory.cjs +1 -0
  234. package/batteries/vector/in_memory.cjs.map +1 -1
  235. package/batteries/vector/in_memory.mjs +1 -0
  236. package/batteries/vector/in_memory.mjs.map +1 -1
  237. package/batteries/vector/lancedb/index.d.ts +2 -0
  238. package/batteries/vector/lancedb.cjs +2 -1
  239. package/batteries/vector/lancedb.cjs.map +1 -1
  240. package/batteries/vector/lancedb.mjs +2 -1
  241. package/batteries/vector/lancedb.mjs.map +1 -1
  242. package/batteries/vector/mariadb/index.d.ts +2 -0
  243. package/batteries/vector/mariadb.cjs +2 -1
  244. package/batteries/vector/mariadb.cjs.map +1 -1
  245. package/batteries/vector/mariadb.mjs +2 -1
  246. package/batteries/vector/mariadb.mjs.map +1 -1
  247. package/batteries/vector/meilisearch/index.d.ts +2 -0
  248. package/batteries/vector/meilisearch.cjs +2 -1
  249. package/batteries/vector/meilisearch.cjs.map +1 -1
  250. package/batteries/vector/meilisearch.mjs +2 -1
  251. package/batteries/vector/meilisearch.mjs.map +1 -1
  252. package/batteries/vector/migrate.cjs +18 -1
  253. package/batteries/vector/migrate.cjs.map +1 -1
  254. package/batteries/vector/migrate.d.ts +31 -0
  255. package/batteries/vector/migrate.mjs +18 -1
  256. package/batteries/vector/migrate.mjs.map +1 -1
  257. package/batteries/vector/milvus/index.d.ts +5 -0
  258. package/batteries/vector/milvus.cjs +4 -0
  259. package/batteries/vector/milvus.cjs.map +1 -1
  260. package/batteries/vector/milvus.mjs +4 -0
  261. package/batteries/vector/milvus.mjs.map +1 -1
  262. package/batteries/vector/mongodb/index.d.ts +2 -0
  263. package/batteries/vector/mongodb.cjs +2 -1
  264. package/batteries/vector/mongodb.cjs.map +1 -1
  265. package/batteries/vector/mongodb.mjs +2 -1
  266. package/batteries/vector/mongodb.mjs.map +1 -1
  267. package/batteries/vector/neo4j/index.d.ts +2 -0
  268. package/batteries/vector/neo4j.cjs +2 -1
  269. package/batteries/vector/neo4j.cjs.map +1 -1
  270. package/batteries/vector/neo4j.mjs +2 -1
  271. package/batteries/vector/neo4j.mjs.map +1 -1
  272. package/batteries/vector/opensearch/index.d.ts +2 -0
  273. package/batteries/vector/opensearch.cjs +2 -1
  274. package/batteries/vector/opensearch.cjs.map +1 -1
  275. package/batteries/vector/opensearch.mjs +2 -1
  276. package/batteries/vector/opensearch.mjs.map +1 -1
  277. package/batteries/vector/oracle23ai/index.d.ts +2 -0
  278. package/batteries/vector/oracle23ai.cjs +2 -1
  279. package/batteries/vector/oracle23ai.cjs.map +1 -1
  280. package/batteries/vector/oracle23ai.mjs +2 -1
  281. package/batteries/vector/oracle23ai.mjs.map +1 -1
  282. package/batteries/vector/orama/index.d.ts +1 -0
  283. package/batteries/vector/orama.cjs +1 -0
  284. package/batteries/vector/orama.cjs.map +1 -1
  285. package/batteries/vector/orama.mjs +1 -0
  286. package/batteries/vector/orama.mjs.map +1 -1
  287. package/batteries/vector/pgvector/index.d.ts +9 -2
  288. package/batteries/vector/pgvector.cjs +4 -0
  289. package/batteries/vector/pgvector.cjs.map +1 -1
  290. package/batteries/vector/pgvector.mjs +4 -0
  291. package/batteries/vector/pgvector.mjs.map +1 -1
  292. package/batteries/vector/pinecone/index.d.ts +5 -0
  293. package/batteries/vector/pinecone.cjs +3 -1
  294. package/batteries/vector/pinecone.cjs.map +1 -1
  295. package/batteries/vector/pinecone.mjs +3 -1
  296. package/batteries/vector/pinecone.mjs.map +1 -1
  297. package/batteries/vector/plan.d.ts +27 -0
  298. package/batteries/vector/qdrant/index.d.ts +5 -0
  299. package/batteries/vector/qdrant.cjs +4 -0
  300. package/batteries/vector/qdrant.cjs.map +1 -1
  301. package/batteries/vector/qdrant.mjs +4 -0
  302. package/batteries/vector/qdrant.mjs.map +1 -1
  303. package/batteries/vector/redis/index.d.ts +2 -0
  304. package/batteries/vector/redis.cjs +2 -1
  305. package/batteries/vector/redis.cjs.map +1 -1
  306. package/batteries/vector/redis.mjs +2 -1
  307. package/batteries/vector/redis.mjs.map +1 -1
  308. package/batteries/vector/retrievable.cjs +9 -1
  309. package/batteries/vector/retrievable.cjs.map +1 -1
  310. package/batteries/vector/retrievable.mjs +9 -1
  311. package/batteries/vector/retrievable.mjs.map +1 -1
  312. package/batteries/vector/retrievable_glue.d.ts +21 -0
  313. package/batteries/vector/s3vectors/index.d.ts +2 -0
  314. package/batteries/vector/s3vectors.cjs +2 -1
  315. package/batteries/vector/s3vectors.cjs.map +1 -1
  316. package/batteries/vector/s3vectors.mjs +2 -1
  317. package/batteries/vector/s3vectors.mjs.map +1 -1
  318. package/batteries/vector/schema.cjs +28 -0
  319. package/batteries/vector/schema.cjs.map +1 -1
  320. package/batteries/vector/schema.d.ts +39 -0
  321. package/batteries/vector/schema.mjs +28 -0
  322. package/batteries/vector/schema.mjs.map +1 -1
  323. package/batteries/vector/solr/index.d.ts +2 -0
  324. package/batteries/vector/solr.cjs +2 -1
  325. package/batteries/vector/solr.cjs.map +1 -1
  326. package/batteries/vector/solr.mjs +2 -1
  327. package/batteries/vector/solr.mjs.map +1 -1
  328. package/batteries/vector/sqlite_vec/index.d.ts +6 -3
  329. package/batteries/vector/sqlite_vec.cjs +2 -0
  330. package/batteries/vector/sqlite_vec.cjs.map +1 -1
  331. package/batteries/vector/sqlite_vec.mjs +2 -0
  332. package/batteries/vector/sqlite_vec.mjs.map +1 -1
  333. package/batteries/vector/surrealdb/index.d.ts +2 -0
  334. package/batteries/vector/surrealdb.cjs +2 -1
  335. package/batteries/vector/surrealdb.cjs.map +1 -1
  336. package/batteries/vector/surrealdb.mjs +2 -1
  337. package/batteries/vector/surrealdb.mjs.map +1 -1
  338. package/batteries/vector/types.d.ts +27 -0
  339. package/batteries/vector/typesense/index.d.ts +2 -0
  340. package/batteries/vector/typesense.cjs +2 -1
  341. package/batteries/vector/typesense.cjs.map +1 -1
  342. package/batteries/vector/typesense.mjs +2 -1
  343. package/batteries/vector/typesense.mjs.map +1 -1
  344. package/batteries/vector/validation.cjs +14 -0
  345. package/batteries/vector/validation.cjs.map +1 -1
  346. package/batteries/vector/validation.d.ts +14 -0
  347. package/batteries/vector/validation.mjs +14 -0
  348. package/batteries/vector/validation.mjs.map +1 -1
  349. package/batteries/vector/vector_store_constructor.cjs +1 -1
  350. package/batteries/vector/vector_store_constructor.cjs.map +1 -1
  351. package/batteries/vector/vector_store_constructor.d.ts +1 -1
  352. package/batteries/vector/vector_store_constructor.mjs +1 -1
  353. package/batteries/vector/vector_store_constructor.mjs.map +1 -1
  354. package/batteries/vector/vespa/index.d.ts +2 -0
  355. package/batteries/vector/vespa.cjs +2 -1
  356. package/batteries/vector/vespa.cjs.map +1 -1
  357. package/batteries/vector/vespa.mjs +2 -1
  358. package/batteries/vector/vespa.mjs.map +1 -1
  359. package/batteries/vector/weaviate/index.d.ts +2 -0
  360. package/batteries/vector/weaviate.cjs +2 -1
  361. package/batteries/vector/weaviate.cjs.map +1 -1
  362. package/batteries/vector/weaviate.mjs +2 -1
  363. package/batteries/vector/weaviate.mjs.map +1 -1
  364. package/batteries.cjs +46 -28
  365. package/batteries.mjs +10 -5
  366. package/{common-BT0nfCi9.mjs → common-DYDUi99O.mjs} +9 -9
  367. package/common-DYDUi99O.mjs.map +1 -0
  368. package/{common-Cj8TaQ9U.js → common-DZl3ADJs.js} +9 -9
  369. package/common-DZl3ADJs.js.map +1 -0
  370. package/common.cjs +7 -7
  371. package/common.d.ts +1 -1
  372. package/common.mjs +7 -7
  373. package/{dispatch_runner-DPcS7Y_M.mjs → dispatch_runner--ZhdDWRZ.mjs} +27 -5
  374. package/{dispatch_runner-DPcS7Y_M.mjs.map → dispatch_runner--ZhdDWRZ.mjs.map} +1 -1
  375. package/{dispatch_runner-BHBNupqp.js → dispatch_runner-nHDKkxye.js} +27 -5
  376. package/{dispatch_runner-BHBNupqp.js.map → dispatch_runner-nHDKkxye.js.map} +1 -1
  377. package/dispatch_runner.cjs +1 -1
  378. package/dispatch_runner.d.ts +1 -1
  379. package/dispatch_runner.mjs +1 -1
  380. package/eslint/rules/artifact_tool_forbids_artifact_constructor.cjs +1 -0
  381. package/eslint/rules/artifact_tool_forbids_artifact_constructor.cjs.map +1 -1
  382. package/eslint/rules/artifact_tool_forbids_artifact_constructor.d.ts +1 -0
  383. package/eslint/rules/artifact_tool_forbids_artifact_constructor.mjs +1 -0
  384. package/eslint/rules/artifact_tool_forbids_artifact_constructor.mjs.map +1 -1
  385. package/eslint/rules/no_model_in_tool_handler.cjs +1 -0
  386. package/eslint/rules/no_model_in_tool_handler.cjs.map +1 -1
  387. package/eslint/rules/no_model_in_tool_handler.d.ts +1 -0
  388. package/eslint/rules/no_model_in_tool_handler.mjs +1 -0
  389. package/eslint/rules/no_model_in_tool_handler.mjs.map +1 -1
  390. package/eslint/rules/require_validator_any_required.cjs +1 -0
  391. package/eslint/rules/require_validator_any_required.cjs.map +1 -1
  392. package/eslint/rules/require_validator_any_required.d.ts +1 -0
  393. package/eslint/rules/require_validator_any_required.mjs +1 -0
  394. package/eslint/rules/require_validator_any_required.mjs.map +1 -1
  395. package/eslint/rules/thought_payload_requires_replay_tag.cjs +1 -0
  396. package/eslint/rules/thought_payload_requires_replay_tag.cjs.map +1 -1
  397. package/eslint/rules/thought_payload_requires_replay_tag.d.ts +1 -0
  398. package/eslint/rules/thought_payload_requires_replay_tag.mjs +1 -0
  399. package/eslint/rules/thought_payload_requires_replay_tag.mjs.map +1 -1
  400. package/eslint/rules/token_encoding_requires_context_window.cjs +1 -0
  401. package/eslint/rules/token_encoding_requires_context_window.cjs.map +1 -1
  402. package/eslint/rules/token_encoding_requires_context_window.d.ts +1 -0
  403. package/eslint/rules/token_encoding_requires_context_window.mjs +1 -0
  404. package/eslint/rules/token_encoding_requires_context_window.mjs.map +1 -1
  405. package/eslint.cjs +1 -1
  406. package/eslint.mjs +1 -1
  407. package/{exceptions-BeWH2FwP.mjs → exceptions-BDhN0Xzr.mjs} +3 -2
  408. package/exceptions-BDhN0Xzr.mjs.map +1 -0
  409. package/{exceptions-CitH5wZI.js → exceptions-BRXrUKiW.js} +3 -2
  410. package/exceptions-BRXrUKiW.js.map +1 -0
  411. package/exceptions.cjs +2 -2
  412. package/exceptions.mjs +2 -2
  413. package/factories.cjs +1 -1
  414. package/factories.mjs +1 -1
  415. package/forge.cjs +4 -4
  416. package/forge.d.ts +1 -1
  417. package/forge.mjs +4 -4
  418. package/guards.cjs +9 -9
  419. package/guards.mjs +9 -9
  420. package/helpers-DSTFxTiC.js +497 -0
  421. package/helpers-DSTFxTiC.js.map +1 -0
  422. package/helpers-xhrQbMAG.mjs +306 -0
  423. package/helpers-xhrQbMAG.mjs.map +1 -0
  424. package/index.cjs +13 -13
  425. package/index.mjs +13 -13
  426. package/lib/classes/base_exception.d.ts +1 -0
  427. package/lib/classes/media.d.ts +10 -0
  428. package/lib/classes/retrievable.d.ts +1 -1
  429. package/lib/classes/spooled_json_artifact.d.ts +1 -1
  430. package/lib/classes/spooled_markdown_artifact.d.ts +1 -0
  431. package/lib/classes/tokenizable.d.ts +3 -0
  432. package/lib/classes/tool.d.ts +8 -0
  433. package/lib/classes/turn_gate.d.ts +6 -0
  434. package/lib/dispatch_runner.d.ts +4 -32
  435. package/lib/helpers/bignum.cjs +82 -0
  436. package/lib/helpers/bignum.cjs.map +1 -0
  437. package/lib/helpers/bignum.d.ts +52 -0
  438. package/lib/helpers/bignum.mjs +74 -0
  439. package/lib/helpers/bignum.mjs.map +1 -0
  440. package/lib/turn_runner.d.ts +1 -1
  441. package/lib/types/dispatch_runner.d.ts +83 -0
  442. package/lib/utils/exceptions.d.ts +1 -1
  443. package/lib/utils/retry.cjs.map +1 -1
  444. package/lib/utils/retry.d.ts +2 -0
  445. package/lib/utils/retry.mjs.map +1 -1
  446. package/mcp/adk-docs-corpus.json +1 -1
  447. package/package.json +264 -224
  448. package/{runtime-j92CNi5z.mjs → runtime-Bz5zA8wc.mjs} +2 -2
  449. package/{runtime-j92CNi5z.mjs.map → runtime-Bz5zA8wc.mjs.map} +1 -1
  450. package/{runtime-MFFcJrRv.js → runtime-DslE1aBw.js} +2 -2
  451. package/{runtime-MFFcJrRv.js.map → runtime-DslE1aBw.js.map} +1 -1
  452. package/searxng-Bkrwhwhw.js +269 -0
  453. package/searxng-Bkrwhwhw.js.map +1 -0
  454. package/searxng-CyA-nEu5.mjs +257 -0
  455. package/searxng-CyA-nEu5.mjs.map +1 -0
  456. package/skills/adk-assembly/SKILL.md +2 -2
  457. package/{spooled_artifact-CHoZgWwI.mjs → spooled_artifact-7eePq7JA.mjs} +5 -5
  458. package/{spooled_artifact-CHoZgWwI.mjs.map → spooled_artifact-7eePq7JA.mjs.map} +1 -1
  459. package/{spooled_artifact-BTq6Nzfy.js → spooled_artifact-DX8LLyUX.js} +5 -5
  460. package/{spooled_artifact-BTq6Nzfy.js.map → spooled_artifact-DX8LLyUX.js.map} +1 -1
  461. package/spooled_artifact.cjs +2 -2
  462. package/spooled_artifact.mjs +2 -2
  463. package/{spooled_markdown_artifact-CALSDxIx.js → spooled_markdown_artifact-ClX72lek.js} +4 -4
  464. package/spooled_markdown_artifact-ClX72lek.js.map +1 -0
  465. package/{spooled_markdown_artifact-Ci5UL7l4.mjs → spooled_markdown_artifact-wkrBF3oX.mjs} +4 -4
  466. package/spooled_markdown_artifact-wkrBF3oX.mjs.map +1 -0
  467. package/{thought-D34QQZZ9.mjs → thought-B_vxAiKU.mjs} +5 -5
  468. package/{thought-D34QQZZ9.mjs.map → thought-B_vxAiKU.mjs.map} +1 -1
  469. package/{thought-BbwhJ1wb.js → thought-DLwpF7MI.js} +5 -5
  470. package/{thought-BbwhJ1wb.js.map → thought-DLwpF7MI.js.map} +1 -1
  471. package/{tool-CVyZkFC7.js → tool-D5WGVIcI.js} +4 -4
  472. package/{tool-CVyZkFC7.js.map → tool-D5WGVIcI.js.map} +1 -1
  473. package/{tool-CMhaDRNd.mjs → tool-wMYMVl60.mjs} +4 -4
  474. package/{tool-CMhaDRNd.mjs.map → tool-wMYMVl60.mjs.map} +1 -1
  475. package/{tool_call-CV5qVNlb.mjs → tool_call-B4-_-vjG.mjs} +5 -5
  476. package/tool_call-B4-_-vjG.mjs.map +1 -0
  477. package/{tool_call-Db68hB7y.js → tool_call-DixVlW40.js} +5 -5
  478. package/tool_call-DixVlW40.js.map +1 -0
  479. package/{tool_registry-D1pSSlsd.mjs → tool_registry-791Vrjtf.mjs} +4 -3
  480. package/tool_registry-791Vrjtf.mjs.map +1 -0
  481. package/{tool_registry-DYUYqXvo.js → tool_registry-CKJPze3j.js} +4 -3
  482. package/tool_registry-CKJPze3j.js.map +1 -0
  483. package/{turn_runner-DqWHNP80.js → turn_runner-HXImLGIn.js} +7 -7
  484. package/turn_runner-HXImLGIn.js.map +1 -0
  485. package/{turn_runner-fg1Wc3dK.mjs → turn_runner-ZyYO-Kti.mjs} +7 -7
  486. package/turn_runner-ZyYO-Kti.mjs.map +1 -0
  487. package/turn_runner.cjs +1 -1
  488. package/turn_runner.mjs +1 -1
  489. package/types.d.ts +1 -1
  490. package/common-BT0nfCi9.mjs.map +0 -1
  491. package/common-Cj8TaQ9U.js.map +0 -1
  492. package/exceptions-BeWH2FwP.mjs.map +0 -1
  493. package/exceptions-CitH5wZI.js.map +0 -1
  494. package/spooled_markdown_artifact-CALSDxIx.js.map +0 -1
  495. package/spooled_markdown_artifact-Ci5UL7l4.mjs.map +0 -1
  496. package/tool_call-CV5qVNlb.mjs.map +0 -1
  497. package/tool_call-Db68hB7y.js.map +0 -1
  498. package/tool_registry-D1pSSlsd.mjs.map +0 -1
  499. package/tool_registry-DYUYqXvo.js.map +0 -1
  500. package/turn_runner-DqWHNP80.js.map +0 -1
  501. package/turn_runner-fg1Wc3dK.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"hnswlib.mjs","names":["#opts","#lib","#collections","#ensureLib","#coll","#ensureCapacity","#project"],"sources":["../../../src/batteries/vector/hnswlib/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/hnswlib\n *\n * Embedded HNSWLib adapter (in-process, no server — like in_memory/sqlite_vec/duckdb). hnswlib is\n * a pure ANN index keyed by integer labels and holding ONLY vectors, so this adapter pairs the\n * index with a JS sidecar that owns id↔label mapping plus the document/metadata records. KNN runs\n * through the HNSW index; metadata filtering, filter-scans, projection and delete are served from\n * the sidecar via the neutral filter tree's JS reference evaluator (exact cross-adapter parity).\n *\n * Driver: `hnswlib-node` (native addon; requires the build to be approved — see\n * pnpm-workspace.yaml `allowBuilds`). Persistence is in-memory per process; pass a fresh store per\n * use. (The index supports writeIndex/readIndex on disk, but the sidecar would need its own\n * persistence — out of scope for the in-memory contract here.)\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_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 HnswlibVectorStoreOptions extends BaseVectorStoreOptions {\n // Initial index capacity per collection (grows automatically via resizeIndex). Default 1024.\n initialCapacity?: number\n}\n\ninterface StoredRecord {\n id: string\n label: number\n vector: number[]\n document?: string\n metadata?: VectorMetadata\n}\n\ninterface Collection {\n index: any\n dims: number\n metric: DistanceMetric\n byId: Map<string, StoredRecord>\n idByLabel: Map<number, string>\n nextLabel: number\n capacity: number\n}\n\nconst getHnswlib = async () => {\n try {\n const mod = await import('hnswlib-node')\n return (mod as any).default ?? mod\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['hnswlib-node'])\n }\n}\n\nconst spaceFor = (metric: DistanceMetric): string =>\n metric === 'euclidean' ? 'l2' : metric === 'dot' ? 'ip' : 'cosine'\n\nexport class HnswlibVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: true,\n rawSql: false,\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 #lib: any | null = null\n #collections: Map<string, Collection> = new Map()\n\n get #opts(): HnswlibVectorStoreOptions {\n return this.options as HnswlibVectorStoreOptions\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.#lib) return\n this.#lib = await getHnswlib()\n }\n\n async close(): Promise<void> {\n this.#collections.clear()\n this.#lib = null\n }\n\n async #ensureLib(): Promise<any> {\n if (!this.#lib) await this.connect()\n return this.#lib!\n }\n\n #coll(collection: string): Collection {\n const c = this.#collections.get(collection)\n if (!c) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED([\n 'collection',\n 'unknown collection: ' + collection,\n ])\n }\n return c\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n const lib = await this.#ensureLib()\n if (this.#collections.has(spec.collection)) {\n if (ifNotExists) return\n this.#collections.delete(spec.collection)\n }\n try {\n const capacity = this.#opts.initialCapacity ?? 1024\n const index = new lib.HierarchicalNSW(spaceFor(spec.vector.metric), spec.vector.dimensions)\n index.initIndex(capacity)\n this.#collections.set(spec.collection, {\n index,\n dims: spec.vector.dimensions,\n metric: spec.vector.metric,\n byId: new Map(),\n idByLabel: new Map(),\n nextLabel: 0,\n capacity,\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 if (!this.#collections.has(collection)) {\n if (ifExists) return\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', 'unknown collection'])\n }\n this.#collections.delete(collection)\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n return this.#collections.has(collection)\n }\n\n async renameCollection(from: string, to: string): Promise<void> {\n const c = this.#collections.get(from)\n if (!c) throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'unknown: ' + from])\n this.#collections.set(to, c)\n this.#collections.delete(from)\n }\n\n #ensureCapacity(c: Collection, additional: number): void {\n const needed = c.byId.size + additional\n if (needed > c.capacity) {\n const next = Math.max(needed, c.capacity * 2)\n c.index.resizeIndex(next)\n c.capacity = next\n }\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n await this.#ensureLib()\n const c = this.#coll(plan.collection)\n const expected = this.#opts.dimensions ?? c.dims\n try {\n this.#ensureCapacity(c, plan.records.length)\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 // Reuse the existing label on update (mark the old point deleted, then re-add under a\n // fresh label so the vector value actually changes — hnswlib has no in-place update).\n const existing = c.byId.get(r.id)\n if (existing) {\n try {\n c.index.markDelete(existing.label)\n } catch {\n // already gone — ignore\n }\n }\n this.#ensureCapacity(c, 1)\n const label = c.nextLabel++\n c.index.addPoint(vector, label)\n c.idByLabel.set(label, r.id)\n c.byId.set(r.id, { id: r.id, label, vector, document: r.document, metadata: r.metadata })\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 await this.#ensureLib()\n const c = this.#coll(plan.collection)\n const metric = this.#opts.metric ?? c.metric\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 rec = c.byId.get(plan.near.id)\n if (!rec) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = rec.vector\n }\n }\n\n const offset = plan.offset ?? 0\n try {\n if (queryVector) {\n // Over-fetch when filtering (and to absorb deleted points), then JS-filter for parity.\n const live = c.byId.size\n if (live === 0) return []\n const want = plan.filter ? live : Math.min(plan.topK + offset, live)\n const k = Math.min(Math.max(want, 1), live)\n const res = c.index.searchKnn(queryVector, k)\n const hits: Array<{ rec: StoredRecord; dist: number }> = []\n for (let i = 0; i < res.neighbors.length; i++) {\n const id = c.idByLabel.get(res.neighbors[i])\n if (id === undefined) continue\n const rec = c.byId.get(id)\n if (rec) hits.push({ rec, dist: res.distances[i] })\n }\n const filtered = plan.filter\n ? hits.filter((h) => evaluateFilter(plan.filter!, h.rec.metadata ?? {}))\n : hits\n return filtered\n .slice(offset, offset + plan.topK)\n .map((h) => this.#project(h.rec, plan, metric, h.dist))\n } else {\n // Filter-scan: serve from the sidecar (insertion order), JS-filter, no score.\n const rows = [...c.byId.values()]\n const filtered = plan.filter\n ? rows.filter((rec) => evaluateFilter(plan.filter!, rec.metadata ?? {}))\n : rows\n return filtered\n .slice(offset, offset + plan.topK)\n .map((rec) => this.#project(rec, plan, metric, undefined))\n }\n } catch (err) {\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\n }\n\n #project(\n rec: StoredRecord,\n plan: SearchPlan,\n metric: string,\n dist: number | undefined\n ): VectorMatch {\n const proj = plan.projection\n const out: VectorMatch = {}\n if (proj.id) out.id = rec.id\n if (proj.vector) out.vector = rec.vector.slice()\n if (proj.document) out.document = rec.document\n if (proj.metadata) out.metadata = rec.metadata ?? {}\n if (dist !== undefined) {\n out.score = normalizeScore(dist, metric as DistanceMetric, 'distance')\n }\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n await this.#ensureLib()\n const c = this.#coll(plan.collection)\n try {\n let targets: string[]\n if (plan.ids && plan.ids.length > 0) {\n targets = plan.ids\n } else if (plan.filter) {\n targets = [...c.byId.values()]\n .filter((rec) => evaluateFilter(plan.filter!, rec.metadata ?? {}))\n .map((rec) => rec.id)\n } else {\n targets = [...c.byId.keys()]\n }\n for (const id of targets) {\n const rec = c.byId.get(id)\n if (!rec) continue\n try {\n c.index.markDelete(rec.label)\n } catch {\n // already deleted — ignore\n }\n c.idByLabel.delete(rec.label)\n c.byId.delete(id)\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"hnswlib.mjs","names":["#opts","#lib","#collections","#ensureLib","#coll","#ensureCapacity","#project"],"sources":["../../../src/batteries/vector/hnswlib/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/hnswlib\n *\n * Embedded HNSWLib adapter (in-process, no server — like in_memory/sqlite_vec/duckdb). hnswlib is\n * a pure ANN index keyed by integer labels and holding ONLY vectors, so this adapter pairs the\n * index with a JS sidecar that owns id↔label mapping plus the document/metadata records. KNN runs\n * through the HNSW index; metadata filtering, filter-scans, projection and delete are served from\n * the sidecar via the neutral filter tree's JS reference evaluator (exact cross-adapter parity).\n *\n * Driver: `hnswlib-node` (native addon; requires the build to be approved — see\n * pnpm-workspace.yaml `allowBuilds`). Persistence is in-memory per process; pass a fresh store per\n * use. (The index supports writeIndex/readIndex on disk, but the sidecar would need its own\n * persistence — out of scope for the in-memory contract here.)\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_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 HnswlibVectorStoreOptions extends BaseVectorStoreOptions {\n /** Initial index capacity per collection; grows automatically via `resizeIndex`. Default 1024. */\n initialCapacity?: number\n}\n\ninterface StoredRecord {\n id: string\n label: number\n vector: number[]\n document?: string\n metadata?: VectorMetadata\n}\n\ninterface Collection {\n index: any\n dims: number\n metric: DistanceMetric\n byId: Map<string, StoredRecord>\n idByLabel: Map<number, string>\n nextLabel: number\n capacity: number\n}\n\nconst getHnswlib = async () => {\n try {\n const mod = await import('hnswlib-node')\n return (mod as any).default ?? mod\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['hnswlib-node'])\n }\n}\n\nconst spaceFor = (metric: DistanceMetric): string =>\n metric === 'euclidean' ? 'l2' : metric === 'dot' ? 'ip' : 'cosine'\n\nexport class HnswlibVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: true,\n rawSql: false,\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 #lib: any | null = null\n #collections: Map<string, Collection> = new Map()\n\n get #opts(): HnswlibVectorStoreOptions {\n return this.options as HnswlibVectorStoreOptions\n }\n\n /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */\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.#lib) return\n this.#lib = await getHnswlib()\n }\n\n async close(): Promise<void> {\n this.#collections.clear()\n this.#lib = null\n }\n\n async #ensureLib(): Promise<any> {\n if (!this.#lib) await this.connect()\n return this.#lib!\n }\n\n #coll(collection: string): Collection {\n const c = this.#collections.get(collection)\n if (!c) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED([\n 'collection',\n 'unknown collection: ' + collection,\n ])\n }\n return c\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n const lib = await this.#ensureLib()\n if (this.#collections.has(spec.collection)) {\n if (ifNotExists) return\n this.#collections.delete(spec.collection)\n }\n try {\n const capacity = this.#opts.initialCapacity ?? 1024\n const index = new lib.HierarchicalNSW(spaceFor(spec.vector.metric), spec.vector.dimensions)\n index.initIndex(capacity)\n this.#collections.set(spec.collection, {\n index,\n dims: spec.vector.dimensions,\n metric: spec.vector.metric,\n byId: new Map(),\n idByLabel: new Map(),\n nextLabel: 0,\n capacity,\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 if (!this.#collections.has(collection)) {\n if (ifExists) return\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', 'unknown collection'])\n }\n this.#collections.delete(collection)\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n return this.#collections.has(collection)\n }\n\n async renameCollection(from: string, to: string): Promise<void> {\n const c = this.#collections.get(from)\n if (!c) throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'unknown: ' + from])\n this.#collections.set(to, c)\n this.#collections.delete(from)\n }\n\n #ensureCapacity(c: Collection, additional: number): void {\n const needed = c.byId.size + additional\n if (needed > c.capacity) {\n const next = Math.max(needed, c.capacity * 2)\n c.index.resizeIndex(next)\n c.capacity = next\n }\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n await this.#ensureLib()\n const c = this.#coll(plan.collection)\n const expected = this.#opts.dimensions ?? c.dims\n try {\n this.#ensureCapacity(c, plan.records.length)\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 // Reuse the existing label on update (mark the old point deleted, then re-add under a\n // fresh label so the vector value actually changes — hnswlib has no in-place update).\n const existing = c.byId.get(r.id)\n if (existing) {\n try {\n c.index.markDelete(existing.label)\n } catch {\n // already gone — ignore\n }\n }\n this.#ensureCapacity(c, 1)\n const label = c.nextLabel++\n c.index.addPoint(vector, label)\n c.idByLabel.set(label, r.id)\n c.byId.set(r.id, { id: r.id, label, vector, document: r.document, metadata: r.metadata })\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 await this.#ensureLib()\n const c = this.#coll(plan.collection)\n const metric = this.#opts.metric ?? c.metric\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 rec = c.byId.get(plan.near.id)\n if (!rec) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = rec.vector\n }\n }\n\n const offset = plan.offset ?? 0\n try {\n if (queryVector) {\n // Over-fetch when filtering (and to absorb deleted points), then JS-filter for parity.\n const live = c.byId.size\n if (live === 0) return []\n const want = plan.filter ? live : Math.min(plan.topK + offset, live)\n const k = Math.min(Math.max(want, 1), live)\n const res = c.index.searchKnn(queryVector, k)\n const hits: Array<{ rec: StoredRecord; dist: number }> = []\n for (let i = 0; i < res.neighbors.length; i++) {\n const id = c.idByLabel.get(res.neighbors[i])\n if (id === undefined) continue\n const rec = c.byId.get(id)\n if (rec) hits.push({ rec, dist: res.distances[i] })\n }\n const filtered = plan.filter\n ? hits.filter((h) => evaluateFilter(plan.filter!, h.rec.metadata ?? {}))\n : hits\n return filtered\n .slice(offset, offset + plan.topK)\n .map((h) => this.#project(h.rec, plan, metric, h.dist))\n } else {\n // Filter-scan: serve from the sidecar (insertion order), JS-filter, no score.\n const rows = [...c.byId.values()]\n const filtered = plan.filter\n ? rows.filter((rec) => evaluateFilter(plan.filter!, rec.metadata ?? {}))\n : rows\n return filtered\n .slice(offset, offset + plan.topK)\n .map((rec) => this.#project(rec, plan, metric, undefined))\n }\n } catch (err) {\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\n }\n\n #project(\n rec: StoredRecord,\n plan: SearchPlan,\n metric: string,\n dist: number | undefined\n ): VectorMatch {\n const proj = plan.projection\n const out: VectorMatch = {}\n if (proj.id) out.id = rec.id\n if (proj.vector) out.vector = rec.vector.slice()\n if (proj.document) out.document = rec.document\n if (proj.metadata) out.metadata = rec.metadata ?? {}\n if (dist !== undefined) {\n out.score = normalizeScore(dist, metric as DistanceMetric, 'distance')\n }\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n await this.#ensureLib()\n const c = this.#coll(plan.collection)\n try {\n let targets: string[]\n if (plan.ids && plan.ids.length > 0) {\n targets = plan.ids\n } else if (plan.filter) {\n targets = [...c.byId.values()]\n .filter((rec) => evaluateFilter(plan.filter!, rec.metadata ?? {}))\n .map((rec) => rec.id)\n } else {\n targets = [...c.byId.keys()]\n }\n for (const id of targets) {\n const rec = c.byId.get(id)\n if (!rec) continue\n try {\n c.index.markDelete(rec.label)\n } catch {\n // already deleted — ignore\n }\n c.idByLabel.delete(rec.label)\n c.byId.delete(id)\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n"],"mappings":"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"}
@@ -9,6 +9,7 @@ export interface InMemoryVectorStoreOptions extends BaseVectorStoreOptions {
9
9
  export declare class InMemoryVectorStore extends BaseVectorStore {
10
10
  #private;
11
11
  readonly capabilities: VectorStoreCapabilities;
12
+ /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
12
13
  static isAvailable(): boolean;
13
14
  isAvailable(): boolean;
14
15
  connect(): Promise<void>;
@@ -24,6 +24,7 @@ var InMemoryVectorStore = class extends require_batteries_vector_contract.BaseVe
24
24
  };
25
25
  #collections = /* @__PURE__ */ new Map();
26
26
  #dims = /* @__PURE__ */ new Map();
27
+ /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
27
28
  static isAvailable() {
28
29
  return true;
29
30
  }
@@ -1 +1 @@
1
- {"version":3,"file":"in_memory.cjs","names":["#collections","#dims","#coll","#cosineLikeScore","#scoreVec","#project","#dot"],"sources":["../../../src/batteries/vector/in_memory/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/in_memory\n */\n\nimport { evaluateFilter } from '../filters'\nimport { normalizeScore } from '../helpers'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { E_VECTOR_STORE_DIMENSION_MISMATCH } from '../exceptions'\nimport type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from '../types'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec, Projection } from '../plan'\n\nexport interface InMemoryVectorStoreOptions extends BaseVectorStoreOptions {}\n\ninterface StoredRow {\n id: string\n vector?: number[]\n document?: string\n metadata?: Record<string, unknown>\n}\n\nexport class InMemoryVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: true,\n rawSql: false,\n builtInEncoding: false,\n // Strongly consistent: a write is visible on resolve, so the option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n #collections = new Map<string, Map<string, StoredRow>>()\n #dims = new Map<string, number>()\n\n static isAvailable(): boolean {\n return true\n }\n isAvailable(): boolean {\n return true\n }\n async connect(): Promise<void> {\n /* no-op */\n }\n async close(): Promise<void> {\n /* no-op */\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n if (this.#collections.has(spec.collection)) {\n if (!ifNotExists) {\n throw new Error(`Collection \"${spec.collection}\" already exists`)\n }\n return\n }\n this.#collections.set(spec.collection, new Map())\n this.#dims.set(spec.collection, spec.vector.dimensions)\n }\n\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n if (!this.#collections.has(collection)) {\n if (!ifExists) {\n throw new Error(`Collection \"${collection}\" does not exist`)\n }\n return\n }\n this.#collections.delete(collection)\n this.#dims.delete(collection)\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n return this.#collections.has(collection)\n }\n\n async renameCollection(from: string, to: string): Promise<void> {\n const m = this.#collections.get(from)\n if (!m) {\n throw new Error(`Collection \"${from}\" does not exist`)\n }\n if (this.#collections.has(to)) {\n throw new Error(`Collection \"${to}\" already exists`)\n }\n this.#collections.set(to, m)\n this.#collections.delete(from)\n const d = this.#dims.get(from)\n if (d !== undefined) {\n this.#dims.set(to, d)\n this.#dims.delete(from)\n }\n }\n\n #coll(collection: string): Map<string, StoredRow> {\n let m = this.#collections.get(collection)\n if (!m) {\n m = new Map()\n this.#collections.set(collection, m)\n }\n return m\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const expected = this.#dims.get(plan.collection)\n const m = this.#coll(plan.collection)\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 && expected !== undefined && vector.length !== expected) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length])\n }\n m.set(r.id, {\n id: r.id,\n vector,\n document: r.document,\n metadata: r.metadata as Record<string, unknown> | undefined,\n })\n }\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const m = this.#coll(plan.collection)\n if (plan.ids) {\n for (const id of plan.ids) m.delete(id)\n return\n }\n if (plan.filter) {\n for (const [id, row] of [...m]) {\n if (evaluateFilter(plan.filter, (row.metadata ?? {}) as any)) m.delete(id)\n }\n return\n }\n m.clear()\n }\n\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n const m = this.#coll(plan.collection)\n let rows = [...m.values()]\n if (plan.filter)\n rows = rows.filter((row) => evaluateFilter(plan.filter!, (row.metadata ?? {}) as any))\n let scored: { row: StoredRow; score?: number }[]\n if (plan.near && 'vector' in plan.near) {\n scored = rows.map((row) => ({\n row,\n score: this.#cosineLikeScore(plan.near as { vector: number[] }, row, plan),\n }))\n scored.sort((a, b) => (b.score ?? 0) - (a.score ?? 0))\n } else if (plan.near && 'serverText' in plan.near) {\n const [qv] = await this.encode([plan.near.serverText], 'query')\n scored = rows.map((row) => ({ row, score: this.#scoreVec(qv, row.vector, plan) }))\n scored.sort((a, b) => (b.score ?? 0) - (a.score ?? 0))\n } else if (plan.near && 'id' in plan.near) {\n const ref = m.get(plan.near.id)\n const qv = ref?.vector\n scored = rows.map((row) => ({\n row,\n score: qv ? this.#scoreVec(qv, row.vector, plan) : undefined,\n }))\n scored.sort((a, b) => (b.score ?? 0) - (a.score ?? 0))\n } else {\n scored = rows.map((row) => ({ row }))\n }\n const limited = scored.slice(plan.offset ?? 0, (plan.offset ?? 0) + plan.topK)\n return limited.map(({ row, score }) => this.#project(row, score, plan.projection))\n }\n\n #scoreVec(q: number[], v: number[] | undefined, _plan: SearchPlan): number | undefined {\n if (!v) return undefined\n const metric = this.options.metric ?? 'cosine'\n let raw: number\n if (metric === 'cosine') {\n const dot = this.#dot(q, v)\n const na = Math.sqrt(this.#dot(q, q))\n const nb = Math.sqrt(this.#dot(v, v))\n raw = na && nb ? dot / (na * nb) : 0\n return normalizeScore(raw, 'cosine', 'similarity')\n }\n if (metric === 'dot') {\n raw = this.#dot(q, v)\n return normalizeScore(raw, 'dot', 'similarity')\n }\n let s = 0\n for (let i = 0; i < Math.min(q.length, v.length); i++) {\n const d = q[i] - v[i]\n s += d * d\n }\n raw = Math.sqrt(s)\n return normalizeScore(raw, 'euclidean', 'distance')\n }\n\n #cosineLikeScore(\n near: { vector: number[] },\n row: StoredRow,\n plan: SearchPlan\n ): number | undefined {\n return this.#scoreVec(near.vector, row.vector, plan)\n }\n\n #dot(a: number[], b: number[]): number {\n let s = 0\n for (let i = 0; i < Math.min(a.length, b.length); i++) s += a[i] * b[i]\n return s\n }\n\n #project(row: StoredRow, score: number | undefined, p: Projection): VectorMatch {\n const out: VectorMatch = {}\n if (p.id) out.id = row.id\n if (score !== undefined) out.score = score\n if (p.vector && row.vector) out.vector = row.vector\n if (p.document && row.document !== undefined) out.document = row.document\n if (p.metadata && row.metadata !== undefined) out.metadata = row.metadata as any\n return out\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"in_memory.cjs","names":["#collections","#dims","#coll","#cosineLikeScore","#scoreVec","#project","#dot"],"sources":["../../../src/batteries/vector/in_memory/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/in_memory\n */\n\nimport { evaluateFilter } from '../filters'\nimport { normalizeScore } from '../helpers'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { E_VECTOR_STORE_DIMENSION_MISMATCH } from '../exceptions'\nimport type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from '../types'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec, Projection } from '../plan'\n\nexport interface InMemoryVectorStoreOptions extends BaseVectorStoreOptions {}\n\ninterface StoredRow {\n id: string\n vector?: number[]\n document?: string\n metadata?: Record<string, unknown>\n}\n\nexport class InMemoryVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: true,\n rawSql: false,\n builtInEncoding: false,\n // Strongly consistent: a write is visible on resolve, so the option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n #collections = new Map<string, Map<string, StoredRow>>()\n #dims = new Map<string, number>()\n\n /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */\n static isAvailable(): boolean {\n return true\n }\n isAvailable(): boolean {\n return true\n }\n async connect(): Promise<void> {\n /* no-op */\n }\n async close(): Promise<void> {\n /* no-op */\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n if (this.#collections.has(spec.collection)) {\n if (!ifNotExists) {\n throw new Error(`Collection \"${spec.collection}\" already exists`)\n }\n return\n }\n this.#collections.set(spec.collection, new Map())\n this.#dims.set(spec.collection, spec.vector.dimensions)\n }\n\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n if (!this.#collections.has(collection)) {\n if (!ifExists) {\n throw new Error(`Collection \"${collection}\" does not exist`)\n }\n return\n }\n this.#collections.delete(collection)\n this.#dims.delete(collection)\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n return this.#collections.has(collection)\n }\n\n async renameCollection(from: string, to: string): Promise<void> {\n const m = this.#collections.get(from)\n if (!m) {\n throw new Error(`Collection \"${from}\" does not exist`)\n }\n if (this.#collections.has(to)) {\n throw new Error(`Collection \"${to}\" already exists`)\n }\n this.#collections.set(to, m)\n this.#collections.delete(from)\n const d = this.#dims.get(from)\n if (d !== undefined) {\n this.#dims.set(to, d)\n this.#dims.delete(from)\n }\n }\n\n #coll(collection: string): Map<string, StoredRow> {\n let m = this.#collections.get(collection)\n if (!m) {\n m = new Map()\n this.#collections.set(collection, m)\n }\n return m\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const expected = this.#dims.get(plan.collection)\n const m = this.#coll(plan.collection)\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 && expected !== undefined && vector.length !== expected) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length])\n }\n m.set(r.id, {\n id: r.id,\n vector,\n document: r.document,\n metadata: r.metadata as Record<string, unknown> | undefined,\n })\n }\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const m = this.#coll(plan.collection)\n if (plan.ids) {\n for (const id of plan.ids) m.delete(id)\n return\n }\n if (plan.filter) {\n for (const [id, row] of [...m]) {\n if (evaluateFilter(plan.filter, (row.metadata ?? {}) as any)) m.delete(id)\n }\n return\n }\n m.clear()\n }\n\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n const m = this.#coll(plan.collection)\n let rows = [...m.values()]\n if (plan.filter)\n rows = rows.filter((row) => evaluateFilter(plan.filter!, (row.metadata ?? {}) as any))\n let scored: { row: StoredRow; score?: number }[]\n if (plan.near && 'vector' in plan.near) {\n scored = rows.map((row) => ({\n row,\n score: this.#cosineLikeScore(plan.near as { vector: number[] }, row, plan),\n }))\n scored.sort((a, b) => (b.score ?? 0) - (a.score ?? 0))\n } else if (plan.near && 'serverText' in plan.near) {\n const [qv] = await this.encode([plan.near.serverText], 'query')\n scored = rows.map((row) => ({ row, score: this.#scoreVec(qv, row.vector, plan) }))\n scored.sort((a, b) => (b.score ?? 0) - (a.score ?? 0))\n } else if (plan.near && 'id' in plan.near) {\n const ref = m.get(plan.near.id)\n const qv = ref?.vector\n scored = rows.map((row) => ({\n row,\n score: qv ? this.#scoreVec(qv, row.vector, plan) : undefined,\n }))\n scored.sort((a, b) => (b.score ?? 0) - (a.score ?? 0))\n } else {\n scored = rows.map((row) => ({ row }))\n }\n const limited = scored.slice(plan.offset ?? 0, (plan.offset ?? 0) + plan.topK)\n return limited.map(({ row, score }) => this.#project(row, score, plan.projection))\n }\n\n #scoreVec(q: number[], v: number[] | undefined, _plan: SearchPlan): number | undefined {\n if (!v) return undefined\n const metric = this.options.metric ?? 'cosine'\n let raw: number\n if (metric === 'cosine') {\n const dot = this.#dot(q, v)\n const na = Math.sqrt(this.#dot(q, q))\n const nb = Math.sqrt(this.#dot(v, v))\n raw = na && nb ? dot / (na * nb) : 0\n return normalizeScore(raw, 'cosine', 'similarity')\n }\n if (metric === 'dot') {\n raw = this.#dot(q, v)\n return normalizeScore(raw, 'dot', 'similarity')\n }\n let s = 0\n for (let i = 0; i < Math.min(q.length, v.length); i++) {\n const d = q[i] - v[i]\n s += d * d\n }\n raw = Math.sqrt(s)\n return normalizeScore(raw, 'euclidean', 'distance')\n }\n\n #cosineLikeScore(\n near: { vector: number[] },\n row: StoredRow,\n plan: SearchPlan\n ): number | undefined {\n return this.#scoreVec(near.vector, row.vector, plan)\n }\n\n #dot(a: number[], b: number[]): number {\n let s = 0\n for (let i = 0; i < Math.min(a.length, b.length); i++) s += a[i] * b[i]\n return s\n }\n\n #project(row: StoredRow, score: number | undefined, p: Projection): VectorMatch {\n const out: VectorMatch = {}\n if (p.id) out.id = row.id\n if (score !== undefined) out.score = score\n if (p.vector && row.vector) out.vector = row.vector\n if (p.document && row.document !== undefined) out.document = row.document\n if (p.metadata && row.metadata !== undefined) out.metadata = row.metadata as any\n return out\n }\n}\n"],"mappings":"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"}
@@ -22,6 +22,7 @@ var InMemoryVectorStore = class extends BaseVectorStore {
22
22
  };
23
23
  #collections = /* @__PURE__ */ new Map();
24
24
  #dims = /* @__PURE__ */ new Map();
25
+ /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
25
26
  static isAvailable() {
26
27
  return true;
27
28
  }
@@ -1 +1 @@
1
- {"version":3,"file":"in_memory.mjs","names":["#collections","#dims","#coll","#cosineLikeScore","#scoreVec","#project","#dot"],"sources":["../../../src/batteries/vector/in_memory/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/in_memory\n */\n\nimport { evaluateFilter } from '../filters'\nimport { normalizeScore } from '../helpers'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { E_VECTOR_STORE_DIMENSION_MISMATCH } from '../exceptions'\nimport type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from '../types'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec, Projection } from '../plan'\n\nexport interface InMemoryVectorStoreOptions extends BaseVectorStoreOptions {}\n\ninterface StoredRow {\n id: string\n vector?: number[]\n document?: string\n metadata?: Record<string, unknown>\n}\n\nexport class InMemoryVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: true,\n rawSql: false,\n builtInEncoding: false,\n // Strongly consistent: a write is visible on resolve, so the option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n #collections = new Map<string, Map<string, StoredRow>>()\n #dims = new Map<string, number>()\n\n static isAvailable(): boolean {\n return true\n }\n isAvailable(): boolean {\n return true\n }\n async connect(): Promise<void> {\n /* no-op */\n }\n async close(): Promise<void> {\n /* no-op */\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n if (this.#collections.has(spec.collection)) {\n if (!ifNotExists) {\n throw new Error(`Collection \"${spec.collection}\" already exists`)\n }\n return\n }\n this.#collections.set(spec.collection, new Map())\n this.#dims.set(spec.collection, spec.vector.dimensions)\n }\n\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n if (!this.#collections.has(collection)) {\n if (!ifExists) {\n throw new Error(`Collection \"${collection}\" does not exist`)\n }\n return\n }\n this.#collections.delete(collection)\n this.#dims.delete(collection)\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n return this.#collections.has(collection)\n }\n\n async renameCollection(from: string, to: string): Promise<void> {\n const m = this.#collections.get(from)\n if (!m) {\n throw new Error(`Collection \"${from}\" does not exist`)\n }\n if (this.#collections.has(to)) {\n throw new Error(`Collection \"${to}\" already exists`)\n }\n this.#collections.set(to, m)\n this.#collections.delete(from)\n const d = this.#dims.get(from)\n if (d !== undefined) {\n this.#dims.set(to, d)\n this.#dims.delete(from)\n }\n }\n\n #coll(collection: string): Map<string, StoredRow> {\n let m = this.#collections.get(collection)\n if (!m) {\n m = new Map()\n this.#collections.set(collection, m)\n }\n return m\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const expected = this.#dims.get(plan.collection)\n const m = this.#coll(plan.collection)\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 && expected !== undefined && vector.length !== expected) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length])\n }\n m.set(r.id, {\n id: r.id,\n vector,\n document: r.document,\n metadata: r.metadata as Record<string, unknown> | undefined,\n })\n }\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const m = this.#coll(plan.collection)\n if (plan.ids) {\n for (const id of plan.ids) m.delete(id)\n return\n }\n if (plan.filter) {\n for (const [id, row] of [...m]) {\n if (evaluateFilter(plan.filter, (row.metadata ?? {}) as any)) m.delete(id)\n }\n return\n }\n m.clear()\n }\n\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n const m = this.#coll(plan.collection)\n let rows = [...m.values()]\n if (plan.filter)\n rows = rows.filter((row) => evaluateFilter(plan.filter!, (row.metadata ?? {}) as any))\n let scored: { row: StoredRow; score?: number }[]\n if (plan.near && 'vector' in plan.near) {\n scored = rows.map((row) => ({\n row,\n score: this.#cosineLikeScore(plan.near as { vector: number[] }, row, plan),\n }))\n scored.sort((a, b) => (b.score ?? 0) - (a.score ?? 0))\n } else if (plan.near && 'serverText' in plan.near) {\n const [qv] = await this.encode([plan.near.serverText], 'query')\n scored = rows.map((row) => ({ row, score: this.#scoreVec(qv, row.vector, plan) }))\n scored.sort((a, b) => (b.score ?? 0) - (a.score ?? 0))\n } else if (plan.near && 'id' in plan.near) {\n const ref = m.get(plan.near.id)\n const qv = ref?.vector\n scored = rows.map((row) => ({\n row,\n score: qv ? this.#scoreVec(qv, row.vector, plan) : undefined,\n }))\n scored.sort((a, b) => (b.score ?? 0) - (a.score ?? 0))\n } else {\n scored = rows.map((row) => ({ row }))\n }\n const limited = scored.slice(plan.offset ?? 0, (plan.offset ?? 0) + plan.topK)\n return limited.map(({ row, score }) => this.#project(row, score, plan.projection))\n }\n\n #scoreVec(q: number[], v: number[] | undefined, _plan: SearchPlan): number | undefined {\n if (!v) return undefined\n const metric = this.options.metric ?? 'cosine'\n let raw: number\n if (metric === 'cosine') {\n const dot = this.#dot(q, v)\n const na = Math.sqrt(this.#dot(q, q))\n const nb = Math.sqrt(this.#dot(v, v))\n raw = na && nb ? dot / (na * nb) : 0\n return normalizeScore(raw, 'cosine', 'similarity')\n }\n if (metric === 'dot') {\n raw = this.#dot(q, v)\n return normalizeScore(raw, 'dot', 'similarity')\n }\n let s = 0\n for (let i = 0; i < Math.min(q.length, v.length); i++) {\n const d = q[i] - v[i]\n s += d * d\n }\n raw = Math.sqrt(s)\n return normalizeScore(raw, 'euclidean', 'distance')\n }\n\n #cosineLikeScore(\n near: { vector: number[] },\n row: StoredRow,\n plan: SearchPlan\n ): number | undefined {\n return this.#scoreVec(near.vector, row.vector, plan)\n }\n\n #dot(a: number[], b: number[]): number {\n let s = 0\n for (let i = 0; i < Math.min(a.length, b.length); i++) s += a[i] * b[i]\n return s\n }\n\n #project(row: StoredRow, score: number | undefined, p: Projection): VectorMatch {\n const out: VectorMatch = {}\n if (p.id) out.id = row.id\n if (score !== undefined) out.score = score\n if (p.vector && row.vector) out.vector = row.vector\n if (p.document && row.document !== undefined) out.document = row.document\n if (p.metadata && row.metadata !== undefined) out.metadata = row.metadata as any\n return out\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"in_memory.mjs","names":["#collections","#dims","#coll","#cosineLikeScore","#scoreVec","#project","#dot"],"sources":["../../../src/batteries/vector/in_memory/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/in_memory\n */\n\nimport { evaluateFilter } from '../filters'\nimport { normalizeScore } from '../helpers'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { E_VECTOR_STORE_DIMENSION_MISMATCH } from '../exceptions'\nimport type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from '../types'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec, Projection } from '../plan'\n\nexport interface InMemoryVectorStoreOptions extends BaseVectorStoreOptions {}\n\ninterface StoredRow {\n id: string\n vector?: number[]\n document?: string\n metadata?: Record<string, unknown>\n}\n\nexport class InMemoryVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: true,\n rawSql: false,\n builtInEncoding: false,\n // Strongly consistent: a write is visible on resolve, so the option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n #collections = new Map<string, Map<string, StoredRow>>()\n #dims = new Map<string, number>()\n\n /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */\n static isAvailable(): boolean {\n return true\n }\n isAvailable(): boolean {\n return true\n }\n async connect(): Promise<void> {\n /* no-op */\n }\n async close(): Promise<void> {\n /* no-op */\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n if (this.#collections.has(spec.collection)) {\n if (!ifNotExists) {\n throw new Error(`Collection \"${spec.collection}\" already exists`)\n }\n return\n }\n this.#collections.set(spec.collection, new Map())\n this.#dims.set(spec.collection, spec.vector.dimensions)\n }\n\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n if (!this.#collections.has(collection)) {\n if (!ifExists) {\n throw new Error(`Collection \"${collection}\" does not exist`)\n }\n return\n }\n this.#collections.delete(collection)\n this.#dims.delete(collection)\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n return this.#collections.has(collection)\n }\n\n async renameCollection(from: string, to: string): Promise<void> {\n const m = this.#collections.get(from)\n if (!m) {\n throw new Error(`Collection \"${from}\" does not exist`)\n }\n if (this.#collections.has(to)) {\n throw new Error(`Collection \"${to}\" already exists`)\n }\n this.#collections.set(to, m)\n this.#collections.delete(from)\n const d = this.#dims.get(from)\n if (d !== undefined) {\n this.#dims.set(to, d)\n this.#dims.delete(from)\n }\n }\n\n #coll(collection: string): Map<string, StoredRow> {\n let m = this.#collections.get(collection)\n if (!m) {\n m = new Map()\n this.#collections.set(collection, m)\n }\n return m\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const expected = this.#dims.get(plan.collection)\n const m = this.#coll(plan.collection)\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 && expected !== undefined && vector.length !== expected) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length])\n }\n m.set(r.id, {\n id: r.id,\n vector,\n document: r.document,\n metadata: r.metadata as Record<string, unknown> | undefined,\n })\n }\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const m = this.#coll(plan.collection)\n if (plan.ids) {\n for (const id of plan.ids) m.delete(id)\n return\n }\n if (plan.filter) {\n for (const [id, row] of [...m]) {\n if (evaluateFilter(plan.filter, (row.metadata ?? {}) as any)) m.delete(id)\n }\n return\n }\n m.clear()\n }\n\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n const m = this.#coll(plan.collection)\n let rows = [...m.values()]\n if (plan.filter)\n rows = rows.filter((row) => evaluateFilter(plan.filter!, (row.metadata ?? {}) as any))\n let scored: { row: StoredRow; score?: number }[]\n if (plan.near && 'vector' in plan.near) {\n scored = rows.map((row) => ({\n row,\n score: this.#cosineLikeScore(plan.near as { vector: number[] }, row, plan),\n }))\n scored.sort((a, b) => (b.score ?? 0) - (a.score ?? 0))\n } else if (plan.near && 'serverText' in plan.near) {\n const [qv] = await this.encode([plan.near.serverText], 'query')\n scored = rows.map((row) => ({ row, score: this.#scoreVec(qv, row.vector, plan) }))\n scored.sort((a, b) => (b.score ?? 0) - (a.score ?? 0))\n } else if (plan.near && 'id' in plan.near) {\n const ref = m.get(plan.near.id)\n const qv = ref?.vector\n scored = rows.map((row) => ({\n row,\n score: qv ? this.#scoreVec(qv, row.vector, plan) : undefined,\n }))\n scored.sort((a, b) => (b.score ?? 0) - (a.score ?? 0))\n } else {\n scored = rows.map((row) => ({ row }))\n }\n const limited = scored.slice(plan.offset ?? 0, (plan.offset ?? 0) + plan.topK)\n return limited.map(({ row, score }) => this.#project(row, score, plan.projection))\n }\n\n #scoreVec(q: number[], v: number[] | undefined, _plan: SearchPlan): number | undefined {\n if (!v) return undefined\n const metric = this.options.metric ?? 'cosine'\n let raw: number\n if (metric === 'cosine') {\n const dot = this.#dot(q, v)\n const na = Math.sqrt(this.#dot(q, q))\n const nb = Math.sqrt(this.#dot(v, v))\n raw = na && nb ? dot / (na * nb) : 0\n return normalizeScore(raw, 'cosine', 'similarity')\n }\n if (metric === 'dot') {\n raw = this.#dot(q, v)\n return normalizeScore(raw, 'dot', 'similarity')\n }\n let s = 0\n for (let i = 0; i < Math.min(q.length, v.length); i++) {\n const d = q[i] - v[i]\n s += d * d\n }\n raw = Math.sqrt(s)\n return normalizeScore(raw, 'euclidean', 'distance')\n }\n\n #cosineLikeScore(\n near: { vector: number[] },\n row: StoredRow,\n plan: SearchPlan\n ): number | undefined {\n return this.#scoreVec(near.vector, row.vector, plan)\n }\n\n #dot(a: number[], b: number[]): number {\n let s = 0\n for (let i = 0; i < Math.min(a.length, b.length); i++) s += a[i] * b[i]\n return s\n }\n\n #project(row: StoredRow, score: number | undefined, p: Projection): VectorMatch {\n const out: VectorMatch = {}\n if (p.id) out.id = row.id\n if (score !== undefined) out.score = score\n if (p.vector && row.vector) out.vector = row.vector\n if (p.document && row.document !== undefined) out.document = row.document\n if (p.metadata && row.metadata !== undefined) out.metadata = row.metadata as any\n return out\n }\n}\n"],"mappings":";;;;;;;;;AAqBA,IAAa,sBAAb,cAAyC,gBAAgB;CACvD,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,+BAAe,IAAI,IAAoC;CACvD,wBAAQ,IAAI,IAAoB;;CAGhC,OAAO,cAAuB;EAC5B,OAAO;CACT;CACA,cAAuB;EACrB,OAAO;CACT;CACA,MAAM,UAAyB,CAE/B;CACA,MAAM,QAAuB,CAE7B;CAEA,MAAM,iBAAiB,MAAsB,aAAqC;EAChF,IAAI,KAAKA,aAAa,IAAI,KAAK,UAAU,GAAG;GAC1C,IAAI,CAAC,aACH,MAAM,IAAI,MAAM,eAAe,KAAK,WAAW,iBAAiB;GAElE;EACF;EACA,KAAKA,aAAa,IAAI,KAAK,4BAAY,IAAI,IAAI,CAAC;EAChD,KAAKC,MAAM,IAAI,KAAK,YAAY,KAAK,OAAO,UAAU;CACxD;CAEA,MAAM,eAAe,YAAoB,UAAkC;EACzE,IAAI,CAAC,KAAKD,aAAa,IAAI,UAAU,GAAG;GACtC,IAAI,CAAC,UACH,MAAM,IAAI,MAAM,eAAe,WAAW,iBAAiB;GAE7D;EACF;EACA,KAAKA,aAAa,OAAO,UAAU;EACnC,KAAKC,MAAM,OAAO,UAAU;CAC9B;CAEA,MAAM,cAAc,YAAsC;EACxD,OAAO,KAAKD,aAAa,IAAI,UAAU;CACzC;CAEA,MAAM,iBAAiB,MAAc,IAA2B;EAC9D,MAAM,IAAI,KAAKA,aAAa,IAAI,IAAI;EACpC,IAAI,CAAC,GACH,MAAM,IAAI,MAAM,eAAe,KAAK,iBAAiB;EAEvD,IAAI,KAAKA,aAAa,IAAI,EAAE,GAC1B,MAAM,IAAI,MAAM,eAAe,GAAG,iBAAiB;EAErD,KAAKA,aAAa,IAAI,IAAI,CAAC;EAC3B,KAAKA,aAAa,OAAO,IAAI;EAC7B,MAAM,IAAI,KAAKC,MAAM,IAAI,IAAI;EAC7B,IAAI,MAAM,KAAA,GAAW;GACnB,KAAKA,MAAM,IAAI,IAAI,CAAC;GACpB,KAAKA,MAAM,OAAO,IAAI;EACxB;CACF;CAEA,MAAM,YAA4C;EAChD,IAAI,IAAI,KAAKD,aAAa,IAAI,UAAU;EACxC,IAAI,CAAC,GAAG;GACN,oBAAI,IAAI,IAAI;GACZ,KAAKA,aAAa,IAAI,YAAY,CAAC;EACrC;EACA,OAAO;CACT;CAEA,MAAM,cAAc,MAAiC;EACnD,IAAI,KAAK,QAAQ,WAAW,GAAG;EAC/B,gBAAgB,KAAK,OAAO;EAC5B,MAAM,WAAW,KAAKC,MAAM,IAAI,KAAK,UAAU;EAC/C,MAAM,IAAI,KAAKC,MAAM,KAAK,UAAU;EACpC,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,UAAU,aAAa,KAAA,KAAa,OAAO,WAAW,UACxD,MAAM,IAAI,kCAAkC,CAAC,UAAU,OAAO,MAAM,CAAC;GAEvE,EAAE,IAAI,EAAE,IAAI;IACV,IAAI,EAAE;IACN;IACA,UAAU,EAAE;IACZ,UAAU,EAAE;GACd,CAAC;EACH;CACF;CAEA,MAAM,cAAc,MAAiC;EACnD,MAAM,IAAI,KAAKA,MAAM,KAAK,UAAU;EACpC,IAAI,KAAK,KAAK;GACZ,KAAK,MAAM,MAAM,KAAK,KAAK,EAAE,OAAO,EAAE;GACtC;EACF;EACA,IAAI,KAAK,QAAQ;GACf,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,GAC3B,IAAI,eAAe,KAAK,QAAS,IAAI,YAAY,CAAC,CAAS,GAAG,EAAE,OAAO,EAAE;GAE3E;EACF;EACA,EAAE,MAAM;CACV;CAEA,MAAM,cAAc,MAA0C;EAC5D,MAAM,IAAI,KAAKA,MAAM,KAAK,UAAU;EACpC,IAAI,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC;EACzB,IAAI,KAAK,QACP,OAAO,KAAK,QAAQ,QAAQ,eAAe,KAAK,QAAU,IAAI,YAAY,CAAC,CAAS,CAAC;EACvF,IAAI;EACJ,IAAI,KAAK,QAAQ,YAAY,KAAK,MAAM;GACtC,SAAS,KAAK,KAAK,SAAS;IAC1B;IACA,OAAO,KAAKC,iBAAiB,KAAK,MAA8B,KAAK,IAAI;GAC3E,EAAE;GACF,OAAO,MAAM,GAAG,OAAO,EAAE,SAAS,MAAM,EAAE,SAAS,EAAE;EACvD,OAAO,IAAI,KAAK,QAAQ,gBAAgB,KAAK,MAAM;GACjD,MAAM,CAAC,MAAM,MAAM,KAAK,OAAO,CAAC,KAAK,KAAK,UAAU,GAAG,OAAO;GAC9D,SAAS,KAAK,KAAK,SAAS;IAAE;IAAK,OAAO,KAAKC,UAAU,IAAI,IAAI,QAAQ,IAAI;GAAE,EAAE;GACjF,OAAO,MAAM,GAAG,OAAO,EAAE,SAAS,MAAM,EAAE,SAAS,EAAE;EACvD,OAAO,IAAI,KAAK,QAAQ,QAAQ,KAAK,MAAM;GAEzC,MAAM,KADM,EAAE,IAAI,KAAK,KAAK,EACjB,GAAK;GAChB,SAAS,KAAK,KAAK,SAAS;IAC1B;IACA,OAAO,KAAK,KAAKA,UAAU,IAAI,IAAI,QAAQ,IAAI,IAAI,KAAA;GACrD,EAAE;GACF,OAAO,MAAM,GAAG,OAAO,EAAE,SAAS,MAAM,EAAE,SAAS,EAAE;EACvD,OACE,SAAS,KAAK,KAAK,SAAS,EAAE,IAAI,EAAE;EAGtC,OADgB,OAAO,MAAM,KAAK,UAAU,IAAI,KAAK,UAAU,KAAK,KAAK,IAClE,EAAQ,KAAK,EAAE,KAAK,YAAY,KAAKC,SAAS,KAAK,OAAO,KAAK,UAAU,CAAC;CACnF;CAEA,UAAU,GAAa,GAAyB,OAAuC;EACrF,IAAI,CAAC,GAAG,OAAO,KAAA;EACf,MAAM,SAAS,KAAK,QAAQ,UAAU;EACtC,IAAI;EACJ,IAAI,WAAW,UAAU;GACvB,MAAM,MAAM,KAAKC,KAAK,GAAG,CAAC;GAC1B,MAAM,KAAK,KAAK,KAAK,KAAKA,KAAK,GAAG,CAAC,CAAC;GACpC,MAAM,KAAK,KAAK,KAAK,KAAKA,KAAK,GAAG,CAAC,CAAC;GACpC,MAAM,MAAM,KAAK,OAAO,KAAK,MAAM;GACnC,OAAO,eAAe,KAAK,UAAU,YAAY;EACnD;EACA,IAAI,WAAW,OAAO;GACpB,MAAM,KAAKA,KAAK,GAAG,CAAC;GACpB,OAAO,eAAe,KAAK,OAAO,YAAY;EAChD;EACA,IAAI,IAAI;EACR,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK;GACrD,MAAM,IAAI,EAAE,KAAK,EAAE;GACnB,KAAK,IAAI;EACX;EACA,MAAM,KAAK,KAAK,CAAC;EACjB,OAAO,eAAe,KAAK,aAAa,UAAU;CACpD;CAEA,iBACE,MACA,KACA,MACoB;EACpB,OAAO,KAAKF,UAAU,KAAK,QAAQ,IAAI,QAAQ,IAAI;CACrD;CAEA,KAAK,GAAa,GAAqB;EACrC,IAAI,IAAI;EACR,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,KAAK,EAAE,KAAK,EAAE;EACrE,OAAO;CACT;CAEA,SAAS,KAAgB,OAA2B,GAA4B;EAC9E,MAAM,MAAmB,CAAC;EAC1B,IAAI,EAAE,IAAI,IAAI,KAAK,IAAI;EACvB,IAAI,UAAU,KAAA,GAAW,IAAI,QAAQ;EACrC,IAAI,EAAE,UAAU,IAAI,QAAQ,IAAI,SAAS,IAAI;EAC7C,IAAI,EAAE,YAAY,IAAI,aAAa,KAAA,GAAW,IAAI,WAAW,IAAI;EACjE,IAAI,EAAE,YAAY,IAAI,aAAa,KAAA,GAAW,IAAI,WAAW,IAAI;EACjE,OAAO;CACT;AACF"}
@@ -13,6 +13,7 @@ import { BaseVectorStore } from "../contract";
13
13
  import type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from "../plan";
14
14
  import type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from "../types";
15
15
  export interface LanceDBVectorStoreOptions extends BaseVectorStoreOptions {
16
+ /** Connection and authentication parameters for the backend. */
16
17
  connection: {
17
18
  uri: string;
18
19
  };
@@ -20,6 +21,7 @@ export interface LanceDBVectorStoreOptions extends BaseVectorStoreOptions {
20
21
  export declare class LanceDBVectorStore extends BaseVectorStore {
21
22
  #private;
22
23
  readonly capabilities: VectorStoreCapabilities;
24
+ /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
23
25
  static isAvailable(): boolean;
24
26
  isAvailable(): boolean;
25
27
  connect(): Promise<void>;
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  require("../../chunk-Ble4zEEl.js");
3
- const require_tool_registry = require("../../tool_registry-DYUYqXvo.js");
3
+ const require_tool_registry = require("../../tool_registry-CKJPze3j.js");
4
4
  require("../../guards.cjs");
5
5
  const require_batteries_vector_filters = require("./filters.cjs");
6
6
  const require_batteries_vector_helpers = require("./helpers.cjs");
@@ -53,6 +53,7 @@ var LanceDBVectorStore = class extends require_batteries_vector_contract.BaseVec
53
53
  get #opts() {
54
54
  return this.options;
55
55
  }
56
+ /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
56
57
  static isAvailable() {
57
58
  return typeof process !== "undefined";
58
59
  }
@@ -1 +1 @@
1
- {"version":3,"file":"lancedb.cjs","names":["#opts","#db","#ensure","#dims","#parseMeta","#project"],"sources":["../../../src/batteries/vector/lancedb/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/lancedb\n *\n * Embedded LanceDB adapter (no server — file-based, like sqlite_vec/duckdb). Each collection\n * is a Lance table with an explicit Arrow schema (`id` Utf8, `vec` FixedSizeList<Float32>,\n * `document` Utf8, `metadata` Utf8-JSON). KNN uses `table.search(vector).distanceType(...)`;\n * metadata is filtered with the neutral filter tree's JS reference evaluator for exact\n * cross-adapter parity. Upsert is a merge-insert on `id`.\n *\n * Drivers: `@lancedb/lancedb` + `apache-arrow` (prebuilt binary; no native compile).\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 LanceDBVectorStoreOptions extends BaseVectorStoreOptions {\n connection: { uri: string }\n}\n\nconst getLanceDB = async () => {\n try {\n return await import('@lancedb/lancedb')\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['@lancedb/lancedb'])\n }\n}\n\nconst getArrow = async () => {\n try {\n return await import('apache-arrow')\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['apache-arrow'])\n }\n}\n\nconst lanceMetric = (metric: DistanceMetric): string =>\n metric === 'euclidean' ? 'l2' : metric === 'dot' ? 'dot' : 'cosine'\n\n// LanceDB SQL string literal (single-quoted, escape embedded quotes).\nconst lit = (value: string): string => `'${value.replace(/'/g, \"''\")}'`\n\nexport class LanceDBVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: true,\n rawSql: false,\n builtInEncoding: false,\n // Embedded 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 #db: any | null = null\n #dims: Map<string, number> = new Map()\n\n get #opts(): LanceDBVectorStoreOptions {\n return this.options as LanceDBVectorStoreOptions\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.#db) return\n const lancedb = await getLanceDB()\n const uri = this.#opts.connection?.uri\n if (!uri) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([\n 'LanceDB requires connection.uri (a directory path)',\n ])\n }\n try {\n this.#db = await lancedb.connect(uri)\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n\n async close(): Promise<void> {\n this.#db = null\n }\n\n async #ensure(): Promise<any> {\n if (!this.#db) await this.connect()\n return this.#db!\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n const db = await this.#ensure()\n this.#dims.set(spec.collection, spec.vector.dimensions)\n if (ifNotExists && (await this.hasCollection(spec.collection))) return\n const arrow = await getArrow()\n const schema = new arrow.Schema([\n new arrow.Field('id', new arrow.Utf8(), false),\n new arrow.Field(\n 'vec',\n new arrow.FixedSizeList(\n spec.vector.dimensions,\n new arrow.Field('item', new arrow.Float32(), true)\n ),\n false\n ),\n new arrow.Field('document', new arrow.Utf8(), true),\n new arrow.Field('metadata', new arrow.Utf8(), true),\n ])\n try {\n await db.createEmptyTable(spec.collection, schema, { mode: 'overwrite' })\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 db = await this.#ensure()\n if (ifExists && !(await this.hasCollection(collection))) return\n try {\n await db.dropTable(collection)\n this.#dims.delete(collection)\n } catch (err) {\n const msg = String(err)\n if (ifExists && msg.includes('not found')) return\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', msg])\n }\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n const db = await this.#ensure()\n try {\n const names = await db.tableNames()\n return names.includes(collection)\n } catch {\n return false\n }\n }\n\n async renameCollection(_from: string, _to: string): Promise<void> {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'lancedb'])\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const db = await this.#ensure()\n const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection)\n try {\n const rows: any[] = []\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 rows.push({\n id: r.id,\n vec: vector,\n document: r.document ?? '',\n metadata: r.metadata ? JSON.stringify(r.metadata) : '{}',\n })\n }\n const tbl = await db.openTable(plan.collection)\n // Merge-insert on id = upsert (update matched, insert unmatched).\n await tbl.mergeInsert('id').whenMatchedUpdateAll().whenNotMatchedInsertAll().execute(rows)\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 db = await this.#ensure()\n const metric = this.#opts.metric ?? 'cosine'\n let queryVector: number[] | undefined\n let tbl: any\n try {\n tbl = await db.openTable(plan.collection)\n } catch (err) {\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\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 rows = await tbl\n .query()\n .where(`id = ${lit(plan.near.id)}`)\n .limit(1)\n .toArray()\n if (rows.length === 0) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = Array.from(rows[0].vec as ArrayLike<number>)\n }\n }\n\n const offset = plan.offset ?? 0\n try {\n if (queryVector) {\n // Over-fetch then JS-filter for exact cross-adapter filter semantics.\n const k = plan.filter ? 1000 : plan.topK + offset\n const rows = await tbl\n .search(queryVector)\n .distanceType(lanceMetric(metric))\n .limit(k)\n .toArray()\n const filtered = plan.filter\n ? rows.filter((row: any) => evaluateFilter(plan.filter!, this.#parseMeta(row.metadata)))\n : rows\n return filtered\n .slice(offset, offset + plan.topK)\n .map((row: any) => this.#project(row, plan, metric, true))\n } else {\n const rows = await tbl\n .query()\n .limit(plan.filter ? 100000 : plan.topK + offset)\n .toArray()\n const filtered = plan.filter\n ? rows.filter((row: any) => evaluateFilter(plan.filter!, this.#parseMeta(row.metadata)))\n : rows\n return filtered\n .slice(offset, offset + plan.topK)\n .map((row: any) => 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 && row.vec) out.vector = Array.from(row.vec as ArrayLike<number>)\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._distance !== undefined && row._distance !== null) {\n out.score = normalizeScore(Number(row._distance), metric as DistanceMetric, 'distance')\n }\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const db = await this.#ensure()\n try {\n const tbl = await db.openTable(plan.collection)\n if (plan.ids && plan.ids.length > 0) {\n const list = plan.ids.map((id) => lit(id)).join(', ')\n await tbl.delete(`id IN (${list})`)\n } else if (plan.filter) {\n const rows = await tbl.query().limit(100000).toArray()\n const targets: string[] = rows\n .filter((row: any) => evaluateFilter(plan.filter!, this.#parseMeta(row.metadata)))\n .map((row: any) => row.id as string)\n if (targets.length > 0) {\n const list = targets.map((id) => lit(id)).join(', ')\n await tbl.delete(`id IN (${list})`)\n }\n } else {\n await tbl.delete('true')\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"lancedb.cjs","names":["#opts","#db","#ensure","#dims","#parseMeta","#project"],"sources":["../../../src/batteries/vector/lancedb/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/lancedb\n *\n * Embedded LanceDB adapter (no server — file-based, like sqlite_vec/duckdb). Each collection\n * is a Lance table with an explicit Arrow schema (`id` Utf8, `vec` FixedSizeList<Float32>,\n * `document` Utf8, `metadata` Utf8-JSON). KNN uses `table.search(vector).distanceType(...)`;\n * metadata is filtered with the neutral filter tree's JS reference evaluator for exact\n * cross-adapter parity. Upsert is a merge-insert on `id`.\n *\n * Drivers: `@lancedb/lancedb` + `apache-arrow` (prebuilt binary; no native compile).\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 LanceDBVectorStoreOptions extends BaseVectorStoreOptions {\n /** Connection and authentication parameters for the backend. */\n connection: { uri: string }\n}\n\nconst getLanceDB = async () => {\n try {\n return await import('@lancedb/lancedb')\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['@lancedb/lancedb'])\n }\n}\n\nconst getArrow = async () => {\n try {\n return await import('apache-arrow')\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['apache-arrow'])\n }\n}\n\nconst lanceMetric = (metric: DistanceMetric): string =>\n metric === 'euclidean' ? 'l2' : metric === 'dot' ? 'dot' : 'cosine'\n\n// LanceDB SQL string literal (single-quoted, escape embedded quotes).\nconst lit = (value: string): string => `'${value.replace(/'/g, \"''\")}'`\n\nexport class LanceDBVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: true,\n rawSql: false,\n builtInEncoding: false,\n // Embedded 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 #db: any | null = null\n #dims: Map<string, number> = new Map()\n\n get #opts(): LanceDBVectorStoreOptions {\n return this.options as LanceDBVectorStoreOptions\n }\n\n /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */\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.#db) return\n const lancedb = await getLanceDB()\n const uri = this.#opts.connection?.uri\n if (!uri) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([\n 'LanceDB requires connection.uri (a directory path)',\n ])\n }\n try {\n this.#db = await lancedb.connect(uri)\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n\n async close(): Promise<void> {\n this.#db = null\n }\n\n async #ensure(): Promise<any> {\n if (!this.#db) await this.connect()\n return this.#db!\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n const db = await this.#ensure()\n this.#dims.set(spec.collection, spec.vector.dimensions)\n if (ifNotExists && (await this.hasCollection(spec.collection))) return\n const arrow = await getArrow()\n const schema = new arrow.Schema([\n new arrow.Field('id', new arrow.Utf8(), false),\n new arrow.Field(\n 'vec',\n new arrow.FixedSizeList(\n spec.vector.dimensions,\n new arrow.Field('item', new arrow.Float32(), true)\n ),\n false\n ),\n new arrow.Field('document', new arrow.Utf8(), true),\n new arrow.Field('metadata', new arrow.Utf8(), true),\n ])\n try {\n await db.createEmptyTable(spec.collection, schema, { mode: 'overwrite' })\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 db = await this.#ensure()\n if (ifExists && !(await this.hasCollection(collection))) return\n try {\n await db.dropTable(collection)\n this.#dims.delete(collection)\n } catch (err) {\n const msg = String(err)\n if (ifExists && msg.includes('not found')) return\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', msg])\n }\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n const db = await this.#ensure()\n try {\n const names = await db.tableNames()\n return names.includes(collection)\n } catch {\n return false\n }\n }\n\n async renameCollection(_from: string, _to: string): Promise<void> {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'lancedb'])\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const db = await this.#ensure()\n const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection)\n try {\n const rows: any[] = []\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 rows.push({\n id: r.id,\n vec: vector,\n document: r.document ?? '',\n metadata: r.metadata ? JSON.stringify(r.metadata) : '{}',\n })\n }\n const tbl = await db.openTable(plan.collection)\n // Merge-insert on id = upsert (update matched, insert unmatched).\n await tbl.mergeInsert('id').whenMatchedUpdateAll().whenNotMatchedInsertAll().execute(rows)\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 db = await this.#ensure()\n const metric = this.#opts.metric ?? 'cosine'\n let queryVector: number[] | undefined\n let tbl: any\n try {\n tbl = await db.openTable(plan.collection)\n } catch (err) {\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\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 rows = await tbl\n .query()\n .where(`id = ${lit(plan.near.id)}`)\n .limit(1)\n .toArray()\n if (rows.length === 0) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = Array.from(rows[0].vec as ArrayLike<number>)\n }\n }\n\n const offset = plan.offset ?? 0\n try {\n if (queryVector) {\n // Over-fetch then JS-filter for exact cross-adapter filter semantics.\n const k = plan.filter ? 1000 : plan.topK + offset\n const rows = await tbl\n .search(queryVector)\n .distanceType(lanceMetric(metric))\n .limit(k)\n .toArray()\n const filtered = plan.filter\n ? rows.filter((row: any) => evaluateFilter(plan.filter!, this.#parseMeta(row.metadata)))\n : rows\n return filtered\n .slice(offset, offset + plan.topK)\n .map((row: any) => this.#project(row, plan, metric, true))\n } else {\n const rows = await tbl\n .query()\n .limit(plan.filter ? 100000 : plan.topK + offset)\n .toArray()\n const filtered = plan.filter\n ? rows.filter((row: any) => evaluateFilter(plan.filter!, this.#parseMeta(row.metadata)))\n : rows\n return filtered\n .slice(offset, offset + plan.topK)\n .map((row: any) => 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 && row.vec) out.vector = Array.from(row.vec as ArrayLike<number>)\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._distance !== undefined && row._distance !== null) {\n out.score = normalizeScore(Number(row._distance), metric as DistanceMetric, 'distance')\n }\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const db = await this.#ensure()\n try {\n const tbl = await db.openTable(plan.collection)\n if (plan.ids && plan.ids.length > 0) {\n const list = plan.ids.map((id) => lit(id)).join(', ')\n await tbl.delete(`id IN (${list})`)\n } else if (plan.filter) {\n const rows = await tbl.query().limit(100000).toArray()\n const targets: string[] = rows\n .filter((row: any) => evaluateFilter(plan.filter!, this.#parseMeta(row.metadata)))\n .map((row: any) => row.id as string)\n if (targets.length > 0) {\n const list = targets.map((id) => lit(id)).join(', ')\n await tbl.delete(`id IN (${list})`)\n }\n } else {\n await tbl.delete('true')\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { s as isInstanceOf } from "../../tool_registry-D1pSSlsd.mjs";
1
+ import { s as isInstanceOf } from "../../tool_registry-791Vrjtf.mjs";
2
2
  import "../../guards.mjs";
3
3
  import { evaluateFilter } from "./filters.mjs";
4
4
  import { normalizeScore } from "./helpers.mjs";
@@ -51,6 +51,7 @@ var LanceDBVectorStore = class extends BaseVectorStore {
51
51
  get #opts() {
52
52
  return this.options;
53
53
  }
54
+ /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
54
55
  static isAvailable() {
55
56
  return typeof process !== "undefined";
56
57
  }
@@ -1 +1 @@
1
- {"version":3,"file":"lancedb.mjs","names":["#opts","#db","#ensure","#dims","#parseMeta","#project"],"sources":["../../../src/batteries/vector/lancedb/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/lancedb\n *\n * Embedded LanceDB adapter (no server — file-based, like sqlite_vec/duckdb). Each collection\n * is a Lance table with an explicit Arrow schema (`id` Utf8, `vec` FixedSizeList<Float32>,\n * `document` Utf8, `metadata` Utf8-JSON). KNN uses `table.search(vector).distanceType(...)`;\n * metadata is filtered with the neutral filter tree's JS reference evaluator for exact\n * cross-adapter parity. Upsert is a merge-insert on `id`.\n *\n * Drivers: `@lancedb/lancedb` + `apache-arrow` (prebuilt binary; no native compile).\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 LanceDBVectorStoreOptions extends BaseVectorStoreOptions {\n connection: { uri: string }\n}\n\nconst getLanceDB = async () => {\n try {\n return await import('@lancedb/lancedb')\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['@lancedb/lancedb'])\n }\n}\n\nconst getArrow = async () => {\n try {\n return await import('apache-arrow')\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['apache-arrow'])\n }\n}\n\nconst lanceMetric = (metric: DistanceMetric): string =>\n metric === 'euclidean' ? 'l2' : metric === 'dot' ? 'dot' : 'cosine'\n\n// LanceDB SQL string literal (single-quoted, escape embedded quotes).\nconst lit = (value: string): string => `'${value.replace(/'/g, \"''\")}'`\n\nexport class LanceDBVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: true,\n rawSql: false,\n builtInEncoding: false,\n // Embedded 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 #db: any | null = null\n #dims: Map<string, number> = new Map()\n\n get #opts(): LanceDBVectorStoreOptions {\n return this.options as LanceDBVectorStoreOptions\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.#db) return\n const lancedb = await getLanceDB()\n const uri = this.#opts.connection?.uri\n if (!uri) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([\n 'LanceDB requires connection.uri (a directory path)',\n ])\n }\n try {\n this.#db = await lancedb.connect(uri)\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n\n async close(): Promise<void> {\n this.#db = null\n }\n\n async #ensure(): Promise<any> {\n if (!this.#db) await this.connect()\n return this.#db!\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n const db = await this.#ensure()\n this.#dims.set(spec.collection, spec.vector.dimensions)\n if (ifNotExists && (await this.hasCollection(spec.collection))) return\n const arrow = await getArrow()\n const schema = new arrow.Schema([\n new arrow.Field('id', new arrow.Utf8(), false),\n new arrow.Field(\n 'vec',\n new arrow.FixedSizeList(\n spec.vector.dimensions,\n new arrow.Field('item', new arrow.Float32(), true)\n ),\n false\n ),\n new arrow.Field('document', new arrow.Utf8(), true),\n new arrow.Field('metadata', new arrow.Utf8(), true),\n ])\n try {\n await db.createEmptyTable(spec.collection, schema, { mode: 'overwrite' })\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 db = await this.#ensure()\n if (ifExists && !(await this.hasCollection(collection))) return\n try {\n await db.dropTable(collection)\n this.#dims.delete(collection)\n } catch (err) {\n const msg = String(err)\n if (ifExists && msg.includes('not found')) return\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', msg])\n }\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n const db = await this.#ensure()\n try {\n const names = await db.tableNames()\n return names.includes(collection)\n } catch {\n return false\n }\n }\n\n async renameCollection(_from: string, _to: string): Promise<void> {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'lancedb'])\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const db = await this.#ensure()\n const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection)\n try {\n const rows: any[] = []\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 rows.push({\n id: r.id,\n vec: vector,\n document: r.document ?? '',\n metadata: r.metadata ? JSON.stringify(r.metadata) : '{}',\n })\n }\n const tbl = await db.openTable(plan.collection)\n // Merge-insert on id = upsert (update matched, insert unmatched).\n await tbl.mergeInsert('id').whenMatchedUpdateAll().whenNotMatchedInsertAll().execute(rows)\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 db = await this.#ensure()\n const metric = this.#opts.metric ?? 'cosine'\n let queryVector: number[] | undefined\n let tbl: any\n try {\n tbl = await db.openTable(plan.collection)\n } catch (err) {\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\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 rows = await tbl\n .query()\n .where(`id = ${lit(plan.near.id)}`)\n .limit(1)\n .toArray()\n if (rows.length === 0) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = Array.from(rows[0].vec as ArrayLike<number>)\n }\n }\n\n const offset = plan.offset ?? 0\n try {\n if (queryVector) {\n // Over-fetch then JS-filter for exact cross-adapter filter semantics.\n const k = plan.filter ? 1000 : plan.topK + offset\n const rows = await tbl\n .search(queryVector)\n .distanceType(lanceMetric(metric))\n .limit(k)\n .toArray()\n const filtered = plan.filter\n ? rows.filter((row: any) => evaluateFilter(plan.filter!, this.#parseMeta(row.metadata)))\n : rows\n return filtered\n .slice(offset, offset + plan.topK)\n .map((row: any) => this.#project(row, plan, metric, true))\n } else {\n const rows = await tbl\n .query()\n .limit(plan.filter ? 100000 : plan.topK + offset)\n .toArray()\n const filtered = plan.filter\n ? rows.filter((row: any) => evaluateFilter(plan.filter!, this.#parseMeta(row.metadata)))\n : rows\n return filtered\n .slice(offset, offset + plan.topK)\n .map((row: any) => 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 && row.vec) out.vector = Array.from(row.vec as ArrayLike<number>)\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._distance !== undefined && row._distance !== null) {\n out.score = normalizeScore(Number(row._distance), metric as DistanceMetric, 'distance')\n }\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const db = await this.#ensure()\n try {\n const tbl = await db.openTable(plan.collection)\n if (plan.ids && plan.ids.length > 0) {\n const list = plan.ids.map((id) => lit(id)).join(', ')\n await tbl.delete(`id IN (${list})`)\n } else if (plan.filter) {\n const rows = await tbl.query().limit(100000).toArray()\n const targets: string[] = rows\n .filter((row: any) => evaluateFilter(plan.filter!, this.#parseMeta(row.metadata)))\n .map((row: any) => row.id as string)\n if (targets.length > 0) {\n const list = targets.map((id) => lit(id)).join(', ')\n await tbl.delete(`id IN (${list})`)\n }\n } else {\n await tbl.delete('true')\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"lancedb.mjs","names":["#opts","#db","#ensure","#dims","#parseMeta","#project"],"sources":["../../../src/batteries/vector/lancedb/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/lancedb\n *\n * Embedded LanceDB adapter (no server — file-based, like sqlite_vec/duckdb). Each collection\n * is a Lance table with an explicit Arrow schema (`id` Utf8, `vec` FixedSizeList<Float32>,\n * `document` Utf8, `metadata` Utf8-JSON). KNN uses `table.search(vector).distanceType(...)`;\n * metadata is filtered with the neutral filter tree's JS reference evaluator for exact\n * cross-adapter parity. Upsert is a merge-insert on `id`.\n *\n * Drivers: `@lancedb/lancedb` + `apache-arrow` (prebuilt binary; no native compile).\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 LanceDBVectorStoreOptions extends BaseVectorStoreOptions {\n /** Connection and authentication parameters for the backend. */\n connection: { uri: string }\n}\n\nconst getLanceDB = async () => {\n try {\n return await import('@lancedb/lancedb')\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['@lancedb/lancedb'])\n }\n}\n\nconst getArrow = async () => {\n try {\n return await import('apache-arrow')\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['apache-arrow'])\n }\n}\n\nconst lanceMetric = (metric: DistanceMetric): string =>\n metric === 'euclidean' ? 'l2' : metric === 'dot' ? 'dot' : 'cosine'\n\n// LanceDB SQL string literal (single-quoted, escape embedded quotes).\nconst lit = (value: string): string => `'${value.replace(/'/g, \"''\")}'`\n\nexport class LanceDBVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: true,\n rawSql: false,\n builtInEncoding: false,\n // Embedded 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 #db: any | null = null\n #dims: Map<string, number> = new Map()\n\n get #opts(): LanceDBVectorStoreOptions {\n return this.options as LanceDBVectorStoreOptions\n }\n\n /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */\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.#db) return\n const lancedb = await getLanceDB()\n const uri = this.#opts.connection?.uri\n if (!uri) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([\n 'LanceDB requires connection.uri (a directory path)',\n ])\n }\n try {\n this.#db = await lancedb.connect(uri)\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n\n async close(): Promise<void> {\n this.#db = null\n }\n\n async #ensure(): Promise<any> {\n if (!this.#db) await this.connect()\n return this.#db!\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n const db = await this.#ensure()\n this.#dims.set(spec.collection, spec.vector.dimensions)\n if (ifNotExists && (await this.hasCollection(spec.collection))) return\n const arrow = await getArrow()\n const schema = new arrow.Schema([\n new arrow.Field('id', new arrow.Utf8(), false),\n new arrow.Field(\n 'vec',\n new arrow.FixedSizeList(\n spec.vector.dimensions,\n new arrow.Field('item', new arrow.Float32(), true)\n ),\n false\n ),\n new arrow.Field('document', new arrow.Utf8(), true),\n new arrow.Field('metadata', new arrow.Utf8(), true),\n ])\n try {\n await db.createEmptyTable(spec.collection, schema, { mode: 'overwrite' })\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 db = await this.#ensure()\n if (ifExists && !(await this.hasCollection(collection))) return\n try {\n await db.dropTable(collection)\n this.#dims.delete(collection)\n } catch (err) {\n const msg = String(err)\n if (ifExists && msg.includes('not found')) return\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', msg])\n }\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n const db = await this.#ensure()\n try {\n const names = await db.tableNames()\n return names.includes(collection)\n } catch {\n return false\n }\n }\n\n async renameCollection(_from: string, _to: string): Promise<void> {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'lancedb'])\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const db = await this.#ensure()\n const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection)\n try {\n const rows: any[] = []\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 rows.push({\n id: r.id,\n vec: vector,\n document: r.document ?? '',\n metadata: r.metadata ? JSON.stringify(r.metadata) : '{}',\n })\n }\n const tbl = await db.openTable(plan.collection)\n // Merge-insert on id = upsert (update matched, insert unmatched).\n await tbl.mergeInsert('id').whenMatchedUpdateAll().whenNotMatchedInsertAll().execute(rows)\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 db = await this.#ensure()\n const metric = this.#opts.metric ?? 'cosine'\n let queryVector: number[] | undefined\n let tbl: any\n try {\n tbl = await db.openTable(plan.collection)\n } catch (err) {\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\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 rows = await tbl\n .query()\n .where(`id = ${lit(plan.near.id)}`)\n .limit(1)\n .toArray()\n if (rows.length === 0) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = Array.from(rows[0].vec as ArrayLike<number>)\n }\n }\n\n const offset = plan.offset ?? 0\n try {\n if (queryVector) {\n // Over-fetch then JS-filter for exact cross-adapter filter semantics.\n const k = plan.filter ? 1000 : plan.topK + offset\n const rows = await tbl\n .search(queryVector)\n .distanceType(lanceMetric(metric))\n .limit(k)\n .toArray()\n const filtered = plan.filter\n ? rows.filter((row: any) => evaluateFilter(plan.filter!, this.#parseMeta(row.metadata)))\n : rows\n return filtered\n .slice(offset, offset + plan.topK)\n .map((row: any) => this.#project(row, plan, metric, true))\n } else {\n const rows = await tbl\n .query()\n .limit(plan.filter ? 100000 : plan.topK + offset)\n .toArray()\n const filtered = plan.filter\n ? rows.filter((row: any) => evaluateFilter(plan.filter!, this.#parseMeta(row.metadata)))\n : rows\n return filtered\n .slice(offset, offset + plan.topK)\n .map((row: any) => 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 && row.vec) out.vector = Array.from(row.vec as ArrayLike<number>)\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._distance !== undefined && row._distance !== null) {\n out.score = normalizeScore(Number(row._distance), metric as DistanceMetric, 'distance')\n }\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const db = await this.#ensure()\n try {\n const tbl = await db.openTable(plan.collection)\n if (plan.ids && plan.ids.length > 0) {\n const list = plan.ids.map((id) => lit(id)).join(', ')\n await tbl.delete(`id IN (${list})`)\n } else if (plan.filter) {\n const rows = await tbl.query().limit(100000).toArray()\n const targets: string[] = rows\n .filter((row: any) => evaluateFilter(plan.filter!, this.#parseMeta(row.metadata)))\n .map((row: any) => row.id as string)\n if (targets.length > 0) {\n const list = targets.map((id) => lit(id)).join(', ')\n await tbl.delete(`id IN (${list})`)\n }\n } else {\n await tbl.delete('true')\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n"],"mappings":"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"}
@@ -13,6 +13,7 @@ import { BaseVectorStore } from "../contract";
13
13
  import type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from "../plan";
14
14
  import type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from "../types";
15
15
  export interface MariaDBVectorStoreOptions extends BaseVectorStoreOptions {
16
+ /** Connection and authentication parameters for the backend. */
16
17
  connection?: {
17
18
  host?: string;
18
19
  port?: number;
@@ -25,6 +26,7 @@ export interface MariaDBVectorStoreOptions extends BaseVectorStoreOptions {
25
26
  export declare class MariaDBVectorStore extends BaseVectorStore {
26
27
  #private;
27
28
  readonly capabilities: VectorStoreCapabilities;
29
+ /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
28
30
  static isAvailable(): boolean;
29
31
  isAvailable(): boolean;
30
32
  connect(): Promise<void>;
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  require("../../chunk-Ble4zEEl.js");
3
- const require_tool_registry = require("../../tool_registry-DYUYqXvo.js");
3
+ const require_tool_registry = require("../../tool_registry-CKJPze3j.js");
4
4
  require("../../guards.cjs");
5
5
  const require_batteries_vector_filters = require("./filters.cjs");
6
6
  const require_batteries_vector_helpers = require("./helpers.cjs");
@@ -47,6 +47,7 @@ var MariaDBVectorStore = class extends require_batteries_vector_contract.BaseVec
47
47
  get #opts() {
48
48
  return this.options;
49
49
  }
50
+ /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
50
51
  static isAvailable() {
51
52
  return typeof process !== "undefined";
52
53
  }
@@ -1 +1 @@
1
- {"version":3,"file":"mariadb.cjs","names":["#opts","#pool","#ensure","#query","#dims","#parseVec","#parseMeta","#project"],"sources":["../../../src/batteries/vector/mariadb/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/mariadb\n *\n * MariaDB adapter (native VECTOR type, 11.7+). Vectors live in a `VECTOR(N)` column written\n * with `VEC_FromText('[...]')` and read with `VEC_ToText(vec)`; KNN uses\n * `VEC_DISTANCE_COSINE` / `VEC_DISTANCE_EUCLIDEAN` ordered ascending. Metadata is a `JSON`\n * column. The neutral filter tree is evaluated with the JS reference evaluator for exact\n * cross-adapter parity. Each collection is a table.\n *\n * Driver: `mariadb` (pure JS, pooled).\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 MariaDBVectorStoreOptions extends BaseVectorStoreOptions {\n connection?: {\n host?: string\n port?: number\n user?: string\n password?: string\n database?: string\n connectionLimit?: number\n }\n}\n\nconst getMariaDB = async () => {\n try {\n const mod = await import('mariadb')\n return (mod as any).default ?? mod\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['mariadb'])\n }\n}\n\nconst distanceFn = (metric: DistanceMetric): string =>\n metric === 'euclidean' ? 'VEC_DISTANCE_EUCLIDEAN' : 'VEC_DISTANCE_COSINE'\n\n// Backtick-quoted identifier.\nconst ident = (name: string): string => '`' + name.replace(/`/g, '``') + '`'\n\nexport class MariaDBVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: true,\n namedVectors: false,\n rename: true,\n rawSql: true,\n builtInEncoding: false,\n // SQL backend, synchronous on commit: a write is visible on resolve. The option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n\n #pool: any | null = null\n #dims: Map<string, number> = new Map()\n\n get #opts(): MariaDBVectorStoreOptions {\n return this.options as MariaDBVectorStoreOptions\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.#pool) return\n const mariadb = await getMariaDB()\n const c = this.#opts.connection || {}\n try {\n this.#pool = mariadb.createPool({\n host: c.host ?? 'localhost',\n port: c.port ?? 3306,\n user: c.user ?? 'root',\n password: c.password,\n database: c.database,\n connectionLimit: c.connectionLimit ?? 4,\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.#pool) {\n await this.#pool.end()\n this.#pool = null\n }\n }\n\n async #ensure(): Promise<any> {\n if (!this.#pool) await this.connect()\n return this.#pool!\n }\n\n async #query(sql: string, params?: unknown[]): Promise<any[]> {\n const pool = await this.#ensure()\n return await pool.query(sql, params)\n }\n\n // VEC_ToText returns \"[1,0,0]\"; parse into number[].\n #parseVec(text: unknown): number[] {\n if (typeof text !== 'string') return []\n try {\n return JSON.parse(text) as number[]\n } catch {\n return []\n }\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 async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n this.#dims.set(spec.collection, spec.vector.dimensions)\n const ine = ifNotExists ? 'IF NOT EXISTS ' : ''\n try {\n await this.#query(\n `CREATE TABLE ${ine}${ident(spec.collection)} (` +\n `id VARCHAR(255) PRIMARY KEY, ` +\n `vec VECTOR(${spec.vector.dimensions}) NOT NULL, ` +\n `document TEXT, ` +\n `metadata JSON, ` +\n `VECTOR INDEX (vec))`\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 ie = ifExists ? 'IF EXISTS ' : ''\n try {\n await this.#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.#query(\n `SELECT 1 FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = ?`,\n [collection]\n )\n return rows.length > 0\n }\n\n async renameCollection(from: string, to: string): Promise<void> {\n try {\n await this.#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 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 vecText = `[${vector.join(',')}]`\n const meta = r.metadata ? JSON.stringify(r.metadata) : '{}'\n await this.#query(\n `INSERT INTO ${ident(plan.collection)} (id, vec, document, metadata) ` +\n `VALUES (?, VEC_FromText(?), ?, ?) ` +\n `ON DUPLICATE KEY UPDATE vec = VEC_FromText(?), document = ?, metadata = ?`,\n [r.id, vecText, r.document ?? '', meta, vecText, r.document ?? '', meta]\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.#query(\n `SELECT VEC_ToText(vec) vec FROM ${ident(plan.collection)} WHERE id = ?`,\n [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.#parseVec(rows[0].vec)\n }\n }\n\n const offset = plan.offset ?? 0\n try {\n if (queryVector) {\n const fn = distanceFn(metric)\n const vecText = `[${queryVector.join(',')}]`\n const rows = await this.#query(\n `SELECT id, VEC_ToText(vec) vec, document, metadata, ` +\n `${fn}(vec, VEC_FromText(?)) __dist FROM ${ident(plan.collection)}`,\n [vecText]\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.#query(\n `SELECT id, VEC_ToText(vec) 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 #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 = this.#parseVec(row.vec)\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 try {\n if (plan.ids && plan.ids.length > 0) {\n const placeholders = plan.ids.map(() => '?').join(', ')\n await this.#query(\n `DELETE FROM ${ident(plan.collection)} WHERE id IN (${placeholders})`,\n plan.ids\n )\n } else if (plan.filter) {\n const rows = await this.#query(`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 placeholders = targets.map(() => '?').join(', ')\n await this.#query(\n `DELETE FROM ${ident(plan.collection)} WHERE id IN (${placeholders})`,\n targets\n )\n }\n } else {\n await this.#query(`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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"}
1
+ {"version":3,"file":"mariadb.cjs","names":["#opts","#pool","#ensure","#query","#dims","#parseVec","#parseMeta","#project"],"sources":["../../../src/batteries/vector/mariadb/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/mariadb\n *\n * MariaDB adapter (native VECTOR type, 11.7+). Vectors live in a `VECTOR(N)` column written\n * with `VEC_FromText('[...]')` and read with `VEC_ToText(vec)`; KNN uses\n * `VEC_DISTANCE_COSINE` / `VEC_DISTANCE_EUCLIDEAN` ordered ascending. Metadata is a `JSON`\n * column. The neutral filter tree is evaluated with the JS reference evaluator for exact\n * cross-adapter parity. Each collection is a table.\n *\n * Driver: `mariadb` (pure JS, pooled).\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 MariaDBVectorStoreOptions extends BaseVectorStoreOptions {\n /** Connection and authentication parameters for the backend. */\n connection?: {\n host?: string\n port?: number\n user?: string\n password?: string\n database?: string\n connectionLimit?: number\n }\n}\n\nconst getMariaDB = async () => {\n try {\n const mod = await import('mariadb')\n return (mod as any).default ?? mod\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['mariadb'])\n }\n}\n\nconst distanceFn = (metric: DistanceMetric): string =>\n metric === 'euclidean' ? 'VEC_DISTANCE_EUCLIDEAN' : 'VEC_DISTANCE_COSINE'\n\n// Backtick-quoted identifier.\nconst ident = (name: string): string => '`' + name.replace(/`/g, '``') + '`'\n\nexport class MariaDBVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: true,\n namedVectors: false,\n rename: true,\n rawSql: true,\n builtInEncoding: false,\n // SQL backend, synchronous on commit: a write is visible on resolve. The option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n\n #pool: any | null = null\n #dims: Map<string, number> = new Map()\n\n get #opts(): MariaDBVectorStoreOptions {\n return this.options as MariaDBVectorStoreOptions\n }\n\n /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */\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.#pool) return\n const mariadb = await getMariaDB()\n const c = this.#opts.connection || {}\n try {\n this.#pool = mariadb.createPool({\n host: c.host ?? 'localhost',\n port: c.port ?? 3306,\n user: c.user ?? 'root',\n password: c.password,\n database: c.database,\n connectionLimit: c.connectionLimit ?? 4,\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.#pool) {\n await this.#pool.end()\n this.#pool = null\n }\n }\n\n async #ensure(): Promise<any> {\n if (!this.#pool) await this.connect()\n return this.#pool!\n }\n\n async #query(sql: string, params?: unknown[]): Promise<any[]> {\n const pool = await this.#ensure()\n return await pool.query(sql, params)\n }\n\n // VEC_ToText returns \"[1,0,0]\"; parse into number[].\n #parseVec(text: unknown): number[] {\n if (typeof text !== 'string') return []\n try {\n return JSON.parse(text) as number[]\n } catch {\n return []\n }\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 async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n this.#dims.set(spec.collection, spec.vector.dimensions)\n const ine = ifNotExists ? 'IF NOT EXISTS ' : ''\n try {\n await this.#query(\n `CREATE TABLE ${ine}${ident(spec.collection)} (` +\n `id VARCHAR(255) PRIMARY KEY, ` +\n `vec VECTOR(${spec.vector.dimensions}) NOT NULL, ` +\n `document TEXT, ` +\n `metadata JSON, ` +\n `VECTOR INDEX (vec))`\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 ie = ifExists ? 'IF EXISTS ' : ''\n try {\n await this.#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.#query(\n `SELECT 1 FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = ?`,\n [collection]\n )\n return rows.length > 0\n }\n\n async renameCollection(from: string, to: string): Promise<void> {\n try {\n await this.#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 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 vecText = `[${vector.join(',')}]`\n const meta = r.metadata ? JSON.stringify(r.metadata) : '{}'\n await this.#query(\n `INSERT INTO ${ident(plan.collection)} (id, vec, document, metadata) ` +\n `VALUES (?, VEC_FromText(?), ?, ?) ` +\n `ON DUPLICATE KEY UPDATE vec = VEC_FromText(?), document = ?, metadata = ?`,\n [r.id, vecText, r.document ?? '', meta, vecText, r.document ?? '', meta]\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.#query(\n `SELECT VEC_ToText(vec) vec FROM ${ident(plan.collection)} WHERE id = ?`,\n [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.#parseVec(rows[0].vec)\n }\n }\n\n const offset = plan.offset ?? 0\n try {\n if (queryVector) {\n const fn = distanceFn(metric)\n const vecText = `[${queryVector.join(',')}]`\n const rows = await this.#query(\n `SELECT id, VEC_ToText(vec) vec, document, metadata, ` +\n `${fn}(vec, VEC_FromText(?)) __dist FROM ${ident(plan.collection)}`,\n [vecText]\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.#query(\n `SELECT id, VEC_ToText(vec) 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 #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 = this.#parseVec(row.vec)\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 try {\n if (plan.ids && plan.ids.length > 0) {\n const placeholders = plan.ids.map(() => '?').join(', ')\n await this.#query(\n `DELETE FROM ${ident(plan.collection)} WHERE id IN (${placeholders})`,\n plan.ids\n )\n } else if (plan.filter) {\n const rows = await this.#query(`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 placeholders = targets.map(() => '?').join(', ')\n await this.#query(\n `DELETE FROM ${ident(plan.collection)} WHERE id IN (${placeholders})`,\n targets\n )\n }\n } else {\n await this.#query(`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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"}
@@ -1,4 +1,4 @@
1
- import { s as isInstanceOf } from "../../tool_registry-D1pSSlsd.mjs";
1
+ import { s as isInstanceOf } from "../../tool_registry-791Vrjtf.mjs";
2
2
  import "../../guards.mjs";
3
3
  import { evaluateFilter } from "./filters.mjs";
4
4
  import { normalizeScore } from "./helpers.mjs";
@@ -45,6 +45,7 @@ var MariaDBVectorStore = class extends BaseVectorStore {
45
45
  get #opts() {
46
46
  return this.options;
47
47
  }
48
+ /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
48
49
  static isAvailable() {
49
50
  return typeof process !== "undefined";
50
51
  }