@nhtio/adk 1.20260604.0 → 1.20260607.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (358) hide show
  1. package/CHANGELOG.md +261 -0
  2. package/adk-mcp.mjs +1 -1
  3. package/batteries/embeddings/openai/adapter.cjs +1 -1
  4. package/batteries/embeddings/openai/adapter.mjs +1 -1
  5. package/batteries/embeddings/webllm/adapter.cjs +1 -1
  6. package/batteries/embeddings/webllm/adapter.mjs +1 -1
  7. package/batteries/index.d.ts +1 -0
  8. package/batteries/llm/openai_chat_completions/adapter.cjs +6 -6
  9. package/batteries/llm/openai_chat_completions/adapter.cjs.map +1 -1
  10. package/batteries/llm/openai_chat_completions/adapter.mjs +6 -6
  11. package/batteries/llm/openai_chat_completions/adapter.mjs.map +1 -1
  12. package/batteries/llm/openai_chat_completions/helpers.cjs +2 -2
  13. package/batteries/llm/openai_chat_completions/helpers.mjs +2 -2
  14. package/batteries/llm/openai_chat_completions/validation.cjs +2 -2
  15. package/batteries/llm/openai_chat_completions/validation.cjs.map +1 -1
  16. package/batteries/llm/openai_chat_completions/validation.mjs +2 -2
  17. package/batteries/llm/openai_chat_completions/validation.mjs.map +1 -1
  18. package/batteries/llm/webllm_chat_completions/adapter.cjs +6 -6
  19. package/batteries/llm/webllm_chat_completions/adapter.cjs.map +1 -1
  20. package/batteries/llm/webllm_chat_completions/adapter.mjs +6 -6
  21. package/batteries/llm/webllm_chat_completions/adapter.mjs.map +1 -1
  22. package/batteries/llm/webllm_chat_completions/validation.cjs +2 -2
  23. package/batteries/llm/webllm_chat_completions/validation.cjs.map +1 -1
  24. package/batteries/llm/webllm_chat_completions/validation.mjs +2 -2
  25. package/batteries/llm/webllm_chat_completions/validation.mjs.map +1 -1
  26. package/batteries/storage/flydrive.cjs +1 -1
  27. package/batteries/storage/flydrive.mjs +2 -2
  28. package/batteries/storage/in_memory.cjs +1 -1
  29. package/batteries/storage/in_memory.mjs +1 -1
  30. package/batteries/storage/opfs.cjs +1 -1
  31. package/batteries/storage/opfs.mjs +1 -1
  32. package/batteries/tools/color.cjs +2 -2
  33. package/batteries/tools/color.mjs +2 -2
  34. package/batteries/tools/comparison.cjs +3 -3
  35. package/batteries/tools/comparison.mjs +3 -3
  36. package/batteries/tools/data_structure.cjs +3 -3
  37. package/batteries/tools/data_structure.mjs +3 -3
  38. package/batteries/tools/datetime_extended.cjs +2 -2
  39. package/batteries/tools/datetime_extended.mjs +2 -2
  40. package/batteries/tools/datetime_math.cjs +2 -2
  41. package/batteries/tools/datetime_math.mjs +2 -2
  42. package/batteries/tools/encoding.cjs +3 -3
  43. package/batteries/tools/encoding.mjs +3 -3
  44. package/batteries/tools/formatting.cjs +3 -3
  45. package/batteries/tools/formatting.mjs +3 -3
  46. package/batteries/tools/geo_basics.cjs +2 -2
  47. package/batteries/tools/geo_basics.mjs +2 -2
  48. package/batteries/tools/math/index.d.ts +16 -5
  49. package/batteries/tools/math.cjs +340 -22
  50. package/batteries/tools/math.cjs.map +1 -1
  51. package/batteries/tools/math.mjs +338 -21
  52. package/batteries/tools/math.mjs.map +1 -1
  53. package/batteries/tools/memory.cjs +5 -5
  54. package/batteries/tools/memory.mjs +5 -5
  55. package/batteries/tools/parsing.cjs +4 -4
  56. package/batteries/tools/parsing.mjs +4 -4
  57. package/batteries/tools/retrievables.cjs +4 -4
  58. package/batteries/tools/retrievables.mjs +4 -4
  59. package/batteries/tools/standing_instructions.cjs +4 -4
  60. package/batteries/tools/standing_instructions.mjs +4 -4
  61. package/batteries/tools/statistics.cjs +4 -4
  62. package/batteries/tools/statistics.mjs +4 -4
  63. package/batteries/tools/string_processing.cjs +3 -3
  64. package/batteries/tools/string_processing.mjs +3 -3
  65. package/batteries/tools/structured_data.cjs +3 -3
  66. package/batteries/tools/structured_data.mjs +3 -3
  67. package/batteries/tools/text_analysis.cjs +3 -3
  68. package/batteries/tools/text_analysis.mjs +3 -3
  69. package/batteries/tools/text_comparison.cjs +2 -2
  70. package/batteries/tools/text_comparison.mjs +2 -2
  71. package/batteries/tools/time.cjs +2 -2
  72. package/batteries/tools/time.mjs +2 -2
  73. package/batteries/tools/unit_conversion.cjs +2 -2
  74. package/batteries/tools/unit_conversion.mjs +2 -2
  75. package/batteries/vector/arangodb/index.d.ts +38 -0
  76. package/batteries/vector/arangodb.cjs +257 -0
  77. package/batteries/vector/arangodb.cjs.map +1 -0
  78. package/batteries/vector/arangodb.mjs +255 -0
  79. package/batteries/vector/arangodb.mjs.map +1 -0
  80. package/batteries/vector/builder.cjs +297 -0
  81. package/batteries/vector/builder.cjs.map +1 -0
  82. package/batteries/vector/builder.d.ts +87 -0
  83. package/batteries/vector/builder.mjs +294 -0
  84. package/batteries/vector/builder.mjs.map +1 -0
  85. package/batteries/vector/chroma/index.d.ts +32 -0
  86. package/batteries/vector/chroma.cjs +305 -0
  87. package/batteries/vector/chroma.cjs.map +1 -0
  88. package/batteries/vector/chroma.mjs +302 -0
  89. package/batteries/vector/chroma.mjs.map +1 -0
  90. package/batteries/vector/clickhouse/index.d.ts +39 -0
  91. package/batteries/vector/clickhouse.cjs +246 -0
  92. package/batteries/vector/clickhouse.cjs.map +1 -0
  93. package/batteries/vector/clickhouse.mjs +244 -0
  94. package/batteries/vector/clickhouse.mjs.map +1 -0
  95. package/batteries/vector/cloudflare/index.d.ts +43 -0
  96. package/batteries/vector/cloudflare.cjs +397 -0
  97. package/batteries/vector/cloudflare.cjs.map +1 -0
  98. package/batteries/vector/cloudflare.mjs +395 -0
  99. package/batteries/vector/cloudflare.mjs.map +1 -0
  100. package/batteries/vector/conformance/index.d.ts +15 -0
  101. package/batteries/vector/conformance.cjs +209 -0
  102. package/batteries/vector/conformance.cjs.map +1 -0
  103. package/batteries/vector/conformance.mjs +205 -0
  104. package/batteries/vector/conformance.mjs.map +1 -0
  105. package/batteries/vector/contract.cjs +42 -0
  106. package/batteries/vector/contract.cjs.map +1 -0
  107. package/batteries/vector/contract.d.ts +39 -0
  108. package/batteries/vector/contract.mjs +40 -0
  109. package/batteries/vector/contract.mjs.map +1 -0
  110. package/batteries/vector/couchbase/index.d.ts +49 -0
  111. package/batteries/vector/couchbase.cjs +401 -0
  112. package/batteries/vector/couchbase.cjs.map +1 -0
  113. package/batteries/vector/couchbase.mjs +399 -0
  114. package/batteries/vector/couchbase.mjs.map +1 -0
  115. package/batteries/vector/duckdb/index.d.ts +33 -0
  116. package/batteries/vector/duckdb.cjs +218 -0
  117. package/batteries/vector/duckdb.cjs.map +1 -0
  118. package/batteries/vector/duckdb.mjs +216 -0
  119. package/batteries/vector/duckdb.mjs.map +1 -0
  120. package/batteries/vector/elasticsearch/index.d.ts +43 -0
  121. package/batteries/vector/elasticsearch.cjs +306 -0
  122. package/batteries/vector/elasticsearch.cjs.map +1 -0
  123. package/batteries/vector/elasticsearch.mjs +303 -0
  124. package/batteries/vector/elasticsearch.mjs.map +1 -0
  125. package/batteries/vector/exceptions.cjs +126 -0
  126. package/batteries/vector/exceptions.cjs.map +1 -0
  127. package/batteries/vector/exceptions.d.ts +142 -0
  128. package/batteries/vector/exceptions.mjs +107 -0
  129. package/batteries/vector/exceptions.mjs.map +1 -0
  130. package/batteries/vector/factory.cjs +28 -0
  131. package/batteries/vector/factory.cjs.map +1 -0
  132. package/batteries/vector/factory.d.ts +38 -0
  133. package/batteries/vector/factory.mjs +25 -0
  134. package/batteries/vector/factory.mjs.map +1 -0
  135. package/batteries/vector/filters.cjs +107 -0
  136. package/batteries/vector/filters.cjs.map +1 -0
  137. package/batteries/vector/filters.d.ts +34 -0
  138. package/batteries/vector/filters.mjs +99 -0
  139. package/batteries/vector/filters.mjs.map +1 -0
  140. package/batteries/vector/helpers.cjs +23 -0
  141. package/batteries/vector/helpers.cjs.map +1 -0
  142. package/batteries/vector/helpers.d.ts +12 -0
  143. package/batteries/vector/helpers.mjs +17 -0
  144. package/batteries/vector/helpers.mjs.map +1 -0
  145. package/batteries/vector/hnswlib/index.d.ts +35 -0
  146. package/batteries/vector/hnswlib.cjs +237 -0
  147. package/batteries/vector/hnswlib.cjs.map +1 -0
  148. package/batteries/vector/hnswlib.mjs +235 -0
  149. package/batteries/vector/hnswlib.mjs.map +1 -0
  150. package/batteries/vector/in_memory/index.d.ts +23 -0
  151. package/batteries/vector/in_memory.cjs +178 -0
  152. package/batteries/vector/in_memory.cjs.map +1 -0
  153. package/batteries/vector/in_memory.mjs +176 -0
  154. package/batteries/vector/in_memory.mjs.map +1 -0
  155. package/batteries/vector/index.d.ts +18 -0
  156. package/batteries/vector/lancedb/index.d.ts +34 -0
  157. package/batteries/vector/lancedb.cjs +224 -0
  158. package/batteries/vector/lancedb.cjs.map +1 -0
  159. package/batteries/vector/lancedb.mjs +222 -0
  160. package/batteries/vector/lancedb.mjs.map +1 -0
  161. package/batteries/vector/mariadb/index.d.ts +39 -0
  162. package/batteries/vector/mariadb.cjs +228 -0
  163. package/batteries/vector/mariadb.cjs.map +1 -0
  164. package/batteries/vector/mariadb.mjs +226 -0
  165. package/batteries/vector/mariadb.mjs.map +1 -0
  166. package/batteries/vector/meilisearch/index.d.ts +36 -0
  167. package/batteries/vector/meilisearch.cjs +242 -0
  168. package/batteries/vector/meilisearch.cjs.map +1 -0
  169. package/batteries/vector/meilisearch.mjs +240 -0
  170. package/batteries/vector/meilisearch.mjs.map +1 -0
  171. package/batteries/vector/migrate.cjs +54 -0
  172. package/batteries/vector/migrate.cjs.map +1 -0
  173. package/batteries/vector/migrate.d.ts +30 -0
  174. package/batteries/vector/migrate.mjs +52 -0
  175. package/batteries/vector/migrate.mjs.map +1 -0
  176. package/batteries/vector/milvus/index.d.ts +35 -0
  177. package/batteries/vector/milvus.cjs +357 -0
  178. package/batteries/vector/milvus.cjs.map +1 -0
  179. package/batteries/vector/milvus.mjs +354 -0
  180. package/batteries/vector/milvus.mjs.map +1 -0
  181. package/batteries/vector/mongodb/index.d.ts +46 -0
  182. package/batteries/vector/mongodb.cjs +270 -0
  183. package/batteries/vector/mongodb.cjs.map +1 -0
  184. package/batteries/vector/mongodb.mjs +268 -0
  185. package/batteries/vector/mongodb.mjs.map +1 -0
  186. package/batteries/vector/neo4j/index.d.ts +38 -0
  187. package/batteries/vector/neo4j.cjs +231 -0
  188. package/batteries/vector/neo4j.cjs.map +1 -0
  189. package/batteries/vector/neo4j.mjs +229 -0
  190. package/batteries/vector/neo4j.mjs.map +1 -0
  191. package/batteries/vector/opensearch/index.d.ts +46 -0
  192. package/batteries/vector/opensearch.cjs +316 -0
  193. package/batteries/vector/opensearch.cjs.map +1 -0
  194. package/batteries/vector/opensearch.mjs +313 -0
  195. package/batteries/vector/opensearch.mjs.map +1 -0
  196. package/batteries/vector/oracle23ai/index.d.ts +45 -0
  197. package/batteries/vector/oracle23ai.cjs +340 -0
  198. package/batteries/vector/oracle23ai.cjs.map +1 -0
  199. package/batteries/vector/oracle23ai.mjs +338 -0
  200. package/batteries/vector/oracle23ai.mjs.map +1 -0
  201. package/batteries/vector/orama/index.d.ts +23 -0
  202. package/batteries/vector/orama.cjs +272 -0
  203. package/batteries/vector/orama.cjs.map +1 -0
  204. package/batteries/vector/orama.mjs +270 -0
  205. package/batteries/vector/orama.mjs.map +1 -0
  206. package/batteries/vector/pgvector/index.d.ts +43 -0
  207. package/batteries/vector/pgvector.cjs +411 -0
  208. package/batteries/vector/pgvector.cjs.map +1 -0
  209. package/batteries/vector/pgvector.mjs +408 -0
  210. package/batteries/vector/pgvector.mjs.map +1 -0
  211. package/batteries/vector/pinecone/index.d.ts +38 -0
  212. package/batteries/vector/pinecone.cjs +415 -0
  213. package/batteries/vector/pinecone.cjs.map +1 -0
  214. package/batteries/vector/pinecone.mjs +412 -0
  215. package/batteries/vector/pinecone.mjs.map +1 -0
  216. package/batteries/vector/plan.cjs +2 -0
  217. package/batteries/vector/plan.d.ts +65 -0
  218. package/batteries/vector/plan.mjs +0 -0
  219. package/batteries/vector/qdrant/index.d.ts +34 -0
  220. package/batteries/vector/qdrant.cjs +286 -0
  221. package/batteries/vector/qdrant.cjs.map +1 -0
  222. package/batteries/vector/qdrant.mjs +284 -0
  223. package/batteries/vector/qdrant.mjs.map +1 -0
  224. package/batteries/vector/redis/index.d.ts +44 -0
  225. package/batteries/vector/redis.cjs +391 -0
  226. package/batteries/vector/redis.cjs.map +1 -0
  227. package/batteries/vector/redis.mjs +388 -0
  228. package/batteries/vector/redis.mjs.map +1 -0
  229. package/batteries/vector/retrievable.cjs +69 -0
  230. package/batteries/vector/retrievable.cjs.map +1 -0
  231. package/batteries/vector/retrievable.mjs +67 -0
  232. package/batteries/vector/retrievable.mjs.map +1 -0
  233. package/batteries/vector/retrievable_glue.d.ts +24 -0
  234. package/batteries/vector/s3vectors/index.d.ts +52 -0
  235. package/batteries/vector/s3vectors.cjs +438 -0
  236. package/batteries/vector/s3vectors.cjs.map +1 -0
  237. package/batteries/vector/s3vectors.mjs +436 -0
  238. package/batteries/vector/s3vectors.mjs.map +1 -0
  239. package/batteries/vector/schema.cjs +96 -0
  240. package/batteries/vector/schema.cjs.map +1 -0
  241. package/batteries/vector/schema.d.ts +40 -0
  242. package/batteries/vector/schema.mjs +93 -0
  243. package/batteries/vector/schema.mjs.map +1 -0
  244. package/batteries/vector/solr/index.d.ts +36 -0
  245. package/batteries/vector/solr.cjs +230 -0
  246. package/batteries/vector/solr.cjs.map +1 -0
  247. package/batteries/vector/solr.mjs +228 -0
  248. package/batteries/vector/solr.mjs.map +1 -0
  249. package/batteries/vector/sqlite_vec/index.d.ts +30 -0
  250. package/batteries/vector/sqlite_vec.cjs +318 -0
  251. package/batteries/vector/sqlite_vec.cjs.map +1 -0
  252. package/batteries/vector/sqlite_vec.mjs +316 -0
  253. package/batteries/vector/sqlite_vec.mjs.map +1 -0
  254. package/batteries/vector/surrealdb/index.d.ts +37 -0
  255. package/batteries/vector/surrealdb.cjs +230 -0
  256. package/batteries/vector/surrealdb.cjs.map +1 -0
  257. package/batteries/vector/surrealdb.mjs +228 -0
  258. package/batteries/vector/surrealdb.mjs.map +1 -0
  259. package/batteries/vector/types.cjs +2 -0
  260. package/batteries/vector/types.d.ts +100 -0
  261. package/batteries/vector/types.mjs +0 -0
  262. package/batteries/vector/typesense/index.d.ts +38 -0
  263. package/batteries/vector/typesense.cjs +272 -0
  264. package/batteries/vector/typesense.cjs.map +1 -0
  265. package/batteries/vector/typesense.mjs +270 -0
  266. package/batteries/vector/typesense.mjs.map +1 -0
  267. package/batteries/vector/validation.cjs +90 -0
  268. package/batteries/vector/validation.cjs.map +1 -0
  269. package/batteries/vector/validation.d.ts +18 -0
  270. package/batteries/vector/validation.mjs +83 -0
  271. package/batteries/vector/validation.mjs.map +1 -0
  272. package/batteries/vector/vector_store_constructor.cjs +56 -0
  273. package/batteries/vector/vector_store_constructor.cjs.map +1 -0
  274. package/batteries/vector/vector_store_constructor.d.ts +30 -0
  275. package/batteries/vector/vector_store_constructor.mjs +53 -0
  276. package/batteries/vector/vector_store_constructor.mjs.map +1 -0
  277. package/batteries/vector/vespa/index.d.ts +39 -0
  278. package/batteries/vector/vespa.cjs +423 -0
  279. package/batteries/vector/vespa.cjs.map +1 -0
  280. package/batteries/vector/vespa.mjs +421 -0
  281. package/batteries/vector/vespa.mjs.map +1 -0
  282. package/batteries/vector/weaviate/index.d.ts +57 -0
  283. package/batteries/vector/weaviate.cjs +325 -0
  284. package/batteries/vector/weaviate.cjs.map +1 -0
  285. package/batteries/vector/weaviate.mjs +322 -0
  286. package/batteries/vector/weaviate.mjs.map +1 -0
  287. package/batteries/vector.cjs +63 -0
  288. package/batteries/vector.mjs +14 -0
  289. package/batteries.cjs +62 -0
  290. package/batteries.mjs +15 -1
  291. package/{chunk-kRvK8_k2.mjs → chunk-Bpcn9VDT.mjs} +5 -1
  292. package/{common-lMrnzoyn.mjs → common-BT0nfCi9.mjs} +8 -8
  293. package/{common-lMrnzoyn.mjs.map → common-BT0nfCi9.mjs.map} +1 -1
  294. package/{common-D_e5zYsG.js → common-Cj8TaQ9U.js} +8 -8
  295. package/{common-D_e5zYsG.js.map → common-Cj8TaQ9U.js.map} +1 -1
  296. package/common.cjs +7 -7
  297. package/common.mjs +7 -7
  298. package/{dispatch_runner-CpuyATj1.js → dispatch_runner-BHBNupqp.js} +2 -2
  299. package/dispatch_runner-BHBNupqp.js.map +1 -0
  300. package/{dispatch_runner-CDF3X0nv.mjs → dispatch_runner-DPcS7Y_M.mjs} +2 -2
  301. package/dispatch_runner-DPcS7Y_M.mjs.map +1 -0
  302. package/dispatch_runner.cjs +1 -1
  303. package/dispatch_runner.mjs +1 -1
  304. package/forge.cjs +4 -4
  305. package/forge.mjs +4 -4
  306. package/guards.cjs +8 -8
  307. package/guards.mjs +8 -8
  308. package/index.cjs +12 -12
  309. package/index.mjs +12 -12
  310. package/lib/classes/tool_registry.d.ts +70 -4
  311. package/mcp/adk-docs-corpus.json +1 -1
  312. package/package.json +424 -88
  313. package/skills/adk-assembly/SKILL.md +2 -2
  314. package/{spooled_artifact-B8gIIn9h.js → spooled_artifact-BTq6Nzfy.js} +4 -4
  315. package/spooled_artifact-BTq6Nzfy.js.map +1 -0
  316. package/{spooled_artifact-CWoKUDEm.mjs → spooled_artifact-CHoZgWwI.mjs} +4 -4
  317. package/spooled_artifact-CHoZgWwI.mjs.map +1 -0
  318. package/spooled_artifact.cjs +2 -2
  319. package/spooled_artifact.mjs +2 -2
  320. package/{spooled_markdown_artifact-DQX0RCdI.js → spooled_markdown_artifact-CALSDxIx.js} +3 -3
  321. package/{spooled_markdown_artifact-DQX0RCdI.js.map → spooled_markdown_artifact-CALSDxIx.js.map} +1 -1
  322. package/{spooled_markdown_artifact-CNle4jXN.mjs → spooled_markdown_artifact-Ci5UL7l4.mjs} +3 -3
  323. package/{spooled_markdown_artifact-CNle4jXN.mjs.map → spooled_markdown_artifact-Ci5UL7l4.mjs.map} +1 -1
  324. package/src/types/evaluatex.d.ts +31 -0
  325. package/{thought-BD6AkkOr.js → thought-BbwhJ1wb.js} +4 -4
  326. package/thought-BbwhJ1wb.js.map +1 -0
  327. package/{thought-B_P8LiB6.mjs → thought-D34QQZZ9.mjs} +4 -4
  328. package/thought-D34QQZZ9.mjs.map +1 -0
  329. package/{tool-CRZSUcdP.mjs → tool-CMhaDRNd.mjs} +3 -3
  330. package/tool-CMhaDRNd.mjs.map +1 -0
  331. package/{tool-CX9vNHAw.js → tool-CVyZkFC7.js} +3 -3
  332. package/tool-CVyZkFC7.js.map +1 -0
  333. package/{tool_call-BUeMuCc6.mjs → tool_call-CV5qVNlb.mjs} +3 -3
  334. package/{tool_call-BUeMuCc6.mjs.map → tool_call-CV5qVNlb.mjs.map} +1 -1
  335. package/{tool_call--7ti-frB.js → tool_call-Db68hB7y.js} +3 -3
  336. package/{tool_call--7ti-frB.js.map → tool_call-Db68hB7y.js.map} +1 -1
  337. package/{tool_registry-BGHg6KTq.mjs → tool_registry-D1pSSlsd.mjs} +109 -22
  338. package/tool_registry-D1pSSlsd.mjs.map +1 -0
  339. package/{tool_registry-CtCQ4Xoz.js → tool_registry-DYUYqXvo.js} +109 -22
  340. package/tool_registry-DYUYqXvo.js.map +1 -0
  341. package/{turn_runner-BJTtAORU.js → turn_runner-DqWHNP80.js} +5 -5
  342. package/turn_runner-DqWHNP80.js.map +1 -0
  343. package/{turn_runner-C02LZHjt.mjs → turn_runner-fg1Wc3dK.mjs} +5 -5
  344. package/turn_runner-fg1Wc3dK.mjs.map +1 -0
  345. package/turn_runner.cjs +1 -1
  346. package/turn_runner.mjs +1 -1
  347. package/dispatch_runner-CDF3X0nv.mjs.map +0 -1
  348. package/dispatch_runner-CpuyATj1.js.map +0 -1
  349. package/spooled_artifact-B8gIIn9h.js.map +0 -1
  350. package/spooled_artifact-CWoKUDEm.mjs.map +0 -1
  351. package/thought-BD6AkkOr.js.map +0 -1
  352. package/thought-B_P8LiB6.mjs.map +0 -1
  353. package/tool-CRZSUcdP.mjs.map +0 -1
  354. package/tool-CX9vNHAw.js.map +0 -1
  355. package/tool_registry-BGHg6KTq.mjs.map +0 -1
  356. package/tool_registry-CtCQ4Xoz.js.map +0 -1
  357. package/turn_runner-BJTtAORU.js.map +0 -1
  358. package/turn_runner-C02LZHjt.mjs.map +0 -1
@@ -0,0 +1,436 @@
1
+ import { s as isInstanceOf } from "../../tool_registry-D1pSSlsd.mjs";
2
+ import "../../guards.mjs";
3
+ import { evaluateFilter } from "./filters.mjs";
4
+ import { normalizeScore } from "./helpers.mjs";
5
+ import { E_VECTOR_STORE_COLLECTION_FAILED, E_VECTOR_STORE_CONNECTION_FAILED, E_VECTOR_STORE_DELETE_FAILED, E_VECTOR_STORE_DIMENSION_MISMATCH, E_VECTOR_STORE_DRIVER_UNAVAILABLE, E_VECTOR_STORE_SEARCH_FAILED, E_VECTOR_STORE_UNSUPPORTED_OPERATION, E_VECTOR_STORE_UPSERT_FAILED } from "./exceptions.mjs";
6
+ import { BaseVectorStore } from "./contract.mjs";
7
+ import { validateRecords } from "./validation.mjs";
8
+ //#region src/batteries/vector/s3vectors/index.ts
9
+ /**
10
+ * @module @nhtio/adk/batteries/vector/s3vectors
11
+ *
12
+ * AWS S3 Vectors vector-store adapter. A vector BUCKET is provisioned out-of-band (the adapter
13
+ * does NOT create the bucket); a logical collection = an **index** inside that bucket. The SDK is
14
+ * command-based: create/delete/list indexes, PutVectors/QueryVectors/GetVectors/DeleteVectors.
15
+ *
16
+ * Scoring rule: QueryVectors returns `distance`. For cosine, distance = 1 - cosineSim; identical
17
+ * vectors → 0. For euclidean, distance = L2 distance. Scores are derived from the returned
18
+ * distance and normalized to [0,1].
19
+ *
20
+ * Metadata is NATIVE JSON (object). Store the document text under the reserved metadata key
21
+ * `__document`; keep user metadata flat alongside. On read, pull `__document` out into
22
+ * `match.document` and return the rest as `match.metadata`.
23
+ *
24
+ * Filtering: S3 Vectors supports a native filter (Mongo-ish), but for guaranteed cross-adapter
25
+ * parity, **over-fetch and JS-filter** with `evaluateFilter`. When `plan.filter` is set, request
26
+ * a larger `topK` (e.g. 500) without a native filter, then JS-filter, then slice.
27
+ *
28
+ * Eventual consistency: settle-poll after writes/deletes so the conformance suite — which writes
29
+ * then immediately reads — passes deterministically.
30
+ */
31
+ var getS3Vectors = async () => {
32
+ try {
33
+ const mod = await import("@aws-sdk/client-s3vectors");
34
+ return {
35
+ S3VectorsClient: mod.S3VectorsClient,
36
+ CreateIndexCommand: mod.CreateIndexCommand,
37
+ DeleteIndexCommand: mod.DeleteIndexCommand,
38
+ ListIndexesCommand: mod.ListIndexesCommand,
39
+ PutVectorsCommand: mod.PutVectorsCommand,
40
+ QueryVectorsCommand: mod.QueryVectorsCommand,
41
+ GetVectorsCommand: mod.GetVectorsCommand,
42
+ DeleteVectorsCommand: mod.DeleteVectorsCommand
43
+ };
44
+ } catch {
45
+ throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(["@aws-sdk/client-s3vectors"]);
46
+ }
47
+ };
48
+ var mapMetricToS3 = (metric) => {
49
+ if (metric === "cosine") return "cosine";
50
+ if (metric === "euclidean") return "euclidean";
51
+ throw new E_VECTOR_STORE_COLLECTION_FAILED(["createCollection", "Metric \"dot\" is not supported by AWS S3 Vectors; use \"cosine\" or \"euclidean\""]);
52
+ };
53
+ var scoreFromDistance = (distance, metric) => {
54
+ if (metric === "cosine") return normalizeScore(1 - distance, "cosine", "similarity");
55
+ else if (metric === "euclidean") return normalizeScore(distance, "euclidean", "distance");
56
+ else return normalizeScore(1 - distance, "cosine", "similarity");
57
+ };
58
+ var S3VectorsVectorStore = class extends BaseVectorStore {
59
+ capabilities = {
60
+ transactions: false,
61
+ namedVectors: false,
62
+ rename: false,
63
+ rawSql: false,
64
+ builtInEncoding: false,
65
+ consistency: {
66
+ configurable: false,
67
+ default: "strong",
68
+ modes: ["strong"]
69
+ }
70
+ };
71
+ #client = null;
72
+ #dims = /* @__PURE__ */ new Map();
73
+ #metrics = /* @__PURE__ */ new Map();
74
+ get #opts() {
75
+ return this.options;
76
+ }
77
+ #index(collection) {
78
+ return `${this.#opts.connection.indexPrefix ?? ""}${collection}`;
79
+ }
80
+ async #settle(physicalIndex, opts) {
81
+ const present = opts.present ?? [];
82
+ const absent = opts.absent ?? [];
83
+ if (present.length === 0 && absent.length === 0) return;
84
+ const deadline = Date.now() + 1e4;
85
+ const probeVec = new Array(this.#opts.dimensions ?? 3).fill(0).map((_, i) => i === 0 ? 1 : 0);
86
+ const bucket = this.#opts.connection.bucket;
87
+ while (true) {
88
+ let presentOk = true;
89
+ let absentOk = true;
90
+ if (present.length > 0) try {
91
+ const qr = await this.#client.send(new this.#cmd.QueryVectorsCommand({
92
+ vectorBucketName: bucket,
93
+ indexName: physicalIndex,
94
+ queryVector: { float32: probeVec },
95
+ topK: Math.max(present.length + 5, 10),
96
+ returnMetadata: false,
97
+ returnDistance: false
98
+ }));
99
+ const seen = new Set((qr.vectors ?? []).map((v) => v.key));
100
+ presentOk = present.every((k) => seen.has(k));
101
+ } catch {
102
+ presentOk = false;
103
+ }
104
+ if (absent.length > 0) try {
105
+ const qr = await this.#client.send(new this.#cmd.QueryVectorsCommand({
106
+ vectorBucketName: bucket,
107
+ indexName: physicalIndex,
108
+ queryVector: { float32: probeVec },
109
+ topK: 100,
110
+ returnMetadata: false,
111
+ returnDistance: false
112
+ }));
113
+ const seen = new Set((qr.vectors ?? []).map((v) => v.key));
114
+ absentOk = absent.every((k) => !seen.has(k));
115
+ } catch {
116
+ absentOk = false;
117
+ }
118
+ if (presentOk && absentOk) return;
119
+ if (Date.now() >= deadline) return;
120
+ await new Promise((r) => setTimeout(r, 300));
121
+ }
122
+ }
123
+ static isAvailable() {
124
+ return typeof process !== "undefined";
125
+ }
126
+ isAvailable() {
127
+ return typeof process !== "undefined";
128
+ }
129
+ #cmd;
130
+ async connect() {
131
+ if (this.#client) return;
132
+ const { S3VectorsClient, ...cmd } = await getS3Vectors();
133
+ this.#cmd = cmd;
134
+ const { region, credentials } = this.#opts.connection;
135
+ try {
136
+ this.#client = new S3VectorsClient({
137
+ region,
138
+ credentials
139
+ });
140
+ } catch (err) {
141
+ throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)]);
142
+ }
143
+ }
144
+ async close() {
145
+ if (this.#client) {
146
+ await this.#client.destroy?.();
147
+ this.#client = null;
148
+ this.#cmd = void 0;
149
+ }
150
+ }
151
+ async createCollection(spec, ifNotExists) {
152
+ const collection = spec.collection;
153
+ const physicalIndex = this.#index(collection);
154
+ const dims = spec.vector.dimensions;
155
+ const metric = spec.vector.metric;
156
+ const s3Metric = mapMetricToS3(metric);
157
+ this.#dims.set(collection, dims);
158
+ this.#metrics.set(collection, metric);
159
+ if (ifNotExists) {
160
+ if (await this.hasCollection(collection)) return;
161
+ }
162
+ try {
163
+ await this.connect();
164
+ await this.#client.send(new this.#cmd.CreateIndexCommand({
165
+ vectorBucketName: this.#opts.connection.bucket,
166
+ indexName: physicalIndex,
167
+ dataType: "float32",
168
+ dimension: dims,
169
+ distanceMetric: s3Metric
170
+ }));
171
+ const probeVec = new Array(dims).fill(0).map((_, i) => i === 0 ? 1 : 0);
172
+ const deadline = Date.now() + 5e3;
173
+ while (Date.now() < deadline) try {
174
+ await this.#client.send(new this.#cmd.QueryVectorsCommand({
175
+ vectorBucketName: this.#opts.connection.bucket,
176
+ indexName: physicalIndex,
177
+ queryVector: { float32: probeVec },
178
+ topK: 1,
179
+ returnMetadata: false,
180
+ returnDistance: false
181
+ }));
182
+ break;
183
+ } catch {
184
+ await new Promise((r) => setTimeout(r, 100));
185
+ }
186
+ } catch (err) {
187
+ throw new E_VECTOR_STORE_COLLECTION_FAILED(["createCollection", String(err)]);
188
+ }
189
+ }
190
+ async dropCollection(collection, ifExists) {
191
+ const physicalIndex = this.#index(collection);
192
+ if (ifExists) {
193
+ if (!await this.hasCollection(collection)) return;
194
+ } else if (!await this.hasCollection(collection)) return;
195
+ try {
196
+ await this.connect();
197
+ await this.#client.send(new this.#cmd.DeleteIndexCommand({
198
+ vectorBucketName: this.#opts.connection.bucket,
199
+ indexName: physicalIndex
200
+ }));
201
+ this.#dims.delete(collection);
202
+ this.#metrics.delete(collection);
203
+ } catch (err) {
204
+ const msg = String(err);
205
+ if (ifExists && (msg.includes("not found") || msg.includes("ResourceNotFoundException"))) return;
206
+ throw new E_VECTOR_STORE_COLLECTION_FAILED(["dropCollection", msg]);
207
+ }
208
+ }
209
+ async hasCollection(collection) {
210
+ await this.connect();
211
+ try {
212
+ const { indexes } = await this.#client.send(new this.#cmd.ListIndexesCommand({ vectorBucketName: this.#opts.connection.bucket }));
213
+ const physicalIndex = this.#index(collection);
214
+ return !!indexes?.find((idx) => idx.indexName === physicalIndex);
215
+ } catch {
216
+ return false;
217
+ }
218
+ }
219
+ async renameCollection(_from, _to) {
220
+ throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(["renameCollection", "s3vectors"]);
221
+ }
222
+ async executeUpsert(plan) {
223
+ if (plan.records.length === 0) return;
224
+ validateRecords(plan.records);
225
+ const collection = plan.collection;
226
+ const physicalIndex = this.#index(collection);
227
+ const dims = this.#dims.get(collection) ?? this.#opts.dimensions;
228
+ try {
229
+ await this.connect();
230
+ const vectors = [];
231
+ for (const r of plan.records) {
232
+ let vector = r.vector;
233
+ if (!vector && r.document) {
234
+ const [v] = await this.encode([r.document], "document");
235
+ vector = v;
236
+ }
237
+ if (!vector) throw new E_VECTOR_STORE_UPSERT_FAILED(["Record missing vector and document"]);
238
+ if (dims !== void 0 && vector.length !== dims) throw new E_VECTOR_STORE_DIMENSION_MISMATCH([dims, vector.length]);
239
+ vectors.push({
240
+ key: r.id,
241
+ data: { float32: vector },
242
+ metadata: {
243
+ ...r.metadata ?? {},
244
+ __document: r.document ?? ""
245
+ }
246
+ });
247
+ }
248
+ await this.#client.send(new this.#cmd.PutVectorsCommand({
249
+ vectorBucketName: this.#opts.connection.bucket,
250
+ indexName: physicalIndex,
251
+ vectors
252
+ }));
253
+ await this.#settle(physicalIndex, { present: plan.records.map((r) => r.id) });
254
+ } catch (err) {
255
+ if (isInstanceOf(err, "E_VECTOR_STORE_DIMENSION_MISMATCH", E_VECTOR_STORE_DIMENSION_MISMATCH) || isInstanceOf(err, "E_VECTOR_STORE_UPSERT_FAILED", E_VECTOR_STORE_UPSERT_FAILED)) throw err;
256
+ throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)]);
257
+ }
258
+ }
259
+ async executeSearch(plan) {
260
+ await this.connect();
261
+ const collection = plan.collection;
262
+ const physicalIndex = this.#index(collection);
263
+ const metric = this.#metrics.get(collection) ?? this.#opts.metric ?? "cosine";
264
+ const offset = plan.offset ?? 0;
265
+ let queryVector;
266
+ if (plan.near) {
267
+ if ("vector" in plan.near) queryVector = plan.near.vector;
268
+ else if ("serverText" in plan.near) {
269
+ const [v] = await this.encode([plan.near.serverText], "query");
270
+ queryVector = v;
271
+ } else if ("id" in plan.near) try {
272
+ const vec = (await this.#client.send(new this.#cmd.GetVectorsCommand({
273
+ vectorBucketName: this.#opts.connection.bucket,
274
+ indexName: physicalIndex,
275
+ keys: [plan.near.id],
276
+ returnData: true,
277
+ returnMetadata: true
278
+ }))).vectors?.[0];
279
+ if (!vec || !vec.data?.float32) throw new E_VECTOR_STORE_SEARCH_FAILED(["Referenced id not found: " + plan.near.id]);
280
+ queryVector = vec.data.float32;
281
+ } catch (err) {
282
+ if (err?.message?.includes("not found") || err?.message?.includes("ResourceNotFoundException")) throw new E_VECTOR_STORE_SEARCH_FAILED(["Referenced id not found: " + plan.near.id]);
283
+ throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)]);
284
+ }
285
+ }
286
+ const topK = plan.topK;
287
+ if (queryVector) {
288
+ const k = plan.filter ? 100 : Math.min(100, Math.max(topK + offset, 10));
289
+ let rawMatches = (await this.#client.send(new this.#cmd.QueryVectorsCommand({
290
+ vectorBucketName: this.#opts.connection.bucket,
291
+ indexName: physicalIndex,
292
+ queryVector: { float32: queryVector },
293
+ topK: k,
294
+ returnMetadata: true,
295
+ returnDistance: true
296
+ }))).vectors ?? [];
297
+ if (plan.filter) rawMatches = rawMatches.filter((v) => {
298
+ const meta = {};
299
+ for (const key in v.metadata) if (key !== "__document") meta[key] = v.metadata[key];
300
+ return evaluateFilter(plan.filter, meta);
301
+ });
302
+ rawMatches = rawMatches.slice(offset, offset + topK);
303
+ const projected = [];
304
+ const keysToFetch = /* @__PURE__ */ new Set();
305
+ if (plan.projection.vector) for (const v of rawMatches) keysToFetch.add(v.key);
306
+ const vecStore = {};
307
+ if (keysToFetch.size > 0) {
308
+ const batch = Array.from(keysToFetch);
309
+ const vecRes = await this.#client.send(new this.#cmd.GetVectorsCommand({
310
+ vectorBucketName: this.#opts.connection.bucket,
311
+ indexName: physicalIndex,
312
+ keys: batch,
313
+ returnData: true,
314
+ returnMetadata: false
315
+ }));
316
+ for (const v of vecRes.vectors ?? []) if (v.data?.float32) vecStore[v.key] = v.data.float32;
317
+ }
318
+ for (const v of rawMatches) {
319
+ const proj = {};
320
+ if (plan.projection.id) proj.id = v.key;
321
+ if (plan.projection.document) proj.document = typeof v.metadata?.__document === "string" ? v.metadata.__document : "";
322
+ if (plan.projection.metadata) {
323
+ const meta = {};
324
+ for (const key in v.metadata) if (key !== "__document") meta[key] = v.metadata[key];
325
+ proj.metadata = meta;
326
+ }
327
+ if (plan.projection.vector) proj.vector = vecStore[v.key];
328
+ if (plan.near && v.distance !== void 0) proj.score = scoreFromDistance(v.distance, metric);
329
+ projected.push(proj);
330
+ }
331
+ return projected;
332
+ } else {
333
+ let rawMatches = (await this.#client.send(new this.#cmd.QueryVectorsCommand({
334
+ vectorBucketName: this.#opts.connection.bucket,
335
+ indexName: physicalIndex,
336
+ queryVector: { float32: new Array(this.#opts.dimensions ?? 3).fill(0).map((_, i) => i === 0 ? 1 : 0) },
337
+ topK: 100,
338
+ returnMetadata: true,
339
+ returnDistance: false
340
+ }))).vectors ?? [];
341
+ if (plan.filter) rawMatches = rawMatches.filter((v) => {
342
+ const meta = {};
343
+ for (const key in v.metadata) if (key !== "__document") meta[key] = v.metadata[key];
344
+ return evaluateFilter(plan.filter, meta);
345
+ });
346
+ rawMatches = rawMatches.slice(offset, offset + topK);
347
+ const vecStore = {};
348
+ if (plan.projection.vector && rawMatches.length > 0) {
349
+ const vecRes = await this.#client.send(new this.#cmd.GetVectorsCommand({
350
+ vectorBucketName: this.#opts.connection.bucket,
351
+ indexName: physicalIndex,
352
+ keys: rawMatches.map((v) => v.key),
353
+ returnData: true,
354
+ returnMetadata: false
355
+ }));
356
+ for (const v of vecRes.vectors ?? []) if (v.data?.float32) vecStore[v.key] = v.data.float32;
357
+ }
358
+ const projected = [];
359
+ for (const v of rawMatches) {
360
+ const proj = {};
361
+ if (plan.projection.id) proj.id = v.key;
362
+ if (plan.projection.document) proj.document = typeof v.metadata?.__document === "string" ? v.metadata.__document : "";
363
+ if (plan.projection.metadata) {
364
+ const meta = {};
365
+ for (const key in v.metadata) if (key !== "__document") meta[key] = v.metadata[key];
366
+ proj.metadata = meta;
367
+ }
368
+ if (plan.projection.vector) proj.vector = vecStore[v.key];
369
+ projected.push(proj);
370
+ }
371
+ return projected;
372
+ }
373
+ }
374
+ async executeDelete(plan) {
375
+ const collection = plan.collection;
376
+ const physicalIndex = this.#index(collection);
377
+ try {
378
+ await this.connect();
379
+ const bucket = this.#opts.connection.bucket;
380
+ if (plan.ids && plan.ids.length > 0) {
381
+ await this.#client.send(new this.#cmd.DeleteVectorsCommand({
382
+ vectorBucketName: bucket,
383
+ indexName: physicalIndex,
384
+ keys: plan.ids
385
+ }));
386
+ await this.#settle(physicalIndex, { absent: plan.ids });
387
+ } else if (plan.filter) {
388
+ const res = await this.#client.send(new this.#cmd.QueryVectorsCommand({
389
+ vectorBucketName: bucket,
390
+ indexName: physicalIndex,
391
+ queryVector: { float32: new Array(this.#opts.dimensions ?? 3).fill(0).map((_, i) => i === 0 ? 1 : 0) },
392
+ topK: 100,
393
+ returnMetadata: true,
394
+ returnDistance: false
395
+ }));
396
+ const targets = [];
397
+ for (const v of res.vectors ?? []) {
398
+ const evalMeta = {};
399
+ for (const key in v.metadata) if (key !== "__document") evalMeta[key] = v.metadata[key];
400
+ if (evaluateFilter(plan.filter, evalMeta)) targets.push(v.key);
401
+ }
402
+ if (targets.length > 0) {
403
+ await this.#client.send(new this.#cmd.DeleteVectorsCommand({
404
+ vectorBucketName: bucket,
405
+ indexName: physicalIndex,
406
+ keys: targets
407
+ }));
408
+ await this.#settle(physicalIndex, { absent: targets });
409
+ }
410
+ } else {
411
+ const allKeys = ((await this.#client.send(new this.#cmd.QueryVectorsCommand({
412
+ vectorBucketName: bucket,
413
+ indexName: physicalIndex,
414
+ queryVector: { float32: new Array(this.#opts.dimensions ?? 3).fill(0).map((_, i) => i === 0 ? 1 : 0) },
415
+ topK: 100,
416
+ returnMetadata: false,
417
+ returnDistance: false
418
+ }))).vectors ?? []).map((v) => v.key);
419
+ if (allKeys.length > 0) {
420
+ await this.#client.send(new this.#cmd.DeleteVectorsCommand({
421
+ vectorBucketName: bucket,
422
+ indexName: physicalIndex,
423
+ keys: allKeys
424
+ }));
425
+ await this.#settle(physicalIndex, { absent: allKeys });
426
+ }
427
+ }
428
+ } catch (err) {
429
+ throw new E_VECTOR_STORE_DELETE_FAILED([String(err)]);
430
+ }
431
+ }
432
+ };
433
+ //#endregion
434
+ export { S3VectorsVectorStore };
435
+
436
+ //# sourceMappingURL=s3vectors.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s3vectors.mjs","names":["#opts","#settle","#client","#cmd","#index","#dims","#metrics"],"sources":["../../../src/batteries/vector/s3vectors/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/s3vectors\n *\n * AWS S3 Vectors vector-store adapter. A vector BUCKET is provisioned out-of-band (the adapter\n * does NOT create the bucket); a logical collection = an **index** inside that bucket. The SDK is\n * command-based: create/delete/list indexes, PutVectors/QueryVectors/GetVectors/DeleteVectors.\n *\n * Scoring rule: QueryVectors returns `distance`. For cosine, distance = 1 - cosineSim; identical\n * vectors → 0. For euclidean, distance = L2 distance. Scores are derived from the returned\n * distance and normalized to [0,1].\n *\n * Metadata is NATIVE JSON (object). Store the document text under the reserved metadata key\n * `__document`; keep user metadata flat alongside. On read, pull `__document` out into\n * `match.document` and return the rest as `match.metadata`.\n *\n * Filtering: S3 Vectors supports a native filter (Mongo-ish), but for guaranteed cross-adapter\n * parity, **over-fetch and JS-filter** with `evaluateFilter`. When `plan.filter` is set, request\n * a larger `topK` (e.g. 500) without a native filter, then JS-filter, then slice.\n *\n * Eventual consistency: settle-poll after writes/deletes so the conformance suite — which writes\n * then immediately reads — passes deterministically.\n */\n\nimport { evaluateFilter } from '../filters'\nimport { normalizeScore } from '../helpers'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { isInstanceOf } from '@nhtio/adk/guards'\nimport {\n E_VECTOR_STORE_DRIVER_UNAVAILABLE,\n E_VECTOR_STORE_CONNECTION_FAILED,\n E_VECTOR_STORE_COLLECTION_FAILED,\n E_VECTOR_STORE_UPSERT_FAILED,\n E_VECTOR_STORE_SEARCH_FAILED,\n E_VECTOR_STORE_DELETE_FAILED,\n E_VECTOR_STORE_DIMENSION_MISMATCH,\n E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n} from '../exceptions'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type {\n VectorMatch,\n VectorStoreCapabilities,\n BaseVectorStoreOptions,\n VectorMetadata,\n DistanceMetric,\n} from '../types'\n\nconst getS3Vectors = async (): Promise<{\n S3VectorsClient: any\n CreateIndexCommand: any\n DeleteIndexCommand: any\n ListIndexesCommand: any\n PutVectorsCommand: any\n QueryVectorsCommand: any\n GetVectorsCommand: any\n DeleteVectorsCommand: any\n}> => {\n try {\n const mod = await import('@aws-sdk/client-s3vectors')\n return {\n S3VectorsClient: mod.S3VectorsClient,\n CreateIndexCommand: mod.CreateIndexCommand,\n DeleteIndexCommand: mod.DeleteIndexCommand,\n ListIndexesCommand: mod.ListIndexesCommand,\n PutVectorsCommand: mod.PutVectorsCommand,\n QueryVectorsCommand: mod.QueryVectorsCommand,\n GetVectorsCommand: mod.GetVectorsCommand,\n DeleteVectorsCommand: mod.DeleteVectorsCommand,\n }\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['@aws-sdk/client-s3vectors'])\n }\n}\n\nexport interface S3VectorsVectorStoreOptions extends BaseVectorStoreOptions {\n connection: {\n bucket: string\n region?: string\n credentials?: { accessKeyId: string; secretAccessKey: string; sessionToken?: string }\n indexPrefix?: string\n }\n}\n\nconst mapMetricToS3 = (metric: DistanceMetric): string => {\n if (metric === 'cosine') return 'cosine'\n if (metric === 'euclidean') return 'euclidean'\n // dot is not supported by S3 Vectors\n throw new E_VECTOR_STORE_COLLECTION_FAILED([\n 'createCollection',\n 'Metric \"dot\" is not supported by AWS S3 Vectors; use \"cosine\" or \"euclidean\"',\n ])\n}\n\n// QueryVectors returns a `distance`; convert it to the battery's normalized [0,1] similarity\n// score. For cosine, S3 Vectors distance = 1 - cosineSim, so sim = 1 - distance.\nconst scoreFromDistance = (distance: number, metric: DistanceMetric): number => {\n if (metric === 'cosine') {\n // cosine distance = 1 - sim, so sim = 1 - distance\n return normalizeScore(1 - distance, 'cosine', 'similarity')\n } else if (metric === 'euclidean') {\n return normalizeScore(distance, 'euclidean', 'distance')\n } else {\n // Fallback\n return normalizeScore(1 - distance, 'cosine', 'similarity')\n }\n}\n\nexport class S3VectorsVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: false,\n rawSql: false,\n builtInEncoding: false,\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n\n #client: any | null = null\n #dims: Map<string, number> = new Map()\n #metrics: Map<string, DistanceMetric> = new Map()\n\n get #opts(): S3VectorsVectorStoreOptions {\n return this.options as S3VectorsVectorStoreOptions\n }\n\n // Map a logical collection name to its physical S3 Vectors index name (with optional prefix).\n #index(collection: string): string {\n const prefix = this.#opts.connection.indexPrefix ?? ''\n return `${prefix}${collection}`\n }\n\n // Settle-poll: wait until the given keys are visible in QueryVectors (for upsert) or absent\n // (for delete), bounded ~10s with 300ms polls.\n async #settle(\n physicalIndex: string,\n opts: { present?: string[]; absent?: string[] }\n ): Promise<void> {\n const present = opts.present ?? []\n const absent = opts.absent ?? []\n if (present.length === 0 && absent.length === 0) return\n\n const deadline = Date.now() + 10_000\n const probeVec = new Array(this.#opts.dimensions ?? 3).fill(0).map((_, i) => (i === 0 ? 1 : 0))\n const bucket = this.#opts.connection.bucket\n\n while (true) {\n let presentOk = true\n let absentOk = true\n\n if (present.length > 0) {\n try {\n const qr = await this.#client!.send(\n new this.#cmd!.QueryVectorsCommand({\n vectorBucketName: bucket,\n indexName: physicalIndex,\n queryVector: { float32: probeVec },\n topK: Math.max(present.length + 5, 10),\n returnMetadata: false,\n returnDistance: false,\n })\n )\n const seen = new Set((qr.vectors ?? []).map((v: any) => v.key))\n presentOk = present.every((k) => seen.has(k))\n } catch {\n presentOk = false\n }\n }\n\n if (absent.length > 0) {\n try {\n const qr = await this.#client!.send(\n new this.#cmd!.QueryVectorsCommand({\n vectorBucketName: bucket,\n indexName: physicalIndex,\n queryVector: { float32: probeVec },\n topK: 100,\n returnMetadata: false,\n returnDistance: false,\n })\n )\n const seen = new Set((qr.vectors ?? []).map((v: any) => v.key))\n absentOk = absent.every((k) => !seen.has(k))\n } catch {\n absentOk = false\n }\n }\n\n if (presentOk && absentOk) return\n if (Date.now() >= deadline) return\n await new Promise((r) => setTimeout(r, 300))\n }\n }\n\n static isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n\n isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n\n #cmd?: {\n CreateIndexCommand: any\n DeleteIndexCommand: any\n ListIndexesCommand: any\n PutVectorsCommand: any\n QueryVectorsCommand: any\n GetVectorsCommand: any\n DeleteVectorsCommand: any\n }\n\n async connect(): Promise<void> {\n if (this.#client) return\n const { S3VectorsClient, ...cmd } = await getS3Vectors()\n this.#cmd = cmd\n const { region, credentials } = this.#opts.connection\n try {\n this.#client = new S3VectorsClient({ region, credentials })\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n\n async close(): Promise<void> {\n if (this.#client) {\n await this.#client.destroy?.()\n this.#client = null\n this.#cmd = undefined\n }\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n const collection = spec.collection\n const physicalIndex = this.#index(collection)\n const dims = spec.vector.dimensions\n const metric = spec.vector.metric\n\n // Map metric (throws on dot)\n const s3Metric = mapMetricToS3(metric)\n\n this.#dims.set(collection, dims)\n this.#metrics.set(collection, metric)\n\n if (ifNotExists) {\n if (await this.hasCollection(collection)) return\n }\n\n try {\n await this.connect()\n await this.#client!.send(\n new this.#cmd!.CreateIndexCommand({\n vectorBucketName: this.#opts.connection.bucket,\n indexName: physicalIndex,\n dataType: 'float32',\n dimension: dims,\n distanceMetric: s3Metric,\n })\n )\n\n // Brief settle to ensure index is queryable (create has propagation delay)\n const probeVec = new Array(dims).fill(0).map((_, i) => (i === 0 ? 1 : 0))\n const deadline = Date.now() + 5_000\n while (Date.now() < deadline) {\n try {\n await this.#client!.send(\n new this.#cmd!.QueryVectorsCommand({\n vectorBucketName: this.#opts.connection.bucket,\n indexName: physicalIndex,\n queryVector: { float32: probeVec },\n topK: 1,\n returnMetadata: false,\n returnDistance: false,\n })\n )\n break\n } catch {\n await new Promise((r) => setTimeout(r, 100))\n }\n }\n } catch (err: any) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['createCollection', String(err)])\n }\n }\n\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n const physicalIndex = this.#index(collection)\n\n if (ifExists) {\n if (!(await this.hasCollection(collection))) return\n } else if (!(await this.hasCollection(collection))) {\n return\n }\n\n try {\n await this.connect()\n await this.#client!.send(\n new this.#cmd!.DeleteIndexCommand({\n vectorBucketName: this.#opts.connection.bucket,\n indexName: physicalIndex,\n })\n )\n\n // Clear local state\n this.#dims.delete(collection)\n this.#metrics.delete(collection)\n } catch (err: any) {\n const msg = String(err)\n if (ifExists && (msg.includes('not found') || msg.includes('ResourceNotFoundException'))) {\n return\n }\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', msg])\n }\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n await this.connect()\n try {\n const { indexes } = await this.#client!.send(\n new this.#cmd!.ListIndexesCommand({\n vectorBucketName: this.#opts.connection.bucket,\n })\n )\n const physicalIndex = this.#index(collection)\n return !!indexes?.find((idx: any) => idx.indexName === physicalIndex)\n } catch {\n return false\n }\n }\n\n async renameCollection(_from: string, _to: string): Promise<void> {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 's3vectors'])\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n\n const collection = plan.collection\n const physicalIndex = this.#index(collection)\n const dims = this.#dims.get(collection) ?? this.#opts.dimensions\n\n try {\n await this.connect()\n\n const 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 key: r.id,\n data: { float32: vector },\n metadata: { ...(r.metadata ?? {}), __document: r.document ?? '' },\n })\n }\n\n await this.#client!.send(\n new this.#cmd!.PutVectorsCommand({\n vectorBucketName: this.#opts.connection.bucket,\n indexName: physicalIndex,\n vectors,\n })\n )\n\n // Settle until keys are visible\n await this.#settle(physicalIndex, { present: plan.records.map((r) => r.id) })\n } catch (err) {\n if (\n isInstanceOf(err, 'E_VECTOR_STORE_DIMENSION_MISMATCH', E_VECTOR_STORE_DIMENSION_MISMATCH) ||\n isInstanceOf(err, 'E_VECTOR_STORE_UPSERT_FAILED', E_VECTOR_STORE_UPSERT_FAILED)\n ) {\n throw err\n }\n throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n }\n }\n\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n await this.connect()\n const collection = plan.collection\n const physicalIndex = this.#index(collection)\n const metric = this.#metrics.get(collection) ?? this.#opts.metric ?? 'cosine'\n const offset = plan.offset ?? 0\n\n let queryVector: number[] | undefined\n if (plan.near) {\n if ('vector' in plan.near) {\n queryVector = plan.near.vector\n } else if ('serverText' in plan.near) {\n const [v] = await this.encode([plan.near.serverText], 'query')\n queryVector = v\n } else if ('id' in plan.near) {\n try {\n const res = await this.#client!.send(\n new this.#cmd!.GetVectorsCommand({\n vectorBucketName: this.#opts.connection.bucket,\n indexName: physicalIndex,\n keys: [plan.near.id],\n returnData: true,\n returnMetadata: true,\n })\n )\n const vec = res.vectors?.[0]\n if (!vec || !vec.data?.float32) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = vec.data.float32\n } catch (err: any) {\n if (\n err?.message?.includes('not found') ||\n err?.message?.includes('ResourceNotFoundException')\n ) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\n }\n }\n\n const topK = plan.topK\n if (queryVector) {\n // Similarity search: QueryVectors with oversampling + JS-filter.\n // S3 Vectors caps topK at 100, so over-fetch up to that ceiling.\n const k = plan.filter ? 100 : Math.min(100, Math.max(topK + offset, 10))\n const res = await this.#client!.send(\n new this.#cmd!.QueryVectorsCommand({\n vectorBucketName: this.#opts.connection.bucket,\n indexName: physicalIndex,\n queryVector: { float32: queryVector },\n topK: k,\n returnMetadata: true,\n returnDistance: true,\n })\n )\n\n let rawMatches = res.vectors ?? []\n // Filter by JS-evaluateFilter if plan.filter present\n if (plan.filter) {\n rawMatches = rawMatches.filter((v: any) => {\n const meta: VectorMetadata = {}\n for (const key in v.metadata) {\n if (key !== '__document') meta[key] = v.metadata[key]\n }\n return evaluateFilter(plan.filter!, meta)\n })\n }\n // Slice offset+topK\n rawMatches = rawMatches.slice(offset, offset + topK)\n\n // Project matches, recompute scores, and fetch vectors if needed\n const projected: VectorMatch[] = []\n const keysToFetch = new Set<string>()\n if (plan.projection.vector) {\n for (const v of rawMatches) keysToFetch.add(v.key)\n }\n\n // Fetch vectors only when projected\n const vecStore: Record<string, number[]> = {}\n if (keysToFetch.size > 0) {\n const batch = Array.from(keysToFetch)\n const vecRes = await this.#client!.send(\n new this.#cmd!.GetVectorsCommand({\n vectorBucketName: this.#opts.connection.bucket,\n indexName: physicalIndex,\n keys: batch,\n returnData: true,\n returnMetadata: false,\n })\n )\n for (const v of vecRes.vectors ?? []) {\n if (v.data?.float32) vecStore[v.key] = v.data.float32\n }\n }\n\n for (const v of rawMatches) {\n const proj: VectorMatch = {}\n if (plan.projection.id) proj.id = v.key\n if (plan.projection.document) {\n proj.document = typeof v.metadata?.__document === 'string' ? v.metadata.__document : ''\n }\n if (plan.projection.metadata) {\n const meta: VectorMetadata = {}\n for (const key in v.metadata) {\n if (key !== '__document') meta[key] = v.metadata[key]\n }\n proj.metadata = meta\n }\n if (plan.projection.vector) {\n proj.vector = vecStore[v.key]\n }\n if (plan.near && v.distance !== undefined) {\n proj.score = scoreFromDistance(v.distance, metric)\n }\n projected.push(proj)\n }\n\n return projected\n } else {\n // Filter-scan: over-fetch via QueryVectors with arbitrary vector, JS-filter, project without score\n const res = await this.#client!.send(\n new this.#cmd!.QueryVectorsCommand({\n vectorBucketName: this.#opts.connection.bucket,\n indexName: physicalIndex,\n queryVector: {\n float32: new Array(this.#opts.dimensions ?? 3).fill(0).map((_, i) => (i === 0 ? 1 : 0)),\n },\n topK: 100, // S3 Vectors max topK\n returnMetadata: true,\n returnDistance: false,\n })\n )\n\n let rawMatches = res.vectors ?? []\n // JS-filter for parity, then slice\n if (plan.filter) {\n rawMatches = rawMatches.filter((v: any) => {\n const meta: VectorMetadata = {}\n for (const key in v.metadata) {\n if (key !== '__document') meta[key] = v.metadata[key]\n }\n return evaluateFilter(plan.filter!, meta)\n })\n }\n rawMatches = rawMatches.slice(offset, offset + topK)\n\n // Fetch vectors only when projected\n const vecStore: Record<string, number[]> = {}\n if (plan.projection.vector && rawMatches.length > 0) {\n const vecRes = await this.#client!.send(\n new this.#cmd!.GetVectorsCommand({\n vectorBucketName: this.#opts.connection.bucket,\n indexName: physicalIndex,\n keys: rawMatches.map((v: any) => v.key),\n returnData: true,\n returnMetadata: false,\n })\n )\n for (const v of vecRes.vectors ?? []) {\n if (v.data?.float32) vecStore[v.key] = v.data.float32\n }\n }\n\n const projected: VectorMatch[] = []\n for (const v of rawMatches) {\n const proj: VectorMatch = {}\n if (plan.projection.id) proj.id = v.key\n if (plan.projection.document) {\n proj.document = typeof v.metadata?.__document === 'string' ? v.metadata.__document : ''\n }\n if (plan.projection.metadata) {\n const meta: VectorMetadata = {}\n for (const key in v.metadata) {\n if (key !== '__document') meta[key] = v.metadata[key]\n }\n proj.metadata = meta\n }\n if (plan.projection.vector) proj.vector = vecStore[v.key]\n // filter-scan: no score\n projected.push(proj)\n }\n\n return projected\n }\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const collection = plan.collection\n const physicalIndex = this.#index(collection)\n\n try {\n await this.connect()\n const bucket = this.#opts.connection.bucket\n\n if (plan.ids && plan.ids.length > 0) {\n await this.#client!.send(\n new this.#cmd!.DeleteVectorsCommand({\n vectorBucketName: bucket,\n indexName: physicalIndex,\n keys: plan.ids,\n })\n )\n // Settle until absent\n await this.#settle(physicalIndex, { absent: plan.ids })\n } else if (plan.filter) {\n // Enumerate all, JS-filter, delete matched\n const res = await this.#client!.send(\n new this.#cmd!.QueryVectorsCommand({\n vectorBucketName: bucket,\n indexName: physicalIndex,\n queryVector: {\n float32: new Array(this.#opts.dimensions ?? 3)\n .fill(0)\n .map((_, i) => (i === 0 ? 1 : 0)),\n },\n topK: 100, // S3 Vectors max topK\n returnMetadata: true,\n returnDistance: false,\n })\n )\n\n const targets: string[] = []\n for (const v of res.vectors ?? []) {\n const evalMeta: VectorMetadata = {}\n for (const key in v.metadata) {\n if (key !== '__document') evalMeta[key] = v.metadata[key]\n }\n if (evaluateFilter(plan.filter, evalMeta)) {\n targets.push(v.key)\n }\n }\n\n if (targets.length > 0) {\n await this.#client!.send(\n new this.#cmd!.DeleteVectorsCommand({\n vectorBucketName: bucket,\n indexName: physicalIndex,\n keys: targets,\n })\n )\n // Settle until absent\n await this.#settle(physicalIndex, { absent: targets })\n }\n } else {\n // Delete all: enumerate all keys + delete\n const res = await this.#client!.send(\n new this.#cmd!.QueryVectorsCommand({\n vectorBucketName: bucket,\n indexName: physicalIndex,\n queryVector: {\n float32: new Array(this.#opts.dimensions ?? 3)\n .fill(0)\n .map((_, i) => (i === 0 ? 1 : 0)),\n },\n topK: 100, // S3 Vectors max topK\n returnMetadata: false,\n returnDistance: false,\n })\n )\n const allKeys = (res.vectors ?? []).map((v: any) => v.key)\n\n // If index has many vectors, may need pagination; but S3 Vectors QueryVectors is limited to 1000\n // For truly large collections, users should use filter-scan pattern explicitly.\n // Here, we do a best-effort single-page delete.\n if (allKeys.length > 0) {\n await this.#client!.send(\n new this.#cmd!.DeleteVectorsCommand({\n vectorBucketName: bucket,\n indexName: physicalIndex,\n keys: allKeys,\n })\n )\n // Settle until absent\n await this.#settle(physicalIndex, { absent: allKeys })\n }\n }\n } catch (err: any) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../chunk-Ble4zEEl.js");
3
+ //#region src/batteries/vector/schema.ts
4
+ var CollectionBuilder = class {
5
+ #vectorDef;
6
+ #fields = [];
7
+ vector(def) {
8
+ this.#vectorDef = {
9
+ dimensions: def.dimensions,
10
+ metric: def.metric ?? "cosine"
11
+ };
12
+ return this;
13
+ }
14
+ string(name) {
15
+ return this.#pushField(name, "string");
16
+ }
17
+ integer(name) {
18
+ return this.#pushField(name, "integer");
19
+ }
20
+ number(name) {
21
+ return this.#pushField(name, "number");
22
+ }
23
+ boolean(name) {
24
+ return this.#pushField(name, "boolean");
25
+ }
26
+ json(name) {
27
+ return this.#pushField(name, "json");
28
+ }
29
+ #pushField(name, type) {
30
+ const spec = {
31
+ name,
32
+ type,
33
+ index: false,
34
+ nullable: false
35
+ };
36
+ this.#fields.push(spec);
37
+ return new FieldChainImpl(spec);
38
+ }
39
+ build(collection) {
40
+ if (!this.#vectorDef) throw new Error("a collection requires a vector() definition");
41
+ return {
42
+ collection,
43
+ vector: this.#vectorDef,
44
+ fields: this.#fields
45
+ };
46
+ }
47
+ };
48
+ var FieldChainImpl = class {
49
+ #spec;
50
+ constructor(spec) {
51
+ this.#spec = spec;
52
+ }
53
+ index() {
54
+ this.#spec.index = true;
55
+ return this;
56
+ }
57
+ nullable() {
58
+ this.#spec.nullable = true;
59
+ return this;
60
+ }
61
+ };
62
+ var VectorSchemaBuilder = class {
63
+ #executor;
64
+ constructor(executor) {
65
+ this.#executor = executor;
66
+ }
67
+ async createCollection(collection, cb) {
68
+ const builder = new CollectionBuilder();
69
+ cb(builder);
70
+ const spec = builder.build(collection);
71
+ await this.#executor.createCollection(spec, false);
72
+ }
73
+ async createCollectionIfNotExists(collection, cb) {
74
+ const builder = new CollectionBuilder();
75
+ cb(builder);
76
+ const spec = builder.build(collection);
77
+ await this.#executor.createCollection(spec, true);
78
+ }
79
+ async dropCollection(collection) {
80
+ await this.#executor.dropCollection(collection, false);
81
+ }
82
+ async dropCollectionIfExists(collection) {
83
+ await this.#executor.dropCollection(collection, true);
84
+ }
85
+ async hasCollection(collection) {
86
+ return this.#executor.hasCollection(collection);
87
+ }
88
+ async renameCollection(from, to) {
89
+ await this.#executor.renameCollection(from, to);
90
+ }
91
+ };
92
+ //#endregion
93
+ exports.CollectionBuilder = CollectionBuilder;
94
+ exports.VectorSchemaBuilder = VectorSchemaBuilder;
95
+
96
+ //# sourceMappingURL=schema.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.cjs","names":["#vectorDef","#pushField","#fields","#spec","#executor"],"sources":["../../../src/batteries/vector/schema.ts"],"sourcesContent":["/**\n * Knex-style schema builder for the vector battery.\n *\n * @module @nhtio/adk/batteries/vector/schema\n */\n\nimport type { DistanceMetric } from './types'\nimport type { CollectionSpec, CollectionFieldSpec } from './plan'\n\nexport interface SchemaExecutor {\n createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void>\n dropCollection(collection: string, ifExists: boolean): Promise<void>\n hasCollection(collection: string): Promise<boolean>\n renameCollection(from: string, to: string): Promise<void>\n}\n\nexport class CollectionBuilder {\n #vectorDef?: { dimensions: number; metric: DistanceMetric }\n #fields: CollectionFieldSpec[] = []\n\n vector(def: { dimensions: number; metric?: DistanceMetric }): this {\n this.#vectorDef = {\n dimensions: def.dimensions,\n metric: def.metric ?? 'cosine',\n }\n return this\n }\n\n string(name: string): FieldChain {\n return this.#pushField(name, 'string')\n }\n\n integer(name: string): FieldChain {\n return this.#pushField(name, 'integer')\n }\n\n number(name: string): FieldChain {\n return this.#pushField(name, 'number')\n }\n\n boolean(name: string): FieldChain {\n return this.#pushField(name, 'boolean')\n }\n\n json(name: string): FieldChain {\n return this.#pushField(name, 'json')\n }\n\n #pushField(name: string, type: CollectionFieldSpec['type']): FieldChain {\n const spec: CollectionFieldSpec = {\n name,\n type,\n index: false,\n nullable: false,\n }\n this.#fields.push(spec)\n return new FieldChainImpl(spec)\n }\n\n build(collection: string): CollectionSpec {\n if (!this.#vectorDef) {\n throw new Error('a collection requires a vector() definition')\n }\n return {\n collection,\n vector: this.#vectorDef,\n fields: this.#fields,\n }\n }\n}\n\nexport interface FieldChain {\n index(): FieldChain\n nullable(): FieldChain\n}\n\nclass FieldChainImpl implements FieldChain {\n #spec: CollectionFieldSpec\n\n constructor(spec: CollectionFieldSpec) {\n this.#spec = spec\n }\n\n index(): FieldChain {\n this.#spec.index = true\n return this\n }\n\n nullable(): FieldChain {\n this.#spec.nullable = true\n return this\n }\n}\n\nexport class VectorSchemaBuilder {\n #executor: SchemaExecutor\n\n constructor(executor: SchemaExecutor) {\n this.#executor = executor\n }\n\n async createCollection(collection: string, cb: (c: CollectionBuilder) => void): Promise<void> {\n const builder = new CollectionBuilder()\n cb(builder)\n const spec = builder.build(collection)\n await this.#executor.createCollection(spec, false)\n }\n\n async createCollectionIfNotExists(\n collection: string,\n cb: (c: CollectionBuilder) => void\n ): Promise<void> {\n const builder = new CollectionBuilder()\n cb(builder)\n const spec = builder.build(collection)\n await this.#executor.createCollection(spec, true)\n }\n\n async dropCollection(collection: string): Promise<void> {\n await this.#executor.dropCollection(collection, false)\n }\n\n async dropCollectionIfExists(collection: string): Promise<void> {\n await this.#executor.dropCollection(collection, true)\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n return this.#executor.hasCollection(collection)\n }\n\n async renameCollection(from: string, to: string): Promise<void> {\n await this.#executor.renameCollection(from, to)\n }\n}\n"],"mappings":";;;AAgBA,IAAa,oBAAb,MAA+B;CAC7B;CACA,UAAiC,CAAC;CAElC,OAAO,KAA4D;EACjE,KAAKA,aAAa;GAChB,YAAY,IAAI;GAChB,QAAQ,IAAI,UAAU;EACxB;EACA,OAAO;CACT;CAEA,OAAO,MAA0B;EAC/B,OAAO,KAAKC,WAAW,MAAM,QAAQ;CACvC;CAEA,QAAQ,MAA0B;EAChC,OAAO,KAAKA,WAAW,MAAM,SAAS;CACxC;CAEA,OAAO,MAA0B;EAC/B,OAAO,KAAKA,WAAW,MAAM,QAAQ;CACvC;CAEA,QAAQ,MAA0B;EAChC,OAAO,KAAKA,WAAW,MAAM,SAAS;CACxC;CAEA,KAAK,MAA0B;EAC7B,OAAO,KAAKA,WAAW,MAAM,MAAM;CACrC;CAEA,WAAW,MAAc,MAA+C;EACtE,MAAM,OAA4B;GAChC;GACA;GACA,OAAO;GACP,UAAU;EACZ;EACA,KAAKC,QAAQ,KAAK,IAAI;EACtB,OAAO,IAAI,eAAe,IAAI;CAChC;CAEA,MAAM,YAAoC;EACxC,IAAI,CAAC,KAAKF,YACR,MAAM,IAAI,MAAM,6CAA6C;EAE/D,OAAO;GACL;GACA,QAAQ,KAAKA;GACb,QAAQ,KAAKE;EACf;CACF;AACF;AAOA,IAAM,iBAAN,MAA2C;CACzC;CAEA,YAAY,MAA2B;EACrC,KAAKC,QAAQ;CACf;CAEA,QAAoB;EAClB,KAAKA,MAAM,QAAQ;EACnB,OAAO;CACT;CAEA,WAAuB;EACrB,KAAKA,MAAM,WAAW;EACtB,OAAO;CACT;AACF;AAEA,IAAa,sBAAb,MAAiC;CAC/B;CAEA,YAAY,UAA0B;EACpC,KAAKC,YAAY;CACnB;CAEA,MAAM,iBAAiB,YAAoB,IAAmD;EAC5F,MAAM,UAAU,IAAI,kBAAkB;EACtC,GAAG,OAAO;EACV,MAAM,OAAO,QAAQ,MAAM,UAAU;EACrC,MAAM,KAAKA,UAAU,iBAAiB,MAAM,KAAK;CACnD;CAEA,MAAM,4BACJ,YACA,IACe;EACf,MAAM,UAAU,IAAI,kBAAkB;EACtC,GAAG,OAAO;EACV,MAAM,OAAO,QAAQ,MAAM,UAAU;EACrC,MAAM,KAAKA,UAAU,iBAAiB,MAAM,IAAI;CAClD;CAEA,MAAM,eAAe,YAAmC;EACtD,MAAM,KAAKA,UAAU,eAAe,YAAY,KAAK;CACvD;CAEA,MAAM,uBAAuB,YAAmC;EAC9D,MAAM,KAAKA,UAAU,eAAe,YAAY,IAAI;CACtD;CAEA,MAAM,cAAc,YAAsC;EACxD,OAAO,KAAKA,UAAU,cAAc,UAAU;CAChD;CAEA,MAAM,iBAAiB,MAAc,IAA2B;EAC9D,MAAM,KAAKA,UAAU,iBAAiB,MAAM,EAAE;CAChD;AACF"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Knex-style schema builder for the vector battery.
3
+ *
4
+ * @module @nhtio/adk/batteries/vector/schema
5
+ */
6
+ import type { DistanceMetric } from "./types";
7
+ import type { CollectionSpec } from "./plan";
8
+ export interface SchemaExecutor {
9
+ createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void>;
10
+ dropCollection(collection: string, ifExists: boolean): Promise<void>;
11
+ hasCollection(collection: string): Promise<boolean>;
12
+ renameCollection(from: string, to: string): Promise<void>;
13
+ }
14
+ export declare class CollectionBuilder {
15
+ #private;
16
+ vector(def: {
17
+ dimensions: number;
18
+ metric?: DistanceMetric;
19
+ }): this;
20
+ string(name: string): FieldChain;
21
+ integer(name: string): FieldChain;
22
+ number(name: string): FieldChain;
23
+ boolean(name: string): FieldChain;
24
+ json(name: string): FieldChain;
25
+ build(collection: string): CollectionSpec;
26
+ }
27
+ export interface FieldChain {
28
+ index(): FieldChain;
29
+ nullable(): FieldChain;
30
+ }
31
+ export declare class VectorSchemaBuilder {
32
+ #private;
33
+ constructor(executor: SchemaExecutor);
34
+ createCollection(collection: string, cb: (c: CollectionBuilder) => void): Promise<void>;
35
+ createCollectionIfNotExists(collection: string, cb: (c: CollectionBuilder) => void): Promise<void>;
36
+ dropCollection(collection: string): Promise<void>;
37
+ dropCollectionIfExists(collection: string): Promise<void>;
38
+ hasCollection(collection: string): Promise<boolean>;
39
+ renameCollection(from: string, to: string): Promise<void>;
40
+ }