@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 @@
1
+ {"version":3,"file":"clickhouse.mjs","names":["#opts","#client","#ensure","#json","#dims","#parseMeta","#project"],"sources":["../../../src/batteries/vector/clickhouse/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/clickhouse\n *\n * ClickHouse adapter. Vectors live in an `Array(Float32)` column; KNN uses ClickHouse's\n * `cosineDistance` / `L2Distance` / negative-inner-product expressions ordered ascending.\n * Metadata is a JSON `String` column, filtered with the neutral filter tree's JS reference\n * evaluator for exact cross-adapter parity. Each collection is a MergeTree table.\n *\n * MergeTree allows duplicate keys, so upsert is delete-then-insert; writes are made\n * read-after-write consistent with `mutations_sync = 2` on deletes.\n *\n * Driver: `@clickhouse/client` (HTTP).\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 ClickHouseVectorStoreOptions extends BaseVectorStoreOptions {\n connection?: { url?: string; username?: string; password?: string; database?: string }\n}\n\nconst getClickHouseClient = async () => {\n try {\n const mod = await import('@clickhouse/client')\n return mod.createClient\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['@clickhouse/client'])\n }\n}\n\n// ClickHouse distance expression per metric (all \"lower is closer\" once negated for dot).\nconst distanceExpr = (metric: DistanceMetric, vecLit: string): string =>\n metric === 'euclidean'\n ? `L2Distance(vec, ${vecLit})`\n : metric === 'dot'\n ? `-arraySum(arrayMap((a, b) -> a * b, vec, ${vecLit}))`\n : `cosineDistance(vec, ${vecLit})`\n\n// Backtick-quote an identifier, escaping embedded backticks.\nconst ident = (name: string): string => '`' + name.replace(/`/g, '``') + '`'\n\n// Single-quoted ClickHouse string literal.\nconst lit = (value: string): string => `'${value.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`\n\n// number[] → ClickHouse array literal [1, 2, 3].\nconst vectorLiteral = (vector: number[]): string =>\n `[${vector.map((n) => (Number.isFinite(n) ? String(n) : '0')).join(', ')}]`\n\nexport class ClickHouseVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: true,\n rawSql: true,\n builtInEncoding: false,\n // Made strongly consistent via mutations_sync=2 on deletes; writes visible on resolve.\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(): ClickHouseVectorStoreOptions {\n return this.options as ClickHouseVectorStoreOptions\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 createClient = await getClickHouseClient()\n const c = this.#opts.connection || {}\n try {\n this.#client = createClient({\n url: c.url ?? 'http://localhost:8123',\n username: c.username ?? 'default',\n password: c.password ?? '',\n database: c.database ?? 'default',\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.#client) {\n await this.#client.close()\n this.#client = null\n }\n }\n\n async #ensure(): Promise<any> {\n if (!this.#client) await this.connect()\n return this.#client!\n }\n\n async #json(sql: string): Promise<any[]> {\n const client = await this.#ensure()\n const rs = await client.query({ query: sql, format: 'JSONEachRow' })\n return (await rs.json()) as any[]\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 const ine = ifNotExists ? 'IF NOT EXISTS ' : ''\n try {\n await client.command({\n query:\n `CREATE TABLE ${ine}${ident(spec.collection)} (` +\n `id String, vec Array(Float32), document String, metadata String` +\n `) ENGINE = MergeTree() ORDER BY id`,\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 const ie = ifExists ? 'IF EXISTS ' : ''\n try {\n await client.command({ 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.#json(`EXISTS TABLE ${ident(collection)}`)\n return rows.length > 0 && (rows[0].result === 1 || rows[0].result === '1')\n }\n\n async renameCollection(from: string, to: string): Promise<void> {\n const client = await this.#ensure()\n try {\n await client.command({ 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 client = await this.#ensure()\n const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection)\n const values: any[] = []\n const ids: string[] = []\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 ids.push(r.id)\n values.push({\n id: r.id,\n vec: vector,\n document: r.document ?? '',\n metadata: r.metadata ? JSON.stringify(r.metadata) : '{}',\n })\n }\n // MergeTree allows dupes — delete the ids first (synchronously) so upsert replaces.\n const idList = ids.map((id) => lit(id)).join(', ')\n await client.command({\n query: `DELETE FROM ${ident(plan.collection)} WHERE id IN (${idList})`,\n clickhouse_settings: { mutations_sync: '2' },\n })\n await client.insert({\n table: plan.collection,\n values,\n format: 'JSONEachRow',\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.#json(\n `SELECT vec FROM ${ident(plan.collection)} WHERE id = ${lit(plan.near.id)} LIMIT 1`\n )\n if (rows.length === 0) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = rows[0].vec as number[]\n }\n }\n\n const offset = plan.offset ?? 0\n try {\n if (queryVector) {\n const distExpr = distanceExpr(metric, vectorLiteral(queryVector))\n const rows = await this.#json(\n `SELECT id, vec, document, metadata, ${distExpr} AS __dist FROM ${ident(plan.collection)}`\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.#json(\n `SELECT id, 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 #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(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 = (row.vec as number[]).map((n) => Number(n))\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 const client = await this.#ensure()\n const sync = { mutations_sync: '2' as const }\n try {\n if (plan.ids && plan.ids.length > 0) {\n const list = plan.ids.map((id) => lit(id)).join(', ')\n await client.command({\n query: `DELETE FROM ${ident(plan.collection)} WHERE id IN (${list})`,\n clickhouse_settings: sync,\n })\n } else if (plan.filter) {\n const rows = await this.#json(`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 list = targets.map((id) => lit(id)).join(', ')\n await client.command({\n query: `DELETE FROM ${ident(plan.collection)} WHERE id IN (${list})`,\n clickhouse_settings: sync,\n })\n }\n } else {\n await client.command({\n query: `DELETE FROM ${ident(plan.collection)} WHERE 1 = 1`,\n clickhouse_settings: sync,\n })\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,43 @@
1
+ /**
2
+ * @module @nhtio/adk/batteries/vector/cloudflare
3
+ *
4
+ * Managed Cloudflare Vectorize V2 vector-store adapter over REST (pure fetch, no driver).
5
+ * A logical collection maps to a Vectorize **index**. Supported dimensions: 32–1536.
6
+ *
7
+ * Upserter: POST /{name}/upsert via `multipart/form-data` with field name `vectors`
8
+ * (content-type `application/x-ndjson`). Each line: `{"id":"..","values":[..],"metadata":{..}}`.
9
+ * Query/get/delete use JSON bodies. Eventual consistency is handled by settle-polling.
10
+ *
11
+ * Native filtering: Vectorize requires pre-created metadata indexes and lacks `$and`/`$or`.
12
+ * For guaranteed cross-adapter parity, **over-fetch + JS evaluateFilter** (topK cap 100).
13
+ *
14
+ * Scores: returned as-is from Vectorize, then re-computed locally (cosineSim/dotProd/euclideanDist)
15
+ * to guarantee the [0,1] contract.
16
+ *
17
+ * Document: stored under the reserved metadata key `__document`; extracted on read.
18
+ */
19
+ import { BaseVectorStore } from "../contract";
20
+ import type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from "../plan";
21
+ import type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from "../types";
22
+ export interface CloudflareVectorizeVectorStoreOptions extends BaseVectorStoreOptions {
23
+ connection: {
24
+ accountId: string;
25
+ apiKey: string;
26
+ indexNamePrefix?: string;
27
+ };
28
+ }
29
+ export declare class CloudflareVectorizeVectorStore extends BaseVectorStore {
30
+ #private;
31
+ readonly capabilities: VectorStoreCapabilities;
32
+ static isAvailable(): boolean;
33
+ isAvailable(): boolean;
34
+ connect(): Promise<void>;
35
+ close(): Promise<void>;
36
+ createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void>;
37
+ dropCollection(collection: string, ifExists: boolean): Promise<void>;
38
+ hasCollection(collection: string): Promise<boolean>;
39
+ renameCollection(_from: string, _to: string): Promise<void>;
40
+ executeUpsert(plan: UpsertPlan): Promise<void>;
41
+ executeSearch(plan: SearchPlan): Promise<VectorMatch[]>;
42
+ executeDelete(plan: DeletePlan): Promise<void>;
43
+ }
@@ -0,0 +1,397 @@
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_helpers = require("./helpers.cjs");
7
+ const require_batteries_vector_exceptions = require("./exceptions.cjs");
8
+ const require_batteries_vector_contract = require("./contract.cjs");
9
+ const require_batteries_vector_validation = require("./validation.cjs");
10
+ //#region src/batteries/vector/cloudflare/index.ts
11
+ /**
12
+ * @module @nhtio/adk/batteries/vector/cloudflare
13
+ *
14
+ * Managed Cloudflare Vectorize V2 vector-store adapter over REST (pure fetch, no driver).
15
+ * A logical collection maps to a Vectorize **index**. Supported dimensions: 32–1536.
16
+ *
17
+ * Upserter: POST /{name}/upsert via `multipart/form-data` with field name `vectors`
18
+ * (content-type `application/x-ndjson`). Each line: `{"id":"..","values":[..],"metadata":{..}}`.
19
+ * Query/get/delete use JSON bodies. Eventual consistency is handled by settle-polling.
20
+ *
21
+ * Native filtering: Vectorize requires pre-created metadata indexes and lacks `$and`/`$or`.
22
+ * For guaranteed cross-adapter parity, **over-fetch + JS evaluateFilter** (topK cap 100).
23
+ *
24
+ * Scores: returned as-is from Vectorize, then re-computed locally (cosineSim/dotProd/euclideanDist)
25
+ * to guarantee the [0,1] contract.
26
+ *
27
+ * Document: stored under the reserved metadata key `__document`; extracted on read.
28
+ */
29
+ var BASE_URL = "https://api.cloudflare.com/client/v4/accounts";
30
+ var OVERFETCH = 50;
31
+ var mapMetricToCF = (metric) => {
32
+ if (metric === "cosine") return "cosine";
33
+ if (metric === "euclidean") return "euclidean";
34
+ if (metric === "dot") return "dot-product";
35
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_COLLECTION_FAILED(["createCollection", `Metric "${metric}" is not supported by Cloudflare Vectorize; use "cosine", "euclidean", or "dot"`]);
36
+ };
37
+ var cosineSim = (a, b) => {
38
+ let dot = 0;
39
+ let normA = 0;
40
+ let normB = 0;
41
+ a.forEach((av, i) => {
42
+ const bv = b[i];
43
+ dot += av * bv;
44
+ normA += av * av;
45
+ normB += bv * bv;
46
+ });
47
+ const denom = Math.sqrt(normA) * Math.sqrt(normB);
48
+ return denom === 0 ? 0 : dot / denom;
49
+ };
50
+ var dotProd = (a, b) => {
51
+ let s = 0;
52
+ a.forEach((av, i) => {
53
+ s += av * b[i];
54
+ });
55
+ return s;
56
+ };
57
+ var euclideanDist = (a, b) => {
58
+ let s = 0;
59
+ a.forEach((av, i) => {
60
+ const d = av - b[i];
61
+ s += d * d;
62
+ });
63
+ return Math.sqrt(s);
64
+ };
65
+ var computeScore = (vec, query, metric) => {
66
+ if (metric === "cosine") return require_batteries_vector_helpers.normalizeScore(cosineSim(vec, query), "cosine", "similarity");
67
+ else if (metric === "dot") return require_batteries_vector_helpers.normalizeScore(dotProd(vec, query), "dot", "similarity");
68
+ else if (metric === "euclidean") return require_batteries_vector_helpers.normalizeScore(euclideanDist(vec, query), "euclidean", "distance");
69
+ else return require_batteries_vector_helpers.normalizeScore(cosineSim(vec, query), "cosine", "similarity");
70
+ };
71
+ var CloudflareVectorizeVectorStore = class extends require_batteries_vector_contract.BaseVectorStore {
72
+ capabilities = {
73
+ transactions: false,
74
+ namedVectors: false,
75
+ rename: false,
76
+ rawSql: false,
77
+ builtInEncoding: false,
78
+ consistency: {
79
+ configurable: false,
80
+ default: "strong",
81
+ modes: ["strong"]
82
+ }
83
+ };
84
+ #baseUrl = null;
85
+ #authHeaders = null;
86
+ #dims = /* @__PURE__ */ new Map();
87
+ #metrics = /* @__PURE__ */ new Map();
88
+ get #opts() {
89
+ return this.options;
90
+ }
91
+ static isAvailable() {
92
+ return typeof process !== "undefined" && typeof fetch !== "undefined";
93
+ }
94
+ isAvailable() {
95
+ return typeof process !== "undefined" && typeof fetch !== "undefined";
96
+ }
97
+ #base() {
98
+ if (!this.#baseUrl) this.#baseUrl = `${BASE_URL}/${this.#opts.connection.accountId}/vectorize/v2/indexes`;
99
+ return this.#baseUrl;
100
+ }
101
+ #headers() {
102
+ if (!this.#authHeaders) this.#authHeaders = { Authorization: `Bearer ${this.#opts.connection.apiKey}` };
103
+ return this.#authHeaders;
104
+ }
105
+ #index(collection) {
106
+ return `${this.#opts.connection.indexNamePrefix ?? ""}${collection}`;
107
+ }
108
+ async #req(method, path, { json, form } = {}) {
109
+ const url = this.#base() + path;
110
+ const headers = { ...this.#headers() };
111
+ let body;
112
+ if (form) body = form;
113
+ else if (json !== void 0) {
114
+ body = JSON.stringify(json);
115
+ headers["Content-Type"] = "application/json";
116
+ }
117
+ const res = await fetch(url, {
118
+ method,
119
+ headers,
120
+ body
121
+ });
122
+ const payload = await res.json().catch(() => ({}));
123
+ if (!res.ok || !payload.success) {
124
+ const msg = payload.errors?.[0]?.message || payload.messages?.[0] || `HTTP ${res.status}`;
125
+ throw new Error(msg);
126
+ }
127
+ return payload.result;
128
+ }
129
+ async #settle(collection, opts) {
130
+ const present = opts.present ?? [];
131
+ const absent = opts.absent ?? [];
132
+ if (present.length === 0 && absent.length === 0) return;
133
+ const physicalIndex = this.#index(collection);
134
+ const dims = this.#dims.get(collection) ?? this.#opts.dimensions ?? 32;
135
+ const probeVec = new Array(dims).fill(0);
136
+ probeVec[0] = 1;
137
+ const STABLE = 3;
138
+ const deadline = Date.now() + 6e4;
139
+ let streak = 0;
140
+ while (Date.now() < deadline) {
141
+ let ok = true;
142
+ try {
143
+ const res = await this.#req("POST", `/${physicalIndex}/query`, { json: {
144
+ vector: probeVec,
145
+ topK: 50,
146
+ returnValues: false,
147
+ returnMetadata: "none"
148
+ } });
149
+ const seen = new Set((res.matches ?? []).map((m) => m.id));
150
+ if (present.length > 0 && !present.every((id) => seen.has(id))) ok = false;
151
+ if (absent.length > 0 && !absent.every((id) => !seen.has(id))) ok = false;
152
+ } catch {
153
+ ok = false;
154
+ }
155
+ streak = ok ? streak + 1 : 0;
156
+ if (streak >= STABLE) return;
157
+ await new Promise((r) => setTimeout(r, 500));
158
+ }
159
+ }
160
+ async connect() {}
161
+ async close() {
162
+ this.#baseUrl = null;
163
+ this.#authHeaders = null;
164
+ }
165
+ async createCollection(spec, ifNotExists) {
166
+ const collection = spec.collection;
167
+ const physicalIndex = this.#index(collection);
168
+ const dims = spec.vector.dimensions;
169
+ const metric = spec.vector.metric;
170
+ if (dims < 32 || dims > 1536) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_COLLECTION_FAILED(["createCollection", `Dimensions must be 32–1536; got ${dims}`]);
171
+ this.#dims.set(collection, dims);
172
+ this.#metrics.set(collection, metric);
173
+ if (ifNotExists) {
174
+ if (await this.hasCollection(collection)) return;
175
+ }
176
+ try {
177
+ await this.connect();
178
+ const body = {
179
+ name: physicalIndex,
180
+ config: {
181
+ dimensions: dims,
182
+ metric: mapMetricToCF(metric)
183
+ }
184
+ };
185
+ await this.#req("POST", "", { json: body });
186
+ } catch (err) {
187
+ const msg = String(err);
188
+ if (ifNotExists && msg.toLowerCase().includes("already exists")) return;
189
+ if (!ifNotExists && msg.toLowerCase().includes("already exists")) try {
190
+ await this.dropCollection(collection, true);
191
+ await this.createCollection(spec, false);
192
+ return;
193
+ } catch {}
194
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_COLLECTION_FAILED(["createCollection", msg]);
195
+ }
196
+ }
197
+ async dropCollection(collection, ifExists) {
198
+ const physicalIndex = this.#index(collection);
199
+ if (ifExists) {
200
+ if (!await this.hasCollection(collection)) return;
201
+ } else if (!await this.hasCollection(collection)) return;
202
+ try {
203
+ await this.connect();
204
+ await this.#req("DELETE", `/${physicalIndex}`);
205
+ this.#dims.delete(collection);
206
+ this.#metrics.delete(collection);
207
+ } catch (err) {
208
+ const msg = String(err);
209
+ if (ifExists && (msg.includes("not found") || msg.includes("404"))) return;
210
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_COLLECTION_FAILED(["dropCollection", msg]);
211
+ }
212
+ }
213
+ async hasCollection(collection) {
214
+ await this.connect();
215
+ const physicalIndex = this.#index(collection);
216
+ try {
217
+ return !!await this.#req("GET", `/${physicalIndex}`);
218
+ } catch {
219
+ return false;
220
+ }
221
+ }
222
+ async renameCollection(_from, _to) {
223
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_UNSUPPORTED_OPERATION(["renameCollection", "cloudflare"]);
224
+ }
225
+ async executeUpsert(plan) {
226
+ if (plan.records.length === 0) return;
227
+ require_batteries_vector_validation.validateRecords(plan.records);
228
+ const collection = plan.collection;
229
+ const physicalIndex = this.#index(collection);
230
+ const dims = this.#dims.get(collection) ?? this.#opts.dimensions;
231
+ try {
232
+ await this.connect();
233
+ const ndjsonLines = [];
234
+ for (const r of plan.records) {
235
+ let vector = r.vector;
236
+ if (!vector && r.document) {
237
+ const [v] = await this.encode([r.document], "document");
238
+ vector = v;
239
+ }
240
+ if (!vector) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_UPSERT_FAILED(["Record missing vector and document"]);
241
+ if (dims !== void 0 && vector.length !== dims) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_DIMENSION_MISMATCH([dims, vector.length]);
242
+ const meta = { ...r.metadata ?? {} };
243
+ if (r.document) meta.__document = r.document;
244
+ ndjsonLines.push(JSON.stringify({
245
+ id: r.id,
246
+ values: vector,
247
+ metadata: meta
248
+ }));
249
+ }
250
+ const ndjson = ndjsonLines.join("\n");
251
+ const fd = new FormData();
252
+ fd.append("vectors", new Blob([ndjson], { type: "application/x-ndjson" }), "vectors.ndjson");
253
+ await this.#req("POST", `/${physicalIndex}/upsert`, { form: fd });
254
+ await this.#settle(collection, { present: plan.records.map((r) => r.id) });
255
+ } catch (err) {
256
+ 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;
257
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_UPSERT_FAILED([String(err)]);
258
+ }
259
+ }
260
+ async executeSearch(plan) {
261
+ await this.connect();
262
+ const collection = plan.collection;
263
+ const physicalIndex = this.#index(collection);
264
+ const metric = this.#metrics.get(collection) ?? this.#opts.metric ?? "cosine";
265
+ const offset = plan.offset ?? 0;
266
+ const dims = this.#dims.get(collection) ?? this.#opts.dimensions ?? 32;
267
+ let queryVector;
268
+ if (plan.near) {
269
+ if ("vector" in plan.near) queryVector = plan.near.vector;
270
+ else if ("serverText" in plan.near) {
271
+ const [v] = await this.encode([plan.near.serverText], "query");
272
+ queryVector = v;
273
+ } else if ("id" in plan.near) try {
274
+ const res = await this.#req("POST", `/${physicalIndex}/get_by_ids`, { json: { ids: [plan.near.id] } });
275
+ const match = Array.isArray(res) ? res[0] : res?.result?.[0];
276
+ if (!match || !match.values) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_SEARCH_FAILED(["Referenced id not found: " + plan.near.id]);
277
+ queryVector = match.values;
278
+ } catch (err) {
279
+ const msg = String(err);
280
+ if (msg.includes("not found") || msg.includes("404")) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_SEARCH_FAILED(["Referenced id not found: " + plan.near.id]);
281
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_SEARCH_FAILED([msg]);
282
+ }
283
+ }
284
+ if (queryVector) {
285
+ let rawMatches = (await this.#req("POST", `/${physicalIndex}/query`, { json: {
286
+ vector: queryVector,
287
+ topK: OVERFETCH,
288
+ filter: void 0,
289
+ returnValues: true,
290
+ returnMetadata: "all"
291
+ } })).matches ?? [];
292
+ if (plan.filter) rawMatches = rawMatches.filter((m) => {
293
+ const meta = this.#projectMeta(m.metadata);
294
+ return require_batteries_vector_filters.evaluateFilter(plan.filter, meta);
295
+ });
296
+ rawMatches = rawMatches.slice(offset, offset + plan.topK);
297
+ const out = [];
298
+ for (const m of rawMatches) {
299
+ const projected = this.#project(m, plan, void 0, metric, queryVector);
300
+ if (projected) out.push(projected);
301
+ }
302
+ return out;
303
+ } else {
304
+ const probeVec = new Array(dims).fill(0);
305
+ probeVec[0] = 1;
306
+ let rawMatches = (await this.#req("POST", `/${physicalIndex}/query`, { json: {
307
+ vector: probeVec,
308
+ topK: OVERFETCH,
309
+ filter: void 0,
310
+ returnValues: false,
311
+ returnMetadata: "all"
312
+ } })).matches ?? [];
313
+ if (plan.filter) rawMatches = rawMatches.filter((m) => {
314
+ const meta = this.#projectMeta(m.metadata);
315
+ return require_batteries_vector_filters.evaluateFilter(plan.filter, meta);
316
+ });
317
+ rawMatches = rawMatches.slice(offset, offset + plan.topK);
318
+ const out = [];
319
+ for (const m of rawMatches) {
320
+ const projected = this.#project(m, plan, void 0, metric, void 0);
321
+ if (projected) out.push(projected);
322
+ }
323
+ return out;
324
+ }
325
+ }
326
+ #projectMeta(metadata) {
327
+ if (!metadata || typeof metadata !== "object") return {};
328
+ const out = {};
329
+ for (const key in metadata) if (key !== "__document") out[key] = metadata[key];
330
+ return out;
331
+ }
332
+ #project(match, plan, score, metric, queryVector) {
333
+ const proj = plan.projection;
334
+ const out = {};
335
+ if (proj.id) out.id = match.id;
336
+ if (proj.document) {
337
+ const meta = match.metadata ?? {};
338
+ if (typeof meta.__document === "string") out.document = meta.__document;
339
+ }
340
+ if (proj.metadata) out.metadata = this.#projectMeta(match.metadata);
341
+ if (proj.vector) out.vector = match.values;
342
+ if (typeof score === "number") out.score = score;
343
+ else if (queryVector && match.values) out.score = computeScore(match.values, queryVector, metric);
344
+ if (Object.keys(out).length === 0) return null;
345
+ return out;
346
+ }
347
+ async executeDelete(plan) {
348
+ const collection = plan.collection;
349
+ const physicalIndex = this.#index(collection);
350
+ try {
351
+ await this.connect();
352
+ if (plan.ids && plan.ids.length > 0) {
353
+ await this.#req("POST", `/${physicalIndex}/delete_by_ids`, { json: { ids: plan.ids } });
354
+ await this.#settle(collection, { absent: plan.ids });
355
+ } else if (plan.filter) {
356
+ const dims = this.#dims.get(collection) ?? this.#opts.dimensions ?? 32;
357
+ const probeVec = new Array(dims).fill(0);
358
+ probeVec[0] = 1;
359
+ const res = await this.#req("POST", `/${physicalIndex}/query`, { json: {
360
+ vector: probeVec,
361
+ topK: OVERFETCH,
362
+ returnValues: true,
363
+ returnMetadata: "all"
364
+ } });
365
+ const targets = [];
366
+ for (const m of res.matches ?? []) {
367
+ const meta = this.#projectMeta(m.metadata);
368
+ if (require_batteries_vector_filters.evaluateFilter(plan.filter, meta)) targets.push(m.id);
369
+ }
370
+ if (targets.length > 0) {
371
+ await this.#req("POST", `/${physicalIndex}/delete_by_ids`, { json: { ids: targets } });
372
+ await this.#settle(collection, { absent: targets });
373
+ }
374
+ } else {
375
+ const dims = this.#dims.get(collection) ?? this.#opts.dimensions ?? 32;
376
+ const probeVec = new Array(dims).fill(0);
377
+ probeVec[0] = 1;
378
+ const allIds = ((await this.#req("POST", `/${physicalIndex}/query`, { json: {
379
+ vector: probeVec,
380
+ topK: OVERFETCH,
381
+ returnValues: true,
382
+ returnMetadata: "all"
383
+ } })).matches ?? []).map((m) => m.id);
384
+ if (allIds.length > 0) {
385
+ await this.#req("POST", `/${physicalIndex}/delete_by_ids`, { json: { ids: allIds } });
386
+ await this.#settle(collection, { absent: allIds });
387
+ }
388
+ }
389
+ } catch (err) {
390
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_DELETE_FAILED([String(err)]);
391
+ }
392
+ }
393
+ };
394
+ //#endregion
395
+ exports.CloudflareVectorizeVectorStore = CloudflareVectorizeVectorStore;
396
+
397
+ //# sourceMappingURL=cloudflare.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflare.cjs","names":["#opts","#baseUrl","#authHeaders","#req","#base","#headers","#settle","#index","#dims","#metrics","#projectMeta","#project"],"sources":["../../../src/batteries/vector/cloudflare/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/cloudflare\n *\n * Managed Cloudflare Vectorize V2 vector-store adapter over REST (pure fetch, no driver).\n * A logical collection maps to a Vectorize **index**. Supported dimensions: 32–1536.\n *\n * Upserter: POST /{name}/upsert via `multipart/form-data` with field name `vectors`\n * (content-type `application/x-ndjson`). Each line: `{\"id\":\"..\",\"values\":[..],\"metadata\":{..}}`.\n * Query/get/delete use JSON bodies. Eventual consistency is handled by settle-polling.\n *\n * Native filtering: Vectorize requires pre-created metadata indexes and lacks `$and`/`$or`.\n * For guaranteed cross-adapter parity, **over-fetch + JS evaluateFilter** (topK cap 100).\n *\n * Scores: returned as-is from Vectorize, then re-computed locally (cosineSim/dotProd/euclideanDist)\n * to guarantee the [0,1] contract.\n *\n * Document: stored under the reserved metadata key `__document`; extracted on read.\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_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\n// Cloudflare Vectorize V2 REST endpoint base\nconst BASE_URL = 'https://api.cloudflare.com/client/v4/accounts'\n\n// Over-fetch constant for JS filtering (Vectorize native filtering needs metadata indexes + lacks\n// $and/$or). Cloudflare caps topK at 50 when returnValues=true or returnMetadata=all (which we\n// need to recompute scores + filter locally), so 50 is the ceiling.\nconst OVERFETCH = 50\n\nconst mapMetricToCF = (metric: DistanceMetric): string => {\n if (metric === 'cosine') return 'cosine'\n if (metric === 'euclidean') return 'euclidean'\n if (metric === 'dot') return 'dot-product'\n throw new E_VECTOR_STORE_COLLECTION_FAILED([\n 'createCollection',\n `Metric \"${metric}\" is not supported by Cloudflare Vectorize; use \"cosine\", \"euclidean\", or \"dot\"`,\n ])\n}\n\n// Score computation helpers (copied from couchbase/index.ts)\nconst cosineSim = (a: number[], b: number[]): number => {\n let dot = 0\n let normA = 0\n let normB = 0\n a.forEach((av, i) => {\n const bv = b[i]\n dot += av * bv\n normA += av * av\n normB += bv * bv\n })\n const denom = Math.sqrt(normA) * Math.sqrt(normB)\n return denom === 0 ? 0 : dot / denom\n}\n\nconst dotProd = (a: number[], b: number[]): number => {\n let s = 0\n a.forEach((av, i) => {\n s += av * b[i]\n })\n return s\n}\n\nconst euclideanDist = (a: number[], b: number[]): number => {\n let s = 0\n a.forEach((av, i) => {\n const d = av - b[i]\n s += d * d\n })\n return Math.sqrt(s)\n}\n\nconst computeScore = (vec: number[], query: number[], metric: DistanceMetric): number => {\n if (metric === 'cosine') {\n const raw = cosineSim(vec, query)\n return normalizeScore(raw, 'cosine', 'similarity')\n } else if (metric === 'dot') {\n const raw = dotProd(vec, query)\n return normalizeScore(raw, 'dot', 'similarity')\n } else if (metric === 'euclidean') {\n const raw = euclideanDist(vec, query)\n return normalizeScore(raw, 'euclidean', 'distance')\n } else {\n // Fallback\n const raw = cosineSim(vec, query)\n return normalizeScore(raw, 'cosine', 'similarity')\n }\n}\n\nexport interface CloudflareVectorizeVectorStoreOptions extends BaseVectorStoreOptions {\n connection: {\n accountId: string\n apiKey: string\n indexNamePrefix?: string\n }\n}\n\nexport class CloudflareVectorizeVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: false,\n rawSql: false,\n builtInEncoding: false,\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n\n #baseUrl: string | null = null\n #authHeaders: Record<string, string> | null = null\n #dims: Map<string, number> = new Map()\n #metrics: Map<string, DistanceMetric> = new Map()\n\n get #opts(): CloudflareVectorizeVectorStoreOptions {\n return this.options as CloudflareVectorizeVectorStoreOptions\n }\n\n static isAvailable(): boolean {\n return typeof process !== 'undefined' && typeof fetch !== 'undefined'\n }\n\n isAvailable(): boolean {\n return typeof process !== 'undefined' && typeof fetch !== 'undefined'\n }\n\n #base(): string {\n if (!this.#baseUrl) {\n this.#baseUrl = `${BASE_URL}/${this.#opts.connection.accountId}/vectorize/v2/indexes`\n }\n return this.#baseUrl\n }\n\n #headers(): Record<string, string> {\n if (!this.#authHeaders) {\n this.#authHeaders = { Authorization: `Bearer ${this.#opts.connection.apiKey}` }\n }\n return this.#authHeaders\n }\n\n // Map a logical collection name to its physical Vectorize index name (with optional prefix).\n #index(collection: string): string {\n const prefix = this.#opts.connection.indexNamePrefix ?? ''\n return `${prefix}${collection}`\n }\n\n async #req<T = any>(\n method: string,\n path: string,\n { json, form }: { json?: any; form?: FormData } = {}\n ): Promise<T> {\n const url = this.#base() + path\n const headers: Record<string, string> = { ...this.#headers() }\n let body: BodyInit | undefined\n if (form) {\n body = form\n } else if (json !== undefined) {\n body = JSON.stringify(json)\n headers['Content-Type'] = 'application/json'\n }\n const res = await fetch(url, { method, headers, body })\n const payload: any = await res.json().catch(() => ({}))\n if (!res.ok || !payload.success) {\n const msg = payload.errors?.[0]?.message || payload.messages?.[0] || `HTTP ${res.status}`\n throw new Error(msg)\n }\n return payload.result\n }\n\n // Settle-poll after writes/deletes against the QUERY index (the surface reads go through).\n //\n // Vectorize is aggressively eventually-consistent: a fresh index takes ~20s before its first\n // write is queryable, and the query index FLAPS — a just-written id can appear then vanish (or a\n // just-deleted id reappear) across consecutive polls for several seconds. A single converged poll\n // is therefore not enough. We require STABILITY: `STABLE` consecutive polls that all satisfy the\n // present/absent condition before returning, so the subsequent read-after-write is reliable.\n async #settle(\n collection: string,\n opts: { present?: string[]; absent?: string[] }\n ): Promise<void> {\n const present = opts.present ?? []\n const absent = opts.absent ?? []\n if (present.length === 0 && absent.length === 0) return\n\n const physicalIndex = this.#index(collection)\n const dims = this.#dims.get(collection) ?? this.#opts.dimensions ?? 32\n const probeVec = new Array(dims).fill(0)\n probeVec[0] = 1\n\n const STABLE = 3 // consecutive satisfying polls required to declare settled\n const deadline = Date.now() + 60_000\n let streak = 0\n while (Date.now() < deadline) {\n let ok = true\n try {\n const res = await this.#req<{ matches: any[] }>('POST', `/${physicalIndex}/query`, {\n json: { vector: probeVec, topK: 50, returnValues: false, returnMetadata: 'none' },\n })\n const seen = new Set((res.matches ?? []).map((m: any) => m.id))\n if (present.length > 0 && !present.every((id) => seen.has(id))) ok = false\n if (absent.length > 0 && !absent.every((id) => !seen.has(id))) ok = false\n } catch {\n ok = false\n }\n streak = ok ? streak + 1 : 0\n if (streak >= STABLE) return\n await new Promise((r) => setTimeout(r, 500))\n }\n }\n\n async connect(): Promise<void> {\n // HTTP is stateless; the base URL + auth headers are built lazily and cached on first use.\n }\n\n async close(): Promise<void> {\n this.#baseUrl = null\n this.#authHeaders = null\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n const collection = spec.collection\n const physicalIndex = this.#index(collection)\n const dims = spec.vector.dimensions\n const metric = spec.vector.metric\n\n // Validate dimensions (32–1536)\n if (dims < 32 || dims > 1536) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED([\n 'createCollection',\n `Dimensions must be 32–1536; got ${dims}`,\n ])\n }\n\n this.#dims.set(collection, dims)\n this.#metrics.set(collection, metric)\n\n if (ifNotExists) {\n if (await this.hasCollection(collection)) return\n }\n\n try {\n await this.connect()\n const body: any = {\n name: physicalIndex,\n config: {\n dimensions: dims,\n metric: mapMetricToCF(metric),\n },\n }\n await this.#req('POST', '', { json: body })\n } catch (err: any) {\n const msg = String(err)\n if (ifNotExists && msg.toLowerCase().includes('already exists')) {\n return\n }\n // If NOT ifNotExists and exists, best-effort clear (Vectorize has no bulk-clear;\n // per-test isolation uses prefix so fresh index is effectively empty).\n if (!ifNotExists && msg.toLowerCase().includes('already exists')) {\n try {\n await this.dropCollection(collection, true)\n await this.createCollection(spec, false)\n return\n } catch {\n // Fall through to rethrow original\n }\n }\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['createCollection', msg])\n }\n }\n\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n const physicalIndex = this.#index(collection)\n\n if (ifExists) {\n if (!(await this.hasCollection(collection))) return\n } else if (!(await this.hasCollection(collection))) {\n return\n }\n\n try {\n await this.connect()\n await this.#req('DELETE', `/${physicalIndex}`)\n // Clear local state\n this.#dims.delete(collection)\n this.#metrics.delete(collection)\n } catch (err: any) {\n const msg = String(err)\n if (ifExists && (msg.includes('not found') || msg.includes('404'))) {\n return\n }\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', msg])\n }\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n await this.connect()\n const physicalIndex = this.#index(collection)\n try {\n const res: any = await this.#req('GET', `/${physicalIndex}`)\n return !!res\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', 'cloudflare'])\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n\n const collection = plan.collection\n const physicalIndex = this.#index(collection)\n const dims = this.#dims.get(collection) ?? this.#opts.dimensions\n\n try {\n await this.connect()\n\n const ndjsonLines: string[] = []\n for (const r of plan.records) {\n let vector = r.vector\n if (!vector && r.document) {\n const [v] = await this.encode([r.document], 'document')\n vector = v\n }\n if (!vector) {\n throw new E_VECTOR_STORE_UPSERT_FAILED(['Record missing vector and document'])\n }\n if (dims !== undefined && vector.length !== dims) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([dims, vector.length])\n }\n const meta: any = { ...(r.metadata ?? {}) }\n if (r.document) meta.__document = r.document\n ndjsonLines.push(JSON.stringify({ id: r.id, values: vector, metadata: meta }))\n }\n\n const ndjson = ndjsonLines.join('\\n')\n\n // Build FormData for multipart upload\n const fd = new FormData()\n fd.append('vectors', new Blob([ndjson], { type: 'application/x-ndjson' }), 'vectors.ndjson')\n\n await this.#req('POST', `/${physicalIndex}/upsert`, { form: fd })\n\n // Settle until all ids are visible\n await this.#settle(collection, { present: plan.records.map((r) => r.id) })\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 await this.connect()\n const collection = plan.collection\n const physicalIndex = this.#index(collection)\n const metric = this.#metrics.get(collection) ?? this.#opts.metric ?? 'cosine'\n const offset = plan.offset ?? 0\n const dims = this.#dims.get(collection) ?? this.#opts.dimensions ?? 32\n\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 res: any = await this.#req('POST', `/${physicalIndex}/get_by_ids`, {\n json: { ids: [plan.near.id] },\n })\n const match = Array.isArray(res) ? res[0] : res?.result?.[0]\n if (!match || !match.values) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = match.values\n } catch (err: any) {\n const msg = String(err)\n if (msg.includes('not found') || msg.includes('404')) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n throw new E_VECTOR_STORE_SEARCH_FAILED([msg])\n }\n }\n }\n\n if (queryVector) {\n // Similarity search: query with over-fetch, JS-filter, recompute scores\n const res: any = await this.#req('POST', `/${physicalIndex}/query`, {\n json: {\n vector: queryVector,\n topK: OVERFETCH,\n filter: undefined, // no native filter for parity\n returnValues: true,\n returnMetadata: 'all',\n },\n })\n let rawMatches = res.matches ?? []\n\n // Filter by JS-evaluateFilter\n if (plan.filter) {\n rawMatches = rawMatches.filter((m: any) => {\n const meta = this.#projectMeta(m.metadata)\n return evaluateFilter(plan.filter!, meta)\n })\n }\n\n // Slice offset+topK\n rawMatches = rawMatches.slice(offset, offset + plan.topK)\n\n // Re-compute scores and project\n const out: VectorMatch[] = []\n for (const m of rawMatches) {\n const projected = this.#project(m, plan, undefined, metric, queryVector)\n if (projected) out.push(projected)\n }\n return out\n } else {\n // Filter-scan: query with arbitrary probe vector, over-fetch, JS-filter\n const probeVec = new Array(dims).fill(0)\n probeVec[0] = 1\n\n const res: any = await this.#req('POST', `/${physicalIndex}/query`, {\n json: {\n vector: probeVec,\n topK: OVERFETCH,\n filter: undefined,\n returnValues: false,\n returnMetadata: 'all',\n },\n })\n let rawMatches = res.matches ?? []\n\n // JS-filter\n if (plan.filter) {\n rawMatches = rawMatches.filter((m: any) => {\n const meta = this.#projectMeta(m.metadata)\n return evaluateFilter(plan.filter!, meta)\n })\n }\n\n // Slice\n rawMatches = rawMatches.slice(offset, offset + plan.topK)\n\n // Project without score\n const out: VectorMatch[] = []\n for (const m of rawMatches) {\n const projected = this.#project(m, plan, undefined, metric, undefined)\n if (projected) out.push(projected)\n }\n return out\n }\n }\n\n #projectMeta(metadata: any): VectorMetadata {\n if (!metadata || typeof metadata !== 'object') return {}\n const out: VectorMetadata = {}\n for (const key in metadata) {\n if (key !== '__document') out[key] = metadata[key]\n }\n return out\n }\n\n #project(\n match: any,\n plan: SearchPlan,\n score: number | undefined,\n metric: DistanceMetric,\n queryVector: number[] | undefined\n ): VectorMatch | null {\n const proj = plan.projection\n const out: VectorMatch = {}\n\n if (proj.id) out.id = match.id\n\n if (proj.document) {\n const meta = match.metadata ?? {}\n if (typeof meta.__document === 'string') {\n out.document = meta.__document\n }\n }\n\n if (proj.metadata) {\n out.metadata = this.#projectMeta(match.metadata)\n }\n\n if (proj.vector) {\n out.vector = match.values\n }\n\n if (typeof score === 'number') {\n out.score = score\n } else if (queryVector && match.values) {\n // Recompute score for the [0,1] contract\n out.score = computeScore(match.values, queryVector, metric)\n }\n\n // If nothing was projected, return null to filter out\n if (Object.keys(out).length === 0) return null\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const collection = plan.collection\n const physicalIndex = this.#index(collection)\n\n try {\n await this.connect()\n\n if (plan.ids && plan.ids.length > 0) {\n await this.#req('POST', `/${physicalIndex}/delete_by_ids`, {\n json: { ids: plan.ids },\n })\n await this.#settle(collection, { absent: plan.ids })\n } else if (plan.filter) {\n // Enumerate all, JS-filter, delete matched\n const dims = this.#dims.get(collection) ?? this.#opts.dimensions ?? 32\n const probeVec = new Array(dims).fill(0)\n probeVec[0] = 1\n\n const res: any = await this.#req('POST', `/${physicalIndex}/query`, {\n json: {\n vector: probeVec,\n topK: OVERFETCH,\n returnValues: true,\n returnMetadata: 'all',\n },\n })\n const targets: string[] = []\n for (const m of res.matches ?? []) {\n const meta = this.#projectMeta(m.metadata)\n if (evaluateFilter(plan.filter!, meta)) {\n targets.push(m.id)\n }\n }\n\n if (targets.length > 0) {\n await this.#req('POST', `/${physicalIndex}/delete_by_ids`, {\n json: { ids: targets },\n })\n await this.#settle(collection, { absent: targets })\n }\n } else {\n // Delete all: enumerate all ids then delete\n const dims = this.#dims.get(collection) ?? this.#opts.dimensions ?? 32\n const probeVec = new Array(dims).fill(0)\n probeVec[0] = 1\n\n const res: any = await this.#req('POST', `/${physicalIndex}/query`, {\n json: {\n vector: probeVec,\n topK: OVERFETCH,\n returnValues: true,\n returnMetadata: 'all',\n },\n })\n\n const allIds = (res.matches ?? []).map((m: any) => m.id)\n if (allIds.length > 0) {\n await this.#req('POST', `/${physicalIndex}/delete_by_ids`, {\n json: { ids: allIds },\n })\n await this.#settle(collection, { absent: allIds })\n }\n }\n } catch (err: any) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n"],"mappings":"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"}