@nhtio/adk 1.20260607.2 → 1.20260609.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (501) hide show
  1. package/CHANGELOG.md +185 -0
  2. package/batteries/embeddings/openai/adapter.cjs +1 -1
  3. package/batteries/embeddings/openai/adapter.mjs +1 -1
  4. package/batteries/embeddings/openai/exceptions.cjs +1 -1
  5. package/batteries/embeddings/openai/exceptions.mjs +1 -1
  6. package/batteries/embeddings/openai/types.d.ts +7 -0
  7. package/batteries/embeddings/webllm/adapter.cjs +1 -1
  8. package/batteries/embeddings/webllm/adapter.mjs +1 -1
  9. package/batteries/embeddings/webllm/exceptions.cjs +1 -1
  10. package/batteries/embeddings/webllm/exceptions.mjs +1 -1
  11. package/batteries/llm/chat_common/helpers.d.ts +165 -0
  12. package/batteries/llm/chat_common/types.d.ts +309 -0
  13. package/batteries/llm/index.d.ts +5 -0
  14. package/batteries/llm/ollama/adapter.cjs +736 -0
  15. package/batteries/llm/ollama/adapter.cjs.map +1 -0
  16. package/batteries/llm/ollama/adapter.d.ts +64 -0
  17. package/batteries/llm/ollama/adapter.mjs +734 -0
  18. package/batteries/llm/ollama/adapter.mjs.map +1 -0
  19. package/batteries/llm/ollama/exceptions.cjs +105 -0
  20. package/batteries/llm/ollama/exceptions.cjs.map +1 -0
  21. package/batteries/llm/ollama/exceptions.d.ts +112 -0
  22. package/batteries/llm/ollama/exceptions.mjs +96 -0
  23. package/batteries/llm/ollama/exceptions.mjs.map +1 -0
  24. package/batteries/llm/ollama/helpers.cjs +487 -0
  25. package/batteries/llm/ollama/helpers.cjs.map +1 -0
  26. package/batteries/llm/ollama/helpers.d.ts +158 -0
  27. package/batteries/llm/ollama/helpers.mjs +450 -0
  28. package/batteries/llm/ollama/helpers.mjs.map +1 -0
  29. package/batteries/llm/ollama/index.d.ts +29 -0
  30. package/batteries/llm/ollama/types.cjs +2 -0
  31. package/batteries/llm/ollama/types.d.ts +334 -0
  32. package/batteries/llm/ollama/types.mjs +0 -0
  33. package/batteries/llm/ollama/validation.cjs +130 -0
  34. package/batteries/llm/ollama/validation.cjs.map +1 -0
  35. package/batteries/llm/ollama/validation.d.ts +31 -0
  36. package/batteries/llm/ollama/validation.mjs +127 -0
  37. package/batteries/llm/ollama/validation.mjs.map +1 -0
  38. package/batteries/llm/ollama.cjs +54 -0
  39. package/batteries/llm/ollama.mjs +6 -0
  40. package/batteries/llm/openai_chat_completions/adapter.cjs +36 -19
  41. package/batteries/llm/openai_chat_completions/adapter.cjs.map +1 -1
  42. package/batteries/llm/openai_chat_completions/adapter.mjs +23 -6
  43. package/batteries/llm/openai_chat_completions/adapter.mjs.map +1 -1
  44. package/batteries/llm/openai_chat_completions/exceptions.cjs +1 -1
  45. package/batteries/llm/openai_chat_completions/exceptions.mjs +1 -1
  46. package/batteries/llm/openai_chat_completions/helpers.cjs +80 -320
  47. package/batteries/llm/openai_chat_completions/helpers.cjs.map +1 -1
  48. package/batteries/llm/openai_chat_completions/helpers.d.ts +68 -144
  49. package/batteries/llm/openai_chat_completions/helpers.mjs +40 -280
  50. package/batteries/llm/openai_chat_completions/helpers.mjs.map +1 -1
  51. package/batteries/llm/openai_chat_completions/types.d.ts +273 -181
  52. package/batteries/llm/openai_chat_completions/validation.cjs +2 -2
  53. package/batteries/llm/openai_chat_completions/validation.cjs.map +1 -1
  54. package/batteries/llm/openai_chat_completions/validation.mjs +2 -2
  55. package/batteries/llm/openai_chat_completions/validation.mjs.map +1 -1
  56. package/batteries/llm/openai_chat_completions.cjs +29 -28
  57. package/batteries/llm/openai_chat_completions.mjs +2 -1
  58. package/batteries/llm/webllm_chat_completions/adapter.cjs +38 -19
  59. package/batteries/llm/webllm_chat_completions/adapter.cjs.map +1 -1
  60. package/batteries/llm/webllm_chat_completions/adapter.d.ts +18 -0
  61. package/batteries/llm/webllm_chat_completions/adapter.mjs +25 -6
  62. package/batteries/llm/webllm_chat_completions/adapter.mjs.map +1 -1
  63. package/batteries/llm/webllm_chat_completions/exceptions.cjs +1 -1
  64. package/batteries/llm/webllm_chat_completions/exceptions.mjs +1 -1
  65. package/batteries/llm/webllm_chat_completions/helpers.cjs +29 -28
  66. package/batteries/llm/webllm_chat_completions/helpers.mjs +2 -1
  67. package/batteries/llm/webllm_chat_completions/types.d.ts +21 -0
  68. package/batteries/llm/webllm_chat_completions/validation.cjs +13 -1
  69. package/batteries/llm/webllm_chat_completions/validation.cjs.map +1 -1
  70. package/batteries/llm/webllm_chat_completions/validation.d.ts +12 -0
  71. package/batteries/llm/webllm_chat_completions/validation.mjs +13 -1
  72. package/batteries/llm/webllm_chat_completions/validation.mjs.map +1 -1
  73. package/batteries/llm/webllm_chat_completions.cjs +29 -28
  74. package/batteries/llm/webllm_chat_completions.mjs +2 -1
  75. package/batteries/llm.cjs +44 -28
  76. package/batteries/llm.mjs +9 -4
  77. package/batteries/storage/flydrive.cjs +1 -1
  78. package/batteries/storage/flydrive.mjs +1 -1
  79. package/batteries/storage/in_memory/index.d.ts +1 -1
  80. package/batteries/storage/in_memory.cjs +2 -2
  81. package/batteries/storage/in_memory.cjs.map +1 -1
  82. package/batteries/storage/in_memory.mjs +2 -2
  83. package/batteries/storage/in_memory.mjs.map +1 -1
  84. package/batteries/storage/opfs/index.d.ts +19 -0
  85. package/batteries/storage/opfs.cjs +1 -1
  86. package/batteries/storage/opfs.cjs.map +1 -1
  87. package/batteries/storage/opfs.mjs +1 -1
  88. package/batteries/storage/opfs.mjs.map +1 -1
  89. package/batteries/tools/color.cjs +3 -2
  90. package/batteries/tools/color.cjs.map +1 -1
  91. package/batteries/tools/color.mjs +3 -2
  92. package/batteries/tools/color.mjs.map +1 -1
  93. package/batteries/tools/comparison.cjs +4 -3
  94. package/batteries/tools/comparison.cjs.map +1 -1
  95. package/batteries/tools/comparison.mjs +4 -3
  96. package/batteries/tools/comparison.mjs.map +1 -1
  97. package/batteries/tools/data_structure.cjs +30 -10
  98. package/batteries/tools/data_structure.cjs.map +1 -1
  99. package/batteries/tools/data_structure.mjs +30 -10
  100. package/batteries/tools/data_structure.mjs.map +1 -1
  101. package/batteries/tools/datetime_extended.cjs +5 -10
  102. package/batteries/tools/datetime_extended.cjs.map +1 -1
  103. package/batteries/tools/datetime_extended.mjs +5 -10
  104. package/batteries/tools/datetime_extended.mjs.map +1 -1
  105. package/batteries/tools/datetime_math.cjs +2 -2
  106. package/batteries/tools/datetime_math.mjs +2 -2
  107. package/batteries/tools/encoding.cjs +13 -4
  108. package/batteries/tools/encoding.cjs.map +1 -1
  109. package/batteries/tools/encoding.mjs +13 -4
  110. package/batteries/tools/encoding.mjs.map +1 -1
  111. package/batteries/tools/formatting.cjs +4 -4
  112. package/batteries/tools/formatting.cjs.map +1 -1
  113. package/batteries/tools/formatting.mjs +4 -4
  114. package/batteries/tools/formatting.mjs.map +1 -1
  115. package/batteries/tools/geo_basics.cjs +2 -2
  116. package/batteries/tools/geo_basics.mjs +2 -2
  117. package/batteries/tools/index.d.ts +1 -0
  118. package/batteries/tools/math.cjs +10 -8
  119. package/batteries/tools/math.cjs.map +1 -1
  120. package/batteries/tools/math.mjs +10 -8
  121. package/batteries/tools/math.mjs.map +1 -1
  122. package/batteries/tools/memory.cjs +5 -5
  123. package/batteries/tools/memory.mjs +5 -5
  124. package/batteries/tools/parsing.cjs +9 -5
  125. package/batteries/tools/parsing.cjs.map +1 -1
  126. package/batteries/tools/parsing.mjs +9 -5
  127. package/batteries/tools/parsing.mjs.map +1 -1
  128. package/batteries/tools/retrievables.cjs +4 -4
  129. package/batteries/tools/retrievables.mjs +4 -4
  130. package/batteries/tools/searxng/exceptions.d.ts +21 -0
  131. package/batteries/tools/searxng/index.d.ts +150 -0
  132. package/batteries/tools/searxng.cjs +5 -0
  133. package/batteries/tools/searxng.mjs +2 -0
  134. package/batteries/tools/standing_instructions.cjs +4 -4
  135. package/batteries/tools/standing_instructions.mjs +4 -4
  136. package/batteries/tools/statistics.cjs +54 -43
  137. package/batteries/tools/statistics.cjs.map +1 -1
  138. package/batteries/tools/statistics.mjs +54 -43
  139. package/batteries/tools/statistics.mjs.map +1 -1
  140. package/batteries/tools/string_processing.cjs +5 -5
  141. package/batteries/tools/string_processing.cjs.map +1 -1
  142. package/batteries/tools/string_processing.mjs +5 -5
  143. package/batteries/tools/string_processing.mjs.map +1 -1
  144. package/batteries/tools/structured_data.cjs +8 -13
  145. package/batteries/tools/structured_data.cjs.map +1 -1
  146. package/batteries/tools/structured_data.mjs +8 -13
  147. package/batteries/tools/structured_data.mjs.map +1 -1
  148. package/batteries/tools/text_analysis.cjs +3 -3
  149. package/batteries/tools/text_analysis.mjs +3 -3
  150. package/batteries/tools/text_comparison.cjs +2 -2
  151. package/batteries/tools/text_comparison.mjs +2 -2
  152. package/batteries/tools/time.cjs +2 -2
  153. package/batteries/tools/time.mjs +2 -2
  154. package/batteries/tools/unit_conversion.cjs +10 -8
  155. package/batteries/tools/unit_conversion.cjs.map +1 -1
  156. package/batteries/tools/unit_conversion.mjs +10 -8
  157. package/batteries/tools/unit_conversion.mjs.map +1 -1
  158. package/batteries/tools.cjs +3 -0
  159. package/batteries/tools.mjs +2 -1
  160. package/batteries/vector/arangodb/index.d.ts +2 -0
  161. package/batteries/vector/arangodb.cjs +2 -1
  162. package/batteries/vector/arangodb.cjs.map +1 -1
  163. package/batteries/vector/arangodb.mjs +2 -1
  164. package/batteries/vector/arangodb.mjs.map +1 -1
  165. package/batteries/vector/builder.cjs +31 -0
  166. package/batteries/vector/builder.cjs.map +1 -1
  167. package/batteries/vector/builder.d.ts +58 -0
  168. package/batteries/vector/builder.mjs +31 -0
  169. package/batteries/vector/builder.mjs.map +1 -1
  170. package/batteries/vector/chroma/index.d.ts +4 -0
  171. package/batteries/vector/chroma.cjs +3 -0
  172. package/batteries/vector/chroma.cjs.map +1 -1
  173. package/batteries/vector/chroma.mjs +3 -0
  174. package/batteries/vector/chroma.mjs.map +1 -1
  175. package/batteries/vector/clickhouse/index.d.ts +2 -0
  176. package/batteries/vector/clickhouse.cjs +2 -1
  177. package/batteries/vector/clickhouse.cjs.map +1 -1
  178. package/batteries/vector/clickhouse.mjs +2 -1
  179. package/batteries/vector/clickhouse.mjs.map +1 -1
  180. package/batteries/vector/cloudflare/index.d.ts +2 -0
  181. package/batteries/vector/cloudflare.cjs +2 -1
  182. package/batteries/vector/cloudflare.cjs.map +1 -1
  183. package/batteries/vector/cloudflare.mjs +2 -1
  184. package/batteries/vector/cloudflare.mjs.map +1 -1
  185. package/batteries/vector/conformance/index.d.ts +22 -0
  186. package/batteries/vector/conformance.cjs +22 -0
  187. package/batteries/vector/conformance.cjs.map +1 -1
  188. package/batteries/vector/conformance.mjs +22 -0
  189. package/batteries/vector/conformance.mjs.map +1 -1
  190. package/batteries/vector/contract.cjs +22 -0
  191. package/batteries/vector/contract.cjs.map +1 -1
  192. package/batteries/vector/contract.d.ts +51 -0
  193. package/batteries/vector/contract.mjs +22 -0
  194. package/batteries/vector/contract.mjs.map +1 -1
  195. package/batteries/vector/couchbase/index.d.ts +2 -0
  196. package/batteries/vector/couchbase.cjs +2 -1
  197. package/batteries/vector/couchbase.cjs.map +1 -1
  198. package/batteries/vector/couchbase.mjs +2 -1
  199. package/batteries/vector/couchbase.mjs.map +1 -1
  200. package/batteries/vector/duckdb/index.d.ts +2 -0
  201. package/batteries/vector/duckdb.cjs +2 -1
  202. package/batteries/vector/duckdb.cjs.map +1 -1
  203. package/batteries/vector/duckdb.mjs +2 -1
  204. package/batteries/vector/duckdb.mjs.map +1 -1
  205. package/batteries/vector/elasticsearch/index.d.ts +2 -0
  206. package/batteries/vector/elasticsearch.cjs +2 -1
  207. package/batteries/vector/elasticsearch.cjs.map +1 -1
  208. package/batteries/vector/elasticsearch.mjs +2 -1
  209. package/batteries/vector/elasticsearch.mjs.map +1 -1
  210. package/batteries/vector/exceptions.cjs +1 -1
  211. package/batteries/vector/exceptions.mjs +1 -1
  212. package/batteries/vector/factory.cjs +6 -0
  213. package/batteries/vector/factory.cjs.map +1 -1
  214. package/batteries/vector/factory.d.ts +14 -0
  215. package/batteries/vector/factory.mjs +6 -0
  216. package/batteries/vector/factory.mjs.map +1 -1
  217. package/batteries/vector/filters.cjs +22 -1
  218. package/batteries/vector/filters.cjs.map +1 -1
  219. package/batteries/vector/filters.d.ts +38 -0
  220. package/batteries/vector/filters.mjs +22 -1
  221. package/batteries/vector/filters.mjs.map +1 -1
  222. package/batteries/vector/helpers.cjs +13 -0
  223. package/batteries/vector/helpers.cjs.map +1 -1
  224. package/batteries/vector/helpers.d.ts +14 -0
  225. package/batteries/vector/helpers.mjs +13 -0
  226. package/batteries/vector/helpers.mjs.map +1 -1
  227. package/batteries/vector/hnswlib/index.d.ts +2 -0
  228. package/batteries/vector/hnswlib.cjs +2 -1
  229. package/batteries/vector/hnswlib.cjs.map +1 -1
  230. package/batteries/vector/hnswlib.mjs +2 -1
  231. package/batteries/vector/hnswlib.mjs.map +1 -1
  232. package/batteries/vector/in_memory/index.d.ts +1 -0
  233. package/batteries/vector/in_memory.cjs +1 -0
  234. package/batteries/vector/in_memory.cjs.map +1 -1
  235. package/batteries/vector/in_memory.mjs +1 -0
  236. package/batteries/vector/in_memory.mjs.map +1 -1
  237. package/batteries/vector/lancedb/index.d.ts +2 -0
  238. package/batteries/vector/lancedb.cjs +2 -1
  239. package/batteries/vector/lancedb.cjs.map +1 -1
  240. package/batteries/vector/lancedb.mjs +2 -1
  241. package/batteries/vector/lancedb.mjs.map +1 -1
  242. package/batteries/vector/mariadb/index.d.ts +2 -0
  243. package/batteries/vector/mariadb.cjs +2 -1
  244. package/batteries/vector/mariadb.cjs.map +1 -1
  245. package/batteries/vector/mariadb.mjs +2 -1
  246. package/batteries/vector/mariadb.mjs.map +1 -1
  247. package/batteries/vector/meilisearch/index.d.ts +2 -0
  248. package/batteries/vector/meilisearch.cjs +2 -1
  249. package/batteries/vector/meilisearch.cjs.map +1 -1
  250. package/batteries/vector/meilisearch.mjs +2 -1
  251. package/batteries/vector/meilisearch.mjs.map +1 -1
  252. package/batteries/vector/migrate.cjs +18 -1
  253. package/batteries/vector/migrate.cjs.map +1 -1
  254. package/batteries/vector/migrate.d.ts +31 -0
  255. package/batteries/vector/migrate.mjs +18 -1
  256. package/batteries/vector/migrate.mjs.map +1 -1
  257. package/batteries/vector/milvus/index.d.ts +5 -0
  258. package/batteries/vector/milvus.cjs +4 -0
  259. package/batteries/vector/milvus.cjs.map +1 -1
  260. package/batteries/vector/milvus.mjs +4 -0
  261. package/batteries/vector/milvus.mjs.map +1 -1
  262. package/batteries/vector/mongodb/index.d.ts +2 -0
  263. package/batteries/vector/mongodb.cjs +2 -1
  264. package/batteries/vector/mongodb.cjs.map +1 -1
  265. package/batteries/vector/mongodb.mjs +2 -1
  266. package/batteries/vector/mongodb.mjs.map +1 -1
  267. package/batteries/vector/neo4j/index.d.ts +2 -0
  268. package/batteries/vector/neo4j.cjs +2 -1
  269. package/batteries/vector/neo4j.cjs.map +1 -1
  270. package/batteries/vector/neo4j.mjs +2 -1
  271. package/batteries/vector/neo4j.mjs.map +1 -1
  272. package/batteries/vector/opensearch/index.d.ts +2 -0
  273. package/batteries/vector/opensearch.cjs +2 -1
  274. package/batteries/vector/opensearch.cjs.map +1 -1
  275. package/batteries/vector/opensearch.mjs +2 -1
  276. package/batteries/vector/opensearch.mjs.map +1 -1
  277. package/batteries/vector/oracle23ai/index.d.ts +2 -0
  278. package/batteries/vector/oracle23ai.cjs +2 -1
  279. package/batteries/vector/oracle23ai.cjs.map +1 -1
  280. package/batteries/vector/oracle23ai.mjs +2 -1
  281. package/batteries/vector/oracle23ai.mjs.map +1 -1
  282. package/batteries/vector/orama/index.d.ts +1 -0
  283. package/batteries/vector/orama.cjs +1 -0
  284. package/batteries/vector/orama.cjs.map +1 -1
  285. package/batteries/vector/orama.mjs +1 -0
  286. package/batteries/vector/orama.mjs.map +1 -1
  287. package/batteries/vector/pgvector/index.d.ts +9 -2
  288. package/batteries/vector/pgvector.cjs +4 -0
  289. package/batteries/vector/pgvector.cjs.map +1 -1
  290. package/batteries/vector/pgvector.mjs +4 -0
  291. package/batteries/vector/pgvector.mjs.map +1 -1
  292. package/batteries/vector/pinecone/index.d.ts +5 -0
  293. package/batteries/vector/pinecone.cjs +3 -1
  294. package/batteries/vector/pinecone.cjs.map +1 -1
  295. package/batteries/vector/pinecone.mjs +3 -1
  296. package/batteries/vector/pinecone.mjs.map +1 -1
  297. package/batteries/vector/plan.d.ts +27 -0
  298. package/batteries/vector/qdrant/index.d.ts +5 -0
  299. package/batteries/vector/qdrant.cjs +4 -0
  300. package/batteries/vector/qdrant.cjs.map +1 -1
  301. package/batteries/vector/qdrant.mjs +4 -0
  302. package/batteries/vector/qdrant.mjs.map +1 -1
  303. package/batteries/vector/redis/index.d.ts +2 -0
  304. package/batteries/vector/redis.cjs +2 -1
  305. package/batteries/vector/redis.cjs.map +1 -1
  306. package/batteries/vector/redis.mjs +2 -1
  307. package/batteries/vector/redis.mjs.map +1 -1
  308. package/batteries/vector/retrievable.cjs +9 -1
  309. package/batteries/vector/retrievable.cjs.map +1 -1
  310. package/batteries/vector/retrievable.mjs +9 -1
  311. package/batteries/vector/retrievable.mjs.map +1 -1
  312. package/batteries/vector/retrievable_glue.d.ts +21 -0
  313. package/batteries/vector/s3vectors/index.d.ts +2 -0
  314. package/batteries/vector/s3vectors.cjs +2 -1
  315. package/batteries/vector/s3vectors.cjs.map +1 -1
  316. package/batteries/vector/s3vectors.mjs +2 -1
  317. package/batteries/vector/s3vectors.mjs.map +1 -1
  318. package/batteries/vector/schema.cjs +28 -0
  319. package/batteries/vector/schema.cjs.map +1 -1
  320. package/batteries/vector/schema.d.ts +39 -0
  321. package/batteries/vector/schema.mjs +28 -0
  322. package/batteries/vector/schema.mjs.map +1 -1
  323. package/batteries/vector/solr/index.d.ts +2 -0
  324. package/batteries/vector/solr.cjs +2 -1
  325. package/batteries/vector/solr.cjs.map +1 -1
  326. package/batteries/vector/solr.mjs +2 -1
  327. package/batteries/vector/solr.mjs.map +1 -1
  328. package/batteries/vector/sqlite_vec/index.d.ts +6 -3
  329. package/batteries/vector/sqlite_vec.cjs +2 -0
  330. package/batteries/vector/sqlite_vec.cjs.map +1 -1
  331. package/batteries/vector/sqlite_vec.mjs +2 -0
  332. package/batteries/vector/sqlite_vec.mjs.map +1 -1
  333. package/batteries/vector/surrealdb/index.d.ts +2 -0
  334. package/batteries/vector/surrealdb.cjs +2 -1
  335. package/batteries/vector/surrealdb.cjs.map +1 -1
  336. package/batteries/vector/surrealdb.mjs +2 -1
  337. package/batteries/vector/surrealdb.mjs.map +1 -1
  338. package/batteries/vector/types.d.ts +27 -0
  339. package/batteries/vector/typesense/index.d.ts +2 -0
  340. package/batteries/vector/typesense.cjs +2 -1
  341. package/batteries/vector/typesense.cjs.map +1 -1
  342. package/batteries/vector/typesense.mjs +2 -1
  343. package/batteries/vector/typesense.mjs.map +1 -1
  344. package/batteries/vector/validation.cjs +14 -0
  345. package/batteries/vector/validation.cjs.map +1 -1
  346. package/batteries/vector/validation.d.ts +14 -0
  347. package/batteries/vector/validation.mjs +14 -0
  348. package/batteries/vector/validation.mjs.map +1 -1
  349. package/batteries/vector/vector_store_constructor.cjs +1 -1
  350. package/batteries/vector/vector_store_constructor.cjs.map +1 -1
  351. package/batteries/vector/vector_store_constructor.d.ts +1 -1
  352. package/batteries/vector/vector_store_constructor.mjs +1 -1
  353. package/batteries/vector/vector_store_constructor.mjs.map +1 -1
  354. package/batteries/vector/vespa/index.d.ts +2 -0
  355. package/batteries/vector/vespa.cjs +2 -1
  356. package/batteries/vector/vespa.cjs.map +1 -1
  357. package/batteries/vector/vespa.mjs +2 -1
  358. package/batteries/vector/vespa.mjs.map +1 -1
  359. package/batteries/vector/weaviate/index.d.ts +2 -0
  360. package/batteries/vector/weaviate.cjs +2 -1
  361. package/batteries/vector/weaviate.cjs.map +1 -1
  362. package/batteries/vector/weaviate.mjs +2 -1
  363. package/batteries/vector/weaviate.mjs.map +1 -1
  364. package/batteries.cjs +46 -28
  365. package/batteries.mjs +10 -5
  366. package/{common-BT0nfCi9.mjs → common-DYDUi99O.mjs} +9 -9
  367. package/common-DYDUi99O.mjs.map +1 -0
  368. package/{common-Cj8TaQ9U.js → common-DZl3ADJs.js} +9 -9
  369. package/common-DZl3ADJs.js.map +1 -0
  370. package/common.cjs +7 -7
  371. package/common.d.ts +1 -1
  372. package/common.mjs +7 -7
  373. package/{dispatch_runner-DPcS7Y_M.mjs → dispatch_runner--ZhdDWRZ.mjs} +27 -5
  374. package/{dispatch_runner-DPcS7Y_M.mjs.map → dispatch_runner--ZhdDWRZ.mjs.map} +1 -1
  375. package/{dispatch_runner-BHBNupqp.js → dispatch_runner-nHDKkxye.js} +27 -5
  376. package/{dispatch_runner-BHBNupqp.js.map → dispatch_runner-nHDKkxye.js.map} +1 -1
  377. package/dispatch_runner.cjs +1 -1
  378. package/dispatch_runner.d.ts +1 -1
  379. package/dispatch_runner.mjs +1 -1
  380. package/eslint/rules/artifact_tool_forbids_artifact_constructor.cjs +1 -0
  381. package/eslint/rules/artifact_tool_forbids_artifact_constructor.cjs.map +1 -1
  382. package/eslint/rules/artifact_tool_forbids_artifact_constructor.d.ts +1 -0
  383. package/eslint/rules/artifact_tool_forbids_artifact_constructor.mjs +1 -0
  384. package/eslint/rules/artifact_tool_forbids_artifact_constructor.mjs.map +1 -1
  385. package/eslint/rules/no_model_in_tool_handler.cjs +1 -0
  386. package/eslint/rules/no_model_in_tool_handler.cjs.map +1 -1
  387. package/eslint/rules/no_model_in_tool_handler.d.ts +1 -0
  388. package/eslint/rules/no_model_in_tool_handler.mjs +1 -0
  389. package/eslint/rules/no_model_in_tool_handler.mjs.map +1 -1
  390. package/eslint/rules/require_validator_any_required.cjs +1 -0
  391. package/eslint/rules/require_validator_any_required.cjs.map +1 -1
  392. package/eslint/rules/require_validator_any_required.d.ts +1 -0
  393. package/eslint/rules/require_validator_any_required.mjs +1 -0
  394. package/eslint/rules/require_validator_any_required.mjs.map +1 -1
  395. package/eslint/rules/thought_payload_requires_replay_tag.cjs +1 -0
  396. package/eslint/rules/thought_payload_requires_replay_tag.cjs.map +1 -1
  397. package/eslint/rules/thought_payload_requires_replay_tag.d.ts +1 -0
  398. package/eslint/rules/thought_payload_requires_replay_tag.mjs +1 -0
  399. package/eslint/rules/thought_payload_requires_replay_tag.mjs.map +1 -1
  400. package/eslint/rules/token_encoding_requires_context_window.cjs +1 -0
  401. package/eslint/rules/token_encoding_requires_context_window.cjs.map +1 -1
  402. package/eslint/rules/token_encoding_requires_context_window.d.ts +1 -0
  403. package/eslint/rules/token_encoding_requires_context_window.mjs +1 -0
  404. package/eslint/rules/token_encoding_requires_context_window.mjs.map +1 -1
  405. package/eslint.cjs +1 -1
  406. package/eslint.mjs +1 -1
  407. package/{exceptions-BeWH2FwP.mjs → exceptions-BDhN0Xzr.mjs} +3 -2
  408. package/exceptions-BDhN0Xzr.mjs.map +1 -0
  409. package/{exceptions-CitH5wZI.js → exceptions-BRXrUKiW.js} +3 -2
  410. package/exceptions-BRXrUKiW.js.map +1 -0
  411. package/exceptions.cjs +2 -2
  412. package/exceptions.mjs +2 -2
  413. package/factories.cjs +1 -1
  414. package/factories.mjs +1 -1
  415. package/forge.cjs +4 -4
  416. package/forge.d.ts +1 -1
  417. package/forge.mjs +4 -4
  418. package/guards.cjs +9 -9
  419. package/guards.mjs +9 -9
  420. package/helpers-DSTFxTiC.js +497 -0
  421. package/helpers-DSTFxTiC.js.map +1 -0
  422. package/helpers-xhrQbMAG.mjs +306 -0
  423. package/helpers-xhrQbMAG.mjs.map +1 -0
  424. package/index.cjs +13 -13
  425. package/index.mjs +13 -13
  426. package/lib/classes/base_exception.d.ts +1 -0
  427. package/lib/classes/media.d.ts +10 -0
  428. package/lib/classes/retrievable.d.ts +1 -1
  429. package/lib/classes/spooled_json_artifact.d.ts +1 -1
  430. package/lib/classes/spooled_markdown_artifact.d.ts +1 -0
  431. package/lib/classes/tokenizable.d.ts +3 -0
  432. package/lib/classes/tool.d.ts +8 -0
  433. package/lib/classes/turn_gate.d.ts +6 -0
  434. package/lib/dispatch_runner.d.ts +4 -32
  435. package/lib/helpers/bignum.cjs +82 -0
  436. package/lib/helpers/bignum.cjs.map +1 -0
  437. package/lib/helpers/bignum.d.ts +52 -0
  438. package/lib/helpers/bignum.mjs +74 -0
  439. package/lib/helpers/bignum.mjs.map +1 -0
  440. package/lib/turn_runner.d.ts +1 -1
  441. package/lib/types/dispatch_runner.d.ts +83 -0
  442. package/lib/utils/exceptions.d.ts +1 -1
  443. package/lib/utils/retry.cjs.map +1 -1
  444. package/lib/utils/retry.d.ts +2 -0
  445. package/lib/utils/retry.mjs.map +1 -1
  446. package/mcp/adk-docs-corpus.json +1 -1
  447. package/package.json +264 -224
  448. package/{runtime-j92CNi5z.mjs → runtime-Bz5zA8wc.mjs} +2 -2
  449. package/{runtime-j92CNi5z.mjs.map → runtime-Bz5zA8wc.mjs.map} +1 -1
  450. package/{runtime-MFFcJrRv.js → runtime-DslE1aBw.js} +2 -2
  451. package/{runtime-MFFcJrRv.js.map → runtime-DslE1aBw.js.map} +1 -1
  452. package/searxng-Bkrwhwhw.js +269 -0
  453. package/searxng-Bkrwhwhw.js.map +1 -0
  454. package/searxng-CyA-nEu5.mjs +257 -0
  455. package/searxng-CyA-nEu5.mjs.map +1 -0
  456. package/skills/adk-assembly/SKILL.md +2 -2
  457. package/{spooled_artifact-CHoZgWwI.mjs → spooled_artifact-7eePq7JA.mjs} +5 -5
  458. package/{spooled_artifact-CHoZgWwI.mjs.map → spooled_artifact-7eePq7JA.mjs.map} +1 -1
  459. package/{spooled_artifact-BTq6Nzfy.js → spooled_artifact-DX8LLyUX.js} +5 -5
  460. package/{spooled_artifact-BTq6Nzfy.js.map → spooled_artifact-DX8LLyUX.js.map} +1 -1
  461. package/spooled_artifact.cjs +2 -2
  462. package/spooled_artifact.mjs +2 -2
  463. package/{spooled_markdown_artifact-CALSDxIx.js → spooled_markdown_artifact-ClX72lek.js} +4 -4
  464. package/spooled_markdown_artifact-ClX72lek.js.map +1 -0
  465. package/{spooled_markdown_artifact-Ci5UL7l4.mjs → spooled_markdown_artifact-wkrBF3oX.mjs} +4 -4
  466. package/spooled_markdown_artifact-wkrBF3oX.mjs.map +1 -0
  467. package/{thought-D34QQZZ9.mjs → thought-B_vxAiKU.mjs} +5 -5
  468. package/{thought-D34QQZZ9.mjs.map → thought-B_vxAiKU.mjs.map} +1 -1
  469. package/{thought-BbwhJ1wb.js → thought-DLwpF7MI.js} +5 -5
  470. package/{thought-BbwhJ1wb.js.map → thought-DLwpF7MI.js.map} +1 -1
  471. package/{tool-CVyZkFC7.js → tool-D5WGVIcI.js} +4 -4
  472. package/{tool-CVyZkFC7.js.map → tool-D5WGVIcI.js.map} +1 -1
  473. package/{tool-CMhaDRNd.mjs → tool-wMYMVl60.mjs} +4 -4
  474. package/{tool-CMhaDRNd.mjs.map → tool-wMYMVl60.mjs.map} +1 -1
  475. package/{tool_call-CV5qVNlb.mjs → tool_call-B4-_-vjG.mjs} +5 -5
  476. package/tool_call-B4-_-vjG.mjs.map +1 -0
  477. package/{tool_call-Db68hB7y.js → tool_call-DixVlW40.js} +5 -5
  478. package/tool_call-DixVlW40.js.map +1 -0
  479. package/{tool_registry-D1pSSlsd.mjs → tool_registry-791Vrjtf.mjs} +4 -3
  480. package/tool_registry-791Vrjtf.mjs.map +1 -0
  481. package/{tool_registry-DYUYqXvo.js → tool_registry-CKJPze3j.js} +4 -3
  482. package/tool_registry-CKJPze3j.js.map +1 -0
  483. package/{turn_runner-DqWHNP80.js → turn_runner-HXImLGIn.js} +7 -7
  484. package/turn_runner-HXImLGIn.js.map +1 -0
  485. package/{turn_runner-fg1Wc3dK.mjs → turn_runner-ZyYO-Kti.mjs} +7 -7
  486. package/turn_runner-ZyYO-Kti.mjs.map +1 -0
  487. package/turn_runner.cjs +1 -1
  488. package/turn_runner.mjs +1 -1
  489. package/types.d.ts +1 -1
  490. package/common-BT0nfCi9.mjs.map +0 -1
  491. package/common-Cj8TaQ9U.js.map +0 -1
  492. package/exceptions-BeWH2FwP.mjs.map +0 -1
  493. package/exceptions-CitH5wZI.js.map +0 -1
  494. package/spooled_markdown_artifact-CALSDxIx.js.map +0 -1
  495. package/spooled_markdown_artifact-Ci5UL7l4.mjs.map +0 -1
  496. package/tool_call-CV5qVNlb.mjs.map +0 -1
  497. package/tool_call-Db68hB7y.js.map +0 -1
  498. package/tool_registry-D1pSSlsd.mjs.map +0 -1
  499. package/tool_registry-DYUYqXvo.js.map +0 -1
  500. package/turn_runner-DqWHNP80.js.map +0 -1
  501. package/turn_runner-fg1Wc3dK.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"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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"}
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 and authentication parameters for the backend. */\n connection?: {\n host?: string\n port?: number\n user?: string\n password?: string\n database?: string\n connectionLimit?: number\n }\n}\n\nconst getMariaDB = async () => {\n try {\n const mod = await import('mariadb')\n return (mod as any).default ?? mod\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['mariadb'])\n }\n}\n\nconst distanceFn = (metric: DistanceMetric): string =>\n metric === 'euclidean' ? 'VEC_DISTANCE_EUCLIDEAN' : 'VEC_DISTANCE_COSINE'\n\n// Backtick-quoted identifier.\nconst ident = (name: string): string => '`' + name.replace(/`/g, '``') + '`'\n\nexport class MariaDBVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: true,\n namedVectors: false,\n rename: true,\n rawSql: true,\n builtInEncoding: false,\n // SQL backend, synchronous on commit: a write is visible on resolve. The option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n\n #pool: any | null = null\n #dims: Map<string, number> = new Map()\n\n get #opts(): MariaDBVectorStoreOptions {\n return this.options as MariaDBVectorStoreOptions\n }\n\n /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */\n static isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n\n async connect(): Promise<void> {\n if (this.#pool) return\n const mariadb = await getMariaDB()\n const c = this.#opts.connection || {}\n try {\n this.#pool = mariadb.createPool({\n host: c.host ?? 'localhost',\n port: c.port ?? 3306,\n user: c.user ?? 'root',\n password: c.password,\n database: c.database,\n connectionLimit: c.connectionLimit ?? 4,\n })\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n\n async close(): Promise<void> {\n if (this.#pool) {\n await this.#pool.end()\n this.#pool = null\n }\n }\n\n async #ensure(): Promise<any> {\n if (!this.#pool) await this.connect()\n return this.#pool!\n }\n\n async #query(sql: string, params?: unknown[]): Promise<any[]> {\n const pool = await this.#ensure()\n return await pool.query(sql, params)\n }\n\n // VEC_ToText returns \"[1,0,0]\"; parse into number[].\n #parseVec(text: unknown): number[] {\n if (typeof text !== 'string') return []\n try {\n return JSON.parse(text) as number[]\n } catch {\n return []\n }\n }\n\n #parseMeta(val: unknown): VectorMetadata {\n if (val === null || val === undefined) return {}\n if (typeof val === 'string') {\n try {\n return JSON.parse(val) as VectorMetadata\n } catch {\n return {}\n }\n }\n if (typeof val === 'object') return val as VectorMetadata\n return {}\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n this.#dims.set(spec.collection, spec.vector.dimensions)\n const ine = ifNotExists ? 'IF NOT EXISTS ' : ''\n try {\n await this.#query(\n `CREATE TABLE ${ine}${ident(spec.collection)} (` +\n `id VARCHAR(255) PRIMARY KEY, ` +\n `vec VECTOR(${spec.vector.dimensions}) NOT NULL, ` +\n `document TEXT, ` +\n `metadata JSON, ` +\n `VECTOR INDEX (vec))`\n )\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['createCollection', String(err)])\n }\n }\n\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n const ie = ifExists ? 'IF EXISTS ' : ''\n try {\n await this.#query(`DROP TABLE ${ie}${ident(collection)}`)\n this.#dims.delete(collection)\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', String(err)])\n }\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n const rows = await this.#query(\n `SELECT 1 FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = ?`,\n [collection]\n )\n return rows.length > 0\n }\n\n async renameCollection(from: string, to: string): Promise<void> {\n try {\n await this.#query(`RENAME TABLE ${ident(from)} TO ${ident(to)}`)\n const d = this.#dims.get(from)\n if (d !== undefined) {\n this.#dims.set(to, d)\n this.#dims.delete(from)\n }\n } catch (err) {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', String(err)])\n }\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection)\n try {\n for (const r of plan.records) {\n let vector = r.vector\n if (!vector && r.document) {\n const [v] = await this.encode([r.document], 'document')\n vector = v\n }\n if (!vector) {\n throw new E_VECTOR_STORE_UPSERT_FAILED(['Record missing vector and document'])\n }\n if (expected !== undefined && vector.length !== expected) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length])\n }\n const vecText = `[${vector.join(',')}]`\n const meta = r.metadata ? JSON.stringify(r.metadata) : '{}'\n await this.#query(\n `INSERT INTO ${ident(plan.collection)} (id, vec, document, metadata) ` +\n `VALUES (?, VEC_FromText(?), ?, ?) ` +\n `ON DUPLICATE KEY UPDATE vec = VEC_FromText(?), document = ?, metadata = ?`,\n [r.id, vecText, r.document ?? '', meta, vecText, r.document ?? '', meta]\n )\n }\n } catch (err) {\n if (\n isInstanceOf(err, 'E_VECTOR_STORE_DIMENSION_MISMATCH', E_VECTOR_STORE_DIMENSION_MISMATCH) ||\n isInstanceOf(err, 'E_VECTOR_STORE_UPSERT_FAILED', E_VECTOR_STORE_UPSERT_FAILED)\n ) {\n throw err\n }\n throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n }\n }\n\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n const metric = this.#opts.metric ?? 'cosine'\n let queryVector: number[] | undefined\n if (plan.near) {\n if ('vector' in plan.near) {\n queryVector = plan.near.vector\n } else if ('serverText' in plan.near) {\n const [v] = await this.encode([plan.near.serverText], 'query')\n queryVector = v\n } else if ('id' in plan.near) {\n const rows = await this.#query(\n `SELECT VEC_ToText(vec) vec FROM ${ident(plan.collection)} WHERE id = ?`,\n [plan.near.id]\n )\n if (rows.length === 0) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = this.#parseVec(rows[0].vec)\n }\n }\n\n const offset = plan.offset ?? 0\n try {\n if (queryVector) {\n const fn = distanceFn(metric)\n const vecText = `[${queryVector.join(',')}]`\n const rows = await this.#query(\n `SELECT id, VEC_ToText(vec) vec, document, metadata, ` +\n `${fn}(vec, VEC_FromText(?)) __dist FROM ${ident(plan.collection)}`,\n [vecText]\n )\n const filtered = plan.filter\n ? rows.filter((row) => evaluateFilter(plan.filter!, this.#parseMeta(row.metadata)))\n : rows\n filtered.sort((a, b) => Number(a.__dist) - Number(b.__dist))\n return filtered\n .slice(offset, offset + plan.topK)\n .map((row) => this.#project(row, plan, metric, true))\n } else {\n const rows = await this.#query(\n `SELECT id, VEC_ToText(vec) vec, document, metadata FROM ${ident(plan.collection)}`\n )\n const filtered = plan.filter\n ? rows.filter((row) => evaluateFilter(plan.filter!, this.#parseMeta(row.metadata)))\n : rows\n return filtered\n .slice(offset, offset + plan.topK)\n .map((row) => this.#project(row, plan, metric, false))\n }\n } catch (err) {\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\n }\n\n #project(row: any, plan: SearchPlan, metric: string, isKnn: boolean): VectorMatch {\n const proj = plan.projection\n const out: VectorMatch = {}\n if (proj.id) out.id = row.id as string\n if (proj.vector) out.vector = this.#parseVec(row.vec)\n if (proj.document) out.document = (row.document ?? undefined) as string | undefined\n if (proj.metadata) out.metadata = this.#parseMeta(row.metadata)\n if (isKnn && row.__dist !== undefined && row.__dist !== null) {\n out.score = normalizeScore(Number(row.__dist), metric as DistanceMetric, 'distance')\n }\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n try {\n if (plan.ids && plan.ids.length > 0) {\n const placeholders = plan.ids.map(() => '?').join(', ')\n await this.#query(\n `DELETE FROM ${ident(plan.collection)} WHERE id IN (${placeholders})`,\n plan.ids\n )\n } else if (plan.filter) {\n const rows = await this.#query(`SELECT id, metadata FROM ${ident(plan.collection)}`)\n const targets = rows\n .filter((row) => evaluateFilter(plan.filter!, this.#parseMeta(row.metadata)))\n .map((row) => row.id as string)\n if (targets.length > 0) {\n const placeholders = targets.map(() => '?').join(', ')\n await this.#query(\n `DELETE FROM ${ident(plan.collection)} WHERE id IN (${placeholders})`,\n targets\n )\n }\n } else {\n await this.#query(`DELETE FROM ${ident(plan.collection)}`)\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n"],"mappings":"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"}
@@ -14,6 +14,7 @@ import { BaseVectorStore } from "../contract";
14
14
  import type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from "../plan";
15
15
  import type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from "../types";
16
16
  export interface MeilisearchVectorStoreOptions extends BaseVectorStoreOptions {
17
+ /** Connection and authentication parameters for the backend. */
17
18
  connection?: {
18
19
  host?: string;
19
20
  apiKey?: string;
@@ -22,6 +23,7 @@ export interface MeilisearchVectorStoreOptions extends BaseVectorStoreOptions {
22
23
  export declare class MeilisearchVectorStore extends BaseVectorStore {
23
24
  #private;
24
25
  readonly capabilities: VectorStoreCapabilities;
26
+ /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
25
27
  static isAvailable(): boolean;
26
28
  isAvailable(): boolean;
27
29
  connect(): Promise<void>;
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  require("../../chunk-Ble4zEEl.js");
3
- const require_tool_registry = require("../../tool_registry-DYUYqXvo.js");
3
+ const require_tool_registry = require("../../tool_registry-CKJPze3j.js");
4
4
  require("../../guards.cjs");
5
5
  const require_batteries_vector_filters = require("./filters.cjs");
6
6
  const require_batteries_vector_exceptions = require("./exceptions.cjs");
@@ -45,6 +45,7 @@ var MeilisearchVectorStore = class extends require_batteries_vector_contract.Bas
45
45
  get #opts() {
46
46
  return this.options;
47
47
  }
48
+ /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
48
49
  static isAvailable() {
49
50
  return typeof process !== "undefined";
50
51
  }
@@ -1 +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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"}
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 and authentication parameters for the backend. */\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 availability probe: whether this adapter's runtime driver can load in the current environment. */\n static isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n\n async connect(): Promise<void> {\n if (this.#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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"}
@@ -1,4 +1,4 @@
1
- import { s as isInstanceOf } from "../../tool_registry-D1pSSlsd.mjs";
1
+ import { s as isInstanceOf } from "../../tool_registry-791Vrjtf.mjs";
2
2
  import "../../guards.mjs";
3
3
  import { evaluateFilter } from "./filters.mjs";
4
4
  import { 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";
@@ -43,6 +43,7 @@ var MeilisearchVectorStore = class extends BaseVectorStore {
43
43
  get #opts() {
44
44
  return this.options;
45
45
  }
46
+ /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
46
47
  static isAvailable() {
47
48
  return typeof process !== "undefined";
48
49
  }
@@ -1 +1 @@
1
- {"version":3,"file":"meilisearch.mjs","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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"}
1
+ {"version":3,"file":"meilisearch.mjs","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 and authentication parameters for the backend. */\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 availability probe: whether this adapter's runtime driver can load in the current environment. */\n static isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n\n async connect(): Promise<void> {\n if (this.#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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"}
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  require("../../chunk-Ble4zEEl.js");
3
- const require_tool_registry = require("../../tool_registry-DYUYqXvo.js");
3
+ const require_tool_registry = require("../../tool_registry-CKJPze3j.js");
4
4
  require("../../guards.cjs");
5
5
  const require_batteries_vector_exceptions = require("./exceptions.cjs");
6
6
  //#region src/batteries/vector/migrate.ts
@@ -9,15 +9,25 @@ const require_batteries_vector_exceptions = require("./exceptions.cjs");
9
9
  *
10
10
  * @module @nhtio/adk/batteries/vector/migrate
11
11
  */
12
+ /** Knex-style migration runner: applies pending migrations forward and rolls the last one back. */
12
13
  var VectorMigrator = class {
13
14
  #migrations;
14
15
  #ledger;
15
16
  #schema;
17
+ /**
18
+ * @param opts - The migrations, ledger, and schema facade to run against.
19
+ */
16
20
  constructor(opts) {
17
21
  this.#migrations = opts.migrations;
18
22
  this.#ledger = opts.ledger;
19
23
  this.#schema = opts.schema;
20
24
  }
25
+ /**
26
+ * Apply every not-yet-applied migration in order, recording each in the ledger.
27
+ *
28
+ * @returns The names of the migrations applied during this run.
29
+ * @throws {@link @nhtio/adk/batteries!E_VECTOR_STORE_MIGRATION_FAILED} when a migration's `up` throws.
30
+ */
21
31
  async latest() {
22
32
  const applied = await this.#ledger.applied();
23
33
  const toApply = this.#migrations.filter((m) => !applied.includes(m.name));
@@ -32,6 +42,13 @@ var VectorMigrator = class {
32
42
  }
33
43
  return appliedThisRun;
34
44
  }
45
+ /**
46
+ * Reverse the most recently applied migration and remove it from the ledger.
47
+ *
48
+ * @returns The name of the rolled-back migration, or `null` when nothing was applied.
49
+ * @throws {@link @nhtio/adk/batteries!E_VECTOR_STORE_MIGRATION_FAILED} when the migration module is missing or
50
+ * its `down` throws.
51
+ */
35
52
  async rollback() {
36
53
  const applied = await this.#ledger.applied();
37
54
  if (applied.length === 0) return null;
@@ -1 +1 @@
1
- {"version":3,"file":"migrate.cjs","names":["#migrations","#ledger","#schema"],"sources":["../../../src/batteries/vector/migrate.ts"],"sourcesContent":["/**\n * Knex-style migration runner for the vector battery.\n *\n * @module @nhtio/adk/batteries/vector/migrate\n */\n\nimport { isError } from '@nhtio/adk/guards'\nimport { E_VECTOR_STORE_MIGRATION_FAILED } from './exceptions'\nimport type { VectorSchemaBuilder } from './schema'\n\n// The context passed to each migration's up/down.\nexport interface VectorMigrationContext {\n schema: VectorSchemaBuilder\n}\n\n// A migration module shape.\nexport interface VectorMigration {\n name: string\n up: (ctx: VectorMigrationContext) => Promise<void>\n down: (ctx: VectorMigrationContext) => Promise<void>\n}\n\n// The ledger persists which migrations have run. Backed by a MigrationLedger the store provides.\nexport interface MigrationLedger {\n applied(): Promise<string[]>\n record(name: string): Promise<void>\n remove(name: string): Promise<void>\n}\n\nexport interface VectorMigrateOptions {\n migrations: VectorMigration[]\n ledger: MigrationLedger\n schema: VectorSchemaBuilder\n}\n\nexport class VectorMigrator {\n readonly #migrations: VectorMigration[]\n readonly #ledger: MigrationLedger\n readonly #schema: VectorSchemaBuilder\n\n constructor(opts: VectorMigrateOptions) {\n this.#migrations = opts.migrations\n this.#ledger = opts.ledger\n this.#schema = opts.schema\n }\n\n async latest(): Promise<string[]> {\n const applied = await this.#ledger.applied()\n const toApply = this.#migrations.filter((m) => !applied.includes(m.name))\n\n const appliedThisRun: string[] = []\n\n for (const migration of toApply) {\n try {\n await migration.up({ schema: this.#schema })\n await this.#ledger.record(migration.name)\n appliedThisRun.push(migration.name)\n } catch (err) {\n const msg = (value: unknown): string => (isError(value) ? value.message : String(value))\n throw new E_VECTOR_STORE_MIGRATION_FAILED([migration.name, msg(err)])\n }\n }\n\n return appliedThisRun\n }\n\n async rollback(): Promise<string | null> {\n const applied = await this.#ledger.applied()\n\n if (applied.length === 0) {\n return null\n }\n\n const lastApplied = applied[applied.length - 1]\n const migration = this.#migrations.find((m) => m.name === lastApplied)\n\n if (!migration) {\n throw new E_VECTOR_STORE_MIGRATION_FAILED([lastApplied, 'migration module not found'])\n }\n\n try {\n await migration.down({ schema: this.#schema })\n await this.#ledger.remove(lastApplied)\n return lastApplied\n } catch (err) {\n const msg = (value: unknown): string => (isError(value) ? value.message : String(value))\n throw new E_VECTOR_STORE_MIGRATION_FAILED([lastApplied, msg(err)])\n }\n }\n}\n"],"mappings":";;;;;;;;;;;AAmCA,IAAa,iBAAb,MAA4B;CAC1B;CACA;CACA;CAEA,YAAY,MAA4B;EACtC,KAAKA,cAAc,KAAK;EACxB,KAAKC,UAAU,KAAK;EACpB,KAAKC,UAAU,KAAK;CACtB;CAEA,MAAM,SAA4B;EAChC,MAAM,UAAU,MAAM,KAAKD,QAAQ,QAAQ;EAC3C,MAAM,UAAU,KAAKD,YAAY,QAAQ,MAAM,CAAC,QAAQ,SAAS,EAAE,IAAI,CAAC;EAExE,MAAM,iBAA2B,CAAC;EAElC,KAAK,MAAM,aAAa,SACtB,IAAI;GACF,MAAM,UAAU,GAAG,EAAE,QAAQ,KAAKE,QAAQ,CAAC;GAC3C,MAAM,KAAKD,QAAQ,OAAO,UAAU,IAAI;GACxC,eAAe,KAAK,UAAU,IAAI;EACpC,SAAS,KAAK;GACZ,MAAM,OAAO,UAA4B,sBAAA,QAAQ,KAAK,IAAI,MAAM,UAAU,OAAO,KAAK;GACtF,MAAM,IAAI,oCAAA,gCAAgC,CAAC,UAAU,MAAM,IAAI,GAAG,CAAC,CAAC;EACtE;EAGF,OAAO;CACT;CAEA,MAAM,WAAmC;EACvC,MAAM,UAAU,MAAM,KAAKA,QAAQ,QAAQ;EAE3C,IAAI,QAAQ,WAAW,GACrB,OAAO;EAGT,MAAM,cAAc,QAAQ,QAAQ,SAAS;EAC7C,MAAM,YAAY,KAAKD,YAAY,MAAM,MAAM,EAAE,SAAS,WAAW;EAErE,IAAI,CAAC,WACH,MAAM,IAAI,oCAAA,gCAAgC,CAAC,aAAa,4BAA4B,CAAC;EAGvF,IAAI;GACF,MAAM,UAAU,KAAK,EAAE,QAAQ,KAAKE,QAAQ,CAAC;GAC7C,MAAM,KAAKD,QAAQ,OAAO,WAAW;GACrC,OAAO;EACT,SAAS,KAAK;GACZ,MAAM,OAAO,UAA4B,sBAAA,QAAQ,KAAK,IAAI,MAAM,UAAU,OAAO,KAAK;GACtF,MAAM,IAAI,oCAAA,gCAAgC,CAAC,aAAa,IAAI,GAAG,CAAC,CAAC;EACnE;CACF;AACF"}
1
+ {"version":3,"file":"migrate.cjs","names":["#migrations","#ledger","#schema"],"sources":["../../../src/batteries/vector/migrate.ts"],"sourcesContent":["/**\n * Knex-style migration runner for the vector battery.\n *\n * @module @nhtio/adk/batteries/vector/migrate\n */\n\nimport { isError } from '@nhtio/adk/guards'\nimport { E_VECTOR_STORE_MIGRATION_FAILED } from './exceptions'\nimport type { VectorSchemaBuilder } from './schema'\n\n/** The context passed to each migration's `up`/`down` — exposes the schema builder. */\nexport interface VectorMigrationContext {\n /** Schema facade for performing collection DDL within the migration. */\n schema: VectorSchemaBuilder\n}\n\n/** A single migration module: a name plus its forward (`up`) and reverse (`down`) steps. */\nexport interface VectorMigration {\n /** Unique migration name, used as its ledger key. */\n name: string\n /** Apply the migration. */\n up: (ctx: VectorMigrationContext) => Promise<void>\n /** Reverse the migration. */\n down: (ctx: VectorMigrationContext) => Promise<void>\n}\n\n/** Persistence for which migrations have run; backed by a store-provided implementation. */\nexport interface MigrationLedger {\n /** Resolve the names of migrations already applied, in application order. */\n applied(): Promise<string[]>\n /** Record `name` as applied. */\n record(name: string): Promise<void>\n /** Remove `name` from the applied set (on rollback). */\n remove(name: string): Promise<void>\n}\n\n/** Construction options for a {@link VectorMigrator}. */\nexport interface VectorMigrateOptions {\n /** The ordered set of migration modules. */\n migrations: VectorMigration[]\n /** Ledger tracking which migrations have run. */\n ledger: MigrationLedger\n /** Schema facade handed to each migration. */\n schema: VectorSchemaBuilder\n}\n\n/** Knex-style migration runner: applies pending migrations forward and rolls the last one back. */\nexport class VectorMigrator {\n readonly #migrations: VectorMigration[]\n readonly #ledger: MigrationLedger\n readonly #schema: VectorSchemaBuilder\n\n /**\n * @param opts - The migrations, ledger, and schema facade to run against.\n */\n constructor(opts: VectorMigrateOptions) {\n this.#migrations = opts.migrations\n this.#ledger = opts.ledger\n this.#schema = opts.schema\n }\n\n /**\n * Apply every not-yet-applied migration in order, recording each in the ledger.\n *\n * @returns The names of the migrations applied during this run.\n * @throws {@link @nhtio/adk/batteries!E_VECTOR_STORE_MIGRATION_FAILED} when a migration's `up` throws.\n */\n async latest(): Promise<string[]> {\n const applied = await this.#ledger.applied()\n const toApply = this.#migrations.filter((m) => !applied.includes(m.name))\n\n const appliedThisRun: string[] = []\n\n for (const migration of toApply) {\n try {\n await migration.up({ schema: this.#schema })\n await this.#ledger.record(migration.name)\n appliedThisRun.push(migration.name)\n } catch (err) {\n const msg = (value: unknown): string => (isError(value) ? value.message : String(value))\n throw new E_VECTOR_STORE_MIGRATION_FAILED([migration.name, msg(err)])\n }\n }\n\n return appliedThisRun\n }\n\n /**\n * Reverse the most recently applied migration and remove it from the ledger.\n *\n * @returns The name of the rolled-back migration, or `null` when nothing was applied.\n * @throws {@link @nhtio/adk/batteries!E_VECTOR_STORE_MIGRATION_FAILED} when the migration module is missing or\n * its `down` throws.\n */\n async rollback(): Promise<string | null> {\n const applied = await this.#ledger.applied()\n\n if (applied.length === 0) {\n return null\n }\n\n const lastApplied = applied[applied.length - 1]\n const migration = this.#migrations.find((m) => m.name === lastApplied)\n\n if (!migration) {\n throw new E_VECTOR_STORE_MIGRATION_FAILED([lastApplied, 'migration module not found'])\n }\n\n try {\n await migration.down({ schema: this.#schema })\n await this.#ledger.remove(lastApplied)\n return lastApplied\n } catch (err) {\n const msg = (value: unknown): string => (isError(value) ? value.message : String(value))\n throw new E_VECTOR_STORE_MIGRATION_FAILED([lastApplied, msg(err)])\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;AA+CA,IAAa,iBAAb,MAA4B;CAC1B;CACA;CACA;;;;CAKA,YAAY,MAA4B;EACtC,KAAKA,cAAc,KAAK;EACxB,KAAKC,UAAU,KAAK;EACpB,KAAKC,UAAU,KAAK;CACtB;;;;;;;CAQA,MAAM,SAA4B;EAChC,MAAM,UAAU,MAAM,KAAKD,QAAQ,QAAQ;EAC3C,MAAM,UAAU,KAAKD,YAAY,QAAQ,MAAM,CAAC,QAAQ,SAAS,EAAE,IAAI,CAAC;EAExE,MAAM,iBAA2B,CAAC;EAElC,KAAK,MAAM,aAAa,SACtB,IAAI;GACF,MAAM,UAAU,GAAG,EAAE,QAAQ,KAAKE,QAAQ,CAAC;GAC3C,MAAM,KAAKD,QAAQ,OAAO,UAAU,IAAI;GACxC,eAAe,KAAK,UAAU,IAAI;EACpC,SAAS,KAAK;GACZ,MAAM,OAAO,UAA4B,sBAAA,QAAQ,KAAK,IAAI,MAAM,UAAU,OAAO,KAAK;GACtF,MAAM,IAAI,oCAAA,gCAAgC,CAAC,UAAU,MAAM,IAAI,GAAG,CAAC,CAAC;EACtE;EAGF,OAAO;CACT;;;;;;;;CASA,MAAM,WAAmC;EACvC,MAAM,UAAU,MAAM,KAAKA,QAAQ,QAAQ;EAE3C,IAAI,QAAQ,WAAW,GACrB,OAAO;EAGT,MAAM,cAAc,QAAQ,QAAQ,SAAS;EAC7C,MAAM,YAAY,KAAKD,YAAY,MAAM,MAAM,EAAE,SAAS,WAAW;EAErE,IAAI,CAAC,WACH,MAAM,IAAI,oCAAA,gCAAgC,CAAC,aAAa,4BAA4B,CAAC;EAGvF,IAAI;GACF,MAAM,UAAU,KAAK,EAAE,QAAQ,KAAKE,QAAQ,CAAC;GAC7C,MAAM,KAAKD,QAAQ,OAAO,WAAW;GACrC,OAAO;EACT,SAAS,KAAK;GACZ,MAAM,OAAO,UAA4B,sBAAA,QAAQ,KAAK,IAAI,MAAM,UAAU,OAAO,KAAK;GACtF,MAAM,IAAI,oCAAA,gCAAgC,CAAC,aAAa,IAAI,GAAG,CAAC,CAAC;EACnE;CACF;AACF"}
@@ -4,27 +4,58 @@
4
4
  * @module @nhtio/adk/batteries/vector/migrate
5
5
  */
6
6
  import type { VectorSchemaBuilder } from "./schema";
7
+ /** The context passed to each migration's `up`/`down` — exposes the schema builder. */
7
8
  export interface VectorMigrationContext {
9
+ /** Schema facade for performing collection DDL within the migration. */
8
10
  schema: VectorSchemaBuilder;
9
11
  }
12
+ /** A single migration module: a name plus its forward (`up`) and reverse (`down`) steps. */
10
13
  export interface VectorMigration {
14
+ /** Unique migration name, used as its ledger key. */
11
15
  name: string;
16
+ /** Apply the migration. */
12
17
  up: (ctx: VectorMigrationContext) => Promise<void>;
18
+ /** Reverse the migration. */
13
19
  down: (ctx: VectorMigrationContext) => Promise<void>;
14
20
  }
21
+ /** Persistence for which migrations have run; backed by a store-provided implementation. */
15
22
  export interface MigrationLedger {
23
+ /** Resolve the names of migrations already applied, in application order. */
16
24
  applied(): Promise<string[]>;
25
+ /** Record `name` as applied. */
17
26
  record(name: string): Promise<void>;
27
+ /** Remove `name` from the applied set (on rollback). */
18
28
  remove(name: string): Promise<void>;
19
29
  }
30
+ /** Construction options for a {@link VectorMigrator}. */
20
31
  export interface VectorMigrateOptions {
32
+ /** The ordered set of migration modules. */
21
33
  migrations: VectorMigration[];
34
+ /** Ledger tracking which migrations have run. */
22
35
  ledger: MigrationLedger;
36
+ /** Schema facade handed to each migration. */
23
37
  schema: VectorSchemaBuilder;
24
38
  }
39
+ /** Knex-style migration runner: applies pending migrations forward and rolls the last one back. */
25
40
  export declare class VectorMigrator {
26
41
  #private;
42
+ /**
43
+ * @param opts - The migrations, ledger, and schema facade to run against.
44
+ */
27
45
  constructor(opts: VectorMigrateOptions);
46
+ /**
47
+ * Apply every not-yet-applied migration in order, recording each in the ledger.
48
+ *
49
+ * @returns The names of the migrations applied during this run.
50
+ * @throws {@link @nhtio/adk/batteries!E_VECTOR_STORE_MIGRATION_FAILED} when a migration's `up` throws.
51
+ */
28
52
  latest(): Promise<string[]>;
53
+ /**
54
+ * Reverse the most recently applied migration and remove it from the ledger.
55
+ *
56
+ * @returns The name of the rolled-back migration, or `null` when nothing was applied.
57
+ * @throws {@link @nhtio/adk/batteries!E_VECTOR_STORE_MIGRATION_FAILED} when the migration module is missing or
58
+ * its `down` throws.
59
+ */
29
60
  rollback(): Promise<string | null>;
30
61
  }
@@ -1,4 +1,4 @@
1
- import { o as isError } from "../../tool_registry-D1pSSlsd.mjs";
1
+ import { o as isError } from "../../tool_registry-791Vrjtf.mjs";
2
2
  import "../../guards.mjs";
3
3
  import { E_VECTOR_STORE_MIGRATION_FAILED } from "./exceptions.mjs";
4
4
  //#region src/batteries/vector/migrate.ts
@@ -7,15 +7,25 @@ import { E_VECTOR_STORE_MIGRATION_FAILED } from "./exceptions.mjs";
7
7
  *
8
8
  * @module @nhtio/adk/batteries/vector/migrate
9
9
  */
10
+ /** Knex-style migration runner: applies pending migrations forward and rolls the last one back. */
10
11
  var VectorMigrator = class {
11
12
  #migrations;
12
13
  #ledger;
13
14
  #schema;
15
+ /**
16
+ * @param opts - The migrations, ledger, and schema facade to run against.
17
+ */
14
18
  constructor(opts) {
15
19
  this.#migrations = opts.migrations;
16
20
  this.#ledger = opts.ledger;
17
21
  this.#schema = opts.schema;
18
22
  }
23
+ /**
24
+ * Apply every not-yet-applied migration in order, recording each in the ledger.
25
+ *
26
+ * @returns The names of the migrations applied during this run.
27
+ * @throws {@link @nhtio/adk/batteries!E_VECTOR_STORE_MIGRATION_FAILED} when a migration's `up` throws.
28
+ */
19
29
  async latest() {
20
30
  const applied = await this.#ledger.applied();
21
31
  const toApply = this.#migrations.filter((m) => !applied.includes(m.name));
@@ -30,6 +40,13 @@ var VectorMigrator = class {
30
40
  }
31
41
  return appliedThisRun;
32
42
  }
43
+ /**
44
+ * Reverse the most recently applied migration and remove it from the ledger.
45
+ *
46
+ * @returns The name of the rolled-back migration, or `null` when nothing was applied.
47
+ * @throws {@link @nhtio/adk/batteries!E_VECTOR_STORE_MIGRATION_FAILED} when the migration module is missing or
48
+ * its `down` throws.
49
+ */
33
50
  async rollback() {
34
51
  const applied = await this.#ledger.applied();
35
52
  if (applied.length === 0) return null;
@@ -1 +1 @@
1
- {"version":3,"file":"migrate.mjs","names":["#migrations","#ledger","#schema"],"sources":["../../../src/batteries/vector/migrate.ts"],"sourcesContent":["/**\n * Knex-style migration runner for the vector battery.\n *\n * @module @nhtio/adk/batteries/vector/migrate\n */\n\nimport { isError } from '@nhtio/adk/guards'\nimport { E_VECTOR_STORE_MIGRATION_FAILED } from './exceptions'\nimport type { VectorSchemaBuilder } from './schema'\n\n// The context passed to each migration's up/down.\nexport interface VectorMigrationContext {\n schema: VectorSchemaBuilder\n}\n\n// A migration module shape.\nexport interface VectorMigration {\n name: string\n up: (ctx: VectorMigrationContext) => Promise<void>\n down: (ctx: VectorMigrationContext) => Promise<void>\n}\n\n// The ledger persists which migrations have run. Backed by a MigrationLedger the store provides.\nexport interface MigrationLedger {\n applied(): Promise<string[]>\n record(name: string): Promise<void>\n remove(name: string): Promise<void>\n}\n\nexport interface VectorMigrateOptions {\n migrations: VectorMigration[]\n ledger: MigrationLedger\n schema: VectorSchemaBuilder\n}\n\nexport class VectorMigrator {\n readonly #migrations: VectorMigration[]\n readonly #ledger: MigrationLedger\n readonly #schema: VectorSchemaBuilder\n\n constructor(opts: VectorMigrateOptions) {\n this.#migrations = opts.migrations\n this.#ledger = opts.ledger\n this.#schema = opts.schema\n }\n\n async latest(): Promise<string[]> {\n const applied = await this.#ledger.applied()\n const toApply = this.#migrations.filter((m) => !applied.includes(m.name))\n\n const appliedThisRun: string[] = []\n\n for (const migration of toApply) {\n try {\n await migration.up({ schema: this.#schema })\n await this.#ledger.record(migration.name)\n appliedThisRun.push(migration.name)\n } catch (err) {\n const msg = (value: unknown): string => (isError(value) ? value.message : String(value))\n throw new E_VECTOR_STORE_MIGRATION_FAILED([migration.name, msg(err)])\n }\n }\n\n return appliedThisRun\n }\n\n async rollback(): Promise<string | null> {\n const applied = await this.#ledger.applied()\n\n if (applied.length === 0) {\n return null\n }\n\n const lastApplied = applied[applied.length - 1]\n const migration = this.#migrations.find((m) => m.name === lastApplied)\n\n if (!migration) {\n throw new E_VECTOR_STORE_MIGRATION_FAILED([lastApplied, 'migration module not found'])\n }\n\n try {\n await migration.down({ schema: this.#schema })\n await this.#ledger.remove(lastApplied)\n return lastApplied\n } catch (err) {\n const msg = (value: unknown): string => (isError(value) ? value.message : String(value))\n throw new E_VECTOR_STORE_MIGRATION_FAILED([lastApplied, msg(err)])\n }\n }\n}\n"],"mappings":";;;;;;;;;AAmCA,IAAa,iBAAb,MAA4B;CAC1B;CACA;CACA;CAEA,YAAY,MAA4B;EACtC,KAAKA,cAAc,KAAK;EACxB,KAAKC,UAAU,KAAK;EACpB,KAAKC,UAAU,KAAK;CACtB;CAEA,MAAM,SAA4B;EAChC,MAAM,UAAU,MAAM,KAAKD,QAAQ,QAAQ;EAC3C,MAAM,UAAU,KAAKD,YAAY,QAAQ,MAAM,CAAC,QAAQ,SAAS,EAAE,IAAI,CAAC;EAExE,MAAM,iBAA2B,CAAC;EAElC,KAAK,MAAM,aAAa,SACtB,IAAI;GACF,MAAM,UAAU,GAAG,EAAE,QAAQ,KAAKE,QAAQ,CAAC;GAC3C,MAAM,KAAKD,QAAQ,OAAO,UAAU,IAAI;GACxC,eAAe,KAAK,UAAU,IAAI;EACpC,SAAS,KAAK;GACZ,MAAM,OAAO,UAA4B,QAAQ,KAAK,IAAI,MAAM,UAAU,OAAO,KAAK;GACtF,MAAM,IAAI,gCAAgC,CAAC,UAAU,MAAM,IAAI,GAAG,CAAC,CAAC;EACtE;EAGF,OAAO;CACT;CAEA,MAAM,WAAmC;EACvC,MAAM,UAAU,MAAM,KAAKA,QAAQ,QAAQ;EAE3C,IAAI,QAAQ,WAAW,GACrB,OAAO;EAGT,MAAM,cAAc,QAAQ,QAAQ,SAAS;EAC7C,MAAM,YAAY,KAAKD,YAAY,MAAM,MAAM,EAAE,SAAS,WAAW;EAErE,IAAI,CAAC,WACH,MAAM,IAAI,gCAAgC,CAAC,aAAa,4BAA4B,CAAC;EAGvF,IAAI;GACF,MAAM,UAAU,KAAK,EAAE,QAAQ,KAAKE,QAAQ,CAAC;GAC7C,MAAM,KAAKD,QAAQ,OAAO,WAAW;GACrC,OAAO;EACT,SAAS,KAAK;GACZ,MAAM,OAAO,UAA4B,QAAQ,KAAK,IAAI,MAAM,UAAU,OAAO,KAAK;GACtF,MAAM,IAAI,gCAAgC,CAAC,aAAa,IAAI,GAAG,CAAC,CAAC;EACnE;CACF;AACF"}
1
+ {"version":3,"file":"migrate.mjs","names":["#migrations","#ledger","#schema"],"sources":["../../../src/batteries/vector/migrate.ts"],"sourcesContent":["/**\n * Knex-style migration runner for the vector battery.\n *\n * @module @nhtio/adk/batteries/vector/migrate\n */\n\nimport { isError } from '@nhtio/adk/guards'\nimport { E_VECTOR_STORE_MIGRATION_FAILED } from './exceptions'\nimport type { VectorSchemaBuilder } from './schema'\n\n/** The context passed to each migration's `up`/`down` — exposes the schema builder. */\nexport interface VectorMigrationContext {\n /** Schema facade for performing collection DDL within the migration. */\n schema: VectorSchemaBuilder\n}\n\n/** A single migration module: a name plus its forward (`up`) and reverse (`down`) steps. */\nexport interface VectorMigration {\n /** Unique migration name, used as its ledger key. */\n name: string\n /** Apply the migration. */\n up: (ctx: VectorMigrationContext) => Promise<void>\n /** Reverse the migration. */\n down: (ctx: VectorMigrationContext) => Promise<void>\n}\n\n/** Persistence for which migrations have run; backed by a store-provided implementation. */\nexport interface MigrationLedger {\n /** Resolve the names of migrations already applied, in application order. */\n applied(): Promise<string[]>\n /** Record `name` as applied. */\n record(name: string): Promise<void>\n /** Remove `name` from the applied set (on rollback). */\n remove(name: string): Promise<void>\n}\n\n/** Construction options for a {@link VectorMigrator}. */\nexport interface VectorMigrateOptions {\n /** The ordered set of migration modules. */\n migrations: VectorMigration[]\n /** Ledger tracking which migrations have run. */\n ledger: MigrationLedger\n /** Schema facade handed to each migration. */\n schema: VectorSchemaBuilder\n}\n\n/** Knex-style migration runner: applies pending migrations forward and rolls the last one back. */\nexport class VectorMigrator {\n readonly #migrations: VectorMigration[]\n readonly #ledger: MigrationLedger\n readonly #schema: VectorSchemaBuilder\n\n /**\n * @param opts - The migrations, ledger, and schema facade to run against.\n */\n constructor(opts: VectorMigrateOptions) {\n this.#migrations = opts.migrations\n this.#ledger = opts.ledger\n this.#schema = opts.schema\n }\n\n /**\n * Apply every not-yet-applied migration in order, recording each in the ledger.\n *\n * @returns The names of the migrations applied during this run.\n * @throws {@link @nhtio/adk/batteries!E_VECTOR_STORE_MIGRATION_FAILED} when a migration's `up` throws.\n */\n async latest(): Promise<string[]> {\n const applied = await this.#ledger.applied()\n const toApply = this.#migrations.filter((m) => !applied.includes(m.name))\n\n const appliedThisRun: string[] = []\n\n for (const migration of toApply) {\n try {\n await migration.up({ schema: this.#schema })\n await this.#ledger.record(migration.name)\n appliedThisRun.push(migration.name)\n } catch (err) {\n const msg = (value: unknown): string => (isError(value) ? value.message : String(value))\n throw new E_VECTOR_STORE_MIGRATION_FAILED([migration.name, msg(err)])\n }\n }\n\n return appliedThisRun\n }\n\n /**\n * Reverse the most recently applied migration and remove it from the ledger.\n *\n * @returns The name of the rolled-back migration, or `null` when nothing was applied.\n * @throws {@link @nhtio/adk/batteries!E_VECTOR_STORE_MIGRATION_FAILED} when the migration module is missing or\n * its `down` throws.\n */\n async rollback(): Promise<string | null> {\n const applied = await this.#ledger.applied()\n\n if (applied.length === 0) {\n return null\n }\n\n const lastApplied = applied[applied.length - 1]\n const migration = this.#migrations.find((m) => m.name === lastApplied)\n\n if (!migration) {\n throw new E_VECTOR_STORE_MIGRATION_FAILED([lastApplied, 'migration module not found'])\n }\n\n try {\n await migration.down({ schema: this.#schema })\n await this.#ledger.remove(lastApplied)\n return lastApplied\n } catch (err) {\n const msg = (value: unknown): string => (isError(value) ? value.message : String(value))\n throw new E_VECTOR_STORE_MIGRATION_FAILED([lastApplied, msg(err)])\n }\n }\n}\n"],"mappings":";;;;;;;;;;AA+CA,IAAa,iBAAb,MAA4B;CAC1B;CACA;CACA;;;;CAKA,YAAY,MAA4B;EACtC,KAAKA,cAAc,KAAK;EACxB,KAAKC,UAAU,KAAK;EACpB,KAAKC,UAAU,KAAK;CACtB;;;;;;;CAQA,MAAM,SAA4B;EAChC,MAAM,UAAU,MAAM,KAAKD,QAAQ,QAAQ;EAC3C,MAAM,UAAU,KAAKD,YAAY,QAAQ,MAAM,CAAC,QAAQ,SAAS,EAAE,IAAI,CAAC;EAExE,MAAM,iBAA2B,CAAC;EAElC,KAAK,MAAM,aAAa,SACtB,IAAI;GACF,MAAM,UAAU,GAAG,EAAE,QAAQ,KAAKE,QAAQ,CAAC;GAC3C,MAAM,KAAKD,QAAQ,OAAO,UAAU,IAAI;GACxC,eAAe,KAAK,UAAU,IAAI;EACpC,SAAS,KAAK;GACZ,MAAM,OAAO,UAA4B,QAAQ,KAAK,IAAI,MAAM,UAAU,OAAO,KAAK;GACtF,MAAM,IAAI,gCAAgC,CAAC,UAAU,MAAM,IAAI,GAAG,CAAC,CAAC;EACtE;EAGF,OAAO;CACT;;;;;;;;CASA,MAAM,WAAmC;EACvC,MAAM,UAAU,MAAM,KAAKA,QAAQ,QAAQ;EAE3C,IAAI,QAAQ,WAAW,GACrB,OAAO;EAGT,MAAM,cAAc,QAAQ,QAAQ,SAAS;EAC7C,MAAM,YAAY,KAAKD,YAAY,MAAM,MAAM,EAAE,SAAS,WAAW;EAErE,IAAI,CAAC,WACH,MAAM,IAAI,gCAAgC,CAAC,aAAa,4BAA4B,CAAC;EAGvF,IAAI;GACF,MAAM,UAAU,KAAK,EAAE,QAAQ,KAAKE,QAAQ,CAAC;GAC7C,MAAM,KAAKD,QAAQ,OAAO,WAAW;GACrC,OAAO;EACT,SAAS,KAAK;GACZ,MAAM,OAAO,UAA4B,QAAQ,KAAK,IAAI,MAAM,UAAU,OAAO,KAAK;GACtF,MAAM,IAAI,gCAAgC,CAAC,aAAa,IAAI,GAAG,CAAC,CAAC;EACnE;CACF;AACF"}
@@ -6,6 +6,7 @@ import type { VectorFilter } from "../filters";
6
6
  import type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from "../plan";
7
7
  import type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from "../types";
8
8
  export interface MilvusVectorStoreOptions extends BaseVectorStoreOptions {
9
+ /** Connection and authentication parameters for the backend. */
9
10
  connection?: {
10
11
  address?: string;
11
12
  url?: string;
@@ -18,6 +19,7 @@ export interface MilvusVectorStoreOptions extends BaseVectorStoreOptions {
18
19
  export declare class MilvusVectorStore extends BaseVectorStore {
19
20
  #private;
20
21
  readonly capabilities: VectorStoreCapabilities;
22
+ /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
21
23
  static isAvailable(): boolean;
22
24
  isAvailable(): boolean;
23
25
  connect(): Promise<void>;
@@ -29,7 +31,10 @@ export declare class MilvusVectorStore extends BaseVectorStore {
29
31
  executeUpsert(plan: UpsertPlan): Promise<void>;
30
32
  executeSearch(plan: SearchPlan): Promise<VectorMatch[]>;
31
33
  executeDelete(plan: DeletePlan): Promise<void>;
34
+ /** Project a raw Milvus hit into a {@link VectorMatch} per the requested projection, normalizing its score. */
32
35
  projectHit(hit: any, projection: any, metric: string): VectorMatch;
36
+ /** Instance wrapper over the module-level {@link translateMilvusFilter}. */
33
37
  translateMilvusFilter(filter?: VectorFilter): string;
34
38
  }
39
+ /** Translate a neutral {@link VectorFilter} into a Milvus boolean filter expression string. */
35
40
  export declare const translateMilvusFilter: (filter?: VectorFilter) => string;
@@ -47,6 +47,7 @@ var MilvusVectorStore = class extends require_batteries_vector_contract.BaseVect
47
47
  get #opts() {
48
48
  return this.options;
49
49
  }
50
+ /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
50
51
  static isAvailable() {
51
52
  return typeof process !== "undefined";
52
53
  }
@@ -271,6 +272,7 @@ var MilvusVectorStore = class extends require_batteries_vector_contract.BaseVect
271
272
  throw new require_batteries_vector_exceptions.E_VECTOR_STORE_DELETE_FAILED([String(err)]);
272
273
  }
273
274
  }
275
+ /** Project a raw Milvus hit into a {@link VectorMatch} per the requested projection, normalizing its score. */
274
276
  projectHit(hit, projection, metric) {
275
277
  const out = {};
276
278
  if (projection.id) out.id = hit.id;
@@ -283,10 +285,12 @@ var MilvusVectorStore = class extends require_batteries_vector_contract.BaseVect
283
285
  }
284
286
  return out;
285
287
  }
288
+ /** Instance wrapper over the module-level {@link translateMilvusFilter}. */
286
289
  translateMilvusFilter(filter) {
287
290
  return translateMilvusFilter(filter);
288
291
  }
289
292
  };
293
+ /** Translate a neutral {@link VectorFilter} into a Milvus boolean filter expression string. */
290
294
  var translateMilvusFilter = (filter) => {
291
295
  if (!filter) return "";
292
296
  if (require_batteries_vector_filters.isRawFilter(filter)) {