@nhtio/adk 1.20260604.0 → 1.20260607.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (358) hide show
  1. package/CHANGELOG.md +261 -0
  2. package/adk-mcp.mjs +1 -1
  3. package/batteries/embeddings/openai/adapter.cjs +1 -1
  4. package/batteries/embeddings/openai/adapter.mjs +1 -1
  5. package/batteries/embeddings/webllm/adapter.cjs +1 -1
  6. package/batteries/embeddings/webllm/adapter.mjs +1 -1
  7. package/batteries/index.d.ts +1 -0
  8. package/batteries/llm/openai_chat_completions/adapter.cjs +6 -6
  9. package/batteries/llm/openai_chat_completions/adapter.cjs.map +1 -1
  10. package/batteries/llm/openai_chat_completions/adapter.mjs +6 -6
  11. package/batteries/llm/openai_chat_completions/adapter.mjs.map +1 -1
  12. package/batteries/llm/openai_chat_completions/helpers.cjs +2 -2
  13. package/batteries/llm/openai_chat_completions/helpers.mjs +2 -2
  14. package/batteries/llm/openai_chat_completions/validation.cjs +2 -2
  15. package/batteries/llm/openai_chat_completions/validation.cjs.map +1 -1
  16. package/batteries/llm/openai_chat_completions/validation.mjs +2 -2
  17. package/batteries/llm/openai_chat_completions/validation.mjs.map +1 -1
  18. package/batteries/llm/webllm_chat_completions/adapter.cjs +6 -6
  19. package/batteries/llm/webllm_chat_completions/adapter.cjs.map +1 -1
  20. package/batteries/llm/webllm_chat_completions/adapter.mjs +6 -6
  21. package/batteries/llm/webllm_chat_completions/adapter.mjs.map +1 -1
  22. package/batteries/llm/webllm_chat_completions/validation.cjs +2 -2
  23. package/batteries/llm/webllm_chat_completions/validation.cjs.map +1 -1
  24. package/batteries/llm/webllm_chat_completions/validation.mjs +2 -2
  25. package/batteries/llm/webllm_chat_completions/validation.mjs.map +1 -1
  26. package/batteries/storage/flydrive.cjs +1 -1
  27. package/batteries/storage/flydrive.mjs +2 -2
  28. package/batteries/storage/in_memory.cjs +1 -1
  29. package/batteries/storage/in_memory.mjs +1 -1
  30. package/batteries/storage/opfs.cjs +1 -1
  31. package/batteries/storage/opfs.mjs +1 -1
  32. package/batteries/tools/color.cjs +2 -2
  33. package/batteries/tools/color.mjs +2 -2
  34. package/batteries/tools/comparison.cjs +3 -3
  35. package/batteries/tools/comparison.mjs +3 -3
  36. package/batteries/tools/data_structure.cjs +3 -3
  37. package/batteries/tools/data_structure.mjs +3 -3
  38. package/batteries/tools/datetime_extended.cjs +2 -2
  39. package/batteries/tools/datetime_extended.mjs +2 -2
  40. package/batteries/tools/datetime_math.cjs +2 -2
  41. package/batteries/tools/datetime_math.mjs +2 -2
  42. package/batteries/tools/encoding.cjs +3 -3
  43. package/batteries/tools/encoding.mjs +3 -3
  44. package/batteries/tools/formatting.cjs +3 -3
  45. package/batteries/tools/formatting.mjs +3 -3
  46. package/batteries/tools/geo_basics.cjs +2 -2
  47. package/batteries/tools/geo_basics.mjs +2 -2
  48. package/batteries/tools/math/index.d.ts +16 -5
  49. package/batteries/tools/math.cjs +340 -22
  50. package/batteries/tools/math.cjs.map +1 -1
  51. package/batteries/tools/math.mjs +338 -21
  52. package/batteries/tools/math.mjs.map +1 -1
  53. package/batteries/tools/memory.cjs +5 -5
  54. package/batteries/tools/memory.mjs +5 -5
  55. package/batteries/tools/parsing.cjs +4 -4
  56. package/batteries/tools/parsing.mjs +4 -4
  57. package/batteries/tools/retrievables.cjs +4 -4
  58. package/batteries/tools/retrievables.mjs +4 -4
  59. package/batteries/tools/standing_instructions.cjs +4 -4
  60. package/batteries/tools/standing_instructions.mjs +4 -4
  61. package/batteries/tools/statistics.cjs +4 -4
  62. package/batteries/tools/statistics.mjs +4 -4
  63. package/batteries/tools/string_processing.cjs +3 -3
  64. package/batteries/tools/string_processing.mjs +3 -3
  65. package/batteries/tools/structured_data.cjs +3 -3
  66. package/batteries/tools/structured_data.mjs +3 -3
  67. package/batteries/tools/text_analysis.cjs +3 -3
  68. package/batteries/tools/text_analysis.mjs +3 -3
  69. package/batteries/tools/text_comparison.cjs +2 -2
  70. package/batteries/tools/text_comparison.mjs +2 -2
  71. package/batteries/tools/time.cjs +2 -2
  72. package/batteries/tools/time.mjs +2 -2
  73. package/batteries/tools/unit_conversion.cjs +2 -2
  74. package/batteries/tools/unit_conversion.mjs +2 -2
  75. package/batteries/vector/arangodb/index.d.ts +38 -0
  76. package/batteries/vector/arangodb.cjs +257 -0
  77. package/batteries/vector/arangodb.cjs.map +1 -0
  78. package/batteries/vector/arangodb.mjs +255 -0
  79. package/batteries/vector/arangodb.mjs.map +1 -0
  80. package/batteries/vector/builder.cjs +297 -0
  81. package/batteries/vector/builder.cjs.map +1 -0
  82. package/batteries/vector/builder.d.ts +87 -0
  83. package/batteries/vector/builder.mjs +294 -0
  84. package/batteries/vector/builder.mjs.map +1 -0
  85. package/batteries/vector/chroma/index.d.ts +32 -0
  86. package/batteries/vector/chroma.cjs +305 -0
  87. package/batteries/vector/chroma.cjs.map +1 -0
  88. package/batteries/vector/chroma.mjs +302 -0
  89. package/batteries/vector/chroma.mjs.map +1 -0
  90. package/batteries/vector/clickhouse/index.d.ts +39 -0
  91. package/batteries/vector/clickhouse.cjs +246 -0
  92. package/batteries/vector/clickhouse.cjs.map +1 -0
  93. package/batteries/vector/clickhouse.mjs +244 -0
  94. package/batteries/vector/clickhouse.mjs.map +1 -0
  95. package/batteries/vector/cloudflare/index.d.ts +43 -0
  96. package/batteries/vector/cloudflare.cjs +397 -0
  97. package/batteries/vector/cloudflare.cjs.map +1 -0
  98. package/batteries/vector/cloudflare.mjs +395 -0
  99. package/batteries/vector/cloudflare.mjs.map +1 -0
  100. package/batteries/vector/conformance/index.d.ts +15 -0
  101. package/batteries/vector/conformance.cjs +209 -0
  102. package/batteries/vector/conformance.cjs.map +1 -0
  103. package/batteries/vector/conformance.mjs +205 -0
  104. package/batteries/vector/conformance.mjs.map +1 -0
  105. package/batteries/vector/contract.cjs +42 -0
  106. package/batteries/vector/contract.cjs.map +1 -0
  107. package/batteries/vector/contract.d.ts +39 -0
  108. package/batteries/vector/contract.mjs +40 -0
  109. package/batteries/vector/contract.mjs.map +1 -0
  110. package/batteries/vector/couchbase/index.d.ts +49 -0
  111. package/batteries/vector/couchbase.cjs +401 -0
  112. package/batteries/vector/couchbase.cjs.map +1 -0
  113. package/batteries/vector/couchbase.mjs +399 -0
  114. package/batteries/vector/couchbase.mjs.map +1 -0
  115. package/batteries/vector/duckdb/index.d.ts +33 -0
  116. package/batteries/vector/duckdb.cjs +218 -0
  117. package/batteries/vector/duckdb.cjs.map +1 -0
  118. package/batteries/vector/duckdb.mjs +216 -0
  119. package/batteries/vector/duckdb.mjs.map +1 -0
  120. package/batteries/vector/elasticsearch/index.d.ts +43 -0
  121. package/batteries/vector/elasticsearch.cjs +306 -0
  122. package/batteries/vector/elasticsearch.cjs.map +1 -0
  123. package/batteries/vector/elasticsearch.mjs +303 -0
  124. package/batteries/vector/elasticsearch.mjs.map +1 -0
  125. package/batteries/vector/exceptions.cjs +126 -0
  126. package/batteries/vector/exceptions.cjs.map +1 -0
  127. package/batteries/vector/exceptions.d.ts +142 -0
  128. package/batteries/vector/exceptions.mjs +107 -0
  129. package/batteries/vector/exceptions.mjs.map +1 -0
  130. package/batteries/vector/factory.cjs +28 -0
  131. package/batteries/vector/factory.cjs.map +1 -0
  132. package/batteries/vector/factory.d.ts +38 -0
  133. package/batteries/vector/factory.mjs +25 -0
  134. package/batteries/vector/factory.mjs.map +1 -0
  135. package/batteries/vector/filters.cjs +107 -0
  136. package/batteries/vector/filters.cjs.map +1 -0
  137. package/batteries/vector/filters.d.ts +34 -0
  138. package/batteries/vector/filters.mjs +99 -0
  139. package/batteries/vector/filters.mjs.map +1 -0
  140. package/batteries/vector/helpers.cjs +23 -0
  141. package/batteries/vector/helpers.cjs.map +1 -0
  142. package/batteries/vector/helpers.d.ts +12 -0
  143. package/batteries/vector/helpers.mjs +17 -0
  144. package/batteries/vector/helpers.mjs.map +1 -0
  145. package/batteries/vector/hnswlib/index.d.ts +35 -0
  146. package/batteries/vector/hnswlib.cjs +237 -0
  147. package/batteries/vector/hnswlib.cjs.map +1 -0
  148. package/batteries/vector/hnswlib.mjs +235 -0
  149. package/batteries/vector/hnswlib.mjs.map +1 -0
  150. package/batteries/vector/in_memory/index.d.ts +23 -0
  151. package/batteries/vector/in_memory.cjs +178 -0
  152. package/batteries/vector/in_memory.cjs.map +1 -0
  153. package/batteries/vector/in_memory.mjs +176 -0
  154. package/batteries/vector/in_memory.mjs.map +1 -0
  155. package/batteries/vector/index.d.ts +18 -0
  156. package/batteries/vector/lancedb/index.d.ts +34 -0
  157. package/batteries/vector/lancedb.cjs +224 -0
  158. package/batteries/vector/lancedb.cjs.map +1 -0
  159. package/batteries/vector/lancedb.mjs +222 -0
  160. package/batteries/vector/lancedb.mjs.map +1 -0
  161. package/batteries/vector/mariadb/index.d.ts +39 -0
  162. package/batteries/vector/mariadb.cjs +228 -0
  163. package/batteries/vector/mariadb.cjs.map +1 -0
  164. package/batteries/vector/mariadb.mjs +226 -0
  165. package/batteries/vector/mariadb.mjs.map +1 -0
  166. package/batteries/vector/meilisearch/index.d.ts +36 -0
  167. package/batteries/vector/meilisearch.cjs +242 -0
  168. package/batteries/vector/meilisearch.cjs.map +1 -0
  169. package/batteries/vector/meilisearch.mjs +240 -0
  170. package/batteries/vector/meilisearch.mjs.map +1 -0
  171. package/batteries/vector/migrate.cjs +54 -0
  172. package/batteries/vector/migrate.cjs.map +1 -0
  173. package/batteries/vector/migrate.d.ts +30 -0
  174. package/batteries/vector/migrate.mjs +52 -0
  175. package/batteries/vector/migrate.mjs.map +1 -0
  176. package/batteries/vector/milvus/index.d.ts +35 -0
  177. package/batteries/vector/milvus.cjs +357 -0
  178. package/batteries/vector/milvus.cjs.map +1 -0
  179. package/batteries/vector/milvus.mjs +354 -0
  180. package/batteries/vector/milvus.mjs.map +1 -0
  181. package/batteries/vector/mongodb/index.d.ts +46 -0
  182. package/batteries/vector/mongodb.cjs +270 -0
  183. package/batteries/vector/mongodb.cjs.map +1 -0
  184. package/batteries/vector/mongodb.mjs +268 -0
  185. package/batteries/vector/mongodb.mjs.map +1 -0
  186. package/batteries/vector/neo4j/index.d.ts +38 -0
  187. package/batteries/vector/neo4j.cjs +231 -0
  188. package/batteries/vector/neo4j.cjs.map +1 -0
  189. package/batteries/vector/neo4j.mjs +229 -0
  190. package/batteries/vector/neo4j.mjs.map +1 -0
  191. package/batteries/vector/opensearch/index.d.ts +46 -0
  192. package/batteries/vector/opensearch.cjs +316 -0
  193. package/batteries/vector/opensearch.cjs.map +1 -0
  194. package/batteries/vector/opensearch.mjs +313 -0
  195. package/batteries/vector/opensearch.mjs.map +1 -0
  196. package/batteries/vector/oracle23ai/index.d.ts +45 -0
  197. package/batteries/vector/oracle23ai.cjs +340 -0
  198. package/batteries/vector/oracle23ai.cjs.map +1 -0
  199. package/batteries/vector/oracle23ai.mjs +338 -0
  200. package/batteries/vector/oracle23ai.mjs.map +1 -0
  201. package/batteries/vector/orama/index.d.ts +23 -0
  202. package/batteries/vector/orama.cjs +272 -0
  203. package/batteries/vector/orama.cjs.map +1 -0
  204. package/batteries/vector/orama.mjs +270 -0
  205. package/batteries/vector/orama.mjs.map +1 -0
  206. package/batteries/vector/pgvector/index.d.ts +43 -0
  207. package/batteries/vector/pgvector.cjs +411 -0
  208. package/batteries/vector/pgvector.cjs.map +1 -0
  209. package/batteries/vector/pgvector.mjs +408 -0
  210. package/batteries/vector/pgvector.mjs.map +1 -0
  211. package/batteries/vector/pinecone/index.d.ts +38 -0
  212. package/batteries/vector/pinecone.cjs +415 -0
  213. package/batteries/vector/pinecone.cjs.map +1 -0
  214. package/batteries/vector/pinecone.mjs +412 -0
  215. package/batteries/vector/pinecone.mjs.map +1 -0
  216. package/batteries/vector/plan.cjs +2 -0
  217. package/batteries/vector/plan.d.ts +65 -0
  218. package/batteries/vector/plan.mjs +0 -0
  219. package/batteries/vector/qdrant/index.d.ts +34 -0
  220. package/batteries/vector/qdrant.cjs +286 -0
  221. package/batteries/vector/qdrant.cjs.map +1 -0
  222. package/batteries/vector/qdrant.mjs +284 -0
  223. package/batteries/vector/qdrant.mjs.map +1 -0
  224. package/batteries/vector/redis/index.d.ts +44 -0
  225. package/batteries/vector/redis.cjs +391 -0
  226. package/batteries/vector/redis.cjs.map +1 -0
  227. package/batteries/vector/redis.mjs +388 -0
  228. package/batteries/vector/redis.mjs.map +1 -0
  229. package/batteries/vector/retrievable.cjs +69 -0
  230. package/batteries/vector/retrievable.cjs.map +1 -0
  231. package/batteries/vector/retrievable.mjs +67 -0
  232. package/batteries/vector/retrievable.mjs.map +1 -0
  233. package/batteries/vector/retrievable_glue.d.ts +24 -0
  234. package/batteries/vector/s3vectors/index.d.ts +52 -0
  235. package/batteries/vector/s3vectors.cjs +438 -0
  236. package/batteries/vector/s3vectors.cjs.map +1 -0
  237. package/batteries/vector/s3vectors.mjs +436 -0
  238. package/batteries/vector/s3vectors.mjs.map +1 -0
  239. package/batteries/vector/schema.cjs +96 -0
  240. package/batteries/vector/schema.cjs.map +1 -0
  241. package/batteries/vector/schema.d.ts +40 -0
  242. package/batteries/vector/schema.mjs +93 -0
  243. package/batteries/vector/schema.mjs.map +1 -0
  244. package/batteries/vector/solr/index.d.ts +36 -0
  245. package/batteries/vector/solr.cjs +230 -0
  246. package/batteries/vector/solr.cjs.map +1 -0
  247. package/batteries/vector/solr.mjs +228 -0
  248. package/batteries/vector/solr.mjs.map +1 -0
  249. package/batteries/vector/sqlite_vec/index.d.ts +30 -0
  250. package/batteries/vector/sqlite_vec.cjs +318 -0
  251. package/batteries/vector/sqlite_vec.cjs.map +1 -0
  252. package/batteries/vector/sqlite_vec.mjs +316 -0
  253. package/batteries/vector/sqlite_vec.mjs.map +1 -0
  254. package/batteries/vector/surrealdb/index.d.ts +37 -0
  255. package/batteries/vector/surrealdb.cjs +230 -0
  256. package/batteries/vector/surrealdb.cjs.map +1 -0
  257. package/batteries/vector/surrealdb.mjs +228 -0
  258. package/batteries/vector/surrealdb.mjs.map +1 -0
  259. package/batteries/vector/types.cjs +2 -0
  260. package/batteries/vector/types.d.ts +100 -0
  261. package/batteries/vector/types.mjs +0 -0
  262. package/batteries/vector/typesense/index.d.ts +38 -0
  263. package/batteries/vector/typesense.cjs +272 -0
  264. package/batteries/vector/typesense.cjs.map +1 -0
  265. package/batteries/vector/typesense.mjs +270 -0
  266. package/batteries/vector/typesense.mjs.map +1 -0
  267. package/batteries/vector/validation.cjs +90 -0
  268. package/batteries/vector/validation.cjs.map +1 -0
  269. package/batteries/vector/validation.d.ts +18 -0
  270. package/batteries/vector/validation.mjs +83 -0
  271. package/batteries/vector/validation.mjs.map +1 -0
  272. package/batteries/vector/vector_store_constructor.cjs +56 -0
  273. package/batteries/vector/vector_store_constructor.cjs.map +1 -0
  274. package/batteries/vector/vector_store_constructor.d.ts +30 -0
  275. package/batteries/vector/vector_store_constructor.mjs +53 -0
  276. package/batteries/vector/vector_store_constructor.mjs.map +1 -0
  277. package/batteries/vector/vespa/index.d.ts +39 -0
  278. package/batteries/vector/vespa.cjs +423 -0
  279. package/batteries/vector/vespa.cjs.map +1 -0
  280. package/batteries/vector/vespa.mjs +421 -0
  281. package/batteries/vector/vespa.mjs.map +1 -0
  282. package/batteries/vector/weaviate/index.d.ts +57 -0
  283. package/batteries/vector/weaviate.cjs +325 -0
  284. package/batteries/vector/weaviate.cjs.map +1 -0
  285. package/batteries/vector/weaviate.mjs +322 -0
  286. package/batteries/vector/weaviate.mjs.map +1 -0
  287. package/batteries/vector.cjs +63 -0
  288. package/batteries/vector.mjs +14 -0
  289. package/batteries.cjs +62 -0
  290. package/batteries.mjs +15 -1
  291. package/{chunk-kRvK8_k2.mjs → chunk-Bpcn9VDT.mjs} +5 -1
  292. package/{common-lMrnzoyn.mjs → common-BT0nfCi9.mjs} +8 -8
  293. package/{common-lMrnzoyn.mjs.map → common-BT0nfCi9.mjs.map} +1 -1
  294. package/{common-D_e5zYsG.js → common-Cj8TaQ9U.js} +8 -8
  295. package/{common-D_e5zYsG.js.map → common-Cj8TaQ9U.js.map} +1 -1
  296. package/common.cjs +7 -7
  297. package/common.mjs +7 -7
  298. package/{dispatch_runner-CpuyATj1.js → dispatch_runner-BHBNupqp.js} +2 -2
  299. package/dispatch_runner-BHBNupqp.js.map +1 -0
  300. package/{dispatch_runner-CDF3X0nv.mjs → dispatch_runner-DPcS7Y_M.mjs} +2 -2
  301. package/dispatch_runner-DPcS7Y_M.mjs.map +1 -0
  302. package/dispatch_runner.cjs +1 -1
  303. package/dispatch_runner.mjs +1 -1
  304. package/forge.cjs +4 -4
  305. package/forge.mjs +4 -4
  306. package/guards.cjs +8 -8
  307. package/guards.mjs +8 -8
  308. package/index.cjs +12 -12
  309. package/index.mjs +12 -12
  310. package/lib/classes/tool_registry.d.ts +70 -4
  311. package/mcp/adk-docs-corpus.json +1 -1
  312. package/package.json +424 -88
  313. package/skills/adk-assembly/SKILL.md +2 -2
  314. package/{spooled_artifact-B8gIIn9h.js → spooled_artifact-BTq6Nzfy.js} +4 -4
  315. package/spooled_artifact-BTq6Nzfy.js.map +1 -0
  316. package/{spooled_artifact-CWoKUDEm.mjs → spooled_artifact-CHoZgWwI.mjs} +4 -4
  317. package/spooled_artifact-CHoZgWwI.mjs.map +1 -0
  318. package/spooled_artifact.cjs +2 -2
  319. package/spooled_artifact.mjs +2 -2
  320. package/{spooled_markdown_artifact-DQX0RCdI.js → spooled_markdown_artifact-CALSDxIx.js} +3 -3
  321. package/{spooled_markdown_artifact-DQX0RCdI.js.map → spooled_markdown_artifact-CALSDxIx.js.map} +1 -1
  322. package/{spooled_markdown_artifact-CNle4jXN.mjs → spooled_markdown_artifact-Ci5UL7l4.mjs} +3 -3
  323. package/{spooled_markdown_artifact-CNle4jXN.mjs.map → spooled_markdown_artifact-Ci5UL7l4.mjs.map} +1 -1
  324. package/src/types/evaluatex.d.ts +31 -0
  325. package/{thought-BD6AkkOr.js → thought-BbwhJ1wb.js} +4 -4
  326. package/thought-BbwhJ1wb.js.map +1 -0
  327. package/{thought-B_P8LiB6.mjs → thought-D34QQZZ9.mjs} +4 -4
  328. package/thought-D34QQZZ9.mjs.map +1 -0
  329. package/{tool-CRZSUcdP.mjs → tool-CMhaDRNd.mjs} +3 -3
  330. package/tool-CMhaDRNd.mjs.map +1 -0
  331. package/{tool-CX9vNHAw.js → tool-CVyZkFC7.js} +3 -3
  332. package/tool-CVyZkFC7.js.map +1 -0
  333. package/{tool_call-BUeMuCc6.mjs → tool_call-CV5qVNlb.mjs} +3 -3
  334. package/{tool_call-BUeMuCc6.mjs.map → tool_call-CV5qVNlb.mjs.map} +1 -1
  335. package/{tool_call--7ti-frB.js → tool_call-Db68hB7y.js} +3 -3
  336. package/{tool_call--7ti-frB.js.map → tool_call-Db68hB7y.js.map} +1 -1
  337. package/{tool_registry-BGHg6KTq.mjs → tool_registry-D1pSSlsd.mjs} +109 -22
  338. package/tool_registry-D1pSSlsd.mjs.map +1 -0
  339. package/{tool_registry-CtCQ4Xoz.js → tool_registry-DYUYqXvo.js} +109 -22
  340. package/tool_registry-DYUYqXvo.js.map +1 -0
  341. package/{turn_runner-BJTtAORU.js → turn_runner-DqWHNP80.js} +5 -5
  342. package/turn_runner-DqWHNP80.js.map +1 -0
  343. package/{turn_runner-C02LZHjt.mjs → turn_runner-fg1Wc3dK.mjs} +5 -5
  344. package/turn_runner-fg1Wc3dK.mjs.map +1 -0
  345. package/turn_runner.cjs +1 -1
  346. package/turn_runner.mjs +1 -1
  347. package/dispatch_runner-CDF3X0nv.mjs.map +0 -1
  348. package/dispatch_runner-CpuyATj1.js.map +0 -1
  349. package/spooled_artifact-B8gIIn9h.js.map +0 -1
  350. package/spooled_artifact-CWoKUDEm.mjs.map +0 -1
  351. package/thought-BD6AkkOr.js.map +0 -1
  352. package/thought-B_P8LiB6.mjs.map +0 -1
  353. package/tool-CRZSUcdP.mjs.map +0 -1
  354. package/tool-CX9vNHAw.js.map +0 -1
  355. package/tool_registry-BGHg6KTq.mjs.map +0 -1
  356. package/tool_registry-CtCQ4Xoz.js.map +0 -1
  357. package/turn_runner-BJTtAORU.js.map +0 -1
  358. package/turn_runner-C02LZHjt.mjs.map +0 -1
@@ -0,0 +1,286 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../chunk-Ble4zEEl.js");
3
+ const require_batteries_vector_filters = require("./filters.cjs");
4
+ const require_batteries_vector_helpers = require("./helpers.cjs");
5
+ const require_batteries_vector_exceptions = require("./exceptions.cjs");
6
+ const require_batteries_vector_contract = require("./contract.cjs");
7
+ const require_batteries_vector_validation = require("./validation.cjs");
8
+ //#region src/batteries/vector/qdrant/index.ts
9
+ /**
10
+ * @module @nhtio/adk/batteries/vector/qdrant
11
+ */
12
+ var translateQdrantFilter = (filter) => {
13
+ if (!filter) return void 0;
14
+ if (require_batteries_vector_filters.isRawFilter(filter)) {
15
+ if (filter.$dialect === "qdrant") return filter.$raw;
16
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(["qdrant", String(filter.$dialect)]);
17
+ }
18
+ if (require_batteries_vector_filters.isFilterCondition(filter)) {
19
+ const { field, op, value } = filter;
20
+ if (value === void 0) {
21
+ if (op === "exists") return { must_not: [{ is_empty: { key: field } }] };
22
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(["qdrant", op]);
23
+ }
24
+ if (op === "eq") return { must: [{
25
+ key: field,
26
+ match: { value }
27
+ }] };
28
+ if (op === "ne") return { must_not: [{
29
+ key: field,
30
+ match: { value }
31
+ }] };
32
+ if (op === "gt") return { must: [{
33
+ key: field,
34
+ range: { gt: value }
35
+ }] };
36
+ if (op === "gte") return { must: [{
37
+ key: field,
38
+ range: { gte: value }
39
+ }] };
40
+ if (op === "lt") return { must: [{
41
+ key: field,
42
+ range: { lt: value }
43
+ }] };
44
+ if (op === "lte") return { must: [{
45
+ key: field,
46
+ range: { lte: value }
47
+ }] };
48
+ if (op === "in") return { must: [{
49
+ key: field,
50
+ match: { any: value }
51
+ }] };
52
+ if (op === "nin") return { must_not: [{
53
+ key: field,
54
+ match: { any: value }
55
+ }] };
56
+ if (op === "exists") return value === false ? { must: [{ is_empty: { key: field } }] } : { must_not: [{ is_empty: { key: field } }] };
57
+ if (op === "contains") return { must: [{
58
+ key: field,
59
+ match: { value }
60
+ }] };
61
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(["qdrant", op]);
62
+ }
63
+ if (require_batteries_vector_filters.isFilterGroup(filter)) {
64
+ const { and, or, not } = filter;
65
+ if (and) {
66
+ const children = and.map((f) => translateQdrantFilter(f)).filter((c) => c !== void 0);
67
+ if (children.length === 0) return void 0;
68
+ if (children.length === 1) return children[0];
69
+ return { must: children };
70
+ }
71
+ if (or) {
72
+ const children = or.map((f) => translateQdrantFilter(f)).filter((c) => c !== void 0);
73
+ if (children.length === 0) return void 0;
74
+ if (children.length === 1) return children[0];
75
+ return { should: children };
76
+ }
77
+ if (not) {
78
+ const child = translateQdrantFilter(not);
79
+ if (!child) return { must_not: [] };
80
+ return { must_not: [child] };
81
+ }
82
+ return;
83
+ }
84
+ };
85
+ var getQdrantClient = async () => {
86
+ try {
87
+ return (await import("@qdrant/js-client-rest")).QdrantClient;
88
+ } catch {
89
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_DRIVER_UNAVAILABLE(["@qdrant/js-client-rest"]);
90
+ }
91
+ };
92
+ var getSha256 = () => {
93
+ try {
94
+ return require("js-sha256").sha256;
95
+ } catch {
96
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_DRIVER_UNAVAILABLE(["js-sha256"]);
97
+ }
98
+ };
99
+ var uuidFromId = (id) => {
100
+ const h = getSha256()(id);
101
+ return h.slice(0, 8) + "-" + h.slice(8, 12) + "-" + h.slice(12, 16) + "-" + h.slice(16, 20) + "-" + h.slice(20, 32);
102
+ };
103
+ var QdrantVectorStore = class extends require_batteries_vector_contract.BaseVectorStore {
104
+ capabilities = {
105
+ transactions: false,
106
+ namedVectors: true,
107
+ rename: false,
108
+ rawSql: false,
109
+ builtInEncoding: false,
110
+ consistency: {
111
+ configurable: false,
112
+ default: "strong",
113
+ modes: ["strong"]
114
+ }
115
+ };
116
+ #client = null;
117
+ get #opts() {
118
+ return this.options;
119
+ }
120
+ static isAvailable() {
121
+ return typeof process !== "undefined";
122
+ }
123
+ isAvailable() {
124
+ return typeof process !== "undefined";
125
+ }
126
+ async connect() {
127
+ if (this.#client) return;
128
+ const QdrantClient = await getQdrantClient();
129
+ const c = this.#opts.connection || {};
130
+ this.#client = new QdrantClient({
131
+ url: c.url,
132
+ host: c.host,
133
+ port: c.port,
134
+ apiKey: c.apiKey,
135
+ https: c.https
136
+ });
137
+ }
138
+ async close() {
139
+ if (this.#client) {
140
+ await this.#client.close();
141
+ this.#client = null;
142
+ }
143
+ }
144
+ async createCollection(spec, ifNotExists) {
145
+ const client = this.#client || (await this.connect(), this.#client);
146
+ const dist = spec.vector.metric === "cosine" ? "Cosine" : spec.vector.metric === "dot" ? "Dot" : "Euclid";
147
+ if (ifNotExists && await this.hasCollection(spec.collection)) return;
148
+ try {
149
+ await client.createCollection(spec.collection, { vectors: {
150
+ size: spec.vector.dimensions,
151
+ distance: dist
152
+ } });
153
+ } catch (err) {
154
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_COLLECTION_FAILED(["createCollection", String(err)]);
155
+ }
156
+ }
157
+ async dropCollection(collection, ifExists) {
158
+ const client = this.#client || (await this.connect(), this.#client);
159
+ if (ifExists && !await this.hasCollection(collection)) return;
160
+ try {
161
+ await client.deleteCollection(collection);
162
+ } catch (err) {
163
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_COLLECTION_FAILED(["dropCollection", String(err)]);
164
+ }
165
+ }
166
+ async hasCollection(collection) {
167
+ const client = this.#client || (await this.connect(), this.#client);
168
+ try {
169
+ await client.getCollection(collection);
170
+ return true;
171
+ } catch {
172
+ return false;
173
+ }
174
+ }
175
+ async renameCollection(_from, _to) {
176
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_UNSUPPORTED_OPERATION(["renameCollection", "qdrant"]);
177
+ }
178
+ async executeUpsert(plan) {
179
+ if (plan.records.length === 0) return;
180
+ require_batteries_vector_validation.validateRecords(plan.records);
181
+ const client = this.#client || (await this.connect(), this.#client);
182
+ const expected = this.#opts.dimensions;
183
+ const points = [];
184
+ for (const r of plan.records) {
185
+ let vector = r.vector;
186
+ if (!vector && r.document) {
187
+ const [v] = await this.encode([r.document], "document");
188
+ vector = v;
189
+ }
190
+ if (!vector) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_UPSERT_FAILED(["Record missing vector and document"]);
191
+ if (expected !== void 0 && vector.length !== expected) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length]);
192
+ points.push({
193
+ id: uuidFromId(r.id),
194
+ vector,
195
+ payload: {
196
+ ...r.metadata,
197
+ __id: r.id,
198
+ __document: r.document
199
+ }
200
+ });
201
+ }
202
+ try {
203
+ await client.upsert(plan.collection, { points });
204
+ } catch (err) {
205
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_UPSERT_FAILED([String(err)]);
206
+ }
207
+ }
208
+ async executeSearch(plan) {
209
+ const client = this.#client || (await this.connect(), this.#client);
210
+ const metric = this.#opts.metric ?? "cosine";
211
+ let queryVector;
212
+ if (plan.near) {
213
+ if ("vector" in plan.near) queryVector = plan.near.vector;
214
+ else if ("serverText" in plan.near) {
215
+ const [v] = await this.encode([plan.near.serverText], "query");
216
+ queryVector = v;
217
+ } else if ("id" in plan.near) {
218
+ const res = await client.scroll(plan.collection, {
219
+ filter: { must: [{
220
+ key: "__id",
221
+ match: { value: plan.near.id }
222
+ }] },
223
+ limit: 1,
224
+ with_payload: true,
225
+ with_vector: true
226
+ });
227
+ if (res.points.length === 0) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_SEARCH_FAILED(["Referenced id not found: " + plan.near.id]);
228
+ queryVector = res.points[0].vector;
229
+ }
230
+ }
231
+ let hits;
232
+ if (queryVector) {
233
+ const filter = this.translateQdrantFilter(plan.filter);
234
+ hits = await client.search(plan.collection, {
235
+ vector: queryVector,
236
+ limit: plan.topK,
237
+ offset: plan.offset,
238
+ filter,
239
+ with_payload: true,
240
+ with_vector: !!plan.projection.vector
241
+ });
242
+ } else {
243
+ const filter = this.translateQdrantFilter(plan.filter);
244
+ hits = (await client.scroll(plan.collection, {
245
+ filter,
246
+ limit: plan.topK,
247
+ with_payload: true,
248
+ with_vector: !!plan.projection.vector
249
+ })).points;
250
+ }
251
+ const proj = plan.projection;
252
+ return hits.map((hit) => this.projectHit(hit, proj, metric));
253
+ }
254
+ async executeDelete(plan) {
255
+ const client = this.#client || (await this.connect(), this.#client);
256
+ try {
257
+ if (plan.ids) await client.delete(plan.collection, { points: plan.ids.map(uuidFromId) });
258
+ else if (plan.filter) await client.delete(plan.collection, { filter: this.translateQdrantFilter(plan.filter) });
259
+ else await client.delete(plan.collection, { filter: {} });
260
+ } catch (err) {
261
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_DELETE_FAILED([String(err)]);
262
+ }
263
+ }
264
+ projectHit(hit, projection, metric) {
265
+ const out = {};
266
+ const payload = hit.payload || {};
267
+ if (projection.id) out.id = payload.__id;
268
+ if (projection.vector && hit.vector) out.vector = hit.vector;
269
+ if (projection.document) out.document = payload.__document;
270
+ if (projection.metadata) {
271
+ const meta = {};
272
+ for (const k in payload) if (k !== "__id" && k !== "__document") meta[k] = payload[k];
273
+ out.metadata = meta;
274
+ }
275
+ if (projection.score !== false && "score" in hit) out.score = require_batteries_vector_helpers.normalizeScore(hit.score, metric, metric === "euclidean" ? "distance" : "similarity");
276
+ return out;
277
+ }
278
+ translateQdrantFilter(filter) {
279
+ return translateQdrantFilter(filter);
280
+ }
281
+ };
282
+ //#endregion
283
+ exports.QdrantVectorStore = QdrantVectorStore;
284
+ exports.translateQdrantFilter = translateQdrantFilter;
285
+
286
+ //# sourceMappingURL=qdrant.cjs.map
@@ -0,0 +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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"}
@@ -0,0 +1,284 @@
1
+ import { i as __require } from "../../chunk-Bpcn9VDT.mjs";
2
+ import { isFilterCondition, isFilterGroup, isRawFilter } from "./filters.mjs";
3
+ import { normalizeScore } from "./helpers.mjs";
4
+ import { E_VECTOR_STORE_COLLECTION_FAILED, E_VECTOR_STORE_DELETE_FAILED, E_VECTOR_STORE_DIMENSION_MISMATCH, E_VECTOR_STORE_DRIVER_UNAVAILABLE, E_VECTOR_STORE_SEARCH_FAILED, E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR, E_VECTOR_STORE_UNSUPPORTED_OPERATION, E_VECTOR_STORE_UPSERT_FAILED } from "./exceptions.mjs";
5
+ import { BaseVectorStore } from "./contract.mjs";
6
+ import { validateRecords } from "./validation.mjs";
7
+ //#region src/batteries/vector/qdrant/index.ts
8
+ /**
9
+ * @module @nhtio/adk/batteries/vector/qdrant
10
+ */
11
+ var translateQdrantFilter = (filter) => {
12
+ if (!filter) return void 0;
13
+ if (isRawFilter(filter)) {
14
+ if (filter.$dialect === "qdrant") return filter.$raw;
15
+ throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(["qdrant", String(filter.$dialect)]);
16
+ }
17
+ if (isFilterCondition(filter)) {
18
+ const { field, op, value } = filter;
19
+ if (value === void 0) {
20
+ if (op === "exists") return { must_not: [{ is_empty: { key: field } }] };
21
+ throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(["qdrant", op]);
22
+ }
23
+ if (op === "eq") return { must: [{
24
+ key: field,
25
+ match: { value }
26
+ }] };
27
+ if (op === "ne") return { must_not: [{
28
+ key: field,
29
+ match: { value }
30
+ }] };
31
+ if (op === "gt") return { must: [{
32
+ key: field,
33
+ range: { gt: value }
34
+ }] };
35
+ if (op === "gte") return { must: [{
36
+ key: field,
37
+ range: { gte: value }
38
+ }] };
39
+ if (op === "lt") return { must: [{
40
+ key: field,
41
+ range: { lt: value }
42
+ }] };
43
+ if (op === "lte") return { must: [{
44
+ key: field,
45
+ range: { lte: value }
46
+ }] };
47
+ if (op === "in") return { must: [{
48
+ key: field,
49
+ match: { any: value }
50
+ }] };
51
+ if (op === "nin") return { must_not: [{
52
+ key: field,
53
+ match: { any: value }
54
+ }] };
55
+ if (op === "exists") return value === false ? { must: [{ is_empty: { key: field } }] } : { must_not: [{ is_empty: { key: field } }] };
56
+ if (op === "contains") return { must: [{
57
+ key: field,
58
+ match: { value }
59
+ }] };
60
+ throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(["qdrant", op]);
61
+ }
62
+ if (isFilterGroup(filter)) {
63
+ const { and, or, not } = filter;
64
+ if (and) {
65
+ const children = and.map((f) => translateQdrantFilter(f)).filter((c) => c !== void 0);
66
+ if (children.length === 0) return void 0;
67
+ if (children.length === 1) return children[0];
68
+ return { must: children };
69
+ }
70
+ if (or) {
71
+ const children = or.map((f) => translateQdrantFilter(f)).filter((c) => c !== void 0);
72
+ if (children.length === 0) return void 0;
73
+ if (children.length === 1) return children[0];
74
+ return { should: children };
75
+ }
76
+ if (not) {
77
+ const child = translateQdrantFilter(not);
78
+ if (!child) return { must_not: [] };
79
+ return { must_not: [child] };
80
+ }
81
+ return;
82
+ }
83
+ };
84
+ var getQdrantClient = async () => {
85
+ try {
86
+ return (await import("@qdrant/js-client-rest")).QdrantClient;
87
+ } catch {
88
+ throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(["@qdrant/js-client-rest"]);
89
+ }
90
+ };
91
+ var getSha256 = () => {
92
+ try {
93
+ return __require("js-sha256").sha256;
94
+ } catch {
95
+ throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(["js-sha256"]);
96
+ }
97
+ };
98
+ var uuidFromId = (id) => {
99
+ const h = getSha256()(id);
100
+ return h.slice(0, 8) + "-" + h.slice(8, 12) + "-" + h.slice(12, 16) + "-" + h.slice(16, 20) + "-" + h.slice(20, 32);
101
+ };
102
+ var QdrantVectorStore = class extends BaseVectorStore {
103
+ capabilities = {
104
+ transactions: false,
105
+ namedVectors: true,
106
+ rename: false,
107
+ rawSql: false,
108
+ builtInEncoding: false,
109
+ consistency: {
110
+ configurable: false,
111
+ default: "strong",
112
+ modes: ["strong"]
113
+ }
114
+ };
115
+ #client = null;
116
+ get #opts() {
117
+ return this.options;
118
+ }
119
+ static isAvailable() {
120
+ return typeof process !== "undefined";
121
+ }
122
+ isAvailable() {
123
+ return typeof process !== "undefined";
124
+ }
125
+ async connect() {
126
+ if (this.#client) return;
127
+ const QdrantClient = await getQdrantClient();
128
+ const c = this.#opts.connection || {};
129
+ this.#client = new QdrantClient({
130
+ url: c.url,
131
+ host: c.host,
132
+ port: c.port,
133
+ apiKey: c.apiKey,
134
+ https: c.https
135
+ });
136
+ }
137
+ async close() {
138
+ if (this.#client) {
139
+ await this.#client.close();
140
+ this.#client = null;
141
+ }
142
+ }
143
+ async createCollection(spec, ifNotExists) {
144
+ const client = this.#client || (await this.connect(), this.#client);
145
+ const dist = spec.vector.metric === "cosine" ? "Cosine" : spec.vector.metric === "dot" ? "Dot" : "Euclid";
146
+ if (ifNotExists && await this.hasCollection(spec.collection)) return;
147
+ try {
148
+ await client.createCollection(spec.collection, { vectors: {
149
+ size: spec.vector.dimensions,
150
+ distance: dist
151
+ } });
152
+ } catch (err) {
153
+ throw new E_VECTOR_STORE_COLLECTION_FAILED(["createCollection", String(err)]);
154
+ }
155
+ }
156
+ async dropCollection(collection, ifExists) {
157
+ const client = this.#client || (await this.connect(), this.#client);
158
+ if (ifExists && !await this.hasCollection(collection)) return;
159
+ try {
160
+ await client.deleteCollection(collection);
161
+ } catch (err) {
162
+ throw new E_VECTOR_STORE_COLLECTION_FAILED(["dropCollection", String(err)]);
163
+ }
164
+ }
165
+ async hasCollection(collection) {
166
+ const client = this.#client || (await this.connect(), this.#client);
167
+ try {
168
+ await client.getCollection(collection);
169
+ return true;
170
+ } catch {
171
+ return false;
172
+ }
173
+ }
174
+ async renameCollection(_from, _to) {
175
+ throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(["renameCollection", "qdrant"]);
176
+ }
177
+ async executeUpsert(plan) {
178
+ if (plan.records.length === 0) return;
179
+ validateRecords(plan.records);
180
+ const client = this.#client || (await this.connect(), this.#client);
181
+ const expected = this.#opts.dimensions;
182
+ const points = [];
183
+ for (const r of plan.records) {
184
+ let vector = r.vector;
185
+ if (!vector && r.document) {
186
+ const [v] = await this.encode([r.document], "document");
187
+ vector = v;
188
+ }
189
+ if (!vector) throw new E_VECTOR_STORE_UPSERT_FAILED(["Record missing vector and document"]);
190
+ if (expected !== void 0 && vector.length !== expected) throw new E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length]);
191
+ points.push({
192
+ id: uuidFromId(r.id),
193
+ vector,
194
+ payload: {
195
+ ...r.metadata,
196
+ __id: r.id,
197
+ __document: r.document
198
+ }
199
+ });
200
+ }
201
+ try {
202
+ await client.upsert(plan.collection, { points });
203
+ } catch (err) {
204
+ throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)]);
205
+ }
206
+ }
207
+ async executeSearch(plan) {
208
+ const client = this.#client || (await this.connect(), this.#client);
209
+ const metric = this.#opts.metric ?? "cosine";
210
+ let queryVector;
211
+ if (plan.near) {
212
+ if ("vector" in plan.near) queryVector = plan.near.vector;
213
+ else if ("serverText" in plan.near) {
214
+ const [v] = await this.encode([plan.near.serverText], "query");
215
+ queryVector = v;
216
+ } else if ("id" in plan.near) {
217
+ const res = await client.scroll(plan.collection, {
218
+ filter: { must: [{
219
+ key: "__id",
220
+ match: { value: plan.near.id }
221
+ }] },
222
+ limit: 1,
223
+ with_payload: true,
224
+ with_vector: true
225
+ });
226
+ if (res.points.length === 0) throw new E_VECTOR_STORE_SEARCH_FAILED(["Referenced id not found: " + plan.near.id]);
227
+ queryVector = res.points[0].vector;
228
+ }
229
+ }
230
+ let hits;
231
+ if (queryVector) {
232
+ const filter = this.translateQdrantFilter(plan.filter);
233
+ hits = await client.search(plan.collection, {
234
+ vector: queryVector,
235
+ limit: plan.topK,
236
+ offset: plan.offset,
237
+ filter,
238
+ with_payload: true,
239
+ with_vector: !!plan.projection.vector
240
+ });
241
+ } else {
242
+ const filter = this.translateQdrantFilter(plan.filter);
243
+ hits = (await client.scroll(plan.collection, {
244
+ filter,
245
+ limit: plan.topK,
246
+ with_payload: true,
247
+ with_vector: !!plan.projection.vector
248
+ })).points;
249
+ }
250
+ const proj = plan.projection;
251
+ return hits.map((hit) => this.projectHit(hit, proj, metric));
252
+ }
253
+ async executeDelete(plan) {
254
+ const client = this.#client || (await this.connect(), this.#client);
255
+ try {
256
+ if (plan.ids) await client.delete(plan.collection, { points: plan.ids.map(uuidFromId) });
257
+ else if (plan.filter) await client.delete(plan.collection, { filter: this.translateQdrantFilter(plan.filter) });
258
+ else await client.delete(plan.collection, { filter: {} });
259
+ } catch (err) {
260
+ throw new E_VECTOR_STORE_DELETE_FAILED([String(err)]);
261
+ }
262
+ }
263
+ projectHit(hit, projection, metric) {
264
+ const out = {};
265
+ const payload = hit.payload || {};
266
+ if (projection.id) out.id = payload.__id;
267
+ if (projection.vector && hit.vector) out.vector = hit.vector;
268
+ if (projection.document) out.document = payload.__document;
269
+ if (projection.metadata) {
270
+ const meta = {};
271
+ for (const k in payload) if (k !== "__id" && k !== "__document") meta[k] = payload[k];
272
+ out.metadata = meta;
273
+ }
274
+ if (projection.score !== false && "score" in hit) out.score = normalizeScore(hit.score, metric, metric === "euclidean" ? "distance" : "similarity");
275
+ return out;
276
+ }
277
+ translateQdrantFilter(filter) {
278
+ return translateQdrantFilter(filter);
279
+ }
280
+ };
281
+ //#endregion
282
+ export { QdrantVectorStore, translateQdrantFilter };
283
+
284
+ //# sourceMappingURL=qdrant.mjs.map
@@ -0,0 +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":"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"}