@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,338 @@
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/oracle23ai/index.ts
9
+ /**
10
+ * @module @nhtio/adk/batteries/vector/oracle23ai
11
+ *
12
+ * Oracle 23ai AI Vector Search adapter. Vectors live in a `VECTOR(dims, FLOAT32)` column
13
+ * written with `DB_TYPE_VECTOR` (oracledb thin mode, default) and read back as Float32Array.
14
+ * KNN search uses `VECTOR_DISTANCE(vec, :q, COSINE|EUCLIDEAN|DOT)` ordered ascending. Metadata
15
+ * is a CLOB containing a JSON string, filtered with the neutral evaluator for exact cross-adapter
16
+ * parity. Each collection maps to a table named `<tablePrefix><collection>` with double-quoted
17
+ * identifiers for safety.
18
+ *
19
+ * The connecting user must default to a non-SYSTEM tablespace (e.g. USERS) and have CREATE TABLE.
20
+ * Oracle 23ai provides strong consistency: commits are synchronous, so there is no settle-poll.
21
+ *
22
+ * Score contract: do NOT trust the raw VECTOR_DISTANCE as a [0,1] score. Instead, use SQL only to
23
+ * order candidates, then recompute the [0,1] similarity locally using the stored `vec` and the
24
+ * computeScore helper, ensuring the [0,1] contract regardless of metric semantics.
25
+ *
26
+ * Driver: `oracledb` (pure-JS thin mode, no Instant Client required).
27
+ */
28
+ var getOracle = async () => {
29
+ try {
30
+ const mod = await import(
31
+ /* @vite-ignore */
32
+ "oracledb"
33
+ );
34
+ return mod.default ?? mod;
35
+ } catch {
36
+ throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(["oracledb"]);
37
+ }
38
+ };
39
+ var ident = (name) => "\"" + name.replace(/"/g, "\"\"") + "\"";
40
+ var Oracle23aiVectorStore = class extends BaseVectorStore {
41
+ capabilities = {
42
+ transactions: false,
43
+ namedVectors: false,
44
+ rename: false,
45
+ rawSql: false,
46
+ builtInEncoding: false,
47
+ consistency: {
48
+ configurable: false,
49
+ default: "strong",
50
+ modes: ["strong"]
51
+ }
52
+ };
53
+ #oracledb = null;
54
+ #conn = null;
55
+ #dims = /* @__PURE__ */ new Map();
56
+ #metrics = /* @__PURE__ */ new Map();
57
+ get #opts() {
58
+ return this.options;
59
+ }
60
+ #table(collection) {
61
+ return (this.#opts.connection.tablePrefix ?? "") + collection;
62
+ }
63
+ static isAvailable() {
64
+ return typeof process !== "undefined";
65
+ }
66
+ isAvailable() {
67
+ return typeof process !== "undefined";
68
+ }
69
+ async connect() {
70
+ if (this.#conn) return;
71
+ this.#oracledb = await getOracle();
72
+ const c = this.#opts.connection;
73
+ try {
74
+ this.#conn = await this.#oracledb.getConnection({
75
+ user: c.user,
76
+ password: c.password,
77
+ connectString: c.connectString
78
+ });
79
+ } catch (err) {
80
+ throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)]);
81
+ }
82
+ }
83
+ async close() {
84
+ if (this.#conn) {
85
+ await this.#conn.close();
86
+ this.#conn = null;
87
+ this.#oracledb = null;
88
+ }
89
+ }
90
+ #parseMeta(val) {
91
+ if (typeof val === "string") try {
92
+ return JSON.parse(val);
93
+ } catch {
94
+ return {};
95
+ }
96
+ if (val && typeof val === "object") return val;
97
+ return {};
98
+ }
99
+ async createCollection(spec, ifNotExists) {
100
+ const coll = spec.collection;
101
+ const dims = spec.vector.dimensions;
102
+ const metric = spec.vector.metric;
103
+ this.#dims.set(coll, dims);
104
+ this.#metrics.set(coll, metric);
105
+ const T = ident(this.#table(coll));
106
+ const tableName = this.#table(coll);
107
+ try {
108
+ if ((await this.#conn.execute(`SELECT 1 FROM user_tables WHERE table_name = :n`, [tableName], { outFormat: this.#oracledb.OUT_FORMAT_OBJECT })).rows.length > 0) {
109
+ if (ifNotExists) {
110
+ await this.#conn.execute(`DELETE FROM ${T}`);
111
+ await this.#conn.commit();
112
+ return;
113
+ }
114
+ await this.#conn.execute(`DROP TABLE ${T}`);
115
+ }
116
+ const sql = `CREATE TABLE ${T} (
117
+ id VARCHAR2(512) PRIMARY KEY,
118
+ vec VECTOR(${dims}, FLOAT32),
119
+ document CLOB,
120
+ metadata CLOB
121
+ )`;
122
+ await this.#conn.execute(sql);
123
+ await this.#conn.commit();
124
+ } catch (err) {
125
+ throw new E_VECTOR_STORE_COLLECTION_FAILED(["createCollection", String(err)]);
126
+ }
127
+ }
128
+ async dropCollection(collection, ifExists) {
129
+ const T = ident(this.#table(collection));
130
+ try {
131
+ await this.#conn.execute(`DROP TABLE ${T}`);
132
+ this.#dims.delete(collection);
133
+ this.#metrics.delete(collection);
134
+ } catch (err) {
135
+ if (err?.message && err.message.includes("ORA-00942")) {
136
+ if (ifExists) return;
137
+ throw new E_VECTOR_STORE_COLLECTION_FAILED(["dropCollection", "table does not exist"]);
138
+ }
139
+ throw new E_VECTOR_STORE_COLLECTION_FAILED(["dropCollection", String(err)]);
140
+ }
141
+ }
142
+ async hasCollection(collection) {
143
+ const tableName = this.#table(collection);
144
+ return (await this.#conn.execute(`SELECT 1 FROM user_tables WHERE table_name = :n`, [tableName], { outFormat: this.#oracledb.OUT_FORMAT_OBJECT })).rows.length > 0;
145
+ }
146
+ async renameCollection(_from, _to) {
147
+ throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(["renameCollection", "oracle23ai"]);
148
+ }
149
+ async executeUpsert(plan) {
150
+ if (plan.records.length === 0) return;
151
+ validateRecords(plan.records);
152
+ const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection);
153
+ const T = ident(this.#table(plan.collection));
154
+ try {
155
+ for (const r of plan.records) {
156
+ let vector = r.vector;
157
+ if (!vector && r.document) {
158
+ const [v] = await this.encode([r.document], "document");
159
+ vector = v;
160
+ }
161
+ if (!vector) throw new E_VECTOR_STORE_UPSERT_FAILED(["Record missing vector and document"]);
162
+ if (expected !== void 0 && vector.length !== expected) throw new E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length]);
163
+ const vecBind = {
164
+ type: this.#oracledb.DB_TYPE_VECTOR,
165
+ val: Float32Array.from(vector)
166
+ };
167
+ const doc = r.document ?? "";
168
+ const meta = r.metadata ? JSON.stringify(r.metadata) : "{}";
169
+ await this.#conn.execute(`MERGE INTO ${T} d
170
+ USING (SELECT :id AS id FROM dual) s
171
+ ON (d.id = s.id)
172
+ WHEN MATCHED THEN UPDATE SET vec = :vec, document = :doc, metadata = :meta
173
+ WHEN NOT MATCHED THEN INSERT (id, vec, document, metadata)
174
+ VALUES (:id, :vec, :doc, :meta)`, {
175
+ id: r.id,
176
+ vec: vecBind,
177
+ doc,
178
+ meta
179
+ }, { outFormat: this.#oracledb.OUT_FORMAT_OBJECT });
180
+ }
181
+ await this.#conn.commit();
182
+ } catch (err) {
183
+ 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;
184
+ throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)]);
185
+ }
186
+ }
187
+ async executeSearch(plan) {
188
+ const coll = plan.collection;
189
+ const metric = this.#metrics.get(coll) ?? this.#opts.metric ?? "cosine";
190
+ const T = ident(this.#table(coll));
191
+ let queryVector;
192
+ if (plan.near) {
193
+ if ("vector" in plan.near) queryVector = plan.near.vector;
194
+ else if ("serverText" in plan.near) {
195
+ const [v] = await this.encode([plan.near.serverText], "query");
196
+ queryVector = v;
197
+ } else if ("id" in plan.near) {
198
+ const rows = await this.#conn.execute(`SELECT vec FROM ${T} WHERE id = :id`, [plan.near.id], {
199
+ outFormat: this.#oracledb.OUT_FORMAT_OBJECT,
200
+ fetchInfo: { VEC: { type: this.#oracledb.DB_TYPE_VECTOR } }
201
+ });
202
+ if (rows.rows.length === 0) throw new E_VECTOR_STORE_SEARCH_FAILED(["Referenced id not found: " + plan.near.id]);
203
+ const arr = rows.rows[0].VEC;
204
+ queryVector = Array.from(arr);
205
+ }
206
+ }
207
+ const offset = plan.offset ?? 0;
208
+ try {
209
+ if (queryVector) {
210
+ const k = plan.filter ? 1e3 : plan.topK + offset;
211
+ const metricSql = metric === "cosine" ? "COSINE" : metric === "euclidean" ? "EUCLIDEAN" : metric === "dot" ? "DOT" : "COSINE";
212
+ const qBind = {
213
+ type: this.#oracledb.DB_TYPE_VECTOR,
214
+ val: Float32Array.from(queryVector)
215
+ };
216
+ const rows = await this.#conn.execute(`SELECT id, vec, document, metadata, VECTOR_DISTANCE(vec, :q, ${metricSql}) AS dist
217
+ FROM ${T}
218
+ ORDER BY dist
219
+ FETCH APPROX FIRST :k ROWS ONLY`, {
220
+ q: qBind,
221
+ k
222
+ }, {
223
+ outFormat: this.#oracledb.OUT_FORMAT_OBJECT,
224
+ fetchInfo: {
225
+ DOCUMENT: { type: this.#oracledb.STRING },
226
+ METADATA: { type: this.#oracledb.STRING }
227
+ }
228
+ });
229
+ const result = [];
230
+ for (const row of rows.rows) {
231
+ const meta = this.#parseMeta(row.METADATA);
232
+ if (plan.filter && !evaluateFilter(plan.filter, meta)) continue;
233
+ const score = computeScore(Array.from(row.VEC), queryVector, metric);
234
+ result.push(this.#project(row, plan, score));
235
+ }
236
+ return result.slice(offset, offset + plan.topK);
237
+ } else {
238
+ const rows = await this.#conn.execute(`SELECT id, vec, document, metadata FROM ${T} FETCH FIRST :cap ROWS ONLY`, [1e3], {
239
+ outFormat: this.#oracledb.OUT_FORMAT_OBJECT,
240
+ fetchInfo: {
241
+ DOCUMENT: { type: this.#oracledb.STRING },
242
+ METADATA: { type: this.#oracledb.STRING }
243
+ }
244
+ });
245
+ const result = [];
246
+ for (const row of rows.rows) {
247
+ const meta = this.#parseMeta(row.METADATA);
248
+ if (plan.filter && !evaluateFilter(plan.filter, meta)) continue;
249
+ result.push(this.#project(row, plan, void 0));
250
+ }
251
+ return result.slice(offset, offset + plan.topK);
252
+ }
253
+ } catch (err) {
254
+ if (err?.message && err.message.includes("Referenced id not found")) throw err;
255
+ throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)]);
256
+ }
257
+ }
258
+ #project(row, plan, score) {
259
+ const proj = plan.projection;
260
+ const out = {};
261
+ if (proj.id) out.id = row.ID;
262
+ if (proj.vector) out.vector = Array.from(row.VEC).map(Number);
263
+ if (proj.document) out.document = row.DOCUMENT ?? void 0;
264
+ if (proj.metadata) out.metadata = this.#parseMeta(row.METADATA);
265
+ if (score !== void 0) out.score = score;
266
+ return out;
267
+ }
268
+ async executeDelete(plan) {
269
+ const T = ident(this.#table(plan.collection));
270
+ try {
271
+ if (plan.ids && plan.ids.length > 0) {
272
+ const ids = plan.ids;
273
+ const bindObj = {};
274
+ ids.forEach((id, i) => {
275
+ bindObj["id" + i] = id;
276
+ });
277
+ const sql = `DELETE FROM ${T} WHERE id IN (${ids.map((_id, i) => ":id" + i).join(", ")})`;
278
+ await this.#conn.execute(sql, bindObj);
279
+ await this.#conn.commit();
280
+ } else if (plan.filter) {
281
+ const targets = (await this.#conn.execute(`SELECT id, metadata FROM ${T}`, {}, {
282
+ outFormat: this.#oracledb.OUT_FORMAT_OBJECT,
283
+ fetchInfo: { METADATA: { type: this.#oracledb.STRING } }
284
+ })).rows.filter((r) => evaluateFilter(plan.filter, this.#parseMeta(r.METADATA))).map((r) => r.ID);
285
+ if (targets.length > 0) {
286
+ const bindObj = {};
287
+ targets.forEach((id, i) => {
288
+ bindObj["id" + i] = id;
289
+ });
290
+ const sql = `DELETE FROM ${T} WHERE id IN (${targets.map((_id, i) => ":id" + i).join(", ")})`;
291
+ await this.#conn.execute(sql, bindObj);
292
+ await this.#conn.commit();
293
+ }
294
+ } else {
295
+ await this.#conn.execute(`DELETE FROM ${T}`);
296
+ await this.#conn.commit();
297
+ }
298
+ } catch (err) {
299
+ throw new E_VECTOR_STORE_DELETE_FAILED([String(err)]);
300
+ }
301
+ }
302
+ };
303
+ var cosineSim = (a, b) => {
304
+ let dot = 0;
305
+ let normA = 0;
306
+ let normB = 0;
307
+ for (const [i, av] of a.entries()) {
308
+ const bv = b[i];
309
+ dot += av * bv;
310
+ normA += av * av;
311
+ normB += bv * bv;
312
+ }
313
+ const denom = Math.sqrt(normA) * Math.sqrt(normB);
314
+ return denom === 0 ? 0 : dot / denom;
315
+ };
316
+ var dotProd = (a, b) => {
317
+ let s = 0;
318
+ for (const [i, element] of a.entries()) s += element * b[i];
319
+ return s;
320
+ };
321
+ var euclideanDist = (a, b) => {
322
+ let s = 0;
323
+ for (const [i, element] of a.entries()) {
324
+ const d = element - b[i];
325
+ s += d * d;
326
+ }
327
+ return Math.sqrt(s);
328
+ };
329
+ var computeScore = (vec, query, metric) => {
330
+ if (metric === "cosine") return normalizeScore(cosineSim(vec, query), "cosine", "similarity");
331
+ else if (metric === "dot") return normalizeScore(dotProd(vec, query), "dot", "similarity");
332
+ else if (metric === "euclidean") return normalizeScore(euclideanDist(vec, query), "euclidean", "distance");
333
+ else return normalizeScore(cosineSim(vec, query), "cosine", "similarity");
334
+ };
335
+ //#endregion
336
+ export { Oracle23aiVectorStore };
337
+
338
+ //# sourceMappingURL=oracle23ai.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oracle23ai.mjs","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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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @module @nhtio/adk/batteries/vector/orama
3
+ */
4
+ import { BaseVectorStore } from "../contract";
5
+ import type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from "../types";
6
+ import type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from "../plan";
7
+ export interface OramaVectorStoreOptions extends BaseVectorStoreOptions {
8
+ }
9
+ export declare class OramaVectorStore extends BaseVectorStore {
10
+ #private;
11
+ readonly capabilities: VectorStoreCapabilities;
12
+ static isAvailable(): boolean;
13
+ isAvailable(): boolean;
14
+ connect(): Promise<void>;
15
+ close(): Promise<void>;
16
+ createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void>;
17
+ dropCollection(collection: string, ifExists: boolean): Promise<void>;
18
+ hasCollection(collection: string): Promise<boolean>;
19
+ renameCollection(from: string, to: string): Promise<void>;
20
+ executeUpsert(plan: UpsertPlan): Promise<void>;
21
+ executeDelete(plan: DeletePlan): Promise<void>;
22
+ executeSearch(plan: SearchPlan): Promise<VectorMatch[]>;
23
+ }
@@ -0,0 +1,272 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../chunk-Ble4zEEl.js");
3
+ const require_batteries_vector_filters = require("./filters.cjs");
4
+ const require_batteries_vector_helpers = require("./helpers.cjs");
5
+ const require_batteries_vector_exceptions = require("./exceptions.cjs");
6
+ const require_batteries_vector_contract = require("./contract.cjs");
7
+ const require_batteries_vector_validation = require("./validation.cjs");
8
+ //#region src/batteries/vector/orama/index.ts
9
+ /**
10
+ * @module @nhtio/adk/batteries/vector/orama
11
+ */
12
+ var OramaVectorStore = class extends require_batteries_vector_contract.BaseVectorStore {
13
+ capabilities = {
14
+ transactions: false,
15
+ namedVectors: false,
16
+ rename: true,
17
+ rawSql: false,
18
+ builtInEncoding: false,
19
+ consistency: {
20
+ configurable: false,
21
+ default: "strong",
22
+ modes: ["strong"]
23
+ }
24
+ };
25
+ #collections = /* @__PURE__ */ new Map();
26
+ #dims = /* @__PURE__ */ new Map();
27
+ #orama = null;
28
+ #dbs = /* @__PURE__ */ new Map();
29
+ static isAvailable() {
30
+ return true;
31
+ }
32
+ isAvailable() {
33
+ return true;
34
+ }
35
+ async connect() {
36
+ if (!this.#orama) try {
37
+ const mod = await import("@orama/orama");
38
+ this.#orama = mod;
39
+ } catch {
40
+ throw new require_batteries_vector_exceptions.E_VECTOR_STORE_DRIVER_UNAVAILABLE(["@orama/orama"]);
41
+ }
42
+ }
43
+ async close() {
44
+ this.#dbs.clear();
45
+ }
46
+ async createCollection(spec, ifNotExists) {
47
+ if (this.#collections.has(spec.collection)) {
48
+ if (!ifNotExists) throw new Error(`Collection "${spec.collection}" already exists`);
49
+ return;
50
+ }
51
+ this.#collections.set(spec.collection, /* @__PURE__ */ new Map());
52
+ this.#dims.set(spec.collection, spec.vector.dimensions);
53
+ if (this.#orama) {
54
+ const db = this.#orama.create({ schema: {
55
+ embedding: `vector[${spec.vector.dimensions}]`,
56
+ metadataJson: "string"
57
+ } });
58
+ this.#dbs.set(spec.collection, db);
59
+ }
60
+ }
61
+ async dropCollection(collection, ifExists) {
62
+ if (!this.#collections.has(collection)) {
63
+ if (!ifExists) throw new Error(`Collection "${collection}" does not exist`);
64
+ return;
65
+ }
66
+ this.#collections.delete(collection);
67
+ this.#dims.delete(collection);
68
+ this.#dbs.delete(collection);
69
+ }
70
+ async hasCollection(collection) {
71
+ return this.#collections.has(collection);
72
+ }
73
+ async renameCollection(from, to) {
74
+ const m = this.#collections.get(from);
75
+ if (!m) throw new Error(`Collection "${from}" does not exist`);
76
+ if (this.#collections.has(to)) throw new Error(`Collection "${to}" already exists`);
77
+ this.#collections.set(to, m);
78
+ this.#collections.delete(from);
79
+ const d = this.#dims.get(from);
80
+ if (d !== void 0) {
81
+ this.#dims.set(to, d);
82
+ this.#dims.delete(from);
83
+ }
84
+ const db = this.#dbs.get(from);
85
+ if (db) {
86
+ this.#dbs.set(to, db);
87
+ this.#dbs.delete(from);
88
+ }
89
+ }
90
+ #coll(collection) {
91
+ let m = this.#collections.get(collection);
92
+ if (!m) {
93
+ m = /* @__PURE__ */ new Map();
94
+ this.#collections.set(collection, m);
95
+ }
96
+ return m;
97
+ }
98
+ #getDb(collection) {
99
+ return this.#dbs.get(collection);
100
+ }
101
+ async executeUpsert(plan) {
102
+ if (plan.records.length === 0) return;
103
+ require_batteries_vector_validation.validateRecords(plan.records);
104
+ const expected = this.#dims.get(plan.collection);
105
+ const m = this.#coll(plan.collection);
106
+ const db = this.#getDb(plan.collection);
107
+ for (const r of plan.records) {
108
+ let vector = r.vector;
109
+ if (!vector && r.document) {
110
+ const [v] = await this.encode([r.document], "document");
111
+ vector = v;
112
+ }
113
+ if (vector && expected !== void 0 && vector.length !== expected) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length]);
114
+ const row = {
115
+ id: r.id,
116
+ vector,
117
+ document: r.document,
118
+ metadata: r.metadata
119
+ };
120
+ m.set(r.id, row);
121
+ if (db) {
122
+ const doc = {
123
+ id: r.id,
124
+ metadataJson: JSON.stringify(row.metadata ?? {}),
125
+ embedding: vector
126
+ };
127
+ await this.#orama.insert(db, doc);
128
+ }
129
+ }
130
+ }
131
+ async executeDelete(plan) {
132
+ const m = this.#coll(plan.collection);
133
+ const db = this.#getDb(plan.collection);
134
+ if (plan.ids) {
135
+ for (const id of plan.ids) m.delete(id);
136
+ if (db) for (const id of plan.ids) await this.#orama.remove(db, id);
137
+ return;
138
+ }
139
+ if (plan.filter) {
140
+ for (const [id, row] of [...m]) if (require_batteries_vector_filters.evaluateFilter(plan.filter, row.metadata ?? {})) {
141
+ m.delete(id);
142
+ if (db) await this.#orama.remove(db, id);
143
+ }
144
+ return;
145
+ }
146
+ m.clear();
147
+ if (db) {
148
+ const allIds = this.#orama.select(db, { limit: 1e4 });
149
+ if (allIds.hits) for (const h of allIds.hits) await this.#orama.remove(db, h.id);
150
+ }
151
+ }
152
+ async executeSearch(plan) {
153
+ const m = this.#coll(plan.collection);
154
+ const db = this.#getDb(plan.collection);
155
+ let rows = [...m.values()];
156
+ let scored;
157
+ if (plan.near && "vector" in plan.near) {
158
+ if (db) {
159
+ const r = await this.#orama.search(db, {
160
+ mode: "vector",
161
+ vector: {
162
+ value: plan.near.vector,
163
+ property: "embedding"
164
+ },
165
+ limit: plan.topK + (plan.offset ?? 0),
166
+ similarity: 0
167
+ });
168
+ const ids = new Set(r.hits.map((h) => h.id));
169
+ const idMap = new Map(rows.filter((row) => ids.has(row.id)).map((row) => [row.id, row]));
170
+ rows = r.hits.map((h) => idMap.get(h.id)).filter(Boolean);
171
+ } else rows = rows.filter(() => true);
172
+ if (plan.filter) rows = rows.filter((row) => require_batteries_vector_filters.evaluateFilter(plan.filter, row.metadata ?? {}));
173
+ scored = rows.map((row) => ({
174
+ row,
175
+ score: this.#cosineLikeScore(plan.near, row, plan)
176
+ }));
177
+ scored.sort((a, b) => (b.score ?? 0) - (a.score ?? 0));
178
+ } else if (plan.near && "serverText" in plan.near) {
179
+ const [qv] = await this.encode([plan.near.serverText], "query");
180
+ if (db) {
181
+ const r = await this.#orama.search(db, {
182
+ mode: "vector",
183
+ vector: {
184
+ value: qv,
185
+ property: "embedding"
186
+ },
187
+ limit: plan.topK + (plan.offset ?? 0),
188
+ similarity: 0
189
+ });
190
+ const ids = new Set(r.hits.map((h) => h.id));
191
+ const idMap = new Map(rows.filter((row) => ids.has(row.id)).map((row) => [row.id, row]));
192
+ rows = r.hits.map((h) => idMap.get(h.id)).filter(Boolean);
193
+ }
194
+ if (plan.filter) rows = rows.filter((row) => require_batteries_vector_filters.evaluateFilter(plan.filter, row.metadata ?? {}));
195
+ scored = rows.map((row) => ({
196
+ row,
197
+ score: this.#scoreVec(qv, row.vector, plan)
198
+ }));
199
+ scored.sort((a, b) => (b.score ?? 0) - (a.score ?? 0));
200
+ } else if (plan.near && "id" in plan.near) {
201
+ const qv = m.get(plan.near.id)?.vector;
202
+ if (db && qv) {
203
+ const r = await this.#orama.search(db, {
204
+ mode: "vector",
205
+ vector: {
206
+ value: qv,
207
+ property: "embedding"
208
+ },
209
+ limit: plan.topK + (plan.offset ?? 0),
210
+ similarity: 0
211
+ });
212
+ const ids = new Set(r.hits.map((h) => h.id));
213
+ const idMap = new Map(rows.filter((row) => ids.has(row.id)).map((row) => [row.id, row]));
214
+ rows = r.hits.map((h) => idMap.get(h.id)).filter(Boolean);
215
+ }
216
+ if (plan.filter) rows = rows.filter((row) => require_batteries_vector_filters.evaluateFilter(plan.filter, row.metadata ?? {}));
217
+ scored = rows.map((row) => ({
218
+ row,
219
+ score: qv ? this.#scoreVec(qv, row.vector, plan) : void 0
220
+ }));
221
+ scored.sort((a, b) => (b.score ?? 0) - (a.score ?? 0));
222
+ } else {
223
+ if (plan.filter) rows = rows.filter((row) => require_batteries_vector_filters.evaluateFilter(plan.filter, row.metadata ?? {}));
224
+ scored = rows.map((row) => ({ row }));
225
+ }
226
+ return scored.slice(plan.offset ?? 0, (plan.offset ?? 0) + plan.topK).map(({ row, score }) => this.#project(row, score, plan.projection));
227
+ }
228
+ #scoreVec(q, v, _plan) {
229
+ if (!v) return void 0;
230
+ const metric = this.options.metric ?? "cosine";
231
+ let raw;
232
+ if (metric === "cosine") {
233
+ const dot = this.#dot(q, v);
234
+ const na = Math.sqrt(this.#dot(q, q));
235
+ const nb = Math.sqrt(this.#dot(v, v));
236
+ raw = na && nb ? dot / (na * nb) : 0;
237
+ return require_batteries_vector_helpers.clamp01(raw);
238
+ }
239
+ if (metric === "dot") {
240
+ raw = this.#dot(q, v);
241
+ return require_batteries_vector_helpers.clamp01(raw);
242
+ }
243
+ let s = 0;
244
+ for (let i = 0; i < Math.min(q.length, v.length); i++) {
245
+ const d = q[i] - v[i];
246
+ s += d * d;
247
+ }
248
+ raw = Math.sqrt(s);
249
+ return require_batteries_vector_helpers.clamp01(1 / (1 + raw));
250
+ }
251
+ #cosineLikeScore(near, row, plan) {
252
+ return this.#scoreVec(near.vector, row.vector, plan);
253
+ }
254
+ #dot(a, b) {
255
+ let s = 0;
256
+ for (let i = 0; i < Math.min(a.length, b.length); i++) s += a[i] * b[i];
257
+ return s;
258
+ }
259
+ #project(row, score, p) {
260
+ const out = {};
261
+ if (p.id) out.id = row.id;
262
+ if (score !== void 0) out.score = score;
263
+ if (p.vector && row.vector) out.vector = row.vector;
264
+ if (p.document && row.document !== void 0) out.document = row.document;
265
+ if (p.metadata && row.metadata !== void 0) out.metadata = row.metadata;
266
+ return out;
267
+ }
268
+ };
269
+ //#endregion
270
+ exports.OramaVectorStore = OramaVectorStore;
271
+
272
+ //# sourceMappingURL=orama.cjs.map