@nhtio/adk 1.20260607.2 → 1.20260609.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +185 -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/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 +1 -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/searxng/exceptions.d.ts +21 -0
- package/batteries/tools/searxng/index.d.ts +150 -0
- package/batteries/tools/searxng.cjs +5 -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.cjs +3 -0
- package/batteries/tools.mjs +2 -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 +46 -28
- package/batteries.mjs +10 -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.d.ts +1 -1
- 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.cjs +1 -1
- package/eslint.mjs +1 -1
- 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 +13 -13
- package/index.mjs +13 -13
- 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 +264 -224
- 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/searxng-Bkrwhwhw.js +269 -0
- package/searxng-Bkrwhwhw.js.map +1 -0
- package/searxng-CyA-nEu5.mjs +257 -0
- package/searxng-CyA-nEu5.mjs.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,7 +1,12 @@
|
|
|
1
1
|
//#region src/batteries/vector/schema.ts
|
|
2
|
+
/**
|
|
3
|
+
* Chainable builder for a single collection definition — declares the vector column and the typed
|
|
4
|
+
* metadata fields, compiled to a {@link CollectionSpec} by {@link CollectionBuilder.build}.
|
|
5
|
+
*/
|
|
2
6
|
var CollectionBuilder = class {
|
|
3
7
|
#vectorDef;
|
|
4
8
|
#fields = [];
|
|
9
|
+
/** Declare the vector column's dimensionality and (optionally) its distance metric (default `'cosine'`). */
|
|
5
10
|
vector(def) {
|
|
6
11
|
this.#vectorDef = {
|
|
7
12
|
dimensions: def.dimensions,
|
|
@@ -9,18 +14,23 @@ var CollectionBuilder = class {
|
|
|
9
14
|
};
|
|
10
15
|
return this;
|
|
11
16
|
}
|
|
17
|
+
/** Declare a string metadata field; returns a {@link FieldChain} for `.index()`/`.nullable()`. */
|
|
12
18
|
string(name) {
|
|
13
19
|
return this.#pushField(name, "string");
|
|
14
20
|
}
|
|
21
|
+
/** Declare an integer metadata field; returns a {@link FieldChain} for `.index()`/`.nullable()`. */
|
|
15
22
|
integer(name) {
|
|
16
23
|
return this.#pushField(name, "integer");
|
|
17
24
|
}
|
|
25
|
+
/** Declare a number metadata field; returns a {@link FieldChain} for `.index()`/`.nullable()`. */
|
|
18
26
|
number(name) {
|
|
19
27
|
return this.#pushField(name, "number");
|
|
20
28
|
}
|
|
29
|
+
/** Declare a boolean metadata field; returns a {@link FieldChain} for `.index()`/`.nullable()`. */
|
|
21
30
|
boolean(name) {
|
|
22
31
|
return this.#pushField(name, "boolean");
|
|
23
32
|
}
|
|
33
|
+
/** Declare a JSON metadata field; returns a {@link FieldChain} for `.index()`/`.nullable()`. */
|
|
24
34
|
json(name) {
|
|
25
35
|
return this.#pushField(name, "json");
|
|
26
36
|
}
|
|
@@ -34,6 +44,11 @@ var CollectionBuilder = class {
|
|
|
34
44
|
this.#fields.push(spec);
|
|
35
45
|
return new FieldChainImpl(spec);
|
|
36
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* Compile the accumulated definition into a {@link CollectionSpec}.
|
|
49
|
+
*
|
|
50
|
+
* @throws when no {@link CollectionBuilder.vector} definition was declared.
|
|
51
|
+
*/
|
|
37
52
|
build(collection) {
|
|
38
53
|
if (!this.#vectorDef) throw new Error("a collection requires a vector() definition");
|
|
39
54
|
return {
|
|
@@ -57,32 +72,45 @@ var FieldChainImpl = class {
|
|
|
57
72
|
return this;
|
|
58
73
|
}
|
|
59
74
|
};
|
|
75
|
+
/**
|
|
76
|
+
* Knex-style schema facade exposing collection DDL (create/drop/rename/has) over a
|
|
77
|
+
* {@link SchemaExecutor}. Returned by a vector store's `schema()` accessor.
|
|
78
|
+
*/
|
|
60
79
|
var VectorSchemaBuilder = class {
|
|
61
80
|
#executor;
|
|
81
|
+
/**
|
|
82
|
+
* @param executor - The adapter-backed executor the DDL calls are drained into.
|
|
83
|
+
*/
|
|
62
84
|
constructor(executor) {
|
|
63
85
|
this.#executor = executor;
|
|
64
86
|
}
|
|
87
|
+
/** Create a collection, defining it via the `cb` builder. Errors if it already exists. */
|
|
65
88
|
async createCollection(collection, cb) {
|
|
66
89
|
const builder = new CollectionBuilder();
|
|
67
90
|
cb(builder);
|
|
68
91
|
const spec = builder.build(collection);
|
|
69
92
|
await this.#executor.createCollection(spec, false);
|
|
70
93
|
}
|
|
94
|
+
/** Create a collection only if absent; a no-op if it already exists. */
|
|
71
95
|
async createCollectionIfNotExists(collection, cb) {
|
|
72
96
|
const builder = new CollectionBuilder();
|
|
73
97
|
cb(builder);
|
|
74
98
|
const spec = builder.build(collection);
|
|
75
99
|
await this.#executor.createCollection(spec, true);
|
|
76
100
|
}
|
|
101
|
+
/** Drop a collection. Errors if it does not exist. */
|
|
77
102
|
async dropCollection(collection) {
|
|
78
103
|
await this.#executor.dropCollection(collection, false);
|
|
79
104
|
}
|
|
105
|
+
/** Drop a collection only if present; a no-op if it does not exist. */
|
|
80
106
|
async dropCollectionIfExists(collection) {
|
|
81
107
|
await this.#executor.dropCollection(collection, true);
|
|
82
108
|
}
|
|
109
|
+
/** Resolve `true` if the collection exists. */
|
|
83
110
|
async hasCollection(collection) {
|
|
84
111
|
return this.#executor.hasCollection(collection);
|
|
85
112
|
}
|
|
113
|
+
/** Rename a collection from `from` to `to`. */
|
|
86
114
|
async renameCollection(from, to) {
|
|
87
115
|
await this.#executor.renameCollection(from, to);
|
|
88
116
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.mjs","names":["#vectorDef","#pushField","#fields","#spec","#executor"],"sources":["../../../src/batteries/vector/schema.ts"],"sourcesContent":["/**\n * Knex-style schema builder for the vector battery.\n *\n * @module @nhtio/adk/batteries/vector/schema\n */\n\nimport type { DistanceMetric } from './types'\nimport type { CollectionSpec, CollectionFieldSpec } from './plan'\n\nexport interface SchemaExecutor {\n createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void>\n dropCollection(collection: string, ifExists: boolean): Promise<void>\n hasCollection(collection: string): Promise<boolean>\n renameCollection(from: string, to: string): Promise<void>\n}\n\nexport class CollectionBuilder {\n #vectorDef?: { dimensions: number; metric: DistanceMetric }\n #fields: CollectionFieldSpec[] = []\n\n vector(def: { dimensions: number; metric?: DistanceMetric }): this {\n this.#vectorDef = {\n dimensions: def.dimensions,\n metric: def.metric ?? 'cosine',\n }\n return this\n }\n\n string(name: string): FieldChain {\n return this.#pushField(name, 'string')\n }\n\n integer(name: string): FieldChain {\n return this.#pushField(name, 'integer')\n }\n\n number(name: string): FieldChain {\n return this.#pushField(name, 'number')\n }\n\n boolean(name: string): FieldChain {\n return this.#pushField(name, 'boolean')\n }\n\n json(name: string): FieldChain {\n return this.#pushField(name, 'json')\n }\n\n #pushField(name: string, type: CollectionFieldSpec['type']): FieldChain {\n const spec: CollectionFieldSpec = {\n name,\n type,\n index: false,\n nullable: false,\n }\n this.#fields.push(spec)\n return new FieldChainImpl(spec)\n }\n\n build(collection: string): CollectionSpec {\n if (!this.#vectorDef) {\n throw new Error('a collection requires a vector() definition')\n }\n return {\n collection,\n vector: this.#vectorDef,\n fields: this.#fields,\n }\n }\n}\n\nexport interface FieldChain {\n index(): FieldChain\n nullable(): FieldChain\n}\n\nclass FieldChainImpl implements FieldChain {\n #spec: CollectionFieldSpec\n\n constructor(spec: CollectionFieldSpec) {\n this.#spec = spec\n }\n\n index(): FieldChain {\n this.#spec.index = true\n return this\n }\n\n nullable(): FieldChain {\n this.#spec.nullable = true\n return this\n }\n}\n\nexport class VectorSchemaBuilder {\n #executor: SchemaExecutor\n\n constructor(executor: SchemaExecutor) {\n this.#executor = executor\n }\n\n async createCollection(collection: string, cb: (c: CollectionBuilder) => void): Promise<void> {\n const builder = new CollectionBuilder()\n cb(builder)\n const spec = builder.build(collection)\n await this.#executor.createCollection(spec, false)\n }\n\n async createCollectionIfNotExists(\n collection: string,\n cb: (c: CollectionBuilder) => void\n ): Promise<void> {\n const builder = new CollectionBuilder()\n cb(builder)\n const spec = builder.build(collection)\n await this.#executor.createCollection(spec, true)\n }\n\n async dropCollection(collection: string): Promise<void> {\n await this.#executor.dropCollection(collection, false)\n }\n\n async dropCollectionIfExists(collection: string): Promise<void> {\n await this.#executor.dropCollection(collection, true)\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n return this.#executor.hasCollection(collection)\n }\n\n async renameCollection(from: string, to: string): Promise<void> {\n await this.#executor.renameCollection(from, to)\n }\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"schema.mjs","names":["#vectorDef","#pushField","#fields","#spec","#executor"],"sources":["../../../src/batteries/vector/schema.ts"],"sourcesContent":["/**\n * Knex-style schema builder for the vector battery.\n *\n * @module @nhtio/adk/batteries/vector/schema\n */\n\nimport type { DistanceMetric } from './types'\nimport type { CollectionSpec, CollectionFieldSpec } from './plan'\n\n/**\n * The backend side of the schema builder — the adapter operations a {@link VectorSchemaBuilder}\n * drains its compiled {@link CollectionSpec}s and DDL calls into.\n */\nexport interface SchemaExecutor {\n /** Create a collection from `spec`; `ifNotExists` suppresses the already-exists error. */\n createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void>\n /** Drop a collection; `ifExists` suppresses the not-found error. */\n dropCollection(collection: string, ifExists: boolean): Promise<void>\n /** Resolve `true` if the collection exists. */\n hasCollection(collection: string): Promise<boolean>\n /** Rename a collection from `from` to `to`. */\n renameCollection(from: string, to: string): Promise<void>\n}\n\n/**\n * Chainable builder for a single collection definition — declares the vector column and the typed\n * metadata fields, compiled to a {@link CollectionSpec} by {@link CollectionBuilder.build}.\n */\nexport class CollectionBuilder {\n #vectorDef?: { dimensions: number; metric: DistanceMetric }\n #fields: CollectionFieldSpec[] = []\n\n /** Declare the vector column's dimensionality and (optionally) its distance metric (default `'cosine'`). */\n vector(def: { dimensions: number; metric?: DistanceMetric }): this {\n this.#vectorDef = {\n dimensions: def.dimensions,\n metric: def.metric ?? 'cosine',\n }\n return this\n }\n\n /** Declare a string metadata field; returns a {@link FieldChain} for `.index()`/`.nullable()`. */\n string(name: string): FieldChain {\n return this.#pushField(name, 'string')\n }\n\n /** Declare an integer metadata field; returns a {@link FieldChain} for `.index()`/`.nullable()`. */\n integer(name: string): FieldChain {\n return this.#pushField(name, 'integer')\n }\n\n /** Declare a number metadata field; returns a {@link FieldChain} for `.index()`/`.nullable()`. */\n number(name: string): FieldChain {\n return this.#pushField(name, 'number')\n }\n\n /** Declare a boolean metadata field; returns a {@link FieldChain} for `.index()`/`.nullable()`. */\n boolean(name: string): FieldChain {\n return this.#pushField(name, 'boolean')\n }\n\n /** Declare a JSON metadata field; returns a {@link FieldChain} for `.index()`/`.nullable()`. */\n json(name: string): FieldChain {\n return this.#pushField(name, 'json')\n }\n\n #pushField(name: string, type: CollectionFieldSpec['type']): FieldChain {\n const spec: CollectionFieldSpec = {\n name,\n type,\n index: false,\n nullable: false,\n }\n this.#fields.push(spec)\n return new FieldChainImpl(spec)\n }\n\n /**\n * Compile the accumulated definition into a {@link CollectionSpec}.\n *\n * @throws when no {@link CollectionBuilder.vector} definition was declared.\n */\n build(collection: string): CollectionSpec {\n if (!this.#vectorDef) {\n throw new Error('a collection requires a vector() definition')\n }\n return {\n collection,\n vector: this.#vectorDef,\n fields: this.#fields,\n }\n }\n}\n\n/** Post-declaration chain for a metadata field, toggling indexing and nullability. */\nexport interface FieldChain {\n /** Mark the field as indexed for filtering. */\n index(): FieldChain\n /** Mark the field as nullable. */\n nullable(): FieldChain\n}\n\nclass FieldChainImpl implements FieldChain {\n #spec: CollectionFieldSpec\n\n constructor(spec: CollectionFieldSpec) {\n this.#spec = spec\n }\n\n index(): FieldChain {\n this.#spec.index = true\n return this\n }\n\n nullable(): FieldChain {\n this.#spec.nullable = true\n return this\n }\n}\n\n/**\n * Knex-style schema facade exposing collection DDL (create/drop/rename/has) over a\n * {@link SchemaExecutor}. Returned by a vector store's `schema()` accessor.\n */\nexport class VectorSchemaBuilder {\n #executor: SchemaExecutor\n\n /**\n * @param executor - The adapter-backed executor the DDL calls are drained into.\n */\n constructor(executor: SchemaExecutor) {\n this.#executor = executor\n }\n\n /** Create a collection, defining it via the `cb` builder. Errors if it already exists. */\n async createCollection(collection: string, cb: (c: CollectionBuilder) => void): Promise<void> {\n const builder = new CollectionBuilder()\n cb(builder)\n const spec = builder.build(collection)\n await this.#executor.createCollection(spec, false)\n }\n\n /** Create a collection only if absent; a no-op if it already exists. */\n async createCollectionIfNotExists(\n collection: string,\n cb: (c: CollectionBuilder) => void\n ): Promise<void> {\n const builder = new CollectionBuilder()\n cb(builder)\n const spec = builder.build(collection)\n await this.#executor.createCollection(spec, true)\n }\n\n /** Drop a collection. Errors if it does not exist. */\n async dropCollection(collection: string): Promise<void> {\n await this.#executor.dropCollection(collection, false)\n }\n\n /** Drop a collection only if present; a no-op if it does not exist. */\n async dropCollectionIfExists(collection: string): Promise<void> {\n await this.#executor.dropCollection(collection, true)\n }\n\n /** Resolve `true` if the collection exists. */\n async hasCollection(collection: string): Promise<boolean> {\n return this.#executor.hasCollection(collection)\n }\n\n /** Rename a collection from `from` to `to`. */\n async renameCollection(from: string, to: string): Promise<void> {\n await this.#executor.renameCollection(from, to)\n }\n}\n"],"mappings":";;;;;AA4BA,IAAa,oBAAb,MAA+B;CAC7B;CACA,UAAiC,CAAC;;CAGlC,OAAO,KAA4D;EACjE,KAAKA,aAAa;GAChB,YAAY,IAAI;GAChB,QAAQ,IAAI,UAAU;EACxB;EACA,OAAO;CACT;;CAGA,OAAO,MAA0B;EAC/B,OAAO,KAAKC,WAAW,MAAM,QAAQ;CACvC;;CAGA,QAAQ,MAA0B;EAChC,OAAO,KAAKA,WAAW,MAAM,SAAS;CACxC;;CAGA,OAAO,MAA0B;EAC/B,OAAO,KAAKA,WAAW,MAAM,QAAQ;CACvC;;CAGA,QAAQ,MAA0B;EAChC,OAAO,KAAKA,WAAW,MAAM,SAAS;CACxC;;CAGA,KAAK,MAA0B;EAC7B,OAAO,KAAKA,WAAW,MAAM,MAAM;CACrC;CAEA,WAAW,MAAc,MAA+C;EACtE,MAAM,OAA4B;GAChC;GACA;GACA,OAAO;GACP,UAAU;EACZ;EACA,KAAKC,QAAQ,KAAK,IAAI;EACtB,OAAO,IAAI,eAAe,IAAI;CAChC;;;;;;CAOA,MAAM,YAAoC;EACxC,IAAI,CAAC,KAAKF,YACR,MAAM,IAAI,MAAM,6CAA6C;EAE/D,OAAO;GACL;GACA,QAAQ,KAAKA;GACb,QAAQ,KAAKE;EACf;CACF;AACF;AAUA,IAAM,iBAAN,MAA2C;CACzC;CAEA,YAAY,MAA2B;EACrC,KAAKC,QAAQ;CACf;CAEA,QAAoB;EAClB,KAAKA,MAAM,QAAQ;EACnB,OAAO;CACT;CAEA,WAAuB;EACrB,KAAKA,MAAM,WAAW;EACtB,OAAO;CACT;AACF;;;;;AAMA,IAAa,sBAAb,MAAiC;CAC/B;;;;CAKA,YAAY,UAA0B;EACpC,KAAKC,YAAY;CACnB;;CAGA,MAAM,iBAAiB,YAAoB,IAAmD;EAC5F,MAAM,UAAU,IAAI,kBAAkB;EACtC,GAAG,OAAO;EACV,MAAM,OAAO,QAAQ,MAAM,UAAU;EACrC,MAAM,KAAKA,UAAU,iBAAiB,MAAM,KAAK;CACnD;;CAGA,MAAM,4BACJ,YACA,IACe;EACf,MAAM,UAAU,IAAI,kBAAkB;EACtC,GAAG,OAAO;EACV,MAAM,OAAO,QAAQ,MAAM,UAAU;EACrC,MAAM,KAAKA,UAAU,iBAAiB,MAAM,IAAI;CAClD;;CAGA,MAAM,eAAe,YAAmC;EACtD,MAAM,KAAKA,UAAU,eAAe,YAAY,KAAK;CACvD;;CAGA,MAAM,uBAAuB,YAAmC;EAC9D,MAAM,KAAKA,UAAU,eAAe,YAAY,IAAI;CACtD;;CAGA,MAAM,cAAc,YAAsC;EACxD,OAAO,KAAKA,UAAU,cAAc,UAAU;CAChD;;CAGA,MAAM,iBAAiB,MAAc,IAA2B;EAC9D,MAAM,KAAKA,UAAU,iBAAiB,MAAM,EAAE;CAChD;AACF"}
|
|
@@ -15,6 +15,7 @@ import { BaseVectorStore } from "../contract";
|
|
|
15
15
|
import type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from "../plan";
|
|
16
16
|
import type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from "../types";
|
|
17
17
|
export interface SolrVectorStoreOptions extends BaseVectorStoreOptions {
|
|
18
|
+
/** Connection and authentication parameters for the backend. */
|
|
18
19
|
connection: {
|
|
19
20
|
url: string;
|
|
20
21
|
};
|
|
@@ -22,6 +23,7 @@ export interface SolrVectorStoreOptions extends BaseVectorStoreOptions {
|
|
|
22
23
|
export declare class SolrVectorStore extends BaseVectorStore {
|
|
23
24
|
#private;
|
|
24
25
|
readonly capabilities: VectorStoreCapabilities;
|
|
26
|
+
/** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
|
|
25
27
|
static isAvailable(): boolean;
|
|
26
28
|
isAvailable(): boolean;
|
|
27
29
|
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");
|
|
@@ -39,6 +39,7 @@ var SolrVectorStore = class extends require_batteries_vector_contract.BaseVector
|
|
|
39
39
|
get #opts() {
|
|
40
40
|
return this.options;
|
|
41
41
|
}
|
|
42
|
+
/** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
|
|
42
43
|
static isAvailable() {
|
|
43
44
|
return typeof process !== "undefined" && typeof fetch === "function";
|
|
44
45
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solr.cjs","names":["#opts","#base","#core","#post","#get","#dims","#escape","#parseMeta","#project"],"sources":["../../../src/batteries/vector/solr/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/solr\n *\n * Apache Solr adapter (dense vector / kNN query parser, Solr 9+). A logical collection maps to a\n * Solr core; the adapter ensures a `DenseVectorField` (`vec`) plus `document`/`metadata` string\n * fields exist in the core schema, then uses the `{!knn f=vec topK=N}[...]` parser for search.\n * Score is Solr's cosine similarity ([0,1]). Metadata is a JSON string field filtered with the\n * neutral filter tree's JS reference evaluator for cross-adapter parity.\n *\n * No typed driver — Solr is plain HTTP/JSON, so this uses `fetch` (zero extra dependency). The\n * target core must already exist (e.g. `solr-precreate <core>` / the Core Admin API); the adapter\n * does not create cores at runtime, only their schema fields. `collection` is the core name.\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_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 SolrVectorStoreOptions extends BaseVectorStoreOptions {\n connection: { url: string }\n}\n\nconst simFn = (metric: DistanceMetric): string =>\n metric === 'euclidean' ? 'euclidean' : metric === 'dot' ? 'dot_product' : 'cosine'\n\nexport class SolrVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: false,\n rawSql: false,\n builtInEncoding: false,\n // Writes are committed (commit=true) before resolving, so they're visible to the next query.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n\n #base: string | null = null\n #dims: Map<string, number> = new Map()\n\n get #opts(): SolrVectorStoreOptions {\n return this.options as SolrVectorStoreOptions\n }\n\n static isAvailable(): boolean {\n return typeof process !== 'undefined' && typeof fetch === 'function'\n }\n isAvailable(): boolean {\n return typeof process !== 'undefined' && typeof fetch === 'function'\n }\n\n async connect(): Promise<void> {\n if (this.#base) return\n const url = this.#opts.connection?.url\n if (!url) throw new E_VECTOR_STORE_CONNECTION_FAILED(['Solr requires connection.url'])\n this.#base = url.replace(/\\/$/, '')\n }\n\n async close(): Promise<void> {\n this.#base = null\n }\n\n async #core(collection: string): Promise<string> {\n if (!this.#base) await this.connect()\n return `${this.#base}/solr/${encodeURIComponent(collection)}`\n }\n\n async #post(coreUrl: string, path: string, body: unknown): Promise<any> {\n const res = await fetch(coreUrl + path, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n })\n const json = await res.json().catch(() => ({}))\n if (!res.ok || json.error) {\n throw new Error(json.error?.msg ?? `HTTP ${res.status}`)\n }\n return json\n }\n\n async #get(coreUrl: string, path: string): Promise<any> {\n const res = await fetch(coreUrl + path)\n const json = await res.json().catch(() => ({}))\n if (!res.ok || json.error) {\n throw new Error(json.error?.msg ?? `HTTP ${res.status}`)\n }\n return json\n }\n\n async createCollection(spec: CollectionSpec, _ifNotExists: boolean): Promise<void> {\n const core = await this.#core(spec.collection)\n this.#dims.set(spec.collection, spec.vector.dimensions)\n const ftName = `knn_${spec.vector.dimensions}_${simFn(spec.vector.metric)}`\n try {\n // Ensure the dense-vector field type (idempotent: ignore \"already exists\").\n await this.#post(core, '/schema', {\n 'add-field-type': {\n name: ftName,\n class: 'solr.DenseVectorField',\n vectorDimension: spec.vector.dimensions,\n similarityFunction: simFn(spec.vector.metric),\n },\n }).catch((e: unknown) => {\n if (!String(e).includes('already')) throw e\n })\n // Ensure the fields (idempotent per field).\n for (const f of [\n { name: 'vec', type: ftName, indexed: true, stored: true },\n { name: 'document', type: 'string', stored: true },\n { name: 'metadata', type: 'string', stored: true },\n ]) {\n await this.#post(core, '/schema', { 'add-field': f }).catch((e: unknown) => {\n if (!String(e).includes('already')) throw e\n })\n }\n // Start from an empty core for this logical collection.\n await this.#post(core, '/update?commit=true', { delete: { query: '*:*' } })\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 // Cores aren't created/destroyed at runtime here; \"drop\" clears the core's documents.\n try {\n const core = await this.#core(collection)\n await this.#post(core, '/update?commit=true', { delete: { query: '*:*' } })\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 core = await this.#core(collection)\n await this.#get(core, '/admin/ping')\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', 'solr'])\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const core = await this.#core(plan.collection)\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 // Solr upserts by id; commit so the write is visible to the next query.\n await this.#post(core, '/update?commit=true', docs)\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 core = await this.#core(plan.collection)\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 r = await this.#get(\n core,\n `/select?q=${encodeURIComponent('id:' + this.#escape(plan.near.id))}&fl=vec&rows=1`\n )\n const doc = r.response?.docs?.[0]\n if (!doc) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = doc.vec as number[]\n }\n }\n\n const offset = plan.offset ?? 0\n const fl = 'id,vec,document,metadata,score'\n try {\n let docs: any[]\n if (queryVector) {\n const k = (plan.filter ? 1000 : plan.topK + offset) || 10\n const q = `{!knn f=vec topK=${k}}[${queryVector.join(',')}]`\n const r = await this.#get(core, `/select?q=${encodeURIComponent(q)}&fl=${fl}&rows=${k}`)\n docs = r.response?.docs ?? []\n } else {\n const r = await this.#get(core, `/select?q=*:*&fl=${fl}&rows=100000`)\n docs = r.response?.docs ?? []\n }\n const filtered = plan.filter\n ? docs.filter((d) => evaluateFilter(plan.filter!, this.#parseMeta(d.metadata)))\n : docs\n return filtered\n .slice(offset, offset + plan.topK)\n .map((d) => this.#project(d, plan, !!queryVector))\n } catch (err) {\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\n }\n\n #escape(value: string): string {\n // Escape Solr query special chars for an id: term match.\n return value.replace(/([+\\-!(){}[\\]^\"~*?:\\\\/ ])/g, '\\\\$1')\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, isKnn: boolean): 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[]).map(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 (isKnn && typeof doc.score === 'number') {\n // Solr's DenseVectorField cosine score is already in [0,1], higher = closer.\n out.score = doc.score\n }\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const core = await this.#core(plan.collection)\n try {\n if (plan.ids && plan.ids.length > 0) {\n await this.#post(core, '/update?commit=true', { delete: plan.ids })\n } else if (plan.filter) {\n const r = await this.#get(core, `/select?q=*:*&fl=id,metadata&rows=100000`)\n const docs = r.response?.docs ?? []\n const targets = docs\n .filter((d: any) => evaluateFilter(plan.filter!, this.#parseMeta(d.metadata)))\n .map((d: any) => d.id as string)\n if (targets.length > 0) {\n await this.#post(core, '/update?commit=true', { delete: targets })\n }\n } else {\n await this.#post(core, '/update?commit=true', { delete: { query: '*:*' } })\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":"solr.cjs","names":["#opts","#base","#core","#post","#get","#dims","#escape","#parseMeta","#project"],"sources":["../../../src/batteries/vector/solr/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/solr\n *\n * Apache Solr adapter (dense vector / kNN query parser, Solr 9+). A logical collection maps to a\n * Solr core; the adapter ensures a `DenseVectorField` (`vec`) plus `document`/`metadata` string\n * fields exist in the core schema, then uses the `{!knn f=vec topK=N}[...]` parser for search.\n * Score is Solr's cosine similarity ([0,1]). Metadata is a JSON string field filtered with the\n * neutral filter tree's JS reference evaluator for cross-adapter parity.\n *\n * No typed driver — Solr is plain HTTP/JSON, so this uses `fetch` (zero extra dependency). The\n * target core must already exist (e.g. `solr-precreate <core>` / the Core Admin API); the adapter\n * does not create cores at runtime, only their schema fields. `collection` is the core name.\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_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 SolrVectorStoreOptions extends BaseVectorStoreOptions {\n /** Connection and authentication parameters for the backend. */\n connection: { url: string }\n}\n\nconst simFn = (metric: DistanceMetric): string =>\n metric === 'euclidean' ? 'euclidean' : metric === 'dot' ? 'dot_product' : 'cosine'\n\nexport class SolrVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: false,\n rawSql: false,\n builtInEncoding: false,\n // Writes are committed (commit=true) before resolving, so they're visible to the next query.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n\n #base: string | null = null\n #dims: Map<string, number> = new Map()\n\n get #opts(): SolrVectorStoreOptions {\n return this.options as SolrVectorStoreOptions\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' && typeof fetch === 'function'\n }\n isAvailable(): boolean {\n return typeof process !== 'undefined' && typeof fetch === 'function'\n }\n\n async connect(): Promise<void> {\n if (this.#base) return\n const url = this.#opts.connection?.url\n if (!url) throw new E_VECTOR_STORE_CONNECTION_FAILED(['Solr requires connection.url'])\n this.#base = url.replace(/\\/$/, '')\n }\n\n async close(): Promise<void> {\n this.#base = null\n }\n\n async #core(collection: string): Promise<string> {\n if (!this.#base) await this.connect()\n return `${this.#base}/solr/${encodeURIComponent(collection)}`\n }\n\n async #post(coreUrl: string, path: string, body: unknown): Promise<any> {\n const res = await fetch(coreUrl + path, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n })\n const json = await res.json().catch(() => ({}))\n if (!res.ok || json.error) {\n throw new Error(json.error?.msg ?? `HTTP ${res.status}`)\n }\n return json\n }\n\n async #get(coreUrl: string, path: string): Promise<any> {\n const res = await fetch(coreUrl + path)\n const json = await res.json().catch(() => ({}))\n if (!res.ok || json.error) {\n throw new Error(json.error?.msg ?? `HTTP ${res.status}`)\n }\n return json\n }\n\n async createCollection(spec: CollectionSpec, _ifNotExists: boolean): Promise<void> {\n const core = await this.#core(spec.collection)\n this.#dims.set(spec.collection, spec.vector.dimensions)\n const ftName = `knn_${spec.vector.dimensions}_${simFn(spec.vector.metric)}`\n try {\n // Ensure the dense-vector field type (idempotent: ignore \"already exists\").\n await this.#post(core, '/schema', {\n 'add-field-type': {\n name: ftName,\n class: 'solr.DenseVectorField',\n vectorDimension: spec.vector.dimensions,\n similarityFunction: simFn(spec.vector.metric),\n },\n }).catch((e: unknown) => {\n if (!String(e).includes('already')) throw e\n })\n // Ensure the fields (idempotent per field).\n for (const f of [\n { name: 'vec', type: ftName, indexed: true, stored: true },\n { name: 'document', type: 'string', stored: true },\n { name: 'metadata', type: 'string', stored: true },\n ]) {\n await this.#post(core, '/schema', { 'add-field': f }).catch((e: unknown) => {\n if (!String(e).includes('already')) throw e\n })\n }\n // Start from an empty core for this logical collection.\n await this.#post(core, '/update?commit=true', { delete: { query: '*:*' } })\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 // Cores aren't created/destroyed at runtime here; \"drop\" clears the core's documents.\n try {\n const core = await this.#core(collection)\n await this.#post(core, '/update?commit=true', { delete: { query: '*:*' } })\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 core = await this.#core(collection)\n await this.#get(core, '/admin/ping')\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', 'solr'])\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const core = await this.#core(plan.collection)\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 // Solr upserts by id; commit so the write is visible to the next query.\n await this.#post(core, '/update?commit=true', docs)\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 core = await this.#core(plan.collection)\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 r = await this.#get(\n core,\n `/select?q=${encodeURIComponent('id:' + this.#escape(plan.near.id))}&fl=vec&rows=1`\n )\n const doc = r.response?.docs?.[0]\n if (!doc) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = doc.vec as number[]\n }\n }\n\n const offset = plan.offset ?? 0\n const fl = 'id,vec,document,metadata,score'\n try {\n let docs: any[]\n if (queryVector) {\n const k = (plan.filter ? 1000 : plan.topK + offset) || 10\n const q = `{!knn f=vec topK=${k}}[${queryVector.join(',')}]`\n const r = await this.#get(core, `/select?q=${encodeURIComponent(q)}&fl=${fl}&rows=${k}`)\n docs = r.response?.docs ?? []\n } else {\n const r = await this.#get(core, `/select?q=*:*&fl=${fl}&rows=100000`)\n docs = r.response?.docs ?? []\n }\n const filtered = plan.filter\n ? docs.filter((d) => evaluateFilter(plan.filter!, this.#parseMeta(d.metadata)))\n : docs\n return filtered\n .slice(offset, offset + plan.topK)\n .map((d) => this.#project(d, plan, !!queryVector))\n } catch (err) {\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\n }\n\n #escape(value: string): string {\n // Escape Solr query special chars for an id: term match.\n return value.replace(/([+\\-!(){}[\\]^\"~*?:\\\\/ ])/g, '\\\\$1')\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, isKnn: boolean): 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[]).map(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 (isKnn && typeof doc.score === 'number') {\n // Solr's DenseVectorField cosine score is already in [0,1], higher = closer.\n out.score = doc.score\n }\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const core = await this.#core(plan.collection)\n try {\n if (plan.ids && plan.ids.length > 0) {\n await this.#post(core, '/update?commit=true', { delete: plan.ids })\n } else if (plan.filter) {\n const r = await this.#get(core, `/select?q=*:*&fl=id,metadata&rows=100000`)\n const docs = r.response?.docs ?? []\n const targets = docs\n .filter((d: any) => evaluateFilter(plan.filter!, this.#parseMeta(d.metadata)))\n .map((d: any) => d.id as string)\n if (targets.length > 0) {\n await this.#post(core, '/update?commit=true', { delete: targets })\n }\n } else {\n await this.#post(core, '/update?commit=true', { delete: { query: '*:*' } })\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAyCA,IAAM,SAAS,WACb,WAAW,cAAc,cAAc,WAAW,QAAQ,gBAAgB;AAE5E,IAAa,kBAAb,cAAqC,kCAAA,gBAAgB;CACnD,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,QAAuB;CACvB,wBAA6B,IAAI,IAAI;CAErC,IAAIA,QAAgC;EAClC,OAAO,KAAK;CACd;;CAGA,OAAO,cAAuB;EAC5B,OAAO,OAAO,YAAY,eAAe,OAAO,UAAU;CAC5D;CACA,cAAuB;EACrB,OAAO,OAAO,YAAY,eAAe,OAAO,UAAU;CAC5D;CAEA,MAAM,UAAyB;EAC7B,IAAI,KAAKC,OAAO;EAChB,MAAM,MAAM,KAAKD,MAAM,YAAY;EACnC,IAAI,CAAC,KAAK,MAAM,IAAI,oCAAA,iCAAiC,CAAC,8BAA8B,CAAC;EACrF,KAAKC,QAAQ,IAAI,QAAQ,OAAO,EAAE;CACpC;CAEA,MAAM,QAAuB;EAC3B,KAAKA,QAAQ;CACf;CAEA,MAAMC,MAAM,YAAqC;EAC/C,IAAI,CAAC,KAAKD,OAAO,MAAM,KAAK,QAAQ;EACpC,OAAO,GAAG,KAAKA,MAAM,QAAQ,mBAAmB,UAAU;CAC5D;CAEA,MAAME,MAAM,SAAiB,MAAc,MAA6B;EACtE,MAAM,MAAM,MAAM,MAAM,UAAU,MAAM;GACtC,QAAQ;GACR,SAAS,EAAE,gBAAgB,mBAAmB;GAC9C,MAAM,KAAK,UAAU,IAAI;EAC3B,CAAC;EACD,MAAM,OAAO,MAAM,IAAI,KAAK,EAAE,aAAa,CAAC,EAAE;EAC9C,IAAI,CAAC,IAAI,MAAM,KAAK,OAClB,MAAM,IAAI,MAAM,KAAK,OAAO,OAAO,QAAQ,IAAI,QAAQ;EAEzD,OAAO;CACT;CAEA,MAAMC,KAAK,SAAiB,MAA4B;EACtD,MAAM,MAAM,MAAM,MAAM,UAAU,IAAI;EACtC,MAAM,OAAO,MAAM,IAAI,KAAK,EAAE,aAAa,CAAC,EAAE;EAC9C,IAAI,CAAC,IAAI,MAAM,KAAK,OAClB,MAAM,IAAI,MAAM,KAAK,OAAO,OAAO,QAAQ,IAAI,QAAQ;EAEzD,OAAO;CACT;CAEA,MAAM,iBAAiB,MAAsB,cAAsC;EACjF,MAAM,OAAO,MAAM,KAAKF,MAAM,KAAK,UAAU;EAC7C,KAAKG,MAAM,IAAI,KAAK,YAAY,KAAK,OAAO,UAAU;EACtD,MAAM,SAAS,OAAO,KAAK,OAAO,WAAW,GAAG,MAAM,KAAK,OAAO,MAAM;EACxE,IAAI;GAEF,MAAM,KAAKF,MAAM,MAAM,WAAW,EAChC,kBAAkB;IAChB,MAAM;IACN,OAAO;IACP,iBAAiB,KAAK,OAAO;IAC7B,oBAAoB,MAAM,KAAK,OAAO,MAAM;GAC9C,EACF,CAAC,EAAE,OAAO,MAAe;IACvB,IAAI,CAAC,OAAO,CAAC,EAAE,SAAS,SAAS,GAAG,MAAM;GAC5C,CAAC;GAED,KAAK,MAAM,KAAK;IACd;KAAE,MAAM;KAAO,MAAM;KAAQ,SAAS;KAAM,QAAQ;IAAK;IACzD;KAAE,MAAM;KAAY,MAAM;KAAU,QAAQ;IAAK;IACjD;KAAE,MAAM;KAAY,MAAM;KAAU,QAAQ;IAAK;GACnD,GACE,MAAM,KAAKA,MAAM,MAAM,WAAW,EAAE,aAAa,EAAE,CAAC,EAAE,OAAO,MAAe;IAC1E,IAAI,CAAC,OAAO,CAAC,EAAE,SAAS,SAAS,GAAG,MAAM;GAC5C,CAAC;GAGH,MAAM,KAAKA,MAAM,MAAM,uBAAuB,EAAE,QAAQ,EAAE,OAAO,MAAM,EAAE,CAAC;EAC5E,SAAS,KAAK;GACZ,MAAM,IAAI,oCAAA,iCAAiC,CAAC,oBAAoB,OAAO,GAAG,CAAC,CAAC;EAC9E;CACF;CAEA,MAAM,eAAe,YAAoB,WAAmC;EAE1E,IAAI;GACF,MAAM,OAAO,MAAM,KAAKD,MAAM,UAAU;GACxC,MAAM,KAAKC,MAAM,MAAM,uBAAuB,EAAE,QAAQ,EAAE,OAAO,MAAM,EAAE,CAAC;GAC1E,KAAKE,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;GACF,MAAM,OAAO,MAAM,KAAKH,MAAM,UAAU;GACxC,MAAM,KAAKE,KAAK,MAAM,aAAa;GACnC,OAAO;EACT,QAAQ;GACN,OAAO;EACT;CACF;CAEA,MAAM,iBAAiB,OAAe,KAA4B;EAChE,MAAM,IAAI,oCAAA,qCAAqC,CAAC,oBAAoB,MAAM,CAAC;CAC7E;CAEA,MAAM,cAAc,MAAiC;EACnD,IAAI,KAAK,QAAQ,WAAW,GAAG;EAC/B,oCAAA,gBAAgB,KAAK,OAAO;EAC5B,MAAM,OAAO,MAAM,KAAKF,MAAM,KAAK,UAAU;EAC7C,MAAM,WAAW,KAAKF,MAAM,cAAc,KAAKK,MAAM,IAAI,KAAK,UAAU;EACxE,IAAI;GACF,MAAM,OAAc,CAAC;GACrB,KAAK,MAAM,KAAK,KAAK,SAAS;IAC5B,IAAI,SAAS,EAAE;IACf,IAAI,CAAC,UAAU,EAAE,UAAU;KACzB,MAAM,CAAC,KAAK,MAAM,KAAK,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU;KACtD,SAAS;IACX;IACA,IAAI,CAAC,QACH,MAAM,IAAI,oCAAA,6BAA6B,CAAC,oCAAoC,CAAC;IAE/E,IAAI,aAAa,KAAA,KAAa,OAAO,WAAW,UAC9C,MAAM,IAAI,oCAAA,kCAAkC,CAAC,UAAU,OAAO,MAAM,CAAC;IAEvE,KAAK,KAAK;KACR,IAAI,EAAE;KACN,KAAK;KACL,UAAU,EAAE,YAAY;KACxB,UAAU,EAAE,WAAW,KAAK,UAAU,EAAE,QAAQ,IAAI;IACtD,CAAC;GACH;GAEA,MAAM,KAAKF,MAAM,MAAM,uBAAuB,IAAI;EACpD,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,OAAO,MAAM,KAAKD,MAAM,KAAK,UAAU;EAC7C,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,MAJI,KAAKE,KACnB,MACA,aAAa,mBAAmB,QAAQ,KAAKE,QAAQ,KAAK,KAAK,EAAE,CAAC,EAAE,eACtE,GACc,UAAU,OAAO;IAC/B,IAAI,CAAC,KACH,MAAM,IAAI,oCAAA,6BAA6B,CAAC,8BAA8B,KAAK,KAAK,EAAE,CAAC;IAErF,cAAc,IAAI;GACpB;;EAGF,MAAM,SAAS,KAAK,UAAU;EAC9B,MAAM,KAAK;EACX,IAAI;GACF,IAAI;GACJ,IAAI,aAAa;IACf,MAAM,KAAK,KAAK,SAAS,MAAO,KAAK,OAAO,WAAW;IACvD,MAAM,IAAI,oBAAoB,EAAE,IAAI,YAAY,KAAK,GAAG,EAAE;IAE1D,QAAO,MADS,KAAKF,KAAK,MAAM,aAAa,mBAAmB,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,GAC9E,UAAU,QAAQ,CAAC;GAC9B,OAEE,QAAO,MADS,KAAKA,KAAK,MAAM,oBAAoB,GAAG,aAAa,GAC3D,UAAU,QAAQ,CAAC;GAK9B,QAHiB,KAAK,SAClB,KAAK,QAAQ,MAAM,iCAAA,eAAe,KAAK,QAAS,KAAKG,WAAW,EAAE,QAAQ,CAAC,CAAC,IAC5E,MAED,MAAM,QAAQ,SAAS,KAAK,IAAI,EAChC,KAAK,MAAM,KAAKC,SAAS,GAAG,MAAM,CAAC,CAAC,WAAW,CAAC;EACrD,SAAS,KAAK;GACZ,MAAM,IAAI,oCAAA,6BAA6B,CAAC,OAAO,GAAG,CAAC,CAAC;EACtD;CACF;CAEA,QAAQ,OAAuB;EAE7B,OAAO,MAAM,QAAQ,8BAA8B,MAAM;CAC3D;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,OAA6B;EAChE,MAAM,OAAO,KAAK;EAClB,MAAM,MAAmB,CAAC;EAC1B,IAAI,KAAK,IAAI,IAAI,KAAK,IAAI;EAC1B,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,SAAS,OAAO,IAAI,UAAU,UAEhC,IAAI,QAAQ,IAAI;EAElB,OAAO;CACT;CAEA,MAAM,cAAc,MAAiC;EACnD,MAAM,OAAO,MAAM,KAAKL,MAAM,KAAK,UAAU;EAC7C,IAAI;GACF,IAAI,KAAK,OAAO,KAAK,IAAI,SAAS,GAChC,MAAM,KAAKC,MAAM,MAAM,uBAAuB,EAAE,QAAQ,KAAK,IAAI,CAAC;QAC7D,IAAI,KAAK,QAAQ;IAGtB,MAAM,YADO,MADG,KAAKC,KAAK,MAAM,0CAA0C,GAC3D,UAAU,QAAQ,CAAC,GAE/B,QAAQ,MAAW,iCAAA,eAAe,KAAK,QAAS,KAAKG,WAAW,EAAE,QAAQ,CAAC,CAAC,EAC5E,KAAK,MAAW,EAAE,EAAY;IACjC,IAAI,QAAQ,SAAS,GACnB,MAAM,KAAKJ,MAAM,MAAM,uBAAuB,EAAE,QAAQ,QAAQ,CAAC;GAErE,OACE,MAAM,KAAKA,MAAM,MAAM,uBAAuB,EAAE,QAAQ,EAAE,OAAO,MAAM,EAAE,CAAC;EAE9E,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_SEARCH_FAILED, E_VECTOR_STORE_UNSUPPORTED_OPERATION, E_VECTOR_STORE_UPSERT_FAILED } from "./exceptions.mjs";
|
|
@@ -37,6 +37,7 @@ var SolrVectorStore = class extends BaseVectorStore {
|
|
|
37
37
|
get #opts() {
|
|
38
38
|
return this.options;
|
|
39
39
|
}
|
|
40
|
+
/** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
|
|
40
41
|
static isAvailable() {
|
|
41
42
|
return typeof process !== "undefined" && typeof fetch === "function";
|
|
42
43
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solr.mjs","names":["#opts","#base","#core","#post","#get","#dims","#escape","#parseMeta","#project"],"sources":["../../../src/batteries/vector/solr/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/solr\n *\n * Apache Solr adapter (dense vector / kNN query parser, Solr 9+). A logical collection maps to a\n * Solr core; the adapter ensures a `DenseVectorField` (`vec`) plus `document`/`metadata` string\n * fields exist in the core schema, then uses the `{!knn f=vec topK=N}[...]` parser for search.\n * Score is Solr's cosine similarity ([0,1]). Metadata is a JSON string field filtered with the\n * neutral filter tree's JS reference evaluator for cross-adapter parity.\n *\n * No typed driver — Solr is plain HTTP/JSON, so this uses `fetch` (zero extra dependency). The\n * target core must already exist (e.g. `solr-precreate <core>` / the Core Admin API); the adapter\n * does not create cores at runtime, only their schema fields. `collection` is the core name.\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_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 SolrVectorStoreOptions extends BaseVectorStoreOptions {\n connection: { url: string }\n}\n\nconst simFn = (metric: DistanceMetric): string =>\n metric === 'euclidean' ? 'euclidean' : metric === 'dot' ? 'dot_product' : 'cosine'\n\nexport class SolrVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: false,\n rawSql: false,\n builtInEncoding: false,\n // Writes are committed (commit=true) before resolving, so they're visible to the next query.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n\n #base: string | null = null\n #dims: Map<string, number> = new Map()\n\n get #opts(): SolrVectorStoreOptions {\n return this.options as SolrVectorStoreOptions\n }\n\n static isAvailable(): boolean {\n return typeof process !== 'undefined' && typeof fetch === 'function'\n }\n isAvailable(): boolean {\n return typeof process !== 'undefined' && typeof fetch === 'function'\n }\n\n async connect(): Promise<void> {\n if (this.#base) return\n const url = this.#opts.connection?.url\n if (!url) throw new E_VECTOR_STORE_CONNECTION_FAILED(['Solr requires connection.url'])\n this.#base = url.replace(/\\/$/, '')\n }\n\n async close(): Promise<void> {\n this.#base = null\n }\n\n async #core(collection: string): Promise<string> {\n if (!this.#base) await this.connect()\n return `${this.#base}/solr/${encodeURIComponent(collection)}`\n }\n\n async #post(coreUrl: string, path: string, body: unknown): Promise<any> {\n const res = await fetch(coreUrl + path, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n })\n const json = await res.json().catch(() => ({}))\n if (!res.ok || json.error) {\n throw new Error(json.error?.msg ?? `HTTP ${res.status}`)\n }\n return json\n }\n\n async #get(coreUrl: string, path: string): Promise<any> {\n const res = await fetch(coreUrl + path)\n const json = await res.json().catch(() => ({}))\n if (!res.ok || json.error) {\n throw new Error(json.error?.msg ?? `HTTP ${res.status}`)\n }\n return json\n }\n\n async createCollection(spec: CollectionSpec, _ifNotExists: boolean): Promise<void> {\n const core = await this.#core(spec.collection)\n this.#dims.set(spec.collection, spec.vector.dimensions)\n const ftName = `knn_${spec.vector.dimensions}_${simFn(spec.vector.metric)}`\n try {\n // Ensure the dense-vector field type (idempotent: ignore \"already exists\").\n await this.#post(core, '/schema', {\n 'add-field-type': {\n name: ftName,\n class: 'solr.DenseVectorField',\n vectorDimension: spec.vector.dimensions,\n similarityFunction: simFn(spec.vector.metric),\n },\n }).catch((e: unknown) => {\n if (!String(e).includes('already')) throw e\n })\n // Ensure the fields (idempotent per field).\n for (const f of [\n { name: 'vec', type: ftName, indexed: true, stored: true },\n { name: 'document', type: 'string', stored: true },\n { name: 'metadata', type: 'string', stored: true },\n ]) {\n await this.#post(core, '/schema', { 'add-field': f }).catch((e: unknown) => {\n if (!String(e).includes('already')) throw e\n })\n }\n // Start from an empty core for this logical collection.\n await this.#post(core, '/update?commit=true', { delete: { query: '*:*' } })\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 // Cores aren't created/destroyed at runtime here; \"drop\" clears the core's documents.\n try {\n const core = await this.#core(collection)\n await this.#post(core, '/update?commit=true', { delete: { query: '*:*' } })\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 core = await this.#core(collection)\n await this.#get(core, '/admin/ping')\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', 'solr'])\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const core = await this.#core(plan.collection)\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 // Solr upserts by id; commit so the write is visible to the next query.\n await this.#post(core, '/update?commit=true', docs)\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 core = await this.#core(plan.collection)\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 r = await this.#get(\n core,\n `/select?q=${encodeURIComponent('id:' + this.#escape(plan.near.id))}&fl=vec&rows=1`\n )\n const doc = r.response?.docs?.[0]\n if (!doc) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = doc.vec as number[]\n }\n }\n\n const offset = plan.offset ?? 0\n const fl = 'id,vec,document,metadata,score'\n try {\n let docs: any[]\n if (queryVector) {\n const k = (plan.filter ? 1000 : plan.topK + offset) || 10\n const q = `{!knn f=vec topK=${k}}[${queryVector.join(',')}]`\n const r = await this.#get(core, `/select?q=${encodeURIComponent(q)}&fl=${fl}&rows=${k}`)\n docs = r.response?.docs ?? []\n } else {\n const r = await this.#get(core, `/select?q=*:*&fl=${fl}&rows=100000`)\n docs = r.response?.docs ?? []\n }\n const filtered = plan.filter\n ? docs.filter((d) => evaluateFilter(plan.filter!, this.#parseMeta(d.metadata)))\n : docs\n return filtered\n .slice(offset, offset + plan.topK)\n .map((d) => this.#project(d, plan, !!queryVector))\n } catch (err) {\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\n }\n\n #escape(value: string): string {\n // Escape Solr query special chars for an id: term match.\n return value.replace(/([+\\-!(){}[\\]^\"~*?:\\\\/ ])/g, '\\\\$1')\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, isKnn: boolean): 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[]).map(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 (isKnn && typeof doc.score === 'number') {\n // Solr's DenseVectorField cosine score is already in [0,1], higher = closer.\n out.score = doc.score\n }\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const core = await this.#core(plan.collection)\n try {\n if (plan.ids && plan.ids.length > 0) {\n await this.#post(core, '/update?commit=true', { delete: plan.ids })\n } else if (plan.filter) {\n const r = await this.#get(core, `/select?q=*:*&fl=id,metadata&rows=100000`)\n const docs = r.response?.docs ?? []\n const targets = docs\n .filter((d: any) => evaluateFilter(plan.filter!, this.#parseMeta(d.metadata)))\n .map((d: any) => d.id as string)\n if (targets.length > 0) {\n await this.#post(core, '/update?commit=true', { delete: targets })\n }\n } else {\n await this.#post(core, '/update?commit=true', { delete: { query: '*:*' } })\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":"solr.mjs","names":["#opts","#base","#core","#post","#get","#dims","#escape","#parseMeta","#project"],"sources":["../../../src/batteries/vector/solr/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/solr\n *\n * Apache Solr adapter (dense vector / kNN query parser, Solr 9+). A logical collection maps to a\n * Solr core; the adapter ensures a `DenseVectorField` (`vec`) plus `document`/`metadata` string\n * fields exist in the core schema, then uses the `{!knn f=vec topK=N}[...]` parser for search.\n * Score is Solr's cosine similarity ([0,1]). Metadata is a JSON string field filtered with the\n * neutral filter tree's JS reference evaluator for cross-adapter parity.\n *\n * No typed driver — Solr is plain HTTP/JSON, so this uses `fetch` (zero extra dependency). The\n * target core must already exist (e.g. `solr-precreate <core>` / the Core Admin API); the adapter\n * does not create cores at runtime, only their schema fields. `collection` is the core name.\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_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 SolrVectorStoreOptions extends BaseVectorStoreOptions {\n /** Connection and authentication parameters for the backend. */\n connection: { url: string }\n}\n\nconst simFn = (metric: DistanceMetric): string =>\n metric === 'euclidean' ? 'euclidean' : metric === 'dot' ? 'dot_product' : 'cosine'\n\nexport class SolrVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: false,\n rawSql: false,\n builtInEncoding: false,\n // Writes are committed (commit=true) before resolving, so they're visible to the next query.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n\n #base: string | null = null\n #dims: Map<string, number> = new Map()\n\n get #opts(): SolrVectorStoreOptions {\n return this.options as SolrVectorStoreOptions\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' && typeof fetch === 'function'\n }\n isAvailable(): boolean {\n return typeof process !== 'undefined' && typeof fetch === 'function'\n }\n\n async connect(): Promise<void> {\n if (this.#base) return\n const url = this.#opts.connection?.url\n if (!url) throw new E_VECTOR_STORE_CONNECTION_FAILED(['Solr requires connection.url'])\n this.#base = url.replace(/\\/$/, '')\n }\n\n async close(): Promise<void> {\n this.#base = null\n }\n\n async #core(collection: string): Promise<string> {\n if (!this.#base) await this.connect()\n return `${this.#base}/solr/${encodeURIComponent(collection)}`\n }\n\n async #post(coreUrl: string, path: string, body: unknown): Promise<any> {\n const res = await fetch(coreUrl + path, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n })\n const json = await res.json().catch(() => ({}))\n if (!res.ok || json.error) {\n throw new Error(json.error?.msg ?? `HTTP ${res.status}`)\n }\n return json\n }\n\n async #get(coreUrl: string, path: string): Promise<any> {\n const res = await fetch(coreUrl + path)\n const json = await res.json().catch(() => ({}))\n if (!res.ok || json.error) {\n throw new Error(json.error?.msg ?? `HTTP ${res.status}`)\n }\n return json\n }\n\n async createCollection(spec: CollectionSpec, _ifNotExists: boolean): Promise<void> {\n const core = await this.#core(spec.collection)\n this.#dims.set(spec.collection, spec.vector.dimensions)\n const ftName = `knn_${spec.vector.dimensions}_${simFn(spec.vector.metric)}`\n try {\n // Ensure the dense-vector field type (idempotent: ignore \"already exists\").\n await this.#post(core, '/schema', {\n 'add-field-type': {\n name: ftName,\n class: 'solr.DenseVectorField',\n vectorDimension: spec.vector.dimensions,\n similarityFunction: simFn(spec.vector.metric),\n },\n }).catch((e: unknown) => {\n if (!String(e).includes('already')) throw e\n })\n // Ensure the fields (idempotent per field).\n for (const f of [\n { name: 'vec', type: ftName, indexed: true, stored: true },\n { name: 'document', type: 'string', stored: true },\n { name: 'metadata', type: 'string', stored: true },\n ]) {\n await this.#post(core, '/schema', { 'add-field': f }).catch((e: unknown) => {\n if (!String(e).includes('already')) throw e\n })\n }\n // Start from an empty core for this logical collection.\n await this.#post(core, '/update?commit=true', { delete: { query: '*:*' } })\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 // Cores aren't created/destroyed at runtime here; \"drop\" clears the core's documents.\n try {\n const core = await this.#core(collection)\n await this.#post(core, '/update?commit=true', { delete: { query: '*:*' } })\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 core = await this.#core(collection)\n await this.#get(core, '/admin/ping')\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', 'solr'])\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const core = await this.#core(plan.collection)\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 // Solr upserts by id; commit so the write is visible to the next query.\n await this.#post(core, '/update?commit=true', docs)\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 core = await this.#core(plan.collection)\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 r = await this.#get(\n core,\n `/select?q=${encodeURIComponent('id:' + this.#escape(plan.near.id))}&fl=vec&rows=1`\n )\n const doc = r.response?.docs?.[0]\n if (!doc) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = doc.vec as number[]\n }\n }\n\n const offset = plan.offset ?? 0\n const fl = 'id,vec,document,metadata,score'\n try {\n let docs: any[]\n if (queryVector) {\n const k = (plan.filter ? 1000 : plan.topK + offset) || 10\n const q = `{!knn f=vec topK=${k}}[${queryVector.join(',')}]`\n const r = await this.#get(core, `/select?q=${encodeURIComponent(q)}&fl=${fl}&rows=${k}`)\n docs = r.response?.docs ?? []\n } else {\n const r = await this.#get(core, `/select?q=*:*&fl=${fl}&rows=100000`)\n docs = r.response?.docs ?? []\n }\n const filtered = plan.filter\n ? docs.filter((d) => evaluateFilter(plan.filter!, this.#parseMeta(d.metadata)))\n : docs\n return filtered\n .slice(offset, offset + plan.topK)\n .map((d) => this.#project(d, plan, !!queryVector))\n } catch (err) {\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\n }\n\n #escape(value: string): string {\n // Escape Solr query special chars for an id: term match.\n return value.replace(/([+\\-!(){}[\\]^\"~*?:\\\\/ ])/g, '\\\\$1')\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, isKnn: boolean): 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[]).map(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 (isKnn && typeof doc.score === 'number') {\n // Solr's DenseVectorField cosine score is already in [0,1], higher = closer.\n out.score = doc.score\n }\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const core = await this.#core(plan.collection)\n try {\n if (plan.ids && plan.ids.length > 0) {\n await this.#post(core, '/update?commit=true', { delete: plan.ids })\n } else if (plan.filter) {\n const r = await this.#get(core, `/select?q=*:*&fl=id,metadata&rows=100000`)\n const docs = r.response?.docs ?? []\n const targets = docs\n .filter((d: any) => evaluateFilter(plan.filter!, this.#parseMeta(d.metadata)))\n .map((d: any) => d.id as string)\n if (targets.length > 0) {\n await this.#post(core, '/update?commit=true', { delete: targets })\n }\n } else {\n await this.#post(core, '/update?commit=true', { delete: { query: '*:*' } })\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -4,7 +4,9 @@
|
|
|
4
4
|
import { BaseVectorStore, CallableVectorStore } from "../contract";
|
|
5
5
|
import type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from "../plan";
|
|
6
6
|
import type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from "../types";
|
|
7
|
-
|
|
7
|
+
/** Construction options for {@link SqliteVecVectorStore}. */
|
|
8
|
+
export interface SqliteVecVectorStoreOptions extends BaseVectorStoreOptions {
|
|
9
|
+
/** Database location: a filesystem path, or `':memory:'` for an in-memory database. */
|
|
8
10
|
connection: {
|
|
9
11
|
path: string;
|
|
10
12
|
};
|
|
@@ -12,11 +14,13 @@ interface SqliteVecOptions extends BaseVectorStoreOptions {
|
|
|
12
14
|
export declare class SqliteVecVectorStore extends BaseVectorStore {
|
|
13
15
|
#private;
|
|
14
16
|
readonly capabilities: VectorStoreCapabilities;
|
|
15
|
-
constructor(options:
|
|
17
|
+
constructor(options: SqliteVecVectorStoreOptions);
|
|
18
|
+
/** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
|
|
16
19
|
static isAvailable(): boolean;
|
|
17
20
|
isAvailable(): boolean;
|
|
18
21
|
connect(): Promise<void>;
|
|
19
22
|
close(): Promise<void>;
|
|
23
|
+
/** The underlying SQLite database handle; throws if the store is not connected. */
|
|
20
24
|
get db(): any;
|
|
21
25
|
createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void>;
|
|
22
26
|
dropCollection(collection: string, ifExists: boolean): Promise<void>;
|
|
@@ -27,4 +31,3 @@ export declare class SqliteVecVectorStore extends BaseVectorStore {
|
|
|
27
31
|
executeDelete(plan: DeletePlan): Promise<void>;
|
|
28
32
|
transaction(fn: (tx: CallableVectorStore) => Promise<void>): Promise<void>;
|
|
29
33
|
}
|
|
30
|
-
export {};
|
|
@@ -30,6 +30,7 @@ var SqliteVecVectorStore = class extends require_batteries_vector_contract.BaseV
|
|
|
30
30
|
get #opts() {
|
|
31
31
|
return this.options;
|
|
32
32
|
}
|
|
33
|
+
/** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
|
|
33
34
|
static isAvailable() {
|
|
34
35
|
return typeof process !== "undefined";
|
|
35
36
|
}
|
|
@@ -72,6 +73,7 @@ var SqliteVecVectorStore = class extends require_batteries_vector_contract.BaseV
|
|
|
72
73
|
this.#_cache = null;
|
|
73
74
|
}
|
|
74
75
|
}
|
|
76
|
+
/** The underlying SQLite database handle; throws if the store is not connected. */
|
|
75
77
|
get db() {
|
|
76
78
|
if (!this.#_cache?.db) throw new Error("Not connected");
|
|
77
79
|
return this.#_cache.db;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite_vec.cjs","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.cjs","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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"}
|
|
@@ -28,6 +28,7 @@ var SqliteVecVectorStore = class extends BaseVectorStore {
|
|
|
28
28
|
get #opts() {
|
|
29
29
|
return this.options;
|
|
30
30
|
}
|
|
31
|
+
/** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
|
|
31
32
|
static isAvailable() {
|
|
32
33
|
return typeof process !== "undefined";
|
|
33
34
|
}
|
|
@@ -70,6 +71,7 @@ var SqliteVecVectorStore = class extends BaseVectorStore {
|
|
|
70
71
|
this.#_cache = null;
|
|
71
72
|
}
|
|
72
73
|
}
|
|
74
|
+
/** The underlying SQLite database handle; throws if the store is not connected. */
|
|
73
75
|
get db() {
|
|
74
76
|
if (!this.#_cache?.db) throw new Error("Not connected");
|
|
75
77
|
return this.#_cache.db;
|