@nhtio/adk 1.20260607.2 → 1.20260609.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (501) hide show
  1. package/CHANGELOG.md +185 -0
  2. package/batteries/embeddings/openai/adapter.cjs +1 -1
  3. package/batteries/embeddings/openai/adapter.mjs +1 -1
  4. package/batteries/embeddings/openai/exceptions.cjs +1 -1
  5. package/batteries/embeddings/openai/exceptions.mjs +1 -1
  6. package/batteries/embeddings/openai/types.d.ts +7 -0
  7. package/batteries/embeddings/webllm/adapter.cjs +1 -1
  8. package/batteries/embeddings/webllm/adapter.mjs +1 -1
  9. package/batteries/embeddings/webllm/exceptions.cjs +1 -1
  10. package/batteries/embeddings/webllm/exceptions.mjs +1 -1
  11. package/batteries/llm/chat_common/helpers.d.ts +165 -0
  12. package/batteries/llm/chat_common/types.d.ts +309 -0
  13. package/batteries/llm/index.d.ts +5 -0
  14. package/batteries/llm/ollama/adapter.cjs +736 -0
  15. package/batteries/llm/ollama/adapter.cjs.map +1 -0
  16. package/batteries/llm/ollama/adapter.d.ts +64 -0
  17. package/batteries/llm/ollama/adapter.mjs +734 -0
  18. package/batteries/llm/ollama/adapter.mjs.map +1 -0
  19. package/batteries/llm/ollama/exceptions.cjs +105 -0
  20. package/batteries/llm/ollama/exceptions.cjs.map +1 -0
  21. package/batteries/llm/ollama/exceptions.d.ts +112 -0
  22. package/batteries/llm/ollama/exceptions.mjs +96 -0
  23. package/batteries/llm/ollama/exceptions.mjs.map +1 -0
  24. package/batteries/llm/ollama/helpers.cjs +487 -0
  25. package/batteries/llm/ollama/helpers.cjs.map +1 -0
  26. package/batteries/llm/ollama/helpers.d.ts +158 -0
  27. package/batteries/llm/ollama/helpers.mjs +450 -0
  28. package/batteries/llm/ollama/helpers.mjs.map +1 -0
  29. package/batteries/llm/ollama/index.d.ts +29 -0
  30. package/batteries/llm/ollama/types.cjs +2 -0
  31. package/batteries/llm/ollama/types.d.ts +334 -0
  32. package/batteries/llm/ollama/types.mjs +0 -0
  33. package/batteries/llm/ollama/validation.cjs +130 -0
  34. package/batteries/llm/ollama/validation.cjs.map +1 -0
  35. package/batteries/llm/ollama/validation.d.ts +31 -0
  36. package/batteries/llm/ollama/validation.mjs +127 -0
  37. package/batteries/llm/ollama/validation.mjs.map +1 -0
  38. package/batteries/llm/ollama.cjs +54 -0
  39. package/batteries/llm/ollama.mjs +6 -0
  40. package/batteries/llm/openai_chat_completions/adapter.cjs +36 -19
  41. package/batteries/llm/openai_chat_completions/adapter.cjs.map +1 -1
  42. package/batteries/llm/openai_chat_completions/adapter.mjs +23 -6
  43. package/batteries/llm/openai_chat_completions/adapter.mjs.map +1 -1
  44. package/batteries/llm/openai_chat_completions/exceptions.cjs +1 -1
  45. package/batteries/llm/openai_chat_completions/exceptions.mjs +1 -1
  46. package/batteries/llm/openai_chat_completions/helpers.cjs +80 -320
  47. package/batteries/llm/openai_chat_completions/helpers.cjs.map +1 -1
  48. package/batteries/llm/openai_chat_completions/helpers.d.ts +68 -144
  49. package/batteries/llm/openai_chat_completions/helpers.mjs +40 -280
  50. package/batteries/llm/openai_chat_completions/helpers.mjs.map +1 -1
  51. package/batteries/llm/openai_chat_completions/types.d.ts +273 -181
  52. package/batteries/llm/openai_chat_completions/validation.cjs +2 -2
  53. package/batteries/llm/openai_chat_completions/validation.cjs.map +1 -1
  54. package/batteries/llm/openai_chat_completions/validation.mjs +2 -2
  55. package/batteries/llm/openai_chat_completions/validation.mjs.map +1 -1
  56. package/batteries/llm/openai_chat_completions.cjs +29 -28
  57. package/batteries/llm/openai_chat_completions.mjs +2 -1
  58. package/batteries/llm/webllm_chat_completions/adapter.cjs +38 -19
  59. package/batteries/llm/webllm_chat_completions/adapter.cjs.map +1 -1
  60. package/batteries/llm/webllm_chat_completions/adapter.d.ts +18 -0
  61. package/batteries/llm/webllm_chat_completions/adapter.mjs +25 -6
  62. package/batteries/llm/webllm_chat_completions/adapter.mjs.map +1 -1
  63. package/batteries/llm/webllm_chat_completions/exceptions.cjs +1 -1
  64. package/batteries/llm/webllm_chat_completions/exceptions.mjs +1 -1
  65. package/batteries/llm/webllm_chat_completions/helpers.cjs +29 -28
  66. package/batteries/llm/webllm_chat_completions/helpers.mjs +2 -1
  67. package/batteries/llm/webllm_chat_completions/types.d.ts +21 -0
  68. package/batteries/llm/webllm_chat_completions/validation.cjs +13 -1
  69. package/batteries/llm/webllm_chat_completions/validation.cjs.map +1 -1
  70. package/batteries/llm/webllm_chat_completions/validation.d.ts +12 -0
  71. package/batteries/llm/webllm_chat_completions/validation.mjs +13 -1
  72. package/batteries/llm/webllm_chat_completions/validation.mjs.map +1 -1
  73. package/batteries/llm/webllm_chat_completions.cjs +29 -28
  74. package/batteries/llm/webllm_chat_completions.mjs +2 -1
  75. package/batteries/llm.cjs +44 -28
  76. package/batteries/llm.mjs +9 -4
  77. package/batteries/storage/flydrive.cjs +1 -1
  78. package/batteries/storage/flydrive.mjs +1 -1
  79. package/batteries/storage/in_memory/index.d.ts +1 -1
  80. package/batteries/storage/in_memory.cjs +2 -2
  81. package/batteries/storage/in_memory.cjs.map +1 -1
  82. package/batteries/storage/in_memory.mjs +2 -2
  83. package/batteries/storage/in_memory.mjs.map +1 -1
  84. package/batteries/storage/opfs/index.d.ts +19 -0
  85. package/batteries/storage/opfs.cjs +1 -1
  86. package/batteries/storage/opfs.cjs.map +1 -1
  87. package/batteries/storage/opfs.mjs +1 -1
  88. package/batteries/storage/opfs.mjs.map +1 -1
  89. package/batteries/tools/color.cjs +3 -2
  90. package/batteries/tools/color.cjs.map +1 -1
  91. package/batteries/tools/color.mjs +3 -2
  92. package/batteries/tools/color.mjs.map +1 -1
  93. package/batteries/tools/comparison.cjs +4 -3
  94. package/batteries/tools/comparison.cjs.map +1 -1
  95. package/batteries/tools/comparison.mjs +4 -3
  96. package/batteries/tools/comparison.mjs.map +1 -1
  97. package/batteries/tools/data_structure.cjs +30 -10
  98. package/batteries/tools/data_structure.cjs.map +1 -1
  99. package/batteries/tools/data_structure.mjs +30 -10
  100. package/batteries/tools/data_structure.mjs.map +1 -1
  101. package/batteries/tools/datetime_extended.cjs +5 -10
  102. package/batteries/tools/datetime_extended.cjs.map +1 -1
  103. package/batteries/tools/datetime_extended.mjs +5 -10
  104. package/batteries/tools/datetime_extended.mjs.map +1 -1
  105. package/batteries/tools/datetime_math.cjs +2 -2
  106. package/batteries/tools/datetime_math.mjs +2 -2
  107. package/batteries/tools/encoding.cjs +13 -4
  108. package/batteries/tools/encoding.cjs.map +1 -1
  109. package/batteries/tools/encoding.mjs +13 -4
  110. package/batteries/tools/encoding.mjs.map +1 -1
  111. package/batteries/tools/formatting.cjs +4 -4
  112. package/batteries/tools/formatting.cjs.map +1 -1
  113. package/batteries/tools/formatting.mjs +4 -4
  114. package/batteries/tools/formatting.mjs.map +1 -1
  115. package/batteries/tools/geo_basics.cjs +2 -2
  116. package/batteries/tools/geo_basics.mjs +2 -2
  117. package/batteries/tools/index.d.ts +1 -0
  118. package/batteries/tools/math.cjs +10 -8
  119. package/batteries/tools/math.cjs.map +1 -1
  120. package/batteries/tools/math.mjs +10 -8
  121. package/batteries/tools/math.mjs.map +1 -1
  122. package/batteries/tools/memory.cjs +5 -5
  123. package/batteries/tools/memory.mjs +5 -5
  124. package/batteries/tools/parsing.cjs +9 -5
  125. package/batteries/tools/parsing.cjs.map +1 -1
  126. package/batteries/tools/parsing.mjs +9 -5
  127. package/batteries/tools/parsing.mjs.map +1 -1
  128. package/batteries/tools/retrievables.cjs +4 -4
  129. package/batteries/tools/retrievables.mjs +4 -4
  130. package/batteries/tools/searxng/exceptions.d.ts +21 -0
  131. package/batteries/tools/searxng/index.d.ts +150 -0
  132. package/batteries/tools/searxng.cjs +5 -0
  133. package/batteries/tools/searxng.mjs +2 -0
  134. package/batteries/tools/standing_instructions.cjs +4 -4
  135. package/batteries/tools/standing_instructions.mjs +4 -4
  136. package/batteries/tools/statistics.cjs +54 -43
  137. package/batteries/tools/statistics.cjs.map +1 -1
  138. package/batteries/tools/statistics.mjs +54 -43
  139. package/batteries/tools/statistics.mjs.map +1 -1
  140. package/batteries/tools/string_processing.cjs +5 -5
  141. package/batteries/tools/string_processing.cjs.map +1 -1
  142. package/batteries/tools/string_processing.mjs +5 -5
  143. package/batteries/tools/string_processing.mjs.map +1 -1
  144. package/batteries/tools/structured_data.cjs +8 -13
  145. package/batteries/tools/structured_data.cjs.map +1 -1
  146. package/batteries/tools/structured_data.mjs +8 -13
  147. package/batteries/tools/structured_data.mjs.map +1 -1
  148. package/batteries/tools/text_analysis.cjs +3 -3
  149. package/batteries/tools/text_analysis.mjs +3 -3
  150. package/batteries/tools/text_comparison.cjs +2 -2
  151. package/batteries/tools/text_comparison.mjs +2 -2
  152. package/batteries/tools/time.cjs +2 -2
  153. package/batteries/tools/time.mjs +2 -2
  154. package/batteries/tools/unit_conversion.cjs +10 -8
  155. package/batteries/tools/unit_conversion.cjs.map +1 -1
  156. package/batteries/tools/unit_conversion.mjs +10 -8
  157. package/batteries/tools/unit_conversion.mjs.map +1 -1
  158. package/batteries/tools.cjs +3 -0
  159. package/batteries/tools.mjs +2 -1
  160. package/batteries/vector/arangodb/index.d.ts +2 -0
  161. package/batteries/vector/arangodb.cjs +2 -1
  162. package/batteries/vector/arangodb.cjs.map +1 -1
  163. package/batteries/vector/arangodb.mjs +2 -1
  164. package/batteries/vector/arangodb.mjs.map +1 -1
  165. package/batteries/vector/builder.cjs +31 -0
  166. package/batteries/vector/builder.cjs.map +1 -1
  167. package/batteries/vector/builder.d.ts +58 -0
  168. package/batteries/vector/builder.mjs +31 -0
  169. package/batteries/vector/builder.mjs.map +1 -1
  170. package/batteries/vector/chroma/index.d.ts +4 -0
  171. package/batteries/vector/chroma.cjs +3 -0
  172. package/batteries/vector/chroma.cjs.map +1 -1
  173. package/batteries/vector/chroma.mjs +3 -0
  174. package/batteries/vector/chroma.mjs.map +1 -1
  175. package/batteries/vector/clickhouse/index.d.ts +2 -0
  176. package/batteries/vector/clickhouse.cjs +2 -1
  177. package/batteries/vector/clickhouse.cjs.map +1 -1
  178. package/batteries/vector/clickhouse.mjs +2 -1
  179. package/batteries/vector/clickhouse.mjs.map +1 -1
  180. package/batteries/vector/cloudflare/index.d.ts +2 -0
  181. package/batteries/vector/cloudflare.cjs +2 -1
  182. package/batteries/vector/cloudflare.cjs.map +1 -1
  183. package/batteries/vector/cloudflare.mjs +2 -1
  184. package/batteries/vector/cloudflare.mjs.map +1 -1
  185. package/batteries/vector/conformance/index.d.ts +22 -0
  186. package/batteries/vector/conformance.cjs +22 -0
  187. package/batteries/vector/conformance.cjs.map +1 -1
  188. package/batteries/vector/conformance.mjs +22 -0
  189. package/batteries/vector/conformance.mjs.map +1 -1
  190. package/batteries/vector/contract.cjs +22 -0
  191. package/batteries/vector/contract.cjs.map +1 -1
  192. package/batteries/vector/contract.d.ts +51 -0
  193. package/batteries/vector/contract.mjs +22 -0
  194. package/batteries/vector/contract.mjs.map +1 -1
  195. package/batteries/vector/couchbase/index.d.ts +2 -0
  196. package/batteries/vector/couchbase.cjs +2 -1
  197. package/batteries/vector/couchbase.cjs.map +1 -1
  198. package/batteries/vector/couchbase.mjs +2 -1
  199. package/batteries/vector/couchbase.mjs.map +1 -1
  200. package/batteries/vector/duckdb/index.d.ts +2 -0
  201. package/batteries/vector/duckdb.cjs +2 -1
  202. package/batteries/vector/duckdb.cjs.map +1 -1
  203. package/batteries/vector/duckdb.mjs +2 -1
  204. package/batteries/vector/duckdb.mjs.map +1 -1
  205. package/batteries/vector/elasticsearch/index.d.ts +2 -0
  206. package/batteries/vector/elasticsearch.cjs +2 -1
  207. package/batteries/vector/elasticsearch.cjs.map +1 -1
  208. package/batteries/vector/elasticsearch.mjs +2 -1
  209. package/batteries/vector/elasticsearch.mjs.map +1 -1
  210. package/batteries/vector/exceptions.cjs +1 -1
  211. package/batteries/vector/exceptions.mjs +1 -1
  212. package/batteries/vector/factory.cjs +6 -0
  213. package/batteries/vector/factory.cjs.map +1 -1
  214. package/batteries/vector/factory.d.ts +14 -0
  215. package/batteries/vector/factory.mjs +6 -0
  216. package/batteries/vector/factory.mjs.map +1 -1
  217. package/batteries/vector/filters.cjs +22 -1
  218. package/batteries/vector/filters.cjs.map +1 -1
  219. package/batteries/vector/filters.d.ts +38 -0
  220. package/batteries/vector/filters.mjs +22 -1
  221. package/batteries/vector/filters.mjs.map +1 -1
  222. package/batteries/vector/helpers.cjs +13 -0
  223. package/batteries/vector/helpers.cjs.map +1 -1
  224. package/batteries/vector/helpers.d.ts +14 -0
  225. package/batteries/vector/helpers.mjs +13 -0
  226. package/batteries/vector/helpers.mjs.map +1 -1
  227. package/batteries/vector/hnswlib/index.d.ts +2 -0
  228. package/batteries/vector/hnswlib.cjs +2 -1
  229. package/batteries/vector/hnswlib.cjs.map +1 -1
  230. package/batteries/vector/hnswlib.mjs +2 -1
  231. package/batteries/vector/hnswlib.mjs.map +1 -1
  232. package/batteries/vector/in_memory/index.d.ts +1 -0
  233. package/batteries/vector/in_memory.cjs +1 -0
  234. package/batteries/vector/in_memory.cjs.map +1 -1
  235. package/batteries/vector/in_memory.mjs +1 -0
  236. package/batteries/vector/in_memory.mjs.map +1 -1
  237. package/batteries/vector/lancedb/index.d.ts +2 -0
  238. package/batteries/vector/lancedb.cjs +2 -1
  239. package/batteries/vector/lancedb.cjs.map +1 -1
  240. package/batteries/vector/lancedb.mjs +2 -1
  241. package/batteries/vector/lancedb.mjs.map +1 -1
  242. package/batteries/vector/mariadb/index.d.ts +2 -0
  243. package/batteries/vector/mariadb.cjs +2 -1
  244. package/batteries/vector/mariadb.cjs.map +1 -1
  245. package/batteries/vector/mariadb.mjs +2 -1
  246. package/batteries/vector/mariadb.mjs.map +1 -1
  247. package/batteries/vector/meilisearch/index.d.ts +2 -0
  248. package/batteries/vector/meilisearch.cjs +2 -1
  249. package/batteries/vector/meilisearch.cjs.map +1 -1
  250. package/batteries/vector/meilisearch.mjs +2 -1
  251. package/batteries/vector/meilisearch.mjs.map +1 -1
  252. package/batteries/vector/migrate.cjs +18 -1
  253. package/batteries/vector/migrate.cjs.map +1 -1
  254. package/batteries/vector/migrate.d.ts +31 -0
  255. package/batteries/vector/migrate.mjs +18 -1
  256. package/batteries/vector/migrate.mjs.map +1 -1
  257. package/batteries/vector/milvus/index.d.ts +5 -0
  258. package/batteries/vector/milvus.cjs +4 -0
  259. package/batteries/vector/milvus.cjs.map +1 -1
  260. package/batteries/vector/milvus.mjs +4 -0
  261. package/batteries/vector/milvus.mjs.map +1 -1
  262. package/batteries/vector/mongodb/index.d.ts +2 -0
  263. package/batteries/vector/mongodb.cjs +2 -1
  264. package/batteries/vector/mongodb.cjs.map +1 -1
  265. package/batteries/vector/mongodb.mjs +2 -1
  266. package/batteries/vector/mongodb.mjs.map +1 -1
  267. package/batteries/vector/neo4j/index.d.ts +2 -0
  268. package/batteries/vector/neo4j.cjs +2 -1
  269. package/batteries/vector/neo4j.cjs.map +1 -1
  270. package/batteries/vector/neo4j.mjs +2 -1
  271. package/batteries/vector/neo4j.mjs.map +1 -1
  272. package/batteries/vector/opensearch/index.d.ts +2 -0
  273. package/batteries/vector/opensearch.cjs +2 -1
  274. package/batteries/vector/opensearch.cjs.map +1 -1
  275. package/batteries/vector/opensearch.mjs +2 -1
  276. package/batteries/vector/opensearch.mjs.map +1 -1
  277. package/batteries/vector/oracle23ai/index.d.ts +2 -0
  278. package/batteries/vector/oracle23ai.cjs +2 -1
  279. package/batteries/vector/oracle23ai.cjs.map +1 -1
  280. package/batteries/vector/oracle23ai.mjs +2 -1
  281. package/batteries/vector/oracle23ai.mjs.map +1 -1
  282. package/batteries/vector/orama/index.d.ts +1 -0
  283. package/batteries/vector/orama.cjs +1 -0
  284. package/batteries/vector/orama.cjs.map +1 -1
  285. package/batteries/vector/orama.mjs +1 -0
  286. package/batteries/vector/orama.mjs.map +1 -1
  287. package/batteries/vector/pgvector/index.d.ts +9 -2
  288. package/batteries/vector/pgvector.cjs +4 -0
  289. package/batteries/vector/pgvector.cjs.map +1 -1
  290. package/batteries/vector/pgvector.mjs +4 -0
  291. package/batteries/vector/pgvector.mjs.map +1 -1
  292. package/batteries/vector/pinecone/index.d.ts +5 -0
  293. package/batteries/vector/pinecone.cjs +3 -1
  294. package/batteries/vector/pinecone.cjs.map +1 -1
  295. package/batteries/vector/pinecone.mjs +3 -1
  296. package/batteries/vector/pinecone.mjs.map +1 -1
  297. package/batteries/vector/plan.d.ts +27 -0
  298. package/batteries/vector/qdrant/index.d.ts +5 -0
  299. package/batteries/vector/qdrant.cjs +4 -0
  300. package/batteries/vector/qdrant.cjs.map +1 -1
  301. package/batteries/vector/qdrant.mjs +4 -0
  302. package/batteries/vector/qdrant.mjs.map +1 -1
  303. package/batteries/vector/redis/index.d.ts +2 -0
  304. package/batteries/vector/redis.cjs +2 -1
  305. package/batteries/vector/redis.cjs.map +1 -1
  306. package/batteries/vector/redis.mjs +2 -1
  307. package/batteries/vector/redis.mjs.map +1 -1
  308. package/batteries/vector/retrievable.cjs +9 -1
  309. package/batteries/vector/retrievable.cjs.map +1 -1
  310. package/batteries/vector/retrievable.mjs +9 -1
  311. package/batteries/vector/retrievable.mjs.map +1 -1
  312. package/batteries/vector/retrievable_glue.d.ts +21 -0
  313. package/batteries/vector/s3vectors/index.d.ts +2 -0
  314. package/batteries/vector/s3vectors.cjs +2 -1
  315. package/batteries/vector/s3vectors.cjs.map +1 -1
  316. package/batteries/vector/s3vectors.mjs +2 -1
  317. package/batteries/vector/s3vectors.mjs.map +1 -1
  318. package/batteries/vector/schema.cjs +28 -0
  319. package/batteries/vector/schema.cjs.map +1 -1
  320. package/batteries/vector/schema.d.ts +39 -0
  321. package/batteries/vector/schema.mjs +28 -0
  322. package/batteries/vector/schema.mjs.map +1 -1
  323. package/batteries/vector/solr/index.d.ts +2 -0
  324. package/batteries/vector/solr.cjs +2 -1
  325. package/batteries/vector/solr.cjs.map +1 -1
  326. package/batteries/vector/solr.mjs +2 -1
  327. package/batteries/vector/solr.mjs.map +1 -1
  328. package/batteries/vector/sqlite_vec/index.d.ts +6 -3
  329. package/batteries/vector/sqlite_vec.cjs +2 -0
  330. package/batteries/vector/sqlite_vec.cjs.map +1 -1
  331. package/batteries/vector/sqlite_vec.mjs +2 -0
  332. package/batteries/vector/sqlite_vec.mjs.map +1 -1
  333. package/batteries/vector/surrealdb/index.d.ts +2 -0
  334. package/batteries/vector/surrealdb.cjs +2 -1
  335. package/batteries/vector/surrealdb.cjs.map +1 -1
  336. package/batteries/vector/surrealdb.mjs +2 -1
  337. package/batteries/vector/surrealdb.mjs.map +1 -1
  338. package/batteries/vector/types.d.ts +27 -0
  339. package/batteries/vector/typesense/index.d.ts +2 -0
  340. package/batteries/vector/typesense.cjs +2 -1
  341. package/batteries/vector/typesense.cjs.map +1 -1
  342. package/batteries/vector/typesense.mjs +2 -1
  343. package/batteries/vector/typesense.mjs.map +1 -1
  344. package/batteries/vector/validation.cjs +14 -0
  345. package/batteries/vector/validation.cjs.map +1 -1
  346. package/batteries/vector/validation.d.ts +14 -0
  347. package/batteries/vector/validation.mjs +14 -0
  348. package/batteries/vector/validation.mjs.map +1 -1
  349. package/batteries/vector/vector_store_constructor.cjs +1 -1
  350. package/batteries/vector/vector_store_constructor.cjs.map +1 -1
  351. package/batteries/vector/vector_store_constructor.d.ts +1 -1
  352. package/batteries/vector/vector_store_constructor.mjs +1 -1
  353. package/batteries/vector/vector_store_constructor.mjs.map +1 -1
  354. package/batteries/vector/vespa/index.d.ts +2 -0
  355. package/batteries/vector/vespa.cjs +2 -1
  356. package/batteries/vector/vespa.cjs.map +1 -1
  357. package/batteries/vector/vespa.mjs +2 -1
  358. package/batteries/vector/vespa.mjs.map +1 -1
  359. package/batteries/vector/weaviate/index.d.ts +2 -0
  360. package/batteries/vector/weaviate.cjs +2 -1
  361. package/batteries/vector/weaviate.cjs.map +1 -1
  362. package/batteries/vector/weaviate.mjs +2 -1
  363. package/batteries/vector/weaviate.mjs.map +1 -1
  364. package/batteries.cjs +46 -28
  365. package/batteries.mjs +10 -5
  366. package/{common-BT0nfCi9.mjs → common-DYDUi99O.mjs} +9 -9
  367. package/common-DYDUi99O.mjs.map +1 -0
  368. package/{common-Cj8TaQ9U.js → common-DZl3ADJs.js} +9 -9
  369. package/common-DZl3ADJs.js.map +1 -0
  370. package/common.cjs +7 -7
  371. package/common.d.ts +1 -1
  372. package/common.mjs +7 -7
  373. package/{dispatch_runner-DPcS7Y_M.mjs → dispatch_runner--ZhdDWRZ.mjs} +27 -5
  374. package/{dispatch_runner-DPcS7Y_M.mjs.map → dispatch_runner--ZhdDWRZ.mjs.map} +1 -1
  375. package/{dispatch_runner-BHBNupqp.js → dispatch_runner-nHDKkxye.js} +27 -5
  376. package/{dispatch_runner-BHBNupqp.js.map → dispatch_runner-nHDKkxye.js.map} +1 -1
  377. package/dispatch_runner.cjs +1 -1
  378. package/dispatch_runner.d.ts +1 -1
  379. package/dispatch_runner.mjs +1 -1
  380. package/eslint/rules/artifact_tool_forbids_artifact_constructor.cjs +1 -0
  381. package/eslint/rules/artifact_tool_forbids_artifact_constructor.cjs.map +1 -1
  382. package/eslint/rules/artifact_tool_forbids_artifact_constructor.d.ts +1 -0
  383. package/eslint/rules/artifact_tool_forbids_artifact_constructor.mjs +1 -0
  384. package/eslint/rules/artifact_tool_forbids_artifact_constructor.mjs.map +1 -1
  385. package/eslint/rules/no_model_in_tool_handler.cjs +1 -0
  386. package/eslint/rules/no_model_in_tool_handler.cjs.map +1 -1
  387. package/eslint/rules/no_model_in_tool_handler.d.ts +1 -0
  388. package/eslint/rules/no_model_in_tool_handler.mjs +1 -0
  389. package/eslint/rules/no_model_in_tool_handler.mjs.map +1 -1
  390. package/eslint/rules/require_validator_any_required.cjs +1 -0
  391. package/eslint/rules/require_validator_any_required.cjs.map +1 -1
  392. package/eslint/rules/require_validator_any_required.d.ts +1 -0
  393. package/eslint/rules/require_validator_any_required.mjs +1 -0
  394. package/eslint/rules/require_validator_any_required.mjs.map +1 -1
  395. package/eslint/rules/thought_payload_requires_replay_tag.cjs +1 -0
  396. package/eslint/rules/thought_payload_requires_replay_tag.cjs.map +1 -1
  397. package/eslint/rules/thought_payload_requires_replay_tag.d.ts +1 -0
  398. package/eslint/rules/thought_payload_requires_replay_tag.mjs +1 -0
  399. package/eslint/rules/thought_payload_requires_replay_tag.mjs.map +1 -1
  400. package/eslint/rules/token_encoding_requires_context_window.cjs +1 -0
  401. package/eslint/rules/token_encoding_requires_context_window.cjs.map +1 -1
  402. package/eslint/rules/token_encoding_requires_context_window.d.ts +1 -0
  403. package/eslint/rules/token_encoding_requires_context_window.mjs +1 -0
  404. package/eslint/rules/token_encoding_requires_context_window.mjs.map +1 -1
  405. package/eslint.cjs +1 -1
  406. package/eslint.mjs +1 -1
  407. package/{exceptions-BeWH2FwP.mjs → exceptions-BDhN0Xzr.mjs} +3 -2
  408. package/exceptions-BDhN0Xzr.mjs.map +1 -0
  409. package/{exceptions-CitH5wZI.js → exceptions-BRXrUKiW.js} +3 -2
  410. package/exceptions-BRXrUKiW.js.map +1 -0
  411. package/exceptions.cjs +2 -2
  412. package/exceptions.mjs +2 -2
  413. package/factories.cjs +1 -1
  414. package/factories.mjs +1 -1
  415. package/forge.cjs +4 -4
  416. package/forge.d.ts +1 -1
  417. package/forge.mjs +4 -4
  418. package/guards.cjs +9 -9
  419. package/guards.mjs +9 -9
  420. package/helpers-DSTFxTiC.js +497 -0
  421. package/helpers-DSTFxTiC.js.map +1 -0
  422. package/helpers-xhrQbMAG.mjs +306 -0
  423. package/helpers-xhrQbMAG.mjs.map +1 -0
  424. package/index.cjs +13 -13
  425. package/index.mjs +13 -13
  426. package/lib/classes/base_exception.d.ts +1 -0
  427. package/lib/classes/media.d.ts +10 -0
  428. package/lib/classes/retrievable.d.ts +1 -1
  429. package/lib/classes/spooled_json_artifact.d.ts +1 -1
  430. package/lib/classes/spooled_markdown_artifact.d.ts +1 -0
  431. package/lib/classes/tokenizable.d.ts +3 -0
  432. package/lib/classes/tool.d.ts +8 -0
  433. package/lib/classes/turn_gate.d.ts +6 -0
  434. package/lib/dispatch_runner.d.ts +4 -32
  435. package/lib/helpers/bignum.cjs +82 -0
  436. package/lib/helpers/bignum.cjs.map +1 -0
  437. package/lib/helpers/bignum.d.ts +52 -0
  438. package/lib/helpers/bignum.mjs +74 -0
  439. package/lib/helpers/bignum.mjs.map +1 -0
  440. package/lib/turn_runner.d.ts +1 -1
  441. package/lib/types/dispatch_runner.d.ts +83 -0
  442. package/lib/utils/exceptions.d.ts +1 -1
  443. package/lib/utils/retry.cjs.map +1 -1
  444. package/lib/utils/retry.d.ts +2 -0
  445. package/lib/utils/retry.mjs.map +1 -1
  446. package/mcp/adk-docs-corpus.json +1 -1
  447. package/package.json +264 -224
  448. package/{runtime-j92CNi5z.mjs → runtime-Bz5zA8wc.mjs} +2 -2
  449. package/{runtime-j92CNi5z.mjs.map → runtime-Bz5zA8wc.mjs.map} +1 -1
  450. package/{runtime-MFFcJrRv.js → runtime-DslE1aBw.js} +2 -2
  451. package/{runtime-MFFcJrRv.js.map → runtime-DslE1aBw.js.map} +1 -1
  452. package/searxng-Bkrwhwhw.js +269 -0
  453. package/searxng-Bkrwhwhw.js.map +1 -0
  454. package/searxng-CyA-nEu5.mjs +257 -0
  455. package/searxng-CyA-nEu5.mjs.map +1 -0
  456. package/skills/adk-assembly/SKILL.md +2 -2
  457. package/{spooled_artifact-CHoZgWwI.mjs → spooled_artifact-7eePq7JA.mjs} +5 -5
  458. package/{spooled_artifact-CHoZgWwI.mjs.map → spooled_artifact-7eePq7JA.mjs.map} +1 -1
  459. package/{spooled_artifact-BTq6Nzfy.js → spooled_artifact-DX8LLyUX.js} +5 -5
  460. package/{spooled_artifact-BTq6Nzfy.js.map → spooled_artifact-DX8LLyUX.js.map} +1 -1
  461. package/spooled_artifact.cjs +2 -2
  462. package/spooled_artifact.mjs +2 -2
  463. package/{spooled_markdown_artifact-CALSDxIx.js → spooled_markdown_artifact-ClX72lek.js} +4 -4
  464. package/spooled_markdown_artifact-ClX72lek.js.map +1 -0
  465. package/{spooled_markdown_artifact-Ci5UL7l4.mjs → spooled_markdown_artifact-wkrBF3oX.mjs} +4 -4
  466. package/spooled_markdown_artifact-wkrBF3oX.mjs.map +1 -0
  467. package/{thought-D34QQZZ9.mjs → thought-B_vxAiKU.mjs} +5 -5
  468. package/{thought-D34QQZZ9.mjs.map → thought-B_vxAiKU.mjs.map} +1 -1
  469. package/{thought-BbwhJ1wb.js → thought-DLwpF7MI.js} +5 -5
  470. package/{thought-BbwhJ1wb.js.map → thought-DLwpF7MI.js.map} +1 -1
  471. package/{tool-CVyZkFC7.js → tool-D5WGVIcI.js} +4 -4
  472. package/{tool-CVyZkFC7.js.map → tool-D5WGVIcI.js.map} +1 -1
  473. package/{tool-CMhaDRNd.mjs → tool-wMYMVl60.mjs} +4 -4
  474. package/{tool-CMhaDRNd.mjs.map → tool-wMYMVl60.mjs.map} +1 -1
  475. package/{tool_call-CV5qVNlb.mjs → tool_call-B4-_-vjG.mjs} +5 -5
  476. package/tool_call-B4-_-vjG.mjs.map +1 -0
  477. package/{tool_call-Db68hB7y.js → tool_call-DixVlW40.js} +5 -5
  478. package/tool_call-DixVlW40.js.map +1 -0
  479. package/{tool_registry-D1pSSlsd.mjs → tool_registry-791Vrjtf.mjs} +4 -3
  480. package/tool_registry-791Vrjtf.mjs.map +1 -0
  481. package/{tool_registry-DYUYqXvo.js → tool_registry-CKJPze3j.js} +4 -3
  482. package/tool_registry-CKJPze3j.js.map +1 -0
  483. package/{turn_runner-DqWHNP80.js → turn_runner-HXImLGIn.js} +7 -7
  484. package/turn_runner-HXImLGIn.js.map +1 -0
  485. package/{turn_runner-fg1Wc3dK.mjs → turn_runner-ZyYO-Kti.mjs} +7 -7
  486. package/turn_runner-ZyYO-Kti.mjs.map +1 -0
  487. package/turn_runner.cjs +1 -1
  488. package/turn_runner.mjs +1 -1
  489. package/types.d.ts +1 -1
  490. package/common-BT0nfCi9.mjs.map +0 -1
  491. package/common-Cj8TaQ9U.js.map +0 -1
  492. package/exceptions-BeWH2FwP.mjs.map +0 -1
  493. package/exceptions-CitH5wZI.js.map +0 -1
  494. package/spooled_markdown_artifact-CALSDxIx.js.map +0 -1
  495. package/spooled_markdown_artifact-Ci5UL7l4.mjs.map +0 -1
  496. package/tool_call-CV5qVNlb.mjs.map +0 -1
  497. package/tool_call-Db68hB7y.js.map +0 -1
  498. package/tool_registry-D1pSSlsd.mjs.map +0 -1
  499. package/tool_registry-DYUYqXvo.js.map +0 -1
  500. package/turn_runner-DqWHNP80.js.map +0 -1
  501. package/turn_runner-fg1Wc3dK.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"pgvector.cjs","names":["#opts","#_pool","#_externalPool","#_txClient"],"sources":["../../../src/batteries/vector/pgvector/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/pgvector\n */\n\nimport { normalizeScore } from '../helpers'\nimport { validateRecords } from '../validation'\nimport { BaseVectorStore, CallableVectorStore } from '../contract'\nimport { isFilterCondition, isRawFilter, isFilterGroup } from '../filters'\nimport {\n E_VECTOR_STORE_DRIVER_UNAVAILABLE,\n E_VECTOR_STORE_CONNECTION_FAILED,\n E_VECTOR_STORE_COLLECTION_FAILED,\n E_VECTOR_STORE_UPSERT_FAILED,\n E_VECTOR_STORE_SEARCH_FAILED,\n E_VECTOR_STORE_DELETE_FAILED,\n E_VECTOR_STORE_DIMENSION_MISMATCH,\n E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR,\n E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n} from '../exceptions'\nimport type { VectorFilter } from '../filters'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from '../types'\n\ninterface PgVectorOptions extends BaseVectorStoreOptions {\n connection?:\n | string\n | {\n connectionString?: string\n host?: string\n port?: number\n user?: string\n password?: string\n database?: string\n }\n pool?: any\n}\n\ninterface PGClient {\n query: (sql: string, params?: unknown[]) => Promise<{ rows: any[] }>\n release?: () => void\n}\n\ntype PoolOrClient = any\n\nconst METRIC_TO_OPERATOR: Record<string, { op: string; opclass: string }> = {\n cosine: { op: '<=>', opclass: 'vector_cosine_ops' },\n dot: { op: '<#>', opclass: 'vector_ip_ops' },\n euclidean: { op: '<->', opclass: 'vector_l2_ops' },\n}\n\nexport const translatePgFilter = (filter: VectorFilter): { sql: string; params: unknown[] } => {\n const params: unknown[] = []\n\n const walk = (f: VectorFilter): string => {\n if (isFilterCondition(f)) {\n const { field, op, value } = f\n\n if (op === 'exists') {\n const val = value === undefined || value === true\n return val ? `metadata ? '${field}'` : `NOT (metadata ? '${field}')`\n }\n\n if (op === 'contains') {\n params.push(JSON.stringify(value))\n return `metadata->>'${field}' @> $${params.length}::jsonb`\n }\n\n if (op === 'in' || op === 'nin') {\n params.push(Array.isArray(value) ? value : [value])\n const not = op === 'nin' ? 'NOT ' : ''\n return `${not}(metadata->>'${field}' = ANY($${params.length}))`\n }\n\n if (op === 'eq') {\n params.push(value)\n return `metadata->>'${field}' = $${params.length}`\n }\n\n if (op === 'ne') {\n params.push(value)\n return `metadata->>'${field}' IS DISTINCT FROM $${params.length}`\n }\n\n if (['gt', 'gte', 'lt', 'lte'].includes(op)) {\n params.push(Number(value))\n const opMap: Record<string, string> = { gt: '>', gte: '>=', lt: '<', lte: '<=' }\n return `(metadata->>'${field}')::numeric ${opMap[op]} $${params.length}`\n }\n\n throw new Error(`Unsupported filter operator: ${op}`)\n }\n\n if (isRawFilter(f)) {\n const { $dialect, $raw, $bindings } = f\n\n if (typeof $raw === 'string') {\n if ($dialect !== 'sql' && $dialect !== 'pgvector') {\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['pgvector', String($dialect)])\n }\n } else if ($raw !== undefined) {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['raw-sql', 'pgvector'])\n }\n\n const rawStr = typeof $raw === 'string' ? $raw : String($raw)\n const bindingCount = (rawStr.match(/\\?/g) || []).length\n\n if ($bindings && $bindings.length !== bindingCount) {\n throw new Error(\n `Raw fragment placeholder count (${bindingCount}) does not match bindings length (${$bindings?.length || 0})`\n )\n }\n\n if ($bindings && $bindings.length > 0) {\n for (const $binding of $bindings) {\n params.push($binding)\n }\n return rawStr.replace(/\\?/g, () => `$${params.length}`)\n }\n\n return rawStr\n }\n\n if (isFilterGroup(f)) {\n const { and, or, not } = f\n\n if (and !== undefined) {\n const parts: string[] = []\n for (const child of and) {\n parts.push(walk(child))\n }\n return parts.length ? `(${parts.join(' AND ')})` : ''\n }\n\n if (or !== undefined) {\n const parts: string[] = []\n for (const child of or) {\n parts.push(walk(child))\n }\n return parts.length ? `(${parts.join(' OR ')})` : ''\n }\n\n if (not !== undefined) {\n return `NOT (${walk(not)})`\n }\n\n return ''\n }\n\n return ''\n }\n\n return { sql: walk(filter), params }\n}\n\nexport class PgVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: true,\n namedVectors: false,\n rename: true,\n rawSql: true,\n builtInEncoding: false,\n // Strongly consistent: a write is visible on resolve, so the option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n\n #_pool: PoolOrClient | null = null\n #_txClient: PGClient | null = null\n #_externalPool = false\n\n constructor(options: PgVectorOptions) {\n super(options)\n }\n\n get #opts(): PgVectorOptions {\n return this.options as PgVectorOptions\n }\n\n static isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n\n async connect(): Promise<void> {\n if (this.#_pool) {\n return\n }\n\n let pg: any\n\n try {\n pg = await import('pg')\n } catch (e) {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['pg'])\n }\n\n let pool: any\n\n if (this.#opts.pool) {\n pool = this.#opts.pool\n this.#_externalPool = true\n } else {\n const connectionConfig = this.#opts.connection\n if (typeof connectionConfig === 'string') {\n pool = new pg.Pool({ connectionString: connectionConfig })\n } else if (connectionConfig) {\n pool = new pg.Pool(connectionConfig)\n } else {\n pool = new pg.Pool()\n }\n }\n\n try {\n await pool.query('SELECT 1')\n } catch (e: any) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([e?.message ?? String(e)])\n }\n\n try {\n await pool.query('CREATE EXTENSION IF NOT EXISTS vector')\n } catch (e: any) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([e?.message ?? String(e)])\n }\n\n this.#_pool = pool\n }\n\n async close(): Promise<void> {\n if (this.#_txClient) {\n this.#_txClient.release?.()\n this.#_txClient = null\n }\n\n if (this.#_pool && !this.#_externalPool) {\n await this.#_pool.end()\n }\n\n this.#_pool = null\n this.#_txClient = null\n }\n\n get clientOrPool(): PoolOrClient {\n if (this.#_txClient) {\n return this.#_txClient\n }\n if (!this.#_pool) {\n throw new Error('Not connected')\n }\n return this.#_pool\n }\n\n async ensureConnected(): Promise<void> {\n await this.connect()\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n await this.ensureConnected()\n const { collection, vector } = spec\n const { dimensions, metric } = vector\n const tbl = `\"${collection}\"`\n const { opclass } = METRIC_TO_OPERATOR[metric]\n\n const has = await this.hasCollection(collection)\n if (!ifNotExists && has) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['create', 'collection exists'])\n }\n\n const createTable = `\n CREATE TABLE IF NOT EXISTS ${tbl} (\n id TEXT PRIMARY KEY,\n embedding vector(${dimensions}),\n document TEXT,\n metadata JSONB\n )\n `\n const createIndex = `\n CREATE INDEX IF NOT EXISTS \"${collection}_embedding_idx\" ON ${tbl} USING hnsw (embedding ${opclass})\n `\n\n try {\n await this.#_pool!.query(createTable)\n await this.#_pool!.query(createIndex)\n } catch (e: any) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['create', e?.message ?? String(e)])\n }\n }\n\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n await this.ensureConnected()\n const tbl = `\"${collection}\"`\n\n const has = await this.hasCollection(collection)\n if (!has) {\n if (!ifExists) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['drop', 'collection does not exist'])\n }\n return\n }\n\n const dropTbl = `DROP TABLE IF EXISTS ${tbl}`\n try {\n await this.#_pool!.query(dropTbl)\n } catch (e: any) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['drop', e?.message ?? String(e)])\n }\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n await this.ensureConnected()\n const check = `SELECT to_regclass($1) IS NOT NULL AS exists`\n try {\n const res = await this.#_pool!.query(check, [collection])\n return res.rows[0]?.exists === true\n } catch {\n return false\n }\n }\n\n async renameCollection(from: string, to: string): Promise<void> {\n await this.ensureConnected()\n const hasFrom = await this.hasCollection(from)\n if (!hasFrom) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['rename', 'source collection does not exist'])\n }\n\n const hasTo = await this.hasCollection(to)\n if (hasTo) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['rename', 'target collection already exists'])\n }\n\n const rename = `ALTER TABLE \"${from}\" RENAME TO \"${to}\"`\n try {\n await this.#_pool!.query(rename)\n } catch (e: any) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['rename', e?.message ?? String(e)])\n }\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n await this.ensureConnected()\n validateRecords(plan.records)\n\n const collection = plan.collection\n const tbl = `\"${collection}\"`\n const dims = this.#opts.dimensions\n\n const resolvedRows: {\n id: string\n vector: number[]\n document?: string\n metadata?: Record<string, unknown>\n }[] = []\n\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\n if (vector && dims !== undefined && vector.length !== dims) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([dims, vector.length])\n }\n\n resolvedRows.push({\n id: r.id,\n vector: vector ?? [],\n document: r.document,\n metadata: r.metadata as Record<string, unknown> | undefined,\n })\n }\n\n const sql = `\n INSERT INTO ${tbl} (id, embedding, document, metadata)\n VALUES ($1, $2::vector, $3, $4)\n ON CONFLICT (id) DO UPDATE SET\n embedding = $2::vector,\n document = $3,\n metadata = $4\n `\n\n const client = this.clientOrPool\n try {\n for (const r of resolvedRows) {\n const vecStr = '[' + r.vector.join(',') + ']'\n await client.query(sql, [\n r.id,\n vecStr,\n r.document ?? null,\n JSON.stringify(r.metadata ?? {}),\n ])\n }\n } catch (e: any) {\n throw new E_VECTOR_STORE_UPSERT_FAILED([e?.message ?? String(e)])\n }\n }\n\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n await this.ensureConnected()\n const collection = plan.collection\n const tbl = `\"${collection}\"`\n const metric = this.options.metric ?? 'euclidean'\n const { op } = METRIC_TO_OPERATOR[metric]\n\n const filterSql = plan.filter\n ? (() => {\n const { sql, params } = translatePgFilter(plan.filter)\n if (sql) {\n return { sql: ` AND ${sql}`, params }\n }\n return { sql: '', params: [] }\n })()\n : { sql: '', params: [] }\n\n try {\n if (plan.near) {\n let qvec: number[] | undefined\n\n if ('vector' in plan.near) {\n qvec = plan.near.vector\n } else if ('serverText' in plan.near) {\n const [v] = await this.encode([plan.near.serverText], 'query')\n qvec = v\n } else if ('id' in plan.near) {\n const id = plan.near.id\n const vecRes = await this.#_pool!.query(`SELECT embedding FROM ${tbl} WHERE id = $1`, [\n id,\n ])\n if (vecRes.rows[0]?.embedding) {\n const raw = vecRes.rows[0].embedding\n if (typeof raw === 'string') {\n const stripped = raw.replace(/^\\[|\\]$/g, '')\n qvec = stripped.split(',').map((n) => Number.parseFloat(n.trim()))\n }\n }\n }\n\n if (!qvec) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['no query vector provided'])\n }\n\n const vecStr = '[' + qvec.join(',') + ']'\n const sql = `\n SELECT id, document, metadata, embedding, embedding ${op} $1 AS distance\n FROM ${tbl}\n WHERE 1=1 ${filterSql.sql}\n ORDER BY distance\n LIMIT ${plan.topK} OFFSET ${plan.offset ?? 0}\n `\n const { rows } = await this.#_pool!.query(sql, [vecStr, ...filterSql.params])\n\n const results: VectorMatch[] = []\n\n for (const row of rows) {\n let distance = Number(row.distance)\n\n let score: number | undefined\n if (metric === 'dot') {\n const inner = -distance\n score = normalizeScore(inner, 'dot', 'similarity')\n distance = inner\n } else {\n score = normalizeScore(distance, metric, 'distance')\n }\n\n const parsedMeta =\n typeof row.metadata === 'string' ? JSON.parse(row.metadata) : row.metadata\n\n const proj: VectorMatch = {}\n if (plan.projection.id) proj.id = row.id\n if (plan.projection.vector) {\n const rawVec = row.embedding\n if (typeof rawVec === 'string') {\n const stripped = rawVec.replace(/^\\[|\\]$/g, '')\n proj.vector = stripped.split(',').map((n) => Number.parseFloat(n.trim()))\n }\n }\n if (plan.projection.document && row.document !== undefined) proj.document = row.document\n if (plan.projection.metadata && parsedMeta !== undefined) proj.metadata = parsedMeta\n if (score !== undefined) proj.score = score\n\n results.push(proj)\n }\n\n return results\n } else {\n const sql = `\n SELECT id, document, metadata, embedding\n FROM ${tbl}\n WHERE 1=1 ${filterSql.sql}\n LIMIT ${plan.topK} OFFSET ${plan.offset ?? 0}\n `\n const { rows } = await this.#_pool!.query(sql, [...filterSql.params])\n\n const results: VectorMatch[] = []\n\n for (const row of rows) {\n const parsedMeta =\n typeof row.metadata === 'string' ? JSON.parse(row.metadata) : row.metadata\n\n const proj: VectorMatch = {}\n if (plan.projection.id) proj.id = row.id\n if (plan.projection.vector) {\n const vecRes = await this.#_pool!.query(`SELECT embedding FROM ${tbl} WHERE id = $1`, [\n row.id,\n ])\n if (vecRes.rows[0]?.embedding) {\n const rawVec = vecRes.rows[0].embedding\n if (typeof rawVec === 'string') {\n const stripped = rawVec.replace(/^\\[|\\]$/g, '')\n proj.vector = stripped.split(',').map((n) => Number.parseFloat(n.trim()))\n }\n }\n }\n if (plan.projection.document && row.document !== undefined) proj.document = row.document\n if (plan.projection.metadata && parsedMeta !== undefined) proj.metadata = parsedMeta\n\n results.push(proj)\n }\n\n return results\n }\n } catch (e: any) {\n throw new E_VECTOR_STORE_SEARCH_FAILED([e?.message ?? String(e)])\n }\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n await this.ensureConnected()\n const collection = plan.collection\n const tbl = `\"${collection}\"`\n\n try {\n if (plan.ids && plan.ids.length > 0) {\n const sql = `DELETE FROM ${tbl} WHERE id = ANY($1)`\n await this.#_pool!.query(sql, [plan.ids])\n } else if (plan.filter) {\n const { sql, params } = translatePgFilter(plan.filter)\n const whereClause = sql ? ` WHERE ${sql}` : ''\n const delSql = `DELETE FROM ${tbl}${whereClause}`\n await this.#_pool!.query(delSql, params)\n } else {\n await this.#_pool!.query(`TRUNCATE TABLE ${tbl} RESTART IDENTITY`)\n }\n } catch (e: any) {\n throw new E_VECTOR_STORE_DELETE_FAILED([e?.message ?? String(e)])\n }\n }\n\n async transaction(fn: (tx: CallableVectorStore) => Promise<void>): Promise<void> {\n await this.ensureConnected()\n\n const pool = this.#_pool!\n const client = await pool.connect()\n\n try {\n await client.query('BEGIN')\n this.#_txClient = client\n await fn(this.asCallable())\n await client.query('COMMIT')\n } catch (e) {\n await client.query('ROLLBACK')\n throw e\n } finally {\n this.#_txClient = null\n client.release()\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"pgvector.cjs","names":["#opts","#_pool","#_externalPool","#_txClient"],"sources":["../../../src/batteries/vector/pgvector/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/pgvector\n */\n\nimport { normalizeScore } from '../helpers'\nimport { validateRecords } from '../validation'\nimport { BaseVectorStore, CallableVectorStore } from '../contract'\nimport { isFilterCondition, isRawFilter, isFilterGroup } from '../filters'\nimport {\n E_VECTOR_STORE_DRIVER_UNAVAILABLE,\n E_VECTOR_STORE_CONNECTION_FAILED,\n E_VECTOR_STORE_COLLECTION_FAILED,\n E_VECTOR_STORE_UPSERT_FAILED,\n E_VECTOR_STORE_SEARCH_FAILED,\n E_VECTOR_STORE_DELETE_FAILED,\n E_VECTOR_STORE_DIMENSION_MISMATCH,\n E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR,\n E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n} from '../exceptions'\nimport type { VectorFilter } from '../filters'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from '../types'\n\n/** Construction options for {@link PgVectorStore}. */\nexport interface PgVectorStoreOptions extends BaseVectorStoreOptions {\n /** Connection details: a connection string, or a discrete host/port/credentials object. */\n connection?:\n | string\n | {\n connectionString?: string\n host?: string\n port?: number\n user?: string\n password?: string\n database?: string\n }\n /** An existing `pg` Pool/Client to reuse instead of constructing one from `connection`. */\n pool?: any\n}\n\ninterface PGClient {\n query: (sql: string, params?: unknown[]) => Promise<{ rows: any[] }>\n release?: () => void\n}\n\ntype PoolOrClient = any\n\nconst METRIC_TO_OPERATOR: Record<string, { op: string; opclass: string }> = {\n cosine: { op: '<=>', opclass: 'vector_cosine_ops' },\n dot: { op: '<#>', opclass: 'vector_ip_ops' },\n euclidean: { op: '<->', opclass: 'vector_l2_ops' },\n}\n\n/** Translate a neutral {@link VectorFilter} into a parameterized SQL `WHERE` fragment plus its bind params. */\nexport const translatePgFilter = (filter: VectorFilter): { sql: string; params: unknown[] } => {\n const params: unknown[] = []\n\n const walk = (f: VectorFilter): string => {\n if (isFilterCondition(f)) {\n const { field, op, value } = f\n\n if (op === 'exists') {\n const val = value === undefined || value === true\n return val ? `metadata ? '${field}'` : `NOT (metadata ? '${field}')`\n }\n\n if (op === 'contains') {\n params.push(JSON.stringify(value))\n return `metadata->>'${field}' @> $${params.length}::jsonb`\n }\n\n if (op === 'in' || op === 'nin') {\n params.push(Array.isArray(value) ? value : [value])\n const not = op === 'nin' ? 'NOT ' : ''\n return `${not}(metadata->>'${field}' = ANY($${params.length}))`\n }\n\n if (op === 'eq') {\n params.push(value)\n return `metadata->>'${field}' = $${params.length}`\n }\n\n if (op === 'ne') {\n params.push(value)\n return `metadata->>'${field}' IS DISTINCT FROM $${params.length}`\n }\n\n if (['gt', 'gte', 'lt', 'lte'].includes(op)) {\n params.push(Number(value))\n const opMap: Record<string, string> = { gt: '>', gte: '>=', lt: '<', lte: '<=' }\n return `(metadata->>'${field}')::numeric ${opMap[op]} $${params.length}`\n }\n\n throw new Error(`Unsupported filter operator: ${op}`)\n }\n\n if (isRawFilter(f)) {\n const { $dialect, $raw, $bindings } = f\n\n if (typeof $raw === 'string') {\n if ($dialect !== 'sql' && $dialect !== 'pgvector') {\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['pgvector', String($dialect)])\n }\n } else if ($raw !== undefined) {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['raw-sql', 'pgvector'])\n }\n\n const rawStr = typeof $raw === 'string' ? $raw : String($raw)\n const bindingCount = (rawStr.match(/\\?/g) || []).length\n\n if ($bindings && $bindings.length !== bindingCount) {\n throw new Error(\n `Raw fragment placeholder count (${bindingCount}) does not match bindings length (${$bindings?.length || 0})`\n )\n }\n\n if ($bindings && $bindings.length > 0) {\n for (const $binding of $bindings) {\n params.push($binding)\n }\n return rawStr.replace(/\\?/g, () => `$${params.length}`)\n }\n\n return rawStr\n }\n\n if (isFilterGroup(f)) {\n const { and, or, not } = f\n\n if (and !== undefined) {\n const parts: string[] = []\n for (const child of and) {\n parts.push(walk(child))\n }\n return parts.length ? `(${parts.join(' AND ')})` : ''\n }\n\n if (or !== undefined) {\n const parts: string[] = []\n for (const child of or) {\n parts.push(walk(child))\n }\n return parts.length ? `(${parts.join(' OR ')})` : ''\n }\n\n if (not !== undefined) {\n return `NOT (${walk(not)})`\n }\n\n return ''\n }\n\n return ''\n }\n\n return { sql: walk(filter), params }\n}\n\nexport class PgVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: true,\n namedVectors: false,\n rename: true,\n rawSql: true,\n builtInEncoding: false,\n // Strongly consistent: a write is visible on resolve, so the option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n\n #_pool: PoolOrClient | null = null\n #_txClient: PGClient | null = null\n #_externalPool = false\n\n constructor(options: PgVectorStoreOptions) {\n super(options)\n }\n\n get #opts(): PgVectorStoreOptions {\n return this.options as PgVectorStoreOptions\n }\n\n /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */\n static isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n\n async connect(): Promise<void> {\n if (this.#_pool) {\n return\n }\n\n let pg: any\n\n try {\n pg = await import('pg')\n } catch (e) {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['pg'])\n }\n\n let pool: any\n\n if (this.#opts.pool) {\n pool = this.#opts.pool\n this.#_externalPool = true\n } else {\n const connectionConfig = this.#opts.connection\n if (typeof connectionConfig === 'string') {\n pool = new pg.Pool({ connectionString: connectionConfig })\n } else if (connectionConfig) {\n pool = new pg.Pool(connectionConfig)\n } else {\n pool = new pg.Pool()\n }\n }\n\n try {\n await pool.query('SELECT 1')\n } catch (e: any) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([e?.message ?? String(e)])\n }\n\n try {\n await pool.query('CREATE EXTENSION IF NOT EXISTS vector')\n } catch (e: any) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([e?.message ?? String(e)])\n }\n\n this.#_pool = pool\n }\n\n async close(): Promise<void> {\n if (this.#_txClient) {\n this.#_txClient.release?.()\n this.#_txClient = null\n }\n\n if (this.#_pool && !this.#_externalPool) {\n await this.#_pool.end()\n }\n\n this.#_pool = null\n this.#_txClient = null\n }\n\n /** The active transaction client when inside a transaction, otherwise the connection pool. */\n get clientOrPool(): PoolOrClient {\n if (this.#_txClient) {\n return this.#_txClient\n }\n if (!this.#_pool) {\n throw new Error('Not connected')\n }\n return this.#_pool\n }\n\n /** Ensure the pool is connected (idempotent); a no-op once connected. */\n async ensureConnected(): Promise<void> {\n await this.connect()\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n await this.ensureConnected()\n const { collection, vector } = spec\n const { dimensions, metric } = vector\n const tbl = `\"${collection}\"`\n const { opclass } = METRIC_TO_OPERATOR[metric]\n\n const has = await this.hasCollection(collection)\n if (!ifNotExists && has) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['create', 'collection exists'])\n }\n\n const createTable = `\n CREATE TABLE IF NOT EXISTS ${tbl} (\n id TEXT PRIMARY KEY,\n embedding vector(${dimensions}),\n document TEXT,\n metadata JSONB\n )\n `\n const createIndex = `\n CREATE INDEX IF NOT EXISTS \"${collection}_embedding_idx\" ON ${tbl} USING hnsw (embedding ${opclass})\n `\n\n try {\n await this.#_pool!.query(createTable)\n await this.#_pool!.query(createIndex)\n } catch (e: any) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['create', e?.message ?? String(e)])\n }\n }\n\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n await this.ensureConnected()\n const tbl = `\"${collection}\"`\n\n const has = await this.hasCollection(collection)\n if (!has) {\n if (!ifExists) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['drop', 'collection does not exist'])\n }\n return\n }\n\n const dropTbl = `DROP TABLE IF EXISTS ${tbl}`\n try {\n await this.#_pool!.query(dropTbl)\n } catch (e: any) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['drop', e?.message ?? String(e)])\n }\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n await this.ensureConnected()\n const check = `SELECT to_regclass($1) IS NOT NULL AS exists`\n try {\n const res = await this.#_pool!.query(check, [collection])\n return res.rows[0]?.exists === true\n } catch {\n return false\n }\n }\n\n async renameCollection(from: string, to: string): Promise<void> {\n await this.ensureConnected()\n const hasFrom = await this.hasCollection(from)\n if (!hasFrom) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['rename', 'source collection does not exist'])\n }\n\n const hasTo = await this.hasCollection(to)\n if (hasTo) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['rename', 'target collection already exists'])\n }\n\n const rename = `ALTER TABLE \"${from}\" RENAME TO \"${to}\"`\n try {\n await this.#_pool!.query(rename)\n } catch (e: any) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['rename', e?.message ?? String(e)])\n }\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n await this.ensureConnected()\n validateRecords(plan.records)\n\n const collection = plan.collection\n const tbl = `\"${collection}\"`\n const dims = this.#opts.dimensions\n\n const resolvedRows: {\n id: string\n vector: number[]\n document?: string\n metadata?: Record<string, unknown>\n }[] = []\n\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\n if (vector && dims !== undefined && vector.length !== dims) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([dims, vector.length])\n }\n\n resolvedRows.push({\n id: r.id,\n vector: vector ?? [],\n document: r.document,\n metadata: r.metadata as Record<string, unknown> | undefined,\n })\n }\n\n const sql = `\n INSERT INTO ${tbl} (id, embedding, document, metadata)\n VALUES ($1, $2::vector, $3, $4)\n ON CONFLICT (id) DO UPDATE SET\n embedding = $2::vector,\n document = $3,\n metadata = $4\n `\n\n const client = this.clientOrPool\n try {\n for (const r of resolvedRows) {\n const vecStr = '[' + r.vector.join(',') + ']'\n await client.query(sql, [\n r.id,\n vecStr,\n r.document ?? null,\n JSON.stringify(r.metadata ?? {}),\n ])\n }\n } catch (e: any) {\n throw new E_VECTOR_STORE_UPSERT_FAILED([e?.message ?? String(e)])\n }\n }\n\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n await this.ensureConnected()\n const collection = plan.collection\n const tbl = `\"${collection}\"`\n const metric = this.options.metric ?? 'euclidean'\n const { op } = METRIC_TO_OPERATOR[metric]\n\n const filterSql = plan.filter\n ? (() => {\n const { sql, params } = translatePgFilter(plan.filter)\n if (sql) {\n return { sql: ` AND ${sql}`, params }\n }\n return { sql: '', params: [] }\n })()\n : { sql: '', params: [] }\n\n try {\n if (plan.near) {\n let qvec: number[] | undefined\n\n if ('vector' in plan.near) {\n qvec = plan.near.vector\n } else if ('serverText' in plan.near) {\n const [v] = await this.encode([plan.near.serverText], 'query')\n qvec = v\n } else if ('id' in plan.near) {\n const id = plan.near.id\n const vecRes = await this.#_pool!.query(`SELECT embedding FROM ${tbl} WHERE id = $1`, [\n id,\n ])\n if (vecRes.rows[0]?.embedding) {\n const raw = vecRes.rows[0].embedding\n if (typeof raw === 'string') {\n const stripped = raw.replace(/^\\[|\\]$/g, '')\n qvec = stripped.split(',').map((n) => Number.parseFloat(n.trim()))\n }\n }\n }\n\n if (!qvec) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['no query vector provided'])\n }\n\n const vecStr = '[' + qvec.join(',') + ']'\n const sql = `\n SELECT id, document, metadata, embedding, embedding ${op} $1 AS distance\n FROM ${tbl}\n WHERE 1=1 ${filterSql.sql}\n ORDER BY distance\n LIMIT ${plan.topK} OFFSET ${plan.offset ?? 0}\n `\n const { rows } = await this.#_pool!.query(sql, [vecStr, ...filterSql.params])\n\n const results: VectorMatch[] = []\n\n for (const row of rows) {\n let distance = Number(row.distance)\n\n let score: number | undefined\n if (metric === 'dot') {\n const inner = -distance\n score = normalizeScore(inner, 'dot', 'similarity')\n distance = inner\n } else {\n score = normalizeScore(distance, metric, 'distance')\n }\n\n const parsedMeta =\n typeof row.metadata === 'string' ? JSON.parse(row.metadata) : row.metadata\n\n const proj: VectorMatch = {}\n if (plan.projection.id) proj.id = row.id\n if (plan.projection.vector) {\n const rawVec = row.embedding\n if (typeof rawVec === 'string') {\n const stripped = rawVec.replace(/^\\[|\\]$/g, '')\n proj.vector = stripped.split(',').map((n) => Number.parseFloat(n.trim()))\n }\n }\n if (plan.projection.document && row.document !== undefined) proj.document = row.document\n if (plan.projection.metadata && parsedMeta !== undefined) proj.metadata = parsedMeta\n if (score !== undefined) proj.score = score\n\n results.push(proj)\n }\n\n return results\n } else {\n const sql = `\n SELECT id, document, metadata, embedding\n FROM ${tbl}\n WHERE 1=1 ${filterSql.sql}\n LIMIT ${plan.topK} OFFSET ${plan.offset ?? 0}\n `\n const { rows } = await this.#_pool!.query(sql, [...filterSql.params])\n\n const results: VectorMatch[] = []\n\n for (const row of rows) {\n const parsedMeta =\n typeof row.metadata === 'string' ? JSON.parse(row.metadata) : row.metadata\n\n const proj: VectorMatch = {}\n if (plan.projection.id) proj.id = row.id\n if (plan.projection.vector) {\n const vecRes = await this.#_pool!.query(`SELECT embedding FROM ${tbl} WHERE id = $1`, [\n row.id,\n ])\n if (vecRes.rows[0]?.embedding) {\n const rawVec = vecRes.rows[0].embedding\n if (typeof rawVec === 'string') {\n const stripped = rawVec.replace(/^\\[|\\]$/g, '')\n proj.vector = stripped.split(',').map((n) => Number.parseFloat(n.trim()))\n }\n }\n }\n if (plan.projection.document && row.document !== undefined) proj.document = row.document\n if (plan.projection.metadata && parsedMeta !== undefined) proj.metadata = parsedMeta\n\n results.push(proj)\n }\n\n return results\n }\n } catch (e: any) {\n throw new E_VECTOR_STORE_SEARCH_FAILED([e?.message ?? String(e)])\n }\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n await this.ensureConnected()\n const collection = plan.collection\n const tbl = `\"${collection}\"`\n\n try {\n if (plan.ids && plan.ids.length > 0) {\n const sql = `DELETE FROM ${tbl} WHERE id = ANY($1)`\n await this.#_pool!.query(sql, [plan.ids])\n } else if (plan.filter) {\n const { sql, params } = translatePgFilter(plan.filter)\n const whereClause = sql ? ` WHERE ${sql}` : ''\n const delSql = `DELETE FROM ${tbl}${whereClause}`\n await this.#_pool!.query(delSql, params)\n } else {\n await this.#_pool!.query(`TRUNCATE TABLE ${tbl} RESTART IDENTITY`)\n }\n } catch (e: any) {\n throw new E_VECTOR_STORE_DELETE_FAILED([e?.message ?? String(e)])\n }\n }\n\n async transaction(fn: (tx: CallableVectorStore) => Promise<void>): Promise<void> {\n await this.ensureConnected()\n\n const pool = this.#_pool!\n const client = await pool.connect()\n\n try {\n await client.query('BEGIN')\n this.#_txClient = client\n await fn(this.asCallable())\n await client.query('COMMIT')\n } catch (e) {\n await client.query('ROLLBACK')\n throw e\n } finally {\n this.#_txClient = null\n client.release()\n }\n }\n}\n"],"mappings":"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"}
@@ -21,6 +21,7 @@ var METRIC_TO_OPERATOR = {
21
21
  opclass: "vector_l2_ops"
22
22
  }
23
23
  };
24
+ /** Translate a neutral {@link VectorFilter} into a parameterized SQL `WHERE` fragment plus its bind params. */
24
25
  var translatePgFilter = (filter) => {
25
26
  const params = [];
26
27
  const walk = (f) => {
@@ -117,6 +118,7 @@ var PgVectorStore = class extends BaseVectorStore {
117
118
  get #opts() {
118
119
  return this.options;
119
120
  }
121
+ /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
120
122
  static isAvailable() {
121
123
  return typeof process !== "undefined";
122
124
  }
@@ -162,11 +164,13 @@ var PgVectorStore = class extends BaseVectorStore {
162
164
  this.#_pool = null;
163
165
  this.#_txClient = null;
164
166
  }
167
+ /** The active transaction client when inside a transaction, otherwise the connection pool. */
165
168
  get clientOrPool() {
166
169
  if (this.#_txClient) return this.#_txClient;
167
170
  if (!this.#_pool) throw new Error("Not connected");
168
171
  return this.#_pool;
169
172
  }
173
+ /** Ensure the pool is connected (idempotent); a no-op once connected. */
170
174
  async ensureConnected() {
171
175
  await this.connect();
172
176
  }
@@ -1 +1 @@
1
- {"version":3,"file":"pgvector.mjs","names":["#opts","#_pool","#_externalPool","#_txClient"],"sources":["../../../src/batteries/vector/pgvector/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/pgvector\n */\n\nimport { normalizeScore } from '../helpers'\nimport { validateRecords } from '../validation'\nimport { BaseVectorStore, CallableVectorStore } from '../contract'\nimport { isFilterCondition, isRawFilter, isFilterGroup } from '../filters'\nimport {\n E_VECTOR_STORE_DRIVER_UNAVAILABLE,\n E_VECTOR_STORE_CONNECTION_FAILED,\n E_VECTOR_STORE_COLLECTION_FAILED,\n E_VECTOR_STORE_UPSERT_FAILED,\n E_VECTOR_STORE_SEARCH_FAILED,\n E_VECTOR_STORE_DELETE_FAILED,\n E_VECTOR_STORE_DIMENSION_MISMATCH,\n E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR,\n E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n} from '../exceptions'\nimport type { VectorFilter } from '../filters'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from '../types'\n\ninterface PgVectorOptions extends BaseVectorStoreOptions {\n connection?:\n | string\n | {\n connectionString?: string\n host?: string\n port?: number\n user?: string\n password?: string\n database?: string\n }\n pool?: any\n}\n\ninterface PGClient {\n query: (sql: string, params?: unknown[]) => Promise<{ rows: any[] }>\n release?: () => void\n}\n\ntype PoolOrClient = any\n\nconst METRIC_TO_OPERATOR: Record<string, { op: string; opclass: string }> = {\n cosine: { op: '<=>', opclass: 'vector_cosine_ops' },\n dot: { op: '<#>', opclass: 'vector_ip_ops' },\n euclidean: { op: '<->', opclass: 'vector_l2_ops' },\n}\n\nexport const translatePgFilter = (filter: VectorFilter): { sql: string; params: unknown[] } => {\n const params: unknown[] = []\n\n const walk = (f: VectorFilter): string => {\n if (isFilterCondition(f)) {\n const { field, op, value } = f\n\n if (op === 'exists') {\n const val = value === undefined || value === true\n return val ? `metadata ? '${field}'` : `NOT (metadata ? '${field}')`\n }\n\n if (op === 'contains') {\n params.push(JSON.stringify(value))\n return `metadata->>'${field}' @> $${params.length}::jsonb`\n }\n\n if (op === 'in' || op === 'nin') {\n params.push(Array.isArray(value) ? value : [value])\n const not = op === 'nin' ? 'NOT ' : ''\n return `${not}(metadata->>'${field}' = ANY($${params.length}))`\n }\n\n if (op === 'eq') {\n params.push(value)\n return `metadata->>'${field}' = $${params.length}`\n }\n\n if (op === 'ne') {\n params.push(value)\n return `metadata->>'${field}' IS DISTINCT FROM $${params.length}`\n }\n\n if (['gt', 'gte', 'lt', 'lte'].includes(op)) {\n params.push(Number(value))\n const opMap: Record<string, string> = { gt: '>', gte: '>=', lt: '<', lte: '<=' }\n return `(metadata->>'${field}')::numeric ${opMap[op]} $${params.length}`\n }\n\n throw new Error(`Unsupported filter operator: ${op}`)\n }\n\n if (isRawFilter(f)) {\n const { $dialect, $raw, $bindings } = f\n\n if (typeof $raw === 'string') {\n if ($dialect !== 'sql' && $dialect !== 'pgvector') {\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['pgvector', String($dialect)])\n }\n } else if ($raw !== undefined) {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['raw-sql', 'pgvector'])\n }\n\n const rawStr = typeof $raw === 'string' ? $raw : String($raw)\n const bindingCount = (rawStr.match(/\\?/g) || []).length\n\n if ($bindings && $bindings.length !== bindingCount) {\n throw new Error(\n `Raw fragment placeholder count (${bindingCount}) does not match bindings length (${$bindings?.length || 0})`\n )\n }\n\n if ($bindings && $bindings.length > 0) {\n for (const $binding of $bindings) {\n params.push($binding)\n }\n return rawStr.replace(/\\?/g, () => `$${params.length}`)\n }\n\n return rawStr\n }\n\n if (isFilterGroup(f)) {\n const { and, or, not } = f\n\n if (and !== undefined) {\n const parts: string[] = []\n for (const child of and) {\n parts.push(walk(child))\n }\n return parts.length ? `(${parts.join(' AND ')})` : ''\n }\n\n if (or !== undefined) {\n const parts: string[] = []\n for (const child of or) {\n parts.push(walk(child))\n }\n return parts.length ? `(${parts.join(' OR ')})` : ''\n }\n\n if (not !== undefined) {\n return `NOT (${walk(not)})`\n }\n\n return ''\n }\n\n return ''\n }\n\n return { sql: walk(filter), params }\n}\n\nexport class PgVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: true,\n namedVectors: false,\n rename: true,\n rawSql: true,\n builtInEncoding: false,\n // Strongly consistent: a write is visible on resolve, so the option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n\n #_pool: PoolOrClient | null = null\n #_txClient: PGClient | null = null\n #_externalPool = false\n\n constructor(options: PgVectorOptions) {\n super(options)\n }\n\n get #opts(): PgVectorOptions {\n return this.options as PgVectorOptions\n }\n\n static isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n\n async connect(): Promise<void> {\n if (this.#_pool) {\n return\n }\n\n let pg: any\n\n try {\n pg = await import('pg')\n } catch (e) {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['pg'])\n }\n\n let pool: any\n\n if (this.#opts.pool) {\n pool = this.#opts.pool\n this.#_externalPool = true\n } else {\n const connectionConfig = this.#opts.connection\n if (typeof connectionConfig === 'string') {\n pool = new pg.Pool({ connectionString: connectionConfig })\n } else if (connectionConfig) {\n pool = new pg.Pool(connectionConfig)\n } else {\n pool = new pg.Pool()\n }\n }\n\n try {\n await pool.query('SELECT 1')\n } catch (e: any) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([e?.message ?? String(e)])\n }\n\n try {\n await pool.query('CREATE EXTENSION IF NOT EXISTS vector')\n } catch (e: any) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([e?.message ?? String(e)])\n }\n\n this.#_pool = pool\n }\n\n async close(): Promise<void> {\n if (this.#_txClient) {\n this.#_txClient.release?.()\n this.#_txClient = null\n }\n\n if (this.#_pool && !this.#_externalPool) {\n await this.#_pool.end()\n }\n\n this.#_pool = null\n this.#_txClient = null\n }\n\n get clientOrPool(): PoolOrClient {\n if (this.#_txClient) {\n return this.#_txClient\n }\n if (!this.#_pool) {\n throw new Error('Not connected')\n }\n return this.#_pool\n }\n\n async ensureConnected(): Promise<void> {\n await this.connect()\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n await this.ensureConnected()\n const { collection, vector } = spec\n const { dimensions, metric } = vector\n const tbl = `\"${collection}\"`\n const { opclass } = METRIC_TO_OPERATOR[metric]\n\n const has = await this.hasCollection(collection)\n if (!ifNotExists && has) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['create', 'collection exists'])\n }\n\n const createTable = `\n CREATE TABLE IF NOT EXISTS ${tbl} (\n id TEXT PRIMARY KEY,\n embedding vector(${dimensions}),\n document TEXT,\n metadata JSONB\n )\n `\n const createIndex = `\n CREATE INDEX IF NOT EXISTS \"${collection}_embedding_idx\" ON ${tbl} USING hnsw (embedding ${opclass})\n `\n\n try {\n await this.#_pool!.query(createTable)\n await this.#_pool!.query(createIndex)\n } catch (e: any) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['create', e?.message ?? String(e)])\n }\n }\n\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n await this.ensureConnected()\n const tbl = `\"${collection}\"`\n\n const has = await this.hasCollection(collection)\n if (!has) {\n if (!ifExists) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['drop', 'collection does not exist'])\n }\n return\n }\n\n const dropTbl = `DROP TABLE IF EXISTS ${tbl}`\n try {\n await this.#_pool!.query(dropTbl)\n } catch (e: any) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['drop', e?.message ?? String(e)])\n }\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n await this.ensureConnected()\n const check = `SELECT to_regclass($1) IS NOT NULL AS exists`\n try {\n const res = await this.#_pool!.query(check, [collection])\n return res.rows[0]?.exists === true\n } catch {\n return false\n }\n }\n\n async renameCollection(from: string, to: string): Promise<void> {\n await this.ensureConnected()\n const hasFrom = await this.hasCollection(from)\n if (!hasFrom) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['rename', 'source collection does not exist'])\n }\n\n const hasTo = await this.hasCollection(to)\n if (hasTo) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['rename', 'target collection already exists'])\n }\n\n const rename = `ALTER TABLE \"${from}\" RENAME TO \"${to}\"`\n try {\n await this.#_pool!.query(rename)\n } catch (e: any) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['rename', e?.message ?? String(e)])\n }\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n await this.ensureConnected()\n validateRecords(plan.records)\n\n const collection = plan.collection\n const tbl = `\"${collection}\"`\n const dims = this.#opts.dimensions\n\n const resolvedRows: {\n id: string\n vector: number[]\n document?: string\n metadata?: Record<string, unknown>\n }[] = []\n\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\n if (vector && dims !== undefined && vector.length !== dims) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([dims, vector.length])\n }\n\n resolvedRows.push({\n id: r.id,\n vector: vector ?? [],\n document: r.document,\n metadata: r.metadata as Record<string, unknown> | undefined,\n })\n }\n\n const sql = `\n INSERT INTO ${tbl} (id, embedding, document, metadata)\n VALUES ($1, $2::vector, $3, $4)\n ON CONFLICT (id) DO UPDATE SET\n embedding = $2::vector,\n document = $3,\n metadata = $4\n `\n\n const client = this.clientOrPool\n try {\n for (const r of resolvedRows) {\n const vecStr = '[' + r.vector.join(',') + ']'\n await client.query(sql, [\n r.id,\n vecStr,\n r.document ?? null,\n JSON.stringify(r.metadata ?? {}),\n ])\n }\n } catch (e: any) {\n throw new E_VECTOR_STORE_UPSERT_FAILED([e?.message ?? String(e)])\n }\n }\n\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n await this.ensureConnected()\n const collection = plan.collection\n const tbl = `\"${collection}\"`\n const metric = this.options.metric ?? 'euclidean'\n const { op } = METRIC_TO_OPERATOR[metric]\n\n const filterSql = plan.filter\n ? (() => {\n const { sql, params } = translatePgFilter(plan.filter)\n if (sql) {\n return { sql: ` AND ${sql}`, params }\n }\n return { sql: '', params: [] }\n })()\n : { sql: '', params: [] }\n\n try {\n if (plan.near) {\n let qvec: number[] | undefined\n\n if ('vector' in plan.near) {\n qvec = plan.near.vector\n } else if ('serverText' in plan.near) {\n const [v] = await this.encode([plan.near.serverText], 'query')\n qvec = v\n } else if ('id' in plan.near) {\n const id = plan.near.id\n const vecRes = await this.#_pool!.query(`SELECT embedding FROM ${tbl} WHERE id = $1`, [\n id,\n ])\n if (vecRes.rows[0]?.embedding) {\n const raw = vecRes.rows[0].embedding\n if (typeof raw === 'string') {\n const stripped = raw.replace(/^\\[|\\]$/g, '')\n qvec = stripped.split(',').map((n) => Number.parseFloat(n.trim()))\n }\n }\n }\n\n if (!qvec) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['no query vector provided'])\n }\n\n const vecStr = '[' + qvec.join(',') + ']'\n const sql = `\n SELECT id, document, metadata, embedding, embedding ${op} $1 AS distance\n FROM ${tbl}\n WHERE 1=1 ${filterSql.sql}\n ORDER BY distance\n LIMIT ${plan.topK} OFFSET ${plan.offset ?? 0}\n `\n const { rows } = await this.#_pool!.query(sql, [vecStr, ...filterSql.params])\n\n const results: VectorMatch[] = []\n\n for (const row of rows) {\n let distance = Number(row.distance)\n\n let score: number | undefined\n if (metric === 'dot') {\n const inner = -distance\n score = normalizeScore(inner, 'dot', 'similarity')\n distance = inner\n } else {\n score = normalizeScore(distance, metric, 'distance')\n }\n\n const parsedMeta =\n typeof row.metadata === 'string' ? JSON.parse(row.metadata) : row.metadata\n\n const proj: VectorMatch = {}\n if (plan.projection.id) proj.id = row.id\n if (plan.projection.vector) {\n const rawVec = row.embedding\n if (typeof rawVec === 'string') {\n const stripped = rawVec.replace(/^\\[|\\]$/g, '')\n proj.vector = stripped.split(',').map((n) => Number.parseFloat(n.trim()))\n }\n }\n if (plan.projection.document && row.document !== undefined) proj.document = row.document\n if (plan.projection.metadata && parsedMeta !== undefined) proj.metadata = parsedMeta\n if (score !== undefined) proj.score = score\n\n results.push(proj)\n }\n\n return results\n } else {\n const sql = `\n SELECT id, document, metadata, embedding\n FROM ${tbl}\n WHERE 1=1 ${filterSql.sql}\n LIMIT ${plan.topK} OFFSET ${plan.offset ?? 0}\n `\n const { rows } = await this.#_pool!.query(sql, [...filterSql.params])\n\n const results: VectorMatch[] = []\n\n for (const row of rows) {\n const parsedMeta =\n typeof row.metadata === 'string' ? JSON.parse(row.metadata) : row.metadata\n\n const proj: VectorMatch = {}\n if (plan.projection.id) proj.id = row.id\n if (plan.projection.vector) {\n const vecRes = await this.#_pool!.query(`SELECT embedding FROM ${tbl} WHERE id = $1`, [\n row.id,\n ])\n if (vecRes.rows[0]?.embedding) {\n const rawVec = vecRes.rows[0].embedding\n if (typeof rawVec === 'string') {\n const stripped = rawVec.replace(/^\\[|\\]$/g, '')\n proj.vector = stripped.split(',').map((n) => Number.parseFloat(n.trim()))\n }\n }\n }\n if (plan.projection.document && row.document !== undefined) proj.document = row.document\n if (plan.projection.metadata && parsedMeta !== undefined) proj.metadata = parsedMeta\n\n results.push(proj)\n }\n\n return results\n }\n } catch (e: any) {\n throw new E_VECTOR_STORE_SEARCH_FAILED([e?.message ?? String(e)])\n }\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n await this.ensureConnected()\n const collection = plan.collection\n const tbl = `\"${collection}\"`\n\n try {\n if (plan.ids && plan.ids.length > 0) {\n const sql = `DELETE FROM ${tbl} WHERE id = ANY($1)`\n await this.#_pool!.query(sql, [plan.ids])\n } else if (plan.filter) {\n const { sql, params } = translatePgFilter(plan.filter)\n const whereClause = sql ? ` WHERE ${sql}` : ''\n const delSql = `DELETE FROM ${tbl}${whereClause}`\n await this.#_pool!.query(delSql, params)\n } else {\n await this.#_pool!.query(`TRUNCATE TABLE ${tbl} RESTART IDENTITY`)\n }\n } catch (e: any) {\n throw new E_VECTOR_STORE_DELETE_FAILED([e?.message ?? String(e)])\n }\n }\n\n async transaction(fn: (tx: CallableVectorStore) => Promise<void>): Promise<void> {\n await this.ensureConnected()\n\n const pool = this.#_pool!\n const client = await pool.connect()\n\n try {\n await client.query('BEGIN')\n this.#_txClient = client\n await fn(this.asCallable())\n await client.query('COMMIT')\n } catch (e) {\n await client.query('ROLLBACK')\n throw e\n } finally {\n this.#_txClient = null\n client.release()\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"pgvector.mjs","names":["#opts","#_pool","#_externalPool","#_txClient"],"sources":["../../../src/batteries/vector/pgvector/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/pgvector\n */\n\nimport { normalizeScore } from '../helpers'\nimport { validateRecords } from '../validation'\nimport { BaseVectorStore, CallableVectorStore } from '../contract'\nimport { isFilterCondition, isRawFilter, isFilterGroup } from '../filters'\nimport {\n E_VECTOR_STORE_DRIVER_UNAVAILABLE,\n E_VECTOR_STORE_CONNECTION_FAILED,\n E_VECTOR_STORE_COLLECTION_FAILED,\n E_VECTOR_STORE_UPSERT_FAILED,\n E_VECTOR_STORE_SEARCH_FAILED,\n E_VECTOR_STORE_DELETE_FAILED,\n E_VECTOR_STORE_DIMENSION_MISMATCH,\n E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR,\n E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n} from '../exceptions'\nimport type { VectorFilter } from '../filters'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from '../types'\n\n/** Construction options for {@link PgVectorStore}. */\nexport interface PgVectorStoreOptions extends BaseVectorStoreOptions {\n /** Connection details: a connection string, or a discrete host/port/credentials object. */\n connection?:\n | string\n | {\n connectionString?: string\n host?: string\n port?: number\n user?: string\n password?: string\n database?: string\n }\n /** An existing `pg` Pool/Client to reuse instead of constructing one from `connection`. */\n pool?: any\n}\n\ninterface PGClient {\n query: (sql: string, params?: unknown[]) => Promise<{ rows: any[] }>\n release?: () => void\n}\n\ntype PoolOrClient = any\n\nconst METRIC_TO_OPERATOR: Record<string, { op: string; opclass: string }> = {\n cosine: { op: '<=>', opclass: 'vector_cosine_ops' },\n dot: { op: '<#>', opclass: 'vector_ip_ops' },\n euclidean: { op: '<->', opclass: 'vector_l2_ops' },\n}\n\n/** Translate a neutral {@link VectorFilter} into a parameterized SQL `WHERE` fragment plus its bind params. */\nexport const translatePgFilter = (filter: VectorFilter): { sql: string; params: unknown[] } => {\n const params: unknown[] = []\n\n const walk = (f: VectorFilter): string => {\n if (isFilterCondition(f)) {\n const { field, op, value } = f\n\n if (op === 'exists') {\n const val = value === undefined || value === true\n return val ? `metadata ? '${field}'` : `NOT (metadata ? '${field}')`\n }\n\n if (op === 'contains') {\n params.push(JSON.stringify(value))\n return `metadata->>'${field}' @> $${params.length}::jsonb`\n }\n\n if (op === 'in' || op === 'nin') {\n params.push(Array.isArray(value) ? value : [value])\n const not = op === 'nin' ? 'NOT ' : ''\n return `${not}(metadata->>'${field}' = ANY($${params.length}))`\n }\n\n if (op === 'eq') {\n params.push(value)\n return `metadata->>'${field}' = $${params.length}`\n }\n\n if (op === 'ne') {\n params.push(value)\n return `metadata->>'${field}' IS DISTINCT FROM $${params.length}`\n }\n\n if (['gt', 'gte', 'lt', 'lte'].includes(op)) {\n params.push(Number(value))\n const opMap: Record<string, string> = { gt: '>', gte: '>=', lt: '<', lte: '<=' }\n return `(metadata->>'${field}')::numeric ${opMap[op]} $${params.length}`\n }\n\n throw new Error(`Unsupported filter operator: ${op}`)\n }\n\n if (isRawFilter(f)) {\n const { $dialect, $raw, $bindings } = f\n\n if (typeof $raw === 'string') {\n if ($dialect !== 'sql' && $dialect !== 'pgvector') {\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['pgvector', String($dialect)])\n }\n } else if ($raw !== undefined) {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['raw-sql', 'pgvector'])\n }\n\n const rawStr = typeof $raw === 'string' ? $raw : String($raw)\n const bindingCount = (rawStr.match(/\\?/g) || []).length\n\n if ($bindings && $bindings.length !== bindingCount) {\n throw new Error(\n `Raw fragment placeholder count (${bindingCount}) does not match bindings length (${$bindings?.length || 0})`\n )\n }\n\n if ($bindings && $bindings.length > 0) {\n for (const $binding of $bindings) {\n params.push($binding)\n }\n return rawStr.replace(/\\?/g, () => `$${params.length}`)\n }\n\n return rawStr\n }\n\n if (isFilterGroup(f)) {\n const { and, or, not } = f\n\n if (and !== undefined) {\n const parts: string[] = []\n for (const child of and) {\n parts.push(walk(child))\n }\n return parts.length ? `(${parts.join(' AND ')})` : ''\n }\n\n if (or !== undefined) {\n const parts: string[] = []\n for (const child of or) {\n parts.push(walk(child))\n }\n return parts.length ? `(${parts.join(' OR ')})` : ''\n }\n\n if (not !== undefined) {\n return `NOT (${walk(not)})`\n }\n\n return ''\n }\n\n return ''\n }\n\n return { sql: walk(filter), params }\n}\n\nexport class PgVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: true,\n namedVectors: false,\n rename: true,\n rawSql: true,\n builtInEncoding: false,\n // Strongly consistent: a write is visible on resolve, so the option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n\n #_pool: PoolOrClient | null = null\n #_txClient: PGClient | null = null\n #_externalPool = false\n\n constructor(options: PgVectorStoreOptions) {\n super(options)\n }\n\n get #opts(): PgVectorStoreOptions {\n return this.options as PgVectorStoreOptions\n }\n\n /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */\n static isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n\n async connect(): Promise<void> {\n if (this.#_pool) {\n return\n }\n\n let pg: any\n\n try {\n pg = await import('pg')\n } catch (e) {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['pg'])\n }\n\n let pool: any\n\n if (this.#opts.pool) {\n pool = this.#opts.pool\n this.#_externalPool = true\n } else {\n const connectionConfig = this.#opts.connection\n if (typeof connectionConfig === 'string') {\n pool = new pg.Pool({ connectionString: connectionConfig })\n } else if (connectionConfig) {\n pool = new pg.Pool(connectionConfig)\n } else {\n pool = new pg.Pool()\n }\n }\n\n try {\n await pool.query('SELECT 1')\n } catch (e: any) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([e?.message ?? String(e)])\n }\n\n try {\n await pool.query('CREATE EXTENSION IF NOT EXISTS vector')\n } catch (e: any) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([e?.message ?? String(e)])\n }\n\n this.#_pool = pool\n }\n\n async close(): Promise<void> {\n if (this.#_txClient) {\n this.#_txClient.release?.()\n this.#_txClient = null\n }\n\n if (this.#_pool && !this.#_externalPool) {\n await this.#_pool.end()\n }\n\n this.#_pool = null\n this.#_txClient = null\n }\n\n /** The active transaction client when inside a transaction, otherwise the connection pool. */\n get clientOrPool(): PoolOrClient {\n if (this.#_txClient) {\n return this.#_txClient\n }\n if (!this.#_pool) {\n throw new Error('Not connected')\n }\n return this.#_pool\n }\n\n /** Ensure the pool is connected (idempotent); a no-op once connected. */\n async ensureConnected(): Promise<void> {\n await this.connect()\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n await this.ensureConnected()\n const { collection, vector } = spec\n const { dimensions, metric } = vector\n const tbl = `\"${collection}\"`\n const { opclass } = METRIC_TO_OPERATOR[metric]\n\n const has = await this.hasCollection(collection)\n if (!ifNotExists && has) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['create', 'collection exists'])\n }\n\n const createTable = `\n CREATE TABLE IF NOT EXISTS ${tbl} (\n id TEXT PRIMARY KEY,\n embedding vector(${dimensions}),\n document TEXT,\n metadata JSONB\n )\n `\n const createIndex = `\n CREATE INDEX IF NOT EXISTS \"${collection}_embedding_idx\" ON ${tbl} USING hnsw (embedding ${opclass})\n `\n\n try {\n await this.#_pool!.query(createTable)\n await this.#_pool!.query(createIndex)\n } catch (e: any) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['create', e?.message ?? String(e)])\n }\n }\n\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n await this.ensureConnected()\n const tbl = `\"${collection}\"`\n\n const has = await this.hasCollection(collection)\n if (!has) {\n if (!ifExists) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['drop', 'collection does not exist'])\n }\n return\n }\n\n const dropTbl = `DROP TABLE IF EXISTS ${tbl}`\n try {\n await this.#_pool!.query(dropTbl)\n } catch (e: any) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['drop', e?.message ?? String(e)])\n }\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n await this.ensureConnected()\n const check = `SELECT to_regclass($1) IS NOT NULL AS exists`\n try {\n const res = await this.#_pool!.query(check, [collection])\n return res.rows[0]?.exists === true\n } catch {\n return false\n }\n }\n\n async renameCollection(from: string, to: string): Promise<void> {\n await this.ensureConnected()\n const hasFrom = await this.hasCollection(from)\n if (!hasFrom) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['rename', 'source collection does not exist'])\n }\n\n const hasTo = await this.hasCollection(to)\n if (hasTo) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['rename', 'target collection already exists'])\n }\n\n const rename = `ALTER TABLE \"${from}\" RENAME TO \"${to}\"`\n try {\n await this.#_pool!.query(rename)\n } catch (e: any) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['rename', e?.message ?? String(e)])\n }\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n await this.ensureConnected()\n validateRecords(plan.records)\n\n const collection = plan.collection\n const tbl = `\"${collection}\"`\n const dims = this.#opts.dimensions\n\n const resolvedRows: {\n id: string\n vector: number[]\n document?: string\n metadata?: Record<string, unknown>\n }[] = []\n\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\n if (vector && dims !== undefined && vector.length !== dims) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([dims, vector.length])\n }\n\n resolvedRows.push({\n id: r.id,\n vector: vector ?? [],\n document: r.document,\n metadata: r.metadata as Record<string, unknown> | undefined,\n })\n }\n\n const sql = `\n INSERT INTO ${tbl} (id, embedding, document, metadata)\n VALUES ($1, $2::vector, $3, $4)\n ON CONFLICT (id) DO UPDATE SET\n embedding = $2::vector,\n document = $3,\n metadata = $4\n `\n\n const client = this.clientOrPool\n try {\n for (const r of resolvedRows) {\n const vecStr = '[' + r.vector.join(',') + ']'\n await client.query(sql, [\n r.id,\n vecStr,\n r.document ?? null,\n JSON.stringify(r.metadata ?? {}),\n ])\n }\n } catch (e: any) {\n throw new E_VECTOR_STORE_UPSERT_FAILED([e?.message ?? String(e)])\n }\n }\n\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n await this.ensureConnected()\n const collection = plan.collection\n const tbl = `\"${collection}\"`\n const metric = this.options.metric ?? 'euclidean'\n const { op } = METRIC_TO_OPERATOR[metric]\n\n const filterSql = plan.filter\n ? (() => {\n const { sql, params } = translatePgFilter(plan.filter)\n if (sql) {\n return { sql: ` AND ${sql}`, params }\n }\n return { sql: '', params: [] }\n })()\n : { sql: '', params: [] }\n\n try {\n if (plan.near) {\n let qvec: number[] | undefined\n\n if ('vector' in plan.near) {\n qvec = plan.near.vector\n } else if ('serverText' in plan.near) {\n const [v] = await this.encode([plan.near.serverText], 'query')\n qvec = v\n } else if ('id' in plan.near) {\n const id = plan.near.id\n const vecRes = await this.#_pool!.query(`SELECT embedding FROM ${tbl} WHERE id = $1`, [\n id,\n ])\n if (vecRes.rows[0]?.embedding) {\n const raw = vecRes.rows[0].embedding\n if (typeof raw === 'string') {\n const stripped = raw.replace(/^\\[|\\]$/g, '')\n qvec = stripped.split(',').map((n) => Number.parseFloat(n.trim()))\n }\n }\n }\n\n if (!qvec) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['no query vector provided'])\n }\n\n const vecStr = '[' + qvec.join(',') + ']'\n const sql = `\n SELECT id, document, metadata, embedding, embedding ${op} $1 AS distance\n FROM ${tbl}\n WHERE 1=1 ${filterSql.sql}\n ORDER BY distance\n LIMIT ${plan.topK} OFFSET ${plan.offset ?? 0}\n `\n const { rows } = await this.#_pool!.query(sql, [vecStr, ...filterSql.params])\n\n const results: VectorMatch[] = []\n\n for (const row of rows) {\n let distance = Number(row.distance)\n\n let score: number | undefined\n if (metric === 'dot') {\n const inner = -distance\n score = normalizeScore(inner, 'dot', 'similarity')\n distance = inner\n } else {\n score = normalizeScore(distance, metric, 'distance')\n }\n\n const parsedMeta =\n typeof row.metadata === 'string' ? JSON.parse(row.metadata) : row.metadata\n\n const proj: VectorMatch = {}\n if (plan.projection.id) proj.id = row.id\n if (plan.projection.vector) {\n const rawVec = row.embedding\n if (typeof rawVec === 'string') {\n const stripped = rawVec.replace(/^\\[|\\]$/g, '')\n proj.vector = stripped.split(',').map((n) => Number.parseFloat(n.trim()))\n }\n }\n if (plan.projection.document && row.document !== undefined) proj.document = row.document\n if (plan.projection.metadata && parsedMeta !== undefined) proj.metadata = parsedMeta\n if (score !== undefined) proj.score = score\n\n results.push(proj)\n }\n\n return results\n } else {\n const sql = `\n SELECT id, document, metadata, embedding\n FROM ${tbl}\n WHERE 1=1 ${filterSql.sql}\n LIMIT ${plan.topK} OFFSET ${plan.offset ?? 0}\n `\n const { rows } = await this.#_pool!.query(sql, [...filterSql.params])\n\n const results: VectorMatch[] = []\n\n for (const row of rows) {\n const parsedMeta =\n typeof row.metadata === 'string' ? JSON.parse(row.metadata) : row.metadata\n\n const proj: VectorMatch = {}\n if (plan.projection.id) proj.id = row.id\n if (plan.projection.vector) {\n const vecRes = await this.#_pool!.query(`SELECT embedding FROM ${tbl} WHERE id = $1`, [\n row.id,\n ])\n if (vecRes.rows[0]?.embedding) {\n const rawVec = vecRes.rows[0].embedding\n if (typeof rawVec === 'string') {\n const stripped = rawVec.replace(/^\\[|\\]$/g, '')\n proj.vector = stripped.split(',').map((n) => Number.parseFloat(n.trim()))\n }\n }\n }\n if (plan.projection.document && row.document !== undefined) proj.document = row.document\n if (plan.projection.metadata && parsedMeta !== undefined) proj.metadata = parsedMeta\n\n results.push(proj)\n }\n\n return results\n }\n } catch (e: any) {\n throw new E_VECTOR_STORE_SEARCH_FAILED([e?.message ?? String(e)])\n }\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n await this.ensureConnected()\n const collection = plan.collection\n const tbl = `\"${collection}\"`\n\n try {\n if (plan.ids && plan.ids.length > 0) {\n const sql = `DELETE FROM ${tbl} WHERE id = ANY($1)`\n await this.#_pool!.query(sql, [plan.ids])\n } else if (plan.filter) {\n const { sql, params } = translatePgFilter(plan.filter)\n const whereClause = sql ? ` WHERE ${sql}` : ''\n const delSql = `DELETE FROM ${tbl}${whereClause}`\n await this.#_pool!.query(delSql, params)\n } else {\n await this.#_pool!.query(`TRUNCATE TABLE ${tbl} RESTART IDENTITY`)\n }\n } catch (e: any) {\n throw new E_VECTOR_STORE_DELETE_FAILED([e?.message ?? String(e)])\n }\n }\n\n async transaction(fn: (tx: CallableVectorStore) => Promise<void>): Promise<void> {\n await this.ensureConnected()\n\n const pool = this.#_pool!\n const client = await pool.connect()\n\n try {\n await client.query('BEGIN')\n this.#_txClient = client\n await fn(this.asCallable())\n await client.query('COMMIT')\n } catch (e) {\n await client.query('ROLLBACK')\n throw e\n } finally {\n this.#_txClient = null\n client.release()\n }\n }\n}\n"],"mappings":"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"}
@@ -6,7 +6,9 @@ import type { VectorFilter } from "../filters";
6
6
  import type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from "../plan";
7
7
  import type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from "../types";
8
8
  export interface PineconeVectorStoreOptions extends BaseVectorStoreOptions {
9
+ /** Pinecone API key. */
9
10
  apiKey: string;
11
+ /** Name of the Pinecone index this store operates against. */
10
12
  index: string;
11
13
  /**
12
14
  * When set, the physical Pinecone namespace becomes `${namespacePrefix}__${collection}`.
@@ -16,6 +18,7 @@ export interface PineconeVectorStoreOptions extends BaseVectorStoreOptions {
16
18
  * namespaces are implicit (born on first upsert), so a fresh prefix costs nothing.
17
19
  */
18
20
  namespacePrefix?: string;
21
+ /** Connection and authentication parameters for the backend. */
19
22
  connection?: {
20
23
  controllerHostUrl?: string;
21
24
  };
@@ -23,6 +26,7 @@ export interface PineconeVectorStoreOptions extends BaseVectorStoreOptions {
23
26
  export declare class PineconeVectorStore extends BaseVectorStore {
24
27
  #private;
25
28
  readonly capabilities: VectorStoreCapabilities;
29
+ /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
26
30
  static isAvailable(): boolean;
27
31
  isAvailable(): boolean;
28
32
  connect(): Promise<void>;
@@ -35,4 +39,5 @@ export declare class PineconeVectorStore extends BaseVectorStore {
35
39
  executeSearch(plan: SearchPlan): Promise<VectorMatch[]>;
36
40
  executeDelete(plan: DeletePlan): Promise<void>;
37
41
  }
42
+ /** Translate a neutral {@link VectorFilter} into a Pinecone metadata filter object. */
38
43
  export declare const translatePineconeFilter: (filter?: VectorFilter) => Record<string, unknown> | undefined;
@@ -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");
@@ -109,6 +109,7 @@ var PineconeVectorStore = class extends require_batteries_vector_contract.BaseVe
109
109
  if (mode === "eventual") return;
110
110
  if (!await this.#waitVisible(ns, collection, opts) && mode === "strong") throw new require_batteries_vector_exceptions.E_VECTOR_STORE_CONSISTENCY_TIMEOUT([what]);
111
111
  }
112
+ /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
112
113
  static isAvailable() {
113
114
  return typeof process !== "undefined";
114
115
  }
@@ -369,6 +370,7 @@ var isFilterOnId = (filter) => {
369
370
  }
370
371
  return false;
371
372
  };
373
+ /** Translate a neutral {@link VectorFilter} into a Pinecone metadata filter object. */
372
374
  var translatePineconeFilter = (filter) => {
373
375
  if (!filter) return void 0;
374
376
  if (require_batteries_vector_filters.isRawFilter(filter)) {
@@ -1 +1 @@
1
- {"version":3,"file":"pinecone.cjs","names":["#waitVisible","#ns","#dims","#index","#settle","#pc","#consistencyMode"],"sources":["../../../src/batteries/vector/pinecone/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/pinecone\n */\n\nimport { normalizeScore } from '../helpers'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { isInstanceOf } from '@nhtio/adk/guards'\nimport { isFilterCondition, isRawFilter, isFilterGroup, evaluateFilter } from '../filters'\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_FILTER_OPERATOR,\n E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n E_VECTOR_STORE_CONNECTION_FAILED,\n E_VECTOR_STORE_CONSISTENCY_TIMEOUT,\n} from '../exceptions'\nimport type { VectorFilter } from '../filters'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type {\n VectorMatch,\n VectorStoreCapabilities,\n BaseVectorStoreOptions,\n VectorMetadata,\n VectorConsistency,\n} from '../types'\n\nexport interface PineconeVectorStoreOptions extends BaseVectorStoreOptions {\n apiKey: string\n index: string\n /**\n * When set, the physical Pinecone namespace becomes `${namespacePrefix}__${collection}`.\n * The logical collection name the builder/base see is unchanged — only the physical\n * namespace string is prefixed. Lets callers (and the test suite) isolate otherwise\n * identically-named collections into distinct, uncontended namespaces. Pinecone\n * namespaces are implicit (born on first upsert), so a fresh prefix costs nothing.\n */\n namespacePrefix?: string\n connection?: { controllerHostUrl?: string }\n}\n\nconst getPineconeClient = async () => {\n try {\n const mod = await import('@pinecone-database/pinecone')\n return mod.Pinecone\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['@pinecone-database/pinecone'])\n }\n}\n\nexport class PineconeVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: false,\n rawSql: false,\n builtInEncoding: false,\n // Pinecone serverless is eventually consistent: the option is honored, and the default\n // is 'strong' so out-of-the-box behavior matches the strongly-consistent adapters.\n consistency: {\n configurable: true,\n default: 'strong',\n modes: ['strong', 'best-effort', 'eventual'],\n },\n }\n #pc: any | null = null\n #index: any | null = null\n #dims: Map<string, number> = new Map()\n\n // Resolve the effective consistency mode for one write, honoring precedence:\n // per-operation override (plan.consistency) > store option > adapter-declared default.\n #consistencyMode(perOp?: VectorConsistency): VectorConsistency {\n return (\n perOp ??\n (this.options as PineconeVectorStoreOptions).consistency ??\n this.capabilities.consistency.default\n )\n }\n\n // Map a logical collection name to its physical Pinecone namespace. Only the physical\n // namespace string is prefixed; #dims and everything the base/builder see stay keyed on\n // the logical name.\n #ns(collection: string): string {\n const prefix = (this.options as PineconeVectorStoreOptions).namespacePrefix\n return prefix ? `${prefix}__${collection}` : collection\n }\n\n // Returns true if visibility was confirmed within the bound, false on timeout.\n // Polls the SAME read paths the adapter reads through downstream:\n // present ids → must appear in BOTH query() matches AND listPaginated()\n // absent ids → must be gone from BOTH listPaginated() AND fetch()\n async #waitVisible(\n ns: any,\n collection: string,\n opts: { present?: string[]; absent?: string[]; probeVector?: number[] }\n ): Promise<boolean> {\n const present = opts.present ?? []\n const absent = opts.absent ?? []\n if (present.length === 0 && absent.length === 0) return true\n const physicalNs = this.#ns(collection)\n const dims = this.#dims.get(collection) ?? 3\n const queryVec = opts.probeVector ?? new Array(dims).fill(0).map((_, i) => (i === 0 ? 1 : 0))\n const deadline = Date.now() + 10_000 // 10s ceiling; freshness is ~seconds\n const topK = Math.max(present.length + absent.length + 5, 10)\n while (true) {\n let presentOk = true\n let absentOk = true\n if (present.length > 0) {\n let listed = new Set<string>()\n try {\n const lr = await this.#index!.listPaginated({ namespace: physicalNs, limit: 100 })\n listed = new Set((lr.vectors ?? []).map((v: any) => v.id))\n } catch {\n listed = new Set()\n }\n let queried = new Set<string>()\n try {\n const qr = await ns.query({ vector: queryVec, topK, includeValues: false })\n queried = new Set((qr.matches ?? []).map((m: any) => m.id))\n } catch {\n queried = new Set()\n }\n presentOk = present.every((id) => listed.has(id) && queried.has(id))\n }\n if (absent.length > 0) {\n let listed = new Set<string>()\n try {\n const lr = await this.#index!.listPaginated({ namespace: physicalNs, limit: 1000 })\n listed = new Set((lr.vectors ?? []).map((v: any) => v.id))\n } catch {\n listed = new Set()\n }\n let fetched: Record<string, unknown> = {}\n try {\n const fr = await ns.fetch({ ids: absent })\n fetched = fr.records ?? {}\n } catch {\n fetched = {}\n }\n absentOk = absent.every((id) => !listed.has(id) && fetched[id] === undefined)\n }\n if (presentOk && absentOk) return true\n if (Date.now() >= deadline) return false\n await new Promise((r) => setTimeout(r, 300))\n }\n }\n\n // Apply the resolved consistency-mode semantics for one write:\n // strong → wait, and THROW E_VECTOR_STORE_CONSISTENCY_TIMEOUT if not confirmed.\n // best-effort → wait up to the bound, then resolve whether or not confirmed (no throw).\n // eventual → no wait at all.\n // `mode` is the effective mode for THIS operation (already resolved from the precedence\n // chain by the caller via #consistencyMode(plan.consistency)).\n async #settle(\n ns: any,\n collection: string,\n opts: { present?: string[]; absent?: string[] },\n what: string,\n mode: VectorConsistency\n ): Promise<void> {\n if (mode === 'eventual') return\n const confirmed = await this.#waitVisible(ns, collection, opts)\n if (!confirmed && mode === 'strong') {\n throw new E_VECTOR_STORE_CONSISTENCY_TIMEOUT([what])\n }\n // best-effort: resolve regardless\n }\n\n static isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n async connect(): Promise<void> {\n if (this.#pc) return\n const Pinecone = await getPineconeClient()\n const opts = this.options as PineconeVectorStoreOptions\n try {\n this.#pc = new Pinecone({ apiKey: opts.apiKey, ...opts.connection })\n this.#index = this.#pc.index(opts.index)\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n async close(): Promise<void> {\n this.#pc = null\n this.#index = null\n }\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n const collection = spec.collection\n if (ifNotExists) {\n if (await this.hasCollection(collection)) return\n }\n if (this.#dims.has(collection)) {\n const existingDim = this.#dims.get(collection)!\n if (existingDim !== spec.vector.dimensions) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED([\n 'createCollection',\n `Collection ${collection} already exists with dimension ${existingDim}`,\n ])\n }\n return\n }\n this.#dims.set(collection, spec.vector.dimensions)\n }\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n if (ifExists) {\n if (!(await this.hasCollection(collection))) return\n } else if (!(await this.hasCollection(collection))) {\n return\n }\n await this.connect()\n const physicalNs = this.#ns(collection)\n const ns = this.#index!.namespace(physicalNs)\n try {\n // Get all IDs via pagination\n let page: any = { next: null }\n const ids: string[] = []\n do {\n const lr = await this.#index!.listPaginated({\n namespace: physicalNs,\n limit: 1000,\n startingToken: page.next,\n })\n if (lr.vectors) ids.push(...lr.vectors.map((v: any) => v.id))\n page.next = lr.pagination?.next\n } while (page.next)\n\n // Delete all found IDs\n if (ids.length > 0) {\n await ns.deleteMany({ ids })\n }\n\n // Settle on absence\n await this.#settle(\n ns,\n collection,\n { absent: ids },\n 'dropCollection ' + collection,\n this.#consistencyMode()\n )\n } catch (err: any) {\n // Re-throw consistency timeout directly (don't swallow)\n if (\n isInstanceOf(err, 'E_VECTOR_STORE_CONSISTENCY_TIMEOUT', E_VECTOR_STORE_CONSISTENCY_TIMEOUT)\n )\n throw err\n const msg = String(err)\n if (ifExists && msg.includes('not found')) return\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', msg])\n }\n }\n async hasCollection(collection: string): Promise<boolean> {\n await this.connect()\n const stats = await this.#index!.describeIndexStats()\n return !!stats.namespaces?.[this.#ns(collection)]\n }\n async renameCollection(_from: string, _to: string): Promise<void> {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'pinecone'])\n }\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n await this.connect()\n const collection = plan.collection\n const ns = this.#index!.namespace(this.#ns(collection))\n const dims = this.#dims.get(collection)\n const vectors: any[] = []\n for (const r of plan.records) {\n let vector = r.vector\n if (!vector && r.document) {\n const [v] = await this.encode([r.document], 'document')\n vector = v\n }\n if (!vector) {\n throw new E_VECTOR_STORE_UPSERT_FAILED(['Record missing vector and document'])\n }\n if (dims !== undefined && vector.length !== dims) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([dims, vector.length])\n }\n vectors.push({\n id: r.id,\n values: vector,\n metadata: { ...r.metadata, __document: r.document ?? '' },\n })\n }\n try {\n await ns.upsert({ records: vectors })\n // Call settle after upsert to wait for visibility (per-op override > store > default)\n await this.#settle(\n ns,\n collection,\n { present: vectors.map((v) => v.id) },\n 'upsert ' + vectors.length + ' record(s)',\n this.#consistencyMode(plan.consistency)\n )\n } catch (err) {\n if (\n isInstanceOf(err, 'E_VECTOR_STORE_CONSISTENCY_TIMEOUT', E_VECTOR_STORE_CONSISTENCY_TIMEOUT)\n )\n throw err\n throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n }\n }\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n await this.connect()\n const collection = plan.collection\n const physicalNs = this.#ns(collection)\n const ns = this.#index!.namespace(physicalNs)\n const metric = this.options.metric ?? 'cosine'\n let queryVector: number[] | undefined\n if (plan.near) {\n if ('vector' in plan.near) {\n queryVector = plan.near.vector\n } else if ('serverText' in plan.near) {\n const [v] = await this.encode([plan.near.serverText], 'query')\n queryVector = v\n } else if ('id' in plan.near) {\n const res = await ns.fetch({ ids: [plan.near.id] })\n const record = res.records[plan.near.id]\n if (!record) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = record.values\n }\n }\n const offset = plan.offset ?? 0\n const k = plan.topK + offset\n if (queryVector) {\n const filter = translatePineconeFilter(plan.filter)\n const res = await ns.query({\n vector: queryVector,\n topK: k,\n filter,\n includeMetadata: true,\n includeValues: !!plan.projection.vector,\n })\n const rawMatches = res.matches ?? []\n const sliceMatches = rawMatches.slice(offset)\n const matches: VectorMatch[] = []\n for (const match of sliceMatches) {\n const proj: VectorMatch = {}\n if (plan.projection.id) {\n proj.id = match.id\n }\n if (plan.projection.vector && match.values) {\n proj.vector = match.values\n }\n if (plan.projection.document && match.metadata) {\n proj.document = match.metadata.__document\n }\n if (plan.projection.metadata && match.metadata) {\n const meta: VectorMetadata = {}\n for (const key in match.metadata) {\n if (key !== '__document') {\n meta[key] = match.metadata[key]\n }\n }\n proj.metadata = meta\n }\n if (plan.near) {\n proj.score = normalizeScore(match.score!, metric, 'similarity')\n }\n matches.push(proj)\n }\n return matches\n } else {\n // Filter-scan: Pinecone v7 listPaginated filter is broken, so we get all records\n // and filter client-side. First, get all IDs without filter, then fetch.\n let page: any = { next: null }\n const ids: string[] = []\n do {\n // Get all IDs without filter - Pinecone v7 listPaginated without filter works\n const listRes = await this.#index!.listPaginated({\n limit: 100,\n startingToken: page.next,\n namespace: physicalNs,\n })\n if (listRes.vectors) {\n ids.push(...listRes.vectors.map((v: any) => v.id))\n }\n page.next = listRes.pagination?.next\n } while (page.next)\n if (ids.length === 0) return []\n\n // Fetch all records and filter client-side\n const allRecords: any = {}\n for (let i = 0; i < ids.length; i += 100) {\n const batch = ids.slice(i, i + 100)\n const fetchRes = await ns.fetch({ ids: batch })\n if (fetchRes && fetchRes.records) {\n for (const id in fetchRes.records) {\n allRecords[id] = fetchRes.records[id]\n }\n }\n }\n const matches: VectorMatch[] = []\n for (const id in allRecords) {\n const record = allRecords[id]\n if (record.metadata) {\n const evalMeta: VectorMetadata = {}\n for (const key in record.metadata) {\n if (key !== '__document') {\n evalMeta[key] = record.metadata[key]\n }\n }\n // If no filter, include all records; otherwise evaluate the filter\n if (!plan.filter || evaluateFilter(plan.filter, evalMeta)) {\n const proj: VectorMatch = {}\n if (plan.projection.id) {\n proj.id = id\n }\n if (plan.projection.vector && record.values) {\n proj.vector = record.values\n }\n if (plan.projection.document && record.metadata) {\n proj.document = record.metadata.__document\n }\n if (plan.projection.metadata && record.metadata) {\n const meta: VectorMetadata = {}\n for (const key in record.metadata) {\n if (key !== '__document') {\n meta[key] = record.metadata[key]\n }\n }\n proj.metadata = meta as VectorMetadata\n }\n matches.push(proj)\n }\n }\n }\n return matches.slice(offset, offset + plan.topK)\n }\n }\n async executeDelete(plan: DeletePlan): Promise<void> {\n await this.connect()\n const collection = plan.collection\n const physicalNs = this.#ns(collection)\n const ns = this.#index!.namespace(physicalNs)\n const mode = this.#consistencyMode(plan.consistency)\n try {\n if (plan.ids && plan.ids.length > 0) {\n await ns.deleteMany({ ids: plan.ids })\n // Call settle after delete-by-ids to wait for absence\n await this.#settle(ns, collection, { absent: plan.ids }, 'delete by id', mode)\n } else if (plan.filter) {\n // Pinecone v7 listPaginated filter is broken, and Pinecone doesn't support\n // filtering by record ID. Get all IDs and filter client-side.\n let page: any = { next: null }\n const ids: string[] = []\n do {\n const listRes = await this.#index!.listPaginated({\n limit: 1000,\n startingToken: page.next,\n namespace: physicalNs,\n })\n if (listRes.vectors) {\n ids.push(...listRes.vectors.map((v: any) => v.id))\n }\n page.next = listRes.pagination?.next\n } while (page.next)\n\n // For Pinecone, we can only filter by metadata fields.\n // If the filter is on 'id', filter client-side without metadata.\n // Otherwise, fetch records and filter by metadata.\n const deleteIds: string[] = []\n\n // Check if filter targets 'id' field (Pinecone record ID)\n const filterTargetsId = plan.filter ? isFilterOnId(plan.filter) : false\n\n if (filterTargetsId) {\n // Filter by record ID directly\n for (const id of ids) {\n if (evaluateFilter(plan.filter, { id })) {\n deleteIds.push(id)\n }\n }\n } else {\n // Filter by metadata\n for (const id of ids) {\n const res = await ns.fetch({ ids: [id] })\n const record = res.records[id]\n if (record && record.metadata) {\n const evalMeta: VectorMetadata = {}\n for (const key in record.metadata) {\n if (key !== '__document') {\n evalMeta[key] = record.metadata[key]\n }\n }\n if (evaluateFilter(plan.filter, evalMeta)) {\n deleteIds.push(id)\n }\n }\n }\n }\n\n if (deleteIds.length > 0) {\n await ns.deleteMany({ ids: deleteIds })\n // Call settle after delete-by-filter to wait for absence\n await this.#settle(ns, collection, { absent: deleteIds }, 'delete by filter', mode)\n }\n } else {\n // Delete all via list+deleteMany pattern (no more deleteAll + settleEmpty)\n let page: any = { next: null }\n const allIds: string[] = []\n do {\n const lr = await this.#index!.listPaginated({\n namespace: physicalNs,\n limit: 1000,\n startingToken: page.next,\n })\n if (lr.vectors) allIds.push(...lr.vectors.map((v: any) => v.id))\n page.next = lr.pagination?.next\n } while (page.next)\n\n if (allIds.length > 0) {\n await ns.deleteMany({ ids: allIds })\n }\n // Settle on absence\n await this.#settle(ns, collection, { absent: allIds }, 'delete all', mode)\n }\n } catch (err) {\n // Re-throw consistency timeout directly (don't swallow)\n if (\n isInstanceOf(err, 'E_VECTOR_STORE_CONSISTENCY_TIMEOUT', E_VECTOR_STORE_CONSISTENCY_TIMEOUT)\n )\n throw err\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n\n// Check if a filter targets the 'id' field (Pinecone record ID)\nconst isFilterOnId = (filter?: VectorFilter): boolean => {\n if (!filter) return false\n if (isRawFilter(filter)) {\n return false\n }\n if (isFilterCondition(filter)) {\n return filter.field === 'id'\n }\n if (isFilterGroup(filter)) {\n const { and, or, not } = filter\n if (and && and.length > 0) {\n return and.some((f) => isFilterOnId(f))\n }\n if (or && or.length > 0) {\n return or.some((f) => isFilterOnId(f))\n }\n if (not) {\n return isFilterOnId(not)\n }\n }\n return false\n}\n\nexport const translatePineconeFilter = (\n filter?: VectorFilter\n): Record<string, unknown> | undefined => {\n if (!filter) return undefined\n if (isRawFilter(filter)) {\n if (filter.$dialect === 'pinecone') {\n return filter.$raw as Record<string, unknown>\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['pinecone', String(filter.$dialect)])\n }\n if (isFilterCondition(filter)) {\n const { field, op, value } = filter\n if (value === undefined) {\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['pinecone', op])\n }\n if (op === 'eq') {\n return { [field]: { $eq: value } }\n }\n if (op === 'ne') {\n return { [field]: { $ne: value } }\n }\n if (op === 'gt') {\n return { [field]: { $gt: value } }\n }\n if (op === 'gte') {\n return { [field]: { $gte: value } }\n }\n if (op === 'lt') {\n return { [field]: { $lt: value } }\n }\n if (op === 'lte') {\n return { [field]: { $lte: value } }\n }\n if (op === 'in') {\n return { [field]: { $in: value } }\n }\n if (op === 'nin') {\n return { [field]: { $nin: value } }\n }\n if (op === 'exists') {\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['pinecone', op])\n }\n if (op === 'contains') {\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['pinecone', op])\n }\n return undefined\n }\n if (isFilterGroup(filter)) {\n const { and, or, not } = filter\n if (and) {\n const children = and\n .map((f) => translatePineconeFilter(f) as Record<string, unknown>)\n .filter((c) => c !== undefined)\n if (children.length === 0) return undefined\n if (children.length === 1) return children[0]\n return { $and: children }\n }\n if (or) {\n const children = or\n .map((f) => translatePineconeFilter(f) as Record<string, unknown>)\n .filter((c) => c !== undefined)\n if (children.length === 0) return undefined\n if (children.length === 1) return children[0]\n return { $or: children }\n }\n if (not) {\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['pinecone', 'not'])\n }\n return undefined\n }\n return undefined\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"pinecone.cjs","names":["#waitVisible","#ns","#dims","#index","#settle","#pc","#consistencyMode"],"sources":["../../../src/batteries/vector/pinecone/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/pinecone\n */\n\nimport { normalizeScore } from '../helpers'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { isInstanceOf } from '@nhtio/adk/guards'\nimport { isFilterCondition, isRawFilter, isFilterGroup, evaluateFilter } from '../filters'\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_FILTER_OPERATOR,\n E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n E_VECTOR_STORE_CONNECTION_FAILED,\n E_VECTOR_STORE_CONSISTENCY_TIMEOUT,\n} from '../exceptions'\nimport type { VectorFilter } from '../filters'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type {\n VectorMatch,\n VectorStoreCapabilities,\n BaseVectorStoreOptions,\n VectorMetadata,\n VectorConsistency,\n} from '../types'\n\nexport interface PineconeVectorStoreOptions extends BaseVectorStoreOptions {\n /** Pinecone API key. */\n apiKey: string\n /** Name of the Pinecone index this store operates against. */\n index: string\n /**\n * When set, the physical Pinecone namespace becomes `${namespacePrefix}__${collection}`.\n * The logical collection name the builder/base see is unchanged — only the physical\n * namespace string is prefixed. Lets callers (and the test suite) isolate otherwise\n * identically-named collections into distinct, uncontended namespaces. Pinecone\n * namespaces are implicit (born on first upsert), so a fresh prefix costs nothing.\n */\n namespacePrefix?: string\n /** Connection and authentication parameters for the backend. */\n connection?: { controllerHostUrl?: string }\n}\n\nconst getPineconeClient = async () => {\n try {\n const mod = await import('@pinecone-database/pinecone')\n return mod.Pinecone\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['@pinecone-database/pinecone'])\n }\n}\n\nexport class PineconeVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: false,\n rawSql: false,\n builtInEncoding: false,\n // Pinecone serverless is eventually consistent: the option is honored, and the default\n // is 'strong' so out-of-the-box behavior matches the strongly-consistent adapters.\n consistency: {\n configurable: true,\n default: 'strong',\n modes: ['strong', 'best-effort', 'eventual'],\n },\n }\n #pc: any | null = null\n #index: any | null = null\n #dims: Map<string, number> = new Map()\n\n // Resolve the effective consistency mode for one write, honoring precedence:\n // per-operation override (plan.consistency) > store option > adapter-declared default.\n #consistencyMode(perOp?: VectorConsistency): VectorConsistency {\n return (\n perOp ??\n (this.options as PineconeVectorStoreOptions).consistency ??\n this.capabilities.consistency.default\n )\n }\n\n // Map a logical collection name to its physical Pinecone namespace. Only the physical\n // namespace string is prefixed; #dims and everything the base/builder see stay keyed on\n // the logical name.\n #ns(collection: string): string {\n const prefix = (this.options as PineconeVectorStoreOptions).namespacePrefix\n return prefix ? `${prefix}__${collection}` : collection\n }\n\n // Returns true if visibility was confirmed within the bound, false on timeout.\n // Polls the SAME read paths the adapter reads through downstream:\n // present ids → must appear in BOTH query() matches AND listPaginated()\n // absent ids → must be gone from BOTH listPaginated() AND fetch()\n async #waitVisible(\n ns: any,\n collection: string,\n opts: { present?: string[]; absent?: string[]; probeVector?: number[] }\n ): Promise<boolean> {\n const present = opts.present ?? []\n const absent = opts.absent ?? []\n if (present.length === 0 && absent.length === 0) return true\n const physicalNs = this.#ns(collection)\n const dims = this.#dims.get(collection) ?? 3\n const queryVec = opts.probeVector ?? new Array(dims).fill(0).map((_, i) => (i === 0 ? 1 : 0))\n const deadline = Date.now() + 10_000 // 10s ceiling; freshness is ~seconds\n const topK = Math.max(present.length + absent.length + 5, 10)\n while (true) {\n let presentOk = true\n let absentOk = true\n if (present.length > 0) {\n let listed = new Set<string>()\n try {\n const lr = await this.#index!.listPaginated({ namespace: physicalNs, limit: 100 })\n listed = new Set((lr.vectors ?? []).map((v: any) => v.id))\n } catch {\n listed = new Set()\n }\n let queried = new Set<string>()\n try {\n const qr = await ns.query({ vector: queryVec, topK, includeValues: false })\n queried = new Set((qr.matches ?? []).map((m: any) => m.id))\n } catch {\n queried = new Set()\n }\n presentOk = present.every((id) => listed.has(id) && queried.has(id))\n }\n if (absent.length > 0) {\n let listed = new Set<string>()\n try {\n const lr = await this.#index!.listPaginated({ namespace: physicalNs, limit: 1000 })\n listed = new Set((lr.vectors ?? []).map((v: any) => v.id))\n } catch {\n listed = new Set()\n }\n let fetched: Record<string, unknown> = {}\n try {\n const fr = await ns.fetch({ ids: absent })\n fetched = fr.records ?? {}\n } catch {\n fetched = {}\n }\n absentOk = absent.every((id) => !listed.has(id) && fetched[id] === undefined)\n }\n if (presentOk && absentOk) return true\n if (Date.now() >= deadline) return false\n await new Promise((r) => setTimeout(r, 300))\n }\n }\n\n // Apply the resolved consistency-mode semantics for one write:\n // strong → wait, and THROW E_VECTOR_STORE_CONSISTENCY_TIMEOUT if not confirmed.\n // best-effort → wait up to the bound, then resolve whether or not confirmed (no throw).\n // eventual → no wait at all.\n // `mode` is the effective mode for THIS operation (already resolved from the precedence\n // chain by the caller via #consistencyMode(plan.consistency)).\n async #settle(\n ns: any,\n collection: string,\n opts: { present?: string[]; absent?: string[] },\n what: string,\n mode: VectorConsistency\n ): Promise<void> {\n if (mode === 'eventual') return\n const confirmed = await this.#waitVisible(ns, collection, opts)\n if (!confirmed && mode === 'strong') {\n throw new E_VECTOR_STORE_CONSISTENCY_TIMEOUT([what])\n }\n // best-effort: resolve regardless\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 async connect(): Promise<void> {\n if (this.#pc) return\n const Pinecone = await getPineconeClient()\n const opts = this.options as PineconeVectorStoreOptions\n try {\n this.#pc = new Pinecone({ apiKey: opts.apiKey, ...opts.connection })\n this.#index = this.#pc.index(opts.index)\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n async close(): Promise<void> {\n this.#pc = null\n this.#index = null\n }\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n const collection = spec.collection\n if (ifNotExists) {\n if (await this.hasCollection(collection)) return\n }\n if (this.#dims.has(collection)) {\n const existingDim = this.#dims.get(collection)!\n if (existingDim !== spec.vector.dimensions) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED([\n 'createCollection',\n `Collection ${collection} already exists with dimension ${existingDim}`,\n ])\n }\n return\n }\n this.#dims.set(collection, spec.vector.dimensions)\n }\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n if (ifExists) {\n if (!(await this.hasCollection(collection))) return\n } else if (!(await this.hasCollection(collection))) {\n return\n }\n await this.connect()\n const physicalNs = this.#ns(collection)\n const ns = this.#index!.namespace(physicalNs)\n try {\n // Get all IDs via pagination\n let page: any = { next: null }\n const ids: string[] = []\n do {\n const lr = await this.#index!.listPaginated({\n namespace: physicalNs,\n limit: 1000,\n startingToken: page.next,\n })\n if (lr.vectors) ids.push(...lr.vectors.map((v: any) => v.id))\n page.next = lr.pagination?.next\n } while (page.next)\n\n // Delete all found IDs\n if (ids.length > 0) {\n await ns.deleteMany({ ids })\n }\n\n // Settle on absence\n await this.#settle(\n ns,\n collection,\n { absent: ids },\n 'dropCollection ' + collection,\n this.#consistencyMode()\n )\n } catch (err: any) {\n // Re-throw consistency timeout directly (don't swallow)\n if (\n isInstanceOf(err, 'E_VECTOR_STORE_CONSISTENCY_TIMEOUT', E_VECTOR_STORE_CONSISTENCY_TIMEOUT)\n )\n throw err\n const msg = String(err)\n if (ifExists && msg.includes('not found')) return\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', msg])\n }\n }\n async hasCollection(collection: string): Promise<boolean> {\n await this.connect()\n const stats = await this.#index!.describeIndexStats()\n return !!stats.namespaces?.[this.#ns(collection)]\n }\n async renameCollection(_from: string, _to: string): Promise<void> {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'pinecone'])\n }\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n await this.connect()\n const collection = plan.collection\n const ns = this.#index!.namespace(this.#ns(collection))\n const dims = this.#dims.get(collection)\n const vectors: any[] = []\n for (const r of plan.records) {\n let vector = r.vector\n if (!vector && r.document) {\n const [v] = await this.encode([r.document], 'document')\n vector = v\n }\n if (!vector) {\n throw new E_VECTOR_STORE_UPSERT_FAILED(['Record missing vector and document'])\n }\n if (dims !== undefined && vector.length !== dims) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([dims, vector.length])\n }\n vectors.push({\n id: r.id,\n values: vector,\n metadata: { ...r.metadata, __document: r.document ?? '' },\n })\n }\n try {\n await ns.upsert({ records: vectors })\n // Call settle after upsert to wait for visibility (per-op override > store > default)\n await this.#settle(\n ns,\n collection,\n { present: vectors.map((v) => v.id) },\n 'upsert ' + vectors.length + ' record(s)',\n this.#consistencyMode(plan.consistency)\n )\n } catch (err) {\n if (\n isInstanceOf(err, 'E_VECTOR_STORE_CONSISTENCY_TIMEOUT', E_VECTOR_STORE_CONSISTENCY_TIMEOUT)\n )\n throw err\n throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n }\n }\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n await this.connect()\n const collection = plan.collection\n const physicalNs = this.#ns(collection)\n const ns = this.#index!.namespace(physicalNs)\n const metric = this.options.metric ?? 'cosine'\n let queryVector: number[] | undefined\n if (plan.near) {\n if ('vector' in plan.near) {\n queryVector = plan.near.vector\n } else if ('serverText' in plan.near) {\n const [v] = await this.encode([plan.near.serverText], 'query')\n queryVector = v\n } else if ('id' in plan.near) {\n const res = await ns.fetch({ ids: [plan.near.id] })\n const record = res.records[plan.near.id]\n if (!record) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = record.values\n }\n }\n const offset = plan.offset ?? 0\n const k = plan.topK + offset\n if (queryVector) {\n const filter = translatePineconeFilter(plan.filter)\n const res = await ns.query({\n vector: queryVector,\n topK: k,\n filter,\n includeMetadata: true,\n includeValues: !!plan.projection.vector,\n })\n const rawMatches = res.matches ?? []\n const sliceMatches = rawMatches.slice(offset)\n const matches: VectorMatch[] = []\n for (const match of sliceMatches) {\n const proj: VectorMatch = {}\n if (plan.projection.id) {\n proj.id = match.id\n }\n if (plan.projection.vector && match.values) {\n proj.vector = match.values\n }\n if (plan.projection.document && match.metadata) {\n proj.document = match.metadata.__document\n }\n if (plan.projection.metadata && match.metadata) {\n const meta: VectorMetadata = {}\n for (const key in match.metadata) {\n if (key !== '__document') {\n meta[key] = match.metadata[key]\n }\n }\n proj.metadata = meta\n }\n if (plan.near) {\n proj.score = normalizeScore(match.score!, metric, 'similarity')\n }\n matches.push(proj)\n }\n return matches\n } else {\n // Filter-scan: Pinecone v7 listPaginated filter is broken, so we get all records\n // and filter client-side. First, get all IDs without filter, then fetch.\n let page: any = { next: null }\n const ids: string[] = []\n do {\n // Get all IDs without filter - Pinecone v7 listPaginated without filter works\n const listRes = await this.#index!.listPaginated({\n limit: 100,\n startingToken: page.next,\n namespace: physicalNs,\n })\n if (listRes.vectors) {\n ids.push(...listRes.vectors.map((v: any) => v.id))\n }\n page.next = listRes.pagination?.next\n } while (page.next)\n if (ids.length === 0) return []\n\n // Fetch all records and filter client-side\n const allRecords: any = {}\n for (let i = 0; i < ids.length; i += 100) {\n const batch = ids.slice(i, i + 100)\n const fetchRes = await ns.fetch({ ids: batch })\n if (fetchRes && fetchRes.records) {\n for (const id in fetchRes.records) {\n allRecords[id] = fetchRes.records[id]\n }\n }\n }\n const matches: VectorMatch[] = []\n for (const id in allRecords) {\n const record = allRecords[id]\n if (record.metadata) {\n const evalMeta: VectorMetadata = {}\n for (const key in record.metadata) {\n if (key !== '__document') {\n evalMeta[key] = record.metadata[key]\n }\n }\n // If no filter, include all records; otherwise evaluate the filter\n if (!plan.filter || evaluateFilter(plan.filter, evalMeta)) {\n const proj: VectorMatch = {}\n if (plan.projection.id) {\n proj.id = id\n }\n if (plan.projection.vector && record.values) {\n proj.vector = record.values\n }\n if (plan.projection.document && record.metadata) {\n proj.document = record.metadata.__document\n }\n if (plan.projection.metadata && record.metadata) {\n const meta: VectorMetadata = {}\n for (const key in record.metadata) {\n if (key !== '__document') {\n meta[key] = record.metadata[key]\n }\n }\n proj.metadata = meta as VectorMetadata\n }\n matches.push(proj)\n }\n }\n }\n return matches.slice(offset, offset + plan.topK)\n }\n }\n async executeDelete(plan: DeletePlan): Promise<void> {\n await this.connect()\n const collection = plan.collection\n const physicalNs = this.#ns(collection)\n const ns = this.#index!.namespace(physicalNs)\n const mode = this.#consistencyMode(plan.consistency)\n try {\n if (plan.ids && plan.ids.length > 0) {\n await ns.deleteMany({ ids: plan.ids })\n // Call settle after delete-by-ids to wait for absence\n await this.#settle(ns, collection, { absent: plan.ids }, 'delete by id', mode)\n } else if (plan.filter) {\n // Pinecone v7 listPaginated filter is broken, and Pinecone doesn't support\n // filtering by record ID. Get all IDs and filter client-side.\n let page: any = { next: null }\n const ids: string[] = []\n do {\n const listRes = await this.#index!.listPaginated({\n limit: 1000,\n startingToken: page.next,\n namespace: physicalNs,\n })\n if (listRes.vectors) {\n ids.push(...listRes.vectors.map((v: any) => v.id))\n }\n page.next = listRes.pagination?.next\n } while (page.next)\n\n // For Pinecone, we can only filter by metadata fields.\n // If the filter is on 'id', filter client-side without metadata.\n // Otherwise, fetch records and filter by metadata.\n const deleteIds: string[] = []\n\n // Check if filter targets 'id' field (Pinecone record ID)\n const filterTargetsId = plan.filter ? isFilterOnId(plan.filter) : false\n\n if (filterTargetsId) {\n // Filter by record ID directly\n for (const id of ids) {\n if (evaluateFilter(plan.filter, { id })) {\n deleteIds.push(id)\n }\n }\n } else {\n // Filter by metadata\n for (const id of ids) {\n const res = await ns.fetch({ ids: [id] })\n const record = res.records[id]\n if (record && record.metadata) {\n const evalMeta: VectorMetadata = {}\n for (const key in record.metadata) {\n if (key !== '__document') {\n evalMeta[key] = record.metadata[key]\n }\n }\n if (evaluateFilter(plan.filter, evalMeta)) {\n deleteIds.push(id)\n }\n }\n }\n }\n\n if (deleteIds.length > 0) {\n await ns.deleteMany({ ids: deleteIds })\n // Call settle after delete-by-filter to wait for absence\n await this.#settle(ns, collection, { absent: deleteIds }, 'delete by filter', mode)\n }\n } else {\n // Delete all via list+deleteMany pattern (no more deleteAll + settleEmpty)\n let page: any = { next: null }\n const allIds: string[] = []\n do {\n const lr = await this.#index!.listPaginated({\n namespace: physicalNs,\n limit: 1000,\n startingToken: page.next,\n })\n if (lr.vectors) allIds.push(...lr.vectors.map((v: any) => v.id))\n page.next = lr.pagination?.next\n } while (page.next)\n\n if (allIds.length > 0) {\n await ns.deleteMany({ ids: allIds })\n }\n // Settle on absence\n await this.#settle(ns, collection, { absent: allIds }, 'delete all', mode)\n }\n } catch (err) {\n // Re-throw consistency timeout directly (don't swallow)\n if (\n isInstanceOf(err, 'E_VECTOR_STORE_CONSISTENCY_TIMEOUT', E_VECTOR_STORE_CONSISTENCY_TIMEOUT)\n )\n throw err\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n\n// Check if a filter targets the 'id' field (Pinecone record ID)\nconst isFilterOnId = (filter?: VectorFilter): boolean => {\n if (!filter) return false\n if (isRawFilter(filter)) {\n return false\n }\n if (isFilterCondition(filter)) {\n return filter.field === 'id'\n }\n if (isFilterGroup(filter)) {\n const { and, or, not } = filter\n if (and && and.length > 0) {\n return and.some((f) => isFilterOnId(f))\n }\n if (or && or.length > 0) {\n return or.some((f) => isFilterOnId(f))\n }\n if (not) {\n return isFilterOnId(not)\n }\n }\n return false\n}\n\n/** Translate a neutral {@link VectorFilter} into a Pinecone metadata filter object. */\nexport const translatePineconeFilter = (\n filter?: VectorFilter\n): Record<string, unknown> | undefined => {\n if (!filter) return undefined\n if (isRawFilter(filter)) {\n if (filter.$dialect === 'pinecone') {\n return filter.$raw as Record<string, unknown>\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['pinecone', String(filter.$dialect)])\n }\n if (isFilterCondition(filter)) {\n const { field, op, value } = filter\n if (value === undefined) {\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['pinecone', op])\n }\n if (op === 'eq') {\n return { [field]: { $eq: value } }\n }\n if (op === 'ne') {\n return { [field]: { $ne: value } }\n }\n if (op === 'gt') {\n return { [field]: { $gt: value } }\n }\n if (op === 'gte') {\n return { [field]: { $gte: value } }\n }\n if (op === 'lt') {\n return { [field]: { $lt: value } }\n }\n if (op === 'lte') {\n return { [field]: { $lte: value } }\n }\n if (op === 'in') {\n return { [field]: { $in: value } }\n }\n if (op === 'nin') {\n return { [field]: { $nin: value } }\n }\n if (op === 'exists') {\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['pinecone', op])\n }\n if (op === 'contains') {\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['pinecone', op])\n }\n return undefined\n }\n if (isFilterGroup(filter)) {\n const { and, or, not } = filter\n if (and) {\n const children = and\n .map((f) => translatePineconeFilter(f) as Record<string, unknown>)\n .filter((c) => c !== undefined)\n if (children.length === 0) return undefined\n if (children.length === 1) return children[0]\n return { $and: children }\n }\n if (or) {\n const children = or\n .map((f) => translatePineconeFilter(f) as Record<string, unknown>)\n .filter((c) => c !== undefined)\n if (children.length === 0) return undefined\n if (children.length === 1) return children[0]\n return { $or: children }\n }\n if (not) {\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['pinecone', 'not'])\n }\n return undefined\n }\n return undefined\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, isFilterCondition, isFilterGroup, isRawFilter } from "./filters.mjs";
4
4
  import { normalizeScore } from "./helpers.mjs";
@@ -107,6 +107,7 @@ var PineconeVectorStore = class extends BaseVectorStore {
107
107
  if (mode === "eventual") return;
108
108
  if (!await this.#waitVisible(ns, collection, opts) && mode === "strong") throw new E_VECTOR_STORE_CONSISTENCY_TIMEOUT([what]);
109
109
  }
110
+ /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
110
111
  static isAvailable() {
111
112
  return typeof process !== "undefined";
112
113
  }
@@ -367,6 +368,7 @@ var isFilterOnId = (filter) => {
367
368
  }
368
369
  return false;
369
370
  };
371
+ /** Translate a neutral {@link VectorFilter} into a Pinecone metadata filter object. */
370
372
  var translatePineconeFilter = (filter) => {
371
373
  if (!filter) return void 0;
372
374
  if (isRawFilter(filter)) {