@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 @@
|
|
|
1
|
+
{"version":3,"file":"surrealdb.cjs","names":["#opts","#db","#ensure","#query","#dims","#norm","#parseMeta","#project"],"sources":["../../../src/batteries/vector/surrealdb/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/surrealdb\n *\n * SurrealDB adapter (multi-model). Each collection is a SurrealDB table; records store the\n * vector as a plain array field and KNN uses `vector::similarity::cosine` /\n * `vector::distance::euclidean` ordered appropriately. Metadata is a JSON string field filtered\n * with the neutral filter tree's JS reference evaluator for exact cross-adapter parity.\n *\n * Driver: `surrealdb` (pure JS). All queries are parameterized via `$bindings`.\n */\n\nimport { evaluateFilter } from '../filters'\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} from '../types'\n\nexport interface SurrealDBVectorStoreOptions extends BaseVectorStoreOptions {\n connection: {\n url: string\n username?: string\n password?: string\n namespace?: string\n database?: string\n }\n}\n\nconst getSurreal = async () => {\n try {\n const mod = await import('surrealdb')\n return mod.Surreal\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['surrealdb'])\n }\n}\n\n// Backtick-quoted SurrealQL identifier.\nconst ident = (name: string): string => '`' + name.replace(/`/g, '\\\\`') + '`'\n\n// Extract the bare id from a SurrealDB RecordId (object with .id) or a \"table:id\" string.\nconst recordIdToString = (rid: unknown): string => {\n if (rid && typeof rid === 'object' && 'id' in (rid as any)) {\n return String((rid as any).id)\n }\n const s = String(rid)\n const idx = s.indexOf(':')\n return idx >= 0 ? s.slice(idx + 1).replace(/^⟨|⟩$/g, '') : s\n}\n\nexport class SurrealDBVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: false,\n rawSql: false,\n builtInEncoding: false,\n // Synchronous over the RPC connection: 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(): SurrealDBVectorStoreOptions {\n return this.options as SurrealDBVectorStoreOptions\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 Surreal = await getSurreal()\n const c = this.#opts.connection\n try {\n this.#db = new Surreal()\n const rpc = c.url.replace(/\\/$/, '')\n await this.#db.connect(rpc.endsWith('/rpc') ? rpc : `${rpc}/rpc`)\n if (c.username) {\n await this.#db.signin({ username: c.username, password: c.password ?? '' })\n }\n await this.#db.use({ namespace: c.namespace ?? 'test', database: c.database ?? 'test' })\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n\n async close(): Promise<void> {\n if (this.#db) {\n await this.#db.close()\n this.#db = null\n }\n }\n\n async #ensure(): Promise<any> {\n if (!this.#db) await this.connect()\n return this.#db!\n }\n\n async #query(sql: string, vars?: Record<string, unknown>): Promise<any[]> {\n const db = await this.#ensure()\n const res = await db.query(sql, vars)\n return res as any[]\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(`DEFINE TABLE ${ine}${ident(spec.collection)} SCHEMALESS;`)\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(`REMOVE 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 try {\n const res = await this.#query('INFO FOR DB;')\n const info = res[0]\n const tables = info?.tables ?? info?.tb ?? {}\n return Object.prototype.hasOwnProperty.call(tables, 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', 'surrealdb'])\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 await this.#query(\n `UPSERT type::thing($tbl, $rid) SET vec = $vec, document = $document, metadata = $metadata;`,\n {\n tbl: plan.collection,\n rid: r.id,\n vec: vector,\n document: r.document ?? '',\n metadata: r.metadata ? JSON.stringify(r.metadata) : '{}',\n }\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 res = await this.#query(`SELECT vec FROM type::thing($tbl, $rid);`, {\n tbl: plan.collection,\n rid: plan.near.id,\n })\n const row = res[0]?.[0]\n if (!row) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = row.vec as number[]\n }\n }\n\n const offset = plan.offset ?? 0\n try {\n const tbl = ident(plan.collection)\n let rows: any[]\n if (queryVector) {\n // similarity::cosine (higher=better) for cosine/dot; distance::euclidean (lower=better) for l2.\n const useDistance = metric === 'euclidean'\n const fn = useDistance ? 'vector::distance::euclidean' : 'vector::similarity::cosine'\n const order = useDistance ? 'ASC' : 'DESC'\n const res = await this.#query(\n `SELECT *, ${fn}(vec, $qv) AS __score FROM ${tbl} ORDER BY __score ${order};`,\n { qv: queryVector }\n )\n rows = res[0] ?? []\n const scored = rows.map((row) => ({ row, score: this.#norm(Number(row.__score), metric) }))\n const filtered = plan.filter\n ? scored.filter((s) => evaluateFilter(plan.filter!, this.#parseMeta(s.row.metadata)))\n : scored\n return filtered\n .slice(offset, offset + plan.topK)\n .map((s) => this.#project(s.row, plan, s.score))\n } else {\n const res = await this.#query(`SELECT * FROM ${tbl};`)\n rows = res[0] ?? []\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, undefined))\n }\n } catch (err) {\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\n }\n\n // cosine similarity is already [-1,1]; map to [0,1]. euclidean distance → 1/(1+d).\n #norm(raw: number, metric: string): number {\n if (metric === 'euclidean') return 1 / (1 + raw)\n return (raw + 1) / 2\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, score: number | undefined): VectorMatch {\n const proj = plan.projection\n const out: VectorMatch = {}\n if (proj.id) out.id = recordIdToString(row.id)\n if (proj.vector && Array.isArray(row.vec)) out.vector = (row.vec as number[]).map(Number)\n if (proj.document) out.document = (row.document ?? undefined) as string | undefined\n if (proj.metadata) out.metadata = this.#parseMeta(row.metadata)\n if (score !== undefined && !Number.isNaN(score)) out.score = score\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n try {\n if (plan.ids && plan.ids.length > 0) {\n for (const id of plan.ids) {\n await this.#query(`DELETE type::thing($tbl, $rid);`, { tbl: plan.collection, rid: id })\n }\n } else if (plan.filter) {\n const res = await this.#query(`SELECT id, metadata FROM ${ident(plan.collection)};`)\n const rows = res[0] ?? []\n const targets = rows\n .filter((row: any) => evaluateFilter(plan.filter!, this.#parseMeta(row.metadata)))\n .map((row: any) => recordIdToString(row.id))\n for (const id of targets) {\n await this.#query(`DELETE type::thing($tbl, $rid);`, { tbl: plan.collection, rid: id })\n }\n } else {\n await this.#query(`DELETE ${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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"}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { s as isInstanceOf } from "../../tool_registry-D1pSSlsd.mjs";
|
|
2
|
+
import "../../guards.mjs";
|
|
3
|
+
import { evaluateFilter } from "./filters.mjs";
|
|
4
|
+
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";
|
|
5
|
+
import { BaseVectorStore } from "./contract.mjs";
|
|
6
|
+
import { validateRecords } from "./validation.mjs";
|
|
7
|
+
//#region src/batteries/vector/surrealdb/index.ts
|
|
8
|
+
/**
|
|
9
|
+
* @module @nhtio/adk/batteries/vector/surrealdb
|
|
10
|
+
*
|
|
11
|
+
* SurrealDB adapter (multi-model). Each collection is a SurrealDB table; records store the
|
|
12
|
+
* vector as a plain array field and KNN uses `vector::similarity::cosine` /
|
|
13
|
+
* `vector::distance::euclidean` ordered appropriately. Metadata is a JSON string field filtered
|
|
14
|
+
* with the neutral filter tree's JS reference evaluator for exact cross-adapter parity.
|
|
15
|
+
*
|
|
16
|
+
* Driver: `surrealdb` (pure JS). All queries are parameterized via `$bindings`.
|
|
17
|
+
*/
|
|
18
|
+
var getSurreal = async () => {
|
|
19
|
+
try {
|
|
20
|
+
return (await import("surrealdb")).Surreal;
|
|
21
|
+
} catch {
|
|
22
|
+
throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(["surrealdb"]);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
var ident = (name) => "`" + name.replace(/`/g, "\\`") + "`";
|
|
26
|
+
var recordIdToString = (rid) => {
|
|
27
|
+
if (rid && typeof rid === "object" && "id" in rid) return String(rid.id);
|
|
28
|
+
const s = String(rid);
|
|
29
|
+
const idx = s.indexOf(":");
|
|
30
|
+
return idx >= 0 ? s.slice(idx + 1).replace(/^⟨|⟩$/g, "") : s;
|
|
31
|
+
};
|
|
32
|
+
var SurrealDBVectorStore = class extends BaseVectorStore {
|
|
33
|
+
capabilities = {
|
|
34
|
+
transactions: false,
|
|
35
|
+
namedVectors: false,
|
|
36
|
+
rename: false,
|
|
37
|
+
rawSql: false,
|
|
38
|
+
builtInEncoding: false,
|
|
39
|
+
consistency: {
|
|
40
|
+
configurable: false,
|
|
41
|
+
default: "strong",
|
|
42
|
+
modes: ["strong"]
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
#db = 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.#db) return;
|
|
58
|
+
const Surreal = await getSurreal();
|
|
59
|
+
const c = this.#opts.connection;
|
|
60
|
+
try {
|
|
61
|
+
this.#db = new Surreal();
|
|
62
|
+
const rpc = c.url.replace(/\/$/, "");
|
|
63
|
+
await this.#db.connect(rpc.endsWith("/rpc") ? rpc : `${rpc}/rpc`);
|
|
64
|
+
if (c.username) await this.#db.signin({
|
|
65
|
+
username: c.username,
|
|
66
|
+
password: c.password ?? ""
|
|
67
|
+
});
|
|
68
|
+
await this.#db.use({
|
|
69
|
+
namespace: c.namespace ?? "test",
|
|
70
|
+
database: c.database ?? "test"
|
|
71
|
+
});
|
|
72
|
+
} catch (err) {
|
|
73
|
+
throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)]);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async close() {
|
|
77
|
+
if (this.#db) {
|
|
78
|
+
await this.#db.close();
|
|
79
|
+
this.#db = null;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
async #ensure() {
|
|
83
|
+
if (!this.#db) await this.connect();
|
|
84
|
+
return this.#db;
|
|
85
|
+
}
|
|
86
|
+
async #query(sql, vars) {
|
|
87
|
+
return await (await this.#ensure()).query(sql, vars);
|
|
88
|
+
}
|
|
89
|
+
async createCollection(spec, ifNotExists) {
|
|
90
|
+
this.#dims.set(spec.collection, spec.vector.dimensions);
|
|
91
|
+
const ine = ifNotExists ? "IF NOT EXISTS " : "";
|
|
92
|
+
try {
|
|
93
|
+
await this.#query(`DEFINE TABLE ${ine}${ident(spec.collection)} SCHEMALESS;`);
|
|
94
|
+
} catch (err) {
|
|
95
|
+
throw new E_VECTOR_STORE_COLLECTION_FAILED(["createCollection", String(err)]);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async dropCollection(collection, ifExists) {
|
|
99
|
+
const ie = ifExists ? "IF EXISTS " : "";
|
|
100
|
+
try {
|
|
101
|
+
await this.#query(`REMOVE TABLE ${ie}${ident(collection)};`);
|
|
102
|
+
this.#dims.delete(collection);
|
|
103
|
+
} catch (err) {
|
|
104
|
+
throw new E_VECTOR_STORE_COLLECTION_FAILED(["dropCollection", String(err)]);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
async hasCollection(collection) {
|
|
108
|
+
try {
|
|
109
|
+
const info = (await this.#query("INFO FOR DB;"))[0];
|
|
110
|
+
const tables = info?.tables ?? info?.tb ?? {};
|
|
111
|
+
return Object.prototype.hasOwnProperty.call(tables, collection);
|
|
112
|
+
} catch {
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
async renameCollection(_from, _to) {
|
|
117
|
+
throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(["renameCollection", "surrealdb"]);
|
|
118
|
+
}
|
|
119
|
+
async executeUpsert(plan) {
|
|
120
|
+
if (plan.records.length === 0) return;
|
|
121
|
+
validateRecords(plan.records);
|
|
122
|
+
const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection);
|
|
123
|
+
try {
|
|
124
|
+
for (const r of plan.records) {
|
|
125
|
+
let vector = r.vector;
|
|
126
|
+
if (!vector && r.document) {
|
|
127
|
+
const [v] = await this.encode([r.document], "document");
|
|
128
|
+
vector = v;
|
|
129
|
+
}
|
|
130
|
+
if (!vector) throw new E_VECTOR_STORE_UPSERT_FAILED(["Record missing vector and document"]);
|
|
131
|
+
if (expected !== void 0 && vector.length !== expected) throw new E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length]);
|
|
132
|
+
await this.#query(`UPSERT type::thing($tbl, $rid) SET vec = $vec, document = $document, metadata = $metadata;`, {
|
|
133
|
+
tbl: plan.collection,
|
|
134
|
+
rid: r.id,
|
|
135
|
+
vec: vector,
|
|
136
|
+
document: r.document ?? "",
|
|
137
|
+
metadata: r.metadata ? JSON.stringify(r.metadata) : "{}"
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
} catch (err) {
|
|
141
|
+
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;
|
|
142
|
+
throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)]);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
async executeSearch(plan) {
|
|
146
|
+
const metric = this.#opts.metric ?? "cosine";
|
|
147
|
+
let queryVector;
|
|
148
|
+
if (plan.near) {
|
|
149
|
+
if ("vector" in plan.near) queryVector = plan.near.vector;
|
|
150
|
+
else if ("serverText" in plan.near) {
|
|
151
|
+
const [v] = await this.encode([plan.near.serverText], "query");
|
|
152
|
+
queryVector = v;
|
|
153
|
+
} else if ("id" in plan.near) {
|
|
154
|
+
const row = (await this.#query(`SELECT vec FROM type::thing($tbl, $rid);`, {
|
|
155
|
+
tbl: plan.collection,
|
|
156
|
+
rid: plan.near.id
|
|
157
|
+
}))[0]?.[0];
|
|
158
|
+
if (!row) throw new E_VECTOR_STORE_SEARCH_FAILED(["Referenced id not found: " + plan.near.id]);
|
|
159
|
+
queryVector = row.vec;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
const offset = plan.offset ?? 0;
|
|
163
|
+
try {
|
|
164
|
+
const tbl = ident(plan.collection);
|
|
165
|
+
let rows;
|
|
166
|
+
if (queryVector) {
|
|
167
|
+
const useDistance = metric === "euclidean";
|
|
168
|
+
const fn = useDistance ? "vector::distance::euclidean" : "vector::similarity::cosine";
|
|
169
|
+
const order = useDistance ? "ASC" : "DESC";
|
|
170
|
+
rows = (await this.#query(`SELECT *, ${fn}(vec, $qv) AS __score FROM ${tbl} ORDER BY __score ${order};`, { qv: queryVector }))[0] ?? [];
|
|
171
|
+
const scored = rows.map((row) => ({
|
|
172
|
+
row,
|
|
173
|
+
score: this.#norm(Number(row.__score), metric)
|
|
174
|
+
}));
|
|
175
|
+
return (plan.filter ? scored.filter((s) => evaluateFilter(plan.filter, this.#parseMeta(s.row.metadata))) : scored).slice(offset, offset + plan.topK).map((s) => this.#project(s.row, plan, s.score));
|
|
176
|
+
} else {
|
|
177
|
+
rows = (await this.#query(`SELECT * FROM ${tbl};`))[0] ?? [];
|
|
178
|
+
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, void 0));
|
|
179
|
+
}
|
|
180
|
+
} catch (err) {
|
|
181
|
+
throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)]);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
#norm(raw, metric) {
|
|
185
|
+
if (metric === "euclidean") return 1 / (1 + raw);
|
|
186
|
+
return (raw + 1) / 2;
|
|
187
|
+
}
|
|
188
|
+
#parseMeta(val) {
|
|
189
|
+
if (typeof val === "string") try {
|
|
190
|
+
return JSON.parse(val);
|
|
191
|
+
} catch {
|
|
192
|
+
return {};
|
|
193
|
+
}
|
|
194
|
+
if (val && typeof val === "object") return val;
|
|
195
|
+
return {};
|
|
196
|
+
}
|
|
197
|
+
#project(row, plan, score) {
|
|
198
|
+
const proj = plan.projection;
|
|
199
|
+
const out = {};
|
|
200
|
+
if (proj.id) out.id = recordIdToString(row.id);
|
|
201
|
+
if (proj.vector && Array.isArray(row.vec)) out.vector = row.vec.map(Number);
|
|
202
|
+
if (proj.document) out.document = row.document ?? void 0;
|
|
203
|
+
if (proj.metadata) out.metadata = this.#parseMeta(row.metadata);
|
|
204
|
+
if (score !== void 0 && !Number.isNaN(score)) out.score = score;
|
|
205
|
+
return out;
|
|
206
|
+
}
|
|
207
|
+
async executeDelete(plan) {
|
|
208
|
+
try {
|
|
209
|
+
if (plan.ids && plan.ids.length > 0) for (const id of plan.ids) await this.#query(`DELETE type::thing($tbl, $rid);`, {
|
|
210
|
+
tbl: plan.collection,
|
|
211
|
+
rid: id
|
|
212
|
+
});
|
|
213
|
+
else if (plan.filter) {
|
|
214
|
+
const targets = ((await this.#query(`SELECT id, metadata FROM ${ident(plan.collection)};`))[0] ?? []).filter((row) => evaluateFilter(plan.filter, this.#parseMeta(row.metadata))).map((row) => recordIdToString(row.id));
|
|
215
|
+
for (const id of targets) await this.#query(`DELETE type::thing($tbl, $rid);`, {
|
|
216
|
+
tbl: plan.collection,
|
|
217
|
+
rid: id
|
|
218
|
+
});
|
|
219
|
+
} else await this.#query(`DELETE ${ident(plan.collection)};`);
|
|
220
|
+
} catch (err) {
|
|
221
|
+
throw new E_VECTOR_STORE_DELETE_FAILED([String(err)]);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
};
|
|
225
|
+
//#endregion
|
|
226
|
+
export { SurrealDBVectorStore };
|
|
227
|
+
|
|
228
|
+
//# sourceMappingURL=surrealdb.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surrealdb.mjs","names":["#opts","#db","#ensure","#query","#dims","#norm","#parseMeta","#project"],"sources":["../../../src/batteries/vector/surrealdb/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/surrealdb\n *\n * SurrealDB adapter (multi-model). Each collection is a SurrealDB table; records store the\n * vector as a plain array field and KNN uses `vector::similarity::cosine` /\n * `vector::distance::euclidean` ordered appropriately. Metadata is a JSON string field filtered\n * with the neutral filter tree's JS reference evaluator for exact cross-adapter parity.\n *\n * Driver: `surrealdb` (pure JS). All queries are parameterized via `$bindings`.\n */\n\nimport { evaluateFilter } from '../filters'\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} from '../types'\n\nexport interface SurrealDBVectorStoreOptions extends BaseVectorStoreOptions {\n connection: {\n url: string\n username?: string\n password?: string\n namespace?: string\n database?: string\n }\n}\n\nconst getSurreal = async () => {\n try {\n const mod = await import('surrealdb')\n return mod.Surreal\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['surrealdb'])\n }\n}\n\n// Backtick-quoted SurrealQL identifier.\nconst ident = (name: string): string => '`' + name.replace(/`/g, '\\\\`') + '`'\n\n// Extract the bare id from a SurrealDB RecordId (object with .id) or a \"table:id\" string.\nconst recordIdToString = (rid: unknown): string => {\n if (rid && typeof rid === 'object' && 'id' in (rid as any)) {\n return String((rid as any).id)\n }\n const s = String(rid)\n const idx = s.indexOf(':')\n return idx >= 0 ? s.slice(idx + 1).replace(/^⟨|⟩$/g, '') : s\n}\n\nexport class SurrealDBVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: false,\n rawSql: false,\n builtInEncoding: false,\n // Synchronous over the RPC connection: 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(): SurrealDBVectorStoreOptions {\n return this.options as SurrealDBVectorStoreOptions\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 Surreal = await getSurreal()\n const c = this.#opts.connection\n try {\n this.#db = new Surreal()\n const rpc = c.url.replace(/\\/$/, '')\n await this.#db.connect(rpc.endsWith('/rpc') ? rpc : `${rpc}/rpc`)\n if (c.username) {\n await this.#db.signin({ username: c.username, password: c.password ?? '' })\n }\n await this.#db.use({ namespace: c.namespace ?? 'test', database: c.database ?? 'test' })\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n\n async close(): Promise<void> {\n if (this.#db) {\n await this.#db.close()\n this.#db = null\n }\n }\n\n async #ensure(): Promise<any> {\n if (!this.#db) await this.connect()\n return this.#db!\n }\n\n async #query(sql: string, vars?: Record<string, unknown>): Promise<any[]> {\n const db = await this.#ensure()\n const res = await db.query(sql, vars)\n return res as any[]\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(`DEFINE TABLE ${ine}${ident(spec.collection)} SCHEMALESS;`)\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(`REMOVE 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 try {\n const res = await this.#query('INFO FOR DB;')\n const info = res[0]\n const tables = info?.tables ?? info?.tb ?? {}\n return Object.prototype.hasOwnProperty.call(tables, 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', 'surrealdb'])\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 await this.#query(\n `UPSERT type::thing($tbl, $rid) SET vec = $vec, document = $document, metadata = $metadata;`,\n {\n tbl: plan.collection,\n rid: r.id,\n vec: vector,\n document: r.document ?? '',\n metadata: r.metadata ? JSON.stringify(r.metadata) : '{}',\n }\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 res = await this.#query(`SELECT vec FROM type::thing($tbl, $rid);`, {\n tbl: plan.collection,\n rid: plan.near.id,\n })\n const row = res[0]?.[0]\n if (!row) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = row.vec as number[]\n }\n }\n\n const offset = plan.offset ?? 0\n try {\n const tbl = ident(plan.collection)\n let rows: any[]\n if (queryVector) {\n // similarity::cosine (higher=better) for cosine/dot; distance::euclidean (lower=better) for l2.\n const useDistance = metric === 'euclidean'\n const fn = useDistance ? 'vector::distance::euclidean' : 'vector::similarity::cosine'\n const order = useDistance ? 'ASC' : 'DESC'\n const res = await this.#query(\n `SELECT *, ${fn}(vec, $qv) AS __score FROM ${tbl} ORDER BY __score ${order};`,\n { qv: queryVector }\n )\n rows = res[0] ?? []\n const scored = rows.map((row) => ({ row, score: this.#norm(Number(row.__score), metric) }))\n const filtered = plan.filter\n ? scored.filter((s) => evaluateFilter(plan.filter!, this.#parseMeta(s.row.metadata)))\n : scored\n return filtered\n .slice(offset, offset + plan.topK)\n .map((s) => this.#project(s.row, plan, s.score))\n } else {\n const res = await this.#query(`SELECT * FROM ${tbl};`)\n rows = res[0] ?? []\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, undefined))\n }\n } catch (err) {\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\n }\n\n // cosine similarity is already [-1,1]; map to [0,1]. euclidean distance → 1/(1+d).\n #norm(raw: number, metric: string): number {\n if (metric === 'euclidean') return 1 / (1 + raw)\n return (raw + 1) / 2\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, score: number | undefined): VectorMatch {\n const proj = plan.projection\n const out: VectorMatch = {}\n if (proj.id) out.id = recordIdToString(row.id)\n if (proj.vector && Array.isArray(row.vec)) out.vector = (row.vec as number[]).map(Number)\n if (proj.document) out.document = (row.document ?? undefined) as string | undefined\n if (proj.metadata) out.metadata = this.#parseMeta(row.metadata)\n if (score !== undefined && !Number.isNaN(score)) out.score = score\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n try {\n if (plan.ids && plan.ids.length > 0) {\n for (const id of plan.ids) {\n await this.#query(`DELETE type::thing($tbl, $rid);`, { tbl: plan.collection, rid: id })\n }\n } else if (plan.filter) {\n const res = await this.#query(`SELECT id, metadata FROM ${ident(plan.collection)};`)\n const rows = res[0] ?? []\n const targets = rows\n .filter((row: any) => evaluateFilter(plan.filter!, this.#parseMeta(row.metadata)))\n .map((row: any) => recordIdToString(row.id))\n for (const id of targets) {\n await this.#query(`DELETE type::thing($tbl, $rid);`, { tbl: plan.collection, rid: id })\n }\n } else {\n await this.#query(`DELETE ${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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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for the vector storage provider battery.
|
|
3
|
+
*
|
|
4
|
+
* @module @nhtio/adk/batteries/vector/types
|
|
5
|
+
*
|
|
6
|
+
* @remarks
|
|
7
|
+
* This module owns the shared types and interfaces used by all vector storage adapters.
|
|
8
|
+
* It defines the core abstractions for vectors, metadata, search results, and adapter
|
|
9
|
+
* capabilities without any runtime logic or driver dependencies.
|
|
10
|
+
*/
|
|
11
|
+
/** Metric used to compare vectors during similarity search. */
|
|
12
|
+
export type DistanceMetric = 'cosine' | 'dot' | 'euclidean';
|
|
13
|
+
/** A metadata value may be a primitive, null, or a nested object/array of such values. */
|
|
14
|
+
export type VectorMetadataValue = string | number | boolean | null | VectorMetadataValue[] | {
|
|
15
|
+
[k: string]: VectorMetadataValue;
|
|
16
|
+
};
|
|
17
|
+
/** A flat or nested object mapping metadata keys to values. */
|
|
18
|
+
export type VectorMetadata = Record<string, VectorMetadataValue>;
|
|
19
|
+
/** A stored vector record. All fields are optional; at minimum, an id is required. */
|
|
20
|
+
export interface VectorRecord {
|
|
21
|
+
id: string;
|
|
22
|
+
vector?: number[];
|
|
23
|
+
document?: string;
|
|
24
|
+
metadata?: VectorMetadata;
|
|
25
|
+
}
|
|
26
|
+
/** A result row from a vector search or filter scan. All fields are opt-in via .select(). */
|
|
27
|
+
export interface VectorMatch {
|
|
28
|
+
id?: string;
|
|
29
|
+
score?: number;
|
|
30
|
+
metadata?: VectorMetadata;
|
|
31
|
+
document?: string;
|
|
32
|
+
vector?: number[];
|
|
33
|
+
}
|
|
34
|
+
/** Input to the encoder: either a raw vector array or raw text to be embedded. */
|
|
35
|
+
export type VectorInput = number[] | {
|
|
36
|
+
text: string;
|
|
37
|
+
};
|
|
38
|
+
/** Indicates whether text is being encoded as a query or as a document. */
|
|
39
|
+
export type EncodeKind = 'query' | 'document';
|
|
40
|
+
/** The BYO text-to-vector contract. Batch-shaped: one round-trip for many texts. */
|
|
41
|
+
export type VectorEncoderFn = (texts: string[], kind: EncodeKind) => Promise<number[][]>;
|
|
42
|
+
/** Fixed per-adapter capability flags (static truth about a backend). */
|
|
43
|
+
/**
|
|
44
|
+
* Read-after-write guarantee a write (`.upsert()` / `.delete()`) provides.
|
|
45
|
+
* 'strong' — the write Promise does not resolve until the change is confirmed
|
|
46
|
+
* visible to subsequent reads. On timeout it THROWS
|
|
47
|
+
* `E_VECTOR_STORE_CONSISTENCY_TIMEOUT` — never resolves unconfirmed.
|
|
48
|
+
* 'best-effort' — poll up to the bound, then resolve whether or not visibility was
|
|
49
|
+
* confirmed. The ONLY mode that may proceed unconfirmed, and only
|
|
50
|
+
* because the caller asked for it. NOTE: on an eventually-consistent
|
|
51
|
+
* backend a write-after-write race (e.g. deleting a just-upserted id
|
|
52
|
+
* from a concurrent writer) may not take effect — this mode does not
|
|
53
|
+
* detect it. Use 'strong' if you delete records you may have just written.
|
|
54
|
+
* 'eventual' — resolve on durable acknowledgement, with no visibility wait. Fastest;
|
|
55
|
+
* inherits the same write-after-write race as 'best-effort', silently.
|
|
56
|
+
*/
|
|
57
|
+
export type VectorConsistency = 'strong' | 'best-effort' | 'eventual';
|
|
58
|
+
/**
|
|
59
|
+
* How an adapter handles the {@link VectorConsistency} option.
|
|
60
|
+
* configurable:false → the backend is already strongly consistent (pgvector, sqlite-vec,
|
|
61
|
+
* in-memory, orama, …); the option is a no-op and `default` is always 'strong'.
|
|
62
|
+
* configurable:true → an eventually-consistent backend (Pinecone today; ElasticSearch /
|
|
63
|
+
* OpenSearch, Mongo Atlas Vector Search, multi-node Weaviate later) that honors the
|
|
64
|
+
* option. `default` is what applies when neither a per-operation `.consistency()` nor a
|
|
65
|
+
* store-level `consistency` option is set; `modes` enumerates what it accepts.
|
|
66
|
+
*/
|
|
67
|
+
export interface VectorConsistencyCapability {
|
|
68
|
+
configurable: boolean;
|
|
69
|
+
default: VectorConsistency;
|
|
70
|
+
modes: VectorConsistency[];
|
|
71
|
+
}
|
|
72
|
+
export interface VectorStoreCapabilities {
|
|
73
|
+
transactions: boolean;
|
|
74
|
+
namedVectors: boolean;
|
|
75
|
+
rename: boolean;
|
|
76
|
+
rawSql: boolean;
|
|
77
|
+
builtInEncoding: boolean;
|
|
78
|
+
consistency: VectorConsistencyCapability;
|
|
79
|
+
}
|
|
80
|
+
/** Shared base options every adapter extends with its own connection block. */
|
|
81
|
+
export interface BaseVectorStoreOptions {
|
|
82
|
+
metric?: DistanceMetric;
|
|
83
|
+
encoder?: VectorEncoderFn;
|
|
84
|
+
dimensions?: number;
|
|
85
|
+
defaultCollection?: string;
|
|
86
|
+
/**
|
|
87
|
+
* Store-wide read-after-write guarantee for writes. Overrides the adapter's declared
|
|
88
|
+
* {@link VectorStoreCapabilities.consistency} default; a per-operation `.consistency()`
|
|
89
|
+
* on the builder overrides this in turn (precedence: per-op > store option > adapter
|
|
90
|
+
* default). Ignored by strongly-consistent adapters. See {@link VectorConsistency}.
|
|
91
|
+
*/
|
|
92
|
+
consistency?: VectorConsistency;
|
|
93
|
+
}
|
|
94
|
+
/** Options for ensuring a collection exists. */
|
|
95
|
+
export interface EnsureCollectionOptions {
|
|
96
|
+
collection: string;
|
|
97
|
+
dimensions: number;
|
|
98
|
+
metric?: DistanceMetric;
|
|
99
|
+
ifNotExists?: boolean;
|
|
100
|
+
}
|
|
File without changes
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module @nhtio/adk/batteries/vector/typesense
|
|
3
|
+
*
|
|
4
|
+
* Typesense adapter. Each collection is a Typesense collection with a `float[]` vector field
|
|
5
|
+
* (native `vector_query` KNN). Metadata is stored as a JSON string field and filtered with
|
|
6
|
+
* the neutral filter tree's JS reference evaluator for exact cross-adapter parity (Typesense
|
|
7
|
+
* filter_by requires per-field schema declaration, which the neutral metadata model doesn't
|
|
8
|
+
* have). Document + id are plain fields.
|
|
9
|
+
*
|
|
10
|
+
* Driver: `typesense` (pure JS).
|
|
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 TypesenseVectorStoreOptions extends BaseVectorStoreOptions {
|
|
16
|
+
connection?: {
|
|
17
|
+
host?: string;
|
|
18
|
+
port?: number;
|
|
19
|
+
protocol?: string;
|
|
20
|
+
apiKey?: string;
|
|
21
|
+
url?: string;
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export declare class TypesenseVectorStore extends BaseVectorStore {
|
|
25
|
+
#private;
|
|
26
|
+
readonly capabilities: VectorStoreCapabilities;
|
|
27
|
+
static isAvailable(): boolean;
|
|
28
|
+
isAvailable(): boolean;
|
|
29
|
+
connect(): Promise<void>;
|
|
30
|
+
close(): Promise<void>;
|
|
31
|
+
createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void>;
|
|
32
|
+
dropCollection(collection: string, ifExists: boolean): Promise<void>;
|
|
33
|
+
hasCollection(collection: string): Promise<boolean>;
|
|
34
|
+
renameCollection(_from: string, _to: string): Promise<void>;
|
|
35
|
+
executeUpsert(plan: UpsertPlan): Promise<void>;
|
|
36
|
+
executeSearch(plan: SearchPlan): Promise<VectorMatch[]>;
|
|
37
|
+
executeDelete(plan: DeletePlan): Promise<void>;
|
|
38
|
+
}
|