@nhtio/adk 1.20260607.2 → 1.20260609.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (501) hide show
  1. package/CHANGELOG.md +185 -0
  2. package/batteries/embeddings/openai/adapter.cjs +1 -1
  3. package/batteries/embeddings/openai/adapter.mjs +1 -1
  4. package/batteries/embeddings/openai/exceptions.cjs +1 -1
  5. package/batteries/embeddings/openai/exceptions.mjs +1 -1
  6. package/batteries/embeddings/openai/types.d.ts +7 -0
  7. package/batteries/embeddings/webllm/adapter.cjs +1 -1
  8. package/batteries/embeddings/webllm/adapter.mjs +1 -1
  9. package/batteries/embeddings/webllm/exceptions.cjs +1 -1
  10. package/batteries/embeddings/webllm/exceptions.mjs +1 -1
  11. package/batteries/llm/chat_common/helpers.d.ts +165 -0
  12. package/batteries/llm/chat_common/types.d.ts +309 -0
  13. package/batteries/llm/index.d.ts +5 -0
  14. package/batteries/llm/ollama/adapter.cjs +736 -0
  15. package/batteries/llm/ollama/adapter.cjs.map +1 -0
  16. package/batteries/llm/ollama/adapter.d.ts +64 -0
  17. package/batteries/llm/ollama/adapter.mjs +734 -0
  18. package/batteries/llm/ollama/adapter.mjs.map +1 -0
  19. package/batteries/llm/ollama/exceptions.cjs +105 -0
  20. package/batteries/llm/ollama/exceptions.cjs.map +1 -0
  21. package/batteries/llm/ollama/exceptions.d.ts +112 -0
  22. package/batteries/llm/ollama/exceptions.mjs +96 -0
  23. package/batteries/llm/ollama/exceptions.mjs.map +1 -0
  24. package/batteries/llm/ollama/helpers.cjs +487 -0
  25. package/batteries/llm/ollama/helpers.cjs.map +1 -0
  26. package/batteries/llm/ollama/helpers.d.ts +158 -0
  27. package/batteries/llm/ollama/helpers.mjs +450 -0
  28. package/batteries/llm/ollama/helpers.mjs.map +1 -0
  29. package/batteries/llm/ollama/index.d.ts +29 -0
  30. package/batteries/llm/ollama/types.cjs +2 -0
  31. package/batteries/llm/ollama/types.d.ts +334 -0
  32. package/batteries/llm/ollama/types.mjs +0 -0
  33. package/batteries/llm/ollama/validation.cjs +130 -0
  34. package/batteries/llm/ollama/validation.cjs.map +1 -0
  35. package/batteries/llm/ollama/validation.d.ts +31 -0
  36. package/batteries/llm/ollama/validation.mjs +127 -0
  37. package/batteries/llm/ollama/validation.mjs.map +1 -0
  38. package/batteries/llm/ollama.cjs +54 -0
  39. package/batteries/llm/ollama.mjs +6 -0
  40. package/batteries/llm/openai_chat_completions/adapter.cjs +36 -19
  41. package/batteries/llm/openai_chat_completions/adapter.cjs.map +1 -1
  42. package/batteries/llm/openai_chat_completions/adapter.mjs +23 -6
  43. package/batteries/llm/openai_chat_completions/adapter.mjs.map +1 -1
  44. package/batteries/llm/openai_chat_completions/exceptions.cjs +1 -1
  45. package/batteries/llm/openai_chat_completions/exceptions.mjs +1 -1
  46. package/batteries/llm/openai_chat_completions/helpers.cjs +80 -320
  47. package/batteries/llm/openai_chat_completions/helpers.cjs.map +1 -1
  48. package/batteries/llm/openai_chat_completions/helpers.d.ts +68 -144
  49. package/batteries/llm/openai_chat_completions/helpers.mjs +40 -280
  50. package/batteries/llm/openai_chat_completions/helpers.mjs.map +1 -1
  51. package/batteries/llm/openai_chat_completions/types.d.ts +273 -181
  52. package/batteries/llm/openai_chat_completions/validation.cjs +2 -2
  53. package/batteries/llm/openai_chat_completions/validation.cjs.map +1 -1
  54. package/batteries/llm/openai_chat_completions/validation.mjs +2 -2
  55. package/batteries/llm/openai_chat_completions/validation.mjs.map +1 -1
  56. package/batteries/llm/openai_chat_completions.cjs +29 -28
  57. package/batteries/llm/openai_chat_completions.mjs +2 -1
  58. package/batteries/llm/webllm_chat_completions/adapter.cjs +38 -19
  59. package/batteries/llm/webllm_chat_completions/adapter.cjs.map +1 -1
  60. package/batteries/llm/webllm_chat_completions/adapter.d.ts +18 -0
  61. package/batteries/llm/webllm_chat_completions/adapter.mjs +25 -6
  62. package/batteries/llm/webllm_chat_completions/adapter.mjs.map +1 -1
  63. package/batteries/llm/webllm_chat_completions/exceptions.cjs +1 -1
  64. package/batteries/llm/webllm_chat_completions/exceptions.mjs +1 -1
  65. package/batteries/llm/webllm_chat_completions/helpers.cjs +29 -28
  66. package/batteries/llm/webllm_chat_completions/helpers.mjs +2 -1
  67. package/batteries/llm/webllm_chat_completions/types.d.ts +21 -0
  68. package/batteries/llm/webllm_chat_completions/validation.cjs +13 -1
  69. package/batteries/llm/webllm_chat_completions/validation.cjs.map +1 -1
  70. package/batteries/llm/webllm_chat_completions/validation.d.ts +12 -0
  71. package/batteries/llm/webllm_chat_completions/validation.mjs +13 -1
  72. package/batteries/llm/webllm_chat_completions/validation.mjs.map +1 -1
  73. package/batteries/llm/webllm_chat_completions.cjs +29 -28
  74. package/batteries/llm/webllm_chat_completions.mjs +2 -1
  75. package/batteries/llm.cjs +44 -28
  76. package/batteries/llm.mjs +9 -4
  77. package/batteries/storage/flydrive.cjs +1 -1
  78. package/batteries/storage/flydrive.mjs +1 -1
  79. package/batteries/storage/in_memory/index.d.ts +1 -1
  80. package/batteries/storage/in_memory.cjs +2 -2
  81. package/batteries/storage/in_memory.cjs.map +1 -1
  82. package/batteries/storage/in_memory.mjs +2 -2
  83. package/batteries/storage/in_memory.mjs.map +1 -1
  84. package/batteries/storage/opfs/index.d.ts +19 -0
  85. package/batteries/storage/opfs.cjs +1 -1
  86. package/batteries/storage/opfs.cjs.map +1 -1
  87. package/batteries/storage/opfs.mjs +1 -1
  88. package/batteries/storage/opfs.mjs.map +1 -1
  89. package/batteries/tools/color.cjs +3 -2
  90. package/batteries/tools/color.cjs.map +1 -1
  91. package/batteries/tools/color.mjs +3 -2
  92. package/batteries/tools/color.mjs.map +1 -1
  93. package/batteries/tools/comparison.cjs +4 -3
  94. package/batteries/tools/comparison.cjs.map +1 -1
  95. package/batteries/tools/comparison.mjs +4 -3
  96. package/batteries/tools/comparison.mjs.map +1 -1
  97. package/batteries/tools/data_structure.cjs +30 -10
  98. package/batteries/tools/data_structure.cjs.map +1 -1
  99. package/batteries/tools/data_structure.mjs +30 -10
  100. package/batteries/tools/data_structure.mjs.map +1 -1
  101. package/batteries/tools/datetime_extended.cjs +5 -10
  102. package/batteries/tools/datetime_extended.cjs.map +1 -1
  103. package/batteries/tools/datetime_extended.mjs +5 -10
  104. package/batteries/tools/datetime_extended.mjs.map +1 -1
  105. package/batteries/tools/datetime_math.cjs +2 -2
  106. package/batteries/tools/datetime_math.mjs +2 -2
  107. package/batteries/tools/encoding.cjs +13 -4
  108. package/batteries/tools/encoding.cjs.map +1 -1
  109. package/batteries/tools/encoding.mjs +13 -4
  110. package/batteries/tools/encoding.mjs.map +1 -1
  111. package/batteries/tools/formatting.cjs +4 -4
  112. package/batteries/tools/formatting.cjs.map +1 -1
  113. package/batteries/tools/formatting.mjs +4 -4
  114. package/batteries/tools/formatting.mjs.map +1 -1
  115. package/batteries/tools/geo_basics.cjs +2 -2
  116. package/batteries/tools/geo_basics.mjs +2 -2
  117. package/batteries/tools/index.d.ts +1 -0
  118. package/batteries/tools/math.cjs +10 -8
  119. package/batteries/tools/math.cjs.map +1 -1
  120. package/batteries/tools/math.mjs +10 -8
  121. package/batteries/tools/math.mjs.map +1 -1
  122. package/batteries/tools/memory.cjs +5 -5
  123. package/batteries/tools/memory.mjs +5 -5
  124. package/batteries/tools/parsing.cjs +9 -5
  125. package/batteries/tools/parsing.cjs.map +1 -1
  126. package/batteries/tools/parsing.mjs +9 -5
  127. package/batteries/tools/parsing.mjs.map +1 -1
  128. package/batteries/tools/retrievables.cjs +4 -4
  129. package/batteries/tools/retrievables.mjs +4 -4
  130. package/batteries/tools/searxng/exceptions.d.ts +21 -0
  131. package/batteries/tools/searxng/index.d.ts +150 -0
  132. package/batteries/tools/searxng.cjs +5 -0
  133. package/batteries/tools/searxng.mjs +2 -0
  134. package/batteries/tools/standing_instructions.cjs +4 -4
  135. package/batteries/tools/standing_instructions.mjs +4 -4
  136. package/batteries/tools/statistics.cjs +54 -43
  137. package/batteries/tools/statistics.cjs.map +1 -1
  138. package/batteries/tools/statistics.mjs +54 -43
  139. package/batteries/tools/statistics.mjs.map +1 -1
  140. package/batteries/tools/string_processing.cjs +5 -5
  141. package/batteries/tools/string_processing.cjs.map +1 -1
  142. package/batteries/tools/string_processing.mjs +5 -5
  143. package/batteries/tools/string_processing.mjs.map +1 -1
  144. package/batteries/tools/structured_data.cjs +8 -13
  145. package/batteries/tools/structured_data.cjs.map +1 -1
  146. package/batteries/tools/structured_data.mjs +8 -13
  147. package/batteries/tools/structured_data.mjs.map +1 -1
  148. package/batteries/tools/text_analysis.cjs +3 -3
  149. package/batteries/tools/text_analysis.mjs +3 -3
  150. package/batteries/tools/text_comparison.cjs +2 -2
  151. package/batteries/tools/text_comparison.mjs +2 -2
  152. package/batteries/tools/time.cjs +2 -2
  153. package/batteries/tools/time.mjs +2 -2
  154. package/batteries/tools/unit_conversion.cjs +10 -8
  155. package/batteries/tools/unit_conversion.cjs.map +1 -1
  156. package/batteries/tools/unit_conversion.mjs +10 -8
  157. package/batteries/tools/unit_conversion.mjs.map +1 -1
  158. package/batteries/tools.cjs +3 -0
  159. package/batteries/tools.mjs +2 -1
  160. package/batteries/vector/arangodb/index.d.ts +2 -0
  161. package/batteries/vector/arangodb.cjs +2 -1
  162. package/batteries/vector/arangodb.cjs.map +1 -1
  163. package/batteries/vector/arangodb.mjs +2 -1
  164. package/batteries/vector/arangodb.mjs.map +1 -1
  165. package/batteries/vector/builder.cjs +31 -0
  166. package/batteries/vector/builder.cjs.map +1 -1
  167. package/batteries/vector/builder.d.ts +58 -0
  168. package/batteries/vector/builder.mjs +31 -0
  169. package/batteries/vector/builder.mjs.map +1 -1
  170. package/batteries/vector/chroma/index.d.ts +4 -0
  171. package/batteries/vector/chroma.cjs +3 -0
  172. package/batteries/vector/chroma.cjs.map +1 -1
  173. package/batteries/vector/chroma.mjs +3 -0
  174. package/batteries/vector/chroma.mjs.map +1 -1
  175. package/batteries/vector/clickhouse/index.d.ts +2 -0
  176. package/batteries/vector/clickhouse.cjs +2 -1
  177. package/batteries/vector/clickhouse.cjs.map +1 -1
  178. package/batteries/vector/clickhouse.mjs +2 -1
  179. package/batteries/vector/clickhouse.mjs.map +1 -1
  180. package/batteries/vector/cloudflare/index.d.ts +2 -0
  181. package/batteries/vector/cloudflare.cjs +2 -1
  182. package/batteries/vector/cloudflare.cjs.map +1 -1
  183. package/batteries/vector/cloudflare.mjs +2 -1
  184. package/batteries/vector/cloudflare.mjs.map +1 -1
  185. package/batteries/vector/conformance/index.d.ts +22 -0
  186. package/batteries/vector/conformance.cjs +22 -0
  187. package/batteries/vector/conformance.cjs.map +1 -1
  188. package/batteries/vector/conformance.mjs +22 -0
  189. package/batteries/vector/conformance.mjs.map +1 -1
  190. package/batteries/vector/contract.cjs +22 -0
  191. package/batteries/vector/contract.cjs.map +1 -1
  192. package/batteries/vector/contract.d.ts +51 -0
  193. package/batteries/vector/contract.mjs +22 -0
  194. package/batteries/vector/contract.mjs.map +1 -1
  195. package/batteries/vector/couchbase/index.d.ts +2 -0
  196. package/batteries/vector/couchbase.cjs +2 -1
  197. package/batteries/vector/couchbase.cjs.map +1 -1
  198. package/batteries/vector/couchbase.mjs +2 -1
  199. package/batteries/vector/couchbase.mjs.map +1 -1
  200. package/batteries/vector/duckdb/index.d.ts +2 -0
  201. package/batteries/vector/duckdb.cjs +2 -1
  202. package/batteries/vector/duckdb.cjs.map +1 -1
  203. package/batteries/vector/duckdb.mjs +2 -1
  204. package/batteries/vector/duckdb.mjs.map +1 -1
  205. package/batteries/vector/elasticsearch/index.d.ts +2 -0
  206. package/batteries/vector/elasticsearch.cjs +2 -1
  207. package/batteries/vector/elasticsearch.cjs.map +1 -1
  208. package/batteries/vector/elasticsearch.mjs +2 -1
  209. package/batteries/vector/elasticsearch.mjs.map +1 -1
  210. package/batteries/vector/exceptions.cjs +1 -1
  211. package/batteries/vector/exceptions.mjs +1 -1
  212. package/batteries/vector/factory.cjs +6 -0
  213. package/batteries/vector/factory.cjs.map +1 -1
  214. package/batteries/vector/factory.d.ts +14 -0
  215. package/batteries/vector/factory.mjs +6 -0
  216. package/batteries/vector/factory.mjs.map +1 -1
  217. package/batteries/vector/filters.cjs +22 -1
  218. package/batteries/vector/filters.cjs.map +1 -1
  219. package/batteries/vector/filters.d.ts +38 -0
  220. package/batteries/vector/filters.mjs +22 -1
  221. package/batteries/vector/filters.mjs.map +1 -1
  222. package/batteries/vector/helpers.cjs +13 -0
  223. package/batteries/vector/helpers.cjs.map +1 -1
  224. package/batteries/vector/helpers.d.ts +14 -0
  225. package/batteries/vector/helpers.mjs +13 -0
  226. package/batteries/vector/helpers.mjs.map +1 -1
  227. package/batteries/vector/hnswlib/index.d.ts +2 -0
  228. package/batteries/vector/hnswlib.cjs +2 -1
  229. package/batteries/vector/hnswlib.cjs.map +1 -1
  230. package/batteries/vector/hnswlib.mjs +2 -1
  231. package/batteries/vector/hnswlib.mjs.map +1 -1
  232. package/batteries/vector/in_memory/index.d.ts +1 -0
  233. package/batteries/vector/in_memory.cjs +1 -0
  234. package/batteries/vector/in_memory.cjs.map +1 -1
  235. package/batteries/vector/in_memory.mjs +1 -0
  236. package/batteries/vector/in_memory.mjs.map +1 -1
  237. package/batteries/vector/lancedb/index.d.ts +2 -0
  238. package/batteries/vector/lancedb.cjs +2 -1
  239. package/batteries/vector/lancedb.cjs.map +1 -1
  240. package/batteries/vector/lancedb.mjs +2 -1
  241. package/batteries/vector/lancedb.mjs.map +1 -1
  242. package/batteries/vector/mariadb/index.d.ts +2 -0
  243. package/batteries/vector/mariadb.cjs +2 -1
  244. package/batteries/vector/mariadb.cjs.map +1 -1
  245. package/batteries/vector/mariadb.mjs +2 -1
  246. package/batteries/vector/mariadb.mjs.map +1 -1
  247. package/batteries/vector/meilisearch/index.d.ts +2 -0
  248. package/batteries/vector/meilisearch.cjs +2 -1
  249. package/batteries/vector/meilisearch.cjs.map +1 -1
  250. package/batteries/vector/meilisearch.mjs +2 -1
  251. package/batteries/vector/meilisearch.mjs.map +1 -1
  252. package/batteries/vector/migrate.cjs +18 -1
  253. package/batteries/vector/migrate.cjs.map +1 -1
  254. package/batteries/vector/migrate.d.ts +31 -0
  255. package/batteries/vector/migrate.mjs +18 -1
  256. package/batteries/vector/migrate.mjs.map +1 -1
  257. package/batteries/vector/milvus/index.d.ts +5 -0
  258. package/batteries/vector/milvus.cjs +4 -0
  259. package/batteries/vector/milvus.cjs.map +1 -1
  260. package/batteries/vector/milvus.mjs +4 -0
  261. package/batteries/vector/milvus.mjs.map +1 -1
  262. package/batteries/vector/mongodb/index.d.ts +2 -0
  263. package/batteries/vector/mongodb.cjs +2 -1
  264. package/batteries/vector/mongodb.cjs.map +1 -1
  265. package/batteries/vector/mongodb.mjs +2 -1
  266. package/batteries/vector/mongodb.mjs.map +1 -1
  267. package/batteries/vector/neo4j/index.d.ts +2 -0
  268. package/batteries/vector/neo4j.cjs +2 -1
  269. package/batteries/vector/neo4j.cjs.map +1 -1
  270. package/batteries/vector/neo4j.mjs +2 -1
  271. package/batteries/vector/neo4j.mjs.map +1 -1
  272. package/batteries/vector/opensearch/index.d.ts +2 -0
  273. package/batteries/vector/opensearch.cjs +2 -1
  274. package/batteries/vector/opensearch.cjs.map +1 -1
  275. package/batteries/vector/opensearch.mjs +2 -1
  276. package/batteries/vector/opensearch.mjs.map +1 -1
  277. package/batteries/vector/oracle23ai/index.d.ts +2 -0
  278. package/batteries/vector/oracle23ai.cjs +2 -1
  279. package/batteries/vector/oracle23ai.cjs.map +1 -1
  280. package/batteries/vector/oracle23ai.mjs +2 -1
  281. package/batteries/vector/oracle23ai.mjs.map +1 -1
  282. package/batteries/vector/orama/index.d.ts +1 -0
  283. package/batteries/vector/orama.cjs +1 -0
  284. package/batteries/vector/orama.cjs.map +1 -1
  285. package/batteries/vector/orama.mjs +1 -0
  286. package/batteries/vector/orama.mjs.map +1 -1
  287. package/batteries/vector/pgvector/index.d.ts +9 -2
  288. package/batteries/vector/pgvector.cjs +4 -0
  289. package/batteries/vector/pgvector.cjs.map +1 -1
  290. package/batteries/vector/pgvector.mjs +4 -0
  291. package/batteries/vector/pgvector.mjs.map +1 -1
  292. package/batteries/vector/pinecone/index.d.ts +5 -0
  293. package/batteries/vector/pinecone.cjs +3 -1
  294. package/batteries/vector/pinecone.cjs.map +1 -1
  295. package/batteries/vector/pinecone.mjs +3 -1
  296. package/batteries/vector/pinecone.mjs.map +1 -1
  297. package/batteries/vector/plan.d.ts +27 -0
  298. package/batteries/vector/qdrant/index.d.ts +5 -0
  299. package/batteries/vector/qdrant.cjs +4 -0
  300. package/batteries/vector/qdrant.cjs.map +1 -1
  301. package/batteries/vector/qdrant.mjs +4 -0
  302. package/batteries/vector/qdrant.mjs.map +1 -1
  303. package/batteries/vector/redis/index.d.ts +2 -0
  304. package/batteries/vector/redis.cjs +2 -1
  305. package/batteries/vector/redis.cjs.map +1 -1
  306. package/batteries/vector/redis.mjs +2 -1
  307. package/batteries/vector/redis.mjs.map +1 -1
  308. package/batteries/vector/retrievable.cjs +9 -1
  309. package/batteries/vector/retrievable.cjs.map +1 -1
  310. package/batteries/vector/retrievable.mjs +9 -1
  311. package/batteries/vector/retrievable.mjs.map +1 -1
  312. package/batteries/vector/retrievable_glue.d.ts +21 -0
  313. package/batteries/vector/s3vectors/index.d.ts +2 -0
  314. package/batteries/vector/s3vectors.cjs +2 -1
  315. package/batteries/vector/s3vectors.cjs.map +1 -1
  316. package/batteries/vector/s3vectors.mjs +2 -1
  317. package/batteries/vector/s3vectors.mjs.map +1 -1
  318. package/batteries/vector/schema.cjs +28 -0
  319. package/batteries/vector/schema.cjs.map +1 -1
  320. package/batteries/vector/schema.d.ts +39 -0
  321. package/batteries/vector/schema.mjs +28 -0
  322. package/batteries/vector/schema.mjs.map +1 -1
  323. package/batteries/vector/solr/index.d.ts +2 -0
  324. package/batteries/vector/solr.cjs +2 -1
  325. package/batteries/vector/solr.cjs.map +1 -1
  326. package/batteries/vector/solr.mjs +2 -1
  327. package/batteries/vector/solr.mjs.map +1 -1
  328. package/batteries/vector/sqlite_vec/index.d.ts +6 -3
  329. package/batteries/vector/sqlite_vec.cjs +2 -0
  330. package/batteries/vector/sqlite_vec.cjs.map +1 -1
  331. package/batteries/vector/sqlite_vec.mjs +2 -0
  332. package/batteries/vector/sqlite_vec.mjs.map +1 -1
  333. package/batteries/vector/surrealdb/index.d.ts +2 -0
  334. package/batteries/vector/surrealdb.cjs +2 -1
  335. package/batteries/vector/surrealdb.cjs.map +1 -1
  336. package/batteries/vector/surrealdb.mjs +2 -1
  337. package/batteries/vector/surrealdb.mjs.map +1 -1
  338. package/batteries/vector/types.d.ts +27 -0
  339. package/batteries/vector/typesense/index.d.ts +2 -0
  340. package/batteries/vector/typesense.cjs +2 -1
  341. package/batteries/vector/typesense.cjs.map +1 -1
  342. package/batteries/vector/typesense.mjs +2 -1
  343. package/batteries/vector/typesense.mjs.map +1 -1
  344. package/batteries/vector/validation.cjs +14 -0
  345. package/batteries/vector/validation.cjs.map +1 -1
  346. package/batteries/vector/validation.d.ts +14 -0
  347. package/batteries/vector/validation.mjs +14 -0
  348. package/batteries/vector/validation.mjs.map +1 -1
  349. package/batteries/vector/vector_store_constructor.cjs +1 -1
  350. package/batteries/vector/vector_store_constructor.cjs.map +1 -1
  351. package/batteries/vector/vector_store_constructor.d.ts +1 -1
  352. package/batteries/vector/vector_store_constructor.mjs +1 -1
  353. package/batteries/vector/vector_store_constructor.mjs.map +1 -1
  354. package/batteries/vector/vespa/index.d.ts +2 -0
  355. package/batteries/vector/vespa.cjs +2 -1
  356. package/batteries/vector/vespa.cjs.map +1 -1
  357. package/batteries/vector/vespa.mjs +2 -1
  358. package/batteries/vector/vespa.mjs.map +1 -1
  359. package/batteries/vector/weaviate/index.d.ts +2 -0
  360. package/batteries/vector/weaviate.cjs +2 -1
  361. package/batteries/vector/weaviate.cjs.map +1 -1
  362. package/batteries/vector/weaviate.mjs +2 -1
  363. package/batteries/vector/weaviate.mjs.map +1 -1
  364. package/batteries.cjs +46 -28
  365. package/batteries.mjs +10 -5
  366. package/{common-BT0nfCi9.mjs → common-DYDUi99O.mjs} +9 -9
  367. package/common-DYDUi99O.mjs.map +1 -0
  368. package/{common-Cj8TaQ9U.js → common-DZl3ADJs.js} +9 -9
  369. package/common-DZl3ADJs.js.map +1 -0
  370. package/common.cjs +7 -7
  371. package/common.d.ts +1 -1
  372. package/common.mjs +7 -7
  373. package/{dispatch_runner-DPcS7Y_M.mjs → dispatch_runner--ZhdDWRZ.mjs} +27 -5
  374. package/{dispatch_runner-DPcS7Y_M.mjs.map → dispatch_runner--ZhdDWRZ.mjs.map} +1 -1
  375. package/{dispatch_runner-BHBNupqp.js → dispatch_runner-nHDKkxye.js} +27 -5
  376. package/{dispatch_runner-BHBNupqp.js.map → dispatch_runner-nHDKkxye.js.map} +1 -1
  377. package/dispatch_runner.cjs +1 -1
  378. package/dispatch_runner.d.ts +1 -1
  379. package/dispatch_runner.mjs +1 -1
  380. package/eslint/rules/artifact_tool_forbids_artifact_constructor.cjs +1 -0
  381. package/eslint/rules/artifact_tool_forbids_artifact_constructor.cjs.map +1 -1
  382. package/eslint/rules/artifact_tool_forbids_artifact_constructor.d.ts +1 -0
  383. package/eslint/rules/artifact_tool_forbids_artifact_constructor.mjs +1 -0
  384. package/eslint/rules/artifact_tool_forbids_artifact_constructor.mjs.map +1 -1
  385. package/eslint/rules/no_model_in_tool_handler.cjs +1 -0
  386. package/eslint/rules/no_model_in_tool_handler.cjs.map +1 -1
  387. package/eslint/rules/no_model_in_tool_handler.d.ts +1 -0
  388. package/eslint/rules/no_model_in_tool_handler.mjs +1 -0
  389. package/eslint/rules/no_model_in_tool_handler.mjs.map +1 -1
  390. package/eslint/rules/require_validator_any_required.cjs +1 -0
  391. package/eslint/rules/require_validator_any_required.cjs.map +1 -1
  392. package/eslint/rules/require_validator_any_required.d.ts +1 -0
  393. package/eslint/rules/require_validator_any_required.mjs +1 -0
  394. package/eslint/rules/require_validator_any_required.mjs.map +1 -1
  395. package/eslint/rules/thought_payload_requires_replay_tag.cjs +1 -0
  396. package/eslint/rules/thought_payload_requires_replay_tag.cjs.map +1 -1
  397. package/eslint/rules/thought_payload_requires_replay_tag.d.ts +1 -0
  398. package/eslint/rules/thought_payload_requires_replay_tag.mjs +1 -0
  399. package/eslint/rules/thought_payload_requires_replay_tag.mjs.map +1 -1
  400. package/eslint/rules/token_encoding_requires_context_window.cjs +1 -0
  401. package/eslint/rules/token_encoding_requires_context_window.cjs.map +1 -1
  402. package/eslint/rules/token_encoding_requires_context_window.d.ts +1 -0
  403. package/eslint/rules/token_encoding_requires_context_window.mjs +1 -0
  404. package/eslint/rules/token_encoding_requires_context_window.mjs.map +1 -1
  405. package/eslint.cjs +1 -1
  406. package/eslint.mjs +1 -1
  407. package/{exceptions-BeWH2FwP.mjs → exceptions-BDhN0Xzr.mjs} +3 -2
  408. package/exceptions-BDhN0Xzr.mjs.map +1 -0
  409. package/{exceptions-CitH5wZI.js → exceptions-BRXrUKiW.js} +3 -2
  410. package/exceptions-BRXrUKiW.js.map +1 -0
  411. package/exceptions.cjs +2 -2
  412. package/exceptions.mjs +2 -2
  413. package/factories.cjs +1 -1
  414. package/factories.mjs +1 -1
  415. package/forge.cjs +4 -4
  416. package/forge.d.ts +1 -1
  417. package/forge.mjs +4 -4
  418. package/guards.cjs +9 -9
  419. package/guards.mjs +9 -9
  420. package/helpers-DSTFxTiC.js +497 -0
  421. package/helpers-DSTFxTiC.js.map +1 -0
  422. package/helpers-xhrQbMAG.mjs +306 -0
  423. package/helpers-xhrQbMAG.mjs.map +1 -0
  424. package/index.cjs +13 -13
  425. package/index.mjs +13 -13
  426. package/lib/classes/base_exception.d.ts +1 -0
  427. package/lib/classes/media.d.ts +10 -0
  428. package/lib/classes/retrievable.d.ts +1 -1
  429. package/lib/classes/spooled_json_artifact.d.ts +1 -1
  430. package/lib/classes/spooled_markdown_artifact.d.ts +1 -0
  431. package/lib/classes/tokenizable.d.ts +3 -0
  432. package/lib/classes/tool.d.ts +8 -0
  433. package/lib/classes/turn_gate.d.ts +6 -0
  434. package/lib/dispatch_runner.d.ts +4 -32
  435. package/lib/helpers/bignum.cjs +82 -0
  436. package/lib/helpers/bignum.cjs.map +1 -0
  437. package/lib/helpers/bignum.d.ts +52 -0
  438. package/lib/helpers/bignum.mjs +74 -0
  439. package/lib/helpers/bignum.mjs.map +1 -0
  440. package/lib/turn_runner.d.ts +1 -1
  441. package/lib/types/dispatch_runner.d.ts +83 -0
  442. package/lib/utils/exceptions.d.ts +1 -1
  443. package/lib/utils/retry.cjs.map +1 -1
  444. package/lib/utils/retry.d.ts +2 -0
  445. package/lib/utils/retry.mjs.map +1 -1
  446. package/mcp/adk-docs-corpus.json +1 -1
  447. package/package.json +264 -224
  448. package/{runtime-j92CNi5z.mjs → runtime-Bz5zA8wc.mjs} +2 -2
  449. package/{runtime-j92CNi5z.mjs.map → runtime-Bz5zA8wc.mjs.map} +1 -1
  450. package/{runtime-MFFcJrRv.js → runtime-DslE1aBw.js} +2 -2
  451. package/{runtime-MFFcJrRv.js.map → runtime-DslE1aBw.js.map} +1 -1
  452. package/searxng-Bkrwhwhw.js +269 -0
  453. package/searxng-Bkrwhwhw.js.map +1 -0
  454. package/searxng-CyA-nEu5.mjs +257 -0
  455. package/searxng-CyA-nEu5.mjs.map +1 -0
  456. package/skills/adk-assembly/SKILL.md +2 -2
  457. package/{spooled_artifact-CHoZgWwI.mjs → spooled_artifact-7eePq7JA.mjs} +5 -5
  458. package/{spooled_artifact-CHoZgWwI.mjs.map → spooled_artifact-7eePq7JA.mjs.map} +1 -1
  459. package/{spooled_artifact-BTq6Nzfy.js → spooled_artifact-DX8LLyUX.js} +5 -5
  460. package/{spooled_artifact-BTq6Nzfy.js.map → spooled_artifact-DX8LLyUX.js.map} +1 -1
  461. package/spooled_artifact.cjs +2 -2
  462. package/spooled_artifact.mjs +2 -2
  463. package/{spooled_markdown_artifact-CALSDxIx.js → spooled_markdown_artifact-ClX72lek.js} +4 -4
  464. package/spooled_markdown_artifact-ClX72lek.js.map +1 -0
  465. package/{spooled_markdown_artifact-Ci5UL7l4.mjs → spooled_markdown_artifact-wkrBF3oX.mjs} +4 -4
  466. package/spooled_markdown_artifact-wkrBF3oX.mjs.map +1 -0
  467. package/{thought-D34QQZZ9.mjs → thought-B_vxAiKU.mjs} +5 -5
  468. package/{thought-D34QQZZ9.mjs.map → thought-B_vxAiKU.mjs.map} +1 -1
  469. package/{thought-BbwhJ1wb.js → thought-DLwpF7MI.js} +5 -5
  470. package/{thought-BbwhJ1wb.js.map → thought-DLwpF7MI.js.map} +1 -1
  471. package/{tool-CVyZkFC7.js → tool-D5WGVIcI.js} +4 -4
  472. package/{tool-CVyZkFC7.js.map → tool-D5WGVIcI.js.map} +1 -1
  473. package/{tool-CMhaDRNd.mjs → tool-wMYMVl60.mjs} +4 -4
  474. package/{tool-CMhaDRNd.mjs.map → tool-wMYMVl60.mjs.map} +1 -1
  475. package/{tool_call-CV5qVNlb.mjs → tool_call-B4-_-vjG.mjs} +5 -5
  476. package/tool_call-B4-_-vjG.mjs.map +1 -0
  477. package/{tool_call-Db68hB7y.js → tool_call-DixVlW40.js} +5 -5
  478. package/tool_call-DixVlW40.js.map +1 -0
  479. package/{tool_registry-D1pSSlsd.mjs → tool_registry-791Vrjtf.mjs} +4 -3
  480. package/tool_registry-791Vrjtf.mjs.map +1 -0
  481. package/{tool_registry-DYUYqXvo.js → tool_registry-CKJPze3j.js} +4 -3
  482. package/tool_registry-CKJPze3j.js.map +1 -0
  483. package/{turn_runner-DqWHNP80.js → turn_runner-HXImLGIn.js} +7 -7
  484. package/turn_runner-HXImLGIn.js.map +1 -0
  485. package/{turn_runner-fg1Wc3dK.mjs → turn_runner-ZyYO-Kti.mjs} +7 -7
  486. package/turn_runner-ZyYO-Kti.mjs.map +1 -0
  487. package/turn_runner.cjs +1 -1
  488. package/turn_runner.mjs +1 -1
  489. package/types.d.ts +1 -1
  490. package/common-BT0nfCi9.mjs.map +0 -1
  491. package/common-Cj8TaQ9U.js.map +0 -1
  492. package/exceptions-BeWH2FwP.mjs.map +0 -1
  493. package/exceptions-CitH5wZI.js.map +0 -1
  494. package/spooled_markdown_artifact-CALSDxIx.js.map +0 -1
  495. package/spooled_markdown_artifact-Ci5UL7l4.mjs.map +0 -1
  496. package/tool_call-CV5qVNlb.mjs.map +0 -1
  497. package/tool_call-Db68hB7y.js.map +0 -1
  498. package/tool_registry-D1pSSlsd.mjs.map +0 -1
  499. package/tool_registry-DYUYqXvo.js.map +0 -1
  500. package/turn_runner-DqWHNP80.js.map +0 -1
  501. package/turn_runner-fg1Wc3dK.mjs.map +0 -1
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  require("../../chunk-Ble4zEEl.js");
3
- const require_tool_registry = require("../../tool_registry-DYUYqXvo.js");
3
+ const require_tool_registry = require("../../tool_registry-CKJPze3j.js");
4
4
  require("../../guards.cjs");
5
5
  let _nhtio_validation = require("@nhtio/validation");
6
6
  //#region src/batteries/vector/filters.ts
@@ -9,13 +9,23 @@ let _nhtio_validation = require("@nhtio/validation");
9
9
  *
10
10
  * @module @nhtio/adk/batteries/vector/filters
11
11
  */
12
+ /**
13
+ * Construct a {@link RawExpr} from literal text and optional positional `bindings`.
14
+ *
15
+ * @param sql - The raw expression text.
16
+ * @param bindings - Positional binding values.
17
+ */
12
18
  var raw = (sql, bindings = []) => ({
13
19
  __raw: sql,
14
20
  bindings
15
21
  });
22
+ /** Type guard: `true` if `v` is a {@link RawExpr}. */
16
23
  var isRawExpr = (v) => require_tool_registry.isObject(v) && typeof v.__raw === "string" && Array.isArray(v.bindings);
24
+ /** Type guard: `true` if `f` is a {@link FilterCondition}. */
17
25
  var isFilterCondition = (f) => typeof f.field === "string" && typeof f.op === "string";
26
+ /** Type guard: `true` if `f` is a {@link RawFilter}. */
18
27
  var isRawFilter = (f) => typeof f.$dialect === "string";
28
+ /** Type guard: `true` if `f` is a {@link FilterGroup} (neither a condition nor a raw filter). */
19
29
  var isFilterGroup = (f) => !isFilterCondition(f) && !isRawFilter(f);
20
30
  var rawFilterSchema = _nhtio_validation.validator.object({
21
31
  $dialect: _nhtio_validation.validator.string().required(),
@@ -27,6 +37,7 @@ var filterConditionSchema = _nhtio_validation.validator.object({
27
37
  op: _nhtio_validation.validator.string().valid("eq", "ne", "gt", "gte", "lt", "lte", "in", "nin", "exists", "contains").required(),
28
38
  value: _nhtio_validation.validator.alternatives(_nhtio_validation.validator.any(), _nhtio_validation.validator.array().items(_nhtio_validation.validator.any())).optional()
29
39
  });
40
+ /** Recursive validator schema for any {@link VectorFilter} (condition, raw, or nested group). */
30
41
  var vectorFilterSchema = _nhtio_validation.validator.alternatives(filterConditionSchema, rawFilterSchema, _nhtio_validation.validator.object({
31
42
  and: _nhtio_validation.validator.array().items(_nhtio_validation.validator.link("#vectorFilter")).optional(),
32
43
  or: _nhtio_validation.validator.array().items(_nhtio_validation.validator.link("#vectorFilter")).optional(),
@@ -42,6 +53,16 @@ var getField = (metadata, path) => {
42
53
  }
43
54
  return current;
44
55
  };
56
+ /**
57
+ * Evaluate a {@link VectorFilter} against a record's metadata in memory — the reference semantics
58
+ * adapters must match for client-side filtering and conformance.
59
+ *
60
+ * @param filter - The filter to evaluate.
61
+ * @param metadata - The record metadata to test.
62
+ * @returns `true` if the metadata satisfies the filter.
63
+ * @throws when the filter (or a nested value) is a raw expression, which the in-memory evaluator
64
+ * cannot interpret.
65
+ */
45
66
  var evaluateFilter = (filter, metadata) => {
46
67
  if (isRawFilter(filter)) throw new Error("raw filters are not evaluable by the in-memory filter evaluator");
47
68
  if (isFilterCondition(filter)) {
@@ -1 +1 @@
1
- {"version":3,"file":"filters.cjs","names":[],"sources":["../../../src/batteries/vector/filters.ts"],"sourcesContent":["/**\n * Filter types and evaluator for the vector battery.\n *\n * @module @nhtio/adk/batteries/vector/filters\n */\n\nimport { isObject } from '@nhtio/adk/guards'\nimport { validator } from '@nhtio/validation'\nimport type { VectorMetadata, VectorMetadataValue } from './types'\n\nexport type FilterOperator =\n | 'eq'\n | 'ne'\n | 'gt'\n | 'gte'\n | 'lt'\n | 'lte'\n | 'in'\n | 'nin'\n | 'exists'\n | 'contains'\n\nexport interface RawExpr {\n __raw: string\n bindings: unknown[]\n}\n\nexport const raw = (sql: string, bindings: unknown[] = []): RawExpr => ({ __raw: sql, bindings })\n\nexport const isRawExpr = (v: unknown): v is RawExpr =>\n isObject(v) && typeof v.__raw === 'string' && Array.isArray(v.bindings)\n\nexport interface FilterCondition {\n field: string\n op: FilterOperator\n value?: VectorMetadataValue | VectorMetadataValue[] | RawExpr\n}\nexport interface FilterGroup {\n and?: VectorFilter[]\n or?: VectorFilter[]\n not?: VectorFilter\n}\nexport interface RawFilter {\n $dialect: string\n $raw: string | unknown\n $bindings?: unknown[]\n}\nexport type VectorFilter = FilterCondition | FilterGroup | RawFilter\n\nexport const isFilterCondition = (f: VectorFilter): f is FilterCondition =>\n typeof (f as FilterCondition).field === 'string' && typeof (f as FilterCondition).op === 'string'\n\nexport const isRawFilter = (f: VectorFilter): f is RawFilter =>\n typeof (f as RawFilter).$dialect === 'string'\n\nexport const isFilterGroup = (f: VectorFilter): f is FilterGroup =>\n !isFilterCondition(f) && !isRawFilter(f)\n\nconst rawFilterSchema = validator.object<RawFilter>({\n $dialect: validator.string().required(),\n // eslint-disable-next-line adk/require-validator-any-required -- value type-arg: $raw is any structured dialect payload; disposition is set by the .required() on the alternatives\n $raw: validator.alternatives(validator.string(), validator.any()).required(),\n // eslint-disable-next-line adk/require-validator-any-required -- item type-arg: bindings hold arbitrary values; disposition is set by .optional() on the array\n $bindings: validator.array().items(validator.any()).optional(),\n})\n\nconst filterConditionSchema = validator.object<FilterCondition>({\n field: validator.string().required(),\n op: validator\n .string()\n .valid('eq', 'ne', 'gt', 'gte', 'lt', 'lte', 'in', 'nin', 'exists', 'contains')\n .required(),\n value: validator\n // eslint-disable-next-line adk/require-validator-any-required -- value type-arg: a filter value is any scalar or array of any; disposition is set by .optional() below\n .alternatives(validator.any(), validator.array().items(validator.any()))\n .optional(),\n})\n\nexport const vectorFilterSchema = validator\n .alternatives(\n filterConditionSchema,\n rawFilterSchema,\n validator\n .object<FilterGroup>({\n and: validator.array().items(validator.link('#vectorFilter')).optional(),\n or: validator.array().items(validator.link('#vectorFilter')).optional(),\n not: validator.link('#vectorFilter').optional(),\n })\n .unknown(false)\n )\n .id('vectorFilter')\n\nconst getField = (metadata: VectorMetadata, path: string): VectorMetadataValue | undefined => {\n const keys = path.split('.')\n let current: VectorMetadataValue | undefined = metadata\n for (const key of keys) {\n if (current === undefined || current === null) {\n return undefined\n }\n if (typeof current !== 'object') {\n return undefined\n }\n current = (current as Record<string, VectorMetadataValue>)[key]\n }\n return current\n}\n\nexport const evaluateFilter = (filter: VectorFilter, metadata: VectorMetadata): boolean => {\n if (isRawFilter(filter)) {\n throw new Error('raw filters are not evaluable by the in-memory filter evaluator')\n }\n\n if (isFilterCondition(filter)) {\n const { field, op, value } = filter\n const fieldVal = getField(metadata, field)\n\n if (isRawExpr(value)) {\n throw new Error('raw expressions are not evaluable by the in-memory filter evaluator')\n }\n\n switch (op) {\n case 'eq': {\n return fieldVal === value\n }\n\n case 'ne': {\n return fieldVal !== value\n }\n\n case 'gt': {\n if (fieldVal === undefined || value === undefined) {\n return false\n }\n if (typeof fieldVal === 'number' && typeof value === 'number') {\n return fieldVal > value\n }\n if (typeof fieldVal === 'string' && typeof value === 'string') {\n return fieldVal > value\n }\n return false\n }\n\n case 'gte': {\n if (fieldVal === undefined || value === undefined) {\n return false\n }\n if (typeof fieldVal === 'number' && typeof value === 'number') {\n return fieldVal >= value\n }\n if (typeof fieldVal === 'string' && typeof value === 'string') {\n return fieldVal >= value\n }\n return false\n }\n\n case 'lt': {\n if (fieldVal === undefined || value === undefined) {\n return false\n }\n if (typeof fieldVal === 'number' && typeof value === 'number') {\n return fieldVal < value\n }\n if (typeof fieldVal === 'string' && typeof value === 'string') {\n return fieldVal < value\n }\n return false\n }\n\n case 'lte': {\n if (fieldVal === undefined || value === undefined) {\n return false\n }\n if (typeof fieldVal === 'number' && typeof value === 'number') {\n return fieldVal <= value\n }\n if (typeof fieldVal === 'string' && typeof value === 'string') {\n return fieldVal <= value\n }\n return false\n }\n\n case 'in': {\n if (!Array.isArray(value)) {\n return false\n }\n return value.includes(fieldVal as never)\n }\n\n case 'nin': {\n if (!Array.isArray(value)) {\n return true\n }\n return !value.includes(fieldVal as never)\n }\n\n case 'exists': {\n const checkExists = value === undefined || value === true\n return checkExists ? fieldVal !== undefined : fieldVal === undefined\n }\n\n case 'contains': {\n if (fieldVal === undefined) {\n return false\n }\n if (Array.isArray(fieldVal)) {\n return fieldVal.includes(value as never)\n }\n if (typeof fieldVal === 'string') {\n return fieldVal.includes(String(value))\n }\n return false\n }\n\n default: {\n return false\n }\n }\n }\n\n if (isFilterGroup(filter)) {\n const { and, or, not } = filter\n\n if (and !== undefined) {\n return and.every((child) => evaluateFilter(child, metadata))\n }\n\n if (or !== undefined) {\n return or.some((child) => evaluateFilter(child, metadata))\n }\n\n if (not !== undefined) {\n return !evaluateFilter(not, metadata)\n }\n\n return true\n }\n\n return false\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"filters.cjs","names":[],"sources":["../../../src/batteries/vector/filters.ts"],"sourcesContent":["/**\n * Filter types and evaluator for the vector battery.\n *\n * @module @nhtio/adk/batteries/vector/filters\n */\n\nimport { isObject } from '@nhtio/adk/guards'\nimport { validator } from '@nhtio/validation'\nimport type { VectorMetadata, VectorMetadataValue } from './types'\n\n/** A comparison operator usable in a {@link FilterCondition}. */\nexport type FilterOperator =\n | 'eq'\n | 'ne'\n | 'gt'\n | 'gte'\n | 'lt'\n | 'lte'\n | 'in'\n | 'nin'\n | 'exists'\n | 'contains'\n\n/** A raw, adapter-dialect filter expression: literal text plus positional bindings. */\nexport interface RawExpr {\n /** The raw expression text. */\n __raw: string\n /** Positional binding values substituted into the expression. */\n bindings: unknown[]\n}\n\n/**\n * Construct a {@link RawExpr} from literal text and optional positional `bindings`.\n *\n * @param sql - The raw expression text.\n * @param bindings - Positional binding values.\n */\nexport const raw = (sql: string, bindings: unknown[] = []): RawExpr => ({ __raw: sql, bindings })\n\n/** Type guard: `true` if `v` is a {@link RawExpr}. */\nexport const isRawExpr = (v: unknown): v is RawExpr =>\n isObject(v) && typeof v.__raw === 'string' && Array.isArray(v.bindings)\n\n/** A single field comparison: `field op value`. */\nexport interface FilterCondition {\n /** The metadata field path (dot-separated for nested fields). */\n field: string\n /** The comparison operator. */\n op: FilterOperator\n /** The value(s) compared against, or a {@link RawExpr}; omitted for `exists`. */\n value?: VectorMetadataValue | VectorMetadataValue[] | RawExpr\n}\n/** A boolean combination of nested filters. Exactly one of `and`/`or`/`not` is meaningful. */\nexport interface FilterGroup {\n /** All nested filters must match. */\n and?: VectorFilter[]\n /** At least one nested filter must match. */\n or?: VectorFilter[]\n /** The nested filter must not match. */\n not?: VectorFilter\n}\n/** An adapter-dialect raw filter forwarded to the backend verbatim. */\nexport interface RawFilter {\n /** The dialect the raw expression is written in (e.g. `'sql'`). */\n $dialect: string\n /** The raw expression — a string, or a structured dialect-specific payload. */\n $raw: string | unknown\n /** Positional binding values for the raw expression. */\n $bindings?: unknown[]\n}\n/** Any filter node: a {@link FilterCondition}, a {@link FilterGroup}, or a {@link RawFilter}. */\nexport type VectorFilter = FilterCondition | FilterGroup | RawFilter\n\n/** Type guard: `true` if `f` is a {@link FilterCondition}. */\nexport const isFilterCondition = (f: VectorFilter): f is FilterCondition =>\n typeof (f as FilterCondition).field === 'string' && typeof (f as FilterCondition).op === 'string'\n\n/** Type guard: `true` if `f` is a {@link RawFilter}. */\nexport const isRawFilter = (f: VectorFilter): f is RawFilter =>\n typeof (f as RawFilter).$dialect === 'string'\n\n/** Type guard: `true` if `f` is a {@link FilterGroup} (neither a condition nor a raw filter). */\nexport const isFilterGroup = (f: VectorFilter): f is FilterGroup =>\n !isFilterCondition(f) && !isRawFilter(f)\n\nconst rawFilterSchema = validator.object<RawFilter>({\n $dialect: validator.string().required(),\n // eslint-disable-next-line adk/require-validator-any-required -- value type-arg: $raw is any structured dialect payload; disposition is set by the .required() on the alternatives\n $raw: validator.alternatives(validator.string(), validator.any()).required(),\n // eslint-disable-next-line adk/require-validator-any-required -- item type-arg: bindings hold arbitrary values; disposition is set by .optional() on the array\n $bindings: validator.array().items(validator.any()).optional(),\n})\n\nconst filterConditionSchema = validator.object<FilterCondition>({\n field: validator.string().required(),\n op: validator\n .string()\n .valid('eq', 'ne', 'gt', 'gte', 'lt', 'lte', 'in', 'nin', 'exists', 'contains')\n .required(),\n value: validator\n // eslint-disable-next-line adk/require-validator-any-required -- value type-arg: a filter value is any scalar or array of any; disposition is set by .optional() below\n .alternatives(validator.any(), validator.array().items(validator.any()))\n .optional(),\n})\n\n/** Recursive validator schema for any {@link VectorFilter} (condition, raw, or nested group). */\nexport const vectorFilterSchema = validator\n .alternatives(\n filterConditionSchema,\n rawFilterSchema,\n validator\n .object<FilterGroup>({\n and: validator.array().items(validator.link('#vectorFilter')).optional(),\n or: validator.array().items(validator.link('#vectorFilter')).optional(),\n not: validator.link('#vectorFilter').optional(),\n })\n .unknown(false)\n )\n .id('vectorFilter')\n\nconst getField = (metadata: VectorMetadata, path: string): VectorMetadataValue | undefined => {\n const keys = path.split('.')\n let current: VectorMetadataValue | undefined = metadata\n for (const key of keys) {\n if (current === undefined || current === null) {\n return undefined\n }\n if (typeof current !== 'object') {\n return undefined\n }\n current = (current as Record<string, VectorMetadataValue>)[key]\n }\n return current\n}\n\n/**\n * Evaluate a {@link VectorFilter} against a record's metadata in memory — the reference semantics\n * adapters must match for client-side filtering and conformance.\n *\n * @param filter - The filter to evaluate.\n * @param metadata - The record metadata to test.\n * @returns `true` if the metadata satisfies the filter.\n * @throws when the filter (or a nested value) is a raw expression, which the in-memory evaluator\n * cannot interpret.\n */\nexport const evaluateFilter = (filter: VectorFilter, metadata: VectorMetadata): boolean => {\n if (isRawFilter(filter)) {\n throw new Error('raw filters are not evaluable by the in-memory filter evaluator')\n }\n\n if (isFilterCondition(filter)) {\n const { field, op, value } = filter\n const fieldVal = getField(metadata, field)\n\n if (isRawExpr(value)) {\n throw new Error('raw expressions are not evaluable by the in-memory filter evaluator')\n }\n\n switch (op) {\n case 'eq': {\n return fieldVal === value\n }\n\n case 'ne': {\n return fieldVal !== value\n }\n\n case 'gt': {\n if (fieldVal === undefined || value === undefined) {\n return false\n }\n if (typeof fieldVal === 'number' && typeof value === 'number') {\n return fieldVal > value\n }\n if (typeof fieldVal === 'string' && typeof value === 'string') {\n return fieldVal > value\n }\n return false\n }\n\n case 'gte': {\n if (fieldVal === undefined || value === undefined) {\n return false\n }\n if (typeof fieldVal === 'number' && typeof value === 'number') {\n return fieldVal >= value\n }\n if (typeof fieldVal === 'string' && typeof value === 'string') {\n return fieldVal >= value\n }\n return false\n }\n\n case 'lt': {\n if (fieldVal === undefined || value === undefined) {\n return false\n }\n if (typeof fieldVal === 'number' && typeof value === 'number') {\n return fieldVal < value\n }\n if (typeof fieldVal === 'string' && typeof value === 'string') {\n return fieldVal < value\n }\n return false\n }\n\n case 'lte': {\n if (fieldVal === undefined || value === undefined) {\n return false\n }\n if (typeof fieldVal === 'number' && typeof value === 'number') {\n return fieldVal <= value\n }\n if (typeof fieldVal === 'string' && typeof value === 'string') {\n return fieldVal <= value\n }\n return false\n }\n\n case 'in': {\n if (!Array.isArray(value)) {\n return false\n }\n return value.includes(fieldVal as never)\n }\n\n case 'nin': {\n if (!Array.isArray(value)) {\n return true\n }\n return !value.includes(fieldVal as never)\n }\n\n case 'exists': {\n const checkExists = value === undefined || value === true\n return checkExists ? fieldVal !== undefined : fieldVal === undefined\n }\n\n case 'contains': {\n if (fieldVal === undefined) {\n return false\n }\n if (Array.isArray(fieldVal)) {\n return fieldVal.includes(value as never)\n }\n if (typeof fieldVal === 'string') {\n return fieldVal.includes(String(value))\n }\n return false\n }\n\n default: {\n return false\n }\n }\n }\n\n if (isFilterGroup(filter)) {\n const { and, or, not } = filter\n\n if (and !== undefined) {\n return and.every((child) => evaluateFilter(child, metadata))\n }\n\n if (or !== undefined) {\n return or.some((child) => evaluateFilter(child, metadata))\n }\n\n if (not !== undefined) {\n return !evaluateFilter(not, metadata)\n }\n\n return true\n }\n\n return false\n}\n"],"mappings":"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"}
@@ -4,31 +4,69 @@
4
4
  * @module @nhtio/adk/batteries/vector/filters
5
5
  */
6
6
  import type { VectorMetadata, VectorMetadataValue } from "./types";
7
+ /** A comparison operator usable in a {@link FilterCondition}. */
7
8
  export type FilterOperator = 'eq' | 'ne' | 'gt' | 'gte' | 'lt' | 'lte' | 'in' | 'nin' | 'exists' | 'contains';
9
+ /** A raw, adapter-dialect filter expression: literal text plus positional bindings. */
8
10
  export interface RawExpr {
11
+ /** The raw expression text. */
9
12
  __raw: string;
13
+ /** Positional binding values substituted into the expression. */
10
14
  bindings: unknown[];
11
15
  }
16
+ /**
17
+ * Construct a {@link RawExpr} from literal text and optional positional `bindings`.
18
+ *
19
+ * @param sql - The raw expression text.
20
+ * @param bindings - Positional binding values.
21
+ */
12
22
  export declare const raw: (sql: string, bindings?: unknown[]) => RawExpr;
23
+ /** Type guard: `true` if `v` is a {@link RawExpr}. */
13
24
  export declare const isRawExpr: (v: unknown) => v is RawExpr;
25
+ /** A single field comparison: `field op value`. */
14
26
  export interface FilterCondition {
27
+ /** The metadata field path (dot-separated for nested fields). */
15
28
  field: string;
29
+ /** The comparison operator. */
16
30
  op: FilterOperator;
31
+ /** The value(s) compared against, or a {@link RawExpr}; omitted for `exists`. */
17
32
  value?: VectorMetadataValue | VectorMetadataValue[] | RawExpr;
18
33
  }
34
+ /** A boolean combination of nested filters. Exactly one of `and`/`or`/`not` is meaningful. */
19
35
  export interface FilterGroup {
36
+ /** All nested filters must match. */
20
37
  and?: VectorFilter[];
38
+ /** At least one nested filter must match. */
21
39
  or?: VectorFilter[];
40
+ /** The nested filter must not match. */
22
41
  not?: VectorFilter;
23
42
  }
43
+ /** An adapter-dialect raw filter forwarded to the backend verbatim. */
24
44
  export interface RawFilter {
45
+ /** The dialect the raw expression is written in (e.g. `'sql'`). */
25
46
  $dialect: string;
47
+ /** The raw expression — a string, or a structured dialect-specific payload. */
26
48
  $raw: string | unknown;
49
+ /** Positional binding values for the raw expression. */
27
50
  $bindings?: unknown[];
28
51
  }
52
+ /** Any filter node: a {@link FilterCondition}, a {@link FilterGroup}, or a {@link RawFilter}. */
29
53
  export type VectorFilter = FilterCondition | FilterGroup | RawFilter;
54
+ /** Type guard: `true` if `f` is a {@link FilterCondition}. */
30
55
  export declare const isFilterCondition: (f: VectorFilter) => f is FilterCondition;
56
+ /** Type guard: `true` if `f` is a {@link RawFilter}. */
31
57
  export declare const isRawFilter: (f: VectorFilter) => f is RawFilter;
58
+ /** Type guard: `true` if `f` is a {@link FilterGroup} (neither a condition nor a raw filter). */
32
59
  export declare const isFilterGroup: (f: VectorFilter) => f is FilterGroup;
60
+ /** Recursive validator schema for any {@link VectorFilter} (condition, raw, or nested group). */
33
61
  export declare const vectorFilterSchema: import("@nhtio/validation").AlternativesSchema<any>;
62
+ /**
63
+ * Evaluate a {@link VectorFilter} against a record's metadata in memory — the reference semantics
64
+ * adapters must match for client-side filtering and conformance.
65
+ *
66
+ * @param filter - The filter to evaluate.
67
+ * @param metadata - The record metadata to test.
68
+ * @returns `true` if the metadata satisfies the filter.
69
+ * @throws when the filter (or a nested value) is a raw expression, which the in-memory evaluator
70
+ * cannot interpret.
71
+ */
34
72
  export declare const evaluateFilter: (filter: VectorFilter, metadata: VectorMetadata) => boolean;
@@ -1,4 +1,4 @@
1
- import { c as isObject } from "../../tool_registry-D1pSSlsd.mjs";
1
+ import { c as isObject } from "../../tool_registry-791Vrjtf.mjs";
2
2
  import "../../guards.mjs";
3
3
  import { validator } from "@nhtio/validation";
4
4
  //#region src/batteries/vector/filters.ts
@@ -7,13 +7,23 @@ import { validator } from "@nhtio/validation";
7
7
  *
8
8
  * @module @nhtio/adk/batteries/vector/filters
9
9
  */
10
+ /**
11
+ * Construct a {@link RawExpr} from literal text and optional positional `bindings`.
12
+ *
13
+ * @param sql - The raw expression text.
14
+ * @param bindings - Positional binding values.
15
+ */
10
16
  var raw = (sql, bindings = []) => ({
11
17
  __raw: sql,
12
18
  bindings
13
19
  });
20
+ /** Type guard: `true` if `v` is a {@link RawExpr}. */
14
21
  var isRawExpr = (v) => isObject(v) && typeof v.__raw === "string" && Array.isArray(v.bindings);
22
+ /** Type guard: `true` if `f` is a {@link FilterCondition}. */
15
23
  var isFilterCondition = (f) => typeof f.field === "string" && typeof f.op === "string";
24
+ /** Type guard: `true` if `f` is a {@link RawFilter}. */
16
25
  var isRawFilter = (f) => typeof f.$dialect === "string";
26
+ /** Type guard: `true` if `f` is a {@link FilterGroup} (neither a condition nor a raw filter). */
17
27
  var isFilterGroup = (f) => !isFilterCondition(f) && !isRawFilter(f);
18
28
  var rawFilterSchema = validator.object({
19
29
  $dialect: validator.string().required(),
@@ -25,6 +35,7 @@ var filterConditionSchema = validator.object({
25
35
  op: validator.string().valid("eq", "ne", "gt", "gte", "lt", "lte", "in", "nin", "exists", "contains").required(),
26
36
  value: validator.alternatives(validator.any(), validator.array().items(validator.any())).optional()
27
37
  });
38
+ /** Recursive validator schema for any {@link VectorFilter} (condition, raw, or nested group). */
28
39
  var vectorFilterSchema = validator.alternatives(filterConditionSchema, rawFilterSchema, validator.object({
29
40
  and: validator.array().items(validator.link("#vectorFilter")).optional(),
30
41
  or: validator.array().items(validator.link("#vectorFilter")).optional(),
@@ -40,6 +51,16 @@ var getField = (metadata, path) => {
40
51
  }
41
52
  return current;
42
53
  };
54
+ /**
55
+ * Evaluate a {@link VectorFilter} against a record's metadata in memory — the reference semantics
56
+ * adapters must match for client-side filtering and conformance.
57
+ *
58
+ * @param filter - The filter to evaluate.
59
+ * @param metadata - The record metadata to test.
60
+ * @returns `true` if the metadata satisfies the filter.
61
+ * @throws when the filter (or a nested value) is a raw expression, which the in-memory evaluator
62
+ * cannot interpret.
63
+ */
43
64
  var evaluateFilter = (filter, metadata) => {
44
65
  if (isRawFilter(filter)) throw new Error("raw filters are not evaluable by the in-memory filter evaluator");
45
66
  if (isFilterCondition(filter)) {
@@ -1 +1 @@
1
- {"version":3,"file":"filters.mjs","names":[],"sources":["../../../src/batteries/vector/filters.ts"],"sourcesContent":["/**\n * Filter types and evaluator for the vector battery.\n *\n * @module @nhtio/adk/batteries/vector/filters\n */\n\nimport { isObject } from '@nhtio/adk/guards'\nimport { validator } from '@nhtio/validation'\nimport type { VectorMetadata, VectorMetadataValue } from './types'\n\nexport type FilterOperator =\n | 'eq'\n | 'ne'\n | 'gt'\n | 'gte'\n | 'lt'\n | 'lte'\n | 'in'\n | 'nin'\n | 'exists'\n | 'contains'\n\nexport interface RawExpr {\n __raw: string\n bindings: unknown[]\n}\n\nexport const raw = (sql: string, bindings: unknown[] = []): RawExpr => ({ __raw: sql, bindings })\n\nexport const isRawExpr = (v: unknown): v is RawExpr =>\n isObject(v) && typeof v.__raw === 'string' && Array.isArray(v.bindings)\n\nexport interface FilterCondition {\n field: string\n op: FilterOperator\n value?: VectorMetadataValue | VectorMetadataValue[] | RawExpr\n}\nexport interface FilterGroup {\n and?: VectorFilter[]\n or?: VectorFilter[]\n not?: VectorFilter\n}\nexport interface RawFilter {\n $dialect: string\n $raw: string | unknown\n $bindings?: unknown[]\n}\nexport type VectorFilter = FilterCondition | FilterGroup | RawFilter\n\nexport const isFilterCondition = (f: VectorFilter): f is FilterCondition =>\n typeof (f as FilterCondition).field === 'string' && typeof (f as FilterCondition).op === 'string'\n\nexport const isRawFilter = (f: VectorFilter): f is RawFilter =>\n typeof (f as RawFilter).$dialect === 'string'\n\nexport const isFilterGroup = (f: VectorFilter): f is FilterGroup =>\n !isFilterCondition(f) && !isRawFilter(f)\n\nconst rawFilterSchema = validator.object<RawFilter>({\n $dialect: validator.string().required(),\n // eslint-disable-next-line adk/require-validator-any-required -- value type-arg: $raw is any structured dialect payload; disposition is set by the .required() on the alternatives\n $raw: validator.alternatives(validator.string(), validator.any()).required(),\n // eslint-disable-next-line adk/require-validator-any-required -- item type-arg: bindings hold arbitrary values; disposition is set by .optional() on the array\n $bindings: validator.array().items(validator.any()).optional(),\n})\n\nconst filterConditionSchema = validator.object<FilterCondition>({\n field: validator.string().required(),\n op: validator\n .string()\n .valid('eq', 'ne', 'gt', 'gte', 'lt', 'lte', 'in', 'nin', 'exists', 'contains')\n .required(),\n value: validator\n // eslint-disable-next-line adk/require-validator-any-required -- value type-arg: a filter value is any scalar or array of any; disposition is set by .optional() below\n .alternatives(validator.any(), validator.array().items(validator.any()))\n .optional(),\n})\n\nexport const vectorFilterSchema = validator\n .alternatives(\n filterConditionSchema,\n rawFilterSchema,\n validator\n .object<FilterGroup>({\n and: validator.array().items(validator.link('#vectorFilter')).optional(),\n or: validator.array().items(validator.link('#vectorFilter')).optional(),\n not: validator.link('#vectorFilter').optional(),\n })\n .unknown(false)\n )\n .id('vectorFilter')\n\nconst getField = (metadata: VectorMetadata, path: string): VectorMetadataValue | undefined => {\n const keys = path.split('.')\n let current: VectorMetadataValue | undefined = metadata\n for (const key of keys) {\n if (current === undefined || current === null) {\n return undefined\n }\n if (typeof current !== 'object') {\n return undefined\n }\n current = (current as Record<string, VectorMetadataValue>)[key]\n }\n return current\n}\n\nexport const evaluateFilter = (filter: VectorFilter, metadata: VectorMetadata): boolean => {\n if (isRawFilter(filter)) {\n throw new Error('raw filters are not evaluable by the in-memory filter evaluator')\n }\n\n if (isFilterCondition(filter)) {\n const { field, op, value } = filter\n const fieldVal = getField(metadata, field)\n\n if (isRawExpr(value)) {\n throw new Error('raw expressions are not evaluable by the in-memory filter evaluator')\n }\n\n switch (op) {\n case 'eq': {\n return fieldVal === value\n }\n\n case 'ne': {\n return fieldVal !== value\n }\n\n case 'gt': {\n if (fieldVal === undefined || value === undefined) {\n return false\n }\n if (typeof fieldVal === 'number' && typeof value === 'number') {\n return fieldVal > value\n }\n if (typeof fieldVal === 'string' && typeof value === 'string') {\n return fieldVal > value\n }\n return false\n }\n\n case 'gte': {\n if (fieldVal === undefined || value === undefined) {\n return false\n }\n if (typeof fieldVal === 'number' && typeof value === 'number') {\n return fieldVal >= value\n }\n if (typeof fieldVal === 'string' && typeof value === 'string') {\n return fieldVal >= value\n }\n return false\n }\n\n case 'lt': {\n if (fieldVal === undefined || value === undefined) {\n return false\n }\n if (typeof fieldVal === 'number' && typeof value === 'number') {\n return fieldVal < value\n }\n if (typeof fieldVal === 'string' && typeof value === 'string') {\n return fieldVal < value\n }\n return false\n }\n\n case 'lte': {\n if (fieldVal === undefined || value === undefined) {\n return false\n }\n if (typeof fieldVal === 'number' && typeof value === 'number') {\n return fieldVal <= value\n }\n if (typeof fieldVal === 'string' && typeof value === 'string') {\n return fieldVal <= value\n }\n return false\n }\n\n case 'in': {\n if (!Array.isArray(value)) {\n return false\n }\n return value.includes(fieldVal as never)\n }\n\n case 'nin': {\n if (!Array.isArray(value)) {\n return true\n }\n return !value.includes(fieldVal as never)\n }\n\n case 'exists': {\n const checkExists = value === undefined || value === true\n return checkExists ? fieldVal !== undefined : fieldVal === undefined\n }\n\n case 'contains': {\n if (fieldVal === undefined) {\n return false\n }\n if (Array.isArray(fieldVal)) {\n return fieldVal.includes(value as never)\n }\n if (typeof fieldVal === 'string') {\n return fieldVal.includes(String(value))\n }\n return false\n }\n\n default: {\n return false\n }\n }\n }\n\n if (isFilterGroup(filter)) {\n const { and, or, not } = filter\n\n if (and !== undefined) {\n return and.every((child) => evaluateFilter(child, metadata))\n }\n\n if (or !== undefined) {\n return or.some((child) => evaluateFilter(child, metadata))\n }\n\n if (not !== undefined) {\n return !evaluateFilter(not, metadata)\n }\n\n return true\n }\n\n return false\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"filters.mjs","names":[],"sources":["../../../src/batteries/vector/filters.ts"],"sourcesContent":["/**\n * Filter types and evaluator for the vector battery.\n *\n * @module @nhtio/adk/batteries/vector/filters\n */\n\nimport { isObject } from '@nhtio/adk/guards'\nimport { validator } from '@nhtio/validation'\nimport type { VectorMetadata, VectorMetadataValue } from './types'\n\n/** A comparison operator usable in a {@link FilterCondition}. */\nexport type FilterOperator =\n | 'eq'\n | 'ne'\n | 'gt'\n | 'gte'\n | 'lt'\n | 'lte'\n | 'in'\n | 'nin'\n | 'exists'\n | 'contains'\n\n/** A raw, adapter-dialect filter expression: literal text plus positional bindings. */\nexport interface RawExpr {\n /** The raw expression text. */\n __raw: string\n /** Positional binding values substituted into the expression. */\n bindings: unknown[]\n}\n\n/**\n * Construct a {@link RawExpr} from literal text and optional positional `bindings`.\n *\n * @param sql - The raw expression text.\n * @param bindings - Positional binding values.\n */\nexport const raw = (sql: string, bindings: unknown[] = []): RawExpr => ({ __raw: sql, bindings })\n\n/** Type guard: `true` if `v` is a {@link RawExpr}. */\nexport const isRawExpr = (v: unknown): v is RawExpr =>\n isObject(v) && typeof v.__raw === 'string' && Array.isArray(v.bindings)\n\n/** A single field comparison: `field op value`. */\nexport interface FilterCondition {\n /** The metadata field path (dot-separated for nested fields). */\n field: string\n /** The comparison operator. */\n op: FilterOperator\n /** The value(s) compared against, or a {@link RawExpr}; omitted for `exists`. */\n value?: VectorMetadataValue | VectorMetadataValue[] | RawExpr\n}\n/** A boolean combination of nested filters. Exactly one of `and`/`or`/`not` is meaningful. */\nexport interface FilterGroup {\n /** All nested filters must match. */\n and?: VectorFilter[]\n /** At least one nested filter must match. */\n or?: VectorFilter[]\n /** The nested filter must not match. */\n not?: VectorFilter\n}\n/** An adapter-dialect raw filter forwarded to the backend verbatim. */\nexport interface RawFilter {\n /** The dialect the raw expression is written in (e.g. `'sql'`). */\n $dialect: string\n /** The raw expression — a string, or a structured dialect-specific payload. */\n $raw: string | unknown\n /** Positional binding values for the raw expression. */\n $bindings?: unknown[]\n}\n/** Any filter node: a {@link FilterCondition}, a {@link FilterGroup}, or a {@link RawFilter}. */\nexport type VectorFilter = FilterCondition | FilterGroup | RawFilter\n\n/** Type guard: `true` if `f` is a {@link FilterCondition}. */\nexport const isFilterCondition = (f: VectorFilter): f is FilterCondition =>\n typeof (f as FilterCondition).field === 'string' && typeof (f as FilterCondition).op === 'string'\n\n/** Type guard: `true` if `f` is a {@link RawFilter}. */\nexport const isRawFilter = (f: VectorFilter): f is RawFilter =>\n typeof (f as RawFilter).$dialect === 'string'\n\n/** Type guard: `true` if `f` is a {@link FilterGroup} (neither a condition nor a raw filter). */\nexport const isFilterGroup = (f: VectorFilter): f is FilterGroup =>\n !isFilterCondition(f) && !isRawFilter(f)\n\nconst rawFilterSchema = validator.object<RawFilter>({\n $dialect: validator.string().required(),\n // eslint-disable-next-line adk/require-validator-any-required -- value type-arg: $raw is any structured dialect payload; disposition is set by the .required() on the alternatives\n $raw: validator.alternatives(validator.string(), validator.any()).required(),\n // eslint-disable-next-line adk/require-validator-any-required -- item type-arg: bindings hold arbitrary values; disposition is set by .optional() on the array\n $bindings: validator.array().items(validator.any()).optional(),\n})\n\nconst filterConditionSchema = validator.object<FilterCondition>({\n field: validator.string().required(),\n op: validator\n .string()\n .valid('eq', 'ne', 'gt', 'gte', 'lt', 'lte', 'in', 'nin', 'exists', 'contains')\n .required(),\n value: validator\n // eslint-disable-next-line adk/require-validator-any-required -- value type-arg: a filter value is any scalar or array of any; disposition is set by .optional() below\n .alternatives(validator.any(), validator.array().items(validator.any()))\n .optional(),\n})\n\n/** Recursive validator schema for any {@link VectorFilter} (condition, raw, or nested group). */\nexport const vectorFilterSchema = validator\n .alternatives(\n filterConditionSchema,\n rawFilterSchema,\n validator\n .object<FilterGroup>({\n and: validator.array().items(validator.link('#vectorFilter')).optional(),\n or: validator.array().items(validator.link('#vectorFilter')).optional(),\n not: validator.link('#vectorFilter').optional(),\n })\n .unknown(false)\n )\n .id('vectorFilter')\n\nconst getField = (metadata: VectorMetadata, path: string): VectorMetadataValue | undefined => {\n const keys = path.split('.')\n let current: VectorMetadataValue | undefined = metadata\n for (const key of keys) {\n if (current === undefined || current === null) {\n return undefined\n }\n if (typeof current !== 'object') {\n return undefined\n }\n current = (current as Record<string, VectorMetadataValue>)[key]\n }\n return current\n}\n\n/**\n * Evaluate a {@link VectorFilter} against a record's metadata in memory — the reference semantics\n * adapters must match for client-side filtering and conformance.\n *\n * @param filter - The filter to evaluate.\n * @param metadata - The record metadata to test.\n * @returns `true` if the metadata satisfies the filter.\n * @throws when the filter (or a nested value) is a raw expression, which the in-memory evaluator\n * cannot interpret.\n */\nexport const evaluateFilter = (filter: VectorFilter, metadata: VectorMetadata): boolean => {\n if (isRawFilter(filter)) {\n throw new Error('raw filters are not evaluable by the in-memory filter evaluator')\n }\n\n if (isFilterCondition(filter)) {\n const { field, op, value } = filter\n const fieldVal = getField(metadata, field)\n\n if (isRawExpr(value)) {\n throw new Error('raw expressions are not evaluable by the in-memory filter evaluator')\n }\n\n switch (op) {\n case 'eq': {\n return fieldVal === value\n }\n\n case 'ne': {\n return fieldVal !== value\n }\n\n case 'gt': {\n if (fieldVal === undefined || value === undefined) {\n return false\n }\n if (typeof fieldVal === 'number' && typeof value === 'number') {\n return fieldVal > value\n }\n if (typeof fieldVal === 'string' && typeof value === 'string') {\n return fieldVal > value\n }\n return false\n }\n\n case 'gte': {\n if (fieldVal === undefined || value === undefined) {\n return false\n }\n if (typeof fieldVal === 'number' && typeof value === 'number') {\n return fieldVal >= value\n }\n if (typeof fieldVal === 'string' && typeof value === 'string') {\n return fieldVal >= value\n }\n return false\n }\n\n case 'lt': {\n if (fieldVal === undefined || value === undefined) {\n return false\n }\n if (typeof fieldVal === 'number' && typeof value === 'number') {\n return fieldVal < value\n }\n if (typeof fieldVal === 'string' && typeof value === 'string') {\n return fieldVal < value\n }\n return false\n }\n\n case 'lte': {\n if (fieldVal === undefined || value === undefined) {\n return false\n }\n if (typeof fieldVal === 'number' && typeof value === 'number') {\n return fieldVal <= value\n }\n if (typeof fieldVal === 'string' && typeof value === 'string') {\n return fieldVal <= value\n }\n return false\n }\n\n case 'in': {\n if (!Array.isArray(value)) {\n return false\n }\n return value.includes(fieldVal as never)\n }\n\n case 'nin': {\n if (!Array.isArray(value)) {\n return true\n }\n return !value.includes(fieldVal as never)\n }\n\n case 'exists': {\n const checkExists = value === undefined || value === true\n return checkExists ? fieldVal !== undefined : fieldVal === undefined\n }\n\n case 'contains': {\n if (fieldVal === undefined) {\n return false\n }\n if (Array.isArray(fieldVal)) {\n return fieldVal.includes(value as never)\n }\n if (typeof fieldVal === 'string') {\n return fieldVal.includes(String(value))\n }\n return false\n }\n\n default: {\n return false\n }\n }\n }\n\n if (isFilterGroup(filter)) {\n const { and, or, not } = filter\n\n if (and !== undefined) {\n return and.every((child) => evaluateFilter(child, metadata))\n }\n\n if (or !== undefined) {\n return or.some((child) => evaluateFilter(child, metadata))\n }\n\n if (not !== undefined) {\n return !evaluateFilter(not, metadata)\n }\n\n return true\n }\n\n return false\n}\n"],"mappings":";;;;;;;;;;;;;;;AAqCA,IAAa,OAAO,KAAa,WAAsB,CAAC,OAAgB;CAAE,OAAO;CAAK;AAAS;;AAG/F,IAAa,aAAa,MACxB,SAAS,CAAC,KAAK,OAAO,EAAE,UAAU,YAAY,MAAM,QAAQ,EAAE,QAAQ;;AAiCxE,IAAa,qBAAqB,MAChC,OAAQ,EAAsB,UAAU,YAAY,OAAQ,EAAsB,OAAO;;AAG3F,IAAa,eAAe,MAC1B,OAAQ,EAAgB,aAAa;;AAGvC,IAAa,iBAAiB,MAC5B,CAAC,kBAAkB,CAAC,KAAK,CAAC,YAAY,CAAC;AAEzC,IAAM,kBAAkB,UAAU,OAAkB;CAClD,UAAU,UAAU,OAAO,EAAE,SAAS;CAEtC,MAAM,UAAU,aAAa,UAAU,OAAO,GAAG,UAAU,IAAI,CAAC,EAAE,SAAS;CAE3E,WAAW,UAAU,MAAM,EAAE,MAAM,UAAU,IAAI,CAAC,EAAE,SAAS;AAC/D,CAAC;AAED,IAAM,wBAAwB,UAAU,OAAwB;CAC9D,OAAO,UAAU,OAAO,EAAE,SAAS;CACnC,IAAI,UACD,OAAO,EACP,MAAM,MAAM,MAAM,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,UAAU,UAAU,EAC7E,SAAS;CACZ,OAAO,UAEJ,aAAa,UAAU,IAAI,GAAG,UAAU,MAAM,EAAE,MAAM,UAAU,IAAI,CAAC,CAAC,EACtE,SAAS;AACd,CAAC;;AAGD,IAAa,qBAAqB,UAC/B,aACC,uBACA,iBACA,UACG,OAAoB;CACnB,KAAK,UAAU,MAAM,EAAE,MAAM,UAAU,KAAK,eAAe,CAAC,EAAE,SAAS;CACvE,IAAI,UAAU,MAAM,EAAE,MAAM,UAAU,KAAK,eAAe,CAAC,EAAE,SAAS;CACtE,KAAK,UAAU,KAAK,eAAe,EAAE,SAAS;AAChD,CAAC,EACA,QAAQ,KAAK,CAClB,EACC,GAAG,cAAc;AAEpB,IAAM,YAAY,UAA0B,SAAkD;CAC5F,MAAM,OAAO,KAAK,MAAM,GAAG;CAC3B,IAAI,UAA2C;CAC/C,KAAK,MAAM,OAAO,MAAM;EACtB,IAAI,YAAY,KAAA,KAAa,YAAY,MACvC;EAEF,IAAI,OAAO,YAAY,UACrB;EAEF,UAAW,QAAgD;CAC7D;CACA,OAAO;AACT;;;;;;;;;;;AAYA,IAAa,kBAAkB,QAAsB,aAAsC;CACzF,IAAI,YAAY,MAAM,GACpB,MAAM,IAAI,MAAM,iEAAiE;CAGnF,IAAI,kBAAkB,MAAM,GAAG;EAC7B,MAAM,EAAE,OAAO,IAAI,UAAU;EAC7B,MAAM,WAAW,SAAS,UAAU,KAAK;EAEzC,IAAI,UAAU,KAAK,GACjB,MAAM,IAAI,MAAM,qEAAqE;EAGvF,QAAQ,IAAR;GACE,KAAK,MACH,OAAO,aAAa;GAGtB,KAAK,MACH,OAAO,aAAa;GAGtB,KAAK;IACH,IAAI,aAAa,KAAA,KAAa,UAAU,KAAA,GACtC,OAAO;IAET,IAAI,OAAO,aAAa,YAAY,OAAO,UAAU,UACnD,OAAO,WAAW;IAEpB,IAAI,OAAO,aAAa,YAAY,OAAO,UAAU,UACnD,OAAO,WAAW;IAEpB,OAAO;GAGT,KAAK;IACH,IAAI,aAAa,KAAA,KAAa,UAAU,KAAA,GACtC,OAAO;IAET,IAAI,OAAO,aAAa,YAAY,OAAO,UAAU,UACnD,OAAO,YAAY;IAErB,IAAI,OAAO,aAAa,YAAY,OAAO,UAAU,UACnD,OAAO,YAAY;IAErB,OAAO;GAGT,KAAK;IACH,IAAI,aAAa,KAAA,KAAa,UAAU,KAAA,GACtC,OAAO;IAET,IAAI,OAAO,aAAa,YAAY,OAAO,UAAU,UACnD,OAAO,WAAW;IAEpB,IAAI,OAAO,aAAa,YAAY,OAAO,UAAU,UACnD,OAAO,WAAW;IAEpB,OAAO;GAGT,KAAK;IACH,IAAI,aAAa,KAAA,KAAa,UAAU,KAAA,GACtC,OAAO;IAET,IAAI,OAAO,aAAa,YAAY,OAAO,UAAU,UACnD,OAAO,YAAY;IAErB,IAAI,OAAO,aAAa,YAAY,OAAO,UAAU,UACnD,OAAO,YAAY;IAErB,OAAO;GAGT,KAAK;IACH,IAAI,CAAC,MAAM,QAAQ,KAAK,GACtB,OAAO;IAET,OAAO,MAAM,SAAS,QAAiB;GAGzC,KAAK;IACH,IAAI,CAAC,MAAM,QAAQ,KAAK,GACtB,OAAO;IAET,OAAO,CAAC,MAAM,SAAS,QAAiB;GAG1C,KAAK,UAEH,OADoB,UAAU,KAAA,KAAa,UAAU,OAChC,aAAa,KAAA,IAAY,aAAa,KAAA;GAG7D,KAAK;IACH,IAAI,aAAa,KAAA,GACf,OAAO;IAET,IAAI,MAAM,QAAQ,QAAQ,GACxB,OAAO,SAAS,SAAS,KAAc;IAEzC,IAAI,OAAO,aAAa,UACtB,OAAO,SAAS,SAAS,OAAO,KAAK,CAAC;IAExC,OAAO;GAGT,SACE,OAAO;EAEX;CACF;CAEA,IAAI,cAAc,MAAM,GAAG;EACzB,MAAM,EAAE,KAAK,IAAI,QAAQ;EAEzB,IAAI,QAAQ,KAAA,GACV,OAAO,IAAI,OAAO,UAAU,eAAe,OAAO,QAAQ,CAAC;EAG7D,IAAI,OAAO,KAAA,GACT,OAAO,GAAG,MAAM,UAAU,eAAe,OAAO,QAAQ,CAAC;EAG3D,IAAI,QAAQ,KAAA,GACV,OAAO,CAAC,eAAe,KAAK,QAAQ;EAGtC,OAAO;CACT;CAEA,OAAO;AACT"}
@@ -1,7 +1,17 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  require("../../chunk-Ble4zEEl.js");
3
3
  //#region src/batteries/vector/helpers.ts
4
+ /** Clamp `n` into the inclusive `[0, 1]` range. */
4
5
  var clamp01 = (n) => Math.min(1, Math.max(0, n));
6
+ /**
7
+ * Normalize a backend's raw score into a `[0, 1]` similarity where higher is closer, accounting for
8
+ * the distance metric and whether the raw value is a similarity or a distance.
9
+ *
10
+ * @param raw - The backend's raw score.
11
+ * @param metric - The distance metric the score was computed under.
12
+ * @param kind - Whether `raw` is a similarity or a distance.
13
+ * @returns The normalized similarity in `[0, 1]`.
14
+ */
5
15
  var normalizeScore = (raw, metric, kind) => {
6
16
  if (metric === "cosine") if (kind === "similarity") return clamp01((raw + 1) / 2);
7
17
  else return clamp01((1 - raw + 1) / 2);
@@ -10,8 +20,11 @@ var normalizeScore = (raw, metric, kind) => {
10
20
  else if (metric === "euclidean") return clamp01(1 / (1 + Math.max(0, raw)));
11
21
  else return clamp01(raw);
12
22
  };
23
+ /** Look up the adapter-specific value for `metric` in a complete metric→value map. */
13
24
  var mapMetric = (metric, map) => map[metric];
25
+ /** `true` if `vector`'s length matches `expected` (or `expected` is undefined). */
14
26
  var dimensionsMatch = (vector, expected) => expected === void 0 ? true : vector.length === expected;
27
+ /** `true` if `vector` is an array of finite numbers (no NaN/Infinity). */
15
28
  var isFiniteVector = (vector) => Array.isArray(vector) && vector.every((n) => typeof n === "number" && Number.isFinite(n));
16
29
  //#endregion
17
30
  exports.clamp01 = clamp01;
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.cjs","names":[],"sources":["../../../src/batteries/vector/helpers.ts"],"sourcesContent":["/**\n * Helper utilities for the vector storage provider battery.\n *\n * @module @nhtio/adk/batteries/vector/helpers\n */\n\nimport type { DistanceMetric } from './types'\n\nexport type ScoreKind = 'similarity' | 'distance'\n\nexport const clamp01 = (n: number): number => Math.min(1, Math.max(0, n))\n\nexport const normalizeScore = (raw: number, metric: DistanceMetric, kind: ScoreKind): number => {\n if (metric === 'cosine') {\n if (kind === 'similarity') {\n return clamp01((raw + 1) / 2)\n } else {\n const sim = 1 - raw\n return clamp01((sim + 1) / 2)\n }\n } else if (metric === 'dot') {\n if (kind === 'similarity') {\n return clamp01(1 / (1 + Math.exp(-raw)))\n } else {\n return clamp01(1 / (1 + Math.exp(raw)))\n }\n } else if (metric === 'euclidean') {\n const d = Math.max(0, raw)\n return clamp01(1 / (1 + d))\n } else {\n return clamp01(raw)\n }\n}\n\nexport const mapMetric = <T>(metric: DistanceMetric, map: Record<DistanceMetric, T>): T =>\n map[metric]\n\nexport const dimensionsMatch = (vector: number[], expected: number | undefined): boolean =>\n expected === undefined ? true : vector.length === expected\n\nexport const isFiniteVector = (vector: number[]): boolean =>\n Array.isArray(vector) && vector.every((n) => typeof n === 'number' && Number.isFinite(n))\n"],"mappings":";;;AAUA,IAAa,WAAW,MAAsB,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,CAAC,CAAC;AAExE,IAAa,kBAAkB,KAAa,QAAwB,SAA4B;CAC9F,IAAI,WAAW,UACb,IAAI,SAAS,cACX,OAAO,SAAS,MAAM,KAAK,CAAC;MAG5B,OAAO,SADK,IAAI,MACM,KAAK,CAAC;MAEzB,IAAI,WAAW,OACpB,IAAI,SAAS,cACX,OAAO,QAAQ,KAAK,IAAI,KAAK,IAAI,CAAC,GAAG,EAAE;MAEvC,OAAO,QAAQ,KAAK,IAAI,KAAK,IAAI,GAAG,EAAE;MAEnC,IAAI,WAAW,aAEpB,OAAO,QAAQ,KAAK,IADV,KAAK,IAAI,GAAG,GACE,EAAE;MAE1B,OAAO,QAAQ,GAAG;AAEtB;AAEA,IAAa,aAAgB,QAAwB,QACnD,IAAI;AAEN,IAAa,mBAAmB,QAAkB,aAChD,aAAa,KAAA,IAAY,OAAO,OAAO,WAAW;AAEpD,IAAa,kBAAkB,WAC7B,MAAM,QAAQ,MAAM,KAAK,OAAO,OAAO,MAAM,OAAO,MAAM,YAAY,OAAO,SAAS,CAAC,CAAC"}
1
+ {"version":3,"file":"helpers.cjs","names":[],"sources":["../../../src/batteries/vector/helpers.ts"],"sourcesContent":["/**\n * Helper utilities for the vector storage provider battery.\n *\n * @module @nhtio/adk/batteries/vector/helpers\n */\n\nimport type { DistanceMetric } from './types'\n\n/** Whether a raw backend score is a similarity (higher = closer) or a distance (lower = closer). */\nexport type ScoreKind = 'similarity' | 'distance'\n\n/** Clamp `n` into the inclusive `[0, 1]` range. */\nexport const clamp01 = (n: number): number => Math.min(1, Math.max(0, n))\n\n/**\n * Normalize a backend's raw score into a `[0, 1]` similarity where higher is closer, accounting for\n * the distance metric and whether the raw value is a similarity or a distance.\n *\n * @param raw - The backend's raw score.\n * @param metric - The distance metric the score was computed under.\n * @param kind - Whether `raw` is a similarity or a distance.\n * @returns The normalized similarity in `[0, 1]`.\n */\nexport const normalizeScore = (raw: number, metric: DistanceMetric, kind: ScoreKind): number => {\n if (metric === 'cosine') {\n if (kind === 'similarity') {\n return clamp01((raw + 1) / 2)\n } else {\n const sim = 1 - raw\n return clamp01((sim + 1) / 2)\n }\n } else if (metric === 'dot') {\n if (kind === 'similarity') {\n return clamp01(1 / (1 + Math.exp(-raw)))\n } else {\n return clamp01(1 / (1 + Math.exp(raw)))\n }\n } else if (metric === 'euclidean') {\n const d = Math.max(0, raw)\n return clamp01(1 / (1 + d))\n } else {\n return clamp01(raw)\n }\n}\n\n/** Look up the adapter-specific value for `metric` in a complete metric→value map. */\nexport const mapMetric = <T>(metric: DistanceMetric, map: Record<DistanceMetric, T>): T =>\n map[metric]\n\n/** `true` if `vector`'s length matches `expected` (or `expected` is undefined). */\nexport const dimensionsMatch = (vector: number[], expected: number | undefined): boolean =>\n expected === undefined ? true : vector.length === expected\n\n/** `true` if `vector` is an array of finite numbers (no NaN/Infinity). */\nexport const isFiniteVector = (vector: number[]): boolean =>\n Array.isArray(vector) && vector.every((n) => typeof n === 'number' && Number.isFinite(n))\n"],"mappings":";;;;AAYA,IAAa,WAAW,MAAsB,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,CAAC,CAAC;;;;;;;;;;AAWxE,IAAa,kBAAkB,KAAa,QAAwB,SAA4B;CAC9F,IAAI,WAAW,UACb,IAAI,SAAS,cACX,OAAO,SAAS,MAAM,KAAK,CAAC;MAG5B,OAAO,SADK,IAAI,MACM,KAAK,CAAC;MAEzB,IAAI,WAAW,OACpB,IAAI,SAAS,cACX,OAAO,QAAQ,KAAK,IAAI,KAAK,IAAI,CAAC,GAAG,EAAE;MAEvC,OAAO,QAAQ,KAAK,IAAI,KAAK,IAAI,GAAG,EAAE;MAEnC,IAAI,WAAW,aAEpB,OAAO,QAAQ,KAAK,IADV,KAAK,IAAI,GAAG,GACE,EAAE;MAE1B,OAAO,QAAQ,GAAG;AAEtB;;AAGA,IAAa,aAAgB,QAAwB,QACnD,IAAI;;AAGN,IAAa,mBAAmB,QAAkB,aAChD,aAAa,KAAA,IAAY,OAAO,OAAO,WAAW;;AAGpD,IAAa,kBAAkB,WAC7B,MAAM,QAAQ,MAAM,KAAK,OAAO,OAAO,MAAM,OAAO,MAAM,YAAY,OAAO,SAAS,CAAC,CAAC"}
@@ -4,9 +4,23 @@
4
4
  * @module @nhtio/adk/batteries/vector/helpers
5
5
  */
6
6
  import type { DistanceMetric } from "./types";
7
+ /** Whether a raw backend score is a similarity (higher = closer) or a distance (lower = closer). */
7
8
  export type ScoreKind = 'similarity' | 'distance';
9
+ /** Clamp `n` into the inclusive `[0, 1]` range. */
8
10
  export declare const clamp01: (n: number) => number;
11
+ /**
12
+ * Normalize a backend's raw score into a `[0, 1]` similarity where higher is closer, accounting for
13
+ * the distance metric and whether the raw value is a similarity or a distance.
14
+ *
15
+ * @param raw - The backend's raw score.
16
+ * @param metric - The distance metric the score was computed under.
17
+ * @param kind - Whether `raw` is a similarity or a distance.
18
+ * @returns The normalized similarity in `[0, 1]`.
19
+ */
9
20
  export declare const normalizeScore: (raw: number, metric: DistanceMetric, kind: ScoreKind) => number;
21
+ /** Look up the adapter-specific value for `metric` in a complete metric→value map. */
10
22
  export declare const mapMetric: <T>(metric: DistanceMetric, map: Record<DistanceMetric, T>) => T;
23
+ /** `true` if `vector`'s length matches `expected` (or `expected` is undefined). */
11
24
  export declare const dimensionsMatch: (vector: number[], expected: number | undefined) => boolean;
25
+ /** `true` if `vector` is an array of finite numbers (no NaN/Infinity). */
12
26
  export declare const isFiniteVector: (vector: number[]) => boolean;
@@ -1,5 +1,15 @@
1
1
  //#region src/batteries/vector/helpers.ts
2
+ /** Clamp `n` into the inclusive `[0, 1]` range. */
2
3
  var clamp01 = (n) => Math.min(1, Math.max(0, n));
4
+ /**
5
+ * Normalize a backend's raw score into a `[0, 1]` similarity where higher is closer, accounting for
6
+ * the distance metric and whether the raw value is a similarity or a distance.
7
+ *
8
+ * @param raw - The backend's raw score.
9
+ * @param metric - The distance metric the score was computed under.
10
+ * @param kind - Whether `raw` is a similarity or a distance.
11
+ * @returns The normalized similarity in `[0, 1]`.
12
+ */
3
13
  var normalizeScore = (raw, metric, kind) => {
4
14
  if (metric === "cosine") if (kind === "similarity") return clamp01((raw + 1) / 2);
5
15
  else return clamp01((1 - raw + 1) / 2);
@@ -8,8 +18,11 @@ var normalizeScore = (raw, metric, kind) => {
8
18
  else if (metric === "euclidean") return clamp01(1 / (1 + Math.max(0, raw)));
9
19
  else return clamp01(raw);
10
20
  };
21
+ /** Look up the adapter-specific value for `metric` in a complete metric→value map. */
11
22
  var mapMetric = (metric, map) => map[metric];
23
+ /** `true` if `vector`'s length matches `expected` (or `expected` is undefined). */
12
24
  var dimensionsMatch = (vector, expected) => expected === void 0 ? true : vector.length === expected;
25
+ /** `true` if `vector` is an array of finite numbers (no NaN/Infinity). */
13
26
  var isFiniteVector = (vector) => Array.isArray(vector) && vector.every((n) => typeof n === "number" && Number.isFinite(n));
14
27
  //#endregion
15
28
  export { clamp01, dimensionsMatch, isFiniteVector, mapMetric, normalizeScore };
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.mjs","names":[],"sources":["../../../src/batteries/vector/helpers.ts"],"sourcesContent":["/**\n * Helper utilities for the vector storage provider battery.\n *\n * @module @nhtio/adk/batteries/vector/helpers\n */\n\nimport type { DistanceMetric } from './types'\n\nexport type ScoreKind = 'similarity' | 'distance'\n\nexport const clamp01 = (n: number): number => Math.min(1, Math.max(0, n))\n\nexport const normalizeScore = (raw: number, metric: DistanceMetric, kind: ScoreKind): number => {\n if (metric === 'cosine') {\n if (kind === 'similarity') {\n return clamp01((raw + 1) / 2)\n } else {\n const sim = 1 - raw\n return clamp01((sim + 1) / 2)\n }\n } else if (metric === 'dot') {\n if (kind === 'similarity') {\n return clamp01(1 / (1 + Math.exp(-raw)))\n } else {\n return clamp01(1 / (1 + Math.exp(raw)))\n }\n } else if (metric === 'euclidean') {\n const d = Math.max(0, raw)\n return clamp01(1 / (1 + d))\n } else {\n return clamp01(raw)\n }\n}\n\nexport const mapMetric = <T>(metric: DistanceMetric, map: Record<DistanceMetric, T>): T =>\n map[metric]\n\nexport const dimensionsMatch = (vector: number[], expected: number | undefined): boolean =>\n expected === undefined ? true : vector.length === expected\n\nexport const isFiniteVector = (vector: number[]): boolean =>\n Array.isArray(vector) && vector.every((n) => typeof n === 'number' && Number.isFinite(n))\n"],"mappings":";AAUA,IAAa,WAAW,MAAsB,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,CAAC,CAAC;AAExE,IAAa,kBAAkB,KAAa,QAAwB,SAA4B;CAC9F,IAAI,WAAW,UACb,IAAI,SAAS,cACX,OAAO,SAAS,MAAM,KAAK,CAAC;MAG5B,OAAO,SADK,IAAI,MACM,KAAK,CAAC;MAEzB,IAAI,WAAW,OACpB,IAAI,SAAS,cACX,OAAO,QAAQ,KAAK,IAAI,KAAK,IAAI,CAAC,GAAG,EAAE;MAEvC,OAAO,QAAQ,KAAK,IAAI,KAAK,IAAI,GAAG,EAAE;MAEnC,IAAI,WAAW,aAEpB,OAAO,QAAQ,KAAK,IADV,KAAK,IAAI,GAAG,GACE,EAAE;MAE1B,OAAO,QAAQ,GAAG;AAEtB;AAEA,IAAa,aAAgB,QAAwB,QACnD,IAAI;AAEN,IAAa,mBAAmB,QAAkB,aAChD,aAAa,KAAA,IAAY,OAAO,OAAO,WAAW;AAEpD,IAAa,kBAAkB,WAC7B,MAAM,QAAQ,MAAM,KAAK,OAAO,OAAO,MAAM,OAAO,MAAM,YAAY,OAAO,SAAS,CAAC,CAAC"}
1
+ {"version":3,"file":"helpers.mjs","names":[],"sources":["../../../src/batteries/vector/helpers.ts"],"sourcesContent":["/**\n * Helper utilities for the vector storage provider battery.\n *\n * @module @nhtio/adk/batteries/vector/helpers\n */\n\nimport type { DistanceMetric } from './types'\n\n/** Whether a raw backend score is a similarity (higher = closer) or a distance (lower = closer). */\nexport type ScoreKind = 'similarity' | 'distance'\n\n/** Clamp `n` into the inclusive `[0, 1]` range. */\nexport const clamp01 = (n: number): number => Math.min(1, Math.max(0, n))\n\n/**\n * Normalize a backend's raw score into a `[0, 1]` similarity where higher is closer, accounting for\n * the distance metric and whether the raw value is a similarity or a distance.\n *\n * @param raw - The backend's raw score.\n * @param metric - The distance metric the score was computed under.\n * @param kind - Whether `raw` is a similarity or a distance.\n * @returns The normalized similarity in `[0, 1]`.\n */\nexport const normalizeScore = (raw: number, metric: DistanceMetric, kind: ScoreKind): number => {\n if (metric === 'cosine') {\n if (kind === 'similarity') {\n return clamp01((raw + 1) / 2)\n } else {\n const sim = 1 - raw\n return clamp01((sim + 1) / 2)\n }\n } else if (metric === 'dot') {\n if (kind === 'similarity') {\n return clamp01(1 / (1 + Math.exp(-raw)))\n } else {\n return clamp01(1 / (1 + Math.exp(raw)))\n }\n } else if (metric === 'euclidean') {\n const d = Math.max(0, raw)\n return clamp01(1 / (1 + d))\n } else {\n return clamp01(raw)\n }\n}\n\n/** Look up the adapter-specific value for `metric` in a complete metric→value map. */\nexport const mapMetric = <T>(metric: DistanceMetric, map: Record<DistanceMetric, T>): T =>\n map[metric]\n\n/** `true` if `vector`'s length matches `expected` (or `expected` is undefined). */\nexport const dimensionsMatch = (vector: number[], expected: number | undefined): boolean =>\n expected === undefined ? true : vector.length === expected\n\n/** `true` if `vector` is an array of finite numbers (no NaN/Infinity). */\nexport const isFiniteVector = (vector: number[]): boolean =>\n Array.isArray(vector) && vector.every((n) => typeof n === 'number' && Number.isFinite(n))\n"],"mappings":";;AAYA,IAAa,WAAW,MAAsB,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,CAAC,CAAC;;;;;;;;;;AAWxE,IAAa,kBAAkB,KAAa,QAAwB,SAA4B;CAC9F,IAAI,WAAW,UACb,IAAI,SAAS,cACX,OAAO,SAAS,MAAM,KAAK,CAAC;MAG5B,OAAO,SADK,IAAI,MACM,KAAK,CAAC;MAEzB,IAAI,WAAW,OACpB,IAAI,SAAS,cACX,OAAO,QAAQ,KAAK,IAAI,KAAK,IAAI,CAAC,GAAG,EAAE;MAEvC,OAAO,QAAQ,KAAK,IAAI,KAAK,IAAI,GAAG,EAAE;MAEnC,IAAI,WAAW,aAEpB,OAAO,QAAQ,KAAK,IADV,KAAK,IAAI,GAAG,GACE,EAAE;MAE1B,OAAO,QAAQ,GAAG;AAEtB;;AAGA,IAAa,aAAgB,QAAwB,QACnD,IAAI;;AAGN,IAAa,mBAAmB,QAAkB,aAChD,aAAa,KAAA,IAAY,OAAO,OAAO,WAAW;;AAGpD,IAAa,kBAAkB,WAC7B,MAAM,QAAQ,MAAM,KAAK,OAAO,OAAO,MAAM,OAAO,MAAM,YAAY,OAAO,SAAS,CAAC,CAAC"}
@@ -16,11 +16,13 @@ import { BaseVectorStore } from "../contract";
16
16
  import type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from "../plan";
17
17
  import type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from "../types";
18
18
  export interface HnswlibVectorStoreOptions extends BaseVectorStoreOptions {
19
+ /** Initial index capacity per collection; grows automatically via `resizeIndex`. Default 1024. */
19
20
  initialCapacity?: number;
20
21
  }
21
22
  export declare class HnswlibVectorStore extends BaseVectorStore {
22
23
  #private;
23
24
  readonly capabilities: VectorStoreCapabilities;
25
+ /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
24
26
  static isAvailable(): boolean;
25
27
  isAvailable(): boolean;
26
28
  connect(): Promise<void>;
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  require("../../chunk-Ble4zEEl.js");
3
- const require_tool_registry = require("../../tool_registry-DYUYqXvo.js");
3
+ const require_tool_registry = require("../../tool_registry-CKJPze3j.js");
4
4
  require("../../guards.cjs");
5
5
  const require_batteries_vector_filters = require("./filters.cjs");
6
6
  const require_batteries_vector_helpers = require("./helpers.cjs");
@@ -49,6 +49,7 @@ var HnswlibVectorStore = class extends require_batteries_vector_contract.BaseVec
49
49
  get #opts() {
50
50
  return this.options;
51
51
  }
52
+ /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
52
53
  static isAvailable() {
53
54
  return typeof process !== "undefined";
54
55
  }
@@ -1 +1 @@
1
- {"version":3,"file":"hnswlib.cjs","names":["#opts","#lib","#collections","#ensureLib","#coll","#ensureCapacity","#project"],"sources":["../../../src/batteries/vector/hnswlib/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/hnswlib\n *\n * Embedded HNSWLib adapter (in-process, no server — like in_memory/sqlite_vec/duckdb). hnswlib is\n * a pure ANN index keyed by integer labels and holding ONLY vectors, so this adapter pairs the\n * index with a JS sidecar that owns id↔label mapping plus the document/metadata records. KNN runs\n * through the HNSW index; metadata filtering, filter-scans, projection and delete are served from\n * the sidecar via the neutral filter tree's JS reference evaluator (exact cross-adapter parity).\n *\n * Driver: `hnswlib-node` (native addon; requires the build to be approved — see\n * pnpm-workspace.yaml `allowBuilds`). Persistence is in-memory per process; pass a fresh store per\n * use. (The index supports writeIndex/readIndex on disk, but the sidecar would need its own\n * persistence — out of scope for the in-memory contract here.)\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_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 HnswlibVectorStoreOptions extends BaseVectorStoreOptions {\n // Initial index capacity per collection (grows automatically via resizeIndex). Default 1024.\n initialCapacity?: number\n}\n\ninterface StoredRecord {\n id: string\n label: number\n vector: number[]\n document?: string\n metadata?: VectorMetadata\n}\n\ninterface Collection {\n index: any\n dims: number\n metric: DistanceMetric\n byId: Map<string, StoredRecord>\n idByLabel: Map<number, string>\n nextLabel: number\n capacity: number\n}\n\nconst getHnswlib = async () => {\n try {\n const mod = await import('hnswlib-node')\n return (mod as any).default ?? mod\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['hnswlib-node'])\n }\n}\n\nconst spaceFor = (metric: DistanceMetric): string =>\n metric === 'euclidean' ? 'l2' : metric === 'dot' ? 'ip' : 'cosine'\n\nexport class HnswlibVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: true,\n rawSql: false,\n builtInEncoding: false,\n // In-process and synchronous: a write is visible on resolve. The option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n\n #lib: any | null = null\n #collections: Map<string, Collection> = new Map()\n\n get #opts(): HnswlibVectorStoreOptions {\n return this.options as HnswlibVectorStoreOptions\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.#lib) return\n this.#lib = await getHnswlib()\n }\n\n async close(): Promise<void> {\n this.#collections.clear()\n this.#lib = null\n }\n\n async #ensureLib(): Promise<any> {\n if (!this.#lib) await this.connect()\n return this.#lib!\n }\n\n #coll(collection: string): Collection {\n const c = this.#collections.get(collection)\n if (!c) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED([\n 'collection',\n 'unknown collection: ' + collection,\n ])\n }\n return c\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n const lib = await this.#ensureLib()\n if (this.#collections.has(spec.collection)) {\n if (ifNotExists) return\n this.#collections.delete(spec.collection)\n }\n try {\n const capacity = this.#opts.initialCapacity ?? 1024\n const index = new lib.HierarchicalNSW(spaceFor(spec.vector.metric), spec.vector.dimensions)\n index.initIndex(capacity)\n this.#collections.set(spec.collection, {\n index,\n dims: spec.vector.dimensions,\n metric: spec.vector.metric,\n byId: new Map(),\n idByLabel: new Map(),\n nextLabel: 0,\n capacity,\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 if (!this.#collections.has(collection)) {\n if (ifExists) return\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', 'unknown collection'])\n }\n this.#collections.delete(collection)\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n return this.#collections.has(collection)\n }\n\n async renameCollection(from: string, to: string): Promise<void> {\n const c = this.#collections.get(from)\n if (!c) throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'unknown: ' + from])\n this.#collections.set(to, c)\n this.#collections.delete(from)\n }\n\n #ensureCapacity(c: Collection, additional: number): void {\n const needed = c.byId.size + additional\n if (needed > c.capacity) {\n const next = Math.max(needed, c.capacity * 2)\n c.index.resizeIndex(next)\n c.capacity = next\n }\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n await this.#ensureLib()\n const c = this.#coll(plan.collection)\n const expected = this.#opts.dimensions ?? c.dims\n try {\n this.#ensureCapacity(c, plan.records.length)\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 // Reuse the existing label on update (mark the old point deleted, then re-add under a\n // fresh label so the vector value actually changes — hnswlib has no in-place update).\n const existing = c.byId.get(r.id)\n if (existing) {\n try {\n c.index.markDelete(existing.label)\n } catch {\n // already gone — ignore\n }\n }\n this.#ensureCapacity(c, 1)\n const label = c.nextLabel++\n c.index.addPoint(vector, label)\n c.idByLabel.set(label, r.id)\n c.byId.set(r.id, { id: r.id, label, vector, document: r.document, metadata: r.metadata })\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 await this.#ensureLib()\n const c = this.#coll(plan.collection)\n const metric = this.#opts.metric ?? c.metric\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 rec = c.byId.get(plan.near.id)\n if (!rec) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = rec.vector\n }\n }\n\n const offset = plan.offset ?? 0\n try {\n if (queryVector) {\n // Over-fetch when filtering (and to absorb deleted points), then JS-filter for parity.\n const live = c.byId.size\n if (live === 0) return []\n const want = plan.filter ? live : Math.min(plan.topK + offset, live)\n const k = Math.min(Math.max(want, 1), live)\n const res = c.index.searchKnn(queryVector, k)\n const hits: Array<{ rec: StoredRecord; dist: number }> = []\n for (let i = 0; i < res.neighbors.length; i++) {\n const id = c.idByLabel.get(res.neighbors[i])\n if (id === undefined) continue\n const rec = c.byId.get(id)\n if (rec) hits.push({ rec, dist: res.distances[i] })\n }\n const filtered = plan.filter\n ? hits.filter((h) => evaluateFilter(plan.filter!, h.rec.metadata ?? {}))\n : hits\n return filtered\n .slice(offset, offset + plan.topK)\n .map((h) => this.#project(h.rec, plan, metric, h.dist))\n } else {\n // Filter-scan: serve from the sidecar (insertion order), JS-filter, no score.\n const rows = [...c.byId.values()]\n const filtered = plan.filter\n ? rows.filter((rec) => evaluateFilter(plan.filter!, rec.metadata ?? {}))\n : rows\n return filtered\n .slice(offset, offset + plan.topK)\n .map((rec) => this.#project(rec, plan, metric, undefined))\n }\n } catch (err) {\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\n }\n\n #project(\n rec: StoredRecord,\n plan: SearchPlan,\n metric: string,\n dist: number | undefined\n ): VectorMatch {\n const proj = plan.projection\n const out: VectorMatch = {}\n if (proj.id) out.id = rec.id\n if (proj.vector) out.vector = rec.vector.slice()\n if (proj.document) out.document = rec.document\n if (proj.metadata) out.metadata = rec.metadata ?? {}\n if (dist !== undefined) {\n out.score = normalizeScore(dist, metric as DistanceMetric, 'distance')\n }\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n await this.#ensureLib()\n const c = this.#coll(plan.collection)\n try {\n let targets: string[]\n if (plan.ids && plan.ids.length > 0) {\n targets = plan.ids\n } else if (plan.filter) {\n targets = [...c.byId.values()]\n .filter((rec) => evaluateFilter(plan.filter!, rec.metadata ?? {}))\n .map((rec) => rec.id)\n } else {\n targets = [...c.byId.keys()]\n }\n for (const id of targets) {\n const rec = c.byId.get(id)\n if (!rec) continue\n try {\n c.index.markDelete(rec.label)\n } catch {\n // already deleted — ignore\n }\n c.idByLabel.delete(rec.label)\n c.byId.delete(id)\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"hnswlib.cjs","names":["#opts","#lib","#collections","#ensureLib","#coll","#ensureCapacity","#project"],"sources":["../../../src/batteries/vector/hnswlib/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/hnswlib\n *\n * Embedded HNSWLib adapter (in-process, no server — like in_memory/sqlite_vec/duckdb). hnswlib is\n * a pure ANN index keyed by integer labels and holding ONLY vectors, so this adapter pairs the\n * index with a JS sidecar that owns id↔label mapping plus the document/metadata records. KNN runs\n * through the HNSW index; metadata filtering, filter-scans, projection and delete are served from\n * the sidecar via the neutral filter tree's JS reference evaluator (exact cross-adapter parity).\n *\n * Driver: `hnswlib-node` (native addon; requires the build to be approved — see\n * pnpm-workspace.yaml `allowBuilds`). Persistence is in-memory per process; pass a fresh store per\n * use. (The index supports writeIndex/readIndex on disk, but the sidecar would need its own\n * persistence — out of scope for the in-memory contract here.)\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_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 HnswlibVectorStoreOptions extends BaseVectorStoreOptions {\n /** Initial index capacity per collection; grows automatically via `resizeIndex`. Default 1024. */\n initialCapacity?: number\n}\n\ninterface StoredRecord {\n id: string\n label: number\n vector: number[]\n document?: string\n metadata?: VectorMetadata\n}\n\ninterface Collection {\n index: any\n dims: number\n metric: DistanceMetric\n byId: Map<string, StoredRecord>\n idByLabel: Map<number, string>\n nextLabel: number\n capacity: number\n}\n\nconst getHnswlib = async () => {\n try {\n const mod = await import('hnswlib-node')\n return (mod as any).default ?? mod\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['hnswlib-node'])\n }\n}\n\nconst spaceFor = (metric: DistanceMetric): string =>\n metric === 'euclidean' ? 'l2' : metric === 'dot' ? 'ip' : 'cosine'\n\nexport class HnswlibVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: true,\n rawSql: false,\n builtInEncoding: false,\n // In-process and synchronous: a write is visible on resolve. The option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n\n #lib: any | null = null\n #collections: Map<string, Collection> = new Map()\n\n get #opts(): HnswlibVectorStoreOptions {\n return this.options as HnswlibVectorStoreOptions\n }\n\n /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */\n static isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n\n async connect(): Promise<void> {\n if (this.#lib) return\n this.#lib = await getHnswlib()\n }\n\n async close(): Promise<void> {\n this.#collections.clear()\n this.#lib = null\n }\n\n async #ensureLib(): Promise<any> {\n if (!this.#lib) await this.connect()\n return this.#lib!\n }\n\n #coll(collection: string): Collection {\n const c = this.#collections.get(collection)\n if (!c) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED([\n 'collection',\n 'unknown collection: ' + collection,\n ])\n }\n return c\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n const lib = await this.#ensureLib()\n if (this.#collections.has(spec.collection)) {\n if (ifNotExists) return\n this.#collections.delete(spec.collection)\n }\n try {\n const capacity = this.#opts.initialCapacity ?? 1024\n const index = new lib.HierarchicalNSW(spaceFor(spec.vector.metric), spec.vector.dimensions)\n index.initIndex(capacity)\n this.#collections.set(spec.collection, {\n index,\n dims: spec.vector.dimensions,\n metric: spec.vector.metric,\n byId: new Map(),\n idByLabel: new Map(),\n nextLabel: 0,\n capacity,\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 if (!this.#collections.has(collection)) {\n if (ifExists) return\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', 'unknown collection'])\n }\n this.#collections.delete(collection)\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n return this.#collections.has(collection)\n }\n\n async renameCollection(from: string, to: string): Promise<void> {\n const c = this.#collections.get(from)\n if (!c) throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'unknown: ' + from])\n this.#collections.set(to, c)\n this.#collections.delete(from)\n }\n\n #ensureCapacity(c: Collection, additional: number): void {\n const needed = c.byId.size + additional\n if (needed > c.capacity) {\n const next = Math.max(needed, c.capacity * 2)\n c.index.resizeIndex(next)\n c.capacity = next\n }\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n await this.#ensureLib()\n const c = this.#coll(plan.collection)\n const expected = this.#opts.dimensions ?? c.dims\n try {\n this.#ensureCapacity(c, plan.records.length)\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 // Reuse the existing label on update (mark the old point deleted, then re-add under a\n // fresh label so the vector value actually changes — hnswlib has no in-place update).\n const existing = c.byId.get(r.id)\n if (existing) {\n try {\n c.index.markDelete(existing.label)\n } catch {\n // already gone — ignore\n }\n }\n this.#ensureCapacity(c, 1)\n const label = c.nextLabel++\n c.index.addPoint(vector, label)\n c.idByLabel.set(label, r.id)\n c.byId.set(r.id, { id: r.id, label, vector, document: r.document, metadata: r.metadata })\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 await this.#ensureLib()\n const c = this.#coll(plan.collection)\n const metric = this.#opts.metric ?? c.metric\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 rec = c.byId.get(plan.near.id)\n if (!rec) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = rec.vector\n }\n }\n\n const offset = plan.offset ?? 0\n try {\n if (queryVector) {\n // Over-fetch when filtering (and to absorb deleted points), then JS-filter for parity.\n const live = c.byId.size\n if (live === 0) return []\n const want = plan.filter ? live : Math.min(plan.topK + offset, live)\n const k = Math.min(Math.max(want, 1), live)\n const res = c.index.searchKnn(queryVector, k)\n const hits: Array<{ rec: StoredRecord; dist: number }> = []\n for (let i = 0; i < res.neighbors.length; i++) {\n const id = c.idByLabel.get(res.neighbors[i])\n if (id === undefined) continue\n const rec = c.byId.get(id)\n if (rec) hits.push({ rec, dist: res.distances[i] })\n }\n const filtered = plan.filter\n ? hits.filter((h) => evaluateFilter(plan.filter!, h.rec.metadata ?? {}))\n : hits\n return filtered\n .slice(offset, offset + plan.topK)\n .map((h) => this.#project(h.rec, plan, metric, h.dist))\n } else {\n // Filter-scan: serve from the sidecar (insertion order), JS-filter, no score.\n const rows = [...c.byId.values()]\n const filtered = plan.filter\n ? rows.filter((rec) => evaluateFilter(plan.filter!, rec.metadata ?? {}))\n : rows\n return filtered\n .slice(offset, offset + plan.topK)\n .map((rec) => this.#project(rec, plan, metric, undefined))\n }\n } catch (err) {\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\n }\n\n #project(\n rec: StoredRecord,\n plan: SearchPlan,\n metric: string,\n dist: number | undefined\n ): VectorMatch {\n const proj = plan.projection\n const out: VectorMatch = {}\n if (proj.id) out.id = rec.id\n if (proj.vector) out.vector = rec.vector.slice()\n if (proj.document) out.document = rec.document\n if (proj.metadata) out.metadata = rec.metadata ?? {}\n if (dist !== undefined) {\n out.score = normalizeScore(dist, metric as DistanceMetric, 'distance')\n }\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n await this.#ensureLib()\n const c = this.#coll(plan.collection)\n try {\n let targets: string[]\n if (plan.ids && plan.ids.length > 0) {\n targets = plan.ids\n } else if (plan.filter) {\n targets = [...c.byId.values()]\n .filter((rec) => evaluateFilter(plan.filter!, rec.metadata ?? {}))\n .map((rec) => rec.id)\n } else {\n targets = [...c.byId.keys()]\n }\n for (const id of targets) {\n const rec = c.byId.get(id)\n if (!rec) continue\n try {\n c.index.markDelete(rec.label)\n } catch {\n // already deleted — ignore\n }\n c.idByLabel.delete(rec.label)\n c.byId.delete(id)\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { s as isInstanceOf } from "../../tool_registry-D1pSSlsd.mjs";
1
+ import { s as isInstanceOf } from "../../tool_registry-791Vrjtf.mjs";
2
2
  import "../../guards.mjs";
3
3
  import { evaluateFilter } from "./filters.mjs";
4
4
  import { normalizeScore } from "./helpers.mjs";
@@ -47,6 +47,7 @@ var HnswlibVectorStore = class extends BaseVectorStore {
47
47
  get #opts() {
48
48
  return this.options;
49
49
  }
50
+ /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
50
51
  static isAvailable() {
51
52
  return typeof process !== "undefined";
52
53
  }