@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,316 @@
|
|
|
1
|
+
import { evaluateFilter } from "./filters.mjs";
|
|
2
|
+
import { normalizeScore } from "./helpers.mjs";
|
|
3
|
+
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_UPSERT_FAILED } from "./exceptions.mjs";
|
|
4
|
+
import { BaseVectorStore } from "./contract.mjs";
|
|
5
|
+
import { validateRecords } from "./validation.mjs";
|
|
6
|
+
//#region src/batteries/vector/sqlite_vec/index.ts
|
|
7
|
+
/**
|
|
8
|
+
* @module @nhtio/adk/batteries/vector/sqlite_vec
|
|
9
|
+
*/
|
|
10
|
+
var SqliteVecVectorStore = class extends BaseVectorStore {
|
|
11
|
+
capabilities = {
|
|
12
|
+
transactions: true,
|
|
13
|
+
namedVectors: false,
|
|
14
|
+
rename: true,
|
|
15
|
+
rawSql: true,
|
|
16
|
+
builtInEncoding: false,
|
|
17
|
+
consistency: {
|
|
18
|
+
configurable: false,
|
|
19
|
+
default: "strong",
|
|
20
|
+
modes: ["strong"]
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
#_cache = null;
|
|
24
|
+
#_dims = /* @__PURE__ */ new Map();
|
|
25
|
+
constructor(options) {
|
|
26
|
+
super(options);
|
|
27
|
+
}
|
|
28
|
+
get #opts() {
|
|
29
|
+
return this.options;
|
|
30
|
+
}
|
|
31
|
+
static isAvailable() {
|
|
32
|
+
return typeof process !== "undefined";
|
|
33
|
+
}
|
|
34
|
+
isAvailable() {
|
|
35
|
+
return typeof process !== "undefined";
|
|
36
|
+
}
|
|
37
|
+
async connect() {
|
|
38
|
+
if (this.#_cache) return;
|
|
39
|
+
let Database;
|
|
40
|
+
let sqliteVec;
|
|
41
|
+
try {
|
|
42
|
+
Database = (await import("better-sqlite3")).default;
|
|
43
|
+
} catch (e) {
|
|
44
|
+
throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(["better-sqlite3 / sqlite-vec"]);
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
sqliteVec = await import("sqlite-vec");
|
|
48
|
+
} catch (e) {
|
|
49
|
+
throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(["better-sqlite3 / sqlite-vec"]);
|
|
50
|
+
}
|
|
51
|
+
const path = this.#opts.connection?.path ?? ":memory:";
|
|
52
|
+
let db;
|
|
53
|
+
try {
|
|
54
|
+
db = new Database(path);
|
|
55
|
+
} catch (e) {
|
|
56
|
+
throw new E_VECTOR_STORE_CONNECTION_FAILED([e?.message ?? String(e)]);
|
|
57
|
+
}
|
|
58
|
+
sqliteVec.load(db);
|
|
59
|
+
this.#_cache = {
|
|
60
|
+
db,
|
|
61
|
+
drivers: {
|
|
62
|
+
Database,
|
|
63
|
+
sqliteVec
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
async close() {
|
|
68
|
+
if (this.#_cache?.db) {
|
|
69
|
+
this.#_cache.db.close();
|
|
70
|
+
this.#_cache = null;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
get db() {
|
|
74
|
+
if (!this.#_cache?.db) throw new Error("Not connected");
|
|
75
|
+
return this.#_cache.db;
|
|
76
|
+
}
|
|
77
|
+
async createCollection(spec, ifNotExists) {
|
|
78
|
+
await this.connect();
|
|
79
|
+
const { collection, vector } = spec;
|
|
80
|
+
const dims = vector.dimensions;
|
|
81
|
+
const tbl = `"${collection}"`;
|
|
82
|
+
const metaTbl = `"${collection}__meta"`;
|
|
83
|
+
const { db } = this;
|
|
84
|
+
const exists = await this.hasCollection(collection);
|
|
85
|
+
if (!ifNotExists && exists) throw new E_VECTOR_STORE_COLLECTION_FAILED(["create", "collection exists"]);
|
|
86
|
+
try {
|
|
87
|
+
db.exec(`CREATE VIRTUAL TABLE IF NOT EXISTS ${tbl} USING vec0(embedding float[${dims}])`);
|
|
88
|
+
db.exec(`CREATE TABLE IF NOT EXISTS ${metaTbl} (rowid INTEGER PRIMARY KEY, id TEXT UNIQUE, document TEXT, metadata TEXT)`);
|
|
89
|
+
this.#_dims.set(collection, dims);
|
|
90
|
+
} catch (e) {
|
|
91
|
+
throw new E_VECTOR_STORE_COLLECTION_FAILED(["create", e?.message ?? String(e)]);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
async dropCollection(collection, ifExists) {
|
|
95
|
+
await this.connect();
|
|
96
|
+
const tbl = `"${collection}"`;
|
|
97
|
+
const metaTbl = `"${collection}__meta"`;
|
|
98
|
+
if (!await this.hasCollection(collection)) {
|
|
99
|
+
if (!ifExists) throw new E_VECTOR_STORE_COLLECTION_FAILED(["drop", "collection does not exist"]);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const { db } = this;
|
|
103
|
+
try {
|
|
104
|
+
db.exec(`DROP TABLE IF EXISTS ${tbl}`);
|
|
105
|
+
db.exec(`DROP TABLE IF EXISTS ${metaTbl}`);
|
|
106
|
+
this.#_dims.delete(collection);
|
|
107
|
+
} catch (e) {
|
|
108
|
+
throw new E_VECTOR_STORE_COLLECTION_FAILED(["drop", e?.message ?? String(e)]);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
async hasCollection(collection) {
|
|
112
|
+
await this.connect();
|
|
113
|
+
const { db } = this;
|
|
114
|
+
try {
|
|
115
|
+
return !!db.prepare(`SELECT name FROM sqlite_master WHERE type='table' AND name=?`).get(collection)?.name;
|
|
116
|
+
} catch {
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
async renameCollection(from, to) {
|
|
121
|
+
await this.connect();
|
|
122
|
+
if (!await this.hasCollection(from)) throw new E_VECTOR_STORE_COLLECTION_FAILED(["rename", "source collection does not exist"]);
|
|
123
|
+
if (await this.hasCollection(to)) throw new E_VECTOR_STORE_COLLECTION_FAILED(["rename", "target collection already exists"]);
|
|
124
|
+
const { db } = this;
|
|
125
|
+
try {
|
|
126
|
+
db.exec(`ALTER TABLE "${from}" RENAME TO "${to}"`);
|
|
127
|
+
db.exec(`ALTER TABLE "${from}__meta" RENAME TO "${to}__meta"`);
|
|
128
|
+
const dims = this.#_dims.get(from);
|
|
129
|
+
if (dims !== void 0) {
|
|
130
|
+
this.#_dims.set(to, dims);
|
|
131
|
+
this.#_dims.delete(from);
|
|
132
|
+
}
|
|
133
|
+
} catch (e) {
|
|
134
|
+
throw new E_VECTOR_STORE_COLLECTION_FAILED(["rename", e?.message ?? String(e)]);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
async executeUpsert(plan) {
|
|
138
|
+
await this.connect();
|
|
139
|
+
validateRecords(plan.records);
|
|
140
|
+
const collection = plan.collection;
|
|
141
|
+
const dims = this.#_dims.get(collection);
|
|
142
|
+
const { db } = this;
|
|
143
|
+
const resolvedRows = [];
|
|
144
|
+
for (const r of plan.records) {
|
|
145
|
+
let vector = r.vector;
|
|
146
|
+
if (!vector && r.document) {
|
|
147
|
+
const [v] = await this.encode([r.document], "document");
|
|
148
|
+
vector = v;
|
|
149
|
+
}
|
|
150
|
+
if (vector && dims !== void 0 && vector.length !== dims) throw new E_VECTOR_STORE_DIMENSION_MISMATCH([dims, vector.length]);
|
|
151
|
+
resolvedRows.push({
|
|
152
|
+
id: r.id,
|
|
153
|
+
vector: vector ?? [],
|
|
154
|
+
document: r.document,
|
|
155
|
+
metadata: r.metadata
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
const stmtMetaInsert = db.prepare(`INSERT INTO "${collection}__meta" (id, document, metadata) VALUES (?, ?, ?)`);
|
|
159
|
+
const stmtMetaUpdate = db.prepare(`UPDATE "${collection}__meta" SET document = ?, metadata = ? WHERE id = ?`);
|
|
160
|
+
const stmtRowid = db.prepare(`SELECT rowid FROM "${collection}__meta" WHERE id = ?`);
|
|
161
|
+
const stmtVecDelete = db.prepare(`DELETE FROM "${collection}" WHERE rowid = ?`);
|
|
162
|
+
const stmtVecInsert = db.prepare(`INSERT INTO "${collection}" (rowid, embedding) VALUES (?, ?)`);
|
|
163
|
+
const txn = db.transaction(() => {
|
|
164
|
+
for (const r of resolvedRows) {
|
|
165
|
+
const buf = new Float32Array(r.vector);
|
|
166
|
+
let rowid;
|
|
167
|
+
const rowidRes = stmtRowid.get(r.id);
|
|
168
|
+
if (rowidRes?.rowid) {
|
|
169
|
+
rowid = BigInt(rowidRes.rowid);
|
|
170
|
+
stmtMetaUpdate.run(r.document ?? null, JSON.stringify(r.metadata ?? {}), r.id);
|
|
171
|
+
stmtVecDelete.run(rowid);
|
|
172
|
+
stmtVecInsert.run(rowid, buf);
|
|
173
|
+
} else {
|
|
174
|
+
const insertMeta = stmtMetaInsert.run(r.id, r.document ?? null, JSON.stringify(r.metadata ?? {}));
|
|
175
|
+
rowid = BigInt(insertMeta.lastInsertRowid);
|
|
176
|
+
stmtVecInsert.run(rowid, buf);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
try {
|
|
181
|
+
txn();
|
|
182
|
+
} catch (e) {
|
|
183
|
+
throw new E_VECTOR_STORE_UPSERT_FAILED([e?.message ?? String(e)]);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
async executeSearch(plan) {
|
|
187
|
+
await this.connect();
|
|
188
|
+
const { db } = this;
|
|
189
|
+
const collection = plan.collection;
|
|
190
|
+
const tbl = `"${collection}"`;
|
|
191
|
+
const metaTbl = `"${collection}__meta"`;
|
|
192
|
+
const near = plan.near;
|
|
193
|
+
const limit = (plan.offset ?? 0) + plan.topK;
|
|
194
|
+
try {
|
|
195
|
+
if (near) {
|
|
196
|
+
let qvec;
|
|
197
|
+
if ("vector" in near) qvec = near.vector;
|
|
198
|
+
else if ("serverText" in near) {
|
|
199
|
+
const [v] = await this.encode([near.serverText], "query");
|
|
200
|
+
qvec = v;
|
|
201
|
+
} else if ("id" in near) {
|
|
202
|
+
const refRow = db.prepare(`SELECT rowid FROM ${metaTbl} WHERE id = ?`).get(near.id);
|
|
203
|
+
if (refRow?.rowid) {
|
|
204
|
+
const refVecRes = db.prepare(`SELECT embedding FROM ${tbl} WHERE rowid = ?`).get(BigInt(refRow.rowid));
|
|
205
|
+
if (refVecRes?.embedding) qvec = Array.from(new Float32Array(refVecRes.embedding.buffer || refVecRes.embedding));
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
if (!qvec) throw new E_VECTOR_STORE_SEARCH_FAILED(["no query vector provided"]);
|
|
209
|
+
const matchClause = `embedding MATCH ? ORDER BY distance LIMIT ${limit}`;
|
|
210
|
+
const matchBuf = new Float32Array(qvec);
|
|
211
|
+
const matches = [];
|
|
212
|
+
const stmtMatch = db.prepare(`SELECT rowid, distance FROM ${tbl} WHERE ${matchClause}`);
|
|
213
|
+
for (const row of stmtMatch.iterate(matchBuf)) matches.push({
|
|
214
|
+
rowid: BigInt(row.rowid),
|
|
215
|
+
distance: row.distance
|
|
216
|
+
});
|
|
217
|
+
let results = [];
|
|
218
|
+
for (const m of matches) {
|
|
219
|
+
const meta = db.prepare(`SELECT rowid, id, document, metadata FROM ${metaTbl} WHERE rowid = ?`).get(m.rowid);
|
|
220
|
+
if (!meta) continue;
|
|
221
|
+
const parsedMeta = typeof meta.metadata === "string" ? JSON.parse(meta.metadata) : meta.metadata;
|
|
222
|
+
if (plan.filter && !evaluateFilter(plan.filter, parsedMeta)) continue;
|
|
223
|
+
let score = normalizeScore(Number(m.distance), this.options.metric ?? "euclidean", "distance");
|
|
224
|
+
const proj = {};
|
|
225
|
+
if (plan.projection.id) proj.id = meta.id;
|
|
226
|
+
if (plan.projection.vector) {
|
|
227
|
+
const vecRes = db.prepare(`SELECT embedding FROM ${tbl} WHERE rowid = ?`).get(m.rowid);
|
|
228
|
+
if (vecRes?.embedding) proj.vector = Array.from(new Float32Array(vecRes.embedding.buffer || vecRes.embedding));
|
|
229
|
+
}
|
|
230
|
+
if (plan.projection.document && meta.document !== void 0) proj.document = meta.document;
|
|
231
|
+
if (plan.projection.metadata && parsedMeta !== void 0) proj.metadata = parsedMeta;
|
|
232
|
+
if (score !== void 0) proj.score = score;
|
|
233
|
+
results.push(proj);
|
|
234
|
+
}
|
|
235
|
+
const offset = plan.offset ?? 0;
|
|
236
|
+
return results.slice(offset, offset + plan.topK);
|
|
237
|
+
} else {
|
|
238
|
+
const rows = db.prepare(`SELECT rowid, id, document, metadata FROM ${metaTbl}`).all();
|
|
239
|
+
let scored = [];
|
|
240
|
+
for (const row of rows) {
|
|
241
|
+
const parsedMeta = typeof row.metadata === "string" ? JSON.parse(row.metadata) : row.metadata;
|
|
242
|
+
if (plan.filter && !evaluateFilter(plan.filter, parsedMeta)) continue;
|
|
243
|
+
scored.push({
|
|
244
|
+
row,
|
|
245
|
+
score: void 0
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
const offset = plan.offset ?? 0;
|
|
249
|
+
return scored.slice(offset, offset + plan.topK).map(({ row }) => {
|
|
250
|
+
const parsedMeta = typeof row.metadata === "string" ? JSON.parse(row.metadata) : row.metadata;
|
|
251
|
+
const out = {};
|
|
252
|
+
if (plan.projection.id) out.id = row.id;
|
|
253
|
+
if (plan.projection.vector) {
|
|
254
|
+
const vecRes = db.prepare(`SELECT embedding FROM ${tbl} WHERE rowid = ?`).get(BigInt(row.rowid));
|
|
255
|
+
if (vecRes?.embedding) out.vector = Array.from(new Float32Array(vecRes.embedding.buffer || vecRes.embedding));
|
|
256
|
+
}
|
|
257
|
+
if (plan.projection.document && row.document !== void 0) out.document = row.document;
|
|
258
|
+
if (plan.projection.metadata && parsedMeta !== void 0) out.metadata = parsedMeta;
|
|
259
|
+
return out;
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
} catch (e) {
|
|
263
|
+
throw new E_VECTOR_STORE_SEARCH_FAILED([e?.message ?? String(e)]);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
async executeDelete(plan) {
|
|
267
|
+
await this.connect();
|
|
268
|
+
const collection = plan.collection;
|
|
269
|
+
const metaTbl = `"${collection}__meta"`;
|
|
270
|
+
const tbl = `"${collection}"`;
|
|
271
|
+
const { db } = this;
|
|
272
|
+
try {
|
|
273
|
+
if (plan.ids && plan.ids.length > 0) {
|
|
274
|
+
const rowids = db.prepare(`SELECT rowid, metadata FROM ${metaTbl} WHERE id IN (${plan.ids.map(() => "?").join(", ")})`).all(...plan.ids).map((r) => BigInt(r.rowid));
|
|
275
|
+
if (rowids.length > 0) {
|
|
276
|
+
const rowidPlaceholders = rowids.map(() => "?").join(", ");
|
|
277
|
+
db.prepare(`DELETE FROM ${metaTbl} WHERE rowid IN (${rowidPlaceholders})`).run(...rowids);
|
|
278
|
+
db.prepare(`DELETE FROM ${tbl} WHERE rowid IN (${rowidPlaceholders})`).run(...rowids);
|
|
279
|
+
}
|
|
280
|
+
} else if (plan.filter) {
|
|
281
|
+
const rows = db.prepare(`SELECT rowid, metadata FROM ${metaTbl}`).all();
|
|
282
|
+
const toDeleteRowids = [];
|
|
283
|
+
for (const row of rows) {
|
|
284
|
+
const parsedMeta = typeof row.metadata === "string" ? JSON.parse(row.metadata) : row.metadata;
|
|
285
|
+
if (evaluateFilter(plan.filter, parsedMeta)) toDeleteRowids.push(BigInt(row.rowid));
|
|
286
|
+
}
|
|
287
|
+
if (toDeleteRowids.length > 0) {
|
|
288
|
+
const rowidPlaceholders = toDeleteRowids.map(() => "?").join(", ");
|
|
289
|
+
db.prepare(`DELETE FROM ${metaTbl} WHERE rowid IN (${rowidPlaceholders})`).run(...toDeleteRowids);
|
|
290
|
+
db.prepare(`DELETE FROM ${tbl} WHERE rowid IN (${rowidPlaceholders})`).run(...toDeleteRowids);
|
|
291
|
+
}
|
|
292
|
+
} else {
|
|
293
|
+
db.exec(`DELETE FROM ${metaTbl}`);
|
|
294
|
+
db.exec(`DELETE FROM ${tbl}`);
|
|
295
|
+
}
|
|
296
|
+
} catch (e) {
|
|
297
|
+
throw new E_VECTOR_STORE_DELETE_FAILED([e?.message ?? String(e)]);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
async transaction(fn) {
|
|
301
|
+
await this.connect();
|
|
302
|
+
const { db } = this;
|
|
303
|
+
db.exec("BEGIN");
|
|
304
|
+
try {
|
|
305
|
+
await fn(this.asCallable());
|
|
306
|
+
db.exec("COMMIT");
|
|
307
|
+
} catch (e) {
|
|
308
|
+
db.exec("ROLLBACK");
|
|
309
|
+
throw e;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
};
|
|
313
|
+
//#endregion
|
|
314
|
+
export { SqliteVecVectorStore };
|
|
315
|
+
|
|
316
|
+
//# sourceMappingURL=sqlite_vec.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite_vec.mjs","names":["#opts","#_cache","#_dims"],"sources":["../../../src/batteries/vector/sqlite_vec/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/sqlite_vec\n */\n\nimport { evaluateFilter } from '../filters'\nimport { normalizeScore } from '../helpers'\nimport { validateRecords } from '../validation'\nimport { BaseVectorStore, CallableVectorStore } from '../contract'\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} from '../exceptions'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from '../types'\n\ninterface SqliteVecOptions extends BaseVectorStoreOptions {\n connection: {\n path: string\n }\n}\n\ninterface VecRow {\n rowid: bigint\n distance: number\n}\n\ninterface CachedStore {\n db: any\n drivers?: { Database: any; sqliteVec: any }\n}\n\nexport class SqliteVecVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: true,\n namedVectors: false,\n rename: true,\n rawSql: true,\n builtInEncoding: false,\n // Strongly consistent (local file/in-memory): visible on resolve, so the option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n\n #_cache: CachedStore | null = null\n #_dims: Map<string, number> = new Map()\n\n constructor(options: SqliteVecOptions) {\n super(options)\n }\n\n get #opts(): SqliteVecOptions {\n return this.options as SqliteVecOptions\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.#_cache) {\n return\n }\n\n let Database: any\n let sqliteVec: any\n\n try {\n const mod1 = await import('better-sqlite3')\n Database = mod1.default\n } catch (e) {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['better-sqlite3 / sqlite-vec'])\n }\n\n try {\n sqliteVec = await import('sqlite-vec')\n } catch (e) {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['better-sqlite3 / sqlite-vec'])\n }\n\n const path = this.#opts.connection?.path ?? ':memory:'\n let db: any\n\n try {\n db = new Database(path)\n } catch (e: any) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([e?.message ?? String(e)])\n }\n\n sqliteVec.load(db)\n\n this.#_cache = { db, drivers: { Database, sqliteVec } }\n }\n\n async close(): Promise<void> {\n if (this.#_cache?.db) {\n this.#_cache.db.close()\n this.#_cache = null\n }\n }\n\n get db(): any {\n if (!this.#_cache?.db) {\n throw new Error('Not connected')\n }\n return this.#_cache.db\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n await this.connect()\n const { collection, vector } = spec\n const dims = vector.dimensions\n const tbl = `\"${collection}\"`\n const metaTbl = `\"${collection}__meta\"`\n\n const { db } = this\n\n const exists = await this.hasCollection(collection)\n if (!ifNotExists && exists) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['create', 'collection exists'])\n }\n\n try {\n db.exec(`CREATE VIRTUAL TABLE IF NOT EXISTS ${tbl} USING vec0(embedding float[${dims}])`)\n db.exec(\n `CREATE TABLE IF NOT EXISTS ${metaTbl} (rowid INTEGER PRIMARY KEY, id TEXT UNIQUE, document TEXT, metadata TEXT)`\n )\n this.#_dims.set(collection, dims)\n } catch (e: any) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['create', e?.message ?? String(e)])\n }\n }\n\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n await this.connect()\n const tbl = `\"${collection}\"`\n const metaTbl = `\"${collection}__meta\"`\n\n const has = await this.hasCollection(collection)\n if (!has) {\n if (!ifExists) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['drop', 'collection does not exist'])\n }\n return\n }\n\n const { db } = this\n try {\n db.exec(`DROP TABLE IF EXISTS ${tbl}`)\n db.exec(`DROP TABLE IF EXISTS ${metaTbl}`)\n this.#_dims.delete(collection)\n } catch (e: any) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['drop', e?.message ?? String(e)])\n }\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n await this.connect()\n const { db } = this\n try {\n const res: any = db\n .prepare(`SELECT name FROM sqlite_master WHERE type='table' AND name=?`)\n .get(collection)\n return !!res?.name\n } catch {\n return false\n }\n }\n\n async renameCollection(from: string, to: string): Promise<void> {\n await this.connect()\n const hasFrom = await this.hasCollection(from)\n if (!hasFrom) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['rename', 'source collection does not exist'])\n }\n\n const hasTo = await this.hasCollection(to)\n if (hasTo) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['rename', 'target collection already exists'])\n }\n\n const { db } = this\n try {\n db.exec(`ALTER TABLE \"${from}\" RENAME TO \"${to}\"`)\n db.exec(`ALTER TABLE \"${from}__meta\" RENAME TO \"${to}__meta\"`)\n const dims = this.#_dims.get(from)\n if (dims !== undefined) {\n this.#_dims.set(to, dims)\n this.#_dims.delete(from)\n }\n } catch (e: any) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['rename', e?.message ?? String(e)])\n }\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n await this.connect()\n validateRecords(plan.records)\n\n const collection = plan.collection\n const dims = this.#_dims.get(collection)\n const { db } = this\n\n const resolvedRows: {\n id: string\n vector: number[]\n document?: string\n metadata?: Record<string, unknown>\n }[] = []\n\n for (const r of plan.records) {\n let vector = r.vector\n if (!vector && r.document) {\n const [v] = await this.encode([r.document], 'document')\n vector = v\n }\n\n if (vector && dims !== undefined && vector.length !== dims) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([dims, vector.length])\n }\n\n resolvedRows.push({\n id: r.id,\n vector: vector ?? [],\n document: r.document,\n metadata: r.metadata as Record<string, unknown> | undefined,\n })\n }\n\n const stmtMetaInsert = db.prepare(\n `INSERT INTO \"${collection}__meta\" (id, document, metadata) VALUES (?, ?, ?)`\n )\n const stmtMetaUpdate = db.prepare(\n `UPDATE \"${collection}__meta\" SET document = ?, metadata = ? WHERE id = ?`\n )\n const stmtRowid = db.prepare(`SELECT rowid FROM \"${collection}__meta\" WHERE id = ?`)\n const stmtVecDelete = db.prepare(`DELETE FROM \"${collection}\" WHERE rowid = ?`)\n const stmtVecInsert = db.prepare(`INSERT INTO \"${collection}\" (rowid, embedding) VALUES (?, ?)`)\n\n const txn = db.transaction(() => {\n for (const r of resolvedRows) {\n const buf = new Float32Array(r.vector)\n let rowid: bigint | undefined\n\n const rowidRes: any = stmtRowid.get(r.id)\n if (rowidRes?.rowid) {\n rowid = BigInt(rowidRes.rowid)\n stmtMetaUpdate.run(r.document ?? null, JSON.stringify(r.metadata ?? {}), r.id)\n stmtVecDelete.run(rowid)\n stmtVecInsert.run(rowid, buf)\n } else {\n const insertMeta = stmtMetaInsert.run(\n r.id,\n r.document ?? null,\n JSON.stringify(r.metadata ?? {})\n )\n rowid = BigInt(insertMeta.lastInsertRowid)\n stmtVecInsert.run(rowid, buf)\n }\n }\n })\n\n try {\n txn()\n } catch (e: any) {\n throw new E_VECTOR_STORE_UPSERT_FAILED([e?.message ?? String(e)])\n }\n }\n\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n await this.connect()\n const { db } = this\n const collection = plan.collection\n const tbl = `\"${collection}\"`\n const metaTbl = `\"${collection}__meta\"`\n\n const near = plan.near\n const limit = (plan.offset ?? 0) + plan.topK\n\n try {\n if (near) {\n let qvec: number[] | undefined\n\n if ('vector' in near) {\n qvec = near.vector\n } else if ('serverText' in near) {\n const [v] = await this.encode([near.serverText], 'query')\n qvec = v\n } else if ('id' in near) {\n const refRow: any = db.prepare(`SELECT rowid FROM ${metaTbl} WHERE id = ?`).get(near.id)\n if (refRow?.rowid) {\n const refVecRes: any = db\n .prepare(`SELECT embedding FROM ${tbl} WHERE rowid = ?`)\n .get(BigInt(refRow.rowid))\n if (refVecRes?.embedding) {\n qvec = Array.from(new Float32Array(refVecRes.embedding.buffer || refVecRes.embedding))\n }\n }\n }\n\n if (!qvec) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['no query vector provided'])\n }\n\n const matchClause = `embedding MATCH ? ORDER BY distance LIMIT ${limit}`\n const matchBuf = new Float32Array(qvec)\n\n const matches: VecRow[] = []\n const stmtMatch = db.prepare(`SELECT rowid, distance FROM ${tbl} WHERE ${matchClause}`)\n for (const row of stmtMatch.iterate(matchBuf)) {\n matches.push({ rowid: BigInt(row.rowid), distance: row.distance })\n }\n\n let results: VectorMatch[] = []\n for (const m of matches) {\n const meta: any = db\n .prepare(`SELECT rowid, id, document, metadata FROM ${metaTbl} WHERE rowid = ?`)\n .get(m.rowid)\n if (!meta) {\n continue\n }\n\n const parsedMeta =\n typeof meta.metadata === 'string' ? JSON.parse(meta.metadata) : meta.metadata\n\n if (plan.filter && !evaluateFilter(plan.filter, parsedMeta as any)) {\n continue\n }\n\n let score = normalizeScore(\n Number(m.distance),\n this.options.metric ?? 'euclidean',\n 'distance'\n )\n\n const proj: VectorMatch = {}\n if (plan.projection.id) proj.id = meta.id\n if (plan.projection.vector) {\n const vecRes: any = db\n .prepare(`SELECT embedding FROM ${tbl} WHERE rowid = ?`)\n .get(m.rowid)\n if (vecRes?.embedding) {\n proj.vector = Array.from(\n new Float32Array(vecRes.embedding.buffer || vecRes.embedding)\n )\n }\n }\n if (plan.projection.document && meta.document !== undefined) proj.document = meta.document\n if (plan.projection.metadata && parsedMeta !== undefined)\n proj.metadata = parsedMeta as any\n if (score !== undefined) proj.score = score\n results.push(proj)\n }\n\n const offset = plan.offset ?? 0\n return results.slice(offset, offset + plan.topK)\n } else {\n const rows: any[] = db.prepare(`SELECT rowid, id, document, metadata FROM ${metaTbl}`).all()\n let scored: { row: any; score?: number }[] = []\n\n for (const row of rows) {\n const parsedMeta =\n typeof row.metadata === 'string' ? JSON.parse(row.metadata) : row.metadata\n\n if (plan.filter && !evaluateFilter(plan.filter, parsedMeta as any)) {\n continue\n }\n\n scored.push({ row, score: undefined })\n }\n\n const offset = plan.offset ?? 0\n const limited = scored.slice(offset, offset + plan.topK)\n\n return limited.map(({ row }) => {\n const parsedMeta =\n typeof row.metadata === 'string' ? JSON.parse(row.metadata) : row.metadata\n const out: VectorMatch = {}\n\n if (plan.projection.id) out.id = row.id\n\n if (plan.projection.vector) {\n const vecRes: any = db\n .prepare(`SELECT embedding FROM ${tbl} WHERE rowid = ?`)\n .get(BigInt(row.rowid))\n if (vecRes?.embedding) {\n out.vector = Array.from(new Float32Array(vecRes.embedding.buffer || vecRes.embedding))\n }\n }\n\n if (plan.projection.document && row.document !== undefined) out.document = row.document\n if (plan.projection.metadata && parsedMeta !== undefined) out.metadata = parsedMeta as any\n\n return out\n })\n }\n } catch (e: any) {\n throw new E_VECTOR_STORE_SEARCH_FAILED([e?.message ?? String(e)])\n }\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n await this.connect()\n const collection = plan.collection\n const metaTbl = `\"${collection}__meta\"`\n const tbl = `\"${collection}\"`\n\n const { db } = this\n\n try {\n if (plan.ids && plan.ids.length > 0) {\n const stmtIds = db.prepare(\n `SELECT rowid, metadata FROM ${metaTbl} WHERE id IN (${plan.ids.map(() => '?').join(', ')})`\n )\n const rowids: bigint[] = stmtIds.all(...plan.ids).map((r: any) => BigInt(r.rowid))\n if (rowids.length > 0) {\n const rowidPlaceholders = rowids.map(() => '?').join(', ')\n db.prepare(`DELETE FROM ${metaTbl} WHERE rowid IN (${rowidPlaceholders})`).run(...rowids)\n db.prepare(`DELETE FROM ${tbl} WHERE rowid IN (${rowidPlaceholders})`).run(...rowids)\n }\n } else if (plan.filter) {\n const rows: any[] = db.prepare(`SELECT rowid, metadata FROM ${metaTbl}`).all()\n const toDeleteRowids: bigint[] = []\n\n for (const row of rows) {\n const parsedMeta =\n typeof row.metadata === 'string' ? JSON.parse(row.metadata) : row.metadata\n if (evaluateFilter(plan.filter, parsedMeta as any)) {\n toDeleteRowids.push(BigInt(row.rowid))\n }\n }\n\n if (toDeleteRowids.length > 0) {\n const rowidPlaceholders = toDeleteRowids.map(() => '?').join(', ')\n db.prepare(`DELETE FROM ${metaTbl} WHERE rowid IN (${rowidPlaceholders})`).run(\n ...toDeleteRowids\n )\n db.prepare(`DELETE FROM ${tbl} WHERE rowid IN (${rowidPlaceholders})`).run(\n ...toDeleteRowids\n )\n }\n } else {\n db.exec(`DELETE FROM ${metaTbl}`)\n db.exec(`DELETE FROM ${tbl}`)\n }\n } catch (e: any) {\n throw new E_VECTOR_STORE_DELETE_FAILED([e?.message ?? String(e)])\n }\n }\n\n async transaction(fn: (tx: CallableVectorStore) => Promise<void>): Promise<void> {\n await this.connect()\n const { db } = this\n\n db.exec('BEGIN')\n try {\n await fn(this.asCallable())\n db.exec('COMMIT')\n } catch (e) {\n db.exec('ROLLBACK')\n throw e\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module @nhtio/adk/batteries/vector/surrealdb
|
|
3
|
+
*
|
|
4
|
+
* SurrealDB adapter (multi-model). Each collection is a SurrealDB table; records store the
|
|
5
|
+
* vector as a plain array field and KNN uses `vector::similarity::cosine` /
|
|
6
|
+
* `vector::distance::euclidean` ordered appropriately. Metadata is a JSON string field filtered
|
|
7
|
+
* with the neutral filter tree's JS reference evaluator for exact cross-adapter parity.
|
|
8
|
+
*
|
|
9
|
+
* Driver: `surrealdb` (pure JS). All queries are parameterized via `$bindings`.
|
|
10
|
+
*/
|
|
11
|
+
import { BaseVectorStore } from "../contract";
|
|
12
|
+
import type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from "../plan";
|
|
13
|
+
import type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from "../types";
|
|
14
|
+
export interface SurrealDBVectorStoreOptions extends BaseVectorStoreOptions {
|
|
15
|
+
connection: {
|
|
16
|
+
url: string;
|
|
17
|
+
username?: string;
|
|
18
|
+
password?: string;
|
|
19
|
+
namespace?: string;
|
|
20
|
+
database?: string;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export declare class SurrealDBVectorStore extends BaseVectorStore {
|
|
24
|
+
#private;
|
|
25
|
+
readonly capabilities: VectorStoreCapabilities;
|
|
26
|
+
static isAvailable(): boolean;
|
|
27
|
+
isAvailable(): boolean;
|
|
28
|
+
connect(): Promise<void>;
|
|
29
|
+
close(): Promise<void>;
|
|
30
|
+
createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void>;
|
|
31
|
+
dropCollection(collection: string, ifExists: boolean): Promise<void>;
|
|
32
|
+
hasCollection(collection: string): Promise<boolean>;
|
|
33
|
+
renameCollection(_from: string, _to: string): Promise<void>;
|
|
34
|
+
executeUpsert(plan: UpsertPlan): Promise<void>;
|
|
35
|
+
executeSearch(plan: SearchPlan): Promise<VectorMatch[]>;
|
|
36
|
+
executeDelete(plan: DeletePlan): Promise<void>;
|
|
37
|
+
}
|
|
@@ -0,0 +1,230 @@
|
|
|
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_exceptions = require("./exceptions.cjs");
|
|
7
|
+
const require_batteries_vector_contract = require("./contract.cjs");
|
|
8
|
+
const require_batteries_vector_validation = require("./validation.cjs");
|
|
9
|
+
//#region src/batteries/vector/surrealdb/index.ts
|
|
10
|
+
/**
|
|
11
|
+
* @module @nhtio/adk/batteries/vector/surrealdb
|
|
12
|
+
*
|
|
13
|
+
* SurrealDB adapter (multi-model). Each collection is a SurrealDB table; records store the
|
|
14
|
+
* vector as a plain array field and KNN uses `vector::similarity::cosine` /
|
|
15
|
+
* `vector::distance::euclidean` ordered appropriately. Metadata is a JSON string field filtered
|
|
16
|
+
* with the neutral filter tree's JS reference evaluator for exact cross-adapter parity.
|
|
17
|
+
*
|
|
18
|
+
* Driver: `surrealdb` (pure JS). All queries are parameterized via `$bindings`.
|
|
19
|
+
*/
|
|
20
|
+
var getSurreal = async () => {
|
|
21
|
+
try {
|
|
22
|
+
return (await import("surrealdb")).Surreal;
|
|
23
|
+
} catch {
|
|
24
|
+
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_DRIVER_UNAVAILABLE(["surrealdb"]);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
var ident = (name) => "`" + name.replace(/`/g, "\\`") + "`";
|
|
28
|
+
var recordIdToString = (rid) => {
|
|
29
|
+
if (rid && typeof rid === "object" && "id" in rid) return String(rid.id);
|
|
30
|
+
const s = String(rid);
|
|
31
|
+
const idx = s.indexOf(":");
|
|
32
|
+
return idx >= 0 ? s.slice(idx + 1).replace(/^⟨|⟩$/g, "") : s;
|
|
33
|
+
};
|
|
34
|
+
var SurrealDBVectorStore = class extends require_batteries_vector_contract.BaseVectorStore {
|
|
35
|
+
capabilities = {
|
|
36
|
+
transactions: false,
|
|
37
|
+
namedVectors: false,
|
|
38
|
+
rename: false,
|
|
39
|
+
rawSql: false,
|
|
40
|
+
builtInEncoding: false,
|
|
41
|
+
consistency: {
|
|
42
|
+
configurable: false,
|
|
43
|
+
default: "strong",
|
|
44
|
+
modes: ["strong"]
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
#db = null;
|
|
48
|
+
#dims = /* @__PURE__ */ new Map();
|
|
49
|
+
get #opts() {
|
|
50
|
+
return this.options;
|
|
51
|
+
}
|
|
52
|
+
static isAvailable() {
|
|
53
|
+
return typeof process !== "undefined";
|
|
54
|
+
}
|
|
55
|
+
isAvailable() {
|
|
56
|
+
return typeof process !== "undefined";
|
|
57
|
+
}
|
|
58
|
+
async connect() {
|
|
59
|
+
if (this.#db) return;
|
|
60
|
+
const Surreal = await getSurreal();
|
|
61
|
+
const c = this.#opts.connection;
|
|
62
|
+
try {
|
|
63
|
+
this.#db = new Surreal();
|
|
64
|
+
const rpc = c.url.replace(/\/$/, "");
|
|
65
|
+
await this.#db.connect(rpc.endsWith("/rpc") ? rpc : `${rpc}/rpc`);
|
|
66
|
+
if (c.username) await this.#db.signin({
|
|
67
|
+
username: c.username,
|
|
68
|
+
password: c.password ?? ""
|
|
69
|
+
});
|
|
70
|
+
await this.#db.use({
|
|
71
|
+
namespace: c.namespace ?? "test",
|
|
72
|
+
database: c.database ?? "test"
|
|
73
|
+
});
|
|
74
|
+
} catch (err) {
|
|
75
|
+
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_CONNECTION_FAILED([String(err)]);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
async close() {
|
|
79
|
+
if (this.#db) {
|
|
80
|
+
await this.#db.close();
|
|
81
|
+
this.#db = null;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async #ensure() {
|
|
85
|
+
if (!this.#db) await this.connect();
|
|
86
|
+
return this.#db;
|
|
87
|
+
}
|
|
88
|
+
async #query(sql, vars) {
|
|
89
|
+
return await (await this.#ensure()).query(sql, vars);
|
|
90
|
+
}
|
|
91
|
+
async createCollection(spec, ifNotExists) {
|
|
92
|
+
this.#dims.set(spec.collection, spec.vector.dimensions);
|
|
93
|
+
const ine = ifNotExists ? "IF NOT EXISTS " : "";
|
|
94
|
+
try {
|
|
95
|
+
await this.#query(`DEFINE TABLE ${ine}${ident(spec.collection)} SCHEMALESS;`);
|
|
96
|
+
} catch (err) {
|
|
97
|
+
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_COLLECTION_FAILED(["createCollection", String(err)]);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
async dropCollection(collection, ifExists) {
|
|
101
|
+
const ie = ifExists ? "IF EXISTS " : "";
|
|
102
|
+
try {
|
|
103
|
+
await this.#query(`REMOVE TABLE ${ie}${ident(collection)};`);
|
|
104
|
+
this.#dims.delete(collection);
|
|
105
|
+
} catch (err) {
|
|
106
|
+
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_COLLECTION_FAILED(["dropCollection", String(err)]);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
async hasCollection(collection) {
|
|
110
|
+
try {
|
|
111
|
+
const info = (await this.#query("INFO FOR DB;"))[0];
|
|
112
|
+
const tables = info?.tables ?? info?.tb ?? {};
|
|
113
|
+
return Object.prototype.hasOwnProperty.call(tables, collection);
|
|
114
|
+
} catch {
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
async renameCollection(_from, _to) {
|
|
119
|
+
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_UNSUPPORTED_OPERATION(["renameCollection", "surrealdb"]);
|
|
120
|
+
}
|
|
121
|
+
async executeUpsert(plan) {
|
|
122
|
+
if (plan.records.length === 0) return;
|
|
123
|
+
require_batteries_vector_validation.validateRecords(plan.records);
|
|
124
|
+
const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection);
|
|
125
|
+
try {
|
|
126
|
+
for (const r of plan.records) {
|
|
127
|
+
let vector = r.vector;
|
|
128
|
+
if (!vector && r.document) {
|
|
129
|
+
const [v] = await this.encode([r.document], "document");
|
|
130
|
+
vector = v;
|
|
131
|
+
}
|
|
132
|
+
if (!vector) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_UPSERT_FAILED(["Record missing vector and document"]);
|
|
133
|
+
if (expected !== void 0 && vector.length !== expected) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length]);
|
|
134
|
+
await this.#query(`UPSERT type::thing($tbl, $rid) SET vec = $vec, document = $document, metadata = $metadata;`, {
|
|
135
|
+
tbl: plan.collection,
|
|
136
|
+
rid: r.id,
|
|
137
|
+
vec: vector,
|
|
138
|
+
document: r.document ?? "",
|
|
139
|
+
metadata: r.metadata ? JSON.stringify(r.metadata) : "{}"
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
} catch (err) {
|
|
143
|
+
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;
|
|
144
|
+
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_UPSERT_FAILED([String(err)]);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
async executeSearch(plan) {
|
|
148
|
+
const metric = this.#opts.metric ?? "cosine";
|
|
149
|
+
let queryVector;
|
|
150
|
+
if (plan.near) {
|
|
151
|
+
if ("vector" in plan.near) queryVector = plan.near.vector;
|
|
152
|
+
else if ("serverText" in plan.near) {
|
|
153
|
+
const [v] = await this.encode([plan.near.serverText], "query");
|
|
154
|
+
queryVector = v;
|
|
155
|
+
} else if ("id" in plan.near) {
|
|
156
|
+
const row = (await this.#query(`SELECT vec FROM type::thing($tbl, $rid);`, {
|
|
157
|
+
tbl: plan.collection,
|
|
158
|
+
rid: plan.near.id
|
|
159
|
+
}))[0]?.[0];
|
|
160
|
+
if (!row) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_SEARCH_FAILED(["Referenced id not found: " + plan.near.id]);
|
|
161
|
+
queryVector = row.vec;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
const offset = plan.offset ?? 0;
|
|
165
|
+
try {
|
|
166
|
+
const tbl = ident(plan.collection);
|
|
167
|
+
let rows;
|
|
168
|
+
if (queryVector) {
|
|
169
|
+
const useDistance = metric === "euclidean";
|
|
170
|
+
const fn = useDistance ? "vector::distance::euclidean" : "vector::similarity::cosine";
|
|
171
|
+
const order = useDistance ? "ASC" : "DESC";
|
|
172
|
+
rows = (await this.#query(`SELECT *, ${fn}(vec, $qv) AS __score FROM ${tbl} ORDER BY __score ${order};`, { qv: queryVector }))[0] ?? [];
|
|
173
|
+
const scored = rows.map((row) => ({
|
|
174
|
+
row,
|
|
175
|
+
score: this.#norm(Number(row.__score), metric)
|
|
176
|
+
}));
|
|
177
|
+
return (plan.filter ? scored.filter((s) => require_batteries_vector_filters.evaluateFilter(plan.filter, this.#parseMeta(s.row.metadata))) : scored).slice(offset, offset + plan.topK).map((s) => this.#project(s.row, plan, s.score));
|
|
178
|
+
} else {
|
|
179
|
+
rows = (await this.#query(`SELECT * FROM ${tbl};`))[0] ?? [];
|
|
180
|
+
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, void 0));
|
|
181
|
+
}
|
|
182
|
+
} catch (err) {
|
|
183
|
+
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_SEARCH_FAILED([String(err)]);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
#norm(raw, metric) {
|
|
187
|
+
if (metric === "euclidean") return 1 / (1 + raw);
|
|
188
|
+
return (raw + 1) / 2;
|
|
189
|
+
}
|
|
190
|
+
#parseMeta(val) {
|
|
191
|
+
if (typeof val === "string") try {
|
|
192
|
+
return JSON.parse(val);
|
|
193
|
+
} catch {
|
|
194
|
+
return {};
|
|
195
|
+
}
|
|
196
|
+
if (val && typeof val === "object") return val;
|
|
197
|
+
return {};
|
|
198
|
+
}
|
|
199
|
+
#project(row, plan, score) {
|
|
200
|
+
const proj = plan.projection;
|
|
201
|
+
const out = {};
|
|
202
|
+
if (proj.id) out.id = recordIdToString(row.id);
|
|
203
|
+
if (proj.vector && Array.isArray(row.vec)) out.vector = row.vec.map(Number);
|
|
204
|
+
if (proj.document) out.document = row.document ?? void 0;
|
|
205
|
+
if (proj.metadata) out.metadata = this.#parseMeta(row.metadata);
|
|
206
|
+
if (score !== void 0 && !Number.isNaN(score)) out.score = score;
|
|
207
|
+
return out;
|
|
208
|
+
}
|
|
209
|
+
async executeDelete(plan) {
|
|
210
|
+
try {
|
|
211
|
+
if (plan.ids && plan.ids.length > 0) for (const id of plan.ids) await this.#query(`DELETE type::thing($tbl, $rid);`, {
|
|
212
|
+
tbl: plan.collection,
|
|
213
|
+
rid: id
|
|
214
|
+
});
|
|
215
|
+
else if (plan.filter) {
|
|
216
|
+
const targets = ((await this.#query(`SELECT id, metadata FROM ${ident(plan.collection)};`))[0] ?? []).filter((row) => require_batteries_vector_filters.evaluateFilter(plan.filter, this.#parseMeta(row.metadata))).map((row) => recordIdToString(row.id));
|
|
217
|
+
for (const id of targets) await this.#query(`DELETE type::thing($tbl, $rid);`, {
|
|
218
|
+
tbl: plan.collection,
|
|
219
|
+
rid: id
|
|
220
|
+
});
|
|
221
|
+
} else await this.#query(`DELETE ${ident(plan.collection)};`);
|
|
222
|
+
} catch (err) {
|
|
223
|
+
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_DELETE_FAILED([String(err)]);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
};
|
|
227
|
+
//#endregion
|
|
228
|
+
exports.SurrealDBVectorStore = SurrealDBVectorStore;
|
|
229
|
+
|
|
230
|
+
//# sourceMappingURL=surrealdb.cjs.map
|