@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.
- package/CHANGELOG.md +261 -0
- package/adk-mcp.mjs +1 -1
- package/batteries/embeddings/openai/adapter.cjs +1 -1
- package/batteries/embeddings/openai/adapter.mjs +1 -1
- package/batteries/embeddings/webllm/adapter.cjs +1 -1
- package/batteries/embeddings/webllm/adapter.mjs +1 -1
- package/batteries/index.d.ts +1 -0
- package/batteries/llm/openai_chat_completions/adapter.cjs +6 -6
- package/batteries/llm/openai_chat_completions/adapter.cjs.map +1 -1
- package/batteries/llm/openai_chat_completions/adapter.mjs +6 -6
- package/batteries/llm/openai_chat_completions/adapter.mjs.map +1 -1
- package/batteries/llm/openai_chat_completions/helpers.cjs +2 -2
- package/batteries/llm/openai_chat_completions/helpers.mjs +2 -2
- package/batteries/llm/openai_chat_completions/validation.cjs +2 -2
- package/batteries/llm/openai_chat_completions/validation.cjs.map +1 -1
- package/batteries/llm/openai_chat_completions/validation.mjs +2 -2
- package/batteries/llm/openai_chat_completions/validation.mjs.map +1 -1
- package/batteries/llm/webllm_chat_completions/adapter.cjs +6 -6
- package/batteries/llm/webllm_chat_completions/adapter.cjs.map +1 -1
- package/batteries/llm/webllm_chat_completions/adapter.mjs +6 -6
- package/batteries/llm/webllm_chat_completions/adapter.mjs.map +1 -1
- package/batteries/llm/webllm_chat_completions/validation.cjs +2 -2
- package/batteries/llm/webllm_chat_completions/validation.cjs.map +1 -1
- package/batteries/llm/webllm_chat_completions/validation.mjs +2 -2
- package/batteries/llm/webllm_chat_completions/validation.mjs.map +1 -1
- package/batteries/storage/flydrive.cjs +1 -1
- package/batteries/storage/flydrive.mjs +2 -2
- package/batteries/storage/in_memory.cjs +1 -1
- package/batteries/storage/in_memory.mjs +1 -1
- package/batteries/storage/opfs.cjs +1 -1
- package/batteries/storage/opfs.mjs +1 -1
- package/batteries/tools/color.cjs +2 -2
- package/batteries/tools/color.mjs +2 -2
- package/batteries/tools/comparison.cjs +3 -3
- package/batteries/tools/comparison.mjs +3 -3
- package/batteries/tools/data_structure.cjs +3 -3
- package/batteries/tools/data_structure.mjs +3 -3
- package/batteries/tools/datetime_extended.cjs +2 -2
- package/batteries/tools/datetime_extended.mjs +2 -2
- package/batteries/tools/datetime_math.cjs +2 -2
- package/batteries/tools/datetime_math.mjs +2 -2
- package/batteries/tools/encoding.cjs +3 -3
- package/batteries/tools/encoding.mjs +3 -3
- package/batteries/tools/formatting.cjs +3 -3
- package/batteries/tools/formatting.mjs +3 -3
- package/batteries/tools/geo_basics.cjs +2 -2
- package/batteries/tools/geo_basics.mjs +2 -2
- package/batteries/tools/math/index.d.ts +16 -5
- package/batteries/tools/math.cjs +340 -22
- package/batteries/tools/math.cjs.map +1 -1
- package/batteries/tools/math.mjs +338 -21
- package/batteries/tools/math.mjs.map +1 -1
- package/batteries/tools/memory.cjs +5 -5
- package/batteries/tools/memory.mjs +5 -5
- package/batteries/tools/parsing.cjs +4 -4
- package/batteries/tools/parsing.mjs +4 -4
- package/batteries/tools/retrievables.cjs +4 -4
- package/batteries/tools/retrievables.mjs +4 -4
- package/batteries/tools/standing_instructions.cjs +4 -4
- package/batteries/tools/standing_instructions.mjs +4 -4
- package/batteries/tools/statistics.cjs +4 -4
- package/batteries/tools/statistics.mjs +4 -4
- package/batteries/tools/string_processing.cjs +3 -3
- package/batteries/tools/string_processing.mjs +3 -3
- package/batteries/tools/structured_data.cjs +3 -3
- package/batteries/tools/structured_data.mjs +3 -3
- package/batteries/tools/text_analysis.cjs +3 -3
- package/batteries/tools/text_analysis.mjs +3 -3
- package/batteries/tools/text_comparison.cjs +2 -2
- package/batteries/tools/text_comparison.mjs +2 -2
- package/batteries/tools/time.cjs +2 -2
- package/batteries/tools/time.mjs +2 -2
- package/batteries/tools/unit_conversion.cjs +2 -2
- package/batteries/tools/unit_conversion.mjs +2 -2
- package/batteries/vector/arangodb/index.d.ts +38 -0
- package/batteries/vector/arangodb.cjs +257 -0
- package/batteries/vector/arangodb.cjs.map +1 -0
- package/batteries/vector/arangodb.mjs +255 -0
- package/batteries/vector/arangodb.mjs.map +1 -0
- package/batteries/vector/builder.cjs +297 -0
- package/batteries/vector/builder.cjs.map +1 -0
- package/batteries/vector/builder.d.ts +87 -0
- package/batteries/vector/builder.mjs +294 -0
- package/batteries/vector/builder.mjs.map +1 -0
- package/batteries/vector/chroma/index.d.ts +32 -0
- package/batteries/vector/chroma.cjs +305 -0
- package/batteries/vector/chroma.cjs.map +1 -0
- package/batteries/vector/chroma.mjs +302 -0
- package/batteries/vector/chroma.mjs.map +1 -0
- package/batteries/vector/clickhouse/index.d.ts +39 -0
- package/batteries/vector/clickhouse.cjs +246 -0
- package/batteries/vector/clickhouse.cjs.map +1 -0
- package/batteries/vector/clickhouse.mjs +244 -0
- package/batteries/vector/clickhouse.mjs.map +1 -0
- package/batteries/vector/cloudflare/index.d.ts +43 -0
- package/batteries/vector/cloudflare.cjs +397 -0
- package/batteries/vector/cloudflare.cjs.map +1 -0
- package/batteries/vector/cloudflare.mjs +395 -0
- package/batteries/vector/cloudflare.mjs.map +1 -0
- package/batteries/vector/conformance/index.d.ts +15 -0
- package/batteries/vector/conformance.cjs +209 -0
- package/batteries/vector/conformance.cjs.map +1 -0
- package/batteries/vector/conformance.mjs +205 -0
- package/batteries/vector/conformance.mjs.map +1 -0
- package/batteries/vector/contract.cjs +42 -0
- package/batteries/vector/contract.cjs.map +1 -0
- package/batteries/vector/contract.d.ts +39 -0
- package/batteries/vector/contract.mjs +40 -0
- package/batteries/vector/contract.mjs.map +1 -0
- package/batteries/vector/couchbase/index.d.ts +49 -0
- package/batteries/vector/couchbase.cjs +401 -0
- package/batteries/vector/couchbase.cjs.map +1 -0
- package/batteries/vector/couchbase.mjs +399 -0
- package/batteries/vector/couchbase.mjs.map +1 -0
- package/batteries/vector/duckdb/index.d.ts +33 -0
- package/batteries/vector/duckdb.cjs +218 -0
- package/batteries/vector/duckdb.cjs.map +1 -0
- package/batteries/vector/duckdb.mjs +216 -0
- package/batteries/vector/duckdb.mjs.map +1 -0
- package/batteries/vector/elasticsearch/index.d.ts +43 -0
- package/batteries/vector/elasticsearch.cjs +306 -0
- package/batteries/vector/elasticsearch.cjs.map +1 -0
- package/batteries/vector/elasticsearch.mjs +303 -0
- package/batteries/vector/elasticsearch.mjs.map +1 -0
- package/batteries/vector/exceptions.cjs +126 -0
- package/batteries/vector/exceptions.cjs.map +1 -0
- package/batteries/vector/exceptions.d.ts +142 -0
- package/batteries/vector/exceptions.mjs +107 -0
- package/batteries/vector/exceptions.mjs.map +1 -0
- package/batteries/vector/factory.cjs +28 -0
- package/batteries/vector/factory.cjs.map +1 -0
- package/batteries/vector/factory.d.ts +38 -0
- package/batteries/vector/factory.mjs +25 -0
- package/batteries/vector/factory.mjs.map +1 -0
- package/batteries/vector/filters.cjs +107 -0
- package/batteries/vector/filters.cjs.map +1 -0
- package/batteries/vector/filters.d.ts +34 -0
- package/batteries/vector/filters.mjs +99 -0
- package/batteries/vector/filters.mjs.map +1 -0
- package/batteries/vector/helpers.cjs +23 -0
- package/batteries/vector/helpers.cjs.map +1 -0
- package/batteries/vector/helpers.d.ts +12 -0
- package/batteries/vector/helpers.mjs +17 -0
- package/batteries/vector/helpers.mjs.map +1 -0
- package/batteries/vector/hnswlib/index.d.ts +35 -0
- package/batteries/vector/hnswlib.cjs +237 -0
- package/batteries/vector/hnswlib.cjs.map +1 -0
- package/batteries/vector/hnswlib.mjs +235 -0
- package/batteries/vector/hnswlib.mjs.map +1 -0
- package/batteries/vector/in_memory/index.d.ts +23 -0
- package/batteries/vector/in_memory.cjs +178 -0
- package/batteries/vector/in_memory.cjs.map +1 -0
- package/batteries/vector/in_memory.mjs +176 -0
- package/batteries/vector/in_memory.mjs.map +1 -0
- package/batteries/vector/index.d.ts +18 -0
- package/batteries/vector/lancedb/index.d.ts +34 -0
- package/batteries/vector/lancedb.cjs +224 -0
- package/batteries/vector/lancedb.cjs.map +1 -0
- package/batteries/vector/lancedb.mjs +222 -0
- package/batteries/vector/lancedb.mjs.map +1 -0
- package/batteries/vector/mariadb/index.d.ts +39 -0
- package/batteries/vector/mariadb.cjs +228 -0
- package/batteries/vector/mariadb.cjs.map +1 -0
- package/batteries/vector/mariadb.mjs +226 -0
- package/batteries/vector/mariadb.mjs.map +1 -0
- package/batteries/vector/meilisearch/index.d.ts +36 -0
- package/batteries/vector/meilisearch.cjs +242 -0
- package/batteries/vector/meilisearch.cjs.map +1 -0
- package/batteries/vector/meilisearch.mjs +240 -0
- package/batteries/vector/meilisearch.mjs.map +1 -0
- package/batteries/vector/migrate.cjs +54 -0
- package/batteries/vector/migrate.cjs.map +1 -0
- package/batteries/vector/migrate.d.ts +30 -0
- package/batteries/vector/migrate.mjs +52 -0
- package/batteries/vector/migrate.mjs.map +1 -0
- package/batteries/vector/milvus/index.d.ts +35 -0
- package/batteries/vector/milvus.cjs +357 -0
- package/batteries/vector/milvus.cjs.map +1 -0
- package/batteries/vector/milvus.mjs +354 -0
- package/batteries/vector/milvus.mjs.map +1 -0
- package/batteries/vector/mongodb/index.d.ts +46 -0
- package/batteries/vector/mongodb.cjs +270 -0
- package/batteries/vector/mongodb.cjs.map +1 -0
- package/batteries/vector/mongodb.mjs +268 -0
- package/batteries/vector/mongodb.mjs.map +1 -0
- package/batteries/vector/neo4j/index.d.ts +38 -0
- package/batteries/vector/neo4j.cjs +231 -0
- package/batteries/vector/neo4j.cjs.map +1 -0
- package/batteries/vector/neo4j.mjs +229 -0
- package/batteries/vector/neo4j.mjs.map +1 -0
- package/batteries/vector/opensearch/index.d.ts +46 -0
- package/batteries/vector/opensearch.cjs +316 -0
- package/batteries/vector/opensearch.cjs.map +1 -0
- package/batteries/vector/opensearch.mjs +313 -0
- package/batteries/vector/opensearch.mjs.map +1 -0
- package/batteries/vector/oracle23ai/index.d.ts +45 -0
- package/batteries/vector/oracle23ai.cjs +340 -0
- package/batteries/vector/oracle23ai.cjs.map +1 -0
- package/batteries/vector/oracle23ai.mjs +338 -0
- package/batteries/vector/oracle23ai.mjs.map +1 -0
- package/batteries/vector/orama/index.d.ts +23 -0
- package/batteries/vector/orama.cjs +272 -0
- package/batteries/vector/orama.cjs.map +1 -0
- package/batteries/vector/orama.mjs +270 -0
- package/batteries/vector/orama.mjs.map +1 -0
- package/batteries/vector/pgvector/index.d.ts +43 -0
- package/batteries/vector/pgvector.cjs +411 -0
- package/batteries/vector/pgvector.cjs.map +1 -0
- package/batteries/vector/pgvector.mjs +408 -0
- package/batteries/vector/pgvector.mjs.map +1 -0
- package/batteries/vector/pinecone/index.d.ts +38 -0
- package/batteries/vector/pinecone.cjs +415 -0
- package/batteries/vector/pinecone.cjs.map +1 -0
- package/batteries/vector/pinecone.mjs +412 -0
- package/batteries/vector/pinecone.mjs.map +1 -0
- package/batteries/vector/plan.cjs +2 -0
- package/batteries/vector/plan.d.ts +65 -0
- package/batteries/vector/plan.mjs +0 -0
- package/batteries/vector/qdrant/index.d.ts +34 -0
- package/batteries/vector/qdrant.cjs +286 -0
- package/batteries/vector/qdrant.cjs.map +1 -0
- package/batteries/vector/qdrant.mjs +284 -0
- package/batteries/vector/qdrant.mjs.map +1 -0
- package/batteries/vector/redis/index.d.ts +44 -0
- package/batteries/vector/redis.cjs +391 -0
- package/batteries/vector/redis.cjs.map +1 -0
- package/batteries/vector/redis.mjs +388 -0
- package/batteries/vector/redis.mjs.map +1 -0
- package/batteries/vector/retrievable.cjs +69 -0
- package/batteries/vector/retrievable.cjs.map +1 -0
- package/batteries/vector/retrievable.mjs +67 -0
- package/batteries/vector/retrievable.mjs.map +1 -0
- package/batteries/vector/retrievable_glue.d.ts +24 -0
- package/batteries/vector/s3vectors/index.d.ts +52 -0
- package/batteries/vector/s3vectors.cjs +438 -0
- package/batteries/vector/s3vectors.cjs.map +1 -0
- package/batteries/vector/s3vectors.mjs +436 -0
- package/batteries/vector/s3vectors.mjs.map +1 -0
- package/batteries/vector/schema.cjs +96 -0
- package/batteries/vector/schema.cjs.map +1 -0
- package/batteries/vector/schema.d.ts +40 -0
- package/batteries/vector/schema.mjs +93 -0
- package/batteries/vector/schema.mjs.map +1 -0
- package/batteries/vector/solr/index.d.ts +36 -0
- package/batteries/vector/solr.cjs +230 -0
- package/batteries/vector/solr.cjs.map +1 -0
- package/batteries/vector/solr.mjs +228 -0
- package/batteries/vector/solr.mjs.map +1 -0
- package/batteries/vector/sqlite_vec/index.d.ts +30 -0
- package/batteries/vector/sqlite_vec.cjs +318 -0
- package/batteries/vector/sqlite_vec.cjs.map +1 -0
- package/batteries/vector/sqlite_vec.mjs +316 -0
- package/batteries/vector/sqlite_vec.mjs.map +1 -0
- package/batteries/vector/surrealdb/index.d.ts +37 -0
- package/batteries/vector/surrealdb.cjs +230 -0
- package/batteries/vector/surrealdb.cjs.map +1 -0
- package/batteries/vector/surrealdb.mjs +228 -0
- package/batteries/vector/surrealdb.mjs.map +1 -0
- package/batteries/vector/types.cjs +2 -0
- package/batteries/vector/types.d.ts +100 -0
- package/batteries/vector/types.mjs +0 -0
- package/batteries/vector/typesense/index.d.ts +38 -0
- package/batteries/vector/typesense.cjs +272 -0
- package/batteries/vector/typesense.cjs.map +1 -0
- package/batteries/vector/typesense.mjs +270 -0
- package/batteries/vector/typesense.mjs.map +1 -0
- package/batteries/vector/validation.cjs +90 -0
- package/batteries/vector/validation.cjs.map +1 -0
- package/batteries/vector/validation.d.ts +18 -0
- package/batteries/vector/validation.mjs +83 -0
- package/batteries/vector/validation.mjs.map +1 -0
- package/batteries/vector/vector_store_constructor.cjs +56 -0
- package/batteries/vector/vector_store_constructor.cjs.map +1 -0
- package/batteries/vector/vector_store_constructor.d.ts +30 -0
- package/batteries/vector/vector_store_constructor.mjs +53 -0
- package/batteries/vector/vector_store_constructor.mjs.map +1 -0
- package/batteries/vector/vespa/index.d.ts +39 -0
- package/batteries/vector/vespa.cjs +423 -0
- package/batteries/vector/vespa.cjs.map +1 -0
- package/batteries/vector/vespa.mjs +421 -0
- package/batteries/vector/vespa.mjs.map +1 -0
- package/batteries/vector/weaviate/index.d.ts +57 -0
- package/batteries/vector/weaviate.cjs +325 -0
- package/batteries/vector/weaviate.cjs.map +1 -0
- package/batteries/vector/weaviate.mjs +322 -0
- package/batteries/vector/weaviate.mjs.map +1 -0
- package/batteries/vector.cjs +63 -0
- package/batteries/vector.mjs +14 -0
- package/batteries.cjs +62 -0
- package/batteries.mjs +15 -1
- package/{chunk-kRvK8_k2.mjs → chunk-Bpcn9VDT.mjs} +5 -1
- package/{common-lMrnzoyn.mjs → common-BT0nfCi9.mjs} +8 -8
- package/{common-lMrnzoyn.mjs.map → common-BT0nfCi9.mjs.map} +1 -1
- package/{common-D_e5zYsG.js → common-Cj8TaQ9U.js} +8 -8
- package/{common-D_e5zYsG.js.map → common-Cj8TaQ9U.js.map} +1 -1
- package/common.cjs +7 -7
- package/common.mjs +7 -7
- package/{dispatch_runner-CpuyATj1.js → dispatch_runner-BHBNupqp.js} +2 -2
- package/dispatch_runner-BHBNupqp.js.map +1 -0
- package/{dispatch_runner-CDF3X0nv.mjs → dispatch_runner-DPcS7Y_M.mjs} +2 -2
- package/dispatch_runner-DPcS7Y_M.mjs.map +1 -0
- package/dispatch_runner.cjs +1 -1
- package/dispatch_runner.mjs +1 -1
- package/forge.cjs +4 -4
- package/forge.mjs +4 -4
- package/guards.cjs +8 -8
- package/guards.mjs +8 -8
- package/index.cjs +12 -12
- package/index.mjs +12 -12
- package/lib/classes/tool_registry.d.ts +70 -4
- package/mcp/adk-docs-corpus.json +1 -1
- package/package.json +424 -88
- package/skills/adk-assembly/SKILL.md +2 -2
- package/{spooled_artifact-B8gIIn9h.js → spooled_artifact-BTq6Nzfy.js} +4 -4
- package/spooled_artifact-BTq6Nzfy.js.map +1 -0
- package/{spooled_artifact-CWoKUDEm.mjs → spooled_artifact-CHoZgWwI.mjs} +4 -4
- package/spooled_artifact-CHoZgWwI.mjs.map +1 -0
- package/spooled_artifact.cjs +2 -2
- package/spooled_artifact.mjs +2 -2
- package/{spooled_markdown_artifact-DQX0RCdI.js → spooled_markdown_artifact-CALSDxIx.js} +3 -3
- package/{spooled_markdown_artifact-DQX0RCdI.js.map → spooled_markdown_artifact-CALSDxIx.js.map} +1 -1
- package/{spooled_markdown_artifact-CNle4jXN.mjs → spooled_markdown_artifact-Ci5UL7l4.mjs} +3 -3
- package/{spooled_markdown_artifact-CNle4jXN.mjs.map → spooled_markdown_artifact-Ci5UL7l4.mjs.map} +1 -1
- package/src/types/evaluatex.d.ts +31 -0
- package/{thought-BD6AkkOr.js → thought-BbwhJ1wb.js} +4 -4
- package/thought-BbwhJ1wb.js.map +1 -0
- package/{thought-B_P8LiB6.mjs → thought-D34QQZZ9.mjs} +4 -4
- package/thought-D34QQZZ9.mjs.map +1 -0
- package/{tool-CRZSUcdP.mjs → tool-CMhaDRNd.mjs} +3 -3
- package/tool-CMhaDRNd.mjs.map +1 -0
- package/{tool-CX9vNHAw.js → tool-CVyZkFC7.js} +3 -3
- package/tool-CVyZkFC7.js.map +1 -0
- package/{tool_call-BUeMuCc6.mjs → tool_call-CV5qVNlb.mjs} +3 -3
- package/{tool_call-BUeMuCc6.mjs.map → tool_call-CV5qVNlb.mjs.map} +1 -1
- package/{tool_call--7ti-frB.js → tool_call-Db68hB7y.js} +3 -3
- package/{tool_call--7ti-frB.js.map → tool_call-Db68hB7y.js.map} +1 -1
- package/{tool_registry-BGHg6KTq.mjs → tool_registry-D1pSSlsd.mjs} +109 -22
- package/tool_registry-D1pSSlsd.mjs.map +1 -0
- package/{tool_registry-CtCQ4Xoz.js → tool_registry-DYUYqXvo.js} +109 -22
- package/tool_registry-DYUYqXvo.js.map +1 -0
- package/{turn_runner-BJTtAORU.js → turn_runner-DqWHNP80.js} +5 -5
- package/turn_runner-DqWHNP80.js.map +1 -0
- package/{turn_runner-C02LZHjt.mjs → turn_runner-fg1Wc3dK.mjs} +5 -5
- package/turn_runner-fg1Wc3dK.mjs.map +1 -0
- package/turn_runner.cjs +1 -1
- package/turn_runner.mjs +1 -1
- package/dispatch_runner-CDF3X0nv.mjs.map +0 -1
- package/dispatch_runner-CpuyATj1.js.map +0 -1
- package/spooled_artifact-B8gIIn9h.js.map +0 -1
- package/spooled_artifact-CWoKUDEm.mjs.map +0 -1
- package/thought-BD6AkkOr.js.map +0 -1
- package/thought-B_P8LiB6.mjs.map +0 -1
- package/tool-CRZSUcdP.mjs.map +0 -1
- package/tool-CX9vNHAw.js.map +0 -1
- package/tool_registry-BGHg6KTq.mjs.map +0 -1
- package/tool_registry-CtCQ4Xoz.js.map +0 -1
- package/turn_runner-BJTtAORU.js.map +0 -1
- package/turn_runner-C02LZHjt.mjs.map +0 -1
|
@@ -0,0 +1,222 @@
|
|
|
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/lancedb/index.ts
|
|
9
|
+
/**
|
|
10
|
+
* @module @nhtio/adk/batteries/vector/lancedb
|
|
11
|
+
*
|
|
12
|
+
* Embedded LanceDB adapter (no server — file-based, like sqlite_vec/duckdb). Each collection
|
|
13
|
+
* is a Lance table with an explicit Arrow schema (`id` Utf8, `vec` FixedSizeList<Float32>,
|
|
14
|
+
* `document` Utf8, `metadata` Utf8-JSON). KNN uses `table.search(vector).distanceType(...)`;
|
|
15
|
+
* metadata is filtered with the neutral filter tree's JS reference evaluator for exact
|
|
16
|
+
* cross-adapter parity. Upsert is a merge-insert on `id`.
|
|
17
|
+
*
|
|
18
|
+
* Drivers: `@lancedb/lancedb` + `apache-arrow` (prebuilt binary; no native compile).
|
|
19
|
+
*/
|
|
20
|
+
var getLanceDB = async () => {
|
|
21
|
+
try {
|
|
22
|
+
return await import("@lancedb/lancedb");
|
|
23
|
+
} catch {
|
|
24
|
+
throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(["@lancedb/lancedb"]);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
var getArrow = async () => {
|
|
28
|
+
try {
|
|
29
|
+
return await import("apache-arrow");
|
|
30
|
+
} catch {
|
|
31
|
+
throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(["apache-arrow"]);
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
var lanceMetric = (metric) => metric === "euclidean" ? "l2" : metric === "dot" ? "dot" : "cosine";
|
|
35
|
+
var lit = (value) => `'${value.replace(/'/g, "''")}'`;
|
|
36
|
+
var LanceDBVectorStore = class extends BaseVectorStore {
|
|
37
|
+
capabilities = {
|
|
38
|
+
transactions: false,
|
|
39
|
+
namedVectors: false,
|
|
40
|
+
rename: true,
|
|
41
|
+
rawSql: false,
|
|
42
|
+
builtInEncoding: false,
|
|
43
|
+
consistency: {
|
|
44
|
+
configurable: false,
|
|
45
|
+
default: "strong",
|
|
46
|
+
modes: ["strong"]
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
#db = null;
|
|
50
|
+
#dims = /* @__PURE__ */ new Map();
|
|
51
|
+
get #opts() {
|
|
52
|
+
return this.options;
|
|
53
|
+
}
|
|
54
|
+
static isAvailable() {
|
|
55
|
+
return typeof process !== "undefined";
|
|
56
|
+
}
|
|
57
|
+
isAvailable() {
|
|
58
|
+
return typeof process !== "undefined";
|
|
59
|
+
}
|
|
60
|
+
async connect() {
|
|
61
|
+
if (this.#db) return;
|
|
62
|
+
const lancedb = await getLanceDB();
|
|
63
|
+
const uri = this.#opts.connection?.uri;
|
|
64
|
+
if (!uri) throw new E_VECTOR_STORE_CONNECTION_FAILED(["LanceDB requires connection.uri (a directory path)"]);
|
|
65
|
+
try {
|
|
66
|
+
this.#db = await lancedb.connect(uri);
|
|
67
|
+
} catch (err) {
|
|
68
|
+
throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)]);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
async close() {
|
|
72
|
+
this.#db = null;
|
|
73
|
+
}
|
|
74
|
+
async #ensure() {
|
|
75
|
+
if (!this.#db) await this.connect();
|
|
76
|
+
return this.#db;
|
|
77
|
+
}
|
|
78
|
+
async createCollection(spec, ifNotExists) {
|
|
79
|
+
const db = await this.#ensure();
|
|
80
|
+
this.#dims.set(spec.collection, spec.vector.dimensions);
|
|
81
|
+
if (ifNotExists && await this.hasCollection(spec.collection)) return;
|
|
82
|
+
const arrow = await getArrow();
|
|
83
|
+
const schema = new arrow.Schema([
|
|
84
|
+
new arrow.Field("id", new arrow.Utf8(), false),
|
|
85
|
+
new arrow.Field("vec", new arrow.FixedSizeList(spec.vector.dimensions, new arrow.Field("item", new arrow.Float32(), true)), false),
|
|
86
|
+
new arrow.Field("document", new arrow.Utf8(), true),
|
|
87
|
+
new arrow.Field("metadata", new arrow.Utf8(), true)
|
|
88
|
+
]);
|
|
89
|
+
try {
|
|
90
|
+
await db.createEmptyTable(spec.collection, schema, { mode: "overwrite" });
|
|
91
|
+
} catch (err) {
|
|
92
|
+
throw new E_VECTOR_STORE_COLLECTION_FAILED(["createCollection", String(err)]);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
async dropCollection(collection, ifExists) {
|
|
96
|
+
const db = await this.#ensure();
|
|
97
|
+
if (ifExists && !await this.hasCollection(collection)) return;
|
|
98
|
+
try {
|
|
99
|
+
await db.dropTable(collection);
|
|
100
|
+
this.#dims.delete(collection);
|
|
101
|
+
} catch (err) {
|
|
102
|
+
const msg = String(err);
|
|
103
|
+
if (ifExists && msg.includes("not found")) return;
|
|
104
|
+
throw new E_VECTOR_STORE_COLLECTION_FAILED(["dropCollection", msg]);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
async hasCollection(collection) {
|
|
108
|
+
const db = await this.#ensure();
|
|
109
|
+
try {
|
|
110
|
+
return (await db.tableNames()).includes(collection);
|
|
111
|
+
} catch {
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
async renameCollection(_from, _to) {
|
|
116
|
+
throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(["renameCollection", "lancedb"]);
|
|
117
|
+
}
|
|
118
|
+
async executeUpsert(plan) {
|
|
119
|
+
if (plan.records.length === 0) return;
|
|
120
|
+
validateRecords(plan.records);
|
|
121
|
+
const db = await this.#ensure();
|
|
122
|
+
const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection);
|
|
123
|
+
try {
|
|
124
|
+
const rows = [];
|
|
125
|
+
for (const r of plan.records) {
|
|
126
|
+
let vector = r.vector;
|
|
127
|
+
if (!vector && r.document) {
|
|
128
|
+
const [v] = await this.encode([r.document], "document");
|
|
129
|
+
vector = v;
|
|
130
|
+
}
|
|
131
|
+
if (!vector) throw new E_VECTOR_STORE_UPSERT_FAILED(["Record missing vector and document"]);
|
|
132
|
+
if (expected !== void 0 && vector.length !== expected) throw new E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length]);
|
|
133
|
+
rows.push({
|
|
134
|
+
id: r.id,
|
|
135
|
+
vec: vector,
|
|
136
|
+
document: r.document ?? "",
|
|
137
|
+
metadata: r.metadata ? JSON.stringify(r.metadata) : "{}"
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
await (await db.openTable(plan.collection)).mergeInsert("id").whenMatchedUpdateAll().whenNotMatchedInsertAll().execute(rows);
|
|
141
|
+
} catch (err) {
|
|
142
|
+
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;
|
|
143
|
+
throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)]);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
async executeSearch(plan) {
|
|
147
|
+
const db = await this.#ensure();
|
|
148
|
+
const metric = this.#opts.metric ?? "cosine";
|
|
149
|
+
let queryVector;
|
|
150
|
+
let tbl;
|
|
151
|
+
try {
|
|
152
|
+
tbl = await db.openTable(plan.collection);
|
|
153
|
+
} catch (err) {
|
|
154
|
+
throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)]);
|
|
155
|
+
}
|
|
156
|
+
if (plan.near) {
|
|
157
|
+
if ("vector" in plan.near) queryVector = plan.near.vector;
|
|
158
|
+
else if ("serverText" in plan.near) {
|
|
159
|
+
const [v] = await this.encode([plan.near.serverText], "query");
|
|
160
|
+
queryVector = v;
|
|
161
|
+
} else if ("id" in plan.near) {
|
|
162
|
+
const rows = await tbl.query().where(`id = ${lit(plan.near.id)}`).limit(1).toArray();
|
|
163
|
+
if (rows.length === 0) throw new E_VECTOR_STORE_SEARCH_FAILED(["Referenced id not found: " + plan.near.id]);
|
|
164
|
+
queryVector = Array.from(rows[0].vec);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
const offset = plan.offset ?? 0;
|
|
168
|
+
try {
|
|
169
|
+
if (queryVector) {
|
|
170
|
+
const k = plan.filter ? 1e3 : plan.topK + offset;
|
|
171
|
+
const rows = await tbl.search(queryVector).distanceType(lanceMetric(metric)).limit(k).toArray();
|
|
172
|
+
return (plan.filter ? rows.filter((row) => evaluateFilter(plan.filter, this.#parseMeta(row.metadata))) : rows).slice(offset, offset + plan.topK).map((row) => this.#project(row, plan, metric, true));
|
|
173
|
+
} else {
|
|
174
|
+
const rows = await tbl.query().limit(plan.filter ? 1e5 : plan.topK + offset).toArray();
|
|
175
|
+
return (plan.filter ? rows.filter((row) => evaluateFilter(plan.filter, this.#parseMeta(row.metadata))) : rows).slice(offset, offset + plan.topK).map((row) => this.#project(row, plan, metric, false));
|
|
176
|
+
}
|
|
177
|
+
} catch (err) {
|
|
178
|
+
throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)]);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
#parseMeta(val) {
|
|
182
|
+
if (typeof val === "string") try {
|
|
183
|
+
return JSON.parse(val);
|
|
184
|
+
} catch {
|
|
185
|
+
return {};
|
|
186
|
+
}
|
|
187
|
+
if (val && typeof val === "object") return val;
|
|
188
|
+
return {};
|
|
189
|
+
}
|
|
190
|
+
#project(row, plan, metric, isKnn) {
|
|
191
|
+
const proj = plan.projection;
|
|
192
|
+
const out = {};
|
|
193
|
+
if (proj.id) out.id = row.id;
|
|
194
|
+
if (proj.vector && row.vec) out.vector = Array.from(row.vec);
|
|
195
|
+
if (proj.document) out.document = row.document ?? void 0;
|
|
196
|
+
if (proj.metadata) out.metadata = this.#parseMeta(row.metadata);
|
|
197
|
+
if (isKnn && row._distance !== void 0 && row._distance !== null) out.score = normalizeScore(Number(row._distance), metric, "distance");
|
|
198
|
+
return out;
|
|
199
|
+
}
|
|
200
|
+
async executeDelete(plan) {
|
|
201
|
+
const db = await this.#ensure();
|
|
202
|
+
try {
|
|
203
|
+
const tbl = await db.openTable(plan.collection);
|
|
204
|
+
if (plan.ids && plan.ids.length > 0) {
|
|
205
|
+
const list = plan.ids.map((id) => lit(id)).join(", ");
|
|
206
|
+
await tbl.delete(`id IN (${list})`);
|
|
207
|
+
} else if (plan.filter) {
|
|
208
|
+
const targets = (await tbl.query().limit(1e5).toArray()).filter((row) => evaluateFilter(plan.filter, this.#parseMeta(row.metadata))).map((row) => row.id);
|
|
209
|
+
if (targets.length > 0) {
|
|
210
|
+
const list = targets.map((id) => lit(id)).join(", ");
|
|
211
|
+
await tbl.delete(`id IN (${list})`);
|
|
212
|
+
}
|
|
213
|
+
} else await tbl.delete("true");
|
|
214
|
+
} catch (err) {
|
|
215
|
+
throw new E_VECTOR_STORE_DELETE_FAILED([String(err)]);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
};
|
|
219
|
+
//#endregion
|
|
220
|
+
export { LanceDBVectorStore };
|
|
221
|
+
|
|
222
|
+
//# sourceMappingURL=lancedb.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lancedb.mjs","names":["#opts","#db","#ensure","#dims","#parseMeta","#project"],"sources":["../../../src/batteries/vector/lancedb/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/lancedb\n *\n * Embedded LanceDB adapter (no server — file-based, like sqlite_vec/duckdb). Each collection\n * is a Lance table with an explicit Arrow schema (`id` Utf8, `vec` FixedSizeList<Float32>,\n * `document` Utf8, `metadata` Utf8-JSON). KNN uses `table.search(vector).distanceType(...)`;\n * metadata is filtered with the neutral filter tree's JS reference evaluator for exact\n * cross-adapter parity. Upsert is a merge-insert on `id`.\n *\n * Drivers: `@lancedb/lancedb` + `apache-arrow` (prebuilt binary; no native compile).\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\nexport interface LanceDBVectorStoreOptions extends BaseVectorStoreOptions {\n connection: { uri: string }\n}\n\nconst getLanceDB = async () => {\n try {\n return await import('@lancedb/lancedb')\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['@lancedb/lancedb'])\n }\n}\n\nconst getArrow = async () => {\n try {\n return await import('apache-arrow')\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['apache-arrow'])\n }\n}\n\nconst lanceMetric = (metric: DistanceMetric): string =>\n metric === 'euclidean' ? 'l2' : metric === 'dot' ? 'dot' : 'cosine'\n\n// LanceDB SQL string literal (single-quoted, escape embedded quotes).\nconst lit = (value: string): string => `'${value.replace(/'/g, \"''\")}'`\n\nexport class LanceDBVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: true,\n rawSql: false,\n builtInEncoding: false,\n // Embedded and synchronous: a write is visible on resolve. The option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n\n #db: any | null = null\n #dims: Map<string, number> = new Map()\n\n get #opts(): LanceDBVectorStoreOptions {\n return this.options as LanceDBVectorStoreOptions\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.#db) return\n const lancedb = await getLanceDB()\n const uri = this.#opts.connection?.uri\n if (!uri) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([\n 'LanceDB requires connection.uri (a directory path)',\n ])\n }\n try {\n this.#db = await lancedb.connect(uri)\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n\n async close(): Promise<void> {\n this.#db = null\n }\n\n async #ensure(): Promise<any> {\n if (!this.#db) await this.connect()\n return this.#db!\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n const db = await this.#ensure()\n this.#dims.set(spec.collection, spec.vector.dimensions)\n if (ifNotExists && (await this.hasCollection(spec.collection))) return\n const arrow = await getArrow()\n const schema = new arrow.Schema([\n new arrow.Field('id', new arrow.Utf8(), false),\n new arrow.Field(\n 'vec',\n new arrow.FixedSizeList(\n spec.vector.dimensions,\n new arrow.Field('item', new arrow.Float32(), true)\n ),\n false\n ),\n new arrow.Field('document', new arrow.Utf8(), true),\n new arrow.Field('metadata', new arrow.Utf8(), true),\n ])\n try {\n await db.createEmptyTable(spec.collection, schema, { mode: 'overwrite' })\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 db = await this.#ensure()\n if (ifExists && !(await this.hasCollection(collection))) return\n try {\n await db.dropTable(collection)\n this.#dims.delete(collection)\n } catch (err) {\n const msg = String(err)\n if (ifExists && msg.includes('not found')) return\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', msg])\n }\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n const db = await this.#ensure()\n try {\n const names = await db.tableNames()\n return names.includes(collection)\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', 'lancedb'])\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const db = await this.#ensure()\n const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection)\n try {\n const rows: 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 rows.push({\n id: r.id,\n vec: vector,\n document: r.document ?? '',\n metadata: r.metadata ? JSON.stringify(r.metadata) : '{}',\n })\n }\n const tbl = await db.openTable(plan.collection)\n // Merge-insert on id = upsert (update matched, insert unmatched).\n await tbl.mergeInsert('id').whenMatchedUpdateAll().whenNotMatchedInsertAll().execute(rows)\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 db = await this.#ensure()\n const metric = this.#opts.metric ?? 'cosine'\n let queryVector: number[] | undefined\n let tbl: any\n try {\n tbl = await db.openTable(plan.collection)\n } catch (err) {\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\n\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 tbl\n .query()\n .where(`id = ${lit(plan.near.id)}`)\n .limit(1)\n .toArray()\n if (rows.length === 0) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = Array.from(rows[0].vec as ArrayLike<number>)\n }\n }\n\n const offset = plan.offset ?? 0\n try {\n if (queryVector) {\n // Over-fetch then JS-filter for exact cross-adapter filter semantics.\n const k = plan.filter ? 1000 : plan.topK + offset\n const rows = await tbl\n .search(queryVector)\n .distanceType(lanceMetric(metric))\n .limit(k)\n .toArray()\n const filtered = plan.filter\n ? rows.filter((row: any) => evaluateFilter(plan.filter!, this.#parseMeta(row.metadata)))\n : rows\n return filtered\n .slice(offset, offset + plan.topK)\n .map((row: any) => this.#project(row, plan, metric, true))\n } else {\n const rows = await tbl\n .query()\n .limit(plan.filter ? 100000 : plan.topK + offset)\n .toArray()\n const filtered = plan.filter\n ? rows.filter((row: any) => evaluateFilter(plan.filter!, this.#parseMeta(row.metadata)))\n : rows\n return filtered\n .slice(offset, offset + plan.topK)\n .map((row: any) => this.#project(row, plan, metric, false))\n }\n } catch (err) {\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\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 #project(row: any, plan: SearchPlan, metric: string, isKnn: boolean): VectorMatch {\n const proj = plan.projection\n const out: VectorMatch = {}\n if (proj.id) out.id = row.id as string\n if (proj.vector && row.vec) out.vector = Array.from(row.vec as ArrayLike<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 (isKnn && row._distance !== undefined && row._distance !== null) {\n out.score = normalizeScore(Number(row._distance), metric as DistanceMetric, 'distance')\n }\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const db = await this.#ensure()\n try {\n const tbl = await db.openTable(plan.collection)\n if (plan.ids && plan.ids.length > 0) {\n const list = plan.ids.map((id) => lit(id)).join(', ')\n await tbl.delete(`id IN (${list})`)\n } else if (plan.filter) {\n const rows = await tbl.query().limit(100000).toArray()\n const targets: string[] = rows\n .filter((row: any) => evaluateFilter(plan.filter!, this.#parseMeta(row.metadata)))\n .map((row: any) => row.id as string)\n if (targets.length > 0) {\n const list = targets.map((id) => lit(id)).join(', ')\n await tbl.delete(`id IN (${list})`)\n }\n } else {\n await tbl.delete('true')\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAwCA,IAAM,aAAa,YAAY;CAC7B,IAAI;EACF,OAAO,MAAM,OAAO;CACtB,QAAQ;EACN,MAAM,IAAI,kCAAkC,CAAC,kBAAkB,CAAC;CAClE;AACF;AAEA,IAAM,WAAW,YAAY;CAC3B,IAAI;EACF,OAAO,MAAM,OAAO;CACtB,QAAQ;EACN,MAAM,IAAI,kCAAkC,CAAC,cAAc,CAAC;CAC9D;AACF;AAEA,IAAM,eAAe,WACnB,WAAW,cAAc,OAAO,WAAW,QAAQ,QAAQ;AAG7D,IAAM,OAAO,UAA0B,IAAI,MAAM,QAAQ,MAAM,IAAI,EAAE;AAErE,IAAa,qBAAb,cAAwC,gBAAgB;CACtD,eAAiD;EAC/C,cAAc;EACd,cAAc;EACd,QAAQ;EACR,QAAQ;EACR,iBAAiB;EAEjB,aAAa;GAAE,cAAc;GAAO,SAAS;GAAU,OAAO,CAAC,QAAQ;EAAE;CAC3E;CAEA,MAAkB;CAClB,wBAA6B,IAAI,IAAI;CAErC,IAAIA,QAAmC;EACrC,OAAO,KAAK;CACd;CAEA,OAAO,cAAuB;EAC5B,OAAO,OAAO,YAAY;CAC5B;CACA,cAAuB;EACrB,OAAO,OAAO,YAAY;CAC5B;CAEA,MAAM,UAAyB;EAC7B,IAAI,KAAKC,KAAK;EACd,MAAM,UAAU,MAAM,WAAW;EACjC,MAAM,MAAM,KAAKD,MAAM,YAAY;EACnC,IAAI,CAAC,KACH,MAAM,IAAI,iCAAiC,CACzC,oDACF,CAAC;EAEH,IAAI;GACF,KAAKC,MAAM,MAAM,QAAQ,QAAQ,GAAG;EACtC,SAAS,KAAK;GACZ,MAAM,IAAI,iCAAiC,CAAC,OAAO,GAAG,CAAC,CAAC;EAC1D;CACF;CAEA,MAAM,QAAuB;EAC3B,KAAKA,MAAM;CACb;CAEA,MAAMC,UAAwB;EAC5B,IAAI,CAAC,KAAKD,KAAK,MAAM,KAAK,QAAQ;EAClC,OAAO,KAAKA;CACd;CAEA,MAAM,iBAAiB,MAAsB,aAAqC;EAChF,MAAM,KAAK,MAAM,KAAKC,QAAQ;EAC9B,KAAKC,MAAM,IAAI,KAAK,YAAY,KAAK,OAAO,UAAU;EACtD,IAAI,eAAgB,MAAM,KAAK,cAAc,KAAK,UAAU,GAAI;EAChE,MAAM,QAAQ,MAAM,SAAS;EAC7B,MAAM,SAAS,IAAI,MAAM,OAAO;GAC9B,IAAI,MAAM,MAAM,MAAM,IAAI,MAAM,KAAK,GAAG,KAAK;GAC7C,IAAI,MAAM,MACR,OACA,IAAI,MAAM,cACR,KAAK,OAAO,YACZ,IAAI,MAAM,MAAM,QAAQ,IAAI,MAAM,QAAQ,GAAG,IAAI,CACnD,GACA,KACF;GACA,IAAI,MAAM,MAAM,YAAY,IAAI,MAAM,KAAK,GAAG,IAAI;GAClD,IAAI,MAAM,MAAM,YAAY,IAAI,MAAM,KAAK,GAAG,IAAI;EACpD,CAAC;EACD,IAAI;GACF,MAAM,GAAG,iBAAiB,KAAK,YAAY,QAAQ,EAAE,MAAM,YAAY,CAAC;EAC1E,SAAS,KAAK;GACZ,MAAM,IAAI,iCAAiC,CAAC,oBAAoB,OAAO,GAAG,CAAC,CAAC;EAC9E;CACF;CAEA,MAAM,eAAe,YAAoB,UAAkC;EACzE,MAAM,KAAK,MAAM,KAAKD,QAAQ;EAC9B,IAAI,YAAY,CAAE,MAAM,KAAK,cAAc,UAAU,GAAI;EACzD,IAAI;GACF,MAAM,GAAG,UAAU,UAAU;GAC7B,KAAKC,MAAM,OAAO,UAAU;EAC9B,SAAS,KAAK;GACZ,MAAM,MAAM,OAAO,GAAG;GACtB,IAAI,YAAY,IAAI,SAAS,WAAW,GAAG;GAC3C,MAAM,IAAI,iCAAiC,CAAC,kBAAkB,GAAG,CAAC;EACpE;CACF;CAEA,MAAM,cAAc,YAAsC;EACxD,MAAM,KAAK,MAAM,KAAKD,QAAQ;EAC9B,IAAI;GAEF,QAAO,MADa,GAAG,WAAW,GACrB,SAAS,UAAU;EAClC,QAAQ;GACN,OAAO;EACT;CACF;CAEA,MAAM,iBAAiB,OAAe,KAA4B;EAChE,MAAM,IAAI,qCAAqC,CAAC,oBAAoB,SAAS,CAAC;CAChF;CAEA,MAAM,cAAc,MAAiC;EACnD,IAAI,KAAK,QAAQ,WAAW,GAAG;EAC/B,gBAAgB,KAAK,OAAO;EAC5B,MAAM,KAAK,MAAM,KAAKA,QAAQ;EAC9B,MAAM,WAAW,KAAKF,MAAM,cAAc,KAAKG,MAAM,IAAI,KAAK,UAAU;EACxE,IAAI;GACF,MAAM,OAAc,CAAC;GACrB,KAAK,MAAM,KAAK,KAAK,SAAS;IAC5B,IAAI,SAAS,EAAE;IACf,IAAI,CAAC,UAAU,EAAE,UAAU;KACzB,MAAM,CAAC,KAAK,MAAM,KAAK,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU;KACtD,SAAS;IACX;IACA,IAAI,CAAC,QACH,MAAM,IAAI,6BAA6B,CAAC,oCAAoC,CAAC;IAE/E,IAAI,aAAa,KAAA,KAAa,OAAO,WAAW,UAC9C,MAAM,IAAI,kCAAkC,CAAC,UAAU,OAAO,MAAM,CAAC;IAEvE,KAAK,KAAK;KACR,IAAI,EAAE;KACN,KAAK;KACL,UAAU,EAAE,YAAY;KACxB,UAAU,EAAE,WAAW,KAAK,UAAU,EAAE,QAAQ,IAAI;IACtD,CAAC;GACH;GAGA,OAAM,MAFY,GAAG,UAAU,KAAK,UAAU,GAEpC,YAAY,IAAI,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,QAAQ,IAAI;EAC3F,SAAS,KAAK;GACZ,IACE,aAAa,KAAK,qCAAqC,iCAAiC,KACxF,aAAa,KAAK,gCAAgC,4BAA4B,GAE9E,MAAM;GAER,MAAM,IAAI,6BAA6B,CAAC,OAAO,GAAG,CAAC,CAAC;EACtD;CACF;CAEA,MAAM,cAAc,MAA0C;EAC5D,MAAM,KAAK,MAAM,KAAKD,QAAQ;EAC9B,MAAM,SAAS,KAAKF,MAAM,UAAU;EACpC,IAAI;EACJ,IAAI;EACJ,IAAI;GACF,MAAM,MAAM,GAAG,UAAU,KAAK,UAAU;EAC1C,SAAS,KAAK;GACZ,MAAM,IAAI,6BAA6B,CAAC,OAAO,GAAG,CAAC,CAAC;EACtD;EAEA,IAAI,KAAK;OACH,YAAY,KAAK,MACnB,cAAc,KAAK,KAAK;QACnB,IAAI,gBAAgB,KAAK,MAAM;IACpC,MAAM,CAAC,KAAK,MAAM,KAAK,OAAO,CAAC,KAAK,KAAK,UAAU,GAAG,OAAO;IAC7D,cAAc;GAChB,OAAO,IAAI,QAAQ,KAAK,MAAM;IAC5B,MAAM,OAAO,MAAM,IAChB,MAAM,EACN,MAAM,QAAQ,IAAI,KAAK,KAAK,EAAE,GAAG,EACjC,MAAM,CAAC,EACP,QAAQ;IACX,IAAI,KAAK,WAAW,GAClB,MAAM,IAAI,6BAA6B,CAAC,8BAA8B,KAAK,KAAK,EAAE,CAAC;IAErF,cAAc,MAAM,KAAK,KAAK,GAAG,GAAwB;GAC3D;;EAGF,MAAM,SAAS,KAAK,UAAU;EAC9B,IAAI;GACF,IAAI,aAAa;IAEf,MAAM,IAAI,KAAK,SAAS,MAAO,KAAK,OAAO;IAC3C,MAAM,OAAO,MAAM,IAChB,OAAO,WAAW,EAClB,aAAa,YAAY,MAAM,CAAC,EAChC,MAAM,CAAC,EACP,QAAQ;IAIX,QAHiB,KAAK,SAClB,KAAK,QAAQ,QAAa,eAAe,KAAK,QAAS,KAAKI,WAAW,IAAI,QAAQ,CAAC,CAAC,IACrF,MAED,MAAM,QAAQ,SAAS,KAAK,IAAI,EAChC,KAAK,QAAa,KAAKC,SAAS,KAAK,MAAM,QAAQ,IAAI,CAAC;GAC7D,OAAO;IACL,MAAM,OAAO,MAAM,IAChB,MAAM,EACN,MAAM,KAAK,SAAS,MAAS,KAAK,OAAO,MAAM,EAC/C,QAAQ;IAIX,QAHiB,KAAK,SAClB,KAAK,QAAQ,QAAa,eAAe,KAAK,QAAS,KAAKD,WAAW,IAAI,QAAQ,CAAC,CAAC,IACrF,MAED,MAAM,QAAQ,SAAS,KAAK,IAAI,EAChC,KAAK,QAAa,KAAKC,SAAS,KAAK,MAAM,QAAQ,KAAK,CAAC;GAC9D;EACF,SAAS,KAAK;GACZ,MAAM,IAAI,6BAA6B,CAAC,OAAO,GAAG,CAAC,CAAC;EACtD;CACF;CAEA,WAAW,KAA8B;EACvC,IAAI,OAAO,QAAQ,UACjB,IAAI;GACF,OAAO,KAAK,MAAM,GAAG;EACvB,QAAQ;GACN,OAAO,CAAC;EACV;EAEF,IAAI,OAAO,OAAO,QAAQ,UAAU,OAAO;EAC3C,OAAO,CAAC;CACV;CAEA,SAAS,KAAU,MAAkB,QAAgB,OAA6B;EAChF,MAAM,OAAO,KAAK;EAClB,MAAM,MAAmB,CAAC;EAC1B,IAAI,KAAK,IAAI,IAAI,KAAK,IAAI;EAC1B,IAAI,KAAK,UAAU,IAAI,KAAK,IAAI,SAAS,MAAM,KAAK,IAAI,GAAwB;EAChF,IAAI,KAAK,UAAU,IAAI,WAAY,IAAI,YAAY,KAAA;EACnD,IAAI,KAAK,UAAU,IAAI,WAAW,KAAKD,WAAW,IAAI,QAAQ;EAC9D,IAAI,SAAS,IAAI,cAAc,KAAA,KAAa,IAAI,cAAc,MAC5D,IAAI,QAAQ,eAAe,OAAO,IAAI,SAAS,GAAG,QAA0B,UAAU;EAExF,OAAO;CACT;CAEA,MAAM,cAAc,MAAiC;EACnD,MAAM,KAAK,MAAM,KAAKF,QAAQ;EAC9B,IAAI;GACF,MAAM,MAAM,MAAM,GAAG,UAAU,KAAK,UAAU;GAC9C,IAAI,KAAK,OAAO,KAAK,IAAI,SAAS,GAAG;IACnC,MAAM,OAAO,KAAK,IAAI,KAAK,OAAO,IAAI,EAAE,CAAC,EAAE,KAAK,IAAI;IACpD,MAAM,IAAI,OAAO,UAAU,KAAK,EAAE;GACpC,OAAO,IAAI,KAAK,QAAQ;IAEtB,MAAM,WAAoB,MADP,IAAI,MAAM,EAAE,MAAM,GAAM,EAAE,QAAQ,GAElD,QAAQ,QAAa,eAAe,KAAK,QAAS,KAAKE,WAAW,IAAI,QAAQ,CAAC,CAAC,EAChF,KAAK,QAAa,IAAI,EAAY;IACrC,IAAI,QAAQ,SAAS,GAAG;KACtB,MAAM,OAAO,QAAQ,KAAK,OAAO,IAAI,EAAE,CAAC,EAAE,KAAK,IAAI;KACnD,MAAM,IAAI,OAAO,UAAU,KAAK,EAAE;IACpC;GACF,OACE,MAAM,IAAI,OAAO,MAAM;EAE3B,SAAS,KAAK;GACZ,MAAM,IAAI,6BAA6B,CAAC,OAAO,GAAG,CAAC,CAAC;EACtD;CACF;AACF"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module @nhtio/adk/batteries/vector/mariadb
|
|
3
|
+
*
|
|
4
|
+
* MariaDB adapter (native VECTOR type, 11.7+). Vectors live in a `VECTOR(N)` column written
|
|
5
|
+
* with `VEC_FromText('[...]')` and read with `VEC_ToText(vec)`; KNN uses
|
|
6
|
+
* `VEC_DISTANCE_COSINE` / `VEC_DISTANCE_EUCLIDEAN` ordered ascending. Metadata is a `JSON`
|
|
7
|
+
* column. The neutral filter tree is evaluated with the JS reference evaluator for exact
|
|
8
|
+
* cross-adapter parity. Each collection is a table.
|
|
9
|
+
*
|
|
10
|
+
* Driver: `mariadb` (pure JS, pooled).
|
|
11
|
+
*/
|
|
12
|
+
import { BaseVectorStore } from "../contract";
|
|
13
|
+
import type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from "../plan";
|
|
14
|
+
import type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from "../types";
|
|
15
|
+
export interface MariaDBVectorStoreOptions extends BaseVectorStoreOptions {
|
|
16
|
+
connection?: {
|
|
17
|
+
host?: string;
|
|
18
|
+
port?: number;
|
|
19
|
+
user?: string;
|
|
20
|
+
password?: string;
|
|
21
|
+
database?: string;
|
|
22
|
+
connectionLimit?: number;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export declare class MariaDBVectorStore extends BaseVectorStore {
|
|
26
|
+
#private;
|
|
27
|
+
readonly capabilities: VectorStoreCapabilities;
|
|
28
|
+
static isAvailable(): boolean;
|
|
29
|
+
isAvailable(): boolean;
|
|
30
|
+
connect(): Promise<void>;
|
|
31
|
+
close(): Promise<void>;
|
|
32
|
+
createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void>;
|
|
33
|
+
dropCollection(collection: string, ifExists: boolean): Promise<void>;
|
|
34
|
+
hasCollection(collection: string): Promise<boolean>;
|
|
35
|
+
renameCollection(from: string, to: string): Promise<void>;
|
|
36
|
+
executeUpsert(plan: UpsertPlan): Promise<void>;
|
|
37
|
+
executeSearch(plan: SearchPlan): Promise<VectorMatch[]>;
|
|
38
|
+
executeDelete(plan: DeletePlan): Promise<void>;
|
|
39
|
+
}
|
|
@@ -0,0 +1,228 @@
|
|
|
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/mariadb/index.ts
|
|
11
|
+
/**
|
|
12
|
+
* @module @nhtio/adk/batteries/vector/mariadb
|
|
13
|
+
*
|
|
14
|
+
* MariaDB adapter (native VECTOR type, 11.7+). Vectors live in a `VECTOR(N)` column written
|
|
15
|
+
* with `VEC_FromText('[...]')` and read with `VEC_ToText(vec)`; KNN uses
|
|
16
|
+
* `VEC_DISTANCE_COSINE` / `VEC_DISTANCE_EUCLIDEAN` ordered ascending. Metadata is a `JSON`
|
|
17
|
+
* column. The neutral filter tree is evaluated with the JS reference evaluator for exact
|
|
18
|
+
* cross-adapter parity. Each collection is a table.
|
|
19
|
+
*
|
|
20
|
+
* Driver: `mariadb` (pure JS, pooled).
|
|
21
|
+
*/
|
|
22
|
+
var getMariaDB = async () => {
|
|
23
|
+
try {
|
|
24
|
+
const mod = await import("mariadb");
|
|
25
|
+
return mod.default ?? mod;
|
|
26
|
+
} catch {
|
|
27
|
+
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_DRIVER_UNAVAILABLE(["mariadb"]);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
var distanceFn = (metric) => metric === "euclidean" ? "VEC_DISTANCE_EUCLIDEAN" : "VEC_DISTANCE_COSINE";
|
|
31
|
+
var ident = (name) => "`" + name.replace(/`/g, "``") + "`";
|
|
32
|
+
var MariaDBVectorStore = class extends require_batteries_vector_contract.BaseVectorStore {
|
|
33
|
+
capabilities = {
|
|
34
|
+
transactions: true,
|
|
35
|
+
namedVectors: false,
|
|
36
|
+
rename: true,
|
|
37
|
+
rawSql: true,
|
|
38
|
+
builtInEncoding: false,
|
|
39
|
+
consistency: {
|
|
40
|
+
configurable: false,
|
|
41
|
+
default: "strong",
|
|
42
|
+
modes: ["strong"]
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
#pool = null;
|
|
46
|
+
#dims = /* @__PURE__ */ new Map();
|
|
47
|
+
get #opts() {
|
|
48
|
+
return this.options;
|
|
49
|
+
}
|
|
50
|
+
static isAvailable() {
|
|
51
|
+
return typeof process !== "undefined";
|
|
52
|
+
}
|
|
53
|
+
isAvailable() {
|
|
54
|
+
return typeof process !== "undefined";
|
|
55
|
+
}
|
|
56
|
+
async connect() {
|
|
57
|
+
if (this.#pool) return;
|
|
58
|
+
const mariadb = await getMariaDB();
|
|
59
|
+
const c = this.#opts.connection || {};
|
|
60
|
+
try {
|
|
61
|
+
this.#pool = mariadb.createPool({
|
|
62
|
+
host: c.host ?? "localhost",
|
|
63
|
+
port: c.port ?? 3306,
|
|
64
|
+
user: c.user ?? "root",
|
|
65
|
+
password: c.password,
|
|
66
|
+
database: c.database,
|
|
67
|
+
connectionLimit: c.connectionLimit ?? 4
|
|
68
|
+
});
|
|
69
|
+
} catch (err) {
|
|
70
|
+
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_CONNECTION_FAILED([String(err)]);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
async close() {
|
|
74
|
+
if (this.#pool) {
|
|
75
|
+
await this.#pool.end();
|
|
76
|
+
this.#pool = null;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async #ensure() {
|
|
80
|
+
if (!this.#pool) await this.connect();
|
|
81
|
+
return this.#pool;
|
|
82
|
+
}
|
|
83
|
+
async #query(sql, params) {
|
|
84
|
+
return await (await this.#ensure()).query(sql, params);
|
|
85
|
+
}
|
|
86
|
+
#parseVec(text) {
|
|
87
|
+
if (typeof text !== "string") return [];
|
|
88
|
+
try {
|
|
89
|
+
return JSON.parse(text);
|
|
90
|
+
} catch {
|
|
91
|
+
return [];
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
#parseMeta(val) {
|
|
95
|
+
if (val === null || val === void 0) return {};
|
|
96
|
+
if (typeof val === "string") try {
|
|
97
|
+
return JSON.parse(val);
|
|
98
|
+
} catch {
|
|
99
|
+
return {};
|
|
100
|
+
}
|
|
101
|
+
if (typeof val === "object") return val;
|
|
102
|
+
return {};
|
|
103
|
+
}
|
|
104
|
+
async createCollection(spec, ifNotExists) {
|
|
105
|
+
this.#dims.set(spec.collection, spec.vector.dimensions);
|
|
106
|
+
const ine = ifNotExists ? "IF NOT EXISTS " : "";
|
|
107
|
+
try {
|
|
108
|
+
await this.#query(`CREATE TABLE ${ine}${ident(spec.collection)} (id VARCHAR(255) PRIMARY KEY, vec VECTOR(${spec.vector.dimensions}) NOT NULL, document TEXT, metadata JSON, VECTOR INDEX (vec))`);
|
|
109
|
+
} catch (err) {
|
|
110
|
+
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_COLLECTION_FAILED(["createCollection", String(err)]);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
async dropCollection(collection, ifExists) {
|
|
114
|
+
const ie = ifExists ? "IF EXISTS " : "";
|
|
115
|
+
try {
|
|
116
|
+
await this.#query(`DROP TABLE ${ie}${ident(collection)}`);
|
|
117
|
+
this.#dims.delete(collection);
|
|
118
|
+
} catch (err) {
|
|
119
|
+
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_COLLECTION_FAILED(["dropCollection", String(err)]);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
async hasCollection(collection) {
|
|
123
|
+
return (await this.#query(`SELECT 1 FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = ?`, [collection])).length > 0;
|
|
124
|
+
}
|
|
125
|
+
async renameCollection(from, to) {
|
|
126
|
+
try {
|
|
127
|
+
await this.#query(`RENAME TABLE ${ident(from)} TO ${ident(to)}`);
|
|
128
|
+
const d = this.#dims.get(from);
|
|
129
|
+
if (d !== void 0) {
|
|
130
|
+
this.#dims.set(to, d);
|
|
131
|
+
this.#dims.delete(from);
|
|
132
|
+
}
|
|
133
|
+
} catch (err) {
|
|
134
|
+
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_UNSUPPORTED_OPERATION(["renameCollection", String(err)]);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
async executeUpsert(plan) {
|
|
138
|
+
if (plan.records.length === 0) return;
|
|
139
|
+
require_batteries_vector_validation.validateRecords(plan.records);
|
|
140
|
+
const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection);
|
|
141
|
+
try {
|
|
142
|
+
for (const r of plan.records) {
|
|
143
|
+
let vector = r.vector;
|
|
144
|
+
if (!vector && r.document) {
|
|
145
|
+
const [v] = await this.encode([r.document], "document");
|
|
146
|
+
vector = v;
|
|
147
|
+
}
|
|
148
|
+
if (!vector) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_UPSERT_FAILED(["Record missing vector and document"]);
|
|
149
|
+
if (expected !== void 0 && vector.length !== expected) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length]);
|
|
150
|
+
const vecText = `[${vector.join(",")}]`;
|
|
151
|
+
const meta = r.metadata ? JSON.stringify(r.metadata) : "{}";
|
|
152
|
+
await this.#query(`INSERT INTO ${ident(plan.collection)} (id, vec, document, metadata) VALUES (?, VEC_FromText(?), ?, ?) ON DUPLICATE KEY UPDATE vec = VEC_FromText(?), document = ?, metadata = ?`, [
|
|
153
|
+
r.id,
|
|
154
|
+
vecText,
|
|
155
|
+
r.document ?? "",
|
|
156
|
+
meta,
|
|
157
|
+
vecText,
|
|
158
|
+
r.document ?? "",
|
|
159
|
+
meta
|
|
160
|
+
]);
|
|
161
|
+
}
|
|
162
|
+
} catch (err) {
|
|
163
|
+
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;
|
|
164
|
+
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_UPSERT_FAILED([String(err)]);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
async executeSearch(plan) {
|
|
168
|
+
const metric = this.#opts.metric ?? "cosine";
|
|
169
|
+
let queryVector;
|
|
170
|
+
if (plan.near) {
|
|
171
|
+
if ("vector" in plan.near) queryVector = plan.near.vector;
|
|
172
|
+
else if ("serverText" in plan.near) {
|
|
173
|
+
const [v] = await this.encode([plan.near.serverText], "query");
|
|
174
|
+
queryVector = v;
|
|
175
|
+
} else if ("id" in plan.near) {
|
|
176
|
+
const rows = await this.#query(`SELECT VEC_ToText(vec) vec FROM ${ident(plan.collection)} WHERE id = ?`, [plan.near.id]);
|
|
177
|
+
if (rows.length === 0) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_SEARCH_FAILED(["Referenced id not found: " + plan.near.id]);
|
|
178
|
+
queryVector = this.#parseVec(rows[0].vec);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
const offset = plan.offset ?? 0;
|
|
182
|
+
try {
|
|
183
|
+
if (queryVector) {
|
|
184
|
+
const fn = distanceFn(metric);
|
|
185
|
+
const vecText = `[${queryVector.join(",")}]`;
|
|
186
|
+
const rows = await this.#query(`SELECT id, VEC_ToText(vec) vec, document, metadata, ${fn}(vec, VEC_FromText(?)) __dist FROM ${ident(plan.collection)}`, [vecText]);
|
|
187
|
+
const filtered = plan.filter ? rows.filter((row) => require_batteries_vector_filters.evaluateFilter(plan.filter, this.#parseMeta(row.metadata))) : rows;
|
|
188
|
+
filtered.sort((a, b) => Number(a.__dist) - Number(b.__dist));
|
|
189
|
+
return filtered.slice(offset, offset + plan.topK).map((row) => this.#project(row, plan, metric, true));
|
|
190
|
+
} else {
|
|
191
|
+
const rows = await this.#query(`SELECT id, VEC_ToText(vec) vec, document, metadata FROM ${ident(plan.collection)}`);
|
|
192
|
+
return (plan.filter ? rows.filter((row) => require_batteries_vector_filters.evaluateFilter(plan.filter, this.#parseMeta(row.metadata))) : rows).slice(offset, offset + plan.topK).map((row) => this.#project(row, plan, metric, false));
|
|
193
|
+
}
|
|
194
|
+
} catch (err) {
|
|
195
|
+
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_SEARCH_FAILED([String(err)]);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
#project(row, plan, metric, isKnn) {
|
|
199
|
+
const proj = plan.projection;
|
|
200
|
+
const out = {};
|
|
201
|
+
if (proj.id) out.id = row.id;
|
|
202
|
+
if (proj.vector) out.vector = this.#parseVec(row.vec);
|
|
203
|
+
if (proj.document) out.document = row.document ?? void 0;
|
|
204
|
+
if (proj.metadata) out.metadata = this.#parseMeta(row.metadata);
|
|
205
|
+
if (isKnn && row.__dist !== void 0 && row.__dist !== null) out.score = require_batteries_vector_helpers.normalizeScore(Number(row.__dist), metric, "distance");
|
|
206
|
+
return out;
|
|
207
|
+
}
|
|
208
|
+
async executeDelete(plan) {
|
|
209
|
+
try {
|
|
210
|
+
if (plan.ids && plan.ids.length > 0) {
|
|
211
|
+
const placeholders = plan.ids.map(() => "?").join(", ");
|
|
212
|
+
await this.#query(`DELETE FROM ${ident(plan.collection)} WHERE id IN (${placeholders})`, plan.ids);
|
|
213
|
+
} else if (plan.filter) {
|
|
214
|
+
const targets = (await this.#query(`SELECT id, metadata FROM ${ident(plan.collection)}`)).filter((row) => require_batteries_vector_filters.evaluateFilter(plan.filter, this.#parseMeta(row.metadata))).map((row) => row.id);
|
|
215
|
+
if (targets.length > 0) {
|
|
216
|
+
const placeholders = targets.map(() => "?").join(", ");
|
|
217
|
+
await this.#query(`DELETE FROM ${ident(plan.collection)} WHERE id IN (${placeholders})`, targets);
|
|
218
|
+
}
|
|
219
|
+
} else await this.#query(`DELETE FROM ${ident(plan.collection)}`);
|
|
220
|
+
} catch (err) {
|
|
221
|
+
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_DELETE_FAILED([String(err)]);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
};
|
|
225
|
+
//#endregion
|
|
226
|
+
exports.MariaDBVectorStore = MariaDBVectorStore;
|
|
227
|
+
|
|
228
|
+
//# sourceMappingURL=mariadb.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mariadb.cjs","names":["#opts","#pool","#ensure","#query","#dims","#parseVec","#parseMeta","#project"],"sources":["../../../src/batteries/vector/mariadb/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/mariadb\n *\n * MariaDB adapter (native VECTOR type, 11.7+). Vectors live in a `VECTOR(N)` column written\n * with `VEC_FromText('[...]')` and read with `VEC_ToText(vec)`; KNN uses\n * `VEC_DISTANCE_COSINE` / `VEC_DISTANCE_EUCLIDEAN` ordered ascending. Metadata is a `JSON`\n * column. The neutral filter tree is evaluated with the JS reference evaluator for exact\n * cross-adapter parity. Each collection is a table.\n *\n * Driver: `mariadb` (pure JS, pooled).\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\nexport interface MariaDBVectorStoreOptions extends BaseVectorStoreOptions {\n connection?: {\n host?: string\n port?: number\n user?: string\n password?: string\n database?: string\n connectionLimit?: number\n }\n}\n\nconst getMariaDB = async () => {\n try {\n const mod = await import('mariadb')\n return (mod as any).default ?? mod\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['mariadb'])\n }\n}\n\nconst distanceFn = (metric: DistanceMetric): string =>\n metric === 'euclidean' ? 'VEC_DISTANCE_EUCLIDEAN' : 'VEC_DISTANCE_COSINE'\n\n// Backtick-quoted identifier.\nconst ident = (name: string): string => '`' + name.replace(/`/g, '``') + '`'\n\nexport class MariaDBVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: true,\n namedVectors: false,\n rename: true,\n rawSql: true,\n builtInEncoding: false,\n // SQL backend, synchronous on commit: a write is visible on resolve. The option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n\n #pool: any | null = null\n #dims: Map<string, number> = new Map()\n\n get #opts(): MariaDBVectorStoreOptions {\n return this.options as MariaDBVectorStoreOptions\n }\n\n static isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n\n async connect(): Promise<void> {\n if (this.#pool) return\n const mariadb = await getMariaDB()\n const c = this.#opts.connection || {}\n try {\n this.#pool = mariadb.createPool({\n host: c.host ?? 'localhost',\n port: c.port ?? 3306,\n user: c.user ?? 'root',\n password: c.password,\n database: c.database,\n connectionLimit: c.connectionLimit ?? 4,\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.#pool) {\n await this.#pool.end()\n this.#pool = null\n }\n }\n\n async #ensure(): Promise<any> {\n if (!this.#pool) await this.connect()\n return this.#pool!\n }\n\n async #query(sql: string, params?: unknown[]): Promise<any[]> {\n const pool = await this.#ensure()\n return await pool.query(sql, params)\n }\n\n // VEC_ToText returns \"[1,0,0]\"; parse into number[].\n #parseVec(text: unknown): number[] {\n if (typeof text !== 'string') return []\n try {\n return JSON.parse(text) as number[]\n } catch {\n return []\n }\n }\n\n #parseMeta(val: unknown): VectorMetadata {\n if (val === null || val === undefined) return {}\n if (typeof val === 'string') {\n try {\n return JSON.parse(val) as VectorMetadata\n } catch {\n return {}\n }\n }\n if (typeof val === 'object') return val as VectorMetadata\n return {}\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n this.#dims.set(spec.collection, spec.vector.dimensions)\n const ine = ifNotExists ? 'IF NOT EXISTS ' : ''\n try {\n await this.#query(\n `CREATE TABLE ${ine}${ident(spec.collection)} (` +\n `id VARCHAR(255) PRIMARY KEY, ` +\n `vec VECTOR(${spec.vector.dimensions}) NOT NULL, ` +\n `document TEXT, ` +\n `metadata JSON, ` +\n `VECTOR INDEX (vec))`\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 ie = ifExists ? 'IF EXISTS ' : ''\n try {\n await this.#query(`DROP TABLE ${ie}${ident(collection)}`)\n this.#dims.delete(collection)\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', String(err)])\n }\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n const rows = await this.#query(\n `SELECT 1 FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = ?`,\n [collection]\n )\n return rows.length > 0\n }\n\n async renameCollection(from: string, to: string): Promise<void> {\n try {\n await this.#query(`RENAME TABLE ${ident(from)} TO ${ident(to)}`)\n const d = this.#dims.get(from)\n if (d !== undefined) {\n this.#dims.set(to, d)\n this.#dims.delete(from)\n }\n } catch (err) {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', String(err)])\n }\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 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 const vecText = `[${vector.join(',')}]`\n const meta = r.metadata ? JSON.stringify(r.metadata) : '{}'\n await this.#query(\n `INSERT INTO ${ident(plan.collection)} (id, vec, document, metadata) ` +\n `VALUES (?, VEC_FromText(?), ?, ?) ` +\n `ON DUPLICATE KEY UPDATE vec = VEC_FromText(?), document = ?, metadata = ?`,\n [r.id, vecText, r.document ?? '', meta, vecText, r.document ?? '', meta]\n )\n }\n } catch (err) {\n if (\n isInstanceOf(err, 'E_VECTOR_STORE_DIMENSION_MISMATCH', E_VECTOR_STORE_DIMENSION_MISMATCH) ||\n isInstanceOf(err, 'E_VECTOR_STORE_UPSERT_FAILED', E_VECTOR_STORE_UPSERT_FAILED)\n ) {\n throw err\n }\n throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n }\n }\n\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n 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 const rows = await this.#query(\n `SELECT VEC_ToText(vec) vec FROM ${ident(plan.collection)} WHERE id = ?`,\n [plan.near.id]\n )\n if (rows.length === 0) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = this.#parseVec(rows[0].vec)\n }\n }\n\n const offset = plan.offset ?? 0\n try {\n if (queryVector) {\n const fn = distanceFn(metric)\n const vecText = `[${queryVector.join(',')}]`\n const rows = await this.#query(\n `SELECT id, VEC_ToText(vec) vec, document, metadata, ` +\n `${fn}(vec, VEC_FromText(?)) __dist FROM ${ident(plan.collection)}`,\n [vecText]\n )\n const filtered = plan.filter\n ? rows.filter((row) => evaluateFilter(plan.filter!, this.#parseMeta(row.metadata)))\n : rows\n filtered.sort((a, b) => Number(a.__dist) - Number(b.__dist))\n return filtered\n .slice(offset, offset + plan.topK)\n .map((row) => this.#project(row, plan, metric, true))\n } else {\n const rows = await this.#query(\n `SELECT id, VEC_ToText(vec) vec, document, metadata FROM ${ident(plan.collection)}`\n )\n const filtered = plan.filter\n ? rows.filter((row) => evaluateFilter(plan.filter!, this.#parseMeta(row.metadata)))\n : rows\n return filtered\n .slice(offset, offset + plan.topK)\n .map((row) => this.#project(row, plan, metric, false))\n }\n } catch (err) {\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\n }\n\n #project(row: any, plan: SearchPlan, metric: string, isKnn: boolean): 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 = this.#parseVec(row.vec)\n if (proj.document) out.document = (row.document ?? undefined) as string | undefined\n if (proj.metadata) out.metadata = this.#parseMeta(row.metadata)\n if (isKnn && row.__dist !== undefined && row.__dist !== null) {\n out.score = normalizeScore(Number(row.__dist), metric as DistanceMetric, 'distance')\n }\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n try {\n if (plan.ids && plan.ids.length > 0) {\n const placeholders = plan.ids.map(() => '?').join(', ')\n await this.#query(\n `DELETE FROM ${ident(plan.collection)} WHERE id IN (${placeholders})`,\n plan.ids\n )\n } else if (plan.filter) {\n const rows = await this.#query(`SELECT id, metadata FROM ${ident(plan.collection)}`)\n const targets = rows\n .filter((row) => evaluateFilter(plan.filter!, this.#parseMeta(row.metadata)))\n .map((row) => row.id as string)\n if (targets.length > 0) {\n const placeholders = targets.map(() => '?').join(', ')\n await this.#query(\n `DELETE FROM ${ident(plan.collection)} WHERE id IN (${placeholders})`,\n targets\n )\n }\n } else {\n await this.#query(`DELETE FROM ${ident(plan.collection)}`)\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n"],"mappings":"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"}
|