@nhtio/adk 1.20260607.2 → 1.20260609.1
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 +230 -0
- package/batteries/embeddings/openai/adapter.cjs +1 -1
- package/batteries/embeddings/openai/adapter.mjs +1 -1
- package/batteries/embeddings/openai/exceptions.cjs +1 -1
- package/batteries/embeddings/openai/exceptions.mjs +1 -1
- package/batteries/embeddings/openai/types.d.ts +7 -0
- package/batteries/embeddings/webllm/adapter.cjs +1 -1
- package/batteries/embeddings/webllm/adapter.mjs +1 -1
- package/batteries/embeddings/webllm/exceptions.cjs +1 -1
- package/batteries/embeddings/webllm/exceptions.mjs +1 -1
- package/batteries/llm/chat_common/helpers.d.ts +165 -0
- package/batteries/llm/chat_common/types.d.ts +309 -0
- package/batteries/llm/index.d.ts +5 -0
- package/batteries/llm/ollama/adapter.cjs +736 -0
- package/batteries/llm/ollama/adapter.cjs.map +1 -0
- package/batteries/llm/ollama/adapter.d.ts +64 -0
- package/batteries/llm/ollama/adapter.mjs +734 -0
- package/batteries/llm/ollama/adapter.mjs.map +1 -0
- package/batteries/llm/ollama/exceptions.cjs +105 -0
- package/batteries/llm/ollama/exceptions.cjs.map +1 -0
- package/batteries/llm/ollama/exceptions.d.ts +112 -0
- package/batteries/llm/ollama/exceptions.mjs +96 -0
- package/batteries/llm/ollama/exceptions.mjs.map +1 -0
- package/batteries/llm/ollama/helpers.cjs +487 -0
- package/batteries/llm/ollama/helpers.cjs.map +1 -0
- package/batteries/llm/ollama/helpers.d.ts +158 -0
- package/batteries/llm/ollama/helpers.mjs +450 -0
- package/batteries/llm/ollama/helpers.mjs.map +1 -0
- package/batteries/llm/ollama/index.d.ts +29 -0
- package/batteries/llm/ollama/types.cjs +2 -0
- package/batteries/llm/ollama/types.d.ts +334 -0
- package/batteries/llm/ollama/types.mjs +0 -0
- package/batteries/llm/ollama/validation.cjs +130 -0
- package/batteries/llm/ollama/validation.cjs.map +1 -0
- package/batteries/llm/ollama/validation.d.ts +31 -0
- package/batteries/llm/ollama/validation.mjs +127 -0
- package/batteries/llm/ollama/validation.mjs.map +1 -0
- package/batteries/llm/ollama.cjs +54 -0
- package/batteries/llm/ollama.mjs +6 -0
- package/batteries/llm/openai_chat_completions/adapter.cjs +36 -19
- package/batteries/llm/openai_chat_completions/adapter.cjs.map +1 -1
- package/batteries/llm/openai_chat_completions/adapter.mjs +23 -6
- package/batteries/llm/openai_chat_completions/adapter.mjs.map +1 -1
- package/batteries/llm/openai_chat_completions/exceptions.cjs +1 -1
- package/batteries/llm/openai_chat_completions/exceptions.mjs +1 -1
- package/batteries/llm/openai_chat_completions/helpers.cjs +80 -320
- package/batteries/llm/openai_chat_completions/helpers.cjs.map +1 -1
- package/batteries/llm/openai_chat_completions/helpers.d.ts +68 -144
- package/batteries/llm/openai_chat_completions/helpers.mjs +40 -280
- package/batteries/llm/openai_chat_completions/helpers.mjs.map +1 -1
- package/batteries/llm/openai_chat_completions/types.d.ts +273 -181
- 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/openai_chat_completions.cjs +29 -28
- package/batteries/llm/openai_chat_completions.mjs +2 -1
- package/batteries/llm/webllm_chat_completions/adapter.cjs +38 -19
- package/batteries/llm/webllm_chat_completions/adapter.cjs.map +1 -1
- package/batteries/llm/webllm_chat_completions/adapter.d.ts +18 -0
- package/batteries/llm/webllm_chat_completions/adapter.mjs +25 -6
- package/batteries/llm/webllm_chat_completions/adapter.mjs.map +1 -1
- package/batteries/llm/webllm_chat_completions/exceptions.cjs +1 -1
- package/batteries/llm/webllm_chat_completions/exceptions.mjs +1 -1
- package/batteries/llm/webllm_chat_completions/helpers.cjs +29 -28
- package/batteries/llm/webllm_chat_completions/helpers.mjs +2 -1
- package/batteries/llm/webllm_chat_completions/types.d.ts +21 -0
- package/batteries/llm/webllm_chat_completions/validation.cjs +13 -1
- package/batteries/llm/webllm_chat_completions/validation.cjs.map +1 -1
- package/batteries/llm/webllm_chat_completions/validation.d.ts +12 -0
- package/batteries/llm/webllm_chat_completions/validation.mjs +13 -1
- package/batteries/llm/webllm_chat_completions/validation.mjs.map +1 -1
- package/batteries/llm/webllm_chat_completions.cjs +29 -28
- package/batteries/llm/webllm_chat_completions.mjs +2 -1
- package/batteries/llm.cjs +44 -28
- package/batteries/llm.mjs +9 -4
- package/batteries/storage/flydrive.cjs +1 -1
- package/batteries/storage/flydrive.mjs +1 -1
- package/batteries/storage/in_memory/index.d.ts +1 -1
- package/batteries/storage/in_memory.cjs +2 -2
- package/batteries/storage/in_memory.cjs.map +1 -1
- package/batteries/storage/in_memory.mjs +2 -2
- package/batteries/storage/in_memory.mjs.map +1 -1
- package/batteries/storage/opfs/index.d.ts +19 -0
- package/batteries/storage/opfs.cjs +1 -1
- package/batteries/storage/opfs.cjs.map +1 -1
- package/batteries/storage/opfs.mjs +1 -1
- package/batteries/storage/opfs.mjs.map +1 -1
- package/batteries/tools/_shared/index.d.ts +121 -0
- package/batteries/tools/_shared.cjs +157 -0
- package/batteries/tools/_shared.cjs.map +1 -0
- package/batteries/tools/_shared.mjs +149 -0
- package/batteries/tools/_shared.mjs.map +1 -0
- package/batteries/tools/color.cjs +3 -2
- package/batteries/tools/color.cjs.map +1 -1
- package/batteries/tools/color.mjs +3 -2
- package/batteries/tools/color.mjs.map +1 -1
- package/batteries/tools/comparison.cjs +4 -3
- package/batteries/tools/comparison.cjs.map +1 -1
- package/batteries/tools/comparison.mjs +4 -3
- package/batteries/tools/comparison.mjs.map +1 -1
- package/batteries/tools/data_structure.cjs +30 -10
- package/batteries/tools/data_structure.cjs.map +1 -1
- package/batteries/tools/data_structure.mjs +30 -10
- package/batteries/tools/data_structure.mjs.map +1 -1
- package/batteries/tools/datetime_extended.cjs +5 -10
- package/batteries/tools/datetime_extended.cjs.map +1 -1
- package/batteries/tools/datetime_extended.mjs +5 -10
- package/batteries/tools/datetime_extended.mjs.map +1 -1
- package/batteries/tools/datetime_math.cjs +2 -2
- package/batteries/tools/datetime_math.mjs +2 -2
- package/batteries/tools/encoding.cjs +13 -4
- package/batteries/tools/encoding.cjs.map +1 -1
- package/batteries/tools/encoding.mjs +13 -4
- package/batteries/tools/encoding.mjs.map +1 -1
- package/batteries/tools/formatting.cjs +4 -4
- package/batteries/tools/formatting.cjs.map +1 -1
- package/batteries/tools/formatting.mjs +4 -4
- package/batteries/tools/formatting.mjs.map +1 -1
- package/batteries/tools/geo_basics.cjs +2 -2
- package/batteries/tools/geo_basics.mjs +2 -2
- package/batteries/tools/index.d.ts +3 -0
- package/batteries/tools/math.cjs +10 -8
- package/batteries/tools/math.cjs.map +1 -1
- package/batteries/tools/math.mjs +10 -8
- 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 +9 -5
- package/batteries/tools/parsing.cjs.map +1 -1
- package/batteries/tools/parsing.mjs +9 -5
- package/batteries/tools/parsing.mjs.map +1 -1
- package/batteries/tools/retrievables.cjs +4 -4
- package/batteries/tools/retrievables.mjs +4 -4
- package/batteries/tools/scrapper/exceptions.d.ts +21 -0
- package/batteries/tools/scrapper/index.d.ts +172 -0
- package/batteries/tools/scrapper/shared.d.ts +139 -0
- package/batteries/tools/scrapper.cjs +8 -0
- package/batteries/tools/scrapper.mjs +2 -0
- package/batteries/tools/searxng/exceptions.d.ts +21 -0
- package/batteries/tools/searxng/index.d.ts +177 -0
- package/batteries/tools/searxng.cjs +6 -0
- package/batteries/tools/searxng.mjs +2 -0
- package/batteries/tools/standing_instructions.cjs +4 -4
- package/batteries/tools/standing_instructions.mjs +4 -4
- package/batteries/tools/statistics.cjs +54 -43
- package/batteries/tools/statistics.cjs.map +1 -1
- package/batteries/tools/statistics.mjs +54 -43
- package/batteries/tools/statistics.mjs.map +1 -1
- package/batteries/tools/string_processing.cjs +5 -5
- package/batteries/tools/string_processing.cjs.map +1 -1
- package/batteries/tools/string_processing.mjs +5 -5
- package/batteries/tools/string_processing.mjs.map +1 -1
- package/batteries/tools/structured_data.cjs +8 -13
- package/batteries/tools/structured_data.cjs.map +1 -1
- package/batteries/tools/structured_data.mjs +8 -13
- package/batteries/tools/structured_data.mjs.map +1 -1
- 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 +10 -8
- package/batteries/tools/unit_conversion.cjs.map +1 -1
- package/batteries/tools/unit_conversion.mjs +10 -8
- package/batteries/tools/unit_conversion.mjs.map +1 -1
- package/batteries/tools/web_retrieval/index.d.ts +186 -0
- package/batteries/tools/web_retrieval.cjs +206 -0
- package/batteries/tools/web_retrieval.cjs.map +1 -0
- package/batteries/tools/web_retrieval.mjs +201 -0
- package/batteries/tools/web_retrieval.mjs.map +1 -0
- package/batteries/tools.cjs +15 -0
- package/batteries/tools.mjs +4 -1
- package/batteries/vector/arangodb/index.d.ts +2 -0
- package/batteries/vector/arangodb.cjs +2 -1
- package/batteries/vector/arangodb.cjs.map +1 -1
- package/batteries/vector/arangodb.mjs +2 -1
- package/batteries/vector/arangodb.mjs.map +1 -1
- package/batteries/vector/builder.cjs +31 -0
- package/batteries/vector/builder.cjs.map +1 -1
- package/batteries/vector/builder.d.ts +58 -0
- package/batteries/vector/builder.mjs +31 -0
- package/batteries/vector/builder.mjs.map +1 -1
- package/batteries/vector/chroma/index.d.ts +4 -0
- package/batteries/vector/chroma.cjs +3 -0
- package/batteries/vector/chroma.cjs.map +1 -1
- package/batteries/vector/chroma.mjs +3 -0
- package/batteries/vector/chroma.mjs.map +1 -1
- package/batteries/vector/clickhouse/index.d.ts +2 -0
- package/batteries/vector/clickhouse.cjs +2 -1
- package/batteries/vector/clickhouse.cjs.map +1 -1
- package/batteries/vector/clickhouse.mjs +2 -1
- package/batteries/vector/clickhouse.mjs.map +1 -1
- package/batteries/vector/cloudflare/index.d.ts +2 -0
- package/batteries/vector/cloudflare.cjs +2 -1
- package/batteries/vector/cloudflare.cjs.map +1 -1
- package/batteries/vector/cloudflare.mjs +2 -1
- package/batteries/vector/cloudflare.mjs.map +1 -1
- package/batteries/vector/conformance/index.d.ts +22 -0
- package/batteries/vector/conformance.cjs +22 -0
- package/batteries/vector/conformance.cjs.map +1 -1
- package/batteries/vector/conformance.mjs +22 -0
- package/batteries/vector/conformance.mjs.map +1 -1
- package/batteries/vector/contract.cjs +22 -0
- package/batteries/vector/contract.cjs.map +1 -1
- package/batteries/vector/contract.d.ts +51 -0
- package/batteries/vector/contract.mjs +22 -0
- package/batteries/vector/contract.mjs.map +1 -1
- package/batteries/vector/couchbase/index.d.ts +2 -0
- package/batteries/vector/couchbase.cjs +2 -1
- package/batteries/vector/couchbase.cjs.map +1 -1
- package/batteries/vector/couchbase.mjs +2 -1
- package/batteries/vector/couchbase.mjs.map +1 -1
- package/batteries/vector/duckdb/index.d.ts +2 -0
- package/batteries/vector/duckdb.cjs +2 -1
- package/batteries/vector/duckdb.cjs.map +1 -1
- package/batteries/vector/duckdb.mjs +2 -1
- package/batteries/vector/duckdb.mjs.map +1 -1
- package/batteries/vector/elasticsearch/index.d.ts +2 -0
- package/batteries/vector/elasticsearch.cjs +2 -1
- package/batteries/vector/elasticsearch.cjs.map +1 -1
- package/batteries/vector/elasticsearch.mjs +2 -1
- package/batteries/vector/elasticsearch.mjs.map +1 -1
- package/batteries/vector/exceptions.cjs +1 -1
- package/batteries/vector/exceptions.mjs +1 -1
- package/batteries/vector/factory.cjs +6 -0
- package/batteries/vector/factory.cjs.map +1 -1
- package/batteries/vector/factory.d.ts +14 -0
- package/batteries/vector/factory.mjs +6 -0
- package/batteries/vector/factory.mjs.map +1 -1
- package/batteries/vector/filters.cjs +22 -1
- package/batteries/vector/filters.cjs.map +1 -1
- package/batteries/vector/filters.d.ts +38 -0
- package/batteries/vector/filters.mjs +22 -1
- package/batteries/vector/filters.mjs.map +1 -1
- package/batteries/vector/helpers.cjs +13 -0
- package/batteries/vector/helpers.cjs.map +1 -1
- package/batteries/vector/helpers.d.ts +14 -0
- package/batteries/vector/helpers.mjs +13 -0
- package/batteries/vector/helpers.mjs.map +1 -1
- package/batteries/vector/hnswlib/index.d.ts +2 -0
- package/batteries/vector/hnswlib.cjs +2 -1
- package/batteries/vector/hnswlib.cjs.map +1 -1
- package/batteries/vector/hnswlib.mjs +2 -1
- package/batteries/vector/hnswlib.mjs.map +1 -1
- package/batteries/vector/in_memory/index.d.ts +1 -0
- package/batteries/vector/in_memory.cjs +1 -0
- package/batteries/vector/in_memory.cjs.map +1 -1
- package/batteries/vector/in_memory.mjs +1 -0
- package/batteries/vector/in_memory.mjs.map +1 -1
- package/batteries/vector/lancedb/index.d.ts +2 -0
- package/batteries/vector/lancedb.cjs +2 -1
- package/batteries/vector/lancedb.cjs.map +1 -1
- package/batteries/vector/lancedb.mjs +2 -1
- package/batteries/vector/lancedb.mjs.map +1 -1
- package/batteries/vector/mariadb/index.d.ts +2 -0
- package/batteries/vector/mariadb.cjs +2 -1
- package/batteries/vector/mariadb.cjs.map +1 -1
- package/batteries/vector/mariadb.mjs +2 -1
- package/batteries/vector/mariadb.mjs.map +1 -1
- package/batteries/vector/meilisearch/index.d.ts +2 -0
- package/batteries/vector/meilisearch.cjs +2 -1
- package/batteries/vector/meilisearch.cjs.map +1 -1
- package/batteries/vector/meilisearch.mjs +2 -1
- package/batteries/vector/meilisearch.mjs.map +1 -1
- package/batteries/vector/migrate.cjs +18 -1
- package/batteries/vector/migrate.cjs.map +1 -1
- package/batteries/vector/migrate.d.ts +31 -0
- package/batteries/vector/migrate.mjs +18 -1
- package/batteries/vector/migrate.mjs.map +1 -1
- package/batteries/vector/milvus/index.d.ts +5 -0
- package/batteries/vector/milvus.cjs +4 -0
- package/batteries/vector/milvus.cjs.map +1 -1
- package/batteries/vector/milvus.mjs +4 -0
- package/batteries/vector/milvus.mjs.map +1 -1
- package/batteries/vector/mongodb/index.d.ts +2 -0
- package/batteries/vector/mongodb.cjs +2 -1
- package/batteries/vector/mongodb.cjs.map +1 -1
- package/batteries/vector/mongodb.mjs +2 -1
- package/batteries/vector/mongodb.mjs.map +1 -1
- package/batteries/vector/neo4j/index.d.ts +2 -0
- package/batteries/vector/neo4j.cjs +2 -1
- package/batteries/vector/neo4j.cjs.map +1 -1
- package/batteries/vector/neo4j.mjs +2 -1
- package/batteries/vector/neo4j.mjs.map +1 -1
- package/batteries/vector/opensearch/index.d.ts +2 -0
- package/batteries/vector/opensearch.cjs +2 -1
- package/batteries/vector/opensearch.cjs.map +1 -1
- package/batteries/vector/opensearch.mjs +2 -1
- package/batteries/vector/opensearch.mjs.map +1 -1
- package/batteries/vector/oracle23ai/index.d.ts +2 -0
- package/batteries/vector/oracle23ai.cjs +2 -1
- package/batteries/vector/oracle23ai.cjs.map +1 -1
- package/batteries/vector/oracle23ai.mjs +2 -1
- package/batteries/vector/oracle23ai.mjs.map +1 -1
- package/batteries/vector/orama/index.d.ts +1 -0
- package/batteries/vector/orama.cjs +1 -0
- package/batteries/vector/orama.cjs.map +1 -1
- package/batteries/vector/orama.mjs +1 -0
- package/batteries/vector/orama.mjs.map +1 -1
- package/batteries/vector/pgvector/index.d.ts +9 -2
- package/batteries/vector/pgvector.cjs +4 -0
- package/batteries/vector/pgvector.cjs.map +1 -1
- package/batteries/vector/pgvector.mjs +4 -0
- package/batteries/vector/pgvector.mjs.map +1 -1
- package/batteries/vector/pinecone/index.d.ts +5 -0
- package/batteries/vector/pinecone.cjs +3 -1
- package/batteries/vector/pinecone.cjs.map +1 -1
- package/batteries/vector/pinecone.mjs +3 -1
- package/batteries/vector/pinecone.mjs.map +1 -1
- package/batteries/vector/plan.d.ts +27 -0
- package/batteries/vector/qdrant/index.d.ts +5 -0
- package/batteries/vector/qdrant.cjs +4 -0
- package/batteries/vector/qdrant.cjs.map +1 -1
- package/batteries/vector/qdrant.mjs +4 -0
- package/batteries/vector/qdrant.mjs.map +1 -1
- package/batteries/vector/redis/index.d.ts +2 -0
- package/batteries/vector/redis.cjs +2 -1
- package/batteries/vector/redis.cjs.map +1 -1
- package/batteries/vector/redis.mjs +2 -1
- package/batteries/vector/redis.mjs.map +1 -1
- package/batteries/vector/retrievable.cjs +9 -1
- package/batteries/vector/retrievable.cjs.map +1 -1
- package/batteries/vector/retrievable.mjs +9 -1
- package/batteries/vector/retrievable.mjs.map +1 -1
- package/batteries/vector/retrievable_glue.d.ts +21 -0
- package/batteries/vector/s3vectors/index.d.ts +2 -0
- package/batteries/vector/s3vectors.cjs +2 -1
- package/batteries/vector/s3vectors.cjs.map +1 -1
- package/batteries/vector/s3vectors.mjs +2 -1
- package/batteries/vector/s3vectors.mjs.map +1 -1
- package/batteries/vector/schema.cjs +28 -0
- package/batteries/vector/schema.cjs.map +1 -1
- package/batteries/vector/schema.d.ts +39 -0
- package/batteries/vector/schema.mjs +28 -0
- package/batteries/vector/schema.mjs.map +1 -1
- package/batteries/vector/solr/index.d.ts +2 -0
- package/batteries/vector/solr.cjs +2 -1
- package/batteries/vector/solr.cjs.map +1 -1
- package/batteries/vector/solr.mjs +2 -1
- package/batteries/vector/solr.mjs.map +1 -1
- package/batteries/vector/sqlite_vec/index.d.ts +6 -3
- package/batteries/vector/sqlite_vec.cjs +2 -0
- package/batteries/vector/sqlite_vec.cjs.map +1 -1
- package/batteries/vector/sqlite_vec.mjs +2 -0
- package/batteries/vector/sqlite_vec.mjs.map +1 -1
- package/batteries/vector/surrealdb/index.d.ts +2 -0
- package/batteries/vector/surrealdb.cjs +2 -1
- package/batteries/vector/surrealdb.cjs.map +1 -1
- package/batteries/vector/surrealdb.mjs +2 -1
- package/batteries/vector/surrealdb.mjs.map +1 -1
- package/batteries/vector/types.d.ts +27 -0
- package/batteries/vector/typesense/index.d.ts +2 -0
- package/batteries/vector/typesense.cjs +2 -1
- package/batteries/vector/typesense.cjs.map +1 -1
- package/batteries/vector/typesense.mjs +2 -1
- package/batteries/vector/typesense.mjs.map +1 -1
- package/batteries/vector/validation.cjs +14 -0
- package/batteries/vector/validation.cjs.map +1 -1
- package/batteries/vector/validation.d.ts +14 -0
- package/batteries/vector/validation.mjs +14 -0
- package/batteries/vector/validation.mjs.map +1 -1
- package/batteries/vector/vector_store_constructor.cjs +1 -1
- package/batteries/vector/vector_store_constructor.cjs.map +1 -1
- package/batteries/vector/vector_store_constructor.d.ts +1 -1
- package/batteries/vector/vector_store_constructor.mjs +1 -1
- package/batteries/vector/vector_store_constructor.mjs.map +1 -1
- package/batteries/vector/vespa/index.d.ts +2 -0
- package/batteries/vector/vespa.cjs +2 -1
- package/batteries/vector/vespa.cjs.map +1 -1
- package/batteries/vector/vespa.mjs +2 -1
- package/batteries/vector/vespa.mjs.map +1 -1
- package/batteries/vector/weaviate/index.d.ts +2 -0
- package/batteries/vector/weaviate.cjs +2 -1
- package/batteries/vector/weaviate.cjs.map +1 -1
- package/batteries/vector/weaviate.mjs +2 -1
- package/batteries/vector/weaviate.mjs.map +1 -1
- package/batteries.cjs +58 -28
- package/batteries.mjs +12 -5
- package/{common-BT0nfCi9.mjs → common-DYDUi99O.mjs} +9 -9
- package/common-DYDUi99O.mjs.map +1 -0
- package/{common-Cj8TaQ9U.js → common-DZl3ADJs.js} +9 -9
- package/common-DZl3ADJs.js.map +1 -0
- package/common.cjs +7 -7
- package/common.mjs +7 -7
- package/{dispatch_runner-DPcS7Y_M.mjs → dispatch_runner--ZhdDWRZ.mjs} +27 -5
- package/{dispatch_runner-DPcS7Y_M.mjs.map → dispatch_runner--ZhdDWRZ.mjs.map} +1 -1
- package/{dispatch_runner-BHBNupqp.js → dispatch_runner-nHDKkxye.js} +27 -5
- package/{dispatch_runner-BHBNupqp.js.map → dispatch_runner-nHDKkxye.js.map} +1 -1
- package/dispatch_runner.cjs +1 -1
- package/dispatch_runner.d.ts +1 -1
- package/dispatch_runner.mjs +1 -1
- package/eslint/rules/artifact_tool_forbids_artifact_constructor.cjs +1 -0
- package/eslint/rules/artifact_tool_forbids_artifact_constructor.cjs.map +1 -1
- package/eslint/rules/artifact_tool_forbids_artifact_constructor.d.ts +1 -0
- package/eslint/rules/artifact_tool_forbids_artifact_constructor.mjs +1 -0
- package/eslint/rules/artifact_tool_forbids_artifact_constructor.mjs.map +1 -1
- package/eslint/rules/no_model_in_tool_handler.cjs +1 -0
- package/eslint/rules/no_model_in_tool_handler.cjs.map +1 -1
- package/eslint/rules/no_model_in_tool_handler.d.ts +1 -0
- package/eslint/rules/no_model_in_tool_handler.mjs +1 -0
- package/eslint/rules/no_model_in_tool_handler.mjs.map +1 -1
- package/eslint/rules/require_validator_any_required.cjs +1 -0
- package/eslint/rules/require_validator_any_required.cjs.map +1 -1
- package/eslint/rules/require_validator_any_required.d.ts +1 -0
- package/eslint/rules/require_validator_any_required.mjs +1 -0
- package/eslint/rules/require_validator_any_required.mjs.map +1 -1
- package/eslint/rules/thought_payload_requires_replay_tag.cjs +1 -0
- package/eslint/rules/thought_payload_requires_replay_tag.cjs.map +1 -1
- package/eslint/rules/thought_payload_requires_replay_tag.d.ts +1 -0
- package/eslint/rules/thought_payload_requires_replay_tag.mjs +1 -0
- package/eslint/rules/thought_payload_requires_replay_tag.mjs.map +1 -1
- package/eslint/rules/token_encoding_requires_context_window.cjs +1 -0
- package/eslint/rules/token_encoding_requires_context_window.cjs.map +1 -1
- package/eslint/rules/token_encoding_requires_context_window.d.ts +1 -0
- package/eslint/rules/token_encoding_requires_context_window.mjs +1 -0
- package/eslint/rules/token_encoding_requires_context_window.mjs.map +1 -1
- package/eslint/rules.cjs +1 -1
- package/eslint/rules.mjs +1 -1
- package/eslint.cjs +2 -2
- package/eslint.mjs +2 -2
- package/{exceptions-BeWH2FwP.mjs → exceptions-BDhN0Xzr.mjs} +3 -2
- package/exceptions-BDhN0Xzr.mjs.map +1 -0
- package/{exceptions-CitH5wZI.js → exceptions-BRXrUKiW.js} +3 -2
- package/exceptions-BRXrUKiW.js.map +1 -0
- package/exceptions.cjs +2 -2
- package/exceptions.mjs +2 -2
- package/factories.cjs +1 -1
- package/factories.mjs +1 -1
- package/forge.cjs +4 -4
- package/forge.d.ts +1 -1
- package/forge.mjs +4 -4
- package/guards.cjs +9 -9
- package/guards.mjs +9 -9
- package/helpers-DSTFxTiC.js +497 -0
- package/helpers-DSTFxTiC.js.map +1 -0
- package/helpers-xhrQbMAG.mjs +306 -0
- package/helpers-xhrQbMAG.mjs.map +1 -0
- package/index.cjs +12 -12
- package/index.mjs +12 -12
- package/lib/classes/base_exception.d.ts +1 -0
- package/lib/classes/media.d.ts +10 -0
- package/lib/classes/retrievable.d.ts +1 -1
- package/lib/classes/spooled_json_artifact.d.ts +1 -1
- package/lib/classes/spooled_markdown_artifact.d.ts +1 -0
- package/lib/classes/tokenizable.d.ts +3 -0
- package/lib/classes/tool.d.ts +8 -0
- package/lib/classes/turn_gate.d.ts +6 -0
- package/lib/dispatch_runner.d.ts +4 -32
- package/lib/helpers/bignum.cjs +82 -0
- package/lib/helpers/bignum.cjs.map +1 -0
- package/lib/helpers/bignum.d.ts +52 -0
- package/lib/helpers/bignum.mjs +74 -0
- package/lib/helpers/bignum.mjs.map +1 -0
- package/lib/turn_runner.d.ts +1 -1
- package/lib/types/dispatch_runner.d.ts +83 -0
- package/lib/utils/exceptions.d.ts +1 -1
- package/lib/utils/retry.cjs.map +1 -1
- package/lib/utils/retry.d.ts +2 -0
- package/lib/utils/retry.mjs.map +1 -1
- package/mcp/adk-docs-corpus.json +1 -1
- package/package.json +259 -204
- package/{runtime-j92CNi5z.mjs → runtime-Bz5zA8wc.mjs} +2 -2
- package/{runtime-j92CNi5z.mjs.map → runtime-Bz5zA8wc.mjs.map} +1 -1
- package/{runtime-MFFcJrRv.js → runtime-DslE1aBw.js} +2 -2
- package/{runtime-MFFcJrRv.js.map → runtime-DslE1aBw.js.map} +1 -1
- package/scrapper-BHM1mCde.mjs +432 -0
- package/scrapper-BHM1mCde.mjs.map +1 -0
- package/scrapper-BeweWurk.js +462 -0
- package/scrapper-BeweWurk.js.map +1 -0
- package/searxng-BJFulNcK.mjs +247 -0
- package/searxng-BJFulNcK.mjs.map +1 -0
- package/searxng-B_D--V5q.js +265 -0
- package/searxng-B_D--V5q.js.map +1 -0
- package/skills/adk-assembly/SKILL.md +2 -2
- package/{spooled_artifact-CHoZgWwI.mjs → spooled_artifact-7eePq7JA.mjs} +5 -5
- package/{spooled_artifact-CHoZgWwI.mjs.map → spooled_artifact-7eePq7JA.mjs.map} +1 -1
- package/{spooled_artifact-BTq6Nzfy.js → spooled_artifact-DX8LLyUX.js} +5 -5
- package/{spooled_artifact-BTq6Nzfy.js.map → spooled_artifact-DX8LLyUX.js.map} +1 -1
- package/spooled_artifact.cjs +2 -2
- package/spooled_artifact.mjs +2 -2
- package/{spooled_markdown_artifact-CALSDxIx.js → spooled_markdown_artifact-ClX72lek.js} +4 -4
- package/spooled_markdown_artifact-ClX72lek.js.map +1 -0
- package/{spooled_markdown_artifact-Ci5UL7l4.mjs → spooled_markdown_artifact-wkrBF3oX.mjs} +4 -4
- package/spooled_markdown_artifact-wkrBF3oX.mjs.map +1 -0
- package/{thought-D34QQZZ9.mjs → thought-B_vxAiKU.mjs} +5 -5
- package/{thought-D34QQZZ9.mjs.map → thought-B_vxAiKU.mjs.map} +1 -1
- package/{thought-BbwhJ1wb.js → thought-DLwpF7MI.js} +5 -5
- package/{thought-BbwhJ1wb.js.map → thought-DLwpF7MI.js.map} +1 -1
- package/{tool-CVyZkFC7.js → tool-D5WGVIcI.js} +4 -4
- package/{tool-CVyZkFC7.js.map → tool-D5WGVIcI.js.map} +1 -1
- package/{tool-CMhaDRNd.mjs → tool-wMYMVl60.mjs} +4 -4
- package/{tool-CMhaDRNd.mjs.map → tool-wMYMVl60.mjs.map} +1 -1
- package/{tool_call-CV5qVNlb.mjs → tool_call-B4-_-vjG.mjs} +5 -5
- package/tool_call-B4-_-vjG.mjs.map +1 -0
- package/{tool_call-Db68hB7y.js → tool_call-DixVlW40.js} +5 -5
- package/tool_call-DixVlW40.js.map +1 -0
- package/{tool_registry-D1pSSlsd.mjs → tool_registry-791Vrjtf.mjs} +4 -3
- package/tool_registry-791Vrjtf.mjs.map +1 -0
- package/{tool_registry-DYUYqXvo.js → tool_registry-CKJPze3j.js} +4 -3
- package/tool_registry-CKJPze3j.js.map +1 -0
- package/{turn_runner-DqWHNP80.js → turn_runner-HXImLGIn.js} +7 -7
- package/turn_runner-HXImLGIn.js.map +1 -0
- package/{turn_runner-fg1Wc3dK.mjs → turn_runner-ZyYO-Kti.mjs} +7 -7
- package/turn_runner-ZyYO-Kti.mjs.map +1 -0
- package/turn_runner.cjs +1 -1
- package/turn_runner.mjs +1 -1
- package/types.d.ts +1 -1
- package/common-BT0nfCi9.mjs.map +0 -1
- package/common-Cj8TaQ9U.js.map +0 -1
- package/exceptions-BeWH2FwP.mjs.map +0 -1
- package/exceptions-CitH5wZI.js.map +0 -1
- package/spooled_markdown_artifact-CALSDxIx.js.map +0 -1
- package/spooled_markdown_artifact-Ci5UL7l4.mjs.map +0 -1
- package/tool_call-CV5qVNlb.mjs.map +0 -1
- package/tool_call-Db68hB7y.js.map +0 -1
- package/tool_registry-D1pSSlsd.mjs.map +0 -1
- package/tool_registry-DYUYqXvo.js.map +0 -1
- package/turn_runner-DqWHNP80.js.map +0 -1
- package/turn_runner-fg1Wc3dK.mjs.map +0 -1
|
@@ -1 +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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"}
|
|
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\n/** Construction options for {@link SqliteVecVectorStore}. */\nexport interface SqliteVecVectorStoreOptions extends BaseVectorStoreOptions {\n /** Database location: a filesystem path, or `':memory:'` for an in-memory database. */\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: SqliteVecVectorStoreOptions) {\n super(options)\n }\n\n get #opts(): SqliteVecVectorStoreOptions {\n return this.options as SqliteVecVectorStoreOptions\n }\n\n /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */\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 /** The underlying SQLite database handle; throws if the store is not connected. */\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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"}
|
|
@@ -12,6 +12,7 @@ import { BaseVectorStore } from "../contract";
|
|
|
12
12
|
import type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from "../plan";
|
|
13
13
|
import type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from "../types";
|
|
14
14
|
export interface SurrealDBVectorStoreOptions extends BaseVectorStoreOptions {
|
|
15
|
+
/** Connection and authentication parameters for the backend. */
|
|
15
16
|
connection: {
|
|
16
17
|
url: string;
|
|
17
18
|
username?: string;
|
|
@@ -23,6 +24,7 @@ export interface SurrealDBVectorStoreOptions extends BaseVectorStoreOptions {
|
|
|
23
24
|
export declare class SurrealDBVectorStore extends BaseVectorStore {
|
|
24
25
|
#private;
|
|
25
26
|
readonly capabilities: VectorStoreCapabilities;
|
|
27
|
+
/** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
|
|
26
28
|
static isAvailable(): boolean;
|
|
27
29
|
isAvailable(): boolean;
|
|
28
30
|
connect(): Promise<void>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
require("../../chunk-Ble4zEEl.js");
|
|
3
|
-
const require_tool_registry = require("../../tool_registry-
|
|
3
|
+
const require_tool_registry = require("../../tool_registry-CKJPze3j.js");
|
|
4
4
|
require("../../guards.cjs");
|
|
5
5
|
const require_batteries_vector_filters = require("./filters.cjs");
|
|
6
6
|
const require_batteries_vector_exceptions = require("./exceptions.cjs");
|
|
@@ -49,6 +49,7 @@ var SurrealDBVectorStore = class extends require_batteries_vector_contract.BaseV
|
|
|
49
49
|
get #opts() {
|
|
50
50
|
return this.options;
|
|
51
51
|
}
|
|
52
|
+
/** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
|
|
52
53
|
static isAvailable() {
|
|
53
54
|
return typeof process !== "undefined";
|
|
54
55
|
}
|
|
@@ -1 +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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"}
|
|
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 and authentication parameters for the backend. */\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 availability probe: whether this adapter's runtime driver can load in the current environment. */\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":";;;;;;;;;;;;;;;;;;;AA4CA,IAAM,aAAa,YAAY;CAC7B,IAAI;EAEF,QAAO,MADW,OAAO,cACd;CACb,QAAQ;EACN,MAAM,IAAI,oCAAA,kCAAkC,CAAC,WAAW,CAAC;CAC3D;AACF;AAGA,IAAM,SAAS,SAAyB,MAAM,KAAK,QAAQ,MAAM,KAAK,IAAI;AAG1E,IAAM,oBAAoB,QAAyB;CACjD,IAAI,OAAO,OAAO,QAAQ,YAAY,QAAS,KAC7C,OAAO,OAAQ,IAAY,EAAE;CAE/B,MAAM,IAAI,OAAO,GAAG;CACpB,MAAM,MAAM,EAAE,QAAQ,GAAG;CACzB,OAAO,OAAO,IAAI,EAAE,MAAM,MAAM,CAAC,EAAE,QAAQ,UAAU,EAAE,IAAI;AAC7D;AAEA,IAAa,uBAAb,cAA0C,kCAAA,gBAAgB;CACxD,eAAiD;EAC/C,cAAc;EACd,cAAc;EACd,QAAQ;EACR,QAAQ;EACR,iBAAiB;EAEjB,aAAa;GAAE,cAAc;GAAO,SAAS;GAAU,OAAO,CAAC,QAAQ;EAAE;CAC3E;CAEA,MAAkB;CAClB,wBAA6B,IAAI,IAAI;CAErC,IAAIA,QAAqC;EACvC,OAAO,KAAK;CACd;;CAGA,OAAO,cAAuB;EAC5B,OAAO,OAAO,YAAY;CAC5B;CACA,cAAuB;EACrB,OAAO,OAAO,YAAY;CAC5B;CAEA,MAAM,UAAyB;EAC7B,IAAI,KAAKC,KAAK;EACd,MAAM,UAAU,MAAM,WAAW;EACjC,MAAM,IAAI,KAAKD,MAAM;EACrB,IAAI;GACF,KAAKC,MAAM,IAAI,QAAQ;GACvB,MAAM,MAAM,EAAE,IAAI,QAAQ,OAAO,EAAE;GACnC,MAAM,KAAKA,IAAI,QAAQ,IAAI,SAAS,MAAM,IAAI,MAAM,GAAG,IAAI,KAAK;GAChE,IAAI,EAAE,UACJ,MAAM,KAAKA,IAAI,OAAO;IAAE,UAAU,EAAE;IAAU,UAAU,EAAE,YAAY;GAAG,CAAC;GAE5E,MAAM,KAAKA,IAAI,IAAI;IAAE,WAAW,EAAE,aAAa;IAAQ,UAAU,EAAE,YAAY;GAAO,CAAC;EACzF,SAAS,KAAK;GACZ,MAAM,IAAI,oCAAA,iCAAiC,CAAC,OAAO,GAAG,CAAC,CAAC;EAC1D;CACF;CAEA,MAAM,QAAuB;EAC3B,IAAI,KAAKA,KAAK;GACZ,MAAM,KAAKA,IAAI,MAAM;GACrB,KAAKA,MAAM;EACb;CACF;CAEA,MAAMC,UAAwB;EAC5B,IAAI,CAAC,KAAKD,KAAK,MAAM,KAAK,QAAQ;EAClC,OAAO,KAAKA;CACd;CAEA,MAAME,OAAO,KAAa,MAAgD;EAGxE,OAAO,OADW,MADD,KAAKD,QAAQ,GACT,MAAM,KAAK,IAAI;CAEtC;CAEA,MAAM,iBAAiB,MAAsB,aAAqC;EAChF,KAAKE,MAAM,IAAI,KAAK,YAAY,KAAK,OAAO,UAAU;EACtD,MAAM,MAAM,cAAc,mBAAmB;EAC7C,IAAI;GACF,MAAM,KAAKD,OAAO,gBAAgB,MAAM,MAAM,KAAK,UAAU,EAAE,aAAa;EAC9E,SAAS,KAAK;GACZ,MAAM,IAAI,oCAAA,iCAAiC,CAAC,oBAAoB,OAAO,GAAG,CAAC,CAAC;EAC9E;CACF;CAEA,MAAM,eAAe,YAAoB,UAAkC;EACzE,MAAM,KAAK,WAAW,eAAe;EACrC,IAAI;GACF,MAAM,KAAKA,OAAO,gBAAgB,KAAK,MAAM,UAAU,EAAE,EAAE;GAC3D,KAAKC,MAAM,OAAO,UAAU;EAC9B,SAAS,KAAK;GACZ,MAAM,IAAI,oCAAA,iCAAiC,CAAC,kBAAkB,OAAO,GAAG,CAAC,CAAC;EAC5E;CACF;CAEA,MAAM,cAAc,YAAsC;EACxD,IAAI;GAEF,MAAM,QAAO,MADK,KAAKD,OAAO,cAAc,GAC3B;GACjB,MAAM,SAAS,MAAM,UAAU,MAAM,MAAM,CAAC;GAC5C,OAAO,OAAO,UAAU,eAAe,KAAK,QAAQ,UAAU;EAChE,QAAQ;GACN,OAAO;EACT;CACF;CAEA,MAAM,iBAAiB,OAAe,KAA4B;EAChE,MAAM,IAAI,oCAAA,qCAAqC,CAAC,oBAAoB,WAAW,CAAC;CAClF;CAEA,MAAM,cAAc,MAAiC;EACnD,IAAI,KAAK,QAAQ,WAAW,GAAG;EAC/B,oCAAA,gBAAgB,KAAK,OAAO;EAC5B,MAAM,WAAW,KAAKH,MAAM,cAAc,KAAKI,MAAM,IAAI,KAAK,UAAU;EACxE,IAAI;GACF,KAAK,MAAM,KAAK,KAAK,SAAS;IAC5B,IAAI,SAAS,EAAE;IACf,IAAI,CAAC,UAAU,EAAE,UAAU;KACzB,MAAM,CAAC,KAAK,MAAM,KAAK,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU;KACtD,SAAS;IACX;IACA,IAAI,CAAC,QACH,MAAM,IAAI,oCAAA,6BAA6B,CAAC,oCAAoC,CAAC;IAE/E,IAAI,aAAa,KAAA,KAAa,OAAO,WAAW,UAC9C,MAAM,IAAI,oCAAA,kCAAkC,CAAC,UAAU,OAAO,MAAM,CAAC;IAEvE,MAAM,KAAKD,OACT,8FACA;KACE,KAAK,KAAK;KACV,KAAK,EAAE;KACP,KAAK;KACL,UAAU,EAAE,YAAY;KACxB,UAAU,EAAE,WAAW,KAAK,UAAU,EAAE,QAAQ,IAAI;IACtD,CACF;GACF;EACF,SAAS,KAAK;GACZ,IACE,sBAAA,aAAa,KAAK,qCAAqC,oCAAA,iCAAiC,KACxF,sBAAA,aAAa,KAAK,gCAAgC,oCAAA,4BAA4B,GAE9E,MAAM;GAER,MAAM,IAAI,oCAAA,6BAA6B,CAAC,OAAO,GAAG,CAAC,CAAC;EACtD;CACF;CAEA,MAAM,cAAc,MAA0C;EAC5D,MAAM,SAAS,KAAKH,MAAM,UAAU;EACpC,IAAI;EACJ,IAAI,KAAK;OACH,YAAY,KAAK,MACnB,cAAc,KAAK,KAAK;QACnB,IAAI,gBAAgB,KAAK,MAAM;IACpC,MAAM,CAAC,KAAK,MAAM,KAAK,OAAO,CAAC,KAAK,KAAK,UAAU,GAAG,OAAO;IAC7D,cAAc;GAChB,OAAO,IAAI,QAAQ,KAAK,MAAM;IAK5B,MAAM,OAAM,MAJM,KAAKG,OAAO,4CAA4C;KACxE,KAAK,KAAK;KACV,KAAK,KAAK,KAAK;IACjB,CAAC,GACe,KAAK;IACrB,IAAI,CAAC,KACH,MAAM,IAAI,oCAAA,6BAA6B,CAAC,8BAA8B,KAAK,KAAK,EAAE,CAAC;IAErF,cAAc,IAAI;GACpB;;EAGF,MAAM,SAAS,KAAK,UAAU;EAC9B,IAAI;GACF,MAAM,MAAM,MAAM,KAAK,UAAU;GACjC,IAAI;GACJ,IAAI,aAAa;IAEf,MAAM,cAAc,WAAW;IAC/B,MAAM,KAAK,cAAc,gCAAgC;IACzD,MAAM,QAAQ,cAAc,QAAQ;IAKpC,QAAO,MAJW,KAAKA,OACrB,aAAa,GAAG,6BAA6B,IAAI,oBAAoB,MAAM,IAC3E,EAAE,IAAI,YAAY,CACpB,GACW,MAAM,CAAC;IAClB,MAAM,SAAS,KAAK,KAAK,SAAS;KAAE;KAAK,OAAO,KAAKE,MAAM,OAAO,IAAI,OAAO,GAAG,MAAM;IAAE,EAAE;IAI1F,QAHiB,KAAK,SAClB,OAAO,QAAQ,MAAM,iCAAA,eAAe,KAAK,QAAS,KAAKC,WAAW,EAAE,IAAI,QAAQ,CAAC,CAAC,IAClF,QAED,MAAM,QAAQ,SAAS,KAAK,IAAI,EAChC,KAAK,MAAM,KAAKC,SAAS,EAAE,KAAK,MAAM,EAAE,KAAK,CAAC;GACnD,OAAO;IAEL,QAAO,MADW,KAAKJ,OAAO,iBAAiB,IAAI,EAAE,GAC1C,MAAM,CAAC;IAIlB,QAHiB,KAAK,SAClB,KAAK,QAAQ,QAAQ,iCAAA,eAAe,KAAK,QAAS,KAAKG,WAAW,IAAI,QAAQ,CAAC,CAAC,IAChF,MAED,MAAM,QAAQ,SAAS,KAAK,IAAI,EAChC,KAAK,QAAQ,KAAKC,SAAS,KAAK,MAAM,KAAA,CAAS,CAAC;GACrD;EACF,SAAS,KAAK;GACZ,MAAM,IAAI,oCAAA,6BAA6B,CAAC,OAAO,GAAG,CAAC,CAAC;EACtD;CACF;CAGA,MAAM,KAAa,QAAwB;EACzC,IAAI,WAAW,aAAa,OAAO,KAAK,IAAI;EAC5C,QAAQ,MAAM,KAAK;CACrB;CAEA,WAAW,KAA8B;EACvC,IAAI,OAAO,QAAQ,UACjB,IAAI;GACF,OAAO,KAAK,MAAM,GAAG;EACvB,QAAQ;GACN,OAAO,CAAC;EACV;EAEF,IAAI,OAAO,OAAO,QAAQ,UAAU,OAAO;EAC3C,OAAO,CAAC;CACV;CAEA,SAAS,KAAU,MAAkB,OAAwC;EAC3E,MAAM,OAAO,KAAK;EAClB,MAAM,MAAmB,CAAC;EAC1B,IAAI,KAAK,IAAI,IAAI,KAAK,iBAAiB,IAAI,EAAE;EAC7C,IAAI,KAAK,UAAU,MAAM,QAAQ,IAAI,GAAG,GAAG,IAAI,SAAU,IAAI,IAAiB,IAAI,MAAM;EACxF,IAAI,KAAK,UAAU,IAAI,WAAY,IAAI,YAAY,KAAA;EACnD,IAAI,KAAK,UAAU,IAAI,WAAW,KAAKD,WAAW,IAAI,QAAQ;EAC9D,IAAI,UAAU,KAAA,KAAa,CAAC,OAAO,MAAM,KAAK,GAAG,IAAI,QAAQ;EAC7D,OAAO;CACT;CAEA,MAAM,cAAc,MAAiC;EACnD,IAAI;GACF,IAAI,KAAK,OAAO,KAAK,IAAI,SAAS,GAChC,KAAK,MAAM,MAAM,KAAK,KACpB,MAAM,KAAKH,OAAO,mCAAmC;IAAE,KAAK,KAAK;IAAY,KAAK;GAAG,CAAC;QAEnF,IAAI,KAAK,QAAQ;IAGtB,MAAM,YADO,MADK,KAAKA,OAAO,4BAA4B,MAAM,KAAK,UAAU,EAAE,EAAE,GAClE,MAAM,CAAC,GAErB,QAAQ,QAAa,iCAAA,eAAe,KAAK,QAAS,KAAKG,WAAW,IAAI,QAAQ,CAAC,CAAC,EAChF,KAAK,QAAa,iBAAiB,IAAI,EAAE,CAAC;IAC7C,KAAK,MAAM,MAAM,SACf,MAAM,KAAKH,OAAO,mCAAmC;KAAE,KAAK,KAAK;KAAY,KAAK;IAAG,CAAC;GAE1F,OACE,MAAM,KAAKA,OAAO,UAAU,MAAM,KAAK,UAAU,EAAE,EAAE;EAEzD,SAAS,KAAK;GACZ,MAAM,IAAI,oCAAA,6BAA6B,CAAC,OAAO,GAAG,CAAC,CAAC;EACtD;CACF;AACF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { s as isInstanceOf } from "../../tool_registry-
|
|
1
|
+
import { s as isInstanceOf } from "../../tool_registry-791Vrjtf.mjs";
|
|
2
2
|
import "../../guards.mjs";
|
|
3
3
|
import { evaluateFilter } from "./filters.mjs";
|
|
4
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";
|
|
@@ -47,6 +47,7 @@ var SurrealDBVectorStore = class extends BaseVectorStore {
|
|
|
47
47
|
get #opts() {
|
|
48
48
|
return this.options;
|
|
49
49
|
}
|
|
50
|
+
/** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
|
|
50
51
|
static isAvailable() {
|
|
51
52
|
return typeof process !== "undefined";
|
|
52
53
|
}
|
|
@@ -1 +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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"}
|
|
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 and authentication parameters for the backend. */\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 availability probe: whether this adapter's runtime driver can load in the current environment. */\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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"}
|
|
@@ -18,17 +18,26 @@ export type VectorMetadataValue = string | number | boolean | null | VectorMetad
|
|
|
18
18
|
export type VectorMetadata = Record<string, VectorMetadataValue>;
|
|
19
19
|
/** A stored vector record. All fields are optional; at minimum, an id is required. */
|
|
20
20
|
export interface VectorRecord {
|
|
21
|
+
/** Unique record identifier within its collection. */
|
|
21
22
|
id: string;
|
|
23
|
+
/** The embedding vector; omit to let the backend encode `document` server-side. */
|
|
22
24
|
vector?: number[];
|
|
25
|
+
/** The source document/text associated with the record. */
|
|
23
26
|
document?: string;
|
|
27
|
+
/** Arbitrary metadata attached to the record. */
|
|
24
28
|
metadata?: VectorMetadata;
|
|
25
29
|
}
|
|
26
30
|
/** A result row from a vector search or filter scan. All fields are opt-in via .select(). */
|
|
27
31
|
export interface VectorMatch {
|
|
32
|
+
/** The matched record's id (when projected). */
|
|
28
33
|
id?: string;
|
|
34
|
+
/** Similarity score for the match (when applicable). */
|
|
29
35
|
score?: number;
|
|
36
|
+
/** The record's metadata (when projected). */
|
|
30
37
|
metadata?: VectorMetadata;
|
|
38
|
+
/** The record's document body (when projected). */
|
|
31
39
|
document?: string;
|
|
40
|
+
/** The record's stored vector (when projected). */
|
|
32
41
|
vector?: number[];
|
|
33
42
|
}
|
|
34
43
|
/** Input to the encoder: either a raw vector array or raw text to be embedded. */
|
|
@@ -65,23 +74,37 @@ export type VectorConsistency = 'strong' | 'best-effort' | 'eventual';
|
|
|
65
74
|
* store-level `consistency` option is set; `modes` enumerates what it accepts.
|
|
66
75
|
*/
|
|
67
76
|
export interface VectorConsistencyCapability {
|
|
77
|
+
/** Whether the backend honours a caller-supplied {@link VectorConsistency} (else it is a no-op). */
|
|
68
78
|
configurable: boolean;
|
|
79
|
+
/** The consistency mode applied when neither a per-op nor store-level mode is set. */
|
|
69
80
|
default: VectorConsistency;
|
|
81
|
+
/** The consistency modes the backend accepts. */
|
|
70
82
|
modes: VectorConsistency[];
|
|
71
83
|
}
|
|
84
|
+
/** Fixed per-adapter capability flags — static truth about what a backend supports. */
|
|
72
85
|
export interface VectorStoreCapabilities {
|
|
86
|
+
/** Multi-op ACID transactions (pgvector, sqlite-vec only). */
|
|
73
87
|
transactions: boolean;
|
|
88
|
+
/** Multi-vector collections (Qdrant, Weaviate). */
|
|
74
89
|
namedVectors: boolean;
|
|
90
|
+
/** Whether `renameCollection` is supported. */
|
|
75
91
|
rename: boolean;
|
|
92
|
+
/** Whether `.whereRaw()` accepts a SQL string plus bindings. */
|
|
76
93
|
rawSql: boolean;
|
|
94
|
+
/** Whether the backend embeds text server-side (Pinecone, Weaviate). */
|
|
77
95
|
builtInEncoding: boolean;
|
|
96
|
+
/** The backend's read-after-write story and configurable default. */
|
|
78
97
|
consistency: VectorConsistencyCapability;
|
|
79
98
|
}
|
|
80
99
|
/** Shared base options every adapter extends with its own connection block. */
|
|
81
100
|
export interface BaseVectorStoreOptions {
|
|
101
|
+
/** Distance metric used for similarity (e.g. cosine, euclidean, dot). Defaults to the adapter's preferred metric. */
|
|
82
102
|
metric?: DistanceMetric;
|
|
103
|
+
/** Function that turns text into vectors. Required unless the backend has built-in encoding. */
|
|
83
104
|
encoder?: VectorEncoderFn;
|
|
105
|
+
/** Embedding dimensionality. Required by backends that must declare it at collection-creation time. */
|
|
84
106
|
dimensions?: number;
|
|
107
|
+
/** Collection name used when a call omits an explicit one. */
|
|
85
108
|
defaultCollection?: string;
|
|
86
109
|
/**
|
|
87
110
|
* Store-wide read-after-write guarantee for writes. Overrides the adapter's declared
|
|
@@ -93,8 +116,12 @@ export interface BaseVectorStoreOptions {
|
|
|
93
116
|
}
|
|
94
117
|
/** Options for ensuring a collection exists. */
|
|
95
118
|
export interface EnsureCollectionOptions {
|
|
119
|
+
/** Name of the collection to ensure. */
|
|
96
120
|
collection: string;
|
|
121
|
+
/** Embedding dimensionality of the collection's vector column. */
|
|
97
122
|
dimensions: number;
|
|
123
|
+
/** Distance metric for the collection (defaults to the adapter's preferred metric). */
|
|
98
124
|
metric?: DistanceMetric;
|
|
125
|
+
/** When `true`, ensuring an existing collection is a no-op rather than an error. */
|
|
99
126
|
ifNotExists?: boolean;
|
|
100
127
|
}
|
|
@@ -13,6 +13,7 @@ import { BaseVectorStore } from "../contract";
|
|
|
13
13
|
import type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from "../plan";
|
|
14
14
|
import type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from "../types";
|
|
15
15
|
export interface TypesenseVectorStoreOptions extends BaseVectorStoreOptions {
|
|
16
|
+
/** Connection and authentication parameters for the backend. */
|
|
16
17
|
connection?: {
|
|
17
18
|
host?: string;
|
|
18
19
|
port?: number;
|
|
@@ -24,6 +25,7 @@ export interface TypesenseVectorStoreOptions extends BaseVectorStoreOptions {
|
|
|
24
25
|
export declare class TypesenseVectorStore extends BaseVectorStore {
|
|
25
26
|
#private;
|
|
26
27
|
readonly capabilities: VectorStoreCapabilities;
|
|
28
|
+
/** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
|
|
27
29
|
static isAvailable(): boolean;
|
|
28
30
|
isAvailable(): boolean;
|
|
29
31
|
connect(): Promise<void>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
require("../../chunk-Ble4zEEl.js");
|
|
3
|
-
const require_tool_registry = require("../../tool_registry-
|
|
3
|
+
const require_tool_registry = require("../../tool_registry-CKJPze3j.js");
|
|
4
4
|
require("../../guards.cjs");
|
|
5
5
|
const require_batteries_vector_filters = require("./filters.cjs");
|
|
6
6
|
const require_batteries_vector_helpers = require("./helpers.cjs");
|
|
@@ -45,6 +45,7 @@ var TypesenseVectorStore = class extends require_batteries_vector_contract.BaseV
|
|
|
45
45
|
get #opts() {
|
|
46
46
|
return this.options;
|
|
47
47
|
}
|
|
48
|
+
/** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
|
|
48
49
|
static isAvailable() {
|
|
49
50
|
return typeof process !== "undefined";
|
|
50
51
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typesense.cjs","names":["#opts","#client","#ensure","#dims","#project","#parseMeta"],"sources":["../../../src/batteries/vector/typesense/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/typesense\n *\n * Typesense adapter. Each collection is a Typesense collection with a `float[]` vector field\n * (native `vector_query` KNN). Metadata is stored as a JSON string field and filtered with\n * the neutral filter tree's JS reference evaluator for exact cross-adapter parity (Typesense\n * filter_by requires per-field schema declaration, which the neutral metadata model doesn't\n * have). Document + id are plain fields.\n *\n * Driver: `typesense` (pure JS).\n */\n\nimport { evaluateFilter } from '../filters'\nimport { normalizeScore } from '../helpers'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { isInstanceOf } from '@nhtio/adk/guards'\nimport {\n E_VECTOR_STORE_DRIVER_UNAVAILABLE,\n E_VECTOR_STORE_CONNECTION_FAILED,\n E_VECTOR_STORE_COLLECTION_FAILED,\n E_VECTOR_STORE_UPSERT_FAILED,\n E_VECTOR_STORE_SEARCH_FAILED,\n E_VECTOR_STORE_DELETE_FAILED,\n E_VECTOR_STORE_DIMENSION_MISMATCH,\n E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n} from '../exceptions'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type {\n VectorMatch,\n VectorStoreCapabilities,\n BaseVectorStoreOptions,\n VectorMetadata,\n DistanceMetric,\n} from '../types'\n\nexport interface TypesenseVectorStoreOptions extends BaseVectorStoreOptions {\n connection?: {\n host?: string\n port?: number\n protocol?: string\n apiKey?: string\n url?: string\n }\n}\n\nconst getTypesense = async () => {\n try {\n const mod = await import('typesense')\n return (mod as any).default ?? mod\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['typesense'])\n }\n}\n\nexport class TypesenseVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: false,\n rawSql: false,\n builtInEncoding: false,\n // Typesense indexes writes synchronously (searchable on resolve). The option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n\n #client: any | null = null\n #dims: Map<string, number> = new Map()\n\n get #opts(): TypesenseVectorStoreOptions {\n return this.options as TypesenseVectorStoreOptions\n }\n\n static isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n\n async connect(): Promise<void> {\n if (this.#client) return\n const Typesense = await getTypesense()\n const c = this.#opts.connection || {}\n let node: any\n if (c.url) {\n const u = new URL(c.url)\n node = {\n host: u.hostname,\n port: Number(u.port) || (u.protocol === 'https:' ? 443 : 8108),\n protocol: u.protocol.replace(':', ''),\n }\n } else {\n node = { host: c.host ?? 'localhost', port: c.port ?? 8108, protocol: c.protocol ?? 'http' }\n }\n try {\n this.#client = new Typesense.Client({\n nodes: [node],\n apiKey: c.apiKey ?? 'xyz',\n connectionTimeoutSeconds: 5,\n })\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n\n async close(): Promise<void> {\n this.#client = null\n }\n\n async #ensure(): Promise<any> {\n if (!this.#client) await this.connect()\n return this.#client!\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n const client = await this.#ensure()\n this.#dims.set(spec.collection, spec.vector.dimensions)\n if (ifNotExists && (await this.hasCollection(spec.collection))) return\n try {\n await client.collections().create({\n name: spec.collection,\n fields: [\n { name: 'id', type: 'string' },\n { name: 'vec', type: 'float[]', num_dim: spec.vector.dimensions },\n { name: 'document', type: 'string', optional: true },\n { name: 'metadata', type: 'string', optional: true },\n ],\n })\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['createCollection', String(err)])\n }\n }\n\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n const client = await this.#ensure()\n if (ifExists && !(await this.hasCollection(collection))) return\n try {\n await client.collections(collection).delete()\n this.#dims.delete(collection)\n } catch (err) {\n const msg = String(err)\n if (ifExists && msg.includes('Not Found')) return\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', msg])\n }\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n const client = await this.#ensure()\n try {\n await client.collections(collection).retrieve()\n return true\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', 'typesense'])\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const client = await this.#ensure()\n const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection)\n try {\n const docs: any[] = []\n for (const r of plan.records) {\n let vector = r.vector\n if (!vector && r.document) {\n const [v] = await this.encode([r.document], 'document')\n vector = v\n }\n if (!vector) {\n throw new E_VECTOR_STORE_UPSERT_FAILED(['Record missing vector and document'])\n }\n if (expected !== undefined && vector.length !== expected) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length])\n }\n docs.push({\n id: r.id,\n vec: vector,\n document: r.document ?? '',\n metadata: r.metadata ? JSON.stringify(r.metadata) : '{}',\n })\n }\n await client.collections(plan.collection).documents().import(docs, { action: 'upsert' })\n } catch (err) {\n if (\n isInstanceOf(err, 'E_VECTOR_STORE_DIMENSION_MISMATCH', E_VECTOR_STORE_DIMENSION_MISMATCH) ||\n isInstanceOf(err, 'E_VECTOR_STORE_UPSERT_FAILED', E_VECTOR_STORE_UPSERT_FAILED)\n ) {\n throw err\n }\n throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n }\n }\n\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n const client = await this.#ensure()\n const metric = this.#opts.metric ?? 'cosine'\n let queryVector: number[] | undefined\n if (plan.near) {\n if ('vector' in plan.near) {\n queryVector = plan.near.vector\n } else if ('serverText' in plan.near) {\n const [v] = await this.encode([plan.near.serverText], 'query')\n queryVector = v\n } else if ('id' in plan.near) {\n try {\n const doc = await client.collections(plan.collection).documents(plan.near.id).retrieve()\n queryVector = doc.vec as number[]\n } catch {\n queryVector = undefined\n }\n if (!queryVector) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n }\n }\n\n const offset = plan.offset ?? 0\n try {\n const coll = client.collections(plan.collection).documents()\n if (queryVector) {\n // Over-fetch then JS-filter for exact cross-adapter filter semantics.\n const k = Math.max(plan.topK + offset, plan.topK) + (plan.filter ? 250 : 0)\n const res = await coll.search({\n q: '*',\n vector_query: `vec:([${queryVector.join(',')}], k:${k})`,\n per_page: Math.min(250, k),\n })\n const hits = (res.hits ?? []) as any[]\n const mapped = hits.map((hit) => ({\n match: this.#project(hit.document, plan, metric, hit.vector_distance),\n meta: this.#parseMeta(hit.document.metadata),\n }))\n const filtered = plan.filter\n ? mapped.filter((m) => evaluateFilter(plan.filter!, m.meta))\n : mapped\n return filtered.slice(offset, offset + plan.topK).map((m) => m.match)\n } else {\n const res = await coll.search({ q: '*', query_by: 'document', per_page: 250 })\n const hits = (res.hits ?? []) as any[]\n const mapped = hits.map((hit) => ({\n match: this.#project(hit.document, plan, metric, undefined),\n meta: this.#parseMeta(hit.document.metadata),\n }))\n const filtered = plan.filter\n ? mapped.filter((m) => evaluateFilter(plan.filter!, m.meta))\n : mapped\n return filtered.slice(offset, offset + plan.topK).map((m) => m.match)\n }\n } catch (err) {\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\n }\n\n #parseMeta(val: unknown): VectorMetadata {\n if (typeof val === 'string') {\n try {\n return JSON.parse(val) as VectorMetadata\n } catch {\n return {}\n }\n }\n if (val && typeof val === 'object') return val as VectorMetadata\n return {}\n }\n\n #project(doc: any, plan: SearchPlan, metric: string, dist: number | undefined): VectorMatch {\n const proj = plan.projection\n const out: VectorMatch = {}\n if (proj.id) out.id = doc.id as string\n if (proj.vector && Array.isArray(doc.vec)) out.vector = doc.vec as number[]\n if (proj.document) out.document = (doc.document ?? undefined) as string | undefined\n if (proj.metadata) out.metadata = this.#parseMeta(doc.metadata)\n if (dist !== undefined && dist !== null) {\n out.score = normalizeScore(Number(dist), metric as DistanceMetric, 'distance')\n }\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const client = await this.#ensure()\n const collection = client.collections(plan.collection)\n const coll = collection.documents()\n // Delete a single document by id: documents(id).delete() (NOT documents().delete(id),\n // which targets the bulk filter endpoint).\n const deleteOne = async (id: string): Promise<void> => {\n await collection\n .documents(id)\n .delete()\n .catch(() => undefined)\n }\n try {\n if (plan.ids && plan.ids.length > 0) {\n for (const id of plan.ids) await deleteOne(id)\n } else if (plan.filter) {\n // Resolve ids via a scan + JS evaluator, then delete by id.\n const res = await coll.search({ q: '*', query_by: 'document', per_page: 250 })\n const hits = (res.hits ?? []) as any[]\n const targets = hits\n .filter((hit) => evaluateFilter(plan.filter!, this.#parseMeta(hit.document.metadata)))\n .map((hit) => hit.document.id as string)\n for (const id of targets) await deleteOne(id)\n } else {\n // Delete-all: bulk delete by an always-true filter; fall back to per-id on error.\n try {\n await coll.delete({ filter_by: 'id:!= ' })\n } catch {\n const res = await coll.search({ q: '*', query_by: 'document', per_page: 250 })\n const hits = (res.hits ?? []) as any[]\n for (const hit of hits) await deleteOne(hit.document.id as string)\n }\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"typesense.cjs","names":["#opts","#client","#ensure","#dims","#project","#parseMeta"],"sources":["../../../src/batteries/vector/typesense/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/typesense\n *\n * Typesense adapter. Each collection is a Typesense collection with a `float[]` vector field\n * (native `vector_query` KNN). Metadata is stored as a JSON string field and filtered with\n * the neutral filter tree's JS reference evaluator for exact cross-adapter parity (Typesense\n * filter_by requires per-field schema declaration, which the neutral metadata model doesn't\n * have). Document + id are plain fields.\n *\n * Driver: `typesense` (pure JS).\n */\n\nimport { evaluateFilter } from '../filters'\nimport { normalizeScore } from '../helpers'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { isInstanceOf } from '@nhtio/adk/guards'\nimport {\n E_VECTOR_STORE_DRIVER_UNAVAILABLE,\n E_VECTOR_STORE_CONNECTION_FAILED,\n E_VECTOR_STORE_COLLECTION_FAILED,\n E_VECTOR_STORE_UPSERT_FAILED,\n E_VECTOR_STORE_SEARCH_FAILED,\n E_VECTOR_STORE_DELETE_FAILED,\n E_VECTOR_STORE_DIMENSION_MISMATCH,\n E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n} from '../exceptions'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type {\n VectorMatch,\n VectorStoreCapabilities,\n BaseVectorStoreOptions,\n VectorMetadata,\n DistanceMetric,\n} from '../types'\n\nexport interface TypesenseVectorStoreOptions extends BaseVectorStoreOptions {\n /** Connection and authentication parameters for the backend. */\n connection?: {\n host?: string\n port?: number\n protocol?: string\n apiKey?: string\n url?: string\n }\n}\n\nconst getTypesense = async () => {\n try {\n const mod = await import('typesense')\n return (mod as any).default ?? mod\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['typesense'])\n }\n}\n\nexport class TypesenseVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: false,\n rawSql: false,\n builtInEncoding: false,\n // Typesense indexes writes synchronously (searchable on resolve). The option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n\n #client: any | null = null\n #dims: Map<string, number> = new Map()\n\n get #opts(): TypesenseVectorStoreOptions {\n return this.options as TypesenseVectorStoreOptions\n }\n\n /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */\n static isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n\n async connect(): Promise<void> {\n if (this.#client) return\n const Typesense = await getTypesense()\n const c = this.#opts.connection || {}\n let node: any\n if (c.url) {\n const u = new URL(c.url)\n node = {\n host: u.hostname,\n port: Number(u.port) || (u.protocol === 'https:' ? 443 : 8108),\n protocol: u.protocol.replace(':', ''),\n }\n } else {\n node = { host: c.host ?? 'localhost', port: c.port ?? 8108, protocol: c.protocol ?? 'http' }\n }\n try {\n this.#client = new Typesense.Client({\n nodes: [node],\n apiKey: c.apiKey ?? 'xyz',\n connectionTimeoutSeconds: 5,\n })\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n\n async close(): Promise<void> {\n this.#client = null\n }\n\n async #ensure(): Promise<any> {\n if (!this.#client) await this.connect()\n return this.#client!\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n const client = await this.#ensure()\n this.#dims.set(spec.collection, spec.vector.dimensions)\n if (ifNotExists && (await this.hasCollection(spec.collection))) return\n try {\n await client.collections().create({\n name: spec.collection,\n fields: [\n { name: 'id', type: 'string' },\n { name: 'vec', type: 'float[]', num_dim: spec.vector.dimensions },\n { name: 'document', type: 'string', optional: true },\n { name: 'metadata', type: 'string', optional: true },\n ],\n })\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['createCollection', String(err)])\n }\n }\n\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n const client = await this.#ensure()\n if (ifExists && !(await this.hasCollection(collection))) return\n try {\n await client.collections(collection).delete()\n this.#dims.delete(collection)\n } catch (err) {\n const msg = String(err)\n if (ifExists && msg.includes('Not Found')) return\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', msg])\n }\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n const client = await this.#ensure()\n try {\n await client.collections(collection).retrieve()\n return true\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', 'typesense'])\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const client = await this.#ensure()\n const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection)\n try {\n const docs: any[] = []\n for (const r of plan.records) {\n let vector = r.vector\n if (!vector && r.document) {\n const [v] = await this.encode([r.document], 'document')\n vector = v\n }\n if (!vector) {\n throw new E_VECTOR_STORE_UPSERT_FAILED(['Record missing vector and document'])\n }\n if (expected !== undefined && vector.length !== expected) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length])\n }\n docs.push({\n id: r.id,\n vec: vector,\n document: r.document ?? '',\n metadata: r.metadata ? JSON.stringify(r.metadata) : '{}',\n })\n }\n await client.collections(plan.collection).documents().import(docs, { action: 'upsert' })\n } catch (err) {\n if (\n isInstanceOf(err, 'E_VECTOR_STORE_DIMENSION_MISMATCH', E_VECTOR_STORE_DIMENSION_MISMATCH) ||\n isInstanceOf(err, 'E_VECTOR_STORE_UPSERT_FAILED', E_VECTOR_STORE_UPSERT_FAILED)\n ) {\n throw err\n }\n throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n }\n }\n\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n const client = await this.#ensure()\n const metric = this.#opts.metric ?? 'cosine'\n let queryVector: number[] | undefined\n if (plan.near) {\n if ('vector' in plan.near) {\n queryVector = plan.near.vector\n } else if ('serverText' in plan.near) {\n const [v] = await this.encode([plan.near.serverText], 'query')\n queryVector = v\n } else if ('id' in plan.near) {\n try {\n const doc = await client.collections(plan.collection).documents(plan.near.id).retrieve()\n queryVector = doc.vec as number[]\n } catch {\n queryVector = undefined\n }\n if (!queryVector) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n }\n }\n\n const offset = plan.offset ?? 0\n try {\n const coll = client.collections(plan.collection).documents()\n if (queryVector) {\n // Over-fetch then JS-filter for exact cross-adapter filter semantics.\n const k = Math.max(plan.topK + offset, plan.topK) + (plan.filter ? 250 : 0)\n const res = await coll.search({\n q: '*',\n vector_query: `vec:([${queryVector.join(',')}], k:${k})`,\n per_page: Math.min(250, k),\n })\n const hits = (res.hits ?? []) as any[]\n const mapped = hits.map((hit) => ({\n match: this.#project(hit.document, plan, metric, hit.vector_distance),\n meta: this.#parseMeta(hit.document.metadata),\n }))\n const filtered = plan.filter\n ? mapped.filter((m) => evaluateFilter(plan.filter!, m.meta))\n : mapped\n return filtered.slice(offset, offset + plan.topK).map((m) => m.match)\n } else {\n const res = await coll.search({ q: '*', query_by: 'document', per_page: 250 })\n const hits = (res.hits ?? []) as any[]\n const mapped = hits.map((hit) => ({\n match: this.#project(hit.document, plan, metric, undefined),\n meta: this.#parseMeta(hit.document.metadata),\n }))\n const filtered = plan.filter\n ? mapped.filter((m) => evaluateFilter(plan.filter!, m.meta))\n : mapped\n return filtered.slice(offset, offset + plan.topK).map((m) => m.match)\n }\n } catch (err) {\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\n }\n\n #parseMeta(val: unknown): VectorMetadata {\n if (typeof val === 'string') {\n try {\n return JSON.parse(val) as VectorMetadata\n } catch {\n return {}\n }\n }\n if (val && typeof val === 'object') return val as VectorMetadata\n return {}\n }\n\n #project(doc: any, plan: SearchPlan, metric: string, dist: number | undefined): VectorMatch {\n const proj = plan.projection\n const out: VectorMatch = {}\n if (proj.id) out.id = doc.id as string\n if (proj.vector && Array.isArray(doc.vec)) out.vector = doc.vec as number[]\n if (proj.document) out.document = (doc.document ?? undefined) as string | undefined\n if (proj.metadata) out.metadata = this.#parseMeta(doc.metadata)\n if (dist !== undefined && dist !== null) {\n out.score = normalizeScore(Number(dist), metric as DistanceMetric, 'distance')\n }\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const client = await this.#ensure()\n const collection = client.collections(plan.collection)\n const coll = collection.documents()\n // Delete a single document by id: documents(id).delete() (NOT documents().delete(id),\n // which targets the bulk filter endpoint).\n const deleteOne = async (id: string): Promise<void> => {\n await collection\n .documents(id)\n .delete()\n .catch(() => undefined)\n }\n try {\n if (plan.ids && plan.ids.length > 0) {\n for (const id of plan.ids) await deleteOne(id)\n } else if (plan.filter) {\n // Resolve ids via a scan + JS evaluator, then delete by id.\n const res = await coll.search({ q: '*', query_by: 'document', per_page: 250 })\n const hits = (res.hits ?? []) as any[]\n const targets = hits\n .filter((hit) => evaluateFilter(plan.filter!, this.#parseMeta(hit.document.metadata)))\n .map((hit) => hit.document.id as string)\n for (const id of targets) await deleteOne(id)\n } else {\n // Delete-all: bulk delete by an always-true filter; fall back to per-id on error.\n try {\n await coll.delete({ filter_by: 'id:!= ' })\n } catch {\n const res = await coll.search({ q: '*', query_by: 'document', per_page: 250 })\n const hits = (res.hits ?? []) as any[]\n for (const hit of hits) await deleteOne(hit.document.id as string)\n }\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { s as isInstanceOf } from "../../tool_registry-
|
|
1
|
+
import { s as isInstanceOf } from "../../tool_registry-791Vrjtf.mjs";
|
|
2
2
|
import "../../guards.mjs";
|
|
3
3
|
import { evaluateFilter } from "./filters.mjs";
|
|
4
4
|
import { normalizeScore } from "./helpers.mjs";
|
|
@@ -43,6 +43,7 @@ var TypesenseVectorStore = class extends BaseVectorStore {
|
|
|
43
43
|
get #opts() {
|
|
44
44
|
return this.options;
|
|
45
45
|
}
|
|
46
|
+
/** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
|
|
46
47
|
static isAvailable() {
|
|
47
48
|
return typeof process !== "undefined";
|
|
48
49
|
}
|