@nhtio/adk 1.20260604.0 → 1.20260607.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (358) hide show
  1. package/CHANGELOG.md +261 -0
  2. package/adk-mcp.mjs +1 -1
  3. package/batteries/embeddings/openai/adapter.cjs +1 -1
  4. package/batteries/embeddings/openai/adapter.mjs +1 -1
  5. package/batteries/embeddings/webllm/adapter.cjs +1 -1
  6. package/batteries/embeddings/webllm/adapter.mjs +1 -1
  7. package/batteries/index.d.ts +1 -0
  8. package/batteries/llm/openai_chat_completions/adapter.cjs +6 -6
  9. package/batteries/llm/openai_chat_completions/adapter.cjs.map +1 -1
  10. package/batteries/llm/openai_chat_completions/adapter.mjs +6 -6
  11. package/batteries/llm/openai_chat_completions/adapter.mjs.map +1 -1
  12. package/batteries/llm/openai_chat_completions/helpers.cjs +2 -2
  13. package/batteries/llm/openai_chat_completions/helpers.mjs +2 -2
  14. package/batteries/llm/openai_chat_completions/validation.cjs +2 -2
  15. package/batteries/llm/openai_chat_completions/validation.cjs.map +1 -1
  16. package/batteries/llm/openai_chat_completions/validation.mjs +2 -2
  17. package/batteries/llm/openai_chat_completions/validation.mjs.map +1 -1
  18. package/batteries/llm/webllm_chat_completions/adapter.cjs +6 -6
  19. package/batteries/llm/webllm_chat_completions/adapter.cjs.map +1 -1
  20. package/batteries/llm/webllm_chat_completions/adapter.mjs +6 -6
  21. package/batteries/llm/webllm_chat_completions/adapter.mjs.map +1 -1
  22. package/batteries/llm/webllm_chat_completions/validation.cjs +2 -2
  23. package/batteries/llm/webllm_chat_completions/validation.cjs.map +1 -1
  24. package/batteries/llm/webllm_chat_completions/validation.mjs +2 -2
  25. package/batteries/llm/webllm_chat_completions/validation.mjs.map +1 -1
  26. package/batteries/storage/flydrive.cjs +1 -1
  27. package/batteries/storage/flydrive.mjs +2 -2
  28. package/batteries/storage/in_memory.cjs +1 -1
  29. package/batteries/storage/in_memory.mjs +1 -1
  30. package/batteries/storage/opfs.cjs +1 -1
  31. package/batteries/storage/opfs.mjs +1 -1
  32. package/batteries/tools/color.cjs +2 -2
  33. package/batteries/tools/color.mjs +2 -2
  34. package/batteries/tools/comparison.cjs +3 -3
  35. package/batteries/tools/comparison.mjs +3 -3
  36. package/batteries/tools/data_structure.cjs +3 -3
  37. package/batteries/tools/data_structure.mjs +3 -3
  38. package/batteries/tools/datetime_extended.cjs +2 -2
  39. package/batteries/tools/datetime_extended.mjs +2 -2
  40. package/batteries/tools/datetime_math.cjs +2 -2
  41. package/batteries/tools/datetime_math.mjs +2 -2
  42. package/batteries/tools/encoding.cjs +3 -3
  43. package/batteries/tools/encoding.mjs +3 -3
  44. package/batteries/tools/formatting.cjs +3 -3
  45. package/batteries/tools/formatting.mjs +3 -3
  46. package/batteries/tools/geo_basics.cjs +2 -2
  47. package/batteries/tools/geo_basics.mjs +2 -2
  48. package/batteries/tools/math/index.d.ts +16 -5
  49. package/batteries/tools/math.cjs +340 -22
  50. package/batteries/tools/math.cjs.map +1 -1
  51. package/batteries/tools/math.mjs +338 -21
  52. package/batteries/tools/math.mjs.map +1 -1
  53. package/batteries/tools/memory.cjs +5 -5
  54. package/batteries/tools/memory.mjs +5 -5
  55. package/batteries/tools/parsing.cjs +4 -4
  56. package/batteries/tools/parsing.mjs +4 -4
  57. package/batteries/tools/retrievables.cjs +4 -4
  58. package/batteries/tools/retrievables.mjs +4 -4
  59. package/batteries/tools/standing_instructions.cjs +4 -4
  60. package/batteries/tools/standing_instructions.mjs +4 -4
  61. package/batteries/tools/statistics.cjs +4 -4
  62. package/batteries/tools/statistics.mjs +4 -4
  63. package/batteries/tools/string_processing.cjs +3 -3
  64. package/batteries/tools/string_processing.mjs +3 -3
  65. package/batteries/tools/structured_data.cjs +3 -3
  66. package/batteries/tools/structured_data.mjs +3 -3
  67. package/batteries/tools/text_analysis.cjs +3 -3
  68. package/batteries/tools/text_analysis.mjs +3 -3
  69. package/batteries/tools/text_comparison.cjs +2 -2
  70. package/batteries/tools/text_comparison.mjs +2 -2
  71. package/batteries/tools/time.cjs +2 -2
  72. package/batteries/tools/time.mjs +2 -2
  73. package/batteries/tools/unit_conversion.cjs +2 -2
  74. package/batteries/tools/unit_conversion.mjs +2 -2
  75. package/batteries/vector/arangodb/index.d.ts +38 -0
  76. package/batteries/vector/arangodb.cjs +257 -0
  77. package/batteries/vector/arangodb.cjs.map +1 -0
  78. package/batteries/vector/arangodb.mjs +255 -0
  79. package/batteries/vector/arangodb.mjs.map +1 -0
  80. package/batteries/vector/builder.cjs +297 -0
  81. package/batteries/vector/builder.cjs.map +1 -0
  82. package/batteries/vector/builder.d.ts +87 -0
  83. package/batteries/vector/builder.mjs +294 -0
  84. package/batteries/vector/builder.mjs.map +1 -0
  85. package/batteries/vector/chroma/index.d.ts +32 -0
  86. package/batteries/vector/chroma.cjs +305 -0
  87. package/batteries/vector/chroma.cjs.map +1 -0
  88. package/batteries/vector/chroma.mjs +302 -0
  89. package/batteries/vector/chroma.mjs.map +1 -0
  90. package/batteries/vector/clickhouse/index.d.ts +39 -0
  91. package/batteries/vector/clickhouse.cjs +246 -0
  92. package/batteries/vector/clickhouse.cjs.map +1 -0
  93. package/batteries/vector/clickhouse.mjs +244 -0
  94. package/batteries/vector/clickhouse.mjs.map +1 -0
  95. package/batteries/vector/cloudflare/index.d.ts +43 -0
  96. package/batteries/vector/cloudflare.cjs +397 -0
  97. package/batteries/vector/cloudflare.cjs.map +1 -0
  98. package/batteries/vector/cloudflare.mjs +395 -0
  99. package/batteries/vector/cloudflare.mjs.map +1 -0
  100. package/batteries/vector/conformance/index.d.ts +15 -0
  101. package/batteries/vector/conformance.cjs +209 -0
  102. package/batteries/vector/conformance.cjs.map +1 -0
  103. package/batteries/vector/conformance.mjs +205 -0
  104. package/batteries/vector/conformance.mjs.map +1 -0
  105. package/batteries/vector/contract.cjs +42 -0
  106. package/batteries/vector/contract.cjs.map +1 -0
  107. package/batteries/vector/contract.d.ts +39 -0
  108. package/batteries/vector/contract.mjs +40 -0
  109. package/batteries/vector/contract.mjs.map +1 -0
  110. package/batteries/vector/couchbase/index.d.ts +49 -0
  111. package/batteries/vector/couchbase.cjs +401 -0
  112. package/batteries/vector/couchbase.cjs.map +1 -0
  113. package/batteries/vector/couchbase.mjs +399 -0
  114. package/batteries/vector/couchbase.mjs.map +1 -0
  115. package/batteries/vector/duckdb/index.d.ts +33 -0
  116. package/batteries/vector/duckdb.cjs +218 -0
  117. package/batteries/vector/duckdb.cjs.map +1 -0
  118. package/batteries/vector/duckdb.mjs +216 -0
  119. package/batteries/vector/duckdb.mjs.map +1 -0
  120. package/batteries/vector/elasticsearch/index.d.ts +43 -0
  121. package/batteries/vector/elasticsearch.cjs +306 -0
  122. package/batteries/vector/elasticsearch.cjs.map +1 -0
  123. package/batteries/vector/elasticsearch.mjs +303 -0
  124. package/batteries/vector/elasticsearch.mjs.map +1 -0
  125. package/batteries/vector/exceptions.cjs +126 -0
  126. package/batteries/vector/exceptions.cjs.map +1 -0
  127. package/batteries/vector/exceptions.d.ts +142 -0
  128. package/batteries/vector/exceptions.mjs +107 -0
  129. package/batteries/vector/exceptions.mjs.map +1 -0
  130. package/batteries/vector/factory.cjs +28 -0
  131. package/batteries/vector/factory.cjs.map +1 -0
  132. package/batteries/vector/factory.d.ts +38 -0
  133. package/batteries/vector/factory.mjs +25 -0
  134. package/batteries/vector/factory.mjs.map +1 -0
  135. package/batteries/vector/filters.cjs +107 -0
  136. package/batteries/vector/filters.cjs.map +1 -0
  137. package/batteries/vector/filters.d.ts +34 -0
  138. package/batteries/vector/filters.mjs +99 -0
  139. package/batteries/vector/filters.mjs.map +1 -0
  140. package/batteries/vector/helpers.cjs +23 -0
  141. package/batteries/vector/helpers.cjs.map +1 -0
  142. package/batteries/vector/helpers.d.ts +12 -0
  143. package/batteries/vector/helpers.mjs +17 -0
  144. package/batteries/vector/helpers.mjs.map +1 -0
  145. package/batteries/vector/hnswlib/index.d.ts +35 -0
  146. package/batteries/vector/hnswlib.cjs +237 -0
  147. package/batteries/vector/hnswlib.cjs.map +1 -0
  148. package/batteries/vector/hnswlib.mjs +235 -0
  149. package/batteries/vector/hnswlib.mjs.map +1 -0
  150. package/batteries/vector/in_memory/index.d.ts +23 -0
  151. package/batteries/vector/in_memory.cjs +178 -0
  152. package/batteries/vector/in_memory.cjs.map +1 -0
  153. package/batteries/vector/in_memory.mjs +176 -0
  154. package/batteries/vector/in_memory.mjs.map +1 -0
  155. package/batteries/vector/index.d.ts +18 -0
  156. package/batteries/vector/lancedb/index.d.ts +34 -0
  157. package/batteries/vector/lancedb.cjs +224 -0
  158. package/batteries/vector/lancedb.cjs.map +1 -0
  159. package/batteries/vector/lancedb.mjs +222 -0
  160. package/batteries/vector/lancedb.mjs.map +1 -0
  161. package/batteries/vector/mariadb/index.d.ts +39 -0
  162. package/batteries/vector/mariadb.cjs +228 -0
  163. package/batteries/vector/mariadb.cjs.map +1 -0
  164. package/batteries/vector/mariadb.mjs +226 -0
  165. package/batteries/vector/mariadb.mjs.map +1 -0
  166. package/batteries/vector/meilisearch/index.d.ts +36 -0
  167. package/batteries/vector/meilisearch.cjs +242 -0
  168. package/batteries/vector/meilisearch.cjs.map +1 -0
  169. package/batteries/vector/meilisearch.mjs +240 -0
  170. package/batteries/vector/meilisearch.mjs.map +1 -0
  171. package/batteries/vector/migrate.cjs +54 -0
  172. package/batteries/vector/migrate.cjs.map +1 -0
  173. package/batteries/vector/migrate.d.ts +30 -0
  174. package/batteries/vector/migrate.mjs +52 -0
  175. package/batteries/vector/migrate.mjs.map +1 -0
  176. package/batteries/vector/milvus/index.d.ts +35 -0
  177. package/batteries/vector/milvus.cjs +357 -0
  178. package/batteries/vector/milvus.cjs.map +1 -0
  179. package/batteries/vector/milvus.mjs +354 -0
  180. package/batteries/vector/milvus.mjs.map +1 -0
  181. package/batteries/vector/mongodb/index.d.ts +46 -0
  182. package/batteries/vector/mongodb.cjs +270 -0
  183. package/batteries/vector/mongodb.cjs.map +1 -0
  184. package/batteries/vector/mongodb.mjs +268 -0
  185. package/batteries/vector/mongodb.mjs.map +1 -0
  186. package/batteries/vector/neo4j/index.d.ts +38 -0
  187. package/batteries/vector/neo4j.cjs +231 -0
  188. package/batteries/vector/neo4j.cjs.map +1 -0
  189. package/batteries/vector/neo4j.mjs +229 -0
  190. package/batteries/vector/neo4j.mjs.map +1 -0
  191. package/batteries/vector/opensearch/index.d.ts +46 -0
  192. package/batteries/vector/opensearch.cjs +316 -0
  193. package/batteries/vector/opensearch.cjs.map +1 -0
  194. package/batteries/vector/opensearch.mjs +313 -0
  195. package/batteries/vector/opensearch.mjs.map +1 -0
  196. package/batteries/vector/oracle23ai/index.d.ts +45 -0
  197. package/batteries/vector/oracle23ai.cjs +340 -0
  198. package/batteries/vector/oracle23ai.cjs.map +1 -0
  199. package/batteries/vector/oracle23ai.mjs +338 -0
  200. package/batteries/vector/oracle23ai.mjs.map +1 -0
  201. package/batteries/vector/orama/index.d.ts +23 -0
  202. package/batteries/vector/orama.cjs +272 -0
  203. package/batteries/vector/orama.cjs.map +1 -0
  204. package/batteries/vector/orama.mjs +270 -0
  205. package/batteries/vector/orama.mjs.map +1 -0
  206. package/batteries/vector/pgvector/index.d.ts +43 -0
  207. package/batteries/vector/pgvector.cjs +411 -0
  208. package/batteries/vector/pgvector.cjs.map +1 -0
  209. package/batteries/vector/pgvector.mjs +408 -0
  210. package/batteries/vector/pgvector.mjs.map +1 -0
  211. package/batteries/vector/pinecone/index.d.ts +38 -0
  212. package/batteries/vector/pinecone.cjs +415 -0
  213. package/batteries/vector/pinecone.cjs.map +1 -0
  214. package/batteries/vector/pinecone.mjs +412 -0
  215. package/batteries/vector/pinecone.mjs.map +1 -0
  216. package/batteries/vector/plan.cjs +2 -0
  217. package/batteries/vector/plan.d.ts +65 -0
  218. package/batteries/vector/plan.mjs +0 -0
  219. package/batteries/vector/qdrant/index.d.ts +34 -0
  220. package/batteries/vector/qdrant.cjs +286 -0
  221. package/batteries/vector/qdrant.cjs.map +1 -0
  222. package/batteries/vector/qdrant.mjs +284 -0
  223. package/batteries/vector/qdrant.mjs.map +1 -0
  224. package/batteries/vector/redis/index.d.ts +44 -0
  225. package/batteries/vector/redis.cjs +391 -0
  226. package/batteries/vector/redis.cjs.map +1 -0
  227. package/batteries/vector/redis.mjs +388 -0
  228. package/batteries/vector/redis.mjs.map +1 -0
  229. package/batteries/vector/retrievable.cjs +69 -0
  230. package/batteries/vector/retrievable.cjs.map +1 -0
  231. package/batteries/vector/retrievable.mjs +67 -0
  232. package/batteries/vector/retrievable.mjs.map +1 -0
  233. package/batteries/vector/retrievable_glue.d.ts +24 -0
  234. package/batteries/vector/s3vectors/index.d.ts +52 -0
  235. package/batteries/vector/s3vectors.cjs +438 -0
  236. package/batteries/vector/s3vectors.cjs.map +1 -0
  237. package/batteries/vector/s3vectors.mjs +436 -0
  238. package/batteries/vector/s3vectors.mjs.map +1 -0
  239. package/batteries/vector/schema.cjs +96 -0
  240. package/batteries/vector/schema.cjs.map +1 -0
  241. package/batteries/vector/schema.d.ts +40 -0
  242. package/batteries/vector/schema.mjs +93 -0
  243. package/batteries/vector/schema.mjs.map +1 -0
  244. package/batteries/vector/solr/index.d.ts +36 -0
  245. package/batteries/vector/solr.cjs +230 -0
  246. package/batteries/vector/solr.cjs.map +1 -0
  247. package/batteries/vector/solr.mjs +228 -0
  248. package/batteries/vector/solr.mjs.map +1 -0
  249. package/batteries/vector/sqlite_vec/index.d.ts +30 -0
  250. package/batteries/vector/sqlite_vec.cjs +318 -0
  251. package/batteries/vector/sqlite_vec.cjs.map +1 -0
  252. package/batteries/vector/sqlite_vec.mjs +316 -0
  253. package/batteries/vector/sqlite_vec.mjs.map +1 -0
  254. package/batteries/vector/surrealdb/index.d.ts +37 -0
  255. package/batteries/vector/surrealdb.cjs +230 -0
  256. package/batteries/vector/surrealdb.cjs.map +1 -0
  257. package/batteries/vector/surrealdb.mjs +228 -0
  258. package/batteries/vector/surrealdb.mjs.map +1 -0
  259. package/batteries/vector/types.cjs +2 -0
  260. package/batteries/vector/types.d.ts +100 -0
  261. package/batteries/vector/types.mjs +0 -0
  262. package/batteries/vector/typesense/index.d.ts +38 -0
  263. package/batteries/vector/typesense.cjs +272 -0
  264. package/batteries/vector/typesense.cjs.map +1 -0
  265. package/batteries/vector/typesense.mjs +270 -0
  266. package/batteries/vector/typesense.mjs.map +1 -0
  267. package/batteries/vector/validation.cjs +90 -0
  268. package/batteries/vector/validation.cjs.map +1 -0
  269. package/batteries/vector/validation.d.ts +18 -0
  270. package/batteries/vector/validation.mjs +83 -0
  271. package/batteries/vector/validation.mjs.map +1 -0
  272. package/batteries/vector/vector_store_constructor.cjs +56 -0
  273. package/batteries/vector/vector_store_constructor.cjs.map +1 -0
  274. package/batteries/vector/vector_store_constructor.d.ts +30 -0
  275. package/batteries/vector/vector_store_constructor.mjs +53 -0
  276. package/batteries/vector/vector_store_constructor.mjs.map +1 -0
  277. package/batteries/vector/vespa/index.d.ts +39 -0
  278. package/batteries/vector/vespa.cjs +423 -0
  279. package/batteries/vector/vespa.cjs.map +1 -0
  280. package/batteries/vector/vespa.mjs +421 -0
  281. package/batteries/vector/vespa.mjs.map +1 -0
  282. package/batteries/vector/weaviate/index.d.ts +57 -0
  283. package/batteries/vector/weaviate.cjs +325 -0
  284. package/batteries/vector/weaviate.cjs.map +1 -0
  285. package/batteries/vector/weaviate.mjs +322 -0
  286. package/batteries/vector/weaviate.mjs.map +1 -0
  287. package/batteries/vector.cjs +63 -0
  288. package/batteries/vector.mjs +14 -0
  289. package/batteries.cjs +62 -0
  290. package/batteries.mjs +15 -1
  291. package/{chunk-kRvK8_k2.mjs → chunk-Bpcn9VDT.mjs} +5 -1
  292. package/{common-lMrnzoyn.mjs → common-BT0nfCi9.mjs} +8 -8
  293. package/{common-lMrnzoyn.mjs.map → common-BT0nfCi9.mjs.map} +1 -1
  294. package/{common-D_e5zYsG.js → common-Cj8TaQ9U.js} +8 -8
  295. package/{common-D_e5zYsG.js.map → common-Cj8TaQ9U.js.map} +1 -1
  296. package/common.cjs +7 -7
  297. package/common.mjs +7 -7
  298. package/{dispatch_runner-CpuyATj1.js → dispatch_runner-BHBNupqp.js} +2 -2
  299. package/dispatch_runner-BHBNupqp.js.map +1 -0
  300. package/{dispatch_runner-CDF3X0nv.mjs → dispatch_runner-DPcS7Y_M.mjs} +2 -2
  301. package/dispatch_runner-DPcS7Y_M.mjs.map +1 -0
  302. package/dispatch_runner.cjs +1 -1
  303. package/dispatch_runner.mjs +1 -1
  304. package/forge.cjs +4 -4
  305. package/forge.mjs +4 -4
  306. package/guards.cjs +8 -8
  307. package/guards.mjs +8 -8
  308. package/index.cjs +12 -12
  309. package/index.mjs +12 -12
  310. package/lib/classes/tool_registry.d.ts +70 -4
  311. package/mcp/adk-docs-corpus.json +1 -1
  312. package/package.json +424 -88
  313. package/skills/adk-assembly/SKILL.md +2 -2
  314. package/{spooled_artifact-B8gIIn9h.js → spooled_artifact-BTq6Nzfy.js} +4 -4
  315. package/spooled_artifact-BTq6Nzfy.js.map +1 -0
  316. package/{spooled_artifact-CWoKUDEm.mjs → spooled_artifact-CHoZgWwI.mjs} +4 -4
  317. package/spooled_artifact-CHoZgWwI.mjs.map +1 -0
  318. package/spooled_artifact.cjs +2 -2
  319. package/spooled_artifact.mjs +2 -2
  320. package/{spooled_markdown_artifact-DQX0RCdI.js → spooled_markdown_artifact-CALSDxIx.js} +3 -3
  321. package/{spooled_markdown_artifact-DQX0RCdI.js.map → spooled_markdown_artifact-CALSDxIx.js.map} +1 -1
  322. package/{spooled_markdown_artifact-CNle4jXN.mjs → spooled_markdown_artifact-Ci5UL7l4.mjs} +3 -3
  323. package/{spooled_markdown_artifact-CNle4jXN.mjs.map → spooled_markdown_artifact-Ci5UL7l4.mjs.map} +1 -1
  324. package/src/types/evaluatex.d.ts +31 -0
  325. package/{thought-BD6AkkOr.js → thought-BbwhJ1wb.js} +4 -4
  326. package/thought-BbwhJ1wb.js.map +1 -0
  327. package/{thought-B_P8LiB6.mjs → thought-D34QQZZ9.mjs} +4 -4
  328. package/thought-D34QQZZ9.mjs.map +1 -0
  329. package/{tool-CRZSUcdP.mjs → tool-CMhaDRNd.mjs} +3 -3
  330. package/tool-CMhaDRNd.mjs.map +1 -0
  331. package/{tool-CX9vNHAw.js → tool-CVyZkFC7.js} +3 -3
  332. package/tool-CVyZkFC7.js.map +1 -0
  333. package/{tool_call-BUeMuCc6.mjs → tool_call-CV5qVNlb.mjs} +3 -3
  334. package/{tool_call-BUeMuCc6.mjs.map → tool_call-CV5qVNlb.mjs.map} +1 -1
  335. package/{tool_call--7ti-frB.js → tool_call-Db68hB7y.js} +3 -3
  336. package/{tool_call--7ti-frB.js.map → tool_call-Db68hB7y.js.map} +1 -1
  337. package/{tool_registry-BGHg6KTq.mjs → tool_registry-D1pSSlsd.mjs} +109 -22
  338. package/tool_registry-D1pSSlsd.mjs.map +1 -0
  339. package/{tool_registry-CtCQ4Xoz.js → tool_registry-DYUYqXvo.js} +109 -22
  340. package/tool_registry-DYUYqXvo.js.map +1 -0
  341. package/{turn_runner-BJTtAORU.js → turn_runner-DqWHNP80.js} +5 -5
  342. package/turn_runner-DqWHNP80.js.map +1 -0
  343. package/{turn_runner-C02LZHjt.mjs → turn_runner-fg1Wc3dK.mjs} +5 -5
  344. package/turn_runner-fg1Wc3dK.mjs.map +1 -0
  345. package/turn_runner.cjs +1 -1
  346. package/turn_runner.mjs +1 -1
  347. package/dispatch_runner-CDF3X0nv.mjs.map +0 -1
  348. package/dispatch_runner-CpuyATj1.js.map +0 -1
  349. package/spooled_artifact-B8gIIn9h.js.map +0 -1
  350. package/spooled_artifact-CWoKUDEm.mjs.map +0 -1
  351. package/thought-BD6AkkOr.js.map +0 -1
  352. package/thought-B_P8LiB6.mjs.map +0 -1
  353. package/tool-CRZSUcdP.mjs.map +0 -1
  354. package/tool-CX9vNHAw.js.map +0 -1
  355. package/tool_registry-BGHg6KTq.mjs.map +0 -1
  356. package/tool_registry-CtCQ4Xoz.js.map +0 -1
  357. package/turn_runner-BJTtAORU.js.map +0 -1
  358. package/turn_runner-C02LZHjt.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opensearch.mjs","names":["#opts","#client","#ensure","#dims","#body","#project"],"sources":["../../../src/batteries/vector/opensearch/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/opensearch\n *\n * One adapter for the Elasticsearch / OpenSearch family — they share the same kNN `_search`\n * data model. Each collection is an index with a `knn_vector` field; KNN search uses the\n * native `knn` query, and the neutral filter tree compiles to a bool-query `filter` over\n * `metadata.*` keyword/numeric sub-fields. The document and id live in `_source`.\n *\n * Driver: `@opensearch-project/opensearch` by default. To target Elasticsearch instead,\n * pass a compatible client instance via `options.connection.client` (the `@elastic/elasticsearch`\n * Client has the same `.indices`/`.index`/`.search`/`.deleteByQuery` surface used here).\n */\n\nimport { normalizeScore } from '../helpers'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { isInstanceOf } from '@nhtio/adk/guards'\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_OPERATION,\n E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR,\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 DistanceMetric,\n} from '../types'\n\nexport interface OpenSearchVectorStoreOptions extends BaseVectorStoreOptions {\n connection?: {\n node?: string\n auth?: { username: string; password: string }\n // A pre-built ES/OpenSearch-compatible client. Overrides `node` when provided.\n client?: unknown\n }\n}\n\nconst getOpenSearchClient = async () => {\n try {\n const mod = await import('@opensearch-project/opensearch')\n return mod.Client\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['@opensearch-project/opensearch'])\n }\n}\n\n// OpenSearch knn_vector space per metric.\nconst spaceType = (metric: DistanceMetric): string =>\n metric === 'euclidean' ? 'l2' : metric === 'dot' ? 'innerproduct' : 'cosinesimil'\n\n/**\n * Compile the neutral filter tree to an OpenSearch bool-query clause over `metadata.*`.\n * String values use the `.keyword` sub-field for exact match; numbers use range/term.\n */\nexport const translateOpenSearchFilter = (\n filter?: VectorFilter\n): Record<string, unknown> | undefined => {\n if (!filter) return undefined\n if (isRawFilter(filter)) {\n if (filter.$dialect === 'opensearch' || filter.$dialect === 'elasticsearch') {\n return filter.$raw as Record<string, unknown>\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['opensearch', String(filter.$dialect)])\n }\n if (isFilterCondition(filter)) {\n const { field, op, value } = filter\n const f = `metadata.${field}`\n const kw = `metadata.${field}.keyword`\n const term = (v: unknown) =>\n typeof v === 'number' || typeof v === 'boolean' ? { term: { [f]: v } } : { term: { [kw]: v } }\n switch (op) {\n case 'eq':\n return term(value)\n case 'ne':\n return { bool: { must_not: [term(value)] } }\n case 'gt':\n return { range: { [f]: { gt: value } } }\n case 'gte':\n return { range: { [f]: { gte: value } } }\n case 'lt':\n return { range: { [f]: { lt: value } } }\n case 'lte':\n return { range: { [f]: { lte: value } } }\n case 'in': {\n const arr = Array.isArray(value) ? value : [value]\n const allNum = arr.every((v) => typeof v === 'number' || typeof v === 'boolean')\n return { terms: { [allNum ? f : kw]: arr } }\n }\n case 'nin': {\n const arr = Array.isArray(value) ? value : [value]\n const allNum = arr.every((v) => typeof v === 'number' || typeof v === 'boolean')\n return { bool: { must_not: [{ terms: { [allNum ? f : kw]: arr } }] } }\n }\n case 'exists':\n return { exists: { field: f } }\n default:\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['opensearch', op])\n }\n }\n if (isFilterGroup(filter)) {\n const { and, or, not } = filter\n if (and) {\n const must = and.map(translateOpenSearchFilter).filter(Boolean)\n return { bool: { must } }\n }\n if (or) {\n const should = or.map(translateOpenSearchFilter).filter(Boolean)\n return { bool: { should, minimum_should_match: 1 } }\n }\n if (not) {\n const inner = translateOpenSearchFilter(not)\n return inner ? { bool: { must_not: [inner] } } : undefined\n }\n }\n return undefined\n}\n\nexport class OpenSearchVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: false,\n rawSql: false,\n builtInEncoding: false,\n // Made strongly consistent by refreshing the index after every write (refresh: true /\n // explicit _refresh), so a write is visible to the next search. The option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n\n #client: any | null = null\n #dims: Map<string, number> = new Map()\n\n get #opts(): OpenSearchVectorStoreOptions {\n return this.options as OpenSearchVectorStoreOptions\n }\n\n static isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n\n async connect(): Promise<void> {\n if (this.#client) return\n const c = this.#opts.connection || {}\n if (c.client) {\n this.#client = c.client\n return\n }\n const Client = await getOpenSearchClient()\n try {\n this.#client = new Client({ node: c.node ?? 'http://localhost:9200', auth: c.auth })\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n\n async close(): Promise<void> {\n if (\n this.#client &&\n typeof this.#client.close === 'function' &&\n !this.#opts.connection?.client\n ) {\n await this.#client.close()\n }\n this.#client = null\n }\n\n async #ensure(): Promise<any> {\n if (!this.#client) await this.connect()\n return this.#client!\n }\n\n // Unwrap the {body}/direct response shape across client versions.\n #body(res: any): any {\n return res && res.body !== undefined ? res.body : res\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n const client = await this.#ensure()\n this.#dims.set(spec.collection, spec.vector.dimensions)\n if (ifNotExists && (await this.hasCollection(spec.collection))) return\n try {\n await client.indices.create({\n index: spec.collection,\n body: {\n settings: { index: { knn: true } },\n mappings: {\n properties: {\n vec: {\n type: 'knn_vector',\n dimension: spec.vector.dimensions,\n method: {\n name: 'hnsw',\n space_type: spaceType(spec.vector.metric),\n engine: 'lucene',\n },\n },\n document: { type: 'text' },\n metadata: { type: 'object', enabled: true },\n },\n },\n },\n })\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['createCollection', String(err)])\n }\n }\n\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n const client = await this.#ensure()\n if (ifExists && !(await this.hasCollection(collection))) return\n try {\n await client.indices.delete({ index: collection })\n this.#dims.delete(collection)\n } catch (err) {\n const msg = String(err)\n if (ifExists && msg.includes('index_not_found')) return\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', msg])\n }\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n const client = await this.#ensure()\n try {\n const res = await client.indices.exists({ index: collection })\n const body = this.#body(res)\n return body === true || body === 200 || res?.statusCode === 200\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', 'opensearch'])\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const client = await this.#ensure()\n const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection)\n try {\n const operations: any[] = []\n for (const r of plan.records) {\n let vector = r.vector\n if (!vector && r.document) {\n const [v] = await this.encode([r.document], 'document')\n vector = v\n }\n if (!vector) {\n throw new E_VECTOR_STORE_UPSERT_FAILED(['Record missing vector and document'])\n }\n if (expected !== undefined && vector.length !== expected) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length])\n }\n operations.push({ index: { _index: plan.collection, _id: r.id } })\n operations.push({ vec: vector, document: r.document ?? '', metadata: r.metadata ?? {} })\n }\n await client.bulk({ body: operations, refresh: true })\n } catch (err) {\n if (\n isInstanceOf(err, 'E_VECTOR_STORE_DIMENSION_MISMATCH', E_VECTOR_STORE_DIMENSION_MISMATCH) ||\n isInstanceOf(err, 'E_VECTOR_STORE_UPSERT_FAILED', E_VECTOR_STORE_UPSERT_FAILED)\n ) {\n throw err\n }\n throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n }\n }\n\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n const client = await this.#ensure()\n const metric = this.#opts.metric ?? 'cosine'\n let queryVector: number[] | undefined\n if (plan.near) {\n if ('vector' in plan.near) {\n queryVector = plan.near.vector\n } else if ('serverText' in plan.near) {\n const [v] = await this.encode([plan.near.serverText], 'query')\n queryVector = v\n } else if ('id' in plan.near) {\n try {\n const res = await client.get({ index: plan.collection, id: plan.near.id })\n queryVector = this.#body(res)?._source?.vec as number[]\n } catch {\n queryVector = undefined\n }\n if (!queryVector) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n }\n }\n\n const filter = translateOpenSearchFilter(plan.filter)\n const size = plan.topK\n const from = plan.offset ?? 0\n try {\n let body: any\n if (queryVector) {\n const knn: any = { vec: { vector: queryVector, k: size + from } }\n if (filter) knn.vec.filter = filter\n body = { size, from, query: { knn } }\n } else {\n body = { size, from, query: filter ?? { match_all: {} } }\n }\n const res = await client.search({ index: plan.collection, body })\n const hits = this.#body(res)?.hits?.hits ?? []\n return hits.map((hit: any) => this.#project(hit, plan, metric, !!queryVector))\n } catch (err) {\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\n }\n\n #project(hit: any, plan: SearchPlan, metric: string, isKnn: boolean): VectorMatch {\n const proj = plan.projection\n const src = hit._source ?? {}\n const out: VectorMatch = {}\n if (proj.id) out.id = hit._id as string\n if (proj.vector && src.vec) out.vector = src.vec as number[]\n if (proj.document) out.document = src.document as string | undefined\n if (proj.metadata) out.metadata = (src.metadata ?? {}) as VectorMetadata\n if (isKnn && typeof hit._score === 'number') {\n // OpenSearch returns a similarity score (higher = closer); normalize defensively to [0,1].\n out.score = normalizeScore(hit._score, metric as DistanceMetric, 'similarity')\n }\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const client = await this.#ensure()\n try {\n if (plan.ids && plan.ids.length > 0) {\n const operations = plan.ids.map((id) => ({ delete: { _index: plan.collection, _id: id } }))\n await client.bulk({ body: operations, refresh: true })\n } else if (plan.filter) {\n const filter = translateOpenSearchFilter(plan.filter)\n await client.deleteByQuery({\n index: plan.collection,\n refresh: true,\n body: { query: filter ?? { match_all: {} } },\n })\n } else {\n await client.deleteByQuery({\n index: plan.collection,\n refresh: true,\n body: { query: { match_all: {} } },\n })\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * @module @nhtio/adk/batteries/vector/oracle23ai
3
+ *
4
+ * Oracle 23ai AI Vector Search adapter. Vectors live in a `VECTOR(dims, FLOAT32)` column
5
+ * written with `DB_TYPE_VECTOR` (oracledb thin mode, default) and read back as Float32Array.
6
+ * KNN search uses `VECTOR_DISTANCE(vec, :q, COSINE|EUCLIDEAN|DOT)` ordered ascending. Metadata
7
+ * is a CLOB containing a JSON string, filtered with the neutral evaluator for exact cross-adapter
8
+ * parity. Each collection maps to a table named `<tablePrefix><collection>` with double-quoted
9
+ * identifiers for safety.
10
+ *
11
+ * The connecting user must default to a non-SYSTEM tablespace (e.g. USERS) and have CREATE TABLE.
12
+ * Oracle 23ai provides strong consistency: commits are synchronous, so there is no settle-poll.
13
+ *
14
+ * Score contract: do NOT trust the raw VECTOR_DISTANCE as a [0,1] score. Instead, use SQL only to
15
+ * order candidates, then recompute the [0,1] similarity locally using the stored `vec` and the
16
+ * computeScore helper, ensuring the [0,1] contract regardless of metric semantics.
17
+ *
18
+ * Driver: `oracledb` (pure-JS thin mode, no Instant Client required).
19
+ */
20
+ import { BaseVectorStore } from "../contract";
21
+ import type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from "../plan";
22
+ import type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from "../types";
23
+ export interface Oracle23aiVectorStoreOptions extends BaseVectorStoreOptions {
24
+ connection: {
25
+ connectString: string;
26
+ user: string;
27
+ password: string;
28
+ tablePrefix?: string;
29
+ };
30
+ }
31
+ export declare class Oracle23aiVectorStore extends BaseVectorStore {
32
+ #private;
33
+ readonly capabilities: VectorStoreCapabilities;
34
+ static isAvailable(): boolean;
35
+ isAvailable(): boolean;
36
+ connect(): Promise<void>;
37
+ close(): Promise<void>;
38
+ createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void>;
39
+ dropCollection(collection: string, ifExists: boolean): Promise<void>;
40
+ hasCollection(collection: string): Promise<boolean>;
41
+ renameCollection(_from: string, _to: string): Promise<void>;
42
+ executeUpsert(plan: UpsertPlan): Promise<void>;
43
+ executeSearch(plan: SearchPlan): Promise<VectorMatch[]>;
44
+ executeDelete(plan: DeletePlan): Promise<void>;
45
+ }
@@ -0,0 +1,340 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../chunk-Ble4zEEl.js");
3
+ const require_tool_registry = require("../../tool_registry-DYUYqXvo.js");
4
+ require("../../guards.cjs");
5
+ const require_batteries_vector_filters = require("./filters.cjs");
6
+ const require_batteries_vector_helpers = require("./helpers.cjs");
7
+ const require_batteries_vector_exceptions = require("./exceptions.cjs");
8
+ const require_batteries_vector_contract = require("./contract.cjs");
9
+ const require_batteries_vector_validation = require("./validation.cjs");
10
+ //#region src/batteries/vector/oracle23ai/index.ts
11
+ /**
12
+ * @module @nhtio/adk/batteries/vector/oracle23ai
13
+ *
14
+ * Oracle 23ai AI Vector Search adapter. Vectors live in a `VECTOR(dims, FLOAT32)` column
15
+ * written with `DB_TYPE_VECTOR` (oracledb thin mode, default) and read back as Float32Array.
16
+ * KNN search uses `VECTOR_DISTANCE(vec, :q, COSINE|EUCLIDEAN|DOT)` ordered ascending. Metadata
17
+ * is a CLOB containing a JSON string, filtered with the neutral evaluator for exact cross-adapter
18
+ * parity. Each collection maps to a table named `<tablePrefix><collection>` with double-quoted
19
+ * identifiers for safety.
20
+ *
21
+ * The connecting user must default to a non-SYSTEM tablespace (e.g. USERS) and have CREATE TABLE.
22
+ * Oracle 23ai provides strong consistency: commits are synchronous, so there is no settle-poll.
23
+ *
24
+ * Score contract: do NOT trust the raw VECTOR_DISTANCE as a [0,1] score. Instead, use SQL only to
25
+ * order candidates, then recompute the [0,1] similarity locally using the stored `vec` and the
26
+ * computeScore helper, ensuring the [0,1] contract regardless of metric semantics.
27
+ *
28
+ * Driver: `oracledb` (pure-JS thin mode, no Instant Client required).
29
+ */
30
+ var getOracle = async () => {
31
+ try {
32
+ const mod = await import(
33
+ /* @vite-ignore */
34
+ "oracledb"
35
+ );
36
+ return mod.default ?? mod;
37
+ } catch {
38
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_DRIVER_UNAVAILABLE(["oracledb"]);
39
+ }
40
+ };
41
+ var ident = (name) => "\"" + name.replace(/"/g, "\"\"") + "\"";
42
+ var Oracle23aiVectorStore = class extends require_batteries_vector_contract.BaseVectorStore {
43
+ capabilities = {
44
+ transactions: false,
45
+ namedVectors: false,
46
+ rename: false,
47
+ rawSql: false,
48
+ builtInEncoding: false,
49
+ consistency: {
50
+ configurable: false,
51
+ default: "strong",
52
+ modes: ["strong"]
53
+ }
54
+ };
55
+ #oracledb = null;
56
+ #conn = null;
57
+ #dims = /* @__PURE__ */ new Map();
58
+ #metrics = /* @__PURE__ */ new Map();
59
+ get #opts() {
60
+ return this.options;
61
+ }
62
+ #table(collection) {
63
+ return (this.#opts.connection.tablePrefix ?? "") + collection;
64
+ }
65
+ static isAvailable() {
66
+ return typeof process !== "undefined";
67
+ }
68
+ isAvailable() {
69
+ return typeof process !== "undefined";
70
+ }
71
+ async connect() {
72
+ if (this.#conn) return;
73
+ this.#oracledb = await getOracle();
74
+ const c = this.#opts.connection;
75
+ try {
76
+ this.#conn = await this.#oracledb.getConnection({
77
+ user: c.user,
78
+ password: c.password,
79
+ connectString: c.connectString
80
+ });
81
+ } catch (err) {
82
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_CONNECTION_FAILED([String(err)]);
83
+ }
84
+ }
85
+ async close() {
86
+ if (this.#conn) {
87
+ await this.#conn.close();
88
+ this.#conn = null;
89
+ this.#oracledb = null;
90
+ }
91
+ }
92
+ #parseMeta(val) {
93
+ if (typeof val === "string") try {
94
+ return JSON.parse(val);
95
+ } catch {
96
+ return {};
97
+ }
98
+ if (val && typeof val === "object") return val;
99
+ return {};
100
+ }
101
+ async createCollection(spec, ifNotExists) {
102
+ const coll = spec.collection;
103
+ const dims = spec.vector.dimensions;
104
+ const metric = spec.vector.metric;
105
+ this.#dims.set(coll, dims);
106
+ this.#metrics.set(coll, metric);
107
+ const T = ident(this.#table(coll));
108
+ const tableName = this.#table(coll);
109
+ try {
110
+ if ((await this.#conn.execute(`SELECT 1 FROM user_tables WHERE table_name = :n`, [tableName], { outFormat: this.#oracledb.OUT_FORMAT_OBJECT })).rows.length > 0) {
111
+ if (ifNotExists) {
112
+ await this.#conn.execute(`DELETE FROM ${T}`);
113
+ await this.#conn.commit();
114
+ return;
115
+ }
116
+ await this.#conn.execute(`DROP TABLE ${T}`);
117
+ }
118
+ const sql = `CREATE TABLE ${T} (
119
+ id VARCHAR2(512) PRIMARY KEY,
120
+ vec VECTOR(${dims}, FLOAT32),
121
+ document CLOB,
122
+ metadata CLOB
123
+ )`;
124
+ await this.#conn.execute(sql);
125
+ await this.#conn.commit();
126
+ } catch (err) {
127
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_COLLECTION_FAILED(["createCollection", String(err)]);
128
+ }
129
+ }
130
+ async dropCollection(collection, ifExists) {
131
+ const T = ident(this.#table(collection));
132
+ try {
133
+ await this.#conn.execute(`DROP TABLE ${T}`);
134
+ this.#dims.delete(collection);
135
+ this.#metrics.delete(collection);
136
+ } catch (err) {
137
+ if (err?.message && err.message.includes("ORA-00942")) {
138
+ if (ifExists) return;
139
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_COLLECTION_FAILED(["dropCollection", "table does not exist"]);
140
+ }
141
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_COLLECTION_FAILED(["dropCollection", String(err)]);
142
+ }
143
+ }
144
+ async hasCollection(collection) {
145
+ const tableName = this.#table(collection);
146
+ return (await this.#conn.execute(`SELECT 1 FROM user_tables WHERE table_name = :n`, [tableName], { outFormat: this.#oracledb.OUT_FORMAT_OBJECT })).rows.length > 0;
147
+ }
148
+ async renameCollection(_from, _to) {
149
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_UNSUPPORTED_OPERATION(["renameCollection", "oracle23ai"]);
150
+ }
151
+ async executeUpsert(plan) {
152
+ if (plan.records.length === 0) return;
153
+ require_batteries_vector_validation.validateRecords(plan.records);
154
+ const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection);
155
+ const T = ident(this.#table(plan.collection));
156
+ try {
157
+ for (const r of plan.records) {
158
+ let vector = r.vector;
159
+ if (!vector && r.document) {
160
+ const [v] = await this.encode([r.document], "document");
161
+ vector = v;
162
+ }
163
+ if (!vector) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_UPSERT_FAILED(["Record missing vector and document"]);
164
+ if (expected !== void 0 && vector.length !== expected) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length]);
165
+ const vecBind = {
166
+ type: this.#oracledb.DB_TYPE_VECTOR,
167
+ val: Float32Array.from(vector)
168
+ };
169
+ const doc = r.document ?? "";
170
+ const meta = r.metadata ? JSON.stringify(r.metadata) : "{}";
171
+ await this.#conn.execute(`MERGE INTO ${T} d
172
+ USING (SELECT :id AS id FROM dual) s
173
+ ON (d.id = s.id)
174
+ WHEN MATCHED THEN UPDATE SET vec = :vec, document = :doc, metadata = :meta
175
+ WHEN NOT MATCHED THEN INSERT (id, vec, document, metadata)
176
+ VALUES (:id, :vec, :doc, :meta)`, {
177
+ id: r.id,
178
+ vec: vecBind,
179
+ doc,
180
+ meta
181
+ }, { outFormat: this.#oracledb.OUT_FORMAT_OBJECT });
182
+ }
183
+ await this.#conn.commit();
184
+ } catch (err) {
185
+ if (require_tool_registry.isInstanceOf(err, "E_VECTOR_STORE_DIMENSION_MISMATCH", require_batteries_vector_exceptions.E_VECTOR_STORE_DIMENSION_MISMATCH) || require_tool_registry.isInstanceOf(err, "E_VECTOR_STORE_UPSERT_FAILED", require_batteries_vector_exceptions.E_VECTOR_STORE_UPSERT_FAILED)) throw err;
186
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_UPSERT_FAILED([String(err)]);
187
+ }
188
+ }
189
+ async executeSearch(plan) {
190
+ const coll = plan.collection;
191
+ const metric = this.#metrics.get(coll) ?? this.#opts.metric ?? "cosine";
192
+ const T = ident(this.#table(coll));
193
+ let queryVector;
194
+ if (plan.near) {
195
+ if ("vector" in plan.near) queryVector = plan.near.vector;
196
+ else if ("serverText" in plan.near) {
197
+ const [v] = await this.encode([plan.near.serverText], "query");
198
+ queryVector = v;
199
+ } else if ("id" in plan.near) {
200
+ const rows = await this.#conn.execute(`SELECT vec FROM ${T} WHERE id = :id`, [plan.near.id], {
201
+ outFormat: this.#oracledb.OUT_FORMAT_OBJECT,
202
+ fetchInfo: { VEC: { type: this.#oracledb.DB_TYPE_VECTOR } }
203
+ });
204
+ if (rows.rows.length === 0) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_SEARCH_FAILED(["Referenced id not found: " + plan.near.id]);
205
+ const arr = rows.rows[0].VEC;
206
+ queryVector = Array.from(arr);
207
+ }
208
+ }
209
+ const offset = plan.offset ?? 0;
210
+ try {
211
+ if (queryVector) {
212
+ const k = plan.filter ? 1e3 : plan.topK + offset;
213
+ const metricSql = metric === "cosine" ? "COSINE" : metric === "euclidean" ? "EUCLIDEAN" : metric === "dot" ? "DOT" : "COSINE";
214
+ const qBind = {
215
+ type: this.#oracledb.DB_TYPE_VECTOR,
216
+ val: Float32Array.from(queryVector)
217
+ };
218
+ const rows = await this.#conn.execute(`SELECT id, vec, document, metadata, VECTOR_DISTANCE(vec, :q, ${metricSql}) AS dist
219
+ FROM ${T}
220
+ ORDER BY dist
221
+ FETCH APPROX FIRST :k ROWS ONLY`, {
222
+ q: qBind,
223
+ k
224
+ }, {
225
+ outFormat: this.#oracledb.OUT_FORMAT_OBJECT,
226
+ fetchInfo: {
227
+ DOCUMENT: { type: this.#oracledb.STRING },
228
+ METADATA: { type: this.#oracledb.STRING }
229
+ }
230
+ });
231
+ const result = [];
232
+ for (const row of rows.rows) {
233
+ const meta = this.#parseMeta(row.METADATA);
234
+ if (plan.filter && !require_batteries_vector_filters.evaluateFilter(plan.filter, meta)) continue;
235
+ const score = computeScore(Array.from(row.VEC), queryVector, metric);
236
+ result.push(this.#project(row, plan, score));
237
+ }
238
+ return result.slice(offset, offset + plan.topK);
239
+ } else {
240
+ const rows = await this.#conn.execute(`SELECT id, vec, document, metadata FROM ${T} FETCH FIRST :cap ROWS ONLY`, [1e3], {
241
+ outFormat: this.#oracledb.OUT_FORMAT_OBJECT,
242
+ fetchInfo: {
243
+ DOCUMENT: { type: this.#oracledb.STRING },
244
+ METADATA: { type: this.#oracledb.STRING }
245
+ }
246
+ });
247
+ const result = [];
248
+ for (const row of rows.rows) {
249
+ const meta = this.#parseMeta(row.METADATA);
250
+ if (plan.filter && !require_batteries_vector_filters.evaluateFilter(plan.filter, meta)) continue;
251
+ result.push(this.#project(row, plan, void 0));
252
+ }
253
+ return result.slice(offset, offset + plan.topK);
254
+ }
255
+ } catch (err) {
256
+ if (err?.message && err.message.includes("Referenced id not found")) throw err;
257
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_SEARCH_FAILED([String(err)]);
258
+ }
259
+ }
260
+ #project(row, plan, score) {
261
+ const proj = plan.projection;
262
+ const out = {};
263
+ if (proj.id) out.id = row.ID;
264
+ if (proj.vector) out.vector = Array.from(row.VEC).map(Number);
265
+ if (proj.document) out.document = row.DOCUMENT ?? void 0;
266
+ if (proj.metadata) out.metadata = this.#parseMeta(row.METADATA);
267
+ if (score !== void 0) out.score = score;
268
+ return out;
269
+ }
270
+ async executeDelete(plan) {
271
+ const T = ident(this.#table(plan.collection));
272
+ try {
273
+ if (plan.ids && plan.ids.length > 0) {
274
+ const ids = plan.ids;
275
+ const bindObj = {};
276
+ ids.forEach((id, i) => {
277
+ bindObj["id" + i] = id;
278
+ });
279
+ const sql = `DELETE FROM ${T} WHERE id IN (${ids.map((_id, i) => ":id" + i).join(", ")})`;
280
+ await this.#conn.execute(sql, bindObj);
281
+ await this.#conn.commit();
282
+ } else if (plan.filter) {
283
+ const targets = (await this.#conn.execute(`SELECT id, metadata FROM ${T}`, {}, {
284
+ outFormat: this.#oracledb.OUT_FORMAT_OBJECT,
285
+ fetchInfo: { METADATA: { type: this.#oracledb.STRING } }
286
+ })).rows.filter((r) => require_batteries_vector_filters.evaluateFilter(plan.filter, this.#parseMeta(r.METADATA))).map((r) => r.ID);
287
+ if (targets.length > 0) {
288
+ const bindObj = {};
289
+ targets.forEach((id, i) => {
290
+ bindObj["id" + i] = id;
291
+ });
292
+ const sql = `DELETE FROM ${T} WHERE id IN (${targets.map((_id, i) => ":id" + i).join(", ")})`;
293
+ await this.#conn.execute(sql, bindObj);
294
+ await this.#conn.commit();
295
+ }
296
+ } else {
297
+ await this.#conn.execute(`DELETE FROM ${T}`);
298
+ await this.#conn.commit();
299
+ }
300
+ } catch (err) {
301
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_DELETE_FAILED([String(err)]);
302
+ }
303
+ }
304
+ };
305
+ var cosineSim = (a, b) => {
306
+ let dot = 0;
307
+ let normA = 0;
308
+ let normB = 0;
309
+ for (const [i, av] of a.entries()) {
310
+ const bv = b[i];
311
+ dot += av * bv;
312
+ normA += av * av;
313
+ normB += bv * bv;
314
+ }
315
+ const denom = Math.sqrt(normA) * Math.sqrt(normB);
316
+ return denom === 0 ? 0 : dot / denom;
317
+ };
318
+ var dotProd = (a, b) => {
319
+ let s = 0;
320
+ for (const [i, element] of a.entries()) s += element * b[i];
321
+ return s;
322
+ };
323
+ var euclideanDist = (a, b) => {
324
+ let s = 0;
325
+ for (const [i, element] of a.entries()) {
326
+ const d = element - b[i];
327
+ s += d * d;
328
+ }
329
+ return Math.sqrt(s);
330
+ };
331
+ var computeScore = (vec, query, metric) => {
332
+ if (metric === "cosine") return require_batteries_vector_helpers.normalizeScore(cosineSim(vec, query), "cosine", "similarity");
333
+ else if (metric === "dot") return require_batteries_vector_helpers.normalizeScore(dotProd(vec, query), "dot", "similarity");
334
+ else if (metric === "euclidean") return require_batteries_vector_helpers.normalizeScore(euclideanDist(vec, query), "euclidean", "distance");
335
+ else return require_batteries_vector_helpers.normalizeScore(cosineSim(vec, query), "cosine", "similarity");
336
+ };
337
+ //#endregion
338
+ exports.Oracle23aiVectorStore = Oracle23aiVectorStore;
339
+
340
+ //# sourceMappingURL=oracle23ai.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oracle23ai.cjs","names":["#opts","#conn","#oracledb","#dims","#metrics","#table","#parseMeta","#project"],"sources":["../../../src/batteries/vector/oracle23ai/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/oracle23ai\n *\n * Oracle 23ai AI Vector Search adapter. Vectors live in a `VECTOR(dims, FLOAT32)` column\n * written with `DB_TYPE_VECTOR` (oracledb thin mode, default) and read back as Float32Array.\n * KNN search uses `VECTOR_DISTANCE(vec, :q, COSINE|EUCLIDEAN|DOT)` ordered ascending. Metadata\n * is a CLOB containing a JSON string, filtered with the neutral evaluator for exact cross-adapter\n * parity. Each collection maps to a table named `<tablePrefix><collection>` with double-quoted\n * identifiers for safety.\n *\n * The connecting user must default to a non-SYSTEM tablespace (e.g. USERS) and have CREATE TABLE.\n * Oracle 23ai provides strong consistency: commits are synchronous, so there is no settle-poll.\n *\n * Score contract: do NOT trust the raw VECTOR_DISTANCE as a [0,1] score. Instead, use SQL only to\n * order candidates, then recompute the [0,1] similarity locally using the stored `vec` and the\n * computeScore helper, ensuring the [0,1] contract regardless of metric semantics.\n *\n * Driver: `oracledb` (pure-JS thin mode, no Instant Client required).\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 getOracle = async (): Promise<any> => {\n try {\n // oracledb ships no type declarations; import the specifier dynamically as untyped.\n const mod = await import(/* @vite-ignore */ 'oracledb' as string)\n return mod.default ?? mod\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['oracledb'])\n }\n}\n\n// Build a double-quoted Oracle identifier, safely escaping embedded double quotes.\nconst ident = (name: string): string => '\"' + name.replace(/\"/g, '\"\"') + '\"'\n\nexport interface Oracle23aiVectorStoreOptions extends BaseVectorStoreOptions {\n connection: {\n connectString: string // 'host:1521/FREEPDB1'\n user: string\n password: string\n tablePrefix?: string // logical collection → `${tablePrefix}${collection}` table\n }\n}\n\nexport class Oracle23aiVectorStore 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 #oracledb: any | null = null\n #conn: any | null = null\n #dims: Map<string, number> = new Map()\n #metrics: Map<string, DistanceMetric> = new Map()\n\n get #opts(): Oracle23aiVectorStoreOptions {\n return this.options as Oracle23aiVectorStoreOptions\n }\n\n // Map a logical collection name to its physical table (with optional prefix).\n #table(collection: string): string {\n const prefix = this.#opts.connection.tablePrefix ?? ''\n return prefix + collection\n }\n\n static isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n\n isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n\n async connect(): Promise<void> {\n if (this.#conn) return\n this.#oracledb = await getOracle()\n const c = this.#opts.connection\n try {\n this.#conn = await this.#oracledb.getConnection({\n user: c.user,\n password: c.password,\n connectString: c.connectString,\n })\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n\n async close(): Promise<void> {\n if (this.#conn) {\n await this.#conn.close()\n this.#conn = null\n this.#oracledb = null\n }\n }\n\n #parseMeta(val: unknown): VectorMetadata {\n if (typeof val === 'string') {\n try {\n return JSON.parse(val) as VectorMetadata\n } catch {\n return {}\n }\n }\n if (val && typeof val === 'object') return val as VectorMetadata\n return {}\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n const coll = spec.collection\n const dims = spec.vector.dimensions\n const metric = spec.vector.metric\n this.#dims.set(coll, dims)\n this.#metrics.set(coll, metric)\n\n const T = ident(this.#table(coll))\n const tableName = this.#table(coll)\n\n try {\n // Check if table exists\n const checkRows = await this.#conn!.execute(\n `SELECT 1 FROM user_tables WHERE table_name = :n`,\n [tableName],\n { outFormat: this.#oracledb!.OUT_FORMAT_OBJECT }\n )\n const exists = checkRows.rows.length > 0\n\n if (exists) {\n if (ifNotExists) {\n // Clear existing table\n await this.#conn!.execute(`DELETE FROM ${T}`)\n await this.#conn!.commit()\n return\n }\n // Drop and recreate\n await this.#conn!.execute(`DROP TABLE ${T}`)\n }\n\n // Create table\n const sql = `CREATE TABLE ${T} (\n id VARCHAR2(512) PRIMARY KEY,\n vec VECTOR(${dims}, FLOAT32),\n document CLOB,\n metadata CLOB\n )`\n await this.#conn!.execute(sql)\n await this.#conn!.commit()\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['createCollection', String(err)])\n }\n }\n\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n const T = ident(this.#table(collection))\n try {\n await this.#conn!.execute(`DROP TABLE ${T}`)\n this.#dims.delete(collection)\n this.#metrics.delete(collection)\n } catch (err: any) {\n if (err?.message && err.message.includes('ORA-00942')) {\n if (ifExists) return\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', 'table does not exist'])\n }\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', String(err)])\n }\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n const tableName = this.#table(collection)\n const rows = await this.#conn!.execute(\n `SELECT 1 FROM user_tables WHERE table_name = :n`,\n [tableName],\n { outFormat: this.#oracledb!.OUT_FORMAT_OBJECT }\n )\n return rows.rows.length > 0\n }\n\n async renameCollection(_from: string, _to: string): Promise<void> {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'oracle23ai'])\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection)\n\n const T = ident(this.#table(plan.collection))\n\n try {\n for (const r of plan.records) {\n let vector = r.vector\n if (!vector && r.document) {\n const [v] = await this.encode([r.document], 'document')\n vector = v\n }\n if (!vector) {\n throw new E_VECTOR_STORE_UPSERT_FAILED(['Record missing vector and document'])\n }\n if (expected !== undefined && vector.length !== expected) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length])\n }\n\n const vecBind = {\n type: this.#oracledb!.DB_TYPE_VECTOR,\n val: Float32Array.from(vector),\n }\n\n const doc = r.document ?? ''\n const meta = r.metadata ? JSON.stringify(r.metadata) : '{}'\n\n // MERGE upsert\n await this.#conn!.execute(\n `MERGE INTO ${T} d\n USING (SELECT :id AS id FROM dual) s\n ON (d.id = s.id)\n WHEN MATCHED THEN UPDATE SET vec = :vec, document = :doc, metadata = :meta\n WHEN NOT MATCHED THEN INSERT (id, vec, document, metadata)\n VALUES (:id, :vec, :doc, :meta)`,\n {\n id: r.id,\n vec: vecBind,\n doc,\n meta,\n },\n { outFormat: this.#oracledb!.OUT_FORMAT_OBJECT }\n )\n }\n await this.#conn!.commit()\n } catch (err) {\n if (\n isInstanceOf(err, 'E_VECTOR_STORE_DIMENSION_MISMATCH', E_VECTOR_STORE_DIMENSION_MISMATCH) ||\n isInstanceOf(err, 'E_VECTOR_STORE_UPSERT_FAILED', E_VECTOR_STORE_UPSERT_FAILED)\n ) {\n throw err\n }\n throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n }\n }\n\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n const coll = plan.collection\n const metric: DistanceMetric = this.#metrics.get(coll) ?? this.#opts.metric ?? 'cosine'\n const T = ident(this.#table(coll))\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 const rows = await this.#conn!.execute(\n `SELECT vec FROM ${T} WHERE id = :id`,\n [plan.near.id],\n {\n outFormat: this.#oracledb!.OUT_FORMAT_OBJECT,\n fetchInfo: { VEC: { type: this.#oracledb!.DB_TYPE_VECTOR } },\n }\n )\n if (rows.rows.length === 0) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n const arr = rows.rows[0].VEC as Float32Array\n queryVector = Array.from(arr)\n }\n }\n\n const offset = plan.offset ?? 0\n\n try {\n if (queryVector) {\n const k = plan.filter ? 1000 : plan.topK + offset\n const metricSql =\n metric === 'cosine'\n ? 'COSINE'\n : metric === 'euclidean'\n ? 'EUCLIDEAN'\n : metric === 'dot'\n ? 'DOT'\n : 'COSINE'\n\n const qBind = {\n type: this.#oracledb!.DB_TYPE_VECTOR,\n val: Float32Array.from(queryVector),\n }\n\n const rows = await this.#conn!.execute(\n `SELECT id, vec, document, metadata, VECTOR_DISTANCE(vec, :q, ${metricSql}) AS dist\n FROM ${T}\n ORDER BY dist\n FETCH APPROX FIRST :k ROWS ONLY`,\n { q: qBind, k },\n {\n outFormat: this.#oracledb!.OUT_FORMAT_OBJECT,\n fetchInfo: {\n DOCUMENT: { type: this.#oracledb!.STRING },\n METADATA: { type: this.#oracledb!.STRING },\n },\n }\n )\n\n const result: VectorMatch[] = []\n for (const row of rows.rows) {\n const meta = this.#parseMeta(row.METADATA)\n if (plan.filter && !evaluateFilter(plan.filter, meta)) {\n continue\n }\n const storedVec = Array.from(row.VEC as Float32Array)\n const score = computeScore(storedVec, queryVector!, metric)\n result.push(this.#project(row, plan, score))\n }\n\n // Apply offset/slice after filtering\n return result.slice(offset, offset + plan.topK)\n } else {\n // Filter-scan: no KNN, read all rows\n const cap = 1000\n const rows = await this.#conn!.execute(\n `SELECT id, vec, document, metadata FROM ${T} FETCH FIRST :cap ROWS ONLY`,\n [cap],\n {\n outFormat: this.#oracledb!.OUT_FORMAT_OBJECT,\n fetchInfo: {\n DOCUMENT: { type: this.#oracledb!.STRING },\n METADATA: { type: this.#oracledb!.STRING },\n },\n }\n )\n\n const result: VectorMatch[] = []\n for (const row of rows.rows) {\n const meta = this.#parseMeta(row.METADATA)\n if (plan.filter && !evaluateFilter(plan.filter, meta)) {\n continue\n }\n result.push(this.#project(row, plan, undefined))\n }\n return result.slice(offset, offset + plan.topK)\n }\n } catch (err: any) {\n if (err?.message && err.message.includes('Referenced id not found')) {\n throw err\n }\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\n }\n\n #project(row: any, plan: SearchPlan, score?: number): VectorMatch {\n const proj = plan.projection\n const out: VectorMatch = {}\n if (proj.id) out.id = row.ID as string\n if (proj.vector) out.vector = (Array.from(row.VEC as Float32Array) as number[]).map(Number)\n if (proj.document) out.document = (row.DOCUMENT ?? undefined) as string | undefined\n if (proj.metadata) out.metadata = this.#parseMeta(row.METADATA)\n if (score !== undefined) out.score = score\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const T = ident(this.#table(plan.collection))\n try {\n if (plan.ids && plan.ids.length > 0) {\n const ids = plan.ids\n const bindObj: any = {}\n ids.forEach((id, i) => {\n bindObj['id' + i] = id\n })\n const sql = `DELETE FROM ${T} WHERE id IN (${ids.map((_id, i) => ':id' + i).join(', ')})`\n await this.#conn!.execute(sql, bindObj)\n await this.#conn!.commit()\n } else if (plan.filter) {\n const rows = await this.#conn!.execute(\n `SELECT id, metadata FROM ${T}`,\n {},\n {\n outFormat: this.#oracledb!.OUT_FORMAT_OBJECT,\n fetchInfo: {\n METADATA: { type: this.#oracledb!.STRING },\n },\n }\n )\n const targets = rows.rows\n .filter((r: any) => evaluateFilter(plan.filter!, this.#parseMeta(r.METADATA)))\n .map((r: any) => r.ID as string)\n if (targets.length > 0) {\n const bindObj: any = {}\n targets.forEach((id: string, i: number) => {\n bindObj['id' + i] = id\n })\n const sql = `DELETE FROM ${T} WHERE id IN (${targets.map((_id: string, i: number) => ':id' + i).join(', ')})`\n await this.#conn!.execute(sql, bindObj)\n await this.#conn!.commit()\n }\n } else {\n await this.#conn!.execute(`DELETE FROM ${T}`)\n await this.#conn!.commit()\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n\n// Score recomputation helpers (copied from couchbase/index.ts verbatim)\n\nconst cosineSim = (a: number[], b: number[]): number => {\n let dot = 0\n let normA = 0\n let normB = 0\n for (const [i, av] of a.entries()) {\n const bv = b[i]\n dot += av * bv\n normA += av * av\n normB += bv * bv\n }\n const denom = Math.sqrt(normA) * Math.sqrt(normB)\n return denom === 0 ? 0 : dot / denom\n}\n\nconst dotProd = (a: number[], b: number[]): number => {\n let s = 0\n for (const [i, element] of a.entries()) {\n s += element * b[i]\n }\n return s\n}\n\nconst euclideanDist = (a: number[], b: number[]): number => {\n let s = 0\n for (const [i, element] of a.entries()) {\n const d = element - b[i]\n s += d * d\n }\n return Math.sqrt(s)\n}\n\nconst computeScore = (vec: number[], query: number[], metric: DistanceMetric): number => {\n if (metric === 'cosine') {\n const raw = cosineSim(vec, query)\n return normalizeScore(raw, 'cosine', 'similarity')\n } else if (metric === 'dot') {\n const raw = dotProd(vec, query)\n return normalizeScore(raw, 'dot', 'similarity')\n } else if (metric === 'euclidean') {\n const raw = euclideanDist(vec, query)\n return normalizeScore(raw, 'euclidean', 'distance')\n } else {\n // Fallback\n const raw = cosineSim(vec, query)\n return normalizeScore(raw, 'cosine', 'similarity')\n }\n}\n"],"mappings":"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"}