@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,226 @@
1
+ import { s as isInstanceOf } from "../../tool_registry-D1pSSlsd.mjs";
2
+ import "../../guards.mjs";
3
+ import { evaluateFilter } from "./filters.mjs";
4
+ import { normalizeScore } from "./helpers.mjs";
5
+ import { E_VECTOR_STORE_COLLECTION_FAILED, E_VECTOR_STORE_CONNECTION_FAILED, E_VECTOR_STORE_DELETE_FAILED, E_VECTOR_STORE_DIMENSION_MISMATCH, E_VECTOR_STORE_DRIVER_UNAVAILABLE, E_VECTOR_STORE_SEARCH_FAILED, E_VECTOR_STORE_UNSUPPORTED_OPERATION, E_VECTOR_STORE_UPSERT_FAILED } from "./exceptions.mjs";
6
+ import { BaseVectorStore } from "./contract.mjs";
7
+ import { validateRecords } from "./validation.mjs";
8
+ //#region src/batteries/vector/mariadb/index.ts
9
+ /**
10
+ * @module @nhtio/adk/batteries/vector/mariadb
11
+ *
12
+ * MariaDB adapter (native VECTOR type, 11.7+). Vectors live in a `VECTOR(N)` column written
13
+ * with `VEC_FromText('[...]')` and read with `VEC_ToText(vec)`; KNN uses
14
+ * `VEC_DISTANCE_COSINE` / `VEC_DISTANCE_EUCLIDEAN` ordered ascending. Metadata is a `JSON`
15
+ * column. The neutral filter tree is evaluated with the JS reference evaluator for exact
16
+ * cross-adapter parity. Each collection is a table.
17
+ *
18
+ * Driver: `mariadb` (pure JS, pooled).
19
+ */
20
+ var getMariaDB = async () => {
21
+ try {
22
+ const mod = await import("mariadb");
23
+ return mod.default ?? mod;
24
+ } catch {
25
+ throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(["mariadb"]);
26
+ }
27
+ };
28
+ var distanceFn = (metric) => metric === "euclidean" ? "VEC_DISTANCE_EUCLIDEAN" : "VEC_DISTANCE_COSINE";
29
+ var ident = (name) => "`" + name.replace(/`/g, "``") + "`";
30
+ var MariaDBVectorStore = class extends BaseVectorStore {
31
+ capabilities = {
32
+ transactions: true,
33
+ namedVectors: false,
34
+ rename: true,
35
+ rawSql: true,
36
+ builtInEncoding: false,
37
+ consistency: {
38
+ configurable: false,
39
+ default: "strong",
40
+ modes: ["strong"]
41
+ }
42
+ };
43
+ #pool = null;
44
+ #dims = /* @__PURE__ */ new Map();
45
+ get #opts() {
46
+ return this.options;
47
+ }
48
+ static isAvailable() {
49
+ return typeof process !== "undefined";
50
+ }
51
+ isAvailable() {
52
+ return typeof process !== "undefined";
53
+ }
54
+ async connect() {
55
+ if (this.#pool) return;
56
+ const mariadb = await getMariaDB();
57
+ const c = this.#opts.connection || {};
58
+ try {
59
+ this.#pool = mariadb.createPool({
60
+ host: c.host ?? "localhost",
61
+ port: c.port ?? 3306,
62
+ user: c.user ?? "root",
63
+ password: c.password,
64
+ database: c.database,
65
+ connectionLimit: c.connectionLimit ?? 4
66
+ });
67
+ } catch (err) {
68
+ throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)]);
69
+ }
70
+ }
71
+ async close() {
72
+ if (this.#pool) {
73
+ await this.#pool.end();
74
+ this.#pool = null;
75
+ }
76
+ }
77
+ async #ensure() {
78
+ if (!this.#pool) await this.connect();
79
+ return this.#pool;
80
+ }
81
+ async #query(sql, params) {
82
+ return await (await this.#ensure()).query(sql, params);
83
+ }
84
+ #parseVec(text) {
85
+ if (typeof text !== "string") return [];
86
+ try {
87
+ return JSON.parse(text);
88
+ } catch {
89
+ return [];
90
+ }
91
+ }
92
+ #parseMeta(val) {
93
+ if (val === null || val === void 0) return {};
94
+ if (typeof val === "string") try {
95
+ return JSON.parse(val);
96
+ } catch {
97
+ return {};
98
+ }
99
+ if (typeof val === "object") return val;
100
+ return {};
101
+ }
102
+ async createCollection(spec, ifNotExists) {
103
+ this.#dims.set(spec.collection, spec.vector.dimensions);
104
+ const ine = ifNotExists ? "IF NOT EXISTS " : "";
105
+ try {
106
+ await this.#query(`CREATE TABLE ${ine}${ident(spec.collection)} (id VARCHAR(255) PRIMARY KEY, vec VECTOR(${spec.vector.dimensions}) NOT NULL, document TEXT, metadata JSON, VECTOR INDEX (vec))`);
107
+ } catch (err) {
108
+ throw new E_VECTOR_STORE_COLLECTION_FAILED(["createCollection", String(err)]);
109
+ }
110
+ }
111
+ async dropCollection(collection, ifExists) {
112
+ const ie = ifExists ? "IF EXISTS " : "";
113
+ try {
114
+ await this.#query(`DROP TABLE ${ie}${ident(collection)}`);
115
+ this.#dims.delete(collection);
116
+ } catch (err) {
117
+ throw new E_VECTOR_STORE_COLLECTION_FAILED(["dropCollection", String(err)]);
118
+ }
119
+ }
120
+ async hasCollection(collection) {
121
+ return (await this.#query(`SELECT 1 FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = ?`, [collection])).length > 0;
122
+ }
123
+ async renameCollection(from, to) {
124
+ try {
125
+ await this.#query(`RENAME TABLE ${ident(from)} TO ${ident(to)}`);
126
+ const d = this.#dims.get(from);
127
+ if (d !== void 0) {
128
+ this.#dims.set(to, d);
129
+ this.#dims.delete(from);
130
+ }
131
+ } catch (err) {
132
+ throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(["renameCollection", String(err)]);
133
+ }
134
+ }
135
+ async executeUpsert(plan) {
136
+ if (plan.records.length === 0) return;
137
+ validateRecords(plan.records);
138
+ const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection);
139
+ try {
140
+ for (const r of plan.records) {
141
+ let vector = r.vector;
142
+ if (!vector && r.document) {
143
+ const [v] = await this.encode([r.document], "document");
144
+ vector = v;
145
+ }
146
+ if (!vector) throw new E_VECTOR_STORE_UPSERT_FAILED(["Record missing vector and document"]);
147
+ if (expected !== void 0 && vector.length !== expected) throw new E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length]);
148
+ const vecText = `[${vector.join(",")}]`;
149
+ const meta = r.metadata ? JSON.stringify(r.metadata) : "{}";
150
+ await this.#query(`INSERT INTO ${ident(plan.collection)} (id, vec, document, metadata) VALUES (?, VEC_FromText(?), ?, ?) ON DUPLICATE KEY UPDATE vec = VEC_FromText(?), document = ?, metadata = ?`, [
151
+ r.id,
152
+ vecText,
153
+ r.document ?? "",
154
+ meta,
155
+ vecText,
156
+ r.document ?? "",
157
+ meta
158
+ ]);
159
+ }
160
+ } catch (err) {
161
+ if (isInstanceOf(err, "E_VECTOR_STORE_DIMENSION_MISMATCH", E_VECTOR_STORE_DIMENSION_MISMATCH) || isInstanceOf(err, "E_VECTOR_STORE_UPSERT_FAILED", E_VECTOR_STORE_UPSERT_FAILED)) throw err;
162
+ throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)]);
163
+ }
164
+ }
165
+ async executeSearch(plan) {
166
+ const metric = this.#opts.metric ?? "cosine";
167
+ let queryVector;
168
+ if (plan.near) {
169
+ if ("vector" in plan.near) queryVector = plan.near.vector;
170
+ else if ("serverText" in plan.near) {
171
+ const [v] = await this.encode([plan.near.serverText], "query");
172
+ queryVector = v;
173
+ } else if ("id" in plan.near) {
174
+ const rows = await this.#query(`SELECT VEC_ToText(vec) vec FROM ${ident(plan.collection)} WHERE id = ?`, [plan.near.id]);
175
+ if (rows.length === 0) throw new E_VECTOR_STORE_SEARCH_FAILED(["Referenced id not found: " + plan.near.id]);
176
+ queryVector = this.#parseVec(rows[0].vec);
177
+ }
178
+ }
179
+ const offset = plan.offset ?? 0;
180
+ try {
181
+ if (queryVector) {
182
+ const fn = distanceFn(metric);
183
+ const vecText = `[${queryVector.join(",")}]`;
184
+ const rows = await this.#query(`SELECT id, VEC_ToText(vec) vec, document, metadata, ${fn}(vec, VEC_FromText(?)) __dist FROM ${ident(plan.collection)}`, [vecText]);
185
+ const filtered = plan.filter ? rows.filter((row) => evaluateFilter(plan.filter, this.#parseMeta(row.metadata))) : rows;
186
+ filtered.sort((a, b) => Number(a.__dist) - Number(b.__dist));
187
+ return filtered.slice(offset, offset + plan.topK).map((row) => this.#project(row, plan, metric, true));
188
+ } else {
189
+ const rows = await this.#query(`SELECT id, VEC_ToText(vec) vec, document, metadata FROM ${ident(plan.collection)}`);
190
+ return (plan.filter ? rows.filter((row) => evaluateFilter(plan.filter, this.#parseMeta(row.metadata))) : rows).slice(offset, offset + plan.topK).map((row) => this.#project(row, plan, metric, false));
191
+ }
192
+ } catch (err) {
193
+ throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)]);
194
+ }
195
+ }
196
+ #project(row, plan, metric, isKnn) {
197
+ const proj = plan.projection;
198
+ const out = {};
199
+ if (proj.id) out.id = row.id;
200
+ if (proj.vector) out.vector = this.#parseVec(row.vec);
201
+ if (proj.document) out.document = row.document ?? void 0;
202
+ if (proj.metadata) out.metadata = this.#parseMeta(row.metadata);
203
+ if (isKnn && row.__dist !== void 0 && row.__dist !== null) out.score = normalizeScore(Number(row.__dist), metric, "distance");
204
+ return out;
205
+ }
206
+ async executeDelete(plan) {
207
+ try {
208
+ if (plan.ids && plan.ids.length > 0) {
209
+ const placeholders = plan.ids.map(() => "?").join(", ");
210
+ await this.#query(`DELETE FROM ${ident(plan.collection)} WHERE id IN (${placeholders})`, plan.ids);
211
+ } else if (plan.filter) {
212
+ const targets = (await this.#query(`SELECT id, metadata FROM ${ident(plan.collection)}`)).filter((row) => evaluateFilter(plan.filter, this.#parseMeta(row.metadata))).map((row) => row.id);
213
+ if (targets.length > 0) {
214
+ const placeholders = targets.map(() => "?").join(", ");
215
+ await this.#query(`DELETE FROM ${ident(plan.collection)} WHERE id IN (${placeholders})`, targets);
216
+ }
217
+ } else await this.#query(`DELETE FROM ${ident(plan.collection)}`);
218
+ } catch (err) {
219
+ throw new E_VECTOR_STORE_DELETE_FAILED([String(err)]);
220
+ }
221
+ }
222
+ };
223
+ //#endregion
224
+ export { MariaDBVectorStore };
225
+
226
+ //# sourceMappingURL=mariadb.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mariadb.mjs","names":["#opts","#pool","#ensure","#query","#dims","#parseVec","#parseMeta","#project"],"sources":["../../../src/batteries/vector/mariadb/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/mariadb\n *\n * MariaDB adapter (native VECTOR type, 11.7+). Vectors live in a `VECTOR(N)` column written\n * with `VEC_FromText('[...]')` and read with `VEC_ToText(vec)`; KNN uses\n * `VEC_DISTANCE_COSINE` / `VEC_DISTANCE_EUCLIDEAN` ordered ascending. Metadata is a `JSON`\n * column. The neutral filter tree is evaluated with the JS reference evaluator for exact\n * cross-adapter parity. Each collection is a table.\n *\n * Driver: `mariadb` (pure JS, pooled).\n */\n\nimport { evaluateFilter } from '../filters'\nimport { normalizeScore } from '../helpers'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { isInstanceOf } from '@nhtio/adk/guards'\nimport {\n E_VECTOR_STORE_DRIVER_UNAVAILABLE,\n E_VECTOR_STORE_CONNECTION_FAILED,\n E_VECTOR_STORE_COLLECTION_FAILED,\n E_VECTOR_STORE_UPSERT_FAILED,\n E_VECTOR_STORE_SEARCH_FAILED,\n E_VECTOR_STORE_DELETE_FAILED,\n E_VECTOR_STORE_DIMENSION_MISMATCH,\n E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n} from '../exceptions'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type {\n VectorMatch,\n VectorStoreCapabilities,\n BaseVectorStoreOptions,\n VectorMetadata,\n DistanceMetric,\n} from '../types'\n\nexport interface MariaDBVectorStoreOptions extends BaseVectorStoreOptions {\n connection?: {\n host?: string\n port?: number\n user?: string\n password?: string\n database?: string\n connectionLimit?: number\n }\n}\n\nconst getMariaDB = async () => {\n try {\n const mod = await import('mariadb')\n return (mod as any).default ?? mod\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['mariadb'])\n }\n}\n\nconst distanceFn = (metric: DistanceMetric): string =>\n metric === 'euclidean' ? 'VEC_DISTANCE_EUCLIDEAN' : 'VEC_DISTANCE_COSINE'\n\n// Backtick-quoted identifier.\nconst ident = (name: string): string => '`' + name.replace(/`/g, '``') + '`'\n\nexport class MariaDBVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: true,\n namedVectors: false,\n rename: true,\n rawSql: true,\n builtInEncoding: false,\n // SQL backend, synchronous on commit: a write is visible on resolve. The option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n\n #pool: any | null = null\n #dims: Map<string, number> = new Map()\n\n get #opts(): MariaDBVectorStoreOptions {\n return this.options as MariaDBVectorStoreOptions\n }\n\n static isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n\n async connect(): Promise<void> {\n if (this.#pool) return\n const mariadb = await getMariaDB()\n const c = this.#opts.connection || {}\n try {\n this.#pool = mariadb.createPool({\n host: c.host ?? 'localhost',\n port: c.port ?? 3306,\n user: c.user ?? 'root',\n password: c.password,\n database: c.database,\n connectionLimit: c.connectionLimit ?? 4,\n })\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n\n async close(): Promise<void> {\n if (this.#pool) {\n await this.#pool.end()\n this.#pool = null\n }\n }\n\n async #ensure(): Promise<any> {\n if (!this.#pool) await this.connect()\n return this.#pool!\n }\n\n async #query(sql: string, params?: unknown[]): Promise<any[]> {\n const pool = await this.#ensure()\n return await pool.query(sql, params)\n }\n\n // VEC_ToText returns \"[1,0,0]\"; parse into number[].\n #parseVec(text: unknown): number[] {\n if (typeof text !== 'string') return []\n try {\n return JSON.parse(text) as number[]\n } catch {\n return []\n }\n }\n\n #parseMeta(val: unknown): VectorMetadata {\n if (val === null || val === undefined) return {}\n if (typeof val === 'string') {\n try {\n return JSON.parse(val) as VectorMetadata\n } catch {\n return {}\n }\n }\n if (typeof val === 'object') return val as VectorMetadata\n return {}\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n this.#dims.set(spec.collection, spec.vector.dimensions)\n const ine = ifNotExists ? 'IF NOT EXISTS ' : ''\n try {\n await this.#query(\n `CREATE TABLE ${ine}${ident(spec.collection)} (` +\n `id VARCHAR(255) PRIMARY KEY, ` +\n `vec VECTOR(${spec.vector.dimensions}) NOT NULL, ` +\n `document TEXT, ` +\n `metadata JSON, ` +\n `VECTOR INDEX (vec))`\n )\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['createCollection', String(err)])\n }\n }\n\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n const ie = ifExists ? 'IF EXISTS ' : ''\n try {\n await this.#query(`DROP TABLE ${ie}${ident(collection)}`)\n this.#dims.delete(collection)\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', String(err)])\n }\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n const rows = await this.#query(\n `SELECT 1 FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = ?`,\n [collection]\n )\n return rows.length > 0\n }\n\n async renameCollection(from: string, to: string): Promise<void> {\n try {\n await this.#query(`RENAME TABLE ${ident(from)} TO ${ident(to)}`)\n const d = this.#dims.get(from)\n if (d !== undefined) {\n this.#dims.set(to, d)\n this.#dims.delete(from)\n }\n } catch (err) {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', String(err)])\n }\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection)\n try {\n for (const r of plan.records) {\n let vector = r.vector\n if (!vector && r.document) {\n const [v] = await this.encode([r.document], 'document')\n vector = v\n }\n if (!vector) {\n throw new E_VECTOR_STORE_UPSERT_FAILED(['Record missing vector and document'])\n }\n if (expected !== undefined && vector.length !== expected) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length])\n }\n const vecText = `[${vector.join(',')}]`\n const meta = r.metadata ? JSON.stringify(r.metadata) : '{}'\n await this.#query(\n `INSERT INTO ${ident(plan.collection)} (id, vec, document, metadata) ` +\n `VALUES (?, VEC_FromText(?), ?, ?) ` +\n `ON DUPLICATE KEY UPDATE vec = VEC_FromText(?), document = ?, metadata = ?`,\n [r.id, vecText, r.document ?? '', meta, vecText, r.document ?? '', meta]\n )\n }\n } catch (err) {\n if (\n isInstanceOf(err, 'E_VECTOR_STORE_DIMENSION_MISMATCH', E_VECTOR_STORE_DIMENSION_MISMATCH) ||\n isInstanceOf(err, 'E_VECTOR_STORE_UPSERT_FAILED', E_VECTOR_STORE_UPSERT_FAILED)\n ) {\n throw err\n }\n throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n }\n }\n\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n const metric = this.#opts.metric ?? 'cosine'\n let queryVector: number[] | undefined\n if (plan.near) {\n if ('vector' in plan.near) {\n queryVector = plan.near.vector\n } else if ('serverText' in plan.near) {\n const [v] = await this.encode([plan.near.serverText], 'query')\n queryVector = v\n } else if ('id' in plan.near) {\n const rows = await this.#query(\n `SELECT VEC_ToText(vec) vec FROM ${ident(plan.collection)} WHERE id = ?`,\n [plan.near.id]\n )\n if (rows.length === 0) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = this.#parseVec(rows[0].vec)\n }\n }\n\n const offset = plan.offset ?? 0\n try {\n if (queryVector) {\n const fn = distanceFn(metric)\n const vecText = `[${queryVector.join(',')}]`\n const rows = await this.#query(\n `SELECT id, VEC_ToText(vec) vec, document, metadata, ` +\n `${fn}(vec, VEC_FromText(?)) __dist FROM ${ident(plan.collection)}`,\n [vecText]\n )\n const filtered = plan.filter\n ? rows.filter((row) => evaluateFilter(plan.filter!, this.#parseMeta(row.metadata)))\n : rows\n filtered.sort((a, b) => Number(a.__dist) - Number(b.__dist))\n return filtered\n .slice(offset, offset + plan.topK)\n .map((row) => this.#project(row, plan, metric, true))\n } else {\n const rows = await this.#query(\n `SELECT id, VEC_ToText(vec) vec, document, metadata FROM ${ident(plan.collection)}`\n )\n const filtered = plan.filter\n ? rows.filter((row) => evaluateFilter(plan.filter!, this.#parseMeta(row.metadata)))\n : rows\n return filtered\n .slice(offset, offset + plan.topK)\n .map((row) => this.#project(row, plan, metric, false))\n }\n } catch (err) {\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\n }\n\n #project(row: any, plan: SearchPlan, metric: string, isKnn: boolean): VectorMatch {\n const proj = plan.projection\n const out: VectorMatch = {}\n if (proj.id) out.id = row.id as string\n if (proj.vector) out.vector = this.#parseVec(row.vec)\n if (proj.document) out.document = (row.document ?? undefined) as string | undefined\n if (proj.metadata) out.metadata = this.#parseMeta(row.metadata)\n if (isKnn && row.__dist !== undefined && row.__dist !== null) {\n out.score = normalizeScore(Number(row.__dist), metric as DistanceMetric, 'distance')\n }\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n try {\n if (plan.ids && plan.ids.length > 0) {\n const placeholders = plan.ids.map(() => '?').join(', ')\n await this.#query(\n `DELETE FROM ${ident(plan.collection)} WHERE id IN (${placeholders})`,\n plan.ids\n )\n } else if (plan.filter) {\n const rows = await this.#query(`SELECT id, metadata FROM ${ident(plan.collection)}`)\n const targets = rows\n .filter((row) => evaluateFilter(plan.filter!, this.#parseMeta(row.metadata)))\n .map((row) => row.id as string)\n if (targets.length > 0) {\n const placeholders = targets.map(() => '?').join(', ')\n await this.#query(\n `DELETE FROM ${ident(plan.collection)} WHERE id IN (${placeholders})`,\n targets\n )\n }\n } else {\n await this.#query(`DELETE FROM ${ident(plan.collection)}`)\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * @module @nhtio/adk/batteries/vector/meilisearch
3
+ *
4
+ * Meilisearch adapter. Each collection is a Meilisearch index with a `userProvided` embedder
5
+ * (BYO vectors under `_vectors.<embedder>`); KNN uses semantic search (`vector` +
6
+ * `hybrid.semanticRatio = 1`). Metadata is stored as a JSON string field and filtered with the
7
+ * neutral filter tree's JS reference evaluator for exact cross-adapter parity. Meilisearch
8
+ * returns `_rankingScore` already normalized to [0,1] (higher = closer).
9
+ *
10
+ * Requires the `vectorStore` experimental feature, which the adapter enables on connect.
11
+ * Driver: `meilisearch` (pure JS).
12
+ */
13
+ import { BaseVectorStore } from "../contract";
14
+ import type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from "../plan";
15
+ import type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from "../types";
16
+ export interface MeilisearchVectorStoreOptions extends BaseVectorStoreOptions {
17
+ connection?: {
18
+ host?: string;
19
+ apiKey?: string;
20
+ };
21
+ }
22
+ export declare class MeilisearchVectorStore extends BaseVectorStore {
23
+ #private;
24
+ readonly capabilities: VectorStoreCapabilities;
25
+ static isAvailable(): boolean;
26
+ isAvailable(): boolean;
27
+ connect(): Promise<void>;
28
+ close(): Promise<void>;
29
+ createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void>;
30
+ dropCollection(collection: string, ifExists: boolean): Promise<void>;
31
+ hasCollection(collection: string): Promise<boolean>;
32
+ renameCollection(_from: string, _to: string): Promise<void>;
33
+ executeUpsert(plan: UpsertPlan): Promise<void>;
34
+ executeSearch(plan: SearchPlan): Promise<VectorMatch[]>;
35
+ executeDelete(plan: DeletePlan): Promise<void>;
36
+ }
@@ -0,0 +1,242 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../chunk-Ble4zEEl.js");
3
+ const require_tool_registry = require("../../tool_registry-DYUYqXvo.js");
4
+ require("../../guards.cjs");
5
+ const require_batteries_vector_filters = require("./filters.cjs");
6
+ const require_batteries_vector_exceptions = require("./exceptions.cjs");
7
+ const require_batteries_vector_contract = require("./contract.cjs");
8
+ const require_batteries_vector_validation = require("./validation.cjs");
9
+ //#region src/batteries/vector/meilisearch/index.ts
10
+ /**
11
+ * @module @nhtio/adk/batteries/vector/meilisearch
12
+ *
13
+ * Meilisearch adapter. Each collection is a Meilisearch index with a `userProvided` embedder
14
+ * (BYO vectors under `_vectors.<embedder>`); KNN uses semantic search (`vector` +
15
+ * `hybrid.semanticRatio = 1`). Metadata is stored as a JSON string field and filtered with the
16
+ * neutral filter tree's JS reference evaluator for exact cross-adapter parity. Meilisearch
17
+ * returns `_rankingScore` already normalized to [0,1] (higher = closer).
18
+ *
19
+ * Requires the `vectorStore` experimental feature, which the adapter enables on connect.
20
+ * Driver: `meilisearch` (pure JS).
21
+ */
22
+ var EMBEDDER = "default";
23
+ var getMeilisearch = async () => {
24
+ try {
25
+ return (await import("meilisearch")).Meilisearch;
26
+ } catch {
27
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_DRIVER_UNAVAILABLE(["meilisearch"]);
28
+ }
29
+ };
30
+ var MeilisearchVectorStore = class extends require_batteries_vector_contract.BaseVectorStore {
31
+ capabilities = {
32
+ transactions: false,
33
+ namedVectors: false,
34
+ rename: false,
35
+ rawSql: false,
36
+ builtInEncoding: false,
37
+ consistency: {
38
+ configurable: false,
39
+ default: "strong",
40
+ modes: ["strong"]
41
+ }
42
+ };
43
+ #client = null;
44
+ #dims = /* @__PURE__ */ new Map();
45
+ get #opts() {
46
+ return this.options;
47
+ }
48
+ static isAvailable() {
49
+ return typeof process !== "undefined";
50
+ }
51
+ isAvailable() {
52
+ return typeof process !== "undefined";
53
+ }
54
+ async connect() {
55
+ if (this.#client) return;
56
+ const Meilisearch = await getMeilisearch();
57
+ const c = this.#opts.connection || {};
58
+ const host = c.host ?? "http://localhost:7700";
59
+ try {
60
+ this.#client = new Meilisearch({
61
+ host,
62
+ apiKey: c.apiKey
63
+ });
64
+ await fetch(`${host.replace(/\/$/, "")}/experimental-features`, {
65
+ method: "PATCH",
66
+ headers: {
67
+ "Content-Type": "application/json",
68
+ ...c.apiKey ? { Authorization: `Bearer ${c.apiKey}` } : {}
69
+ },
70
+ body: JSON.stringify({ vectorStore: true })
71
+ }).catch(() => void 0);
72
+ } catch (err) {
73
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_CONNECTION_FAILED([String(err)]);
74
+ }
75
+ }
76
+ async close() {
77
+ this.#client = null;
78
+ }
79
+ async #ensure() {
80
+ if (!this.#client) await this.connect();
81
+ return this.#client;
82
+ }
83
+ async #wait(task) {
84
+ const uid = task?.taskUid ?? task?.uid;
85
+ if (uid === void 0) return;
86
+ await this.#client.tasks.waitForTask(uid);
87
+ }
88
+ async createCollection(spec, ifNotExists) {
89
+ const client = await this.#ensure();
90
+ this.#dims.set(spec.collection, spec.vector.dimensions);
91
+ if (ifNotExists && await this.hasCollection(spec.collection)) return;
92
+ try {
93
+ await this.#wait(await client.createIndex(spec.collection, { primaryKey: "id" }));
94
+ const idx = client.index(spec.collection);
95
+ await this.#wait(await idx.updateEmbedders({ [EMBEDDER]: {
96
+ source: "userProvided",
97
+ dimensions: spec.vector.dimensions
98
+ } }));
99
+ } catch (err) {
100
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_COLLECTION_FAILED(["createCollection", String(err)]);
101
+ }
102
+ }
103
+ async dropCollection(collection, ifExists) {
104
+ const client = await this.#ensure();
105
+ if (ifExists && !await this.hasCollection(collection)) return;
106
+ try {
107
+ await this.#wait(await client.deleteIndex(collection));
108
+ this.#dims.delete(collection);
109
+ } catch (err) {
110
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_COLLECTION_FAILED(["dropCollection", String(err)]);
111
+ }
112
+ }
113
+ async hasCollection(collection) {
114
+ const client = await this.#ensure();
115
+ try {
116
+ await client.index(collection).getRawInfo();
117
+ return true;
118
+ } catch {
119
+ return false;
120
+ }
121
+ }
122
+ async renameCollection(_from, _to) {
123
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_UNSUPPORTED_OPERATION(["renameCollection", "meilisearch"]);
124
+ }
125
+ async executeUpsert(plan) {
126
+ if (plan.records.length === 0) return;
127
+ require_batteries_vector_validation.validateRecords(plan.records);
128
+ const client = await this.#ensure();
129
+ const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection);
130
+ try {
131
+ const docs = [];
132
+ for (const r of plan.records) {
133
+ let vector = r.vector;
134
+ if (!vector && r.document) {
135
+ const [v] = await this.encode([r.document], "document");
136
+ vector = v;
137
+ }
138
+ if (!vector) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_UPSERT_FAILED(["Record missing vector and document"]);
139
+ if (expected !== void 0 && vector.length !== expected) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length]);
140
+ docs.push({
141
+ id: r.id,
142
+ document: r.document ?? "",
143
+ metadata: r.metadata ? JSON.stringify(r.metadata) : "{}",
144
+ _vectors: { [EMBEDDER]: vector }
145
+ });
146
+ }
147
+ await this.#wait(await client.index(plan.collection).addDocuments(docs));
148
+ } catch (err) {
149
+ if (require_tool_registry.isInstanceOf(err, "E_VECTOR_STORE_DIMENSION_MISMATCH", require_batteries_vector_exceptions.E_VECTOR_STORE_DIMENSION_MISMATCH) || require_tool_registry.isInstanceOf(err, "E_VECTOR_STORE_UPSERT_FAILED", require_batteries_vector_exceptions.E_VECTOR_STORE_UPSERT_FAILED)) throw err;
150
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_UPSERT_FAILED([String(err)]);
151
+ }
152
+ }
153
+ async executeSearch(plan) {
154
+ const idx = (await this.#ensure()).index(plan.collection);
155
+ let queryVector;
156
+ if (plan.near) {
157
+ if ("vector" in plan.near) queryVector = plan.near.vector;
158
+ else if ("serverText" in plan.near) {
159
+ const [v] = await this.encode([plan.near.serverText], "query");
160
+ queryVector = v;
161
+ } else if ("id" in plan.near) {
162
+ try {
163
+ const doc = await idx.getDocument(plan.near.id, { retrieveVectors: true });
164
+ queryVector = this.#unwrapVector(doc?._vectors?.[EMBEDDER]);
165
+ } catch {
166
+ queryVector = void 0;
167
+ }
168
+ if (!queryVector) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_SEARCH_FAILED(["Referenced id not found: " + plan.near.id]);
169
+ }
170
+ }
171
+ const offset = plan.offset ?? 0;
172
+ try {
173
+ const over = plan.filter ? 250 : plan.topK + offset;
174
+ let hits;
175
+ if (queryVector) hits = (await idx.search("", {
176
+ vector: queryVector,
177
+ hybrid: {
178
+ embedder: EMBEDDER,
179
+ semanticRatio: 1
180
+ },
181
+ limit: Math.max(over, plan.topK + offset),
182
+ showRankingScore: true,
183
+ retrieveVectors: true
184
+ })).hits ?? [];
185
+ else hits = (await idx.search("", {
186
+ limit: Math.max(over, plan.topK + offset),
187
+ retrieveVectors: true
188
+ })).hits ?? [];
189
+ const mapped = hits.map((hit) => ({
190
+ match: this.#project(hit, plan, !!queryVector),
191
+ meta: this.#parseMeta(hit.metadata)
192
+ }));
193
+ return (plan.filter ? mapped.filter((m) => require_batteries_vector_filters.evaluateFilter(plan.filter, m.meta)) : mapped).slice(offset, offset + plan.topK).map((m) => m.match);
194
+ } catch (err) {
195
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_SEARCH_FAILED([String(err)]);
196
+ }
197
+ }
198
+ #unwrapVector(v) {
199
+ if (!v) return void 0;
200
+ if (Array.isArray(v)) return Array.isArray(v[0]) ? v[0] : v;
201
+ const emb = v.embeddings;
202
+ if (Array.isArray(emb)) return Array.isArray(emb[0]) ? emb[0] : emb;
203
+ }
204
+ #parseMeta(val) {
205
+ if (typeof val === "string") try {
206
+ return JSON.parse(val);
207
+ } catch {
208
+ return {};
209
+ }
210
+ if (val && typeof val === "object") return val;
211
+ return {};
212
+ }
213
+ #project(hit, plan, isKnn) {
214
+ const proj = plan.projection;
215
+ const out = {};
216
+ if (proj.id) out.id = hit.id;
217
+ if (proj.vector) {
218
+ const v = this.#unwrapVector(hit._vectors?.[EMBEDDER]);
219
+ if (v) out.vector = v;
220
+ }
221
+ if (proj.document) out.document = hit.document ?? void 0;
222
+ if (proj.metadata) out.metadata = this.#parseMeta(hit.metadata);
223
+ if (isKnn && typeof hit._rankingScore === "number") out.score = hit._rankingScore;
224
+ return out;
225
+ }
226
+ async executeDelete(plan) {
227
+ const idx = (await this.#ensure()).index(plan.collection);
228
+ try {
229
+ if (plan.ids && plan.ids.length > 0) await this.#wait(await idx.deleteDocuments(plan.ids));
230
+ else if (plan.filter) {
231
+ const targets = ((await idx.search("", { limit: 1e3 })).hits ?? []).filter((hit) => require_batteries_vector_filters.evaluateFilter(plan.filter, this.#parseMeta(hit.metadata))).map((hit) => hit.id);
232
+ if (targets.length > 0) await this.#wait(await idx.deleteDocuments(targets));
233
+ } else await this.#wait(await idx.deleteAllDocuments());
234
+ } catch (err) {
235
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_DELETE_FAILED([String(err)]);
236
+ }
237
+ }
238
+ };
239
+ //#endregion
240
+ exports.MeilisearchVectorStore = MeilisearchVectorStore;
241
+
242
+ //# sourceMappingURL=meilisearch.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meilisearch.cjs","names":["#opts","#client","#ensure","#wait","#dims","#unwrapVector","#project","#parseMeta"],"sources":["../../../src/batteries/vector/meilisearch/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/meilisearch\n *\n * Meilisearch adapter. Each collection is a Meilisearch index with a `userProvided` embedder\n * (BYO vectors under `_vectors.<embedder>`); KNN uses semantic search (`vector` +\n * `hybrid.semanticRatio = 1`). Metadata is stored as a JSON string field and filtered with the\n * neutral filter tree's JS reference evaluator for exact cross-adapter parity. Meilisearch\n * returns `_rankingScore` already normalized to [0,1] (higher = closer).\n *\n * Requires the `vectorStore` experimental feature, which the adapter enables on connect.\n * Driver: `meilisearch` (pure JS).\n */\n\nimport { evaluateFilter } from '../filters'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { isInstanceOf } from '@nhtio/adk/guards'\nimport {\n E_VECTOR_STORE_DRIVER_UNAVAILABLE,\n E_VECTOR_STORE_CONNECTION_FAILED,\n E_VECTOR_STORE_COLLECTION_FAILED,\n E_VECTOR_STORE_UPSERT_FAILED,\n E_VECTOR_STORE_SEARCH_FAILED,\n E_VECTOR_STORE_DELETE_FAILED,\n E_VECTOR_STORE_DIMENSION_MISMATCH,\n E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n} from '../exceptions'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type {\n VectorMatch,\n VectorStoreCapabilities,\n BaseVectorStoreOptions,\n VectorMetadata,\n} from '../types'\n\nconst EMBEDDER = 'default'\n\nexport interface MeilisearchVectorStoreOptions extends BaseVectorStoreOptions {\n connection?: { host?: string; apiKey?: string }\n}\n\nconst getMeilisearch = async () => {\n try {\n const mod = await import('meilisearch')\n return mod.Meilisearch\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['meilisearch'])\n }\n}\n\nexport class MeilisearchVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: false,\n rawSql: false,\n builtInEncoding: false,\n // Writes are awaited to task completion (waitForTask) before resolving — strongly\n // consistent for the next search. The option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n\n #client: any | null = null\n #dims: Map<string, number> = new Map()\n\n get #opts(): MeilisearchVectorStoreOptions {\n return this.options as MeilisearchVectorStoreOptions\n }\n\n static isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n\n async connect(): Promise<void> {\n if (this.#client) return\n const Meilisearch = await getMeilisearch()\n const c = this.#opts.connection || {}\n const host = c.host ?? 'http://localhost:7700'\n try {\n this.#client = new Meilisearch({ host, apiKey: c.apiKey })\n // Enable the vector store experimental feature (no-op / stable on newer versions).\n await fetch(`${host.replace(/\\/$/, '')}/experimental-features`, {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n ...(c.apiKey ? { Authorization: `Bearer ${c.apiKey}` } : {}),\n },\n body: JSON.stringify({ vectorStore: true }),\n }).catch(() => undefined)\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n\n async close(): Promise<void> {\n this.#client = null\n }\n\n async #ensure(): Promise<any> {\n if (!this.#client) await this.connect()\n return this.#client!\n }\n\n async #wait(task: any): Promise<void> {\n const uid = task?.taskUid ?? task?.uid\n if (uid === undefined) return\n await this.#client.tasks.waitForTask(uid)\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n const client = await this.#ensure()\n this.#dims.set(spec.collection, spec.vector.dimensions)\n if (ifNotExists && (await this.hasCollection(spec.collection))) return\n try {\n await this.#wait(await client.createIndex(spec.collection, { primaryKey: 'id' }))\n const idx = client.index(spec.collection)\n await this.#wait(\n await idx.updateEmbedders({\n [EMBEDDER]: { source: 'userProvided', dimensions: spec.vector.dimensions },\n })\n )\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['createCollection', String(err)])\n }\n }\n\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n const client = await this.#ensure()\n if (ifExists && !(await this.hasCollection(collection))) return\n try {\n await this.#wait(await client.deleteIndex(collection))\n this.#dims.delete(collection)\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', String(err)])\n }\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n const client = await this.#ensure()\n try {\n await client.index(collection).getRawInfo()\n return true\n } catch {\n return false\n }\n }\n\n async renameCollection(_from: string, _to: string): Promise<void> {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'meilisearch'])\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const client = await this.#ensure()\n const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection)\n try {\n const docs: 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 docs.push({\n id: r.id,\n document: r.document ?? '',\n metadata: r.metadata ? JSON.stringify(r.metadata) : '{}',\n _vectors: { [EMBEDDER]: vector },\n })\n }\n await this.#wait(await client.index(plan.collection).addDocuments(docs))\n } catch (err) {\n if (\n isInstanceOf(err, 'E_VECTOR_STORE_DIMENSION_MISMATCH', E_VECTOR_STORE_DIMENSION_MISMATCH) ||\n isInstanceOf(err, 'E_VECTOR_STORE_UPSERT_FAILED', E_VECTOR_STORE_UPSERT_FAILED)\n ) {\n throw err\n }\n throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n }\n }\n\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n const client = await this.#ensure()\n const idx = client.index(plan.collection)\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 try {\n const doc = await idx.getDocument(plan.near.id, { retrieveVectors: true })\n queryVector = this.#unwrapVector(doc?._vectors?.[EMBEDDER])\n } catch {\n queryVector = undefined\n }\n if (!queryVector) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n }\n }\n\n const offset = plan.offset ?? 0\n try {\n const over = plan.filter ? 250 : plan.topK + offset\n let hits: any[]\n if (queryVector) {\n const res = await idx.search('', {\n vector: queryVector,\n hybrid: { embedder: EMBEDDER, semanticRatio: 1.0 },\n limit: Math.max(over, plan.topK + offset),\n showRankingScore: true,\n retrieveVectors: true,\n })\n hits = res.hits ?? []\n } else {\n const res = await idx.search('', {\n limit: Math.max(over, plan.topK + offset),\n retrieveVectors: true,\n })\n hits = res.hits ?? []\n }\n const mapped = hits.map((hit) => ({\n match: this.#project(hit, plan, !!queryVector),\n meta: this.#parseMeta(hit.metadata),\n }))\n const filtered = plan.filter\n ? mapped.filter((m) => evaluateFilter(plan.filter!, m.meta))\n : mapped\n return filtered.slice(offset, offset + plan.topK).map((m) => m.match)\n } catch (err) {\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\n }\n\n #unwrapVector(v: unknown): number[] | undefined {\n // Meilisearch returns _vectors.default as { embeddings: number[][] } or number[][] or number[].\n if (!v) return undefined\n if (Array.isArray(v)) {\n return Array.isArray(v[0]) ? (v[0] as number[]) : (v as number[])\n }\n const emb = (v as any).embeddings\n if (Array.isArray(emb)) return Array.isArray(emb[0]) ? (emb[0] as number[]) : (emb as number[])\n return undefined\n }\n\n #parseMeta(val: unknown): VectorMetadata {\n if (typeof val === 'string') {\n try {\n return JSON.parse(val) as VectorMetadata\n } catch {\n return {}\n }\n }\n if (val && typeof val === 'object') return val as VectorMetadata\n return {}\n }\n\n #project(hit: any, plan: SearchPlan, isKnn: boolean): VectorMatch {\n const proj = plan.projection\n const out: VectorMatch = {}\n if (proj.id) out.id = hit.id as string\n if (proj.vector) {\n const v = this.#unwrapVector(hit._vectors?.[EMBEDDER])\n if (v) out.vector = v\n }\n if (proj.document) out.document = (hit.document ?? undefined) as string | undefined\n if (proj.metadata) out.metadata = this.#parseMeta(hit.metadata)\n if (isKnn && typeof hit._rankingScore === 'number') {\n // Meilisearch _rankingScore is already in [0,1], higher = closer.\n out.score = hit._rankingScore\n }\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const client = await this.#ensure()\n const idx = client.index(plan.collection)\n try {\n if (plan.ids && plan.ids.length > 0) {\n await this.#wait(await idx.deleteDocuments(plan.ids))\n } else if (plan.filter) {\n // Resolve ids via a scan + JS evaluator, then delete by id.\n const res = await idx.search('', { limit: 1000 })\n const targets = (res.hits ?? [])\n .filter((hit: any) => evaluateFilter(plan.filter!, this.#parseMeta(hit.metadata)))\n .map((hit: any) => hit.id as string)\n if (targets.length > 0) await this.#wait(await idx.deleteDocuments(targets))\n } else {\n await this.#wait(await idx.deleteAllDocuments())\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n"],"mappings":"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"}