@nhtio/adk 1.20260604.0 → 1.20260607.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (358) hide show
  1. package/CHANGELOG.md +261 -0
  2. package/adk-mcp.mjs +1 -1
  3. package/batteries/embeddings/openai/adapter.cjs +1 -1
  4. package/batteries/embeddings/openai/adapter.mjs +1 -1
  5. package/batteries/embeddings/webllm/adapter.cjs +1 -1
  6. package/batteries/embeddings/webllm/adapter.mjs +1 -1
  7. package/batteries/index.d.ts +1 -0
  8. package/batteries/llm/openai_chat_completions/adapter.cjs +6 -6
  9. package/batteries/llm/openai_chat_completions/adapter.cjs.map +1 -1
  10. package/batteries/llm/openai_chat_completions/adapter.mjs +6 -6
  11. package/batteries/llm/openai_chat_completions/adapter.mjs.map +1 -1
  12. package/batteries/llm/openai_chat_completions/helpers.cjs +2 -2
  13. package/batteries/llm/openai_chat_completions/helpers.mjs +2 -2
  14. package/batteries/llm/openai_chat_completions/validation.cjs +2 -2
  15. package/batteries/llm/openai_chat_completions/validation.cjs.map +1 -1
  16. package/batteries/llm/openai_chat_completions/validation.mjs +2 -2
  17. package/batteries/llm/openai_chat_completions/validation.mjs.map +1 -1
  18. package/batteries/llm/webllm_chat_completions/adapter.cjs +6 -6
  19. package/batteries/llm/webllm_chat_completions/adapter.cjs.map +1 -1
  20. package/batteries/llm/webllm_chat_completions/adapter.mjs +6 -6
  21. package/batteries/llm/webllm_chat_completions/adapter.mjs.map +1 -1
  22. package/batteries/llm/webllm_chat_completions/validation.cjs +2 -2
  23. package/batteries/llm/webllm_chat_completions/validation.cjs.map +1 -1
  24. package/batteries/llm/webllm_chat_completions/validation.mjs +2 -2
  25. package/batteries/llm/webllm_chat_completions/validation.mjs.map +1 -1
  26. package/batteries/storage/flydrive.cjs +1 -1
  27. package/batteries/storage/flydrive.mjs +2 -2
  28. package/batteries/storage/in_memory.cjs +1 -1
  29. package/batteries/storage/in_memory.mjs +1 -1
  30. package/batteries/storage/opfs.cjs +1 -1
  31. package/batteries/storage/opfs.mjs +1 -1
  32. package/batteries/tools/color.cjs +2 -2
  33. package/batteries/tools/color.mjs +2 -2
  34. package/batteries/tools/comparison.cjs +3 -3
  35. package/batteries/tools/comparison.mjs +3 -3
  36. package/batteries/tools/data_structure.cjs +3 -3
  37. package/batteries/tools/data_structure.mjs +3 -3
  38. package/batteries/tools/datetime_extended.cjs +2 -2
  39. package/batteries/tools/datetime_extended.mjs +2 -2
  40. package/batteries/tools/datetime_math.cjs +2 -2
  41. package/batteries/tools/datetime_math.mjs +2 -2
  42. package/batteries/tools/encoding.cjs +3 -3
  43. package/batteries/tools/encoding.mjs +3 -3
  44. package/batteries/tools/formatting.cjs +3 -3
  45. package/batteries/tools/formatting.mjs +3 -3
  46. package/batteries/tools/geo_basics.cjs +2 -2
  47. package/batteries/tools/geo_basics.mjs +2 -2
  48. package/batteries/tools/math/index.d.ts +16 -5
  49. package/batteries/tools/math.cjs +340 -22
  50. package/batteries/tools/math.cjs.map +1 -1
  51. package/batteries/tools/math.mjs +338 -21
  52. package/batteries/tools/math.mjs.map +1 -1
  53. package/batteries/tools/memory.cjs +5 -5
  54. package/batteries/tools/memory.mjs +5 -5
  55. package/batteries/tools/parsing.cjs +4 -4
  56. package/batteries/tools/parsing.mjs +4 -4
  57. package/batteries/tools/retrievables.cjs +4 -4
  58. package/batteries/tools/retrievables.mjs +4 -4
  59. package/batteries/tools/standing_instructions.cjs +4 -4
  60. package/batteries/tools/standing_instructions.mjs +4 -4
  61. package/batteries/tools/statistics.cjs +4 -4
  62. package/batteries/tools/statistics.mjs +4 -4
  63. package/batteries/tools/string_processing.cjs +3 -3
  64. package/batteries/tools/string_processing.mjs +3 -3
  65. package/batteries/tools/structured_data.cjs +3 -3
  66. package/batteries/tools/structured_data.mjs +3 -3
  67. package/batteries/tools/text_analysis.cjs +3 -3
  68. package/batteries/tools/text_analysis.mjs +3 -3
  69. package/batteries/tools/text_comparison.cjs +2 -2
  70. package/batteries/tools/text_comparison.mjs +2 -2
  71. package/batteries/tools/time.cjs +2 -2
  72. package/batteries/tools/time.mjs +2 -2
  73. package/batteries/tools/unit_conversion.cjs +2 -2
  74. package/batteries/tools/unit_conversion.mjs +2 -2
  75. package/batteries/vector/arangodb/index.d.ts +38 -0
  76. package/batteries/vector/arangodb.cjs +257 -0
  77. package/batteries/vector/arangodb.cjs.map +1 -0
  78. package/batteries/vector/arangodb.mjs +255 -0
  79. package/batteries/vector/arangodb.mjs.map +1 -0
  80. package/batteries/vector/builder.cjs +297 -0
  81. package/batteries/vector/builder.cjs.map +1 -0
  82. package/batteries/vector/builder.d.ts +87 -0
  83. package/batteries/vector/builder.mjs +294 -0
  84. package/batteries/vector/builder.mjs.map +1 -0
  85. package/batteries/vector/chroma/index.d.ts +32 -0
  86. package/batteries/vector/chroma.cjs +305 -0
  87. package/batteries/vector/chroma.cjs.map +1 -0
  88. package/batteries/vector/chroma.mjs +302 -0
  89. package/batteries/vector/chroma.mjs.map +1 -0
  90. package/batteries/vector/clickhouse/index.d.ts +39 -0
  91. package/batteries/vector/clickhouse.cjs +246 -0
  92. package/batteries/vector/clickhouse.cjs.map +1 -0
  93. package/batteries/vector/clickhouse.mjs +244 -0
  94. package/batteries/vector/clickhouse.mjs.map +1 -0
  95. package/batteries/vector/cloudflare/index.d.ts +43 -0
  96. package/batteries/vector/cloudflare.cjs +397 -0
  97. package/batteries/vector/cloudflare.cjs.map +1 -0
  98. package/batteries/vector/cloudflare.mjs +395 -0
  99. package/batteries/vector/cloudflare.mjs.map +1 -0
  100. package/batteries/vector/conformance/index.d.ts +15 -0
  101. package/batteries/vector/conformance.cjs +209 -0
  102. package/batteries/vector/conformance.cjs.map +1 -0
  103. package/batteries/vector/conformance.mjs +205 -0
  104. package/batteries/vector/conformance.mjs.map +1 -0
  105. package/batteries/vector/contract.cjs +42 -0
  106. package/batteries/vector/contract.cjs.map +1 -0
  107. package/batteries/vector/contract.d.ts +39 -0
  108. package/batteries/vector/contract.mjs +40 -0
  109. package/batteries/vector/contract.mjs.map +1 -0
  110. package/batteries/vector/couchbase/index.d.ts +49 -0
  111. package/batteries/vector/couchbase.cjs +401 -0
  112. package/batteries/vector/couchbase.cjs.map +1 -0
  113. package/batteries/vector/couchbase.mjs +399 -0
  114. package/batteries/vector/couchbase.mjs.map +1 -0
  115. package/batteries/vector/duckdb/index.d.ts +33 -0
  116. package/batteries/vector/duckdb.cjs +218 -0
  117. package/batteries/vector/duckdb.cjs.map +1 -0
  118. package/batteries/vector/duckdb.mjs +216 -0
  119. package/batteries/vector/duckdb.mjs.map +1 -0
  120. package/batteries/vector/elasticsearch/index.d.ts +43 -0
  121. package/batteries/vector/elasticsearch.cjs +306 -0
  122. package/batteries/vector/elasticsearch.cjs.map +1 -0
  123. package/batteries/vector/elasticsearch.mjs +303 -0
  124. package/batteries/vector/elasticsearch.mjs.map +1 -0
  125. package/batteries/vector/exceptions.cjs +126 -0
  126. package/batteries/vector/exceptions.cjs.map +1 -0
  127. package/batteries/vector/exceptions.d.ts +142 -0
  128. package/batteries/vector/exceptions.mjs +107 -0
  129. package/batteries/vector/exceptions.mjs.map +1 -0
  130. package/batteries/vector/factory.cjs +28 -0
  131. package/batteries/vector/factory.cjs.map +1 -0
  132. package/batteries/vector/factory.d.ts +38 -0
  133. package/batteries/vector/factory.mjs +25 -0
  134. package/batteries/vector/factory.mjs.map +1 -0
  135. package/batteries/vector/filters.cjs +107 -0
  136. package/batteries/vector/filters.cjs.map +1 -0
  137. package/batteries/vector/filters.d.ts +34 -0
  138. package/batteries/vector/filters.mjs +99 -0
  139. package/batteries/vector/filters.mjs.map +1 -0
  140. package/batteries/vector/helpers.cjs +23 -0
  141. package/batteries/vector/helpers.cjs.map +1 -0
  142. package/batteries/vector/helpers.d.ts +12 -0
  143. package/batteries/vector/helpers.mjs +17 -0
  144. package/batteries/vector/helpers.mjs.map +1 -0
  145. package/batteries/vector/hnswlib/index.d.ts +35 -0
  146. package/batteries/vector/hnswlib.cjs +237 -0
  147. package/batteries/vector/hnswlib.cjs.map +1 -0
  148. package/batteries/vector/hnswlib.mjs +235 -0
  149. package/batteries/vector/hnswlib.mjs.map +1 -0
  150. package/batteries/vector/in_memory/index.d.ts +23 -0
  151. package/batteries/vector/in_memory.cjs +178 -0
  152. package/batteries/vector/in_memory.cjs.map +1 -0
  153. package/batteries/vector/in_memory.mjs +176 -0
  154. package/batteries/vector/in_memory.mjs.map +1 -0
  155. package/batteries/vector/index.d.ts +18 -0
  156. package/batteries/vector/lancedb/index.d.ts +34 -0
  157. package/batteries/vector/lancedb.cjs +224 -0
  158. package/batteries/vector/lancedb.cjs.map +1 -0
  159. package/batteries/vector/lancedb.mjs +222 -0
  160. package/batteries/vector/lancedb.mjs.map +1 -0
  161. package/batteries/vector/mariadb/index.d.ts +39 -0
  162. package/batteries/vector/mariadb.cjs +228 -0
  163. package/batteries/vector/mariadb.cjs.map +1 -0
  164. package/batteries/vector/mariadb.mjs +226 -0
  165. package/batteries/vector/mariadb.mjs.map +1 -0
  166. package/batteries/vector/meilisearch/index.d.ts +36 -0
  167. package/batteries/vector/meilisearch.cjs +242 -0
  168. package/batteries/vector/meilisearch.cjs.map +1 -0
  169. package/batteries/vector/meilisearch.mjs +240 -0
  170. package/batteries/vector/meilisearch.mjs.map +1 -0
  171. package/batteries/vector/migrate.cjs +54 -0
  172. package/batteries/vector/migrate.cjs.map +1 -0
  173. package/batteries/vector/migrate.d.ts +30 -0
  174. package/batteries/vector/migrate.mjs +52 -0
  175. package/batteries/vector/migrate.mjs.map +1 -0
  176. package/batteries/vector/milvus/index.d.ts +35 -0
  177. package/batteries/vector/milvus.cjs +357 -0
  178. package/batteries/vector/milvus.cjs.map +1 -0
  179. package/batteries/vector/milvus.mjs +354 -0
  180. package/batteries/vector/milvus.mjs.map +1 -0
  181. package/batteries/vector/mongodb/index.d.ts +46 -0
  182. package/batteries/vector/mongodb.cjs +270 -0
  183. package/batteries/vector/mongodb.cjs.map +1 -0
  184. package/batteries/vector/mongodb.mjs +268 -0
  185. package/batteries/vector/mongodb.mjs.map +1 -0
  186. package/batteries/vector/neo4j/index.d.ts +38 -0
  187. package/batteries/vector/neo4j.cjs +231 -0
  188. package/batteries/vector/neo4j.cjs.map +1 -0
  189. package/batteries/vector/neo4j.mjs +229 -0
  190. package/batteries/vector/neo4j.mjs.map +1 -0
  191. package/batteries/vector/opensearch/index.d.ts +46 -0
  192. package/batteries/vector/opensearch.cjs +316 -0
  193. package/batteries/vector/opensearch.cjs.map +1 -0
  194. package/batteries/vector/opensearch.mjs +313 -0
  195. package/batteries/vector/opensearch.mjs.map +1 -0
  196. package/batteries/vector/oracle23ai/index.d.ts +45 -0
  197. package/batteries/vector/oracle23ai.cjs +340 -0
  198. package/batteries/vector/oracle23ai.cjs.map +1 -0
  199. package/batteries/vector/oracle23ai.mjs +338 -0
  200. package/batteries/vector/oracle23ai.mjs.map +1 -0
  201. package/batteries/vector/orama/index.d.ts +23 -0
  202. package/batteries/vector/orama.cjs +272 -0
  203. package/batteries/vector/orama.cjs.map +1 -0
  204. package/batteries/vector/orama.mjs +270 -0
  205. package/batteries/vector/orama.mjs.map +1 -0
  206. package/batteries/vector/pgvector/index.d.ts +43 -0
  207. package/batteries/vector/pgvector.cjs +411 -0
  208. package/batteries/vector/pgvector.cjs.map +1 -0
  209. package/batteries/vector/pgvector.mjs +408 -0
  210. package/batteries/vector/pgvector.mjs.map +1 -0
  211. package/batteries/vector/pinecone/index.d.ts +38 -0
  212. package/batteries/vector/pinecone.cjs +415 -0
  213. package/batteries/vector/pinecone.cjs.map +1 -0
  214. package/batteries/vector/pinecone.mjs +412 -0
  215. package/batteries/vector/pinecone.mjs.map +1 -0
  216. package/batteries/vector/plan.cjs +2 -0
  217. package/batteries/vector/plan.d.ts +65 -0
  218. package/batteries/vector/plan.mjs +0 -0
  219. package/batteries/vector/qdrant/index.d.ts +34 -0
  220. package/batteries/vector/qdrant.cjs +286 -0
  221. package/batteries/vector/qdrant.cjs.map +1 -0
  222. package/batteries/vector/qdrant.mjs +284 -0
  223. package/batteries/vector/qdrant.mjs.map +1 -0
  224. package/batteries/vector/redis/index.d.ts +44 -0
  225. package/batteries/vector/redis.cjs +391 -0
  226. package/batteries/vector/redis.cjs.map +1 -0
  227. package/batteries/vector/redis.mjs +388 -0
  228. package/batteries/vector/redis.mjs.map +1 -0
  229. package/batteries/vector/retrievable.cjs +69 -0
  230. package/batteries/vector/retrievable.cjs.map +1 -0
  231. package/batteries/vector/retrievable.mjs +67 -0
  232. package/batteries/vector/retrievable.mjs.map +1 -0
  233. package/batteries/vector/retrievable_glue.d.ts +24 -0
  234. package/batteries/vector/s3vectors/index.d.ts +52 -0
  235. package/batteries/vector/s3vectors.cjs +438 -0
  236. package/batteries/vector/s3vectors.cjs.map +1 -0
  237. package/batteries/vector/s3vectors.mjs +436 -0
  238. package/batteries/vector/s3vectors.mjs.map +1 -0
  239. package/batteries/vector/schema.cjs +96 -0
  240. package/batteries/vector/schema.cjs.map +1 -0
  241. package/batteries/vector/schema.d.ts +40 -0
  242. package/batteries/vector/schema.mjs +93 -0
  243. package/batteries/vector/schema.mjs.map +1 -0
  244. package/batteries/vector/solr/index.d.ts +36 -0
  245. package/batteries/vector/solr.cjs +230 -0
  246. package/batteries/vector/solr.cjs.map +1 -0
  247. package/batteries/vector/solr.mjs +228 -0
  248. package/batteries/vector/solr.mjs.map +1 -0
  249. package/batteries/vector/sqlite_vec/index.d.ts +30 -0
  250. package/batteries/vector/sqlite_vec.cjs +318 -0
  251. package/batteries/vector/sqlite_vec.cjs.map +1 -0
  252. package/batteries/vector/sqlite_vec.mjs +316 -0
  253. package/batteries/vector/sqlite_vec.mjs.map +1 -0
  254. package/batteries/vector/surrealdb/index.d.ts +37 -0
  255. package/batteries/vector/surrealdb.cjs +230 -0
  256. package/batteries/vector/surrealdb.cjs.map +1 -0
  257. package/batteries/vector/surrealdb.mjs +228 -0
  258. package/batteries/vector/surrealdb.mjs.map +1 -0
  259. package/batteries/vector/types.cjs +2 -0
  260. package/batteries/vector/types.d.ts +100 -0
  261. package/batteries/vector/types.mjs +0 -0
  262. package/batteries/vector/typesense/index.d.ts +38 -0
  263. package/batteries/vector/typesense.cjs +272 -0
  264. package/batteries/vector/typesense.cjs.map +1 -0
  265. package/batteries/vector/typesense.mjs +270 -0
  266. package/batteries/vector/typesense.mjs.map +1 -0
  267. package/batteries/vector/validation.cjs +90 -0
  268. package/batteries/vector/validation.cjs.map +1 -0
  269. package/batteries/vector/validation.d.ts +18 -0
  270. package/batteries/vector/validation.mjs +83 -0
  271. package/batteries/vector/validation.mjs.map +1 -0
  272. package/batteries/vector/vector_store_constructor.cjs +56 -0
  273. package/batteries/vector/vector_store_constructor.cjs.map +1 -0
  274. package/batteries/vector/vector_store_constructor.d.ts +30 -0
  275. package/batteries/vector/vector_store_constructor.mjs +53 -0
  276. package/batteries/vector/vector_store_constructor.mjs.map +1 -0
  277. package/batteries/vector/vespa/index.d.ts +39 -0
  278. package/batteries/vector/vespa.cjs +423 -0
  279. package/batteries/vector/vespa.cjs.map +1 -0
  280. package/batteries/vector/vespa.mjs +421 -0
  281. package/batteries/vector/vespa.mjs.map +1 -0
  282. package/batteries/vector/weaviate/index.d.ts +57 -0
  283. package/batteries/vector/weaviate.cjs +325 -0
  284. package/batteries/vector/weaviate.cjs.map +1 -0
  285. package/batteries/vector/weaviate.mjs +322 -0
  286. package/batteries/vector/weaviate.mjs.map +1 -0
  287. package/batteries/vector.cjs +63 -0
  288. package/batteries/vector.mjs +14 -0
  289. package/batteries.cjs +62 -0
  290. package/batteries.mjs +15 -1
  291. package/{chunk-kRvK8_k2.mjs → chunk-Bpcn9VDT.mjs} +5 -1
  292. package/{common-lMrnzoyn.mjs → common-BT0nfCi9.mjs} +8 -8
  293. package/{common-lMrnzoyn.mjs.map → common-BT0nfCi9.mjs.map} +1 -1
  294. package/{common-D_e5zYsG.js → common-Cj8TaQ9U.js} +8 -8
  295. package/{common-D_e5zYsG.js.map → common-Cj8TaQ9U.js.map} +1 -1
  296. package/common.cjs +7 -7
  297. package/common.mjs +7 -7
  298. package/{dispatch_runner-CpuyATj1.js → dispatch_runner-BHBNupqp.js} +2 -2
  299. package/dispatch_runner-BHBNupqp.js.map +1 -0
  300. package/{dispatch_runner-CDF3X0nv.mjs → dispatch_runner-DPcS7Y_M.mjs} +2 -2
  301. package/dispatch_runner-DPcS7Y_M.mjs.map +1 -0
  302. package/dispatch_runner.cjs +1 -1
  303. package/dispatch_runner.mjs +1 -1
  304. package/forge.cjs +4 -4
  305. package/forge.mjs +4 -4
  306. package/guards.cjs +8 -8
  307. package/guards.mjs +8 -8
  308. package/index.cjs +12 -12
  309. package/index.mjs +12 -12
  310. package/lib/classes/tool_registry.d.ts +70 -4
  311. package/mcp/adk-docs-corpus.json +1 -1
  312. package/package.json +424 -88
  313. package/skills/adk-assembly/SKILL.md +2 -2
  314. package/{spooled_artifact-B8gIIn9h.js → spooled_artifact-BTq6Nzfy.js} +4 -4
  315. package/spooled_artifact-BTq6Nzfy.js.map +1 -0
  316. package/{spooled_artifact-CWoKUDEm.mjs → spooled_artifact-CHoZgWwI.mjs} +4 -4
  317. package/spooled_artifact-CHoZgWwI.mjs.map +1 -0
  318. package/spooled_artifact.cjs +2 -2
  319. package/spooled_artifact.mjs +2 -2
  320. package/{spooled_markdown_artifact-DQX0RCdI.js → spooled_markdown_artifact-CALSDxIx.js} +3 -3
  321. package/{spooled_markdown_artifact-DQX0RCdI.js.map → spooled_markdown_artifact-CALSDxIx.js.map} +1 -1
  322. package/{spooled_markdown_artifact-CNle4jXN.mjs → spooled_markdown_artifact-Ci5UL7l4.mjs} +3 -3
  323. package/{spooled_markdown_artifact-CNle4jXN.mjs.map → spooled_markdown_artifact-Ci5UL7l4.mjs.map} +1 -1
  324. package/src/types/evaluatex.d.ts +31 -0
  325. package/{thought-BD6AkkOr.js → thought-BbwhJ1wb.js} +4 -4
  326. package/thought-BbwhJ1wb.js.map +1 -0
  327. package/{thought-B_P8LiB6.mjs → thought-D34QQZZ9.mjs} +4 -4
  328. package/thought-D34QQZZ9.mjs.map +1 -0
  329. package/{tool-CRZSUcdP.mjs → tool-CMhaDRNd.mjs} +3 -3
  330. package/tool-CMhaDRNd.mjs.map +1 -0
  331. package/{tool-CX9vNHAw.js → tool-CVyZkFC7.js} +3 -3
  332. package/tool-CVyZkFC7.js.map +1 -0
  333. package/{tool_call-BUeMuCc6.mjs → tool_call-CV5qVNlb.mjs} +3 -3
  334. package/{tool_call-BUeMuCc6.mjs.map → tool_call-CV5qVNlb.mjs.map} +1 -1
  335. package/{tool_call--7ti-frB.js → tool_call-Db68hB7y.js} +3 -3
  336. package/{tool_call--7ti-frB.js.map → tool_call-Db68hB7y.js.map} +1 -1
  337. package/{tool_registry-BGHg6KTq.mjs → tool_registry-D1pSSlsd.mjs} +109 -22
  338. package/tool_registry-D1pSSlsd.mjs.map +1 -0
  339. package/{tool_registry-CtCQ4Xoz.js → tool_registry-DYUYqXvo.js} +109 -22
  340. package/tool_registry-DYUYqXvo.js.map +1 -0
  341. package/{turn_runner-BJTtAORU.js → turn_runner-DqWHNP80.js} +5 -5
  342. package/turn_runner-DqWHNP80.js.map +1 -0
  343. package/{turn_runner-C02LZHjt.mjs → turn_runner-fg1Wc3dK.mjs} +5 -5
  344. package/turn_runner-fg1Wc3dK.mjs.map +1 -0
  345. package/turn_runner.cjs +1 -1
  346. package/turn_runner.mjs +1 -1
  347. package/dispatch_runner-CDF3X0nv.mjs.map +0 -1
  348. package/dispatch_runner-CpuyATj1.js.map +0 -1
  349. package/spooled_artifact-B8gIIn9h.js.map +0 -1
  350. package/spooled_artifact-CWoKUDEm.mjs.map +0 -1
  351. package/thought-BD6AkkOr.js.map +0 -1
  352. package/thought-B_P8LiB6.mjs.map +0 -1
  353. package/tool-CRZSUcdP.mjs.map +0 -1
  354. package/tool-CX9vNHAw.js.map +0 -1
  355. package/tool_registry-BGHg6KTq.mjs.map +0 -1
  356. package/tool_registry-CtCQ4Xoz.js.map +0 -1
  357. package/turn_runner-BJTtAORU.js.map +0 -1
  358. package/turn_runner-C02LZHjt.mjs.map +0 -1
@@ -0,0 +1,93 @@
1
+ //#region src/batteries/vector/schema.ts
2
+ var CollectionBuilder = class {
3
+ #vectorDef;
4
+ #fields = [];
5
+ vector(def) {
6
+ this.#vectorDef = {
7
+ dimensions: def.dimensions,
8
+ metric: def.metric ?? "cosine"
9
+ };
10
+ return this;
11
+ }
12
+ string(name) {
13
+ return this.#pushField(name, "string");
14
+ }
15
+ integer(name) {
16
+ return this.#pushField(name, "integer");
17
+ }
18
+ number(name) {
19
+ return this.#pushField(name, "number");
20
+ }
21
+ boolean(name) {
22
+ return this.#pushField(name, "boolean");
23
+ }
24
+ json(name) {
25
+ return this.#pushField(name, "json");
26
+ }
27
+ #pushField(name, type) {
28
+ const spec = {
29
+ name,
30
+ type,
31
+ index: false,
32
+ nullable: false
33
+ };
34
+ this.#fields.push(spec);
35
+ return new FieldChainImpl(spec);
36
+ }
37
+ build(collection) {
38
+ if (!this.#vectorDef) throw new Error("a collection requires a vector() definition");
39
+ return {
40
+ collection,
41
+ vector: this.#vectorDef,
42
+ fields: this.#fields
43
+ };
44
+ }
45
+ };
46
+ var FieldChainImpl = class {
47
+ #spec;
48
+ constructor(spec) {
49
+ this.#spec = spec;
50
+ }
51
+ index() {
52
+ this.#spec.index = true;
53
+ return this;
54
+ }
55
+ nullable() {
56
+ this.#spec.nullable = true;
57
+ return this;
58
+ }
59
+ };
60
+ var VectorSchemaBuilder = class {
61
+ #executor;
62
+ constructor(executor) {
63
+ this.#executor = executor;
64
+ }
65
+ async createCollection(collection, cb) {
66
+ const builder = new CollectionBuilder();
67
+ cb(builder);
68
+ const spec = builder.build(collection);
69
+ await this.#executor.createCollection(spec, false);
70
+ }
71
+ async createCollectionIfNotExists(collection, cb) {
72
+ const builder = new CollectionBuilder();
73
+ cb(builder);
74
+ const spec = builder.build(collection);
75
+ await this.#executor.createCollection(spec, true);
76
+ }
77
+ async dropCollection(collection) {
78
+ await this.#executor.dropCollection(collection, false);
79
+ }
80
+ async dropCollectionIfExists(collection) {
81
+ await this.#executor.dropCollection(collection, true);
82
+ }
83
+ async hasCollection(collection) {
84
+ return this.#executor.hasCollection(collection);
85
+ }
86
+ async renameCollection(from, to) {
87
+ await this.#executor.renameCollection(from, to);
88
+ }
89
+ };
90
+ //#endregion
91
+ export { CollectionBuilder, VectorSchemaBuilder };
92
+
93
+ //# sourceMappingURL=schema.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.mjs","names":["#vectorDef","#pushField","#fields","#spec","#executor"],"sources":["../../../src/batteries/vector/schema.ts"],"sourcesContent":["/**\n * Knex-style schema builder for the vector battery.\n *\n * @module @nhtio/adk/batteries/vector/schema\n */\n\nimport type { DistanceMetric } from './types'\nimport type { CollectionSpec, CollectionFieldSpec } from './plan'\n\nexport interface SchemaExecutor {\n createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void>\n dropCollection(collection: string, ifExists: boolean): Promise<void>\n hasCollection(collection: string): Promise<boolean>\n renameCollection(from: string, to: string): Promise<void>\n}\n\nexport class CollectionBuilder {\n #vectorDef?: { dimensions: number; metric: DistanceMetric }\n #fields: CollectionFieldSpec[] = []\n\n vector(def: { dimensions: number; metric?: DistanceMetric }): this {\n this.#vectorDef = {\n dimensions: def.dimensions,\n metric: def.metric ?? 'cosine',\n }\n return this\n }\n\n string(name: string): FieldChain {\n return this.#pushField(name, 'string')\n }\n\n integer(name: string): FieldChain {\n return this.#pushField(name, 'integer')\n }\n\n number(name: string): FieldChain {\n return this.#pushField(name, 'number')\n }\n\n boolean(name: string): FieldChain {\n return this.#pushField(name, 'boolean')\n }\n\n json(name: string): FieldChain {\n return this.#pushField(name, 'json')\n }\n\n #pushField(name: string, type: CollectionFieldSpec['type']): FieldChain {\n const spec: CollectionFieldSpec = {\n name,\n type,\n index: false,\n nullable: false,\n }\n this.#fields.push(spec)\n return new FieldChainImpl(spec)\n }\n\n build(collection: string): CollectionSpec {\n if (!this.#vectorDef) {\n throw new Error('a collection requires a vector() definition')\n }\n return {\n collection,\n vector: this.#vectorDef,\n fields: this.#fields,\n }\n }\n}\n\nexport interface FieldChain {\n index(): FieldChain\n nullable(): FieldChain\n}\n\nclass FieldChainImpl implements FieldChain {\n #spec: CollectionFieldSpec\n\n constructor(spec: CollectionFieldSpec) {\n this.#spec = spec\n }\n\n index(): FieldChain {\n this.#spec.index = true\n return this\n }\n\n nullable(): FieldChain {\n this.#spec.nullable = true\n return this\n }\n}\n\nexport class VectorSchemaBuilder {\n #executor: SchemaExecutor\n\n constructor(executor: SchemaExecutor) {\n this.#executor = executor\n }\n\n async createCollection(collection: string, cb: (c: CollectionBuilder) => void): Promise<void> {\n const builder = new CollectionBuilder()\n cb(builder)\n const spec = builder.build(collection)\n await this.#executor.createCollection(spec, false)\n }\n\n async createCollectionIfNotExists(\n collection: string,\n cb: (c: CollectionBuilder) => void\n ): Promise<void> {\n const builder = new CollectionBuilder()\n cb(builder)\n const spec = builder.build(collection)\n await this.#executor.createCollection(spec, true)\n }\n\n async dropCollection(collection: string): Promise<void> {\n await this.#executor.dropCollection(collection, false)\n }\n\n async dropCollectionIfExists(collection: string): Promise<void> {\n await this.#executor.dropCollection(collection, true)\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n return this.#executor.hasCollection(collection)\n }\n\n async renameCollection(from: string, to: string): Promise<void> {\n await this.#executor.renameCollection(from, to)\n }\n}\n"],"mappings":";AAgBA,IAAa,oBAAb,MAA+B;CAC7B;CACA,UAAiC,CAAC;CAElC,OAAO,KAA4D;EACjE,KAAKA,aAAa;GAChB,YAAY,IAAI;GAChB,QAAQ,IAAI,UAAU;EACxB;EACA,OAAO;CACT;CAEA,OAAO,MAA0B;EAC/B,OAAO,KAAKC,WAAW,MAAM,QAAQ;CACvC;CAEA,QAAQ,MAA0B;EAChC,OAAO,KAAKA,WAAW,MAAM,SAAS;CACxC;CAEA,OAAO,MAA0B;EAC/B,OAAO,KAAKA,WAAW,MAAM,QAAQ;CACvC;CAEA,QAAQ,MAA0B;EAChC,OAAO,KAAKA,WAAW,MAAM,SAAS;CACxC;CAEA,KAAK,MAA0B;EAC7B,OAAO,KAAKA,WAAW,MAAM,MAAM;CACrC;CAEA,WAAW,MAAc,MAA+C;EACtE,MAAM,OAA4B;GAChC;GACA;GACA,OAAO;GACP,UAAU;EACZ;EACA,KAAKC,QAAQ,KAAK,IAAI;EACtB,OAAO,IAAI,eAAe,IAAI;CAChC;CAEA,MAAM,YAAoC;EACxC,IAAI,CAAC,KAAKF,YACR,MAAM,IAAI,MAAM,6CAA6C;EAE/D,OAAO;GACL;GACA,QAAQ,KAAKA;GACb,QAAQ,KAAKE;EACf;CACF;AACF;AAOA,IAAM,iBAAN,MAA2C;CACzC;CAEA,YAAY,MAA2B;EACrC,KAAKC,QAAQ;CACf;CAEA,QAAoB;EAClB,KAAKA,MAAM,QAAQ;EACnB,OAAO;CACT;CAEA,WAAuB;EACrB,KAAKA,MAAM,WAAW;EACtB,OAAO;CACT;AACF;AAEA,IAAa,sBAAb,MAAiC;CAC/B;CAEA,YAAY,UAA0B;EACpC,KAAKC,YAAY;CACnB;CAEA,MAAM,iBAAiB,YAAoB,IAAmD;EAC5F,MAAM,UAAU,IAAI,kBAAkB;EACtC,GAAG,OAAO;EACV,MAAM,OAAO,QAAQ,MAAM,UAAU;EACrC,MAAM,KAAKA,UAAU,iBAAiB,MAAM,KAAK;CACnD;CAEA,MAAM,4BACJ,YACA,IACe;EACf,MAAM,UAAU,IAAI,kBAAkB;EACtC,GAAG,OAAO;EACV,MAAM,OAAO,QAAQ,MAAM,UAAU;EACrC,MAAM,KAAKA,UAAU,iBAAiB,MAAM,IAAI;CAClD;CAEA,MAAM,eAAe,YAAmC;EACtD,MAAM,KAAKA,UAAU,eAAe,YAAY,KAAK;CACvD;CAEA,MAAM,uBAAuB,YAAmC;EAC9D,MAAM,KAAKA,UAAU,eAAe,YAAY,IAAI;CACtD;CAEA,MAAM,cAAc,YAAsC;EACxD,OAAO,KAAKA,UAAU,cAAc,UAAU;CAChD;CAEA,MAAM,iBAAiB,MAAc,IAA2B;EAC9D,MAAM,KAAKA,UAAU,iBAAiB,MAAM,EAAE;CAChD;AACF"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * @module @nhtio/adk/batteries/vector/solr
3
+ *
4
+ * Apache Solr adapter (dense vector / kNN query parser, Solr 9+). A logical collection maps to a
5
+ * Solr core; the adapter ensures a `DenseVectorField` (`vec`) plus `document`/`metadata` string
6
+ * fields exist in the core schema, then uses the `{!knn f=vec topK=N}[...]` parser for search.
7
+ * Score is Solr's cosine similarity ([0,1]). Metadata is a JSON string field filtered with the
8
+ * neutral filter tree's JS reference evaluator for cross-adapter parity.
9
+ *
10
+ * No typed driver — Solr is plain HTTP/JSON, so this uses `fetch` (zero extra dependency). The
11
+ * target core must already exist (e.g. `solr-precreate <core>` / the Core Admin API); the adapter
12
+ * does not create cores at runtime, only their schema fields. `collection` is the core name.
13
+ */
14
+ import { BaseVectorStore } from "../contract";
15
+ import type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from "../plan";
16
+ import type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from "../types";
17
+ export interface SolrVectorStoreOptions extends BaseVectorStoreOptions {
18
+ connection: {
19
+ url: string;
20
+ };
21
+ }
22
+ export declare class SolrVectorStore extends BaseVectorStore {
23
+ #private;
24
+ readonly capabilities: VectorStoreCapabilities;
25
+ static isAvailable(): boolean;
26
+ isAvailable(): boolean;
27
+ connect(): Promise<void>;
28
+ close(): Promise<void>;
29
+ createCollection(spec: CollectionSpec, _ifNotExists: boolean): Promise<void>;
30
+ dropCollection(collection: string, _ifExists: boolean): Promise<void>;
31
+ hasCollection(collection: string): Promise<boolean>;
32
+ renameCollection(_from: string, _to: string): Promise<void>;
33
+ executeUpsert(plan: UpsertPlan): Promise<void>;
34
+ executeSearch(plan: SearchPlan): Promise<VectorMatch[]>;
35
+ executeDelete(plan: DeletePlan): Promise<void>;
36
+ }
@@ -0,0 +1,230 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../chunk-Ble4zEEl.js");
3
+ const require_tool_registry = require("../../tool_registry-DYUYqXvo.js");
4
+ require("../../guards.cjs");
5
+ const require_batteries_vector_filters = require("./filters.cjs");
6
+ const require_batteries_vector_exceptions = require("./exceptions.cjs");
7
+ const require_batteries_vector_contract = require("./contract.cjs");
8
+ const require_batteries_vector_validation = require("./validation.cjs");
9
+ //#region src/batteries/vector/solr/index.ts
10
+ /**
11
+ * @module @nhtio/adk/batteries/vector/solr
12
+ *
13
+ * Apache Solr adapter (dense vector / kNN query parser, Solr 9+). A logical collection maps to a
14
+ * Solr core; the adapter ensures a `DenseVectorField` (`vec`) plus `document`/`metadata` string
15
+ * fields exist in the core schema, then uses the `{!knn f=vec topK=N}[...]` parser for search.
16
+ * Score is Solr's cosine similarity ([0,1]). Metadata is a JSON string field filtered with the
17
+ * neutral filter tree's JS reference evaluator for cross-adapter parity.
18
+ *
19
+ * No typed driver — Solr is plain HTTP/JSON, so this uses `fetch` (zero extra dependency). The
20
+ * target core must already exist (e.g. `solr-precreate <core>` / the Core Admin API); the adapter
21
+ * does not create cores at runtime, only their schema fields. `collection` is the core name.
22
+ */
23
+ var simFn = (metric) => metric === "euclidean" ? "euclidean" : metric === "dot" ? "dot_product" : "cosine";
24
+ var SolrVectorStore = class extends require_batteries_vector_contract.BaseVectorStore {
25
+ capabilities = {
26
+ transactions: false,
27
+ namedVectors: false,
28
+ rename: false,
29
+ rawSql: false,
30
+ builtInEncoding: false,
31
+ consistency: {
32
+ configurable: false,
33
+ default: "strong",
34
+ modes: ["strong"]
35
+ }
36
+ };
37
+ #base = null;
38
+ #dims = /* @__PURE__ */ new Map();
39
+ get #opts() {
40
+ return this.options;
41
+ }
42
+ static isAvailable() {
43
+ return typeof process !== "undefined" && typeof fetch === "function";
44
+ }
45
+ isAvailable() {
46
+ return typeof process !== "undefined" && typeof fetch === "function";
47
+ }
48
+ async connect() {
49
+ if (this.#base) return;
50
+ const url = this.#opts.connection?.url;
51
+ if (!url) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_CONNECTION_FAILED(["Solr requires connection.url"]);
52
+ this.#base = url.replace(/\/$/, "");
53
+ }
54
+ async close() {
55
+ this.#base = null;
56
+ }
57
+ async #core(collection) {
58
+ if (!this.#base) await this.connect();
59
+ return `${this.#base}/solr/${encodeURIComponent(collection)}`;
60
+ }
61
+ async #post(coreUrl, path, body) {
62
+ const res = await fetch(coreUrl + path, {
63
+ method: "POST",
64
+ headers: { "Content-Type": "application/json" },
65
+ body: JSON.stringify(body)
66
+ });
67
+ const json = await res.json().catch(() => ({}));
68
+ if (!res.ok || json.error) throw new Error(json.error?.msg ?? `HTTP ${res.status}`);
69
+ return json;
70
+ }
71
+ async #get(coreUrl, path) {
72
+ const res = await fetch(coreUrl + path);
73
+ const json = await res.json().catch(() => ({}));
74
+ if (!res.ok || json.error) throw new Error(json.error?.msg ?? `HTTP ${res.status}`);
75
+ return json;
76
+ }
77
+ async createCollection(spec, _ifNotExists) {
78
+ const core = await this.#core(spec.collection);
79
+ this.#dims.set(spec.collection, spec.vector.dimensions);
80
+ const ftName = `knn_${spec.vector.dimensions}_${simFn(spec.vector.metric)}`;
81
+ try {
82
+ await this.#post(core, "/schema", { "add-field-type": {
83
+ name: ftName,
84
+ class: "solr.DenseVectorField",
85
+ vectorDimension: spec.vector.dimensions,
86
+ similarityFunction: simFn(spec.vector.metric)
87
+ } }).catch((e) => {
88
+ if (!String(e).includes("already")) throw e;
89
+ });
90
+ for (const f of [
91
+ {
92
+ name: "vec",
93
+ type: ftName,
94
+ indexed: true,
95
+ stored: true
96
+ },
97
+ {
98
+ name: "document",
99
+ type: "string",
100
+ stored: true
101
+ },
102
+ {
103
+ name: "metadata",
104
+ type: "string",
105
+ stored: true
106
+ }
107
+ ]) await this.#post(core, "/schema", { "add-field": f }).catch((e) => {
108
+ if (!String(e).includes("already")) throw e;
109
+ });
110
+ await this.#post(core, "/update?commit=true", { delete: { query: "*:*" } });
111
+ } catch (err) {
112
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_COLLECTION_FAILED(["createCollection", String(err)]);
113
+ }
114
+ }
115
+ async dropCollection(collection, _ifExists) {
116
+ try {
117
+ const core = await this.#core(collection);
118
+ await this.#post(core, "/update?commit=true", { delete: { query: "*:*" } });
119
+ this.#dims.delete(collection);
120
+ } catch (err) {
121
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_COLLECTION_FAILED(["dropCollection", String(err)]);
122
+ }
123
+ }
124
+ async hasCollection(collection) {
125
+ try {
126
+ const core = await this.#core(collection);
127
+ await this.#get(core, "/admin/ping");
128
+ return true;
129
+ } catch {
130
+ return false;
131
+ }
132
+ }
133
+ async renameCollection(_from, _to) {
134
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_UNSUPPORTED_OPERATION(["renameCollection", "solr"]);
135
+ }
136
+ async executeUpsert(plan) {
137
+ if (plan.records.length === 0) return;
138
+ require_batteries_vector_validation.validateRecords(plan.records);
139
+ const core = await this.#core(plan.collection);
140
+ const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection);
141
+ try {
142
+ const docs = [];
143
+ for (const r of plan.records) {
144
+ let vector = r.vector;
145
+ if (!vector && r.document) {
146
+ const [v] = await this.encode([r.document], "document");
147
+ vector = v;
148
+ }
149
+ if (!vector) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_UPSERT_FAILED(["Record missing vector and document"]);
150
+ if (expected !== void 0 && vector.length !== expected) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length]);
151
+ docs.push({
152
+ id: r.id,
153
+ vec: vector,
154
+ document: r.document ?? "",
155
+ metadata: r.metadata ? JSON.stringify(r.metadata) : "{}"
156
+ });
157
+ }
158
+ await this.#post(core, "/update?commit=true", docs);
159
+ } catch (err) {
160
+ if (require_tool_registry.isInstanceOf(err, "E_VECTOR_STORE_DIMENSION_MISMATCH", require_batteries_vector_exceptions.E_VECTOR_STORE_DIMENSION_MISMATCH) || require_tool_registry.isInstanceOf(err, "E_VECTOR_STORE_UPSERT_FAILED", require_batteries_vector_exceptions.E_VECTOR_STORE_UPSERT_FAILED)) throw err;
161
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_UPSERT_FAILED([String(err)]);
162
+ }
163
+ }
164
+ async executeSearch(plan) {
165
+ const core = await this.#core(plan.collection);
166
+ let queryVector;
167
+ if (plan.near) {
168
+ if ("vector" in plan.near) queryVector = plan.near.vector;
169
+ else if ("serverText" in plan.near) {
170
+ const [v] = await this.encode([plan.near.serverText], "query");
171
+ queryVector = v;
172
+ } else if ("id" in plan.near) {
173
+ const doc = (await this.#get(core, `/select?q=${encodeURIComponent("id:" + this.#escape(plan.near.id))}&fl=vec&rows=1`)).response?.docs?.[0];
174
+ if (!doc) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_SEARCH_FAILED(["Referenced id not found: " + plan.near.id]);
175
+ queryVector = doc.vec;
176
+ }
177
+ }
178
+ const offset = plan.offset ?? 0;
179
+ const fl = "id,vec,document,metadata,score";
180
+ try {
181
+ let docs;
182
+ if (queryVector) {
183
+ const k = (plan.filter ? 1e3 : plan.topK + offset) || 10;
184
+ const q = `{!knn f=vec topK=${k}}[${queryVector.join(",")}]`;
185
+ docs = (await this.#get(core, `/select?q=${encodeURIComponent(q)}&fl=${fl}&rows=${k}`)).response?.docs ?? [];
186
+ } else docs = (await this.#get(core, `/select?q=*:*&fl=${fl}&rows=100000`)).response?.docs ?? [];
187
+ return (plan.filter ? docs.filter((d) => require_batteries_vector_filters.evaluateFilter(plan.filter, this.#parseMeta(d.metadata))) : docs).slice(offset, offset + plan.topK).map((d) => this.#project(d, plan, !!queryVector));
188
+ } catch (err) {
189
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_SEARCH_FAILED([String(err)]);
190
+ }
191
+ }
192
+ #escape(value) {
193
+ return value.replace(/([+\-!(){}[\]^"~*?:\\/ ])/g, "\\$1");
194
+ }
195
+ #parseMeta(val) {
196
+ if (typeof val === "string") try {
197
+ return JSON.parse(val);
198
+ } catch {
199
+ return {};
200
+ }
201
+ if (val && typeof val === "object") return val;
202
+ return {};
203
+ }
204
+ #project(doc, plan, isKnn) {
205
+ const proj = plan.projection;
206
+ const out = {};
207
+ if (proj.id) out.id = doc.id;
208
+ if (proj.vector && Array.isArray(doc.vec)) out.vector = doc.vec.map(Number);
209
+ if (proj.document) out.document = doc.document ?? void 0;
210
+ if (proj.metadata) out.metadata = this.#parseMeta(doc.metadata);
211
+ if (isKnn && typeof doc.score === "number") out.score = doc.score;
212
+ return out;
213
+ }
214
+ async executeDelete(plan) {
215
+ const core = await this.#core(plan.collection);
216
+ try {
217
+ if (plan.ids && plan.ids.length > 0) await this.#post(core, "/update?commit=true", { delete: plan.ids });
218
+ else if (plan.filter) {
219
+ const targets = ((await this.#get(core, `/select?q=*:*&fl=id,metadata&rows=100000`)).response?.docs ?? []).filter((d) => require_batteries_vector_filters.evaluateFilter(plan.filter, this.#parseMeta(d.metadata))).map((d) => d.id);
220
+ if (targets.length > 0) await this.#post(core, "/update?commit=true", { delete: targets });
221
+ } else await this.#post(core, "/update?commit=true", { delete: { query: "*:*" } });
222
+ } catch (err) {
223
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_DELETE_FAILED([String(err)]);
224
+ }
225
+ }
226
+ };
227
+ //#endregion
228
+ exports.SolrVectorStore = SolrVectorStore;
229
+
230
+ //# sourceMappingURL=solr.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solr.cjs","names":["#opts","#base","#core","#post","#get","#dims","#escape","#parseMeta","#project"],"sources":["../../../src/batteries/vector/solr/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/solr\n *\n * Apache Solr adapter (dense vector / kNN query parser, Solr 9+). A logical collection maps to a\n * Solr core; the adapter ensures a `DenseVectorField` (`vec`) plus `document`/`metadata` string\n * fields exist in the core schema, then uses the `{!knn f=vec topK=N}[...]` parser for search.\n * Score is Solr's cosine similarity ([0,1]). Metadata is a JSON string field filtered with the\n * neutral filter tree's JS reference evaluator for cross-adapter parity.\n *\n * No typed driver — Solr is plain HTTP/JSON, so this uses `fetch` (zero extra dependency). The\n * target core must already exist (e.g. `solr-precreate <core>` / the Core Admin API); the adapter\n * does not create cores at runtime, only their schema fields. `collection` is the core name.\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_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 SolrVectorStoreOptions extends BaseVectorStoreOptions {\n connection: { url: string }\n}\n\nconst simFn = (metric: DistanceMetric): string =>\n metric === 'euclidean' ? 'euclidean' : metric === 'dot' ? 'dot_product' : 'cosine'\n\nexport class SolrVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: false,\n rawSql: false,\n builtInEncoding: false,\n // Writes are committed (commit=true) before resolving, so they're visible to the next query.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n\n #base: string | null = null\n #dims: Map<string, number> = new Map()\n\n get #opts(): SolrVectorStoreOptions {\n return this.options as SolrVectorStoreOptions\n }\n\n static isAvailable(): boolean {\n return typeof process !== 'undefined' && typeof fetch === 'function'\n }\n isAvailable(): boolean {\n return typeof process !== 'undefined' && typeof fetch === 'function'\n }\n\n async connect(): Promise<void> {\n if (this.#base) return\n const url = this.#opts.connection?.url\n if (!url) throw new E_VECTOR_STORE_CONNECTION_FAILED(['Solr requires connection.url'])\n this.#base = url.replace(/\\/$/, '')\n }\n\n async close(): Promise<void> {\n this.#base = null\n }\n\n async #core(collection: string): Promise<string> {\n if (!this.#base) await this.connect()\n return `${this.#base}/solr/${encodeURIComponent(collection)}`\n }\n\n async #post(coreUrl: string, path: string, body: unknown): Promise<any> {\n const res = await fetch(coreUrl + path, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n })\n const json = await res.json().catch(() => ({}))\n if (!res.ok || json.error) {\n throw new Error(json.error?.msg ?? `HTTP ${res.status}`)\n }\n return json\n }\n\n async #get(coreUrl: string, path: string): Promise<any> {\n const res = await fetch(coreUrl + path)\n const json = await res.json().catch(() => ({}))\n if (!res.ok || json.error) {\n throw new Error(json.error?.msg ?? `HTTP ${res.status}`)\n }\n return json\n }\n\n async createCollection(spec: CollectionSpec, _ifNotExists: boolean): Promise<void> {\n const core = await this.#core(spec.collection)\n this.#dims.set(spec.collection, spec.vector.dimensions)\n const ftName = `knn_${spec.vector.dimensions}_${simFn(spec.vector.metric)}`\n try {\n // Ensure the dense-vector field type (idempotent: ignore \"already exists\").\n await this.#post(core, '/schema', {\n 'add-field-type': {\n name: ftName,\n class: 'solr.DenseVectorField',\n vectorDimension: spec.vector.dimensions,\n similarityFunction: simFn(spec.vector.metric),\n },\n }).catch((e: unknown) => {\n if (!String(e).includes('already')) throw e\n })\n // Ensure the fields (idempotent per field).\n for (const f of [\n { name: 'vec', type: ftName, indexed: true, stored: true },\n { name: 'document', type: 'string', stored: true },\n { name: 'metadata', type: 'string', stored: true },\n ]) {\n await this.#post(core, '/schema', { 'add-field': f }).catch((e: unknown) => {\n if (!String(e).includes('already')) throw e\n })\n }\n // Start from an empty core for this logical collection.\n await this.#post(core, '/update?commit=true', { delete: { query: '*:*' } })\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 // Cores aren't created/destroyed at runtime here; \"drop\" clears the core's documents.\n try {\n const core = await this.#core(collection)\n await this.#post(core, '/update?commit=true', { delete: { query: '*:*' } })\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 try {\n const core = await this.#core(collection)\n await this.#get(core, '/admin/ping')\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', 'solr'])\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const core = await this.#core(plan.collection)\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 vec: vector,\n document: r.document ?? '',\n metadata: r.metadata ? JSON.stringify(r.metadata) : '{}',\n })\n }\n // Solr upserts by id; commit so the write is visible to the next query.\n await this.#post(core, '/update?commit=true', 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 core = await this.#core(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 const r = await this.#get(\n core,\n `/select?q=${encodeURIComponent('id:' + this.#escape(plan.near.id))}&fl=vec&rows=1`\n )\n const doc = r.response?.docs?.[0]\n if (!doc) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = doc.vec as number[]\n }\n }\n\n const offset = plan.offset ?? 0\n const fl = 'id,vec,document,metadata,score'\n try {\n let docs: any[]\n if (queryVector) {\n const k = (plan.filter ? 1000 : plan.topK + offset) || 10\n const q = `{!knn f=vec topK=${k}}[${queryVector.join(',')}]`\n const r = await this.#get(core, `/select?q=${encodeURIComponent(q)}&fl=${fl}&rows=${k}`)\n docs = r.response?.docs ?? []\n } else {\n const r = await this.#get(core, `/select?q=*:*&fl=${fl}&rows=100000`)\n docs = r.response?.docs ?? []\n }\n const filtered = plan.filter\n ? docs.filter((d) => evaluateFilter(plan.filter!, this.#parseMeta(d.metadata)))\n : docs\n return filtered\n .slice(offset, offset + plan.topK)\n .map((d) => this.#project(d, plan, !!queryVector))\n } catch (err) {\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\n }\n\n #escape(value: string): string {\n // Escape Solr query special chars for an id: term match.\n return value.replace(/([+\\-!(){}[\\]^\"~*?:\\\\/ ])/g, '\\\\$1')\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(doc: any, plan: SearchPlan, isKnn: boolean): VectorMatch {\n const proj = plan.projection\n const out: VectorMatch = {}\n if (proj.id) out.id = doc.id as string\n if (proj.vector && Array.isArray(doc.vec)) out.vector = (doc.vec as number[]).map(Number)\n if (proj.document) out.document = (doc.document ?? undefined) as string | undefined\n if (proj.metadata) out.metadata = this.#parseMeta(doc.metadata)\n if (isKnn && typeof doc.score === 'number') {\n // Solr's DenseVectorField cosine score is already in [0,1], higher = closer.\n out.score = doc.score\n }\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const core = await this.#core(plan.collection)\n try {\n if (plan.ids && plan.ids.length > 0) {\n await this.#post(core, '/update?commit=true', { delete: plan.ids })\n } else if (plan.filter) {\n const r = await this.#get(core, `/select?q=*:*&fl=id,metadata&rows=100000`)\n const docs = r.response?.docs ?? []\n const targets = docs\n .filter((d: any) => evaluateFilter(plan.filter!, this.#parseMeta(d.metadata)))\n .map((d: any) => d.id as string)\n if (targets.length > 0) {\n await this.#post(core, '/update?commit=true', { delete: targets })\n }\n } else {\n await this.#post(core, '/update?commit=true', { delete: { query: '*:*' } })\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,228 @@
1
+ import { s as isInstanceOf } from "../../tool_registry-D1pSSlsd.mjs";
2
+ import "../../guards.mjs";
3
+ import { evaluateFilter } from "./filters.mjs";
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_SEARCH_FAILED, E_VECTOR_STORE_UNSUPPORTED_OPERATION, E_VECTOR_STORE_UPSERT_FAILED } from "./exceptions.mjs";
5
+ import { BaseVectorStore } from "./contract.mjs";
6
+ import { validateRecords } from "./validation.mjs";
7
+ //#region src/batteries/vector/solr/index.ts
8
+ /**
9
+ * @module @nhtio/adk/batteries/vector/solr
10
+ *
11
+ * Apache Solr adapter (dense vector / kNN query parser, Solr 9+). A logical collection maps to a
12
+ * Solr core; the adapter ensures a `DenseVectorField` (`vec`) plus `document`/`metadata` string
13
+ * fields exist in the core schema, then uses the `{!knn f=vec topK=N}[...]` parser for search.
14
+ * Score is Solr's cosine similarity ([0,1]). Metadata is a JSON string field filtered with the
15
+ * neutral filter tree's JS reference evaluator for cross-adapter parity.
16
+ *
17
+ * No typed driver — Solr is plain HTTP/JSON, so this uses `fetch` (zero extra dependency). The
18
+ * target core must already exist (e.g. `solr-precreate <core>` / the Core Admin API); the adapter
19
+ * does not create cores at runtime, only their schema fields. `collection` is the core name.
20
+ */
21
+ var simFn = (metric) => metric === "euclidean" ? "euclidean" : metric === "dot" ? "dot_product" : "cosine";
22
+ var SolrVectorStore = class extends BaseVectorStore {
23
+ capabilities = {
24
+ transactions: false,
25
+ namedVectors: false,
26
+ rename: false,
27
+ rawSql: false,
28
+ builtInEncoding: false,
29
+ consistency: {
30
+ configurable: false,
31
+ default: "strong",
32
+ modes: ["strong"]
33
+ }
34
+ };
35
+ #base = null;
36
+ #dims = /* @__PURE__ */ new Map();
37
+ get #opts() {
38
+ return this.options;
39
+ }
40
+ static isAvailable() {
41
+ return typeof process !== "undefined" && typeof fetch === "function";
42
+ }
43
+ isAvailable() {
44
+ return typeof process !== "undefined" && typeof fetch === "function";
45
+ }
46
+ async connect() {
47
+ if (this.#base) return;
48
+ const url = this.#opts.connection?.url;
49
+ if (!url) throw new E_VECTOR_STORE_CONNECTION_FAILED(["Solr requires connection.url"]);
50
+ this.#base = url.replace(/\/$/, "");
51
+ }
52
+ async close() {
53
+ this.#base = null;
54
+ }
55
+ async #core(collection) {
56
+ if (!this.#base) await this.connect();
57
+ return `${this.#base}/solr/${encodeURIComponent(collection)}`;
58
+ }
59
+ async #post(coreUrl, path, body) {
60
+ const res = await fetch(coreUrl + path, {
61
+ method: "POST",
62
+ headers: { "Content-Type": "application/json" },
63
+ body: JSON.stringify(body)
64
+ });
65
+ const json = await res.json().catch(() => ({}));
66
+ if (!res.ok || json.error) throw new Error(json.error?.msg ?? `HTTP ${res.status}`);
67
+ return json;
68
+ }
69
+ async #get(coreUrl, path) {
70
+ const res = await fetch(coreUrl + path);
71
+ const json = await res.json().catch(() => ({}));
72
+ if (!res.ok || json.error) throw new Error(json.error?.msg ?? `HTTP ${res.status}`);
73
+ return json;
74
+ }
75
+ async createCollection(spec, _ifNotExists) {
76
+ const core = await this.#core(spec.collection);
77
+ this.#dims.set(spec.collection, spec.vector.dimensions);
78
+ const ftName = `knn_${spec.vector.dimensions}_${simFn(spec.vector.metric)}`;
79
+ try {
80
+ await this.#post(core, "/schema", { "add-field-type": {
81
+ name: ftName,
82
+ class: "solr.DenseVectorField",
83
+ vectorDimension: spec.vector.dimensions,
84
+ similarityFunction: simFn(spec.vector.metric)
85
+ } }).catch((e) => {
86
+ if (!String(e).includes("already")) throw e;
87
+ });
88
+ for (const f of [
89
+ {
90
+ name: "vec",
91
+ type: ftName,
92
+ indexed: true,
93
+ stored: true
94
+ },
95
+ {
96
+ name: "document",
97
+ type: "string",
98
+ stored: true
99
+ },
100
+ {
101
+ name: "metadata",
102
+ type: "string",
103
+ stored: true
104
+ }
105
+ ]) await this.#post(core, "/schema", { "add-field": f }).catch((e) => {
106
+ if (!String(e).includes("already")) throw e;
107
+ });
108
+ await this.#post(core, "/update?commit=true", { delete: { query: "*:*" } });
109
+ } catch (err) {
110
+ throw new E_VECTOR_STORE_COLLECTION_FAILED(["createCollection", String(err)]);
111
+ }
112
+ }
113
+ async dropCollection(collection, _ifExists) {
114
+ try {
115
+ const core = await this.#core(collection);
116
+ await this.#post(core, "/update?commit=true", { delete: { query: "*:*" } });
117
+ this.#dims.delete(collection);
118
+ } catch (err) {
119
+ throw new E_VECTOR_STORE_COLLECTION_FAILED(["dropCollection", String(err)]);
120
+ }
121
+ }
122
+ async hasCollection(collection) {
123
+ try {
124
+ const core = await this.#core(collection);
125
+ await this.#get(core, "/admin/ping");
126
+ return true;
127
+ } catch {
128
+ return false;
129
+ }
130
+ }
131
+ async renameCollection(_from, _to) {
132
+ throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(["renameCollection", "solr"]);
133
+ }
134
+ async executeUpsert(plan) {
135
+ if (plan.records.length === 0) return;
136
+ validateRecords(plan.records);
137
+ const core = await this.#core(plan.collection);
138
+ const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection);
139
+ try {
140
+ const docs = [];
141
+ for (const r of plan.records) {
142
+ let vector = r.vector;
143
+ if (!vector && r.document) {
144
+ const [v] = await this.encode([r.document], "document");
145
+ vector = v;
146
+ }
147
+ if (!vector) throw new E_VECTOR_STORE_UPSERT_FAILED(["Record missing vector and document"]);
148
+ if (expected !== void 0 && vector.length !== expected) throw new E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length]);
149
+ docs.push({
150
+ id: r.id,
151
+ vec: vector,
152
+ document: r.document ?? "",
153
+ metadata: r.metadata ? JSON.stringify(r.metadata) : "{}"
154
+ });
155
+ }
156
+ await this.#post(core, "/update?commit=true", docs);
157
+ } catch (err) {
158
+ if (isInstanceOf(err, "E_VECTOR_STORE_DIMENSION_MISMATCH", E_VECTOR_STORE_DIMENSION_MISMATCH) || isInstanceOf(err, "E_VECTOR_STORE_UPSERT_FAILED", E_VECTOR_STORE_UPSERT_FAILED)) throw err;
159
+ throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)]);
160
+ }
161
+ }
162
+ async executeSearch(plan) {
163
+ const core = await this.#core(plan.collection);
164
+ let queryVector;
165
+ if (plan.near) {
166
+ if ("vector" in plan.near) queryVector = plan.near.vector;
167
+ else if ("serverText" in plan.near) {
168
+ const [v] = await this.encode([plan.near.serverText], "query");
169
+ queryVector = v;
170
+ } else if ("id" in plan.near) {
171
+ const doc = (await this.#get(core, `/select?q=${encodeURIComponent("id:" + this.#escape(plan.near.id))}&fl=vec&rows=1`)).response?.docs?.[0];
172
+ if (!doc) throw new E_VECTOR_STORE_SEARCH_FAILED(["Referenced id not found: " + plan.near.id]);
173
+ queryVector = doc.vec;
174
+ }
175
+ }
176
+ const offset = plan.offset ?? 0;
177
+ const fl = "id,vec,document,metadata,score";
178
+ try {
179
+ let docs;
180
+ if (queryVector) {
181
+ const k = (plan.filter ? 1e3 : plan.topK + offset) || 10;
182
+ const q = `{!knn f=vec topK=${k}}[${queryVector.join(",")}]`;
183
+ docs = (await this.#get(core, `/select?q=${encodeURIComponent(q)}&fl=${fl}&rows=${k}`)).response?.docs ?? [];
184
+ } else docs = (await this.#get(core, `/select?q=*:*&fl=${fl}&rows=100000`)).response?.docs ?? [];
185
+ return (plan.filter ? docs.filter((d) => evaluateFilter(plan.filter, this.#parseMeta(d.metadata))) : docs).slice(offset, offset + plan.topK).map((d) => this.#project(d, plan, !!queryVector));
186
+ } catch (err) {
187
+ throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)]);
188
+ }
189
+ }
190
+ #escape(value) {
191
+ return value.replace(/([+\-!(){}[\]^"~*?:\\/ ])/g, "\\$1");
192
+ }
193
+ #parseMeta(val) {
194
+ if (typeof val === "string") try {
195
+ return JSON.parse(val);
196
+ } catch {
197
+ return {};
198
+ }
199
+ if (val && typeof val === "object") return val;
200
+ return {};
201
+ }
202
+ #project(doc, plan, isKnn) {
203
+ const proj = plan.projection;
204
+ const out = {};
205
+ if (proj.id) out.id = doc.id;
206
+ if (proj.vector && Array.isArray(doc.vec)) out.vector = doc.vec.map(Number);
207
+ if (proj.document) out.document = doc.document ?? void 0;
208
+ if (proj.metadata) out.metadata = this.#parseMeta(doc.metadata);
209
+ if (isKnn && typeof doc.score === "number") out.score = doc.score;
210
+ return out;
211
+ }
212
+ async executeDelete(plan) {
213
+ const core = await this.#core(plan.collection);
214
+ try {
215
+ if (plan.ids && plan.ids.length > 0) await this.#post(core, "/update?commit=true", { delete: plan.ids });
216
+ else if (plan.filter) {
217
+ const targets = ((await this.#get(core, `/select?q=*:*&fl=id,metadata&rows=100000`)).response?.docs ?? []).filter((d) => evaluateFilter(plan.filter, this.#parseMeta(d.metadata))).map((d) => d.id);
218
+ if (targets.length > 0) await this.#post(core, "/update?commit=true", { delete: targets });
219
+ } else await this.#post(core, "/update?commit=true", { delete: { query: "*:*" } });
220
+ } catch (err) {
221
+ throw new E_VECTOR_STORE_DELETE_FAILED([String(err)]);
222
+ }
223
+ }
224
+ };
225
+ //#endregion
226
+ export { SolrVectorStore };
227
+
228
+ //# sourceMappingURL=solr.mjs.map