@nhtio/adk 1.20260607.2 → 1.20260609.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (521) hide show
  1. package/CHANGELOG.md +230 -0
  2. package/batteries/embeddings/openai/adapter.cjs +1 -1
  3. package/batteries/embeddings/openai/adapter.mjs +1 -1
  4. package/batteries/embeddings/openai/exceptions.cjs +1 -1
  5. package/batteries/embeddings/openai/exceptions.mjs +1 -1
  6. package/batteries/embeddings/openai/types.d.ts +7 -0
  7. package/batteries/embeddings/webllm/adapter.cjs +1 -1
  8. package/batteries/embeddings/webllm/adapter.mjs +1 -1
  9. package/batteries/embeddings/webllm/exceptions.cjs +1 -1
  10. package/batteries/embeddings/webllm/exceptions.mjs +1 -1
  11. package/batteries/llm/chat_common/helpers.d.ts +165 -0
  12. package/batteries/llm/chat_common/types.d.ts +309 -0
  13. package/batteries/llm/index.d.ts +5 -0
  14. package/batteries/llm/ollama/adapter.cjs +736 -0
  15. package/batteries/llm/ollama/adapter.cjs.map +1 -0
  16. package/batteries/llm/ollama/adapter.d.ts +64 -0
  17. package/batteries/llm/ollama/adapter.mjs +734 -0
  18. package/batteries/llm/ollama/adapter.mjs.map +1 -0
  19. package/batteries/llm/ollama/exceptions.cjs +105 -0
  20. package/batteries/llm/ollama/exceptions.cjs.map +1 -0
  21. package/batteries/llm/ollama/exceptions.d.ts +112 -0
  22. package/batteries/llm/ollama/exceptions.mjs +96 -0
  23. package/batteries/llm/ollama/exceptions.mjs.map +1 -0
  24. package/batteries/llm/ollama/helpers.cjs +487 -0
  25. package/batteries/llm/ollama/helpers.cjs.map +1 -0
  26. package/batteries/llm/ollama/helpers.d.ts +158 -0
  27. package/batteries/llm/ollama/helpers.mjs +450 -0
  28. package/batteries/llm/ollama/helpers.mjs.map +1 -0
  29. package/batteries/llm/ollama/index.d.ts +29 -0
  30. package/batteries/llm/ollama/types.cjs +2 -0
  31. package/batteries/llm/ollama/types.d.ts +334 -0
  32. package/batteries/llm/ollama/types.mjs +0 -0
  33. package/batteries/llm/ollama/validation.cjs +130 -0
  34. package/batteries/llm/ollama/validation.cjs.map +1 -0
  35. package/batteries/llm/ollama/validation.d.ts +31 -0
  36. package/batteries/llm/ollama/validation.mjs +127 -0
  37. package/batteries/llm/ollama/validation.mjs.map +1 -0
  38. package/batteries/llm/ollama.cjs +54 -0
  39. package/batteries/llm/ollama.mjs +6 -0
  40. package/batteries/llm/openai_chat_completions/adapter.cjs +36 -19
  41. package/batteries/llm/openai_chat_completions/adapter.cjs.map +1 -1
  42. package/batteries/llm/openai_chat_completions/adapter.mjs +23 -6
  43. package/batteries/llm/openai_chat_completions/adapter.mjs.map +1 -1
  44. package/batteries/llm/openai_chat_completions/exceptions.cjs +1 -1
  45. package/batteries/llm/openai_chat_completions/exceptions.mjs +1 -1
  46. package/batteries/llm/openai_chat_completions/helpers.cjs +80 -320
  47. package/batteries/llm/openai_chat_completions/helpers.cjs.map +1 -1
  48. package/batteries/llm/openai_chat_completions/helpers.d.ts +68 -144
  49. package/batteries/llm/openai_chat_completions/helpers.mjs +40 -280
  50. package/batteries/llm/openai_chat_completions/helpers.mjs.map +1 -1
  51. package/batteries/llm/openai_chat_completions/types.d.ts +273 -181
  52. package/batteries/llm/openai_chat_completions/validation.cjs +2 -2
  53. package/batteries/llm/openai_chat_completions/validation.cjs.map +1 -1
  54. package/batteries/llm/openai_chat_completions/validation.mjs +2 -2
  55. package/batteries/llm/openai_chat_completions/validation.mjs.map +1 -1
  56. package/batteries/llm/openai_chat_completions.cjs +29 -28
  57. package/batteries/llm/openai_chat_completions.mjs +2 -1
  58. package/batteries/llm/webllm_chat_completions/adapter.cjs +38 -19
  59. package/batteries/llm/webllm_chat_completions/adapter.cjs.map +1 -1
  60. package/batteries/llm/webllm_chat_completions/adapter.d.ts +18 -0
  61. package/batteries/llm/webllm_chat_completions/adapter.mjs +25 -6
  62. package/batteries/llm/webllm_chat_completions/adapter.mjs.map +1 -1
  63. package/batteries/llm/webllm_chat_completions/exceptions.cjs +1 -1
  64. package/batteries/llm/webllm_chat_completions/exceptions.mjs +1 -1
  65. package/batteries/llm/webllm_chat_completions/helpers.cjs +29 -28
  66. package/batteries/llm/webllm_chat_completions/helpers.mjs +2 -1
  67. package/batteries/llm/webllm_chat_completions/types.d.ts +21 -0
  68. package/batteries/llm/webllm_chat_completions/validation.cjs +13 -1
  69. package/batteries/llm/webllm_chat_completions/validation.cjs.map +1 -1
  70. package/batteries/llm/webllm_chat_completions/validation.d.ts +12 -0
  71. package/batteries/llm/webllm_chat_completions/validation.mjs +13 -1
  72. package/batteries/llm/webllm_chat_completions/validation.mjs.map +1 -1
  73. package/batteries/llm/webllm_chat_completions.cjs +29 -28
  74. package/batteries/llm/webllm_chat_completions.mjs +2 -1
  75. package/batteries/llm.cjs +44 -28
  76. package/batteries/llm.mjs +9 -4
  77. package/batteries/storage/flydrive.cjs +1 -1
  78. package/batteries/storage/flydrive.mjs +1 -1
  79. package/batteries/storage/in_memory/index.d.ts +1 -1
  80. package/batteries/storage/in_memory.cjs +2 -2
  81. package/batteries/storage/in_memory.cjs.map +1 -1
  82. package/batteries/storage/in_memory.mjs +2 -2
  83. package/batteries/storage/in_memory.mjs.map +1 -1
  84. package/batteries/storage/opfs/index.d.ts +19 -0
  85. package/batteries/storage/opfs.cjs +1 -1
  86. package/batteries/storage/opfs.cjs.map +1 -1
  87. package/batteries/storage/opfs.mjs +1 -1
  88. package/batteries/storage/opfs.mjs.map +1 -1
  89. package/batteries/tools/_shared/index.d.ts +121 -0
  90. package/batteries/tools/_shared.cjs +157 -0
  91. package/batteries/tools/_shared.cjs.map +1 -0
  92. package/batteries/tools/_shared.mjs +149 -0
  93. package/batteries/tools/_shared.mjs.map +1 -0
  94. package/batteries/tools/color.cjs +3 -2
  95. package/batteries/tools/color.cjs.map +1 -1
  96. package/batteries/tools/color.mjs +3 -2
  97. package/batteries/tools/color.mjs.map +1 -1
  98. package/batteries/tools/comparison.cjs +4 -3
  99. package/batteries/tools/comparison.cjs.map +1 -1
  100. package/batteries/tools/comparison.mjs +4 -3
  101. package/batteries/tools/comparison.mjs.map +1 -1
  102. package/batteries/tools/data_structure.cjs +30 -10
  103. package/batteries/tools/data_structure.cjs.map +1 -1
  104. package/batteries/tools/data_structure.mjs +30 -10
  105. package/batteries/tools/data_structure.mjs.map +1 -1
  106. package/batteries/tools/datetime_extended.cjs +5 -10
  107. package/batteries/tools/datetime_extended.cjs.map +1 -1
  108. package/batteries/tools/datetime_extended.mjs +5 -10
  109. package/batteries/tools/datetime_extended.mjs.map +1 -1
  110. package/batteries/tools/datetime_math.cjs +2 -2
  111. package/batteries/tools/datetime_math.mjs +2 -2
  112. package/batteries/tools/encoding.cjs +13 -4
  113. package/batteries/tools/encoding.cjs.map +1 -1
  114. package/batteries/tools/encoding.mjs +13 -4
  115. package/batteries/tools/encoding.mjs.map +1 -1
  116. package/batteries/tools/formatting.cjs +4 -4
  117. package/batteries/tools/formatting.cjs.map +1 -1
  118. package/batteries/tools/formatting.mjs +4 -4
  119. package/batteries/tools/formatting.mjs.map +1 -1
  120. package/batteries/tools/geo_basics.cjs +2 -2
  121. package/batteries/tools/geo_basics.mjs +2 -2
  122. package/batteries/tools/index.d.ts +3 -0
  123. package/batteries/tools/math.cjs +10 -8
  124. package/batteries/tools/math.cjs.map +1 -1
  125. package/batteries/tools/math.mjs +10 -8
  126. package/batteries/tools/math.mjs.map +1 -1
  127. package/batteries/tools/memory.cjs +5 -5
  128. package/batteries/tools/memory.mjs +5 -5
  129. package/batteries/tools/parsing.cjs +9 -5
  130. package/batteries/tools/parsing.cjs.map +1 -1
  131. package/batteries/tools/parsing.mjs +9 -5
  132. package/batteries/tools/parsing.mjs.map +1 -1
  133. package/batteries/tools/retrievables.cjs +4 -4
  134. package/batteries/tools/retrievables.mjs +4 -4
  135. package/batteries/tools/scrapper/exceptions.d.ts +21 -0
  136. package/batteries/tools/scrapper/index.d.ts +172 -0
  137. package/batteries/tools/scrapper/shared.d.ts +139 -0
  138. package/batteries/tools/scrapper.cjs +8 -0
  139. package/batteries/tools/scrapper.mjs +2 -0
  140. package/batteries/tools/searxng/exceptions.d.ts +21 -0
  141. package/batteries/tools/searxng/index.d.ts +177 -0
  142. package/batteries/tools/searxng.cjs +6 -0
  143. package/batteries/tools/searxng.mjs +2 -0
  144. package/batteries/tools/standing_instructions.cjs +4 -4
  145. package/batteries/tools/standing_instructions.mjs +4 -4
  146. package/batteries/tools/statistics.cjs +54 -43
  147. package/batteries/tools/statistics.cjs.map +1 -1
  148. package/batteries/tools/statistics.mjs +54 -43
  149. package/batteries/tools/statistics.mjs.map +1 -1
  150. package/batteries/tools/string_processing.cjs +5 -5
  151. package/batteries/tools/string_processing.cjs.map +1 -1
  152. package/batteries/tools/string_processing.mjs +5 -5
  153. package/batteries/tools/string_processing.mjs.map +1 -1
  154. package/batteries/tools/structured_data.cjs +8 -13
  155. package/batteries/tools/structured_data.cjs.map +1 -1
  156. package/batteries/tools/structured_data.mjs +8 -13
  157. package/batteries/tools/structured_data.mjs.map +1 -1
  158. package/batteries/tools/text_analysis.cjs +3 -3
  159. package/batteries/tools/text_analysis.mjs +3 -3
  160. package/batteries/tools/text_comparison.cjs +2 -2
  161. package/batteries/tools/text_comparison.mjs +2 -2
  162. package/batteries/tools/time.cjs +2 -2
  163. package/batteries/tools/time.mjs +2 -2
  164. package/batteries/tools/unit_conversion.cjs +10 -8
  165. package/batteries/tools/unit_conversion.cjs.map +1 -1
  166. package/batteries/tools/unit_conversion.mjs +10 -8
  167. package/batteries/tools/unit_conversion.mjs.map +1 -1
  168. package/batteries/tools/web_retrieval/index.d.ts +186 -0
  169. package/batteries/tools/web_retrieval.cjs +206 -0
  170. package/batteries/tools/web_retrieval.cjs.map +1 -0
  171. package/batteries/tools/web_retrieval.mjs +201 -0
  172. package/batteries/tools/web_retrieval.mjs.map +1 -0
  173. package/batteries/tools.cjs +15 -0
  174. package/batteries/tools.mjs +4 -1
  175. package/batteries/vector/arangodb/index.d.ts +2 -0
  176. package/batteries/vector/arangodb.cjs +2 -1
  177. package/batteries/vector/arangodb.cjs.map +1 -1
  178. package/batteries/vector/arangodb.mjs +2 -1
  179. package/batteries/vector/arangodb.mjs.map +1 -1
  180. package/batteries/vector/builder.cjs +31 -0
  181. package/batteries/vector/builder.cjs.map +1 -1
  182. package/batteries/vector/builder.d.ts +58 -0
  183. package/batteries/vector/builder.mjs +31 -0
  184. package/batteries/vector/builder.mjs.map +1 -1
  185. package/batteries/vector/chroma/index.d.ts +4 -0
  186. package/batteries/vector/chroma.cjs +3 -0
  187. package/batteries/vector/chroma.cjs.map +1 -1
  188. package/batteries/vector/chroma.mjs +3 -0
  189. package/batteries/vector/chroma.mjs.map +1 -1
  190. package/batteries/vector/clickhouse/index.d.ts +2 -0
  191. package/batteries/vector/clickhouse.cjs +2 -1
  192. package/batteries/vector/clickhouse.cjs.map +1 -1
  193. package/batteries/vector/clickhouse.mjs +2 -1
  194. package/batteries/vector/clickhouse.mjs.map +1 -1
  195. package/batteries/vector/cloudflare/index.d.ts +2 -0
  196. package/batteries/vector/cloudflare.cjs +2 -1
  197. package/batteries/vector/cloudflare.cjs.map +1 -1
  198. package/batteries/vector/cloudflare.mjs +2 -1
  199. package/batteries/vector/cloudflare.mjs.map +1 -1
  200. package/batteries/vector/conformance/index.d.ts +22 -0
  201. package/batteries/vector/conformance.cjs +22 -0
  202. package/batteries/vector/conformance.cjs.map +1 -1
  203. package/batteries/vector/conformance.mjs +22 -0
  204. package/batteries/vector/conformance.mjs.map +1 -1
  205. package/batteries/vector/contract.cjs +22 -0
  206. package/batteries/vector/contract.cjs.map +1 -1
  207. package/batteries/vector/contract.d.ts +51 -0
  208. package/batteries/vector/contract.mjs +22 -0
  209. package/batteries/vector/contract.mjs.map +1 -1
  210. package/batteries/vector/couchbase/index.d.ts +2 -0
  211. package/batteries/vector/couchbase.cjs +2 -1
  212. package/batteries/vector/couchbase.cjs.map +1 -1
  213. package/batteries/vector/couchbase.mjs +2 -1
  214. package/batteries/vector/couchbase.mjs.map +1 -1
  215. package/batteries/vector/duckdb/index.d.ts +2 -0
  216. package/batteries/vector/duckdb.cjs +2 -1
  217. package/batteries/vector/duckdb.cjs.map +1 -1
  218. package/batteries/vector/duckdb.mjs +2 -1
  219. package/batteries/vector/duckdb.mjs.map +1 -1
  220. package/batteries/vector/elasticsearch/index.d.ts +2 -0
  221. package/batteries/vector/elasticsearch.cjs +2 -1
  222. package/batteries/vector/elasticsearch.cjs.map +1 -1
  223. package/batteries/vector/elasticsearch.mjs +2 -1
  224. package/batteries/vector/elasticsearch.mjs.map +1 -1
  225. package/batteries/vector/exceptions.cjs +1 -1
  226. package/batteries/vector/exceptions.mjs +1 -1
  227. package/batteries/vector/factory.cjs +6 -0
  228. package/batteries/vector/factory.cjs.map +1 -1
  229. package/batteries/vector/factory.d.ts +14 -0
  230. package/batteries/vector/factory.mjs +6 -0
  231. package/batteries/vector/factory.mjs.map +1 -1
  232. package/batteries/vector/filters.cjs +22 -1
  233. package/batteries/vector/filters.cjs.map +1 -1
  234. package/batteries/vector/filters.d.ts +38 -0
  235. package/batteries/vector/filters.mjs +22 -1
  236. package/batteries/vector/filters.mjs.map +1 -1
  237. package/batteries/vector/helpers.cjs +13 -0
  238. package/batteries/vector/helpers.cjs.map +1 -1
  239. package/batteries/vector/helpers.d.ts +14 -0
  240. package/batteries/vector/helpers.mjs +13 -0
  241. package/batteries/vector/helpers.mjs.map +1 -1
  242. package/batteries/vector/hnswlib/index.d.ts +2 -0
  243. package/batteries/vector/hnswlib.cjs +2 -1
  244. package/batteries/vector/hnswlib.cjs.map +1 -1
  245. package/batteries/vector/hnswlib.mjs +2 -1
  246. package/batteries/vector/hnswlib.mjs.map +1 -1
  247. package/batteries/vector/in_memory/index.d.ts +1 -0
  248. package/batteries/vector/in_memory.cjs +1 -0
  249. package/batteries/vector/in_memory.cjs.map +1 -1
  250. package/batteries/vector/in_memory.mjs +1 -0
  251. package/batteries/vector/in_memory.mjs.map +1 -1
  252. package/batteries/vector/lancedb/index.d.ts +2 -0
  253. package/batteries/vector/lancedb.cjs +2 -1
  254. package/batteries/vector/lancedb.cjs.map +1 -1
  255. package/batteries/vector/lancedb.mjs +2 -1
  256. package/batteries/vector/lancedb.mjs.map +1 -1
  257. package/batteries/vector/mariadb/index.d.ts +2 -0
  258. package/batteries/vector/mariadb.cjs +2 -1
  259. package/batteries/vector/mariadb.cjs.map +1 -1
  260. package/batteries/vector/mariadb.mjs +2 -1
  261. package/batteries/vector/mariadb.mjs.map +1 -1
  262. package/batteries/vector/meilisearch/index.d.ts +2 -0
  263. package/batteries/vector/meilisearch.cjs +2 -1
  264. package/batteries/vector/meilisearch.cjs.map +1 -1
  265. package/batteries/vector/meilisearch.mjs +2 -1
  266. package/batteries/vector/meilisearch.mjs.map +1 -1
  267. package/batteries/vector/migrate.cjs +18 -1
  268. package/batteries/vector/migrate.cjs.map +1 -1
  269. package/batteries/vector/migrate.d.ts +31 -0
  270. package/batteries/vector/migrate.mjs +18 -1
  271. package/batteries/vector/migrate.mjs.map +1 -1
  272. package/batteries/vector/milvus/index.d.ts +5 -0
  273. package/batteries/vector/milvus.cjs +4 -0
  274. package/batteries/vector/milvus.cjs.map +1 -1
  275. package/batteries/vector/milvus.mjs +4 -0
  276. package/batteries/vector/milvus.mjs.map +1 -1
  277. package/batteries/vector/mongodb/index.d.ts +2 -0
  278. package/batteries/vector/mongodb.cjs +2 -1
  279. package/batteries/vector/mongodb.cjs.map +1 -1
  280. package/batteries/vector/mongodb.mjs +2 -1
  281. package/batteries/vector/mongodb.mjs.map +1 -1
  282. package/batteries/vector/neo4j/index.d.ts +2 -0
  283. package/batteries/vector/neo4j.cjs +2 -1
  284. package/batteries/vector/neo4j.cjs.map +1 -1
  285. package/batteries/vector/neo4j.mjs +2 -1
  286. package/batteries/vector/neo4j.mjs.map +1 -1
  287. package/batteries/vector/opensearch/index.d.ts +2 -0
  288. package/batteries/vector/opensearch.cjs +2 -1
  289. package/batteries/vector/opensearch.cjs.map +1 -1
  290. package/batteries/vector/opensearch.mjs +2 -1
  291. package/batteries/vector/opensearch.mjs.map +1 -1
  292. package/batteries/vector/oracle23ai/index.d.ts +2 -0
  293. package/batteries/vector/oracle23ai.cjs +2 -1
  294. package/batteries/vector/oracle23ai.cjs.map +1 -1
  295. package/batteries/vector/oracle23ai.mjs +2 -1
  296. package/batteries/vector/oracle23ai.mjs.map +1 -1
  297. package/batteries/vector/orama/index.d.ts +1 -0
  298. package/batteries/vector/orama.cjs +1 -0
  299. package/batteries/vector/orama.cjs.map +1 -1
  300. package/batteries/vector/orama.mjs +1 -0
  301. package/batteries/vector/orama.mjs.map +1 -1
  302. package/batteries/vector/pgvector/index.d.ts +9 -2
  303. package/batteries/vector/pgvector.cjs +4 -0
  304. package/batteries/vector/pgvector.cjs.map +1 -1
  305. package/batteries/vector/pgvector.mjs +4 -0
  306. package/batteries/vector/pgvector.mjs.map +1 -1
  307. package/batteries/vector/pinecone/index.d.ts +5 -0
  308. package/batteries/vector/pinecone.cjs +3 -1
  309. package/batteries/vector/pinecone.cjs.map +1 -1
  310. package/batteries/vector/pinecone.mjs +3 -1
  311. package/batteries/vector/pinecone.mjs.map +1 -1
  312. package/batteries/vector/plan.d.ts +27 -0
  313. package/batteries/vector/qdrant/index.d.ts +5 -0
  314. package/batteries/vector/qdrant.cjs +4 -0
  315. package/batteries/vector/qdrant.cjs.map +1 -1
  316. package/batteries/vector/qdrant.mjs +4 -0
  317. package/batteries/vector/qdrant.mjs.map +1 -1
  318. package/batteries/vector/redis/index.d.ts +2 -0
  319. package/batteries/vector/redis.cjs +2 -1
  320. package/batteries/vector/redis.cjs.map +1 -1
  321. package/batteries/vector/redis.mjs +2 -1
  322. package/batteries/vector/redis.mjs.map +1 -1
  323. package/batteries/vector/retrievable.cjs +9 -1
  324. package/batteries/vector/retrievable.cjs.map +1 -1
  325. package/batteries/vector/retrievable.mjs +9 -1
  326. package/batteries/vector/retrievable.mjs.map +1 -1
  327. package/batteries/vector/retrievable_glue.d.ts +21 -0
  328. package/batteries/vector/s3vectors/index.d.ts +2 -0
  329. package/batteries/vector/s3vectors.cjs +2 -1
  330. package/batteries/vector/s3vectors.cjs.map +1 -1
  331. package/batteries/vector/s3vectors.mjs +2 -1
  332. package/batteries/vector/s3vectors.mjs.map +1 -1
  333. package/batteries/vector/schema.cjs +28 -0
  334. package/batteries/vector/schema.cjs.map +1 -1
  335. package/batteries/vector/schema.d.ts +39 -0
  336. package/batteries/vector/schema.mjs +28 -0
  337. package/batteries/vector/schema.mjs.map +1 -1
  338. package/batteries/vector/solr/index.d.ts +2 -0
  339. package/batteries/vector/solr.cjs +2 -1
  340. package/batteries/vector/solr.cjs.map +1 -1
  341. package/batteries/vector/solr.mjs +2 -1
  342. package/batteries/vector/solr.mjs.map +1 -1
  343. package/batteries/vector/sqlite_vec/index.d.ts +6 -3
  344. package/batteries/vector/sqlite_vec.cjs +2 -0
  345. package/batteries/vector/sqlite_vec.cjs.map +1 -1
  346. package/batteries/vector/sqlite_vec.mjs +2 -0
  347. package/batteries/vector/sqlite_vec.mjs.map +1 -1
  348. package/batteries/vector/surrealdb/index.d.ts +2 -0
  349. package/batteries/vector/surrealdb.cjs +2 -1
  350. package/batteries/vector/surrealdb.cjs.map +1 -1
  351. package/batteries/vector/surrealdb.mjs +2 -1
  352. package/batteries/vector/surrealdb.mjs.map +1 -1
  353. package/batteries/vector/types.d.ts +27 -0
  354. package/batteries/vector/typesense/index.d.ts +2 -0
  355. package/batteries/vector/typesense.cjs +2 -1
  356. package/batteries/vector/typesense.cjs.map +1 -1
  357. package/batteries/vector/typesense.mjs +2 -1
  358. package/batteries/vector/typesense.mjs.map +1 -1
  359. package/batteries/vector/validation.cjs +14 -0
  360. package/batteries/vector/validation.cjs.map +1 -1
  361. package/batteries/vector/validation.d.ts +14 -0
  362. package/batteries/vector/validation.mjs +14 -0
  363. package/batteries/vector/validation.mjs.map +1 -1
  364. package/batteries/vector/vector_store_constructor.cjs +1 -1
  365. package/batteries/vector/vector_store_constructor.cjs.map +1 -1
  366. package/batteries/vector/vector_store_constructor.d.ts +1 -1
  367. package/batteries/vector/vector_store_constructor.mjs +1 -1
  368. package/batteries/vector/vector_store_constructor.mjs.map +1 -1
  369. package/batteries/vector/vespa/index.d.ts +2 -0
  370. package/batteries/vector/vespa.cjs +2 -1
  371. package/batteries/vector/vespa.cjs.map +1 -1
  372. package/batteries/vector/vespa.mjs +2 -1
  373. package/batteries/vector/vespa.mjs.map +1 -1
  374. package/batteries/vector/weaviate/index.d.ts +2 -0
  375. package/batteries/vector/weaviate.cjs +2 -1
  376. package/batteries/vector/weaviate.cjs.map +1 -1
  377. package/batteries/vector/weaviate.mjs +2 -1
  378. package/batteries/vector/weaviate.mjs.map +1 -1
  379. package/batteries.cjs +58 -28
  380. package/batteries.mjs +12 -5
  381. package/{common-BT0nfCi9.mjs → common-DYDUi99O.mjs} +9 -9
  382. package/common-DYDUi99O.mjs.map +1 -0
  383. package/{common-Cj8TaQ9U.js → common-DZl3ADJs.js} +9 -9
  384. package/common-DZl3ADJs.js.map +1 -0
  385. package/common.cjs +7 -7
  386. package/common.mjs +7 -7
  387. package/{dispatch_runner-DPcS7Y_M.mjs → dispatch_runner--ZhdDWRZ.mjs} +27 -5
  388. package/{dispatch_runner-DPcS7Y_M.mjs.map → dispatch_runner--ZhdDWRZ.mjs.map} +1 -1
  389. package/{dispatch_runner-BHBNupqp.js → dispatch_runner-nHDKkxye.js} +27 -5
  390. package/{dispatch_runner-BHBNupqp.js.map → dispatch_runner-nHDKkxye.js.map} +1 -1
  391. package/dispatch_runner.cjs +1 -1
  392. package/dispatch_runner.d.ts +1 -1
  393. package/dispatch_runner.mjs +1 -1
  394. package/eslint/rules/artifact_tool_forbids_artifact_constructor.cjs +1 -0
  395. package/eslint/rules/artifact_tool_forbids_artifact_constructor.cjs.map +1 -1
  396. package/eslint/rules/artifact_tool_forbids_artifact_constructor.d.ts +1 -0
  397. package/eslint/rules/artifact_tool_forbids_artifact_constructor.mjs +1 -0
  398. package/eslint/rules/artifact_tool_forbids_artifact_constructor.mjs.map +1 -1
  399. package/eslint/rules/no_model_in_tool_handler.cjs +1 -0
  400. package/eslint/rules/no_model_in_tool_handler.cjs.map +1 -1
  401. package/eslint/rules/no_model_in_tool_handler.d.ts +1 -0
  402. package/eslint/rules/no_model_in_tool_handler.mjs +1 -0
  403. package/eslint/rules/no_model_in_tool_handler.mjs.map +1 -1
  404. package/eslint/rules/require_validator_any_required.cjs +1 -0
  405. package/eslint/rules/require_validator_any_required.cjs.map +1 -1
  406. package/eslint/rules/require_validator_any_required.d.ts +1 -0
  407. package/eslint/rules/require_validator_any_required.mjs +1 -0
  408. package/eslint/rules/require_validator_any_required.mjs.map +1 -1
  409. package/eslint/rules/thought_payload_requires_replay_tag.cjs +1 -0
  410. package/eslint/rules/thought_payload_requires_replay_tag.cjs.map +1 -1
  411. package/eslint/rules/thought_payload_requires_replay_tag.d.ts +1 -0
  412. package/eslint/rules/thought_payload_requires_replay_tag.mjs +1 -0
  413. package/eslint/rules/thought_payload_requires_replay_tag.mjs.map +1 -1
  414. package/eslint/rules/token_encoding_requires_context_window.cjs +1 -0
  415. package/eslint/rules/token_encoding_requires_context_window.cjs.map +1 -1
  416. package/eslint/rules/token_encoding_requires_context_window.d.ts +1 -0
  417. package/eslint/rules/token_encoding_requires_context_window.mjs +1 -0
  418. package/eslint/rules/token_encoding_requires_context_window.mjs.map +1 -1
  419. package/eslint/rules.cjs +1 -1
  420. package/eslint/rules.mjs +1 -1
  421. package/eslint.cjs +2 -2
  422. package/eslint.mjs +2 -2
  423. package/{exceptions-BeWH2FwP.mjs → exceptions-BDhN0Xzr.mjs} +3 -2
  424. package/exceptions-BDhN0Xzr.mjs.map +1 -0
  425. package/{exceptions-CitH5wZI.js → exceptions-BRXrUKiW.js} +3 -2
  426. package/exceptions-BRXrUKiW.js.map +1 -0
  427. package/exceptions.cjs +2 -2
  428. package/exceptions.mjs +2 -2
  429. package/factories.cjs +1 -1
  430. package/factories.mjs +1 -1
  431. package/forge.cjs +4 -4
  432. package/forge.d.ts +1 -1
  433. package/forge.mjs +4 -4
  434. package/guards.cjs +9 -9
  435. package/guards.mjs +9 -9
  436. package/helpers-DSTFxTiC.js +497 -0
  437. package/helpers-DSTFxTiC.js.map +1 -0
  438. package/helpers-xhrQbMAG.mjs +306 -0
  439. package/helpers-xhrQbMAG.mjs.map +1 -0
  440. package/index.cjs +12 -12
  441. package/index.mjs +12 -12
  442. package/lib/classes/base_exception.d.ts +1 -0
  443. package/lib/classes/media.d.ts +10 -0
  444. package/lib/classes/retrievable.d.ts +1 -1
  445. package/lib/classes/spooled_json_artifact.d.ts +1 -1
  446. package/lib/classes/spooled_markdown_artifact.d.ts +1 -0
  447. package/lib/classes/tokenizable.d.ts +3 -0
  448. package/lib/classes/tool.d.ts +8 -0
  449. package/lib/classes/turn_gate.d.ts +6 -0
  450. package/lib/dispatch_runner.d.ts +4 -32
  451. package/lib/helpers/bignum.cjs +82 -0
  452. package/lib/helpers/bignum.cjs.map +1 -0
  453. package/lib/helpers/bignum.d.ts +52 -0
  454. package/lib/helpers/bignum.mjs +74 -0
  455. package/lib/helpers/bignum.mjs.map +1 -0
  456. package/lib/turn_runner.d.ts +1 -1
  457. package/lib/types/dispatch_runner.d.ts +83 -0
  458. package/lib/utils/exceptions.d.ts +1 -1
  459. package/lib/utils/retry.cjs.map +1 -1
  460. package/lib/utils/retry.d.ts +2 -0
  461. package/lib/utils/retry.mjs.map +1 -1
  462. package/mcp/adk-docs-corpus.json +1 -1
  463. package/package.json +259 -204
  464. package/{runtime-j92CNi5z.mjs → runtime-Bz5zA8wc.mjs} +2 -2
  465. package/{runtime-j92CNi5z.mjs.map → runtime-Bz5zA8wc.mjs.map} +1 -1
  466. package/{runtime-MFFcJrRv.js → runtime-DslE1aBw.js} +2 -2
  467. package/{runtime-MFFcJrRv.js.map → runtime-DslE1aBw.js.map} +1 -1
  468. package/scrapper-BHM1mCde.mjs +432 -0
  469. package/scrapper-BHM1mCde.mjs.map +1 -0
  470. package/scrapper-BeweWurk.js +462 -0
  471. package/scrapper-BeweWurk.js.map +1 -0
  472. package/searxng-BJFulNcK.mjs +247 -0
  473. package/searxng-BJFulNcK.mjs.map +1 -0
  474. package/searxng-B_D--V5q.js +265 -0
  475. package/searxng-B_D--V5q.js.map +1 -0
  476. package/skills/adk-assembly/SKILL.md +2 -2
  477. package/{spooled_artifact-CHoZgWwI.mjs → spooled_artifact-7eePq7JA.mjs} +5 -5
  478. package/{spooled_artifact-CHoZgWwI.mjs.map → spooled_artifact-7eePq7JA.mjs.map} +1 -1
  479. package/{spooled_artifact-BTq6Nzfy.js → spooled_artifact-DX8LLyUX.js} +5 -5
  480. package/{spooled_artifact-BTq6Nzfy.js.map → spooled_artifact-DX8LLyUX.js.map} +1 -1
  481. package/spooled_artifact.cjs +2 -2
  482. package/spooled_artifact.mjs +2 -2
  483. package/{spooled_markdown_artifact-CALSDxIx.js → spooled_markdown_artifact-ClX72lek.js} +4 -4
  484. package/spooled_markdown_artifact-ClX72lek.js.map +1 -0
  485. package/{spooled_markdown_artifact-Ci5UL7l4.mjs → spooled_markdown_artifact-wkrBF3oX.mjs} +4 -4
  486. package/spooled_markdown_artifact-wkrBF3oX.mjs.map +1 -0
  487. package/{thought-D34QQZZ9.mjs → thought-B_vxAiKU.mjs} +5 -5
  488. package/{thought-D34QQZZ9.mjs.map → thought-B_vxAiKU.mjs.map} +1 -1
  489. package/{thought-BbwhJ1wb.js → thought-DLwpF7MI.js} +5 -5
  490. package/{thought-BbwhJ1wb.js.map → thought-DLwpF7MI.js.map} +1 -1
  491. package/{tool-CVyZkFC7.js → tool-D5WGVIcI.js} +4 -4
  492. package/{tool-CVyZkFC7.js.map → tool-D5WGVIcI.js.map} +1 -1
  493. package/{tool-CMhaDRNd.mjs → tool-wMYMVl60.mjs} +4 -4
  494. package/{tool-CMhaDRNd.mjs.map → tool-wMYMVl60.mjs.map} +1 -1
  495. package/{tool_call-CV5qVNlb.mjs → tool_call-B4-_-vjG.mjs} +5 -5
  496. package/tool_call-B4-_-vjG.mjs.map +1 -0
  497. package/{tool_call-Db68hB7y.js → tool_call-DixVlW40.js} +5 -5
  498. package/tool_call-DixVlW40.js.map +1 -0
  499. package/{tool_registry-D1pSSlsd.mjs → tool_registry-791Vrjtf.mjs} +4 -3
  500. package/tool_registry-791Vrjtf.mjs.map +1 -0
  501. package/{tool_registry-DYUYqXvo.js → tool_registry-CKJPze3j.js} +4 -3
  502. package/tool_registry-CKJPze3j.js.map +1 -0
  503. package/{turn_runner-DqWHNP80.js → turn_runner-HXImLGIn.js} +7 -7
  504. package/turn_runner-HXImLGIn.js.map +1 -0
  505. package/{turn_runner-fg1Wc3dK.mjs → turn_runner-ZyYO-Kti.mjs} +7 -7
  506. package/turn_runner-ZyYO-Kti.mjs.map +1 -0
  507. package/turn_runner.cjs +1 -1
  508. package/turn_runner.mjs +1 -1
  509. package/types.d.ts +1 -1
  510. package/common-BT0nfCi9.mjs.map +0 -1
  511. package/common-Cj8TaQ9U.js.map +0 -1
  512. package/exceptions-BeWH2FwP.mjs.map +0 -1
  513. package/exceptions-CitH5wZI.js.map +0 -1
  514. package/spooled_markdown_artifact-CALSDxIx.js.map +0 -1
  515. package/spooled_markdown_artifact-Ci5UL7l4.mjs.map +0 -1
  516. package/tool_call-CV5qVNlb.mjs.map +0 -1
  517. package/tool_call-Db68hB7y.js.map +0 -1
  518. package/tool_registry-D1pSSlsd.mjs.map +0 -1
  519. package/tool_registry-DYUYqXvo.js.map +0 -1
  520. package/turn_runner-DqWHNP80.js.map +0 -1
  521. package/turn_runner-fg1Wc3dK.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"pinecone.mjs","names":["#waitVisible","#ns","#dims","#index","#settle","#pc","#consistencyMode"],"sources":["../../../src/batteries/vector/pinecone/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/pinecone\n */\n\nimport { normalizeScore } from '../helpers'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { isInstanceOf } from '@nhtio/adk/guards'\nimport { isFilterCondition, isRawFilter, isFilterGroup, evaluateFilter } from '../filters'\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_FILTER_OPERATOR,\n E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n E_VECTOR_STORE_CONNECTION_FAILED,\n E_VECTOR_STORE_CONSISTENCY_TIMEOUT,\n} from '../exceptions'\nimport type { VectorFilter } from '../filters'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type {\n VectorMatch,\n VectorStoreCapabilities,\n BaseVectorStoreOptions,\n VectorMetadata,\n VectorConsistency,\n} from '../types'\n\nexport interface PineconeVectorStoreOptions extends BaseVectorStoreOptions {\n apiKey: string\n index: string\n /**\n * When set, the physical Pinecone namespace becomes `${namespacePrefix}__${collection}`.\n * The logical collection name the builder/base see is unchanged — only the physical\n * namespace string is prefixed. Lets callers (and the test suite) isolate otherwise\n * identically-named collections into distinct, uncontended namespaces. Pinecone\n * namespaces are implicit (born on first upsert), so a fresh prefix costs nothing.\n */\n namespacePrefix?: string\n connection?: { controllerHostUrl?: string }\n}\n\nconst getPineconeClient = async () => {\n try {\n const mod = await import('@pinecone-database/pinecone')\n return mod.Pinecone\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['@pinecone-database/pinecone'])\n }\n}\n\nexport class PineconeVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: false,\n rawSql: false,\n builtInEncoding: false,\n // Pinecone serverless is eventually consistent: the option is honored, and the default\n // is 'strong' so out-of-the-box behavior matches the strongly-consistent adapters.\n consistency: {\n configurable: true,\n default: 'strong',\n modes: ['strong', 'best-effort', 'eventual'],\n },\n }\n #pc: any | null = null\n #index: any | null = null\n #dims: Map<string, number> = new Map()\n\n // Resolve the effective consistency mode for one write, honoring precedence:\n // per-operation override (plan.consistency) > store option > adapter-declared default.\n #consistencyMode(perOp?: VectorConsistency): VectorConsistency {\n return (\n perOp ??\n (this.options as PineconeVectorStoreOptions).consistency ??\n this.capabilities.consistency.default\n )\n }\n\n // Map a logical collection name to its physical Pinecone namespace. Only the physical\n // namespace string is prefixed; #dims and everything the base/builder see stay keyed on\n // the logical name.\n #ns(collection: string): string {\n const prefix = (this.options as PineconeVectorStoreOptions).namespacePrefix\n return prefix ? `${prefix}__${collection}` : collection\n }\n\n // Returns true if visibility was confirmed within the bound, false on timeout.\n // Polls the SAME read paths the adapter reads through downstream:\n // present ids → must appear in BOTH query() matches AND listPaginated()\n // absent ids → must be gone from BOTH listPaginated() AND fetch()\n async #waitVisible(\n ns: any,\n collection: string,\n opts: { present?: string[]; absent?: string[]; probeVector?: number[] }\n ): Promise<boolean> {\n const present = opts.present ?? []\n const absent = opts.absent ?? []\n if (present.length === 0 && absent.length === 0) return true\n const physicalNs = this.#ns(collection)\n const dims = this.#dims.get(collection) ?? 3\n const queryVec = opts.probeVector ?? new Array(dims).fill(0).map((_, i) => (i === 0 ? 1 : 0))\n const deadline = Date.now() + 10_000 // 10s ceiling; freshness is ~seconds\n const topK = Math.max(present.length + absent.length + 5, 10)\n while (true) {\n let presentOk = true\n let absentOk = true\n if (present.length > 0) {\n let listed = new Set<string>()\n try {\n const lr = await this.#index!.listPaginated({ namespace: physicalNs, limit: 100 })\n listed = new Set((lr.vectors ?? []).map((v: any) => v.id))\n } catch {\n listed = new Set()\n }\n let queried = new Set<string>()\n try {\n const qr = await ns.query({ vector: queryVec, topK, includeValues: false })\n queried = new Set((qr.matches ?? []).map((m: any) => m.id))\n } catch {\n queried = new Set()\n }\n presentOk = present.every((id) => listed.has(id) && queried.has(id))\n }\n if (absent.length > 0) {\n let listed = new Set<string>()\n try {\n const lr = await this.#index!.listPaginated({ namespace: physicalNs, limit: 1000 })\n listed = new Set((lr.vectors ?? []).map((v: any) => v.id))\n } catch {\n listed = new Set()\n }\n let fetched: Record<string, unknown> = {}\n try {\n const fr = await ns.fetch({ ids: absent })\n fetched = fr.records ?? {}\n } catch {\n fetched = {}\n }\n absentOk = absent.every((id) => !listed.has(id) && fetched[id] === undefined)\n }\n if (presentOk && absentOk) return true\n if (Date.now() >= deadline) return false\n await new Promise((r) => setTimeout(r, 300))\n }\n }\n\n // Apply the resolved consistency-mode semantics for one write:\n // strong → wait, and THROW E_VECTOR_STORE_CONSISTENCY_TIMEOUT if not confirmed.\n // best-effort → wait up to the bound, then resolve whether or not confirmed (no throw).\n // eventual → no wait at all.\n // `mode` is the effective mode for THIS operation (already resolved from the precedence\n // chain by the caller via #consistencyMode(plan.consistency)).\n async #settle(\n ns: any,\n collection: string,\n opts: { present?: string[]; absent?: string[] },\n what: string,\n mode: VectorConsistency\n ): Promise<void> {\n if (mode === 'eventual') return\n const confirmed = await this.#waitVisible(ns, collection, opts)\n if (!confirmed && mode === 'strong') {\n throw new E_VECTOR_STORE_CONSISTENCY_TIMEOUT([what])\n }\n // best-effort: resolve regardless\n }\n\n static isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n async connect(): Promise<void> {\n if (this.#pc) return\n const Pinecone = await getPineconeClient()\n const opts = this.options as PineconeVectorStoreOptions\n try {\n this.#pc = new Pinecone({ apiKey: opts.apiKey, ...opts.connection })\n this.#index = this.#pc.index(opts.index)\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n async close(): Promise<void> {\n this.#pc = null\n this.#index = null\n }\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n const collection = spec.collection\n if (ifNotExists) {\n if (await this.hasCollection(collection)) return\n }\n if (this.#dims.has(collection)) {\n const existingDim = this.#dims.get(collection)!\n if (existingDim !== spec.vector.dimensions) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED([\n 'createCollection',\n `Collection ${collection} already exists with dimension ${existingDim}`,\n ])\n }\n return\n }\n this.#dims.set(collection, spec.vector.dimensions)\n }\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n if (ifExists) {\n if (!(await this.hasCollection(collection))) return\n } else if (!(await this.hasCollection(collection))) {\n return\n }\n await this.connect()\n const physicalNs = this.#ns(collection)\n const ns = this.#index!.namespace(physicalNs)\n try {\n // Get all IDs via pagination\n let page: any = { next: null }\n const ids: string[] = []\n do {\n const lr = await this.#index!.listPaginated({\n namespace: physicalNs,\n limit: 1000,\n startingToken: page.next,\n })\n if (lr.vectors) ids.push(...lr.vectors.map((v: any) => v.id))\n page.next = lr.pagination?.next\n } while (page.next)\n\n // Delete all found IDs\n if (ids.length > 0) {\n await ns.deleteMany({ ids })\n }\n\n // Settle on absence\n await this.#settle(\n ns,\n collection,\n { absent: ids },\n 'dropCollection ' + collection,\n this.#consistencyMode()\n )\n } catch (err: any) {\n // Re-throw consistency timeout directly (don't swallow)\n if (\n isInstanceOf(err, 'E_VECTOR_STORE_CONSISTENCY_TIMEOUT', E_VECTOR_STORE_CONSISTENCY_TIMEOUT)\n )\n throw 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 async hasCollection(collection: string): Promise<boolean> {\n await this.connect()\n const stats = await this.#index!.describeIndexStats()\n return !!stats.namespaces?.[this.#ns(collection)]\n }\n async renameCollection(_from: string, _to: string): Promise<void> {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'pinecone'])\n }\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n await this.connect()\n const collection = plan.collection\n const ns = this.#index!.namespace(this.#ns(collection))\n const dims = this.#dims.get(collection)\n const vectors: 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 (dims !== undefined && vector.length !== dims) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([dims, vector.length])\n }\n vectors.push({\n id: r.id,\n values: vector,\n metadata: { ...r.metadata, __document: r.document ?? '' },\n })\n }\n try {\n await ns.upsert({ records: vectors })\n // Call settle after upsert to wait for visibility (per-op override > store > default)\n await this.#settle(\n ns,\n collection,\n { present: vectors.map((v) => v.id) },\n 'upsert ' + vectors.length + ' record(s)',\n this.#consistencyMode(plan.consistency)\n )\n } catch (err) {\n if (\n isInstanceOf(err, 'E_VECTOR_STORE_CONSISTENCY_TIMEOUT', E_VECTOR_STORE_CONSISTENCY_TIMEOUT)\n )\n throw err\n throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n }\n }\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n await this.connect()\n const collection = plan.collection\n const physicalNs = this.#ns(collection)\n const ns = this.#index!.namespace(physicalNs)\n const metric = this.options.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 res = await ns.fetch({ ids: [plan.near.id] })\n const record = res.records[plan.near.id]\n if (!record) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = record.values\n }\n }\n const offset = plan.offset ?? 0\n const k = plan.topK + offset\n if (queryVector) {\n const filter = translatePineconeFilter(plan.filter)\n const res = await ns.query({\n vector: queryVector,\n topK: k,\n filter,\n includeMetadata: true,\n includeValues: !!plan.projection.vector,\n })\n const rawMatches = res.matches ?? []\n const sliceMatches = rawMatches.slice(offset)\n const matches: VectorMatch[] = []\n for (const match of sliceMatches) {\n const proj: VectorMatch = {}\n if (plan.projection.id) {\n proj.id = match.id\n }\n if (plan.projection.vector && match.values) {\n proj.vector = match.values\n }\n if (plan.projection.document && match.metadata) {\n proj.document = match.metadata.__document\n }\n if (plan.projection.metadata && match.metadata) {\n const meta: VectorMetadata = {}\n for (const key in match.metadata) {\n if (key !== '__document') {\n meta[key] = match.metadata[key]\n }\n }\n proj.metadata = meta\n }\n if (plan.near) {\n proj.score = normalizeScore(match.score!, metric, 'similarity')\n }\n matches.push(proj)\n }\n return matches\n } else {\n // Filter-scan: Pinecone v7 listPaginated filter is broken, so we get all records\n // and filter client-side. First, get all IDs without filter, then fetch.\n let page: any = { next: null }\n const ids: string[] = []\n do {\n // Get all IDs without filter - Pinecone v7 listPaginated without filter works\n const listRes = await this.#index!.listPaginated({\n limit: 100,\n startingToken: page.next,\n namespace: physicalNs,\n })\n if (listRes.vectors) {\n ids.push(...listRes.vectors.map((v: any) => v.id))\n }\n page.next = listRes.pagination?.next\n } while (page.next)\n if (ids.length === 0) return []\n\n // Fetch all records and filter client-side\n const allRecords: any = {}\n for (let i = 0; i < ids.length; i += 100) {\n const batch = ids.slice(i, i + 100)\n const fetchRes = await ns.fetch({ ids: batch })\n if (fetchRes && fetchRes.records) {\n for (const id in fetchRes.records) {\n allRecords[id] = fetchRes.records[id]\n }\n }\n }\n const matches: VectorMatch[] = []\n for (const id in allRecords) {\n const record = allRecords[id]\n if (record.metadata) {\n const evalMeta: VectorMetadata = {}\n for (const key in record.metadata) {\n if (key !== '__document') {\n evalMeta[key] = record.metadata[key]\n }\n }\n // If no filter, include all records; otherwise evaluate the filter\n if (!plan.filter || evaluateFilter(plan.filter, evalMeta)) {\n const proj: VectorMatch = {}\n if (plan.projection.id) {\n proj.id = id\n }\n if (plan.projection.vector && record.values) {\n proj.vector = record.values\n }\n if (plan.projection.document && record.metadata) {\n proj.document = record.metadata.__document\n }\n if (plan.projection.metadata && record.metadata) {\n const meta: VectorMetadata = {}\n for (const key in record.metadata) {\n if (key !== '__document') {\n meta[key] = record.metadata[key]\n }\n }\n proj.metadata = meta as VectorMetadata\n }\n matches.push(proj)\n }\n }\n }\n return matches.slice(offset, offset + plan.topK)\n }\n }\n async executeDelete(plan: DeletePlan): Promise<void> {\n await this.connect()\n const collection = plan.collection\n const physicalNs = this.#ns(collection)\n const ns = this.#index!.namespace(physicalNs)\n const mode = this.#consistencyMode(plan.consistency)\n try {\n if (plan.ids && plan.ids.length > 0) {\n await ns.deleteMany({ ids: plan.ids })\n // Call settle after delete-by-ids to wait for absence\n await this.#settle(ns, collection, { absent: plan.ids }, 'delete by id', mode)\n } else if (plan.filter) {\n // Pinecone v7 listPaginated filter is broken, and Pinecone doesn't support\n // filtering by record ID. Get all IDs and filter client-side.\n let page: any = { next: null }\n const ids: string[] = []\n do {\n const listRes = await this.#index!.listPaginated({\n limit: 1000,\n startingToken: page.next,\n namespace: physicalNs,\n })\n if (listRes.vectors) {\n ids.push(...listRes.vectors.map((v: any) => v.id))\n }\n page.next = listRes.pagination?.next\n } while (page.next)\n\n // For Pinecone, we can only filter by metadata fields.\n // If the filter is on 'id', filter client-side without metadata.\n // Otherwise, fetch records and filter by metadata.\n const deleteIds: string[] = []\n\n // Check if filter targets 'id' field (Pinecone record ID)\n const filterTargetsId = plan.filter ? isFilterOnId(plan.filter) : false\n\n if (filterTargetsId) {\n // Filter by record ID directly\n for (const id of ids) {\n if (evaluateFilter(plan.filter, { id })) {\n deleteIds.push(id)\n }\n }\n } else {\n // Filter by metadata\n for (const id of ids) {\n const res = await ns.fetch({ ids: [id] })\n const record = res.records[id]\n if (record && record.metadata) {\n const evalMeta: VectorMetadata = {}\n for (const key in record.metadata) {\n if (key !== '__document') {\n evalMeta[key] = record.metadata[key]\n }\n }\n if (evaluateFilter(plan.filter, evalMeta)) {\n deleteIds.push(id)\n }\n }\n }\n }\n\n if (deleteIds.length > 0) {\n await ns.deleteMany({ ids: deleteIds })\n // Call settle after delete-by-filter to wait for absence\n await this.#settle(ns, collection, { absent: deleteIds }, 'delete by filter', mode)\n }\n } else {\n // Delete all via list+deleteMany pattern (no more deleteAll + settleEmpty)\n let page: any = { next: null }\n const allIds: string[] = []\n do {\n const lr = await this.#index!.listPaginated({\n namespace: physicalNs,\n limit: 1000,\n startingToken: page.next,\n })\n if (lr.vectors) allIds.push(...lr.vectors.map((v: any) => v.id))\n page.next = lr.pagination?.next\n } while (page.next)\n\n if (allIds.length > 0) {\n await ns.deleteMany({ ids: allIds })\n }\n // Settle on absence\n await this.#settle(ns, collection, { absent: allIds }, 'delete all', mode)\n }\n } catch (err) {\n // Re-throw consistency timeout directly (don't swallow)\n if (\n isInstanceOf(err, 'E_VECTOR_STORE_CONSISTENCY_TIMEOUT', E_VECTOR_STORE_CONSISTENCY_TIMEOUT)\n )\n throw err\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n\n// Check if a filter targets the 'id' field (Pinecone record ID)\nconst isFilterOnId = (filter?: VectorFilter): boolean => {\n if (!filter) return false\n if (isRawFilter(filter)) {\n return false\n }\n if (isFilterCondition(filter)) {\n return filter.field === 'id'\n }\n if (isFilterGroup(filter)) {\n const { and, or, not } = filter\n if (and && and.length > 0) {\n return and.some((f) => isFilterOnId(f))\n }\n if (or && or.length > 0) {\n return or.some((f) => isFilterOnId(f))\n }\n if (not) {\n return isFilterOnId(not)\n }\n }\n return false\n}\n\nexport const translatePineconeFilter = (\n filter?: VectorFilter\n): Record<string, unknown> | undefined => {\n if (!filter) return undefined\n if (isRawFilter(filter)) {\n if (filter.$dialect === 'pinecone') {\n return filter.$raw as Record<string, unknown>\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['pinecone', String(filter.$dialect)])\n }\n if (isFilterCondition(filter)) {\n const { field, op, value } = filter\n if (value === undefined) {\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['pinecone', op])\n }\n if (op === 'eq') {\n return { [field]: { $eq: value } }\n }\n if (op === 'ne') {\n return { [field]: { $ne: value } }\n }\n if (op === 'gt') {\n return { [field]: { $gt: value } }\n }\n if (op === 'gte') {\n return { [field]: { $gte: value } }\n }\n if (op === 'lt') {\n return { [field]: { $lt: value } }\n }\n if (op === 'lte') {\n return { [field]: { $lte: value } }\n }\n if (op === 'in') {\n return { [field]: { $in: value } }\n }\n if (op === 'nin') {\n return { [field]: { $nin: value } }\n }\n if (op === 'exists') {\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['pinecone', op])\n }\n if (op === 'contains') {\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['pinecone', op])\n }\n return undefined\n }\n if (isFilterGroup(filter)) {\n const { and, or, not } = filter\n if (and) {\n const children = and\n .map((f) => translatePineconeFilter(f) as Record<string, unknown>)\n .filter((c) => c !== undefined)\n if (children.length === 0) return undefined\n if (children.length === 1) return children[0]\n return { $and: children }\n }\n if (or) {\n const children = or\n .map((f) => translatePineconeFilter(f) as Record<string, unknown>)\n .filter((c) => c !== undefined)\n if (children.length === 0) return undefined\n if (children.length === 1) return children[0]\n return { $or: children }\n }\n if (not) {\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['pinecone', 'not'])\n }\n return undefined\n }\n return undefined\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"pinecone.mjs","names":["#waitVisible","#ns","#dims","#index","#settle","#pc","#consistencyMode"],"sources":["../../../src/batteries/vector/pinecone/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/pinecone\n */\n\nimport { normalizeScore } from '../helpers'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { isInstanceOf } from '@nhtio/adk/guards'\nimport { isFilterCondition, isRawFilter, isFilterGroup, evaluateFilter } from '../filters'\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_FILTER_OPERATOR,\n E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n E_VECTOR_STORE_CONNECTION_FAILED,\n E_VECTOR_STORE_CONSISTENCY_TIMEOUT,\n} from '../exceptions'\nimport type { VectorFilter } from '../filters'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type {\n VectorMatch,\n VectorStoreCapabilities,\n BaseVectorStoreOptions,\n VectorMetadata,\n VectorConsistency,\n} from '../types'\n\nexport interface PineconeVectorStoreOptions extends BaseVectorStoreOptions {\n /** Pinecone API key. */\n apiKey: string\n /** Name of the Pinecone index this store operates against. */\n index: string\n /**\n * When set, the physical Pinecone namespace becomes `${namespacePrefix}__${collection}`.\n * The logical collection name the builder/base see is unchanged — only the physical\n * namespace string is prefixed. Lets callers (and the test suite) isolate otherwise\n * identically-named collections into distinct, uncontended namespaces. Pinecone\n * namespaces are implicit (born on first upsert), so a fresh prefix costs nothing.\n */\n namespacePrefix?: string\n /** Connection and authentication parameters for the backend. */\n connection?: { controllerHostUrl?: string }\n}\n\nconst getPineconeClient = async () => {\n try {\n const mod = await import('@pinecone-database/pinecone')\n return mod.Pinecone\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['@pinecone-database/pinecone'])\n }\n}\n\nexport class PineconeVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: false,\n rawSql: false,\n builtInEncoding: false,\n // Pinecone serverless is eventually consistent: the option is honored, and the default\n // is 'strong' so out-of-the-box behavior matches the strongly-consistent adapters.\n consistency: {\n configurable: true,\n default: 'strong',\n modes: ['strong', 'best-effort', 'eventual'],\n },\n }\n #pc: any | null = null\n #index: any | null = null\n #dims: Map<string, number> = new Map()\n\n // Resolve the effective consistency mode for one write, honoring precedence:\n // per-operation override (plan.consistency) > store option > adapter-declared default.\n #consistencyMode(perOp?: VectorConsistency): VectorConsistency {\n return (\n perOp ??\n (this.options as PineconeVectorStoreOptions).consistency ??\n this.capabilities.consistency.default\n )\n }\n\n // Map a logical collection name to its physical Pinecone namespace. Only the physical\n // namespace string is prefixed; #dims and everything the base/builder see stay keyed on\n // the logical name.\n #ns(collection: string): string {\n const prefix = (this.options as PineconeVectorStoreOptions).namespacePrefix\n return prefix ? `${prefix}__${collection}` : collection\n }\n\n // Returns true if visibility was confirmed within the bound, false on timeout.\n // Polls the SAME read paths the adapter reads through downstream:\n // present ids → must appear in BOTH query() matches AND listPaginated()\n // absent ids → must be gone from BOTH listPaginated() AND fetch()\n async #waitVisible(\n ns: any,\n collection: string,\n opts: { present?: string[]; absent?: string[]; probeVector?: number[] }\n ): Promise<boolean> {\n const present = opts.present ?? []\n const absent = opts.absent ?? []\n if (present.length === 0 && absent.length === 0) return true\n const physicalNs = this.#ns(collection)\n const dims = this.#dims.get(collection) ?? 3\n const queryVec = opts.probeVector ?? new Array(dims).fill(0).map((_, i) => (i === 0 ? 1 : 0))\n const deadline = Date.now() + 10_000 // 10s ceiling; freshness is ~seconds\n const topK = Math.max(present.length + absent.length + 5, 10)\n while (true) {\n let presentOk = true\n let absentOk = true\n if (present.length > 0) {\n let listed = new Set<string>()\n try {\n const lr = await this.#index!.listPaginated({ namespace: physicalNs, limit: 100 })\n listed = new Set((lr.vectors ?? []).map((v: any) => v.id))\n } catch {\n listed = new Set()\n }\n let queried = new Set<string>()\n try {\n const qr = await ns.query({ vector: queryVec, topK, includeValues: false })\n queried = new Set((qr.matches ?? []).map((m: any) => m.id))\n } catch {\n queried = new Set()\n }\n presentOk = present.every((id) => listed.has(id) && queried.has(id))\n }\n if (absent.length > 0) {\n let listed = new Set<string>()\n try {\n const lr = await this.#index!.listPaginated({ namespace: physicalNs, limit: 1000 })\n listed = new Set((lr.vectors ?? []).map((v: any) => v.id))\n } catch {\n listed = new Set()\n }\n let fetched: Record<string, unknown> = {}\n try {\n const fr = await ns.fetch({ ids: absent })\n fetched = fr.records ?? {}\n } catch {\n fetched = {}\n }\n absentOk = absent.every((id) => !listed.has(id) && fetched[id] === undefined)\n }\n if (presentOk && absentOk) return true\n if (Date.now() >= deadline) return false\n await new Promise((r) => setTimeout(r, 300))\n }\n }\n\n // Apply the resolved consistency-mode semantics for one write:\n // strong → wait, and THROW E_VECTOR_STORE_CONSISTENCY_TIMEOUT if not confirmed.\n // best-effort → wait up to the bound, then resolve whether or not confirmed (no throw).\n // eventual → no wait at all.\n // `mode` is the effective mode for THIS operation (already resolved from the precedence\n // chain by the caller via #consistencyMode(plan.consistency)).\n async #settle(\n ns: any,\n collection: string,\n opts: { present?: string[]; absent?: string[] },\n what: string,\n mode: VectorConsistency\n ): Promise<void> {\n if (mode === 'eventual') return\n const confirmed = await this.#waitVisible(ns, collection, opts)\n if (!confirmed && mode === 'strong') {\n throw new E_VECTOR_STORE_CONSISTENCY_TIMEOUT([what])\n }\n // best-effort: resolve regardless\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 async connect(): Promise<void> {\n if (this.#pc) return\n const Pinecone = await getPineconeClient()\n const opts = this.options as PineconeVectorStoreOptions\n try {\n this.#pc = new Pinecone({ apiKey: opts.apiKey, ...opts.connection })\n this.#index = this.#pc.index(opts.index)\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n async close(): Promise<void> {\n this.#pc = null\n this.#index = null\n }\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n const collection = spec.collection\n if (ifNotExists) {\n if (await this.hasCollection(collection)) return\n }\n if (this.#dims.has(collection)) {\n const existingDim = this.#dims.get(collection)!\n if (existingDim !== spec.vector.dimensions) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED([\n 'createCollection',\n `Collection ${collection} already exists with dimension ${existingDim}`,\n ])\n }\n return\n }\n this.#dims.set(collection, spec.vector.dimensions)\n }\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n if (ifExists) {\n if (!(await this.hasCollection(collection))) return\n } else if (!(await this.hasCollection(collection))) {\n return\n }\n await this.connect()\n const physicalNs = this.#ns(collection)\n const ns = this.#index!.namespace(physicalNs)\n try {\n // Get all IDs via pagination\n let page: any = { next: null }\n const ids: string[] = []\n do {\n const lr = await this.#index!.listPaginated({\n namespace: physicalNs,\n limit: 1000,\n startingToken: page.next,\n })\n if (lr.vectors) ids.push(...lr.vectors.map((v: any) => v.id))\n page.next = lr.pagination?.next\n } while (page.next)\n\n // Delete all found IDs\n if (ids.length > 0) {\n await ns.deleteMany({ ids })\n }\n\n // Settle on absence\n await this.#settle(\n ns,\n collection,\n { absent: ids },\n 'dropCollection ' + collection,\n this.#consistencyMode()\n )\n } catch (err: any) {\n // Re-throw consistency timeout directly (don't swallow)\n if (\n isInstanceOf(err, 'E_VECTOR_STORE_CONSISTENCY_TIMEOUT', E_VECTOR_STORE_CONSISTENCY_TIMEOUT)\n )\n throw 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 async hasCollection(collection: string): Promise<boolean> {\n await this.connect()\n const stats = await this.#index!.describeIndexStats()\n return !!stats.namespaces?.[this.#ns(collection)]\n }\n async renameCollection(_from: string, _to: string): Promise<void> {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'pinecone'])\n }\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n await this.connect()\n const collection = plan.collection\n const ns = this.#index!.namespace(this.#ns(collection))\n const dims = this.#dims.get(collection)\n const vectors: 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 (dims !== undefined && vector.length !== dims) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([dims, vector.length])\n }\n vectors.push({\n id: r.id,\n values: vector,\n metadata: { ...r.metadata, __document: r.document ?? '' },\n })\n }\n try {\n await ns.upsert({ records: vectors })\n // Call settle after upsert to wait for visibility (per-op override > store > default)\n await this.#settle(\n ns,\n collection,\n { present: vectors.map((v) => v.id) },\n 'upsert ' + vectors.length + ' record(s)',\n this.#consistencyMode(plan.consistency)\n )\n } catch (err) {\n if (\n isInstanceOf(err, 'E_VECTOR_STORE_CONSISTENCY_TIMEOUT', E_VECTOR_STORE_CONSISTENCY_TIMEOUT)\n )\n throw err\n throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n }\n }\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n await this.connect()\n const collection = plan.collection\n const physicalNs = this.#ns(collection)\n const ns = this.#index!.namespace(physicalNs)\n const metric = this.options.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 res = await ns.fetch({ ids: [plan.near.id] })\n const record = res.records[plan.near.id]\n if (!record) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = record.values\n }\n }\n const offset = plan.offset ?? 0\n const k = plan.topK + offset\n if (queryVector) {\n const filter = translatePineconeFilter(plan.filter)\n const res = await ns.query({\n vector: queryVector,\n topK: k,\n filter,\n includeMetadata: true,\n includeValues: !!plan.projection.vector,\n })\n const rawMatches = res.matches ?? []\n const sliceMatches = rawMatches.slice(offset)\n const matches: VectorMatch[] = []\n for (const match of sliceMatches) {\n const proj: VectorMatch = {}\n if (plan.projection.id) {\n proj.id = match.id\n }\n if (plan.projection.vector && match.values) {\n proj.vector = match.values\n }\n if (plan.projection.document && match.metadata) {\n proj.document = match.metadata.__document\n }\n if (plan.projection.metadata && match.metadata) {\n const meta: VectorMetadata = {}\n for (const key in match.metadata) {\n if (key !== '__document') {\n meta[key] = match.metadata[key]\n }\n }\n proj.metadata = meta\n }\n if (plan.near) {\n proj.score = normalizeScore(match.score!, metric, 'similarity')\n }\n matches.push(proj)\n }\n return matches\n } else {\n // Filter-scan: Pinecone v7 listPaginated filter is broken, so we get all records\n // and filter client-side. First, get all IDs without filter, then fetch.\n let page: any = { next: null }\n const ids: string[] = []\n do {\n // Get all IDs without filter - Pinecone v7 listPaginated without filter works\n const listRes = await this.#index!.listPaginated({\n limit: 100,\n startingToken: page.next,\n namespace: physicalNs,\n })\n if (listRes.vectors) {\n ids.push(...listRes.vectors.map((v: any) => v.id))\n }\n page.next = listRes.pagination?.next\n } while (page.next)\n if (ids.length === 0) return []\n\n // Fetch all records and filter client-side\n const allRecords: any = {}\n for (let i = 0; i < ids.length; i += 100) {\n const batch = ids.slice(i, i + 100)\n const fetchRes = await ns.fetch({ ids: batch })\n if (fetchRes && fetchRes.records) {\n for (const id in fetchRes.records) {\n allRecords[id] = fetchRes.records[id]\n }\n }\n }\n const matches: VectorMatch[] = []\n for (const id in allRecords) {\n const record = allRecords[id]\n if (record.metadata) {\n const evalMeta: VectorMetadata = {}\n for (const key in record.metadata) {\n if (key !== '__document') {\n evalMeta[key] = record.metadata[key]\n }\n }\n // If no filter, include all records; otherwise evaluate the filter\n if (!plan.filter || evaluateFilter(plan.filter, evalMeta)) {\n const proj: VectorMatch = {}\n if (plan.projection.id) {\n proj.id = id\n }\n if (plan.projection.vector && record.values) {\n proj.vector = record.values\n }\n if (plan.projection.document && record.metadata) {\n proj.document = record.metadata.__document\n }\n if (plan.projection.metadata && record.metadata) {\n const meta: VectorMetadata = {}\n for (const key in record.metadata) {\n if (key !== '__document') {\n meta[key] = record.metadata[key]\n }\n }\n proj.metadata = meta as VectorMetadata\n }\n matches.push(proj)\n }\n }\n }\n return matches.slice(offset, offset + plan.topK)\n }\n }\n async executeDelete(plan: DeletePlan): Promise<void> {\n await this.connect()\n const collection = plan.collection\n const physicalNs = this.#ns(collection)\n const ns = this.#index!.namespace(physicalNs)\n const mode = this.#consistencyMode(plan.consistency)\n try {\n if (plan.ids && plan.ids.length > 0) {\n await ns.deleteMany({ ids: plan.ids })\n // Call settle after delete-by-ids to wait for absence\n await this.#settle(ns, collection, { absent: plan.ids }, 'delete by id', mode)\n } else if (plan.filter) {\n // Pinecone v7 listPaginated filter is broken, and Pinecone doesn't support\n // filtering by record ID. Get all IDs and filter client-side.\n let page: any = { next: null }\n const ids: string[] = []\n do {\n const listRes = await this.#index!.listPaginated({\n limit: 1000,\n startingToken: page.next,\n namespace: physicalNs,\n })\n if (listRes.vectors) {\n ids.push(...listRes.vectors.map((v: any) => v.id))\n }\n page.next = listRes.pagination?.next\n } while (page.next)\n\n // For Pinecone, we can only filter by metadata fields.\n // If the filter is on 'id', filter client-side without metadata.\n // Otherwise, fetch records and filter by metadata.\n const deleteIds: string[] = []\n\n // Check if filter targets 'id' field (Pinecone record ID)\n const filterTargetsId = plan.filter ? isFilterOnId(plan.filter) : false\n\n if (filterTargetsId) {\n // Filter by record ID directly\n for (const id of ids) {\n if (evaluateFilter(plan.filter, { id })) {\n deleteIds.push(id)\n }\n }\n } else {\n // Filter by metadata\n for (const id of ids) {\n const res = await ns.fetch({ ids: [id] })\n const record = res.records[id]\n if (record && record.metadata) {\n const evalMeta: VectorMetadata = {}\n for (const key in record.metadata) {\n if (key !== '__document') {\n evalMeta[key] = record.metadata[key]\n }\n }\n if (evaluateFilter(plan.filter, evalMeta)) {\n deleteIds.push(id)\n }\n }\n }\n }\n\n if (deleteIds.length > 0) {\n await ns.deleteMany({ ids: deleteIds })\n // Call settle after delete-by-filter to wait for absence\n await this.#settle(ns, collection, { absent: deleteIds }, 'delete by filter', mode)\n }\n } else {\n // Delete all via list+deleteMany pattern (no more deleteAll + settleEmpty)\n let page: any = { next: null }\n const allIds: string[] = []\n do {\n const lr = await this.#index!.listPaginated({\n namespace: physicalNs,\n limit: 1000,\n startingToken: page.next,\n })\n if (lr.vectors) allIds.push(...lr.vectors.map((v: any) => v.id))\n page.next = lr.pagination?.next\n } while (page.next)\n\n if (allIds.length > 0) {\n await ns.deleteMany({ ids: allIds })\n }\n // Settle on absence\n await this.#settle(ns, collection, { absent: allIds }, 'delete all', mode)\n }\n } catch (err) {\n // Re-throw consistency timeout directly (don't swallow)\n if (\n isInstanceOf(err, 'E_VECTOR_STORE_CONSISTENCY_TIMEOUT', E_VECTOR_STORE_CONSISTENCY_TIMEOUT)\n )\n throw err\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n\n// Check if a filter targets the 'id' field (Pinecone record ID)\nconst isFilterOnId = (filter?: VectorFilter): boolean => {\n if (!filter) return false\n if (isRawFilter(filter)) {\n return false\n }\n if (isFilterCondition(filter)) {\n return filter.field === 'id'\n }\n if (isFilterGroup(filter)) {\n const { and, or, not } = filter\n if (and && and.length > 0) {\n return and.some((f) => isFilterOnId(f))\n }\n if (or && or.length > 0) {\n return or.some((f) => isFilterOnId(f))\n }\n if (not) {\n return isFilterOnId(not)\n }\n }\n return false\n}\n\n/** Translate a neutral {@link VectorFilter} into a Pinecone metadata filter object. */\nexport const translatePineconeFilter = (\n filter?: VectorFilter\n): Record<string, unknown> | undefined => {\n if (!filter) return undefined\n if (isRawFilter(filter)) {\n if (filter.$dialect === 'pinecone') {\n return filter.$raw as Record<string, unknown>\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['pinecone', String(filter.$dialect)])\n }\n if (isFilterCondition(filter)) {\n const { field, op, value } = filter\n if (value === undefined) {\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['pinecone', op])\n }\n if (op === 'eq') {\n return { [field]: { $eq: value } }\n }\n if (op === 'ne') {\n return { [field]: { $ne: value } }\n }\n if (op === 'gt') {\n return { [field]: { $gt: value } }\n }\n if (op === 'gte') {\n return { [field]: { $gte: value } }\n }\n if (op === 'lt') {\n return { [field]: { $lt: value } }\n }\n if (op === 'lte') {\n return { [field]: { $lte: value } }\n }\n if (op === 'in') {\n return { [field]: { $in: value } }\n }\n if (op === 'nin') {\n return { [field]: { $nin: value } }\n }\n if (op === 'exists') {\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['pinecone', op])\n }\n if (op === 'contains') {\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['pinecone', op])\n }\n return undefined\n }\n if (isFilterGroup(filter)) {\n const { and, or, not } = filter\n if (and) {\n const children = and\n .map((f) => translatePineconeFilter(f) as Record<string, unknown>)\n .filter((c) => c !== undefined)\n if (children.length === 0) return undefined\n if (children.length === 1) return children[0]\n return { $and: children }\n }\n if (or) {\n const children = or\n .map((f) => translatePineconeFilter(f) as Record<string, unknown>)\n .filter((c) => c !== undefined)\n if (children.length === 0) return undefined\n if (children.length === 1) return children[0]\n return { $or: children }\n }\n if (not) {\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['pinecone', 'not'])\n }\n return undefined\n }\n return undefined\n}\n"],"mappings":"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"}
@@ -11,19 +11,26 @@ import type { VectorFilter } from "./filters";
11
11
  import type { VectorRecord, DistanceMetric, VectorConsistency } from "./types";
12
12
  /** Normalized projection from .select(); REQUIRED on reads — every column opt-in, id included. */
13
13
  export interface Projection {
14
+ /** Whether to return each match's id. */
14
15
  id: boolean;
16
+ /** Whether to return the stored vector (optionally renamed); `false` to omit. */
15
17
  vector: false | {
16
18
  name?: string;
17
19
  };
20
+ /** Whether to return the document body (optionally from a named field); `false` to omit. */
18
21
  document: false | {
19
22
  field?: string;
20
23
  };
24
+ /** Whether to return metadata (optionally a subset of fields); `false` to omit. */
21
25
  metadata: false | {
22
26
  fields?: string[];
23
27
  };
24
28
  }
29
+ /** A compiled nearest-neighbour search operation, consumed by an adapter's `executeSearch`. */
25
30
  export interface SearchPlan {
31
+ /** Collection to search. */
26
32
  collection: string;
33
+ /** The nearest-neighbour anchor: a client vector, server-embedded text, or an existing record id. */
27
34
  near?: {
28
35
  vector: number[];
29
36
  } | {
@@ -31,35 +38,55 @@ export interface SearchPlan {
31
38
  } | {
32
39
  id: string;
33
40
  };
41
+ /** Optional metadata filter applied alongside the vector search. */
34
42
  filter?: VectorFilter;
43
+ /** Maximum number of matches to return. */
35
44
  topK: number;
45
+ /** Number of leading matches to skip. */
36
46
  offset?: number;
47
+ /** Which fields each match projects. */
37
48
  projection: Projection;
38
49
  }
50
+ /** A compiled insert-or-replace operation, consumed by an adapter's `executeUpsert`. */
39
51
  export interface UpsertPlan {
52
+ /** Collection to write into. */
40
53
  collection: string;
54
+ /** Records to insert or replace. */
41
55
  records: VectorRecord[];
42
56
  /** Per-operation read-after-write override from `.consistency()`; absent = use store/adapter default. */
43
57
  consistency?: VectorConsistency;
44
58
  }
59
+ /** A compiled delete operation, consumed by an adapter's `executeDelete`. */
45
60
  export interface DeletePlan {
61
+ /** Collection to delete from. */
46
62
  collection: string;
63
+ /** Ids to delete (the fast path); mutually informative with `filter`. */
47
64
  ids?: string[];
65
+ /** Filter selecting the records to delete when `ids` is not used. */
48
66
  filter?: VectorFilter;
49
67
  /** Per-operation read-after-write override from `.consistency()`; absent = use store/adapter default. */
50
68
  consistency?: VectorConsistency;
51
69
  }
70
+ /** Declaration of a single metadata field in a {@link CollectionSpec}. */
52
71
  export interface CollectionFieldSpec {
72
+ /** Field name. */
53
73
  name: string;
74
+ /** Field's scalar type. */
54
75
  type: 'string' | 'integer' | 'number' | 'boolean' | 'json';
76
+ /** Whether the backend should index the field for filtering. */
55
77
  index?: boolean;
78
+ /** Whether the field accepts null/absent values. */
56
79
  nullable?: boolean;
57
80
  }
81
+ /** A compiled collection definition, consumed by an adapter's `createCollection`. */
58
82
  export interface CollectionSpec {
83
+ /** Name of the collection to create. */
59
84
  collection: string;
85
+ /** The vector column's dimensionality and distance metric. */
60
86
  vector: {
61
87
  dimensions: number;
62
88
  metric: DistanceMetric;
63
89
  };
90
+ /** The metadata fields the collection carries. */
64
91
  fields: CollectionFieldSpec[];
65
92
  }
@@ -5,8 +5,10 @@ import { BaseVectorStore } from "../contract";
5
5
  import type { VectorFilter } from "../filters";
6
6
  import type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from "../plan";
7
7
  import type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from "../types";
8
+ /** Translate a neutral {@link VectorFilter} into a Qdrant filter object. */
8
9
  export declare const translateQdrantFilter: (filter?: VectorFilter) => Record<string, unknown> | undefined;
9
10
  export interface QdrantVectorStoreOptions extends BaseVectorStoreOptions {
11
+ /** Connection and authentication parameters for the backend. */
10
12
  connection?: {
11
13
  url?: string;
12
14
  host?: string;
@@ -18,6 +20,7 @@ export interface QdrantVectorStoreOptions extends BaseVectorStoreOptions {
18
20
  export declare class QdrantVectorStore extends BaseVectorStore {
19
21
  #private;
20
22
  readonly capabilities: VectorStoreCapabilities;
23
+ /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
21
24
  static isAvailable(): boolean;
22
25
  isAvailable(): boolean;
23
26
  connect(): Promise<void>;
@@ -29,6 +32,8 @@ export declare class QdrantVectorStore extends BaseVectorStore {
29
32
  executeUpsert(plan: UpsertPlan): Promise<void>;
30
33
  executeSearch(plan: SearchPlan): Promise<VectorMatch[]>;
31
34
  executeDelete(plan: DeletePlan): Promise<void>;
35
+ /** Project a raw Qdrant hit into a {@link VectorMatch} per the requested projection, normalizing its score. */
32
36
  projectHit(hit: any, projection: any, metric: string): VectorMatch;
37
+ /** Instance wrapper over the module-level {@link translateQdrantFilter}. */
33
38
  translateQdrantFilter(filter?: VectorFilter): Record<string, unknown> | undefined;
34
39
  }
@@ -9,6 +9,7 @@ const require_batteries_vector_validation = require("./validation.cjs");
9
9
  /**
10
10
  * @module @nhtio/adk/batteries/vector/qdrant
11
11
  */
12
+ /** Translate a neutral {@link VectorFilter} into a Qdrant filter object. */
12
13
  var translateQdrantFilter = (filter) => {
13
14
  if (!filter) return void 0;
14
15
  if (require_batteries_vector_filters.isRawFilter(filter)) {
@@ -117,6 +118,7 @@ var QdrantVectorStore = class extends require_batteries_vector_contract.BaseVect
117
118
  get #opts() {
118
119
  return this.options;
119
120
  }
121
+ /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
120
122
  static isAvailable() {
121
123
  return typeof process !== "undefined";
122
124
  }
@@ -261,6 +263,7 @@ var QdrantVectorStore = class extends require_batteries_vector_contract.BaseVect
261
263
  throw new require_batteries_vector_exceptions.E_VECTOR_STORE_DELETE_FAILED([String(err)]);
262
264
  }
263
265
  }
266
+ /** Project a raw Qdrant hit into a {@link VectorMatch} per the requested projection, normalizing its score. */
264
267
  projectHit(hit, projection, metric) {
265
268
  const out = {};
266
269
  const payload = hit.payload || {};
@@ -275,6 +278,7 @@ var QdrantVectorStore = class extends require_batteries_vector_contract.BaseVect
275
278
  if (projection.score !== false && "score" in hit) out.score = require_batteries_vector_helpers.normalizeScore(hit.score, metric, metric === "euclidean" ? "distance" : "similarity");
276
279
  return out;
277
280
  }
281
+ /** Instance wrapper over the module-level {@link translateQdrantFilter}. */
278
282
  translateQdrantFilter(filter) {
279
283
  return translateQdrantFilter(filter);
280
284
  }
@@ -1 +1 @@
1
- {"version":3,"file":"qdrant.cjs","names":["#opts","#client"],"sources":["../../../src/batteries/vector/qdrant/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/qdrant\n */\n\nimport { normalizeScore } from '../helpers'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { isFilterCondition, isRawFilter, isFilterGroup } from '../filters'\nimport {\n E_VECTOR_STORE_DRIVER_UNAVAILABLE,\n E_VECTOR_STORE_COLLECTION_FAILED,\n E_VECTOR_STORE_UPSERT_FAILED,\n E_VECTOR_STORE_SEARCH_FAILED,\n E_VECTOR_STORE_DELETE_FAILED,\n E_VECTOR_STORE_DIMENSION_MISMATCH,\n E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR,\n E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n} from '../exceptions'\nimport type { VectorFilter } from '../filters'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from '../types'\n\nexport const translateQdrantFilter = (\n filter?: VectorFilter\n): Record<string, unknown> | undefined => {\n if (!filter) return undefined\n if (isRawFilter(filter)) {\n if (filter.$dialect === 'qdrant') {\n return filter.$raw as Record<string, unknown>\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['qdrant', String(filter.$dialect)])\n }\n if (isFilterCondition(filter)) {\n const { field, op, value } = filter\n if (value === undefined) {\n if (op === 'exists') {\n return { must_not: [{ is_empty: { key: field } }] }\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['qdrant', op])\n }\n if (op === 'eq') {\n return { must: [{ key: field, match: { value } }] }\n }\n if (op === 'ne') {\n return { must_not: [{ key: field, match: { value } }] }\n }\n if (op === 'gt') {\n return { must: [{ key: field, range: { gt: value } }] }\n }\n if (op === 'gte') {\n return { must: [{ key: field, range: { gte: value } }] }\n }\n if (op === 'lt') {\n return { must: [{ key: field, range: { lt: value } }] }\n }\n if (op === 'lte') {\n return { must: [{ key: field, range: { lte: value } }] }\n }\n if (op === 'in') {\n return { must: [{ key: field, match: { any: value } }] }\n }\n if (op === 'nin') {\n return { must_not: [{ key: field, match: { any: value } }] }\n }\n if (op === 'exists') {\n return value === false\n ? { must: [{ is_empty: { key: field } }] }\n : { must_not: [{ is_empty: { key: field } }] }\n }\n if (op === 'contains') {\n return { must: [{ key: field, match: { value } }] }\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['qdrant', op])\n }\n if (isFilterGroup(filter)) {\n const { and, or, not } = filter\n if (and) {\n const children = and\n .map((f) => translateQdrantFilter(f) as Record<string, unknown>)\n .filter((c) => c !== undefined)\n if (children.length === 0) return undefined\n if (children.length === 1) return children[0]\n return { must: children }\n }\n if (or) {\n const children = or\n .map((f) => translateQdrantFilter(f) as Record<string, unknown>)\n .filter((c) => c !== undefined)\n if (children.length === 0) return undefined\n if (children.length === 1) return children[0]\n return { should: children }\n }\n if (not) {\n const child = translateQdrantFilter(not)\n if (!child) return { must_not: [] }\n return { must_not: [child] }\n }\n return undefined\n }\n return undefined\n}\n\nexport interface QdrantVectorStoreOptions extends BaseVectorStoreOptions {\n connection?: { url?: string; host?: string; port?: number; apiKey?: string; https?: boolean }\n}\n\nconst getQdrantClient = async () => {\n try {\n const mod = await import('@qdrant/js-client-rest')\n return mod.QdrantClient\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['@qdrant/js-client-rest'])\n }\n}\n\nconst getSha256 = () => {\n try {\n const mod = require('js-sha256')\n return mod.sha256\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['js-sha256'])\n }\n}\n\nconst uuidFromId = (id: string): string => {\n const sha256 = getSha256()\n const h = sha256(id)\n return (\n h.slice(0, 8) +\n '-' +\n h.slice(8, 12) +\n '-' +\n h.slice(12, 16) +\n '-' +\n h.slice(16, 20) +\n '-' +\n h.slice(20, 32)\n )\n}\n\nexport class QdrantVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: true,\n rename: false,\n rawSql: false,\n builtInEncoding: false,\n // Strongly consistent (writes use wait=true): visible on resolve, so the option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n #client: any | null = null\n get #opts() {\n return this.options as QdrantVectorStoreOptions\n }\n static isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n async connect(): Promise<void> {\n if (this.#client) return\n const QdrantClient = await getQdrantClient()\n const c = this.#opts.connection || {}\n this.#client = new QdrantClient({\n url: c.url,\n host: c.host,\n port: c.port,\n apiKey: c.apiKey,\n https: c.https,\n })\n }\n async close(): Promise<void> {\n if (this.#client) {\n await this.#client.close()\n this.#client = null\n }\n }\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n const client = this.#client || (await this.connect(), this.#client!)\n const dist =\n spec.vector.metric === 'cosine' ? 'Cosine' : spec.vector.metric === 'dot' ? 'Dot' : 'Euclid'\n if (ifNotExists && (await this.hasCollection(spec.collection))) return\n try {\n await client.createCollection(spec.collection, {\n vectors: { size: spec.vector.dimensions, distance: dist },\n })\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['createCollection', String(err)])\n }\n }\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n const client = this.#client || (await this.connect(), this.#client!)\n if (ifExists && !(await this.hasCollection(collection))) return\n try {\n await client.deleteCollection(collection)\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', String(err)])\n }\n }\n async hasCollection(collection: string): Promise<boolean> {\n const client = this.#client || (await this.connect(), this.#client!)\n try {\n await client.getCollection(collection)\n return true\n } catch {\n return false\n }\n }\n async renameCollection(_from: string, _to: string): Promise<void> {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'qdrant'])\n }\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const client = this.#client || (await this.connect(), this.#client!)\n const expected = this.#opts.dimensions\n const points: 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 points.push({\n id: uuidFromId(r.id),\n vector,\n payload: { ...r.metadata, __id: r.id, __document: r.document },\n })\n }\n try {\n await client.upsert(plan.collection, { points })\n } catch (err) {\n throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n }\n }\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n const client = this.#client || (await this.connect(), this.#client!)\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 res = await client.scroll(plan.collection, {\n filter: { must: [{ key: '__id', match: { value: plan.near.id } }] },\n limit: 1,\n with_payload: true,\n with_vector: true,\n })\n if (res.points.length === 0) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = res.points[0].vector as number[]\n }\n }\n let hits: any[]\n if (queryVector) {\n const filter = this.translateQdrantFilter(plan.filter)\n const res = await client.search(plan.collection, {\n vector: queryVector,\n limit: plan.topK,\n offset: plan.offset,\n filter,\n with_payload: true,\n with_vector: !!plan.projection.vector,\n })\n hits = res\n } else {\n const filter = this.translateQdrantFilter(plan.filter)\n const res = await client.scroll(plan.collection, {\n filter,\n limit: plan.topK,\n with_payload: true,\n with_vector: !!plan.projection.vector,\n })\n hits = res.points\n }\n const proj = plan.projection\n return hits.map((hit) => this.projectHit(hit, proj, metric))\n }\n async executeDelete(plan: DeletePlan): Promise<void> {\n const client = this.#client || (await this.connect(), this.#client!)\n try {\n if (plan.ids) {\n await client.delete(plan.collection, { points: plan.ids.map(uuidFromId) })\n } else if (plan.filter) {\n await client.delete(plan.collection, { filter: this.translateQdrantFilter(plan.filter) })\n } else {\n await client.delete(plan.collection, { filter: {} })\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n projectHit(hit: any, projection: any, metric: string): VectorMatch {\n const out: VectorMatch = {}\n const payload = hit.payload || {}\n if (projection.id) {\n out.id = payload.__id\n }\n if (projection.vector && hit.vector) {\n out.vector = hit.vector as number[]\n }\n if (projection.document) {\n out.document = payload.__document\n }\n if (projection.metadata) {\n const meta: Record<string, unknown> = {}\n for (const k in payload) {\n if (k !== '__id' && k !== '__document') {\n meta[k] = payload[k]\n }\n }\n out.metadata = meta as any\n }\n if (projection.score !== false && 'score' in hit) {\n out.score = normalizeScore(\n hit.score as number,\n metric as any,\n metric === 'euclidean' ? 'distance' : 'similarity'\n )\n }\n return out\n }\n translateQdrantFilter(filter?: VectorFilter): Record<string, unknown> | undefined {\n return translateQdrantFilter(filter)\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"qdrant.cjs","names":["#opts","#client"],"sources":["../../../src/batteries/vector/qdrant/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/qdrant\n */\n\nimport { normalizeScore } from '../helpers'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { isFilterCondition, isRawFilter, isFilterGroup } from '../filters'\nimport {\n E_VECTOR_STORE_DRIVER_UNAVAILABLE,\n E_VECTOR_STORE_COLLECTION_FAILED,\n E_VECTOR_STORE_UPSERT_FAILED,\n E_VECTOR_STORE_SEARCH_FAILED,\n E_VECTOR_STORE_DELETE_FAILED,\n E_VECTOR_STORE_DIMENSION_MISMATCH,\n E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR,\n E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n} from '../exceptions'\nimport type { VectorFilter } from '../filters'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from '../types'\n\n/** Translate a neutral {@link VectorFilter} into a Qdrant filter object. */\nexport const translateQdrantFilter = (\n filter?: VectorFilter\n): Record<string, unknown> | undefined => {\n if (!filter) return undefined\n if (isRawFilter(filter)) {\n if (filter.$dialect === 'qdrant') {\n return filter.$raw as Record<string, unknown>\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['qdrant', String(filter.$dialect)])\n }\n if (isFilterCondition(filter)) {\n const { field, op, value } = filter\n if (value === undefined) {\n if (op === 'exists') {\n return { must_not: [{ is_empty: { key: field } }] }\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['qdrant', op])\n }\n if (op === 'eq') {\n return { must: [{ key: field, match: { value } }] }\n }\n if (op === 'ne') {\n return { must_not: [{ key: field, match: { value } }] }\n }\n if (op === 'gt') {\n return { must: [{ key: field, range: { gt: value } }] }\n }\n if (op === 'gte') {\n return { must: [{ key: field, range: { gte: value } }] }\n }\n if (op === 'lt') {\n return { must: [{ key: field, range: { lt: value } }] }\n }\n if (op === 'lte') {\n return { must: [{ key: field, range: { lte: value } }] }\n }\n if (op === 'in') {\n return { must: [{ key: field, match: { any: value } }] }\n }\n if (op === 'nin') {\n return { must_not: [{ key: field, match: { any: value } }] }\n }\n if (op === 'exists') {\n return value === false\n ? { must: [{ is_empty: { key: field } }] }\n : { must_not: [{ is_empty: { key: field } }] }\n }\n if (op === 'contains') {\n return { must: [{ key: field, match: { value } }] }\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['qdrant', op])\n }\n if (isFilterGroup(filter)) {\n const { and, or, not } = filter\n if (and) {\n const children = and\n .map((f) => translateQdrantFilter(f) as Record<string, unknown>)\n .filter((c) => c !== undefined)\n if (children.length === 0) return undefined\n if (children.length === 1) return children[0]\n return { must: children }\n }\n if (or) {\n const children = or\n .map((f) => translateQdrantFilter(f) as Record<string, unknown>)\n .filter((c) => c !== undefined)\n if (children.length === 0) return undefined\n if (children.length === 1) return children[0]\n return { should: children }\n }\n if (not) {\n const child = translateQdrantFilter(not)\n if (!child) return { must_not: [] }\n return { must_not: [child] }\n }\n return undefined\n }\n return undefined\n}\n\nexport interface QdrantVectorStoreOptions extends BaseVectorStoreOptions {\n /** Connection and authentication parameters for the backend. */\n connection?: { url?: string; host?: string; port?: number; apiKey?: string; https?: boolean }\n}\n\nconst getQdrantClient = async () => {\n try {\n const mod = await import('@qdrant/js-client-rest')\n return mod.QdrantClient\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['@qdrant/js-client-rest'])\n }\n}\n\nconst getSha256 = () => {\n try {\n const mod = require('js-sha256')\n return mod.sha256\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['js-sha256'])\n }\n}\n\nconst uuidFromId = (id: string): string => {\n const sha256 = getSha256()\n const h = sha256(id)\n return (\n h.slice(0, 8) +\n '-' +\n h.slice(8, 12) +\n '-' +\n h.slice(12, 16) +\n '-' +\n h.slice(16, 20) +\n '-' +\n h.slice(20, 32)\n )\n}\n\nexport class QdrantVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: true,\n rename: false,\n rawSql: false,\n builtInEncoding: false,\n // Strongly consistent (writes use wait=true): visible on resolve, so the option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n #client: any | null = null\n get #opts() {\n return this.options as QdrantVectorStoreOptions\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 async connect(): Promise<void> {\n if (this.#client) return\n const QdrantClient = await getQdrantClient()\n const c = this.#opts.connection || {}\n this.#client = new QdrantClient({\n url: c.url,\n host: c.host,\n port: c.port,\n apiKey: c.apiKey,\n https: c.https,\n })\n }\n async close(): Promise<void> {\n if (this.#client) {\n await this.#client.close()\n this.#client = null\n }\n }\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n const client = this.#client || (await this.connect(), this.#client!)\n const dist =\n spec.vector.metric === 'cosine' ? 'Cosine' : spec.vector.metric === 'dot' ? 'Dot' : 'Euclid'\n if (ifNotExists && (await this.hasCollection(spec.collection))) return\n try {\n await client.createCollection(spec.collection, {\n vectors: { size: spec.vector.dimensions, distance: dist },\n })\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['createCollection', String(err)])\n }\n }\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n const client = this.#client || (await this.connect(), this.#client!)\n if (ifExists && !(await this.hasCollection(collection))) return\n try {\n await client.deleteCollection(collection)\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', String(err)])\n }\n }\n async hasCollection(collection: string): Promise<boolean> {\n const client = this.#client || (await this.connect(), this.#client!)\n try {\n await client.getCollection(collection)\n return true\n } catch {\n return false\n }\n }\n async renameCollection(_from: string, _to: string): Promise<void> {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'qdrant'])\n }\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const client = this.#client || (await this.connect(), this.#client!)\n const expected = this.#opts.dimensions\n const points: 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 points.push({\n id: uuidFromId(r.id),\n vector,\n payload: { ...r.metadata, __id: r.id, __document: r.document },\n })\n }\n try {\n await client.upsert(plan.collection, { points })\n } catch (err) {\n throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n }\n }\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n const client = this.#client || (await this.connect(), this.#client!)\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 res = await client.scroll(plan.collection, {\n filter: { must: [{ key: '__id', match: { value: plan.near.id } }] },\n limit: 1,\n with_payload: true,\n with_vector: true,\n })\n if (res.points.length === 0) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = res.points[0].vector as number[]\n }\n }\n let hits: any[]\n if (queryVector) {\n const filter = this.translateQdrantFilter(plan.filter)\n const res = await client.search(plan.collection, {\n vector: queryVector,\n limit: plan.topK,\n offset: plan.offset,\n filter,\n with_payload: true,\n with_vector: !!plan.projection.vector,\n })\n hits = res\n } else {\n const filter = this.translateQdrantFilter(plan.filter)\n const res = await client.scroll(plan.collection, {\n filter,\n limit: plan.topK,\n with_payload: true,\n with_vector: !!plan.projection.vector,\n })\n hits = res.points\n }\n const proj = plan.projection\n return hits.map((hit) => this.projectHit(hit, proj, metric))\n }\n async executeDelete(plan: DeletePlan): Promise<void> {\n const client = this.#client || (await this.connect(), this.#client!)\n try {\n if (plan.ids) {\n await client.delete(plan.collection, { points: plan.ids.map(uuidFromId) })\n } else if (plan.filter) {\n await client.delete(plan.collection, { filter: this.translateQdrantFilter(plan.filter) })\n } else {\n await client.delete(plan.collection, { filter: {} })\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n /** Project a raw Qdrant hit into a {@link VectorMatch} per the requested projection, normalizing its score. */\n projectHit(hit: any, projection: any, metric: string): VectorMatch {\n const out: VectorMatch = {}\n const payload = hit.payload || {}\n if (projection.id) {\n out.id = payload.__id\n }\n if (projection.vector && hit.vector) {\n out.vector = hit.vector as number[]\n }\n if (projection.document) {\n out.document = payload.__document\n }\n if (projection.metadata) {\n const meta: Record<string, unknown> = {}\n for (const k in payload) {\n if (k !== '__id' && k !== '__document') {\n meta[k] = payload[k]\n }\n }\n out.metadata = meta as any\n }\n if (projection.score !== false && 'score' in hit) {\n out.score = normalizeScore(\n hit.score as number,\n metric as any,\n metric === 'euclidean' ? 'distance' : 'similarity'\n )\n }\n return out\n }\n /** Instance wrapper over the module-level {@link translateQdrantFilter}. */\n translateQdrantFilter(filter?: VectorFilter): Record<string, unknown> | undefined {\n return translateQdrantFilter(filter)\n }\n}\n"],"mappings":"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"}
@@ -8,6 +8,7 @@ import { validateRecords } from "./validation.mjs";
8
8
  /**
9
9
  * @module @nhtio/adk/batteries/vector/qdrant
10
10
  */
11
+ /** Translate a neutral {@link VectorFilter} into a Qdrant filter object. */
11
12
  var translateQdrantFilter = (filter) => {
12
13
  if (!filter) return void 0;
13
14
  if (isRawFilter(filter)) {
@@ -116,6 +117,7 @@ var QdrantVectorStore = class extends BaseVectorStore {
116
117
  get #opts() {
117
118
  return this.options;
118
119
  }
120
+ /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
119
121
  static isAvailable() {
120
122
  return typeof process !== "undefined";
121
123
  }
@@ -260,6 +262,7 @@ var QdrantVectorStore = class extends BaseVectorStore {
260
262
  throw new E_VECTOR_STORE_DELETE_FAILED([String(err)]);
261
263
  }
262
264
  }
265
+ /** Project a raw Qdrant hit into a {@link VectorMatch} per the requested projection, normalizing its score. */
263
266
  projectHit(hit, projection, metric) {
264
267
  const out = {};
265
268
  const payload = hit.payload || {};
@@ -274,6 +277,7 @@ var QdrantVectorStore = class extends BaseVectorStore {
274
277
  if (projection.score !== false && "score" in hit) out.score = normalizeScore(hit.score, metric, metric === "euclidean" ? "distance" : "similarity");
275
278
  return out;
276
279
  }
280
+ /** Instance wrapper over the module-level {@link translateQdrantFilter}. */
277
281
  translateQdrantFilter(filter) {
278
282
  return translateQdrantFilter(filter);
279
283
  }
@@ -1 +1 @@
1
- {"version":3,"file":"qdrant.mjs","names":["#opts","#client"],"sources":["../../../src/batteries/vector/qdrant/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/qdrant\n */\n\nimport { normalizeScore } from '../helpers'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { isFilterCondition, isRawFilter, isFilterGroup } from '../filters'\nimport {\n E_VECTOR_STORE_DRIVER_UNAVAILABLE,\n E_VECTOR_STORE_COLLECTION_FAILED,\n E_VECTOR_STORE_UPSERT_FAILED,\n E_VECTOR_STORE_SEARCH_FAILED,\n E_VECTOR_STORE_DELETE_FAILED,\n E_VECTOR_STORE_DIMENSION_MISMATCH,\n E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR,\n E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n} from '../exceptions'\nimport type { VectorFilter } from '../filters'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from '../types'\n\nexport const translateQdrantFilter = (\n filter?: VectorFilter\n): Record<string, unknown> | undefined => {\n if (!filter) return undefined\n if (isRawFilter(filter)) {\n if (filter.$dialect === 'qdrant') {\n return filter.$raw as Record<string, unknown>\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['qdrant', String(filter.$dialect)])\n }\n if (isFilterCondition(filter)) {\n const { field, op, value } = filter\n if (value === undefined) {\n if (op === 'exists') {\n return { must_not: [{ is_empty: { key: field } }] }\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['qdrant', op])\n }\n if (op === 'eq') {\n return { must: [{ key: field, match: { value } }] }\n }\n if (op === 'ne') {\n return { must_not: [{ key: field, match: { value } }] }\n }\n if (op === 'gt') {\n return { must: [{ key: field, range: { gt: value } }] }\n }\n if (op === 'gte') {\n return { must: [{ key: field, range: { gte: value } }] }\n }\n if (op === 'lt') {\n return { must: [{ key: field, range: { lt: value } }] }\n }\n if (op === 'lte') {\n return { must: [{ key: field, range: { lte: value } }] }\n }\n if (op === 'in') {\n return { must: [{ key: field, match: { any: value } }] }\n }\n if (op === 'nin') {\n return { must_not: [{ key: field, match: { any: value } }] }\n }\n if (op === 'exists') {\n return value === false\n ? { must: [{ is_empty: { key: field } }] }\n : { must_not: [{ is_empty: { key: field } }] }\n }\n if (op === 'contains') {\n return { must: [{ key: field, match: { value } }] }\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['qdrant', op])\n }\n if (isFilterGroup(filter)) {\n const { and, or, not } = filter\n if (and) {\n const children = and\n .map((f) => translateQdrantFilter(f) as Record<string, unknown>)\n .filter((c) => c !== undefined)\n if (children.length === 0) return undefined\n if (children.length === 1) return children[0]\n return { must: children }\n }\n if (or) {\n const children = or\n .map((f) => translateQdrantFilter(f) as Record<string, unknown>)\n .filter((c) => c !== undefined)\n if (children.length === 0) return undefined\n if (children.length === 1) return children[0]\n return { should: children }\n }\n if (not) {\n const child = translateQdrantFilter(not)\n if (!child) return { must_not: [] }\n return { must_not: [child] }\n }\n return undefined\n }\n return undefined\n}\n\nexport interface QdrantVectorStoreOptions extends BaseVectorStoreOptions {\n connection?: { url?: string; host?: string; port?: number; apiKey?: string; https?: boolean }\n}\n\nconst getQdrantClient = async () => {\n try {\n const mod = await import('@qdrant/js-client-rest')\n return mod.QdrantClient\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['@qdrant/js-client-rest'])\n }\n}\n\nconst getSha256 = () => {\n try {\n const mod = require('js-sha256')\n return mod.sha256\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['js-sha256'])\n }\n}\n\nconst uuidFromId = (id: string): string => {\n const sha256 = getSha256()\n const h = sha256(id)\n return (\n h.slice(0, 8) +\n '-' +\n h.slice(8, 12) +\n '-' +\n h.slice(12, 16) +\n '-' +\n h.slice(16, 20) +\n '-' +\n h.slice(20, 32)\n )\n}\n\nexport class QdrantVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: true,\n rename: false,\n rawSql: false,\n builtInEncoding: false,\n // Strongly consistent (writes use wait=true): visible on resolve, so the option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n #client: any | null = null\n get #opts() {\n return this.options as QdrantVectorStoreOptions\n }\n static isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n async connect(): Promise<void> {\n if (this.#client) return\n const QdrantClient = await getQdrantClient()\n const c = this.#opts.connection || {}\n this.#client = new QdrantClient({\n url: c.url,\n host: c.host,\n port: c.port,\n apiKey: c.apiKey,\n https: c.https,\n })\n }\n async close(): Promise<void> {\n if (this.#client) {\n await this.#client.close()\n this.#client = null\n }\n }\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n const client = this.#client || (await this.connect(), this.#client!)\n const dist =\n spec.vector.metric === 'cosine' ? 'Cosine' : spec.vector.metric === 'dot' ? 'Dot' : 'Euclid'\n if (ifNotExists && (await this.hasCollection(spec.collection))) return\n try {\n await client.createCollection(spec.collection, {\n vectors: { size: spec.vector.dimensions, distance: dist },\n })\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['createCollection', String(err)])\n }\n }\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n const client = this.#client || (await this.connect(), this.#client!)\n if (ifExists && !(await this.hasCollection(collection))) return\n try {\n await client.deleteCollection(collection)\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', String(err)])\n }\n }\n async hasCollection(collection: string): Promise<boolean> {\n const client = this.#client || (await this.connect(), this.#client!)\n try {\n await client.getCollection(collection)\n return true\n } catch {\n return false\n }\n }\n async renameCollection(_from: string, _to: string): Promise<void> {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'qdrant'])\n }\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const client = this.#client || (await this.connect(), this.#client!)\n const expected = this.#opts.dimensions\n const points: 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 points.push({\n id: uuidFromId(r.id),\n vector,\n payload: { ...r.metadata, __id: r.id, __document: r.document },\n })\n }\n try {\n await client.upsert(plan.collection, { points })\n } catch (err) {\n throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n }\n }\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n const client = this.#client || (await this.connect(), this.#client!)\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 res = await client.scroll(plan.collection, {\n filter: { must: [{ key: '__id', match: { value: plan.near.id } }] },\n limit: 1,\n with_payload: true,\n with_vector: true,\n })\n if (res.points.length === 0) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = res.points[0].vector as number[]\n }\n }\n let hits: any[]\n if (queryVector) {\n const filter = this.translateQdrantFilter(plan.filter)\n const res = await client.search(plan.collection, {\n vector: queryVector,\n limit: plan.topK,\n offset: plan.offset,\n filter,\n with_payload: true,\n with_vector: !!plan.projection.vector,\n })\n hits = res\n } else {\n const filter = this.translateQdrantFilter(plan.filter)\n const res = await client.scroll(plan.collection, {\n filter,\n limit: plan.topK,\n with_payload: true,\n with_vector: !!plan.projection.vector,\n })\n hits = res.points\n }\n const proj = plan.projection\n return hits.map((hit) => this.projectHit(hit, proj, metric))\n }\n async executeDelete(plan: DeletePlan): Promise<void> {\n const client = this.#client || (await this.connect(), this.#client!)\n try {\n if (plan.ids) {\n await client.delete(plan.collection, { points: plan.ids.map(uuidFromId) })\n } else if (plan.filter) {\n await client.delete(plan.collection, { filter: this.translateQdrantFilter(plan.filter) })\n } else {\n await client.delete(plan.collection, { filter: {} })\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n projectHit(hit: any, projection: any, metric: string): VectorMatch {\n const out: VectorMatch = {}\n const payload = hit.payload || {}\n if (projection.id) {\n out.id = payload.__id\n }\n if (projection.vector && hit.vector) {\n out.vector = hit.vector as number[]\n }\n if (projection.document) {\n out.document = payload.__document\n }\n if (projection.metadata) {\n const meta: Record<string, unknown> = {}\n for (const k in payload) {\n if (k !== '__id' && k !== '__document') {\n meta[k] = payload[k]\n }\n }\n out.metadata = meta as any\n }\n if (projection.score !== false && 'score' in hit) {\n out.score = normalizeScore(\n hit.score as number,\n metric as any,\n metric === 'euclidean' ? 'distance' : 'similarity'\n )\n }\n return out\n }\n translateQdrantFilter(filter?: VectorFilter): Record<string, unknown> | undefined {\n return translateQdrantFilter(filter)\n }\n}\n"],"mappings":";;;;;;;;;;AAsBA,IAAa,yBACX,WACwC;CACxC,IAAI,CAAC,QAAQ,OAAO,KAAA;CACpB,IAAI,YAAY,MAAM,GAAG;EACvB,IAAI,OAAO,aAAa,UACtB,OAAO,OAAO;EAEhB,MAAM,IAAI,2CAA2C,CAAC,UAAU,OAAO,OAAO,QAAQ,CAAC,CAAC;CAC1F;CACA,IAAI,kBAAkB,MAAM,GAAG;EAC7B,MAAM,EAAE,OAAO,IAAI,UAAU;EAC7B,IAAI,UAAU,KAAA,GAAW;GACvB,IAAI,OAAO,UACT,OAAO,EAAE,UAAU,CAAC,EAAE,UAAU,EAAE,KAAK,MAAM,EAAE,CAAC,EAAE;GAEpD,MAAM,IAAI,2CAA2C,CAAC,UAAU,EAAE,CAAC;EACrE;EACA,IAAI,OAAO,MACT,OAAO,EAAE,MAAM,CAAC;GAAE,KAAK;GAAO,OAAO,EAAE,MAAM;EAAE,CAAC,EAAE;EAEpD,IAAI,OAAO,MACT,OAAO,EAAE,UAAU,CAAC;GAAE,KAAK;GAAO,OAAO,EAAE,MAAM;EAAE,CAAC,EAAE;EAExD,IAAI,OAAO,MACT,OAAO,EAAE,MAAM,CAAC;GAAE,KAAK;GAAO,OAAO,EAAE,IAAI,MAAM;EAAE,CAAC,EAAE;EAExD,IAAI,OAAO,OACT,OAAO,EAAE,MAAM,CAAC;GAAE,KAAK;GAAO,OAAO,EAAE,KAAK,MAAM;EAAE,CAAC,EAAE;EAEzD,IAAI,OAAO,MACT,OAAO,EAAE,MAAM,CAAC;GAAE,KAAK;GAAO,OAAO,EAAE,IAAI,MAAM;EAAE,CAAC,EAAE;EAExD,IAAI,OAAO,OACT,OAAO,EAAE,MAAM,CAAC;GAAE,KAAK;GAAO,OAAO,EAAE,KAAK,MAAM;EAAE,CAAC,EAAE;EAEzD,IAAI,OAAO,MACT,OAAO,EAAE,MAAM,CAAC;GAAE,KAAK;GAAO,OAAO,EAAE,KAAK,MAAM;EAAE,CAAC,EAAE;EAEzD,IAAI,OAAO,OACT,OAAO,EAAE,UAAU,CAAC;GAAE,KAAK;GAAO,OAAO,EAAE,KAAK,MAAM;EAAE,CAAC,EAAE;EAE7D,IAAI,OAAO,UACT,OAAO,UAAU,QACb,EAAE,MAAM,CAAC,EAAE,UAAU,EAAE,KAAK,MAAM,EAAE,CAAC,EAAE,IACvC,EAAE,UAAU,CAAC,EAAE,UAAU,EAAE,KAAK,MAAM,EAAE,CAAC,EAAE;EAEjD,IAAI,OAAO,YACT,OAAO,EAAE,MAAM,CAAC;GAAE,KAAK;GAAO,OAAO,EAAE,MAAM;EAAE,CAAC,EAAE;EAEpD,MAAM,IAAI,2CAA2C,CAAC,UAAU,EAAE,CAAC;CACrE;CACA,IAAI,cAAc,MAAM,GAAG;EACzB,MAAM,EAAE,KAAK,IAAI,QAAQ;EACzB,IAAI,KAAK;GACP,MAAM,WAAW,IACd,KAAK,MAAM,sBAAsB,CAAC,CAA4B,EAC9D,QAAQ,MAAM,MAAM,KAAA,CAAS;GAChC,IAAI,SAAS,WAAW,GAAG,OAAO,KAAA;GAClC,IAAI,SAAS,WAAW,GAAG,OAAO,SAAS;GAC3C,OAAO,EAAE,MAAM,SAAS;EAC1B;EACA,IAAI,IAAI;GACN,MAAM,WAAW,GACd,KAAK,MAAM,sBAAsB,CAAC,CAA4B,EAC9D,QAAQ,MAAM,MAAM,KAAA,CAAS;GAChC,IAAI,SAAS,WAAW,GAAG,OAAO,KAAA;GAClC,IAAI,SAAS,WAAW,GAAG,OAAO,SAAS;GAC3C,OAAO,EAAE,QAAQ,SAAS;EAC5B;EACA,IAAI,KAAK;GACP,MAAM,QAAQ,sBAAsB,GAAG;GACvC,IAAI,CAAC,OAAO,OAAO,EAAE,UAAU,CAAC,EAAE;GAClC,OAAO,EAAE,UAAU,CAAC,KAAK,EAAE;EAC7B;EACA;CACF;AAEF;AAMA,IAAM,kBAAkB,YAAY;CAClC,IAAI;EAEF,QAAO,MADW,OAAO,2BACd;CACb,QAAQ;EACN,MAAM,IAAI,kCAAkC,CAAC,wBAAwB,CAAC;CACxE;AACF;AAEA,IAAM,kBAAkB;CACtB,IAAI;EAEF,OAAA,UADoB,WACb,EAAI;CACb,QAAQ;EACN,MAAM,IAAI,kCAAkC,CAAC,WAAW,CAAC;CAC3D;AACF;AAEA,IAAM,cAAc,OAAuB;CAEzC,MAAM,IADS,UACL,EAAO,EAAE;CACnB,OACE,EAAE,MAAM,GAAG,CAAC,IACZ,MACA,EAAE,MAAM,GAAG,EAAE,IACb,MACA,EAAE,MAAM,IAAI,EAAE,IACd,MACA,EAAE,MAAM,IAAI,EAAE,IACd,MACA,EAAE,MAAM,IAAI,EAAE;AAElB;AAEA,IAAa,oBAAb,cAAuC,gBAAgB;CACrD,eAAiD;EAC/C,cAAc;EACd,cAAc;EACd,QAAQ;EACR,QAAQ;EACR,iBAAiB;EAEjB,aAAa;GAAE,cAAc;GAAO,SAAS;GAAU,OAAO,CAAC,QAAQ;EAAE;CAC3E;CACA,UAAsB;CACtB,IAAIA,QAAQ;EACV,OAAO,KAAK;CACd;CACA,OAAO,cAAuB;EAC5B,OAAO,OAAO,YAAY;CAC5B;CACA,cAAuB;EACrB,OAAO,OAAO,YAAY;CAC5B;CACA,MAAM,UAAyB;EAC7B,IAAI,KAAKC,SAAS;EAClB,MAAM,eAAe,MAAM,gBAAgB;EAC3C,MAAM,IAAI,KAAKD,MAAM,cAAc,CAAC;EACpC,KAAKC,UAAU,IAAI,aAAa;GAC9B,KAAK,EAAE;GACP,MAAM,EAAE;GACR,MAAM,EAAE;GACR,QAAQ,EAAE;GACV,OAAO,EAAE;EACX,CAAC;CACH;CACA,MAAM,QAAuB;EAC3B,IAAI,KAAKA,SAAS;GAChB,MAAM,KAAKA,QAAQ,MAAM;GACzB,KAAKA,UAAU;EACjB;CACF;CACA,MAAM,iBAAiB,MAAsB,aAAqC;EAChF,MAAM,SAAS,KAAKA,YAAY,MAAM,KAAK,QAAQ,GAAG,KAAKA;EAC3D,MAAM,OACJ,KAAK,OAAO,WAAW,WAAW,WAAW,KAAK,OAAO,WAAW,QAAQ,QAAQ;EACtF,IAAI,eAAgB,MAAM,KAAK,cAAc,KAAK,UAAU,GAAI;EAChE,IAAI;GACF,MAAM,OAAO,iBAAiB,KAAK,YAAY,EAC7C,SAAS;IAAE,MAAM,KAAK,OAAO;IAAY,UAAU;GAAK,EAC1D,CAAC;EACH,SAAS,KAAK;GACZ,MAAM,IAAI,iCAAiC,CAAC,oBAAoB,OAAO,GAAG,CAAC,CAAC;EAC9E;CACF;CACA,MAAM,eAAe,YAAoB,UAAkC;EACzE,MAAM,SAAS,KAAKA,YAAY,MAAM,KAAK,QAAQ,GAAG,KAAKA;EAC3D,IAAI,YAAY,CAAE,MAAM,KAAK,cAAc,UAAU,GAAI;EACzD,IAAI;GACF,MAAM,OAAO,iBAAiB,UAAU;EAC1C,SAAS,KAAK;GACZ,MAAM,IAAI,iCAAiC,CAAC,kBAAkB,OAAO,GAAG,CAAC,CAAC;EAC5E;CACF;CACA,MAAM,cAAc,YAAsC;EACxD,MAAM,SAAS,KAAKA,YAAY,MAAM,KAAK,QAAQ,GAAG,KAAKA;EAC3D,IAAI;GACF,MAAM,OAAO,cAAc,UAAU;GACrC,OAAO;EACT,QAAQ;GACN,OAAO;EACT;CACF;CACA,MAAM,iBAAiB,OAAe,KAA4B;EAChE,MAAM,IAAI,qCAAqC,CAAC,oBAAoB,QAAQ,CAAC;CAC/E;CACA,MAAM,cAAc,MAAiC;EACnD,IAAI,KAAK,QAAQ,WAAW,GAAG;EAC/B,gBAAgB,KAAK,OAAO;EAC5B,MAAM,SAAS,KAAKA,YAAY,MAAM,KAAK,QAAQ,GAAG,KAAKA;EAC3D,MAAM,WAAW,KAAKD,MAAM;EAC5B,MAAM,SAAgB,CAAC;EACvB,KAAK,MAAM,KAAK,KAAK,SAAS;GAC5B,IAAI,SAAS,EAAE;GACf,IAAI,CAAC,UAAU,EAAE,UAAU;IACzB,MAAM,CAAC,KAAK,MAAM,KAAK,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU;IACtD,SAAS;GACX;GACA,IAAI,CAAC,QACH,MAAM,IAAI,6BAA6B,CAAC,oCAAoC,CAAC;GAE/E,IAAI,aAAa,KAAA,KAAa,OAAO,WAAW,UAC9C,MAAM,IAAI,kCAAkC,CAAC,UAAU,OAAO,MAAM,CAAC;GAEvE,OAAO,KAAK;IACV,IAAI,WAAW,EAAE,EAAE;IACnB;IACA,SAAS;KAAE,GAAG,EAAE;KAAU,MAAM,EAAE;KAAI,YAAY,EAAE;IAAS;GAC/D,CAAC;EACH;EACA,IAAI;GACF,MAAM,OAAO,OAAO,KAAK,YAAY,EAAE,OAAO,CAAC;EACjD,SAAS,KAAK;GACZ,MAAM,IAAI,6BAA6B,CAAC,OAAO,GAAG,CAAC,CAAC;EACtD;CACF;CACA,MAAM,cAAc,MAA0C;EAC5D,MAAM,SAAS,KAAKC,YAAY,MAAM,KAAK,QAAQ,GAAG,KAAKA;EAC3D,MAAM,SAAS,KAAKD,MAAM,UAAU;EACpC,IAAI;EACJ,IAAI,KAAK;OACH,YAAY,KAAK,MACnB,cAAc,KAAK,KAAK;QACnB,IAAI,gBAAgB,KAAK,MAAM;IACpC,MAAM,CAAC,KAAK,MAAM,KAAK,OAAO,CAAC,KAAK,KAAK,UAAU,GAAG,OAAO;IAC7D,cAAc;GAChB,OAAO,IAAI,QAAQ,KAAK,MAAM;IAC5B,MAAM,MAAM,MAAM,OAAO,OAAO,KAAK,YAAY;KAC/C,QAAQ,EAAE,MAAM,CAAC;MAAE,KAAK;MAAQ,OAAO,EAAE,OAAO,KAAK,KAAK,GAAG;KAAE,CAAC,EAAE;KAClE,OAAO;KACP,cAAc;KACd,aAAa;IACf,CAAC;IACD,IAAI,IAAI,OAAO,WAAW,GACxB,MAAM,IAAI,6BAA6B,CAAC,8BAA8B,KAAK,KAAK,EAAE,CAAC;IAErF,cAAc,IAAI,OAAO,GAAG;GAC9B;;EAEF,IAAI;EACJ,IAAI,aAAa;GACf,MAAM,SAAS,KAAK,sBAAsB,KAAK,MAAM;GASrD,OAAO,MARW,OAAO,OAAO,KAAK,YAAY;IAC/C,QAAQ;IACR,OAAO,KAAK;IACZ,QAAQ,KAAK;IACb;IACA,cAAc;IACd,aAAa,CAAC,CAAC,KAAK,WAAW;GACjC,CAAC;EAEH,OAAO;GACL,MAAM,SAAS,KAAK,sBAAsB,KAAK,MAAM;GAOrD,QAAO,MANW,OAAO,OAAO,KAAK,YAAY;IAC/C;IACA,OAAO,KAAK;IACZ,cAAc;IACd,aAAa,CAAC,CAAC,KAAK,WAAW;GACjC,CAAC,GACU;EACb;EACA,MAAM,OAAO,KAAK;EAClB,OAAO,KAAK,KAAK,QAAQ,KAAK,WAAW,KAAK,MAAM,MAAM,CAAC;CAC7D;CACA,MAAM,cAAc,MAAiC;EACnD,MAAM,SAAS,KAAKC,YAAY,MAAM,KAAK,QAAQ,GAAG,KAAKA;EAC3D,IAAI;GACF,IAAI,KAAK,KACP,MAAM,OAAO,OAAO,KAAK,YAAY,EAAE,QAAQ,KAAK,IAAI,IAAI,UAAU,EAAE,CAAC;QACpE,IAAI,KAAK,QACd,MAAM,OAAO,OAAO,KAAK,YAAY,EAAE,QAAQ,KAAK,sBAAsB,KAAK,MAAM,EAAE,CAAC;QAExF,MAAM,OAAO,OAAO,KAAK,YAAY,EAAE,QAAQ,CAAC,EAAE,CAAC;EAEvD,SAAS,KAAK;GACZ,MAAM,IAAI,6BAA6B,CAAC,OAAO,GAAG,CAAC,CAAC;EACtD;CACF;CACA,WAAW,KAAU,YAAiB,QAA6B;EACjE,MAAM,MAAmB,CAAC;EAC1B,MAAM,UAAU,IAAI,WAAW,CAAC;EAChC,IAAI,WAAW,IACb,IAAI,KAAK,QAAQ;EAEnB,IAAI,WAAW,UAAU,IAAI,QAC3B,IAAI,SAAS,IAAI;EAEnB,IAAI,WAAW,UACb,IAAI,WAAW,QAAQ;EAEzB,IAAI,WAAW,UAAU;GACvB,MAAM,OAAgC,CAAC;GACvC,KAAK,MAAM,KAAK,SACd,IAAI,MAAM,UAAU,MAAM,cACxB,KAAK,KAAK,QAAQ;GAGtB,IAAI,WAAW;EACjB;EACA,IAAI,WAAW,UAAU,SAAS,WAAW,KAC3C,IAAI,QAAQ,eACV,IAAI,OACJ,QACA,WAAW,cAAc,aAAa,YACxC;EAEF,OAAO;CACT;CACA,sBAAsB,QAA4D;EAChF,OAAO,sBAAsB,MAAM;CACrC;AACF"}
1
+ {"version":3,"file":"qdrant.mjs","names":["#opts","#client"],"sources":["../../../src/batteries/vector/qdrant/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/qdrant\n */\n\nimport { normalizeScore } from '../helpers'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { isFilterCondition, isRawFilter, isFilterGroup } from '../filters'\nimport {\n E_VECTOR_STORE_DRIVER_UNAVAILABLE,\n E_VECTOR_STORE_COLLECTION_FAILED,\n E_VECTOR_STORE_UPSERT_FAILED,\n E_VECTOR_STORE_SEARCH_FAILED,\n E_VECTOR_STORE_DELETE_FAILED,\n E_VECTOR_STORE_DIMENSION_MISMATCH,\n E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR,\n E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n} from '../exceptions'\nimport type { VectorFilter } from '../filters'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from '../types'\n\n/** Translate a neutral {@link VectorFilter} into a Qdrant filter object. */\nexport const translateQdrantFilter = (\n filter?: VectorFilter\n): Record<string, unknown> | undefined => {\n if (!filter) return undefined\n if (isRawFilter(filter)) {\n if (filter.$dialect === 'qdrant') {\n return filter.$raw as Record<string, unknown>\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['qdrant', String(filter.$dialect)])\n }\n if (isFilterCondition(filter)) {\n const { field, op, value } = filter\n if (value === undefined) {\n if (op === 'exists') {\n return { must_not: [{ is_empty: { key: field } }] }\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['qdrant', op])\n }\n if (op === 'eq') {\n return { must: [{ key: field, match: { value } }] }\n }\n if (op === 'ne') {\n return { must_not: [{ key: field, match: { value } }] }\n }\n if (op === 'gt') {\n return { must: [{ key: field, range: { gt: value } }] }\n }\n if (op === 'gte') {\n return { must: [{ key: field, range: { gte: value } }] }\n }\n if (op === 'lt') {\n return { must: [{ key: field, range: { lt: value } }] }\n }\n if (op === 'lte') {\n return { must: [{ key: field, range: { lte: value } }] }\n }\n if (op === 'in') {\n return { must: [{ key: field, match: { any: value } }] }\n }\n if (op === 'nin') {\n return { must_not: [{ key: field, match: { any: value } }] }\n }\n if (op === 'exists') {\n return value === false\n ? { must: [{ is_empty: { key: field } }] }\n : { must_not: [{ is_empty: { key: field } }] }\n }\n if (op === 'contains') {\n return { must: [{ key: field, match: { value } }] }\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['qdrant', op])\n }\n if (isFilterGroup(filter)) {\n const { and, or, not } = filter\n if (and) {\n const children = and\n .map((f) => translateQdrantFilter(f) as Record<string, unknown>)\n .filter((c) => c !== undefined)\n if (children.length === 0) return undefined\n if (children.length === 1) return children[0]\n return { must: children }\n }\n if (or) {\n const children = or\n .map((f) => translateQdrantFilter(f) as Record<string, unknown>)\n .filter((c) => c !== undefined)\n if (children.length === 0) return undefined\n if (children.length === 1) return children[0]\n return { should: children }\n }\n if (not) {\n const child = translateQdrantFilter(not)\n if (!child) return { must_not: [] }\n return { must_not: [child] }\n }\n return undefined\n }\n return undefined\n}\n\nexport interface QdrantVectorStoreOptions extends BaseVectorStoreOptions {\n /** Connection and authentication parameters for the backend. */\n connection?: { url?: string; host?: string; port?: number; apiKey?: string; https?: boolean }\n}\n\nconst getQdrantClient = async () => {\n try {\n const mod = await import('@qdrant/js-client-rest')\n return mod.QdrantClient\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['@qdrant/js-client-rest'])\n }\n}\n\nconst getSha256 = () => {\n try {\n const mod = require('js-sha256')\n return mod.sha256\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['js-sha256'])\n }\n}\n\nconst uuidFromId = (id: string): string => {\n const sha256 = getSha256()\n const h = sha256(id)\n return (\n h.slice(0, 8) +\n '-' +\n h.slice(8, 12) +\n '-' +\n h.slice(12, 16) +\n '-' +\n h.slice(16, 20) +\n '-' +\n h.slice(20, 32)\n )\n}\n\nexport class QdrantVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: true,\n rename: false,\n rawSql: false,\n builtInEncoding: false,\n // Strongly consistent (writes use wait=true): visible on resolve, so the option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n #client: any | null = null\n get #opts() {\n return this.options as QdrantVectorStoreOptions\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 async connect(): Promise<void> {\n if (this.#client) return\n const QdrantClient = await getQdrantClient()\n const c = this.#opts.connection || {}\n this.#client = new QdrantClient({\n url: c.url,\n host: c.host,\n port: c.port,\n apiKey: c.apiKey,\n https: c.https,\n })\n }\n async close(): Promise<void> {\n if (this.#client) {\n await this.#client.close()\n this.#client = null\n }\n }\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n const client = this.#client || (await this.connect(), this.#client!)\n const dist =\n spec.vector.metric === 'cosine' ? 'Cosine' : spec.vector.metric === 'dot' ? 'Dot' : 'Euclid'\n if (ifNotExists && (await this.hasCollection(spec.collection))) return\n try {\n await client.createCollection(spec.collection, {\n vectors: { size: spec.vector.dimensions, distance: dist },\n })\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['createCollection', String(err)])\n }\n }\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n const client = this.#client || (await this.connect(), this.#client!)\n if (ifExists && !(await this.hasCollection(collection))) return\n try {\n await client.deleteCollection(collection)\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', String(err)])\n }\n }\n async hasCollection(collection: string): Promise<boolean> {\n const client = this.#client || (await this.connect(), this.#client!)\n try {\n await client.getCollection(collection)\n return true\n } catch {\n return false\n }\n }\n async renameCollection(_from: string, _to: string): Promise<void> {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'qdrant'])\n }\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const client = this.#client || (await this.connect(), this.#client!)\n const expected = this.#opts.dimensions\n const points: 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 points.push({\n id: uuidFromId(r.id),\n vector,\n payload: { ...r.metadata, __id: r.id, __document: r.document },\n })\n }\n try {\n await client.upsert(plan.collection, { points })\n } catch (err) {\n throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n }\n }\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n const client = this.#client || (await this.connect(), this.#client!)\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 res = await client.scroll(plan.collection, {\n filter: { must: [{ key: '__id', match: { value: plan.near.id } }] },\n limit: 1,\n with_payload: true,\n with_vector: true,\n })\n if (res.points.length === 0) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = res.points[0].vector as number[]\n }\n }\n let hits: any[]\n if (queryVector) {\n const filter = this.translateQdrantFilter(plan.filter)\n const res = await client.search(plan.collection, {\n vector: queryVector,\n limit: plan.topK,\n offset: plan.offset,\n filter,\n with_payload: true,\n with_vector: !!plan.projection.vector,\n })\n hits = res\n } else {\n const filter = this.translateQdrantFilter(plan.filter)\n const res = await client.scroll(plan.collection, {\n filter,\n limit: plan.topK,\n with_payload: true,\n with_vector: !!plan.projection.vector,\n })\n hits = res.points\n }\n const proj = plan.projection\n return hits.map((hit) => this.projectHit(hit, proj, metric))\n }\n async executeDelete(plan: DeletePlan): Promise<void> {\n const client = this.#client || (await this.connect(), this.#client!)\n try {\n if (plan.ids) {\n await client.delete(plan.collection, { points: plan.ids.map(uuidFromId) })\n } else if (plan.filter) {\n await client.delete(plan.collection, { filter: this.translateQdrantFilter(plan.filter) })\n } else {\n await client.delete(plan.collection, { filter: {} })\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n /** Project a raw Qdrant hit into a {@link VectorMatch} per the requested projection, normalizing its score. */\n projectHit(hit: any, projection: any, metric: string): VectorMatch {\n const out: VectorMatch = {}\n const payload = hit.payload || {}\n if (projection.id) {\n out.id = payload.__id\n }\n if (projection.vector && hit.vector) {\n out.vector = hit.vector as number[]\n }\n if (projection.document) {\n out.document = payload.__document\n }\n if (projection.metadata) {\n const meta: Record<string, unknown> = {}\n for (const k in payload) {\n if (k !== '__id' && k !== '__document') {\n meta[k] = payload[k]\n }\n }\n out.metadata = meta as any\n }\n if (projection.score !== false && 'score' in hit) {\n out.score = normalizeScore(\n hit.score as number,\n metric as any,\n metric === 'euclidean' ? 'distance' : 'similarity'\n )\n }\n return out\n }\n /** Instance wrapper over the module-level {@link translateQdrantFilter}. */\n translateQdrantFilter(filter?: VectorFilter): Record<string, unknown> | undefined {\n return translateQdrantFilter(filter)\n }\n}\n"],"mappings":";;;;;;;;;;;AAuBA,IAAa,yBACX,WACwC;CACxC,IAAI,CAAC,QAAQ,OAAO,KAAA;CACpB,IAAI,YAAY,MAAM,GAAG;EACvB,IAAI,OAAO,aAAa,UACtB,OAAO,OAAO;EAEhB,MAAM,IAAI,2CAA2C,CAAC,UAAU,OAAO,OAAO,QAAQ,CAAC,CAAC;CAC1F;CACA,IAAI,kBAAkB,MAAM,GAAG;EAC7B,MAAM,EAAE,OAAO,IAAI,UAAU;EAC7B,IAAI,UAAU,KAAA,GAAW;GACvB,IAAI,OAAO,UACT,OAAO,EAAE,UAAU,CAAC,EAAE,UAAU,EAAE,KAAK,MAAM,EAAE,CAAC,EAAE;GAEpD,MAAM,IAAI,2CAA2C,CAAC,UAAU,EAAE,CAAC;EACrE;EACA,IAAI,OAAO,MACT,OAAO,EAAE,MAAM,CAAC;GAAE,KAAK;GAAO,OAAO,EAAE,MAAM;EAAE,CAAC,EAAE;EAEpD,IAAI,OAAO,MACT,OAAO,EAAE,UAAU,CAAC;GAAE,KAAK;GAAO,OAAO,EAAE,MAAM;EAAE,CAAC,EAAE;EAExD,IAAI,OAAO,MACT,OAAO,EAAE,MAAM,CAAC;GAAE,KAAK;GAAO,OAAO,EAAE,IAAI,MAAM;EAAE,CAAC,EAAE;EAExD,IAAI,OAAO,OACT,OAAO,EAAE,MAAM,CAAC;GAAE,KAAK;GAAO,OAAO,EAAE,KAAK,MAAM;EAAE,CAAC,EAAE;EAEzD,IAAI,OAAO,MACT,OAAO,EAAE,MAAM,CAAC;GAAE,KAAK;GAAO,OAAO,EAAE,IAAI,MAAM;EAAE,CAAC,EAAE;EAExD,IAAI,OAAO,OACT,OAAO,EAAE,MAAM,CAAC;GAAE,KAAK;GAAO,OAAO,EAAE,KAAK,MAAM;EAAE,CAAC,EAAE;EAEzD,IAAI,OAAO,MACT,OAAO,EAAE,MAAM,CAAC;GAAE,KAAK;GAAO,OAAO,EAAE,KAAK,MAAM;EAAE,CAAC,EAAE;EAEzD,IAAI,OAAO,OACT,OAAO,EAAE,UAAU,CAAC;GAAE,KAAK;GAAO,OAAO,EAAE,KAAK,MAAM;EAAE,CAAC,EAAE;EAE7D,IAAI,OAAO,UACT,OAAO,UAAU,QACb,EAAE,MAAM,CAAC,EAAE,UAAU,EAAE,KAAK,MAAM,EAAE,CAAC,EAAE,IACvC,EAAE,UAAU,CAAC,EAAE,UAAU,EAAE,KAAK,MAAM,EAAE,CAAC,EAAE;EAEjD,IAAI,OAAO,YACT,OAAO,EAAE,MAAM,CAAC;GAAE,KAAK;GAAO,OAAO,EAAE,MAAM;EAAE,CAAC,EAAE;EAEpD,MAAM,IAAI,2CAA2C,CAAC,UAAU,EAAE,CAAC;CACrE;CACA,IAAI,cAAc,MAAM,GAAG;EACzB,MAAM,EAAE,KAAK,IAAI,QAAQ;EACzB,IAAI,KAAK;GACP,MAAM,WAAW,IACd,KAAK,MAAM,sBAAsB,CAAC,CAA4B,EAC9D,QAAQ,MAAM,MAAM,KAAA,CAAS;GAChC,IAAI,SAAS,WAAW,GAAG,OAAO,KAAA;GAClC,IAAI,SAAS,WAAW,GAAG,OAAO,SAAS;GAC3C,OAAO,EAAE,MAAM,SAAS;EAC1B;EACA,IAAI,IAAI;GACN,MAAM,WAAW,GACd,KAAK,MAAM,sBAAsB,CAAC,CAA4B,EAC9D,QAAQ,MAAM,MAAM,KAAA,CAAS;GAChC,IAAI,SAAS,WAAW,GAAG,OAAO,KAAA;GAClC,IAAI,SAAS,WAAW,GAAG,OAAO,SAAS;GAC3C,OAAO,EAAE,QAAQ,SAAS;EAC5B;EACA,IAAI,KAAK;GACP,MAAM,QAAQ,sBAAsB,GAAG;GACvC,IAAI,CAAC,OAAO,OAAO,EAAE,UAAU,CAAC,EAAE;GAClC,OAAO,EAAE,UAAU,CAAC,KAAK,EAAE;EAC7B;EACA;CACF;AAEF;AAOA,IAAM,kBAAkB,YAAY;CAClC,IAAI;EAEF,QAAO,MADW,OAAO,2BACd;CACb,QAAQ;EACN,MAAM,IAAI,kCAAkC,CAAC,wBAAwB,CAAC;CACxE;AACF;AAEA,IAAM,kBAAkB;CACtB,IAAI;EAEF,OAAA,UADoB,WACb,EAAI;CACb,QAAQ;EACN,MAAM,IAAI,kCAAkC,CAAC,WAAW,CAAC;CAC3D;AACF;AAEA,IAAM,cAAc,OAAuB;CAEzC,MAAM,IADS,UACL,EAAO,EAAE;CACnB,OACE,EAAE,MAAM,GAAG,CAAC,IACZ,MACA,EAAE,MAAM,GAAG,EAAE,IACb,MACA,EAAE,MAAM,IAAI,EAAE,IACd,MACA,EAAE,MAAM,IAAI,EAAE,IACd,MACA,EAAE,MAAM,IAAI,EAAE;AAElB;AAEA,IAAa,oBAAb,cAAuC,gBAAgB;CACrD,eAAiD;EAC/C,cAAc;EACd,cAAc;EACd,QAAQ;EACR,QAAQ;EACR,iBAAiB;EAEjB,aAAa;GAAE,cAAc;GAAO,SAAS;GAAU,OAAO,CAAC,QAAQ;EAAE;CAC3E;CACA,UAAsB;CACtB,IAAIA,QAAQ;EACV,OAAO,KAAK;CACd;;CAEA,OAAO,cAAuB;EAC5B,OAAO,OAAO,YAAY;CAC5B;CACA,cAAuB;EACrB,OAAO,OAAO,YAAY;CAC5B;CACA,MAAM,UAAyB;EAC7B,IAAI,KAAKC,SAAS;EAClB,MAAM,eAAe,MAAM,gBAAgB;EAC3C,MAAM,IAAI,KAAKD,MAAM,cAAc,CAAC;EACpC,KAAKC,UAAU,IAAI,aAAa;GAC9B,KAAK,EAAE;GACP,MAAM,EAAE;GACR,MAAM,EAAE;GACR,QAAQ,EAAE;GACV,OAAO,EAAE;EACX,CAAC;CACH;CACA,MAAM,QAAuB;EAC3B,IAAI,KAAKA,SAAS;GAChB,MAAM,KAAKA,QAAQ,MAAM;GACzB,KAAKA,UAAU;EACjB;CACF;CACA,MAAM,iBAAiB,MAAsB,aAAqC;EAChF,MAAM,SAAS,KAAKA,YAAY,MAAM,KAAK,QAAQ,GAAG,KAAKA;EAC3D,MAAM,OACJ,KAAK,OAAO,WAAW,WAAW,WAAW,KAAK,OAAO,WAAW,QAAQ,QAAQ;EACtF,IAAI,eAAgB,MAAM,KAAK,cAAc,KAAK,UAAU,GAAI;EAChE,IAAI;GACF,MAAM,OAAO,iBAAiB,KAAK,YAAY,EAC7C,SAAS;IAAE,MAAM,KAAK,OAAO;IAAY,UAAU;GAAK,EAC1D,CAAC;EACH,SAAS,KAAK;GACZ,MAAM,IAAI,iCAAiC,CAAC,oBAAoB,OAAO,GAAG,CAAC,CAAC;EAC9E;CACF;CACA,MAAM,eAAe,YAAoB,UAAkC;EACzE,MAAM,SAAS,KAAKA,YAAY,MAAM,KAAK,QAAQ,GAAG,KAAKA;EAC3D,IAAI,YAAY,CAAE,MAAM,KAAK,cAAc,UAAU,GAAI;EACzD,IAAI;GACF,MAAM,OAAO,iBAAiB,UAAU;EAC1C,SAAS,KAAK;GACZ,MAAM,IAAI,iCAAiC,CAAC,kBAAkB,OAAO,GAAG,CAAC,CAAC;EAC5E;CACF;CACA,MAAM,cAAc,YAAsC;EACxD,MAAM,SAAS,KAAKA,YAAY,MAAM,KAAK,QAAQ,GAAG,KAAKA;EAC3D,IAAI;GACF,MAAM,OAAO,cAAc,UAAU;GACrC,OAAO;EACT,QAAQ;GACN,OAAO;EACT;CACF;CACA,MAAM,iBAAiB,OAAe,KAA4B;EAChE,MAAM,IAAI,qCAAqC,CAAC,oBAAoB,QAAQ,CAAC;CAC/E;CACA,MAAM,cAAc,MAAiC;EACnD,IAAI,KAAK,QAAQ,WAAW,GAAG;EAC/B,gBAAgB,KAAK,OAAO;EAC5B,MAAM,SAAS,KAAKA,YAAY,MAAM,KAAK,QAAQ,GAAG,KAAKA;EAC3D,MAAM,WAAW,KAAKD,MAAM;EAC5B,MAAM,SAAgB,CAAC;EACvB,KAAK,MAAM,KAAK,KAAK,SAAS;GAC5B,IAAI,SAAS,EAAE;GACf,IAAI,CAAC,UAAU,EAAE,UAAU;IACzB,MAAM,CAAC,KAAK,MAAM,KAAK,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU;IACtD,SAAS;GACX;GACA,IAAI,CAAC,QACH,MAAM,IAAI,6BAA6B,CAAC,oCAAoC,CAAC;GAE/E,IAAI,aAAa,KAAA,KAAa,OAAO,WAAW,UAC9C,MAAM,IAAI,kCAAkC,CAAC,UAAU,OAAO,MAAM,CAAC;GAEvE,OAAO,KAAK;IACV,IAAI,WAAW,EAAE,EAAE;IACnB;IACA,SAAS;KAAE,GAAG,EAAE;KAAU,MAAM,EAAE;KAAI,YAAY,EAAE;IAAS;GAC/D,CAAC;EACH;EACA,IAAI;GACF,MAAM,OAAO,OAAO,KAAK,YAAY,EAAE,OAAO,CAAC;EACjD,SAAS,KAAK;GACZ,MAAM,IAAI,6BAA6B,CAAC,OAAO,GAAG,CAAC,CAAC;EACtD;CACF;CACA,MAAM,cAAc,MAA0C;EAC5D,MAAM,SAAS,KAAKC,YAAY,MAAM,KAAK,QAAQ,GAAG,KAAKA;EAC3D,MAAM,SAAS,KAAKD,MAAM,UAAU;EACpC,IAAI;EACJ,IAAI,KAAK;OACH,YAAY,KAAK,MACnB,cAAc,KAAK,KAAK;QACnB,IAAI,gBAAgB,KAAK,MAAM;IACpC,MAAM,CAAC,KAAK,MAAM,KAAK,OAAO,CAAC,KAAK,KAAK,UAAU,GAAG,OAAO;IAC7D,cAAc;GAChB,OAAO,IAAI,QAAQ,KAAK,MAAM;IAC5B,MAAM,MAAM,MAAM,OAAO,OAAO,KAAK,YAAY;KAC/C,QAAQ,EAAE,MAAM,CAAC;MAAE,KAAK;MAAQ,OAAO,EAAE,OAAO,KAAK,KAAK,GAAG;KAAE,CAAC,EAAE;KAClE,OAAO;KACP,cAAc;KACd,aAAa;IACf,CAAC;IACD,IAAI,IAAI,OAAO,WAAW,GACxB,MAAM,IAAI,6BAA6B,CAAC,8BAA8B,KAAK,KAAK,EAAE,CAAC;IAErF,cAAc,IAAI,OAAO,GAAG;GAC9B;;EAEF,IAAI;EACJ,IAAI,aAAa;GACf,MAAM,SAAS,KAAK,sBAAsB,KAAK,MAAM;GASrD,OAAO,MARW,OAAO,OAAO,KAAK,YAAY;IAC/C,QAAQ;IACR,OAAO,KAAK;IACZ,QAAQ,KAAK;IACb;IACA,cAAc;IACd,aAAa,CAAC,CAAC,KAAK,WAAW;GACjC,CAAC;EAEH,OAAO;GACL,MAAM,SAAS,KAAK,sBAAsB,KAAK,MAAM;GAOrD,QAAO,MANW,OAAO,OAAO,KAAK,YAAY;IAC/C;IACA,OAAO,KAAK;IACZ,cAAc;IACd,aAAa,CAAC,CAAC,KAAK,WAAW;GACjC,CAAC,GACU;EACb;EACA,MAAM,OAAO,KAAK;EAClB,OAAO,KAAK,KAAK,QAAQ,KAAK,WAAW,KAAK,MAAM,MAAM,CAAC;CAC7D;CACA,MAAM,cAAc,MAAiC;EACnD,MAAM,SAAS,KAAKC,YAAY,MAAM,KAAK,QAAQ,GAAG,KAAKA;EAC3D,IAAI;GACF,IAAI,KAAK,KACP,MAAM,OAAO,OAAO,KAAK,YAAY,EAAE,QAAQ,KAAK,IAAI,IAAI,UAAU,EAAE,CAAC;QACpE,IAAI,KAAK,QACd,MAAM,OAAO,OAAO,KAAK,YAAY,EAAE,QAAQ,KAAK,sBAAsB,KAAK,MAAM,EAAE,CAAC;QAExF,MAAM,OAAO,OAAO,KAAK,YAAY,EAAE,QAAQ,CAAC,EAAE,CAAC;EAEvD,SAAS,KAAK;GACZ,MAAM,IAAI,6BAA6B,CAAC,OAAO,GAAG,CAAC,CAAC;EACtD;CACF;;CAEA,WAAW,KAAU,YAAiB,QAA6B;EACjE,MAAM,MAAmB,CAAC;EAC1B,MAAM,UAAU,IAAI,WAAW,CAAC;EAChC,IAAI,WAAW,IACb,IAAI,KAAK,QAAQ;EAEnB,IAAI,WAAW,UAAU,IAAI,QAC3B,IAAI,SAAS,IAAI;EAEnB,IAAI,WAAW,UACb,IAAI,WAAW,QAAQ;EAEzB,IAAI,WAAW,UAAU;GACvB,MAAM,OAAgC,CAAC;GACvC,KAAK,MAAM,KAAK,SACd,IAAI,MAAM,UAAU,MAAM,cACxB,KAAK,KAAK,QAAQ;GAGtB,IAAI,WAAW;EACjB;EACA,IAAI,WAAW,UAAU,SAAS,WAAW,KAC3C,IAAI,QAAQ,eACV,IAAI,OACJ,QACA,WAAW,cAAc,aAAa,YACxC;EAEF,OAAO;CACT;;CAEA,sBAAsB,QAA4D;EAChF,OAAO,sBAAsB,MAAM;CACrC;AACF"}
@@ -15,6 +15,7 @@ import type { VectorFilter } from "../filters";
15
15
  import type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from "../plan";
16
16
  import type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from "../types";
17
17
  export interface RedisVectorStoreOptions extends BaseVectorStoreOptions {
18
+ /** Connection and authentication parameters for the backend. */
18
19
  connection?: {
19
20
  url?: string;
20
21
  username?: string;
@@ -30,6 +31,7 @@ export declare const translateRedisFilter: (filter?: VectorFilter) => string;
30
31
  export declare class RedisVectorStore extends BaseVectorStore {
31
32
  #private;
32
33
  readonly capabilities: VectorStoreCapabilities;
34
+ /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
33
35
  static isAvailable(): boolean;
34
36
  isAvailable(): boolean;
35
37
  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");
@@ -110,6 +110,7 @@ var RedisVectorStore = class extends require_batteries_vector_contract.BaseVecto
110
110
  get #opts() {
111
111
  return this.options;
112
112
  }
113
+ /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
113
114
  static isAvailable() {
114
115
  return typeof process !== "undefined";
115
116
  }