@nhtio/adk 1.20260607.2 → 1.20260609.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +230 -0
- package/batteries/embeddings/openai/adapter.cjs +1 -1
- package/batteries/embeddings/openai/adapter.mjs +1 -1
- package/batteries/embeddings/openai/exceptions.cjs +1 -1
- package/batteries/embeddings/openai/exceptions.mjs +1 -1
- package/batteries/embeddings/openai/types.d.ts +7 -0
- package/batteries/embeddings/webllm/adapter.cjs +1 -1
- package/batteries/embeddings/webllm/adapter.mjs +1 -1
- package/batteries/embeddings/webllm/exceptions.cjs +1 -1
- package/batteries/embeddings/webllm/exceptions.mjs +1 -1
- package/batteries/llm/chat_common/helpers.d.ts +165 -0
- package/batteries/llm/chat_common/types.d.ts +309 -0
- package/batteries/llm/index.d.ts +5 -0
- package/batteries/llm/ollama/adapter.cjs +736 -0
- package/batteries/llm/ollama/adapter.cjs.map +1 -0
- package/batteries/llm/ollama/adapter.d.ts +64 -0
- package/batteries/llm/ollama/adapter.mjs +734 -0
- package/batteries/llm/ollama/adapter.mjs.map +1 -0
- package/batteries/llm/ollama/exceptions.cjs +105 -0
- package/batteries/llm/ollama/exceptions.cjs.map +1 -0
- package/batteries/llm/ollama/exceptions.d.ts +112 -0
- package/batteries/llm/ollama/exceptions.mjs +96 -0
- package/batteries/llm/ollama/exceptions.mjs.map +1 -0
- package/batteries/llm/ollama/helpers.cjs +487 -0
- package/batteries/llm/ollama/helpers.cjs.map +1 -0
- package/batteries/llm/ollama/helpers.d.ts +158 -0
- package/batteries/llm/ollama/helpers.mjs +450 -0
- package/batteries/llm/ollama/helpers.mjs.map +1 -0
- package/batteries/llm/ollama/index.d.ts +29 -0
- package/batteries/llm/ollama/types.cjs +2 -0
- package/batteries/llm/ollama/types.d.ts +334 -0
- package/batteries/llm/ollama/types.mjs +0 -0
- package/batteries/llm/ollama/validation.cjs +130 -0
- package/batteries/llm/ollama/validation.cjs.map +1 -0
- package/batteries/llm/ollama/validation.d.ts +31 -0
- package/batteries/llm/ollama/validation.mjs +127 -0
- package/batteries/llm/ollama/validation.mjs.map +1 -0
- package/batteries/llm/ollama.cjs +54 -0
- package/batteries/llm/ollama.mjs +6 -0
- package/batteries/llm/openai_chat_completions/adapter.cjs +36 -19
- package/batteries/llm/openai_chat_completions/adapter.cjs.map +1 -1
- package/batteries/llm/openai_chat_completions/adapter.mjs +23 -6
- package/batteries/llm/openai_chat_completions/adapter.mjs.map +1 -1
- package/batteries/llm/openai_chat_completions/exceptions.cjs +1 -1
- package/batteries/llm/openai_chat_completions/exceptions.mjs +1 -1
- package/batteries/llm/openai_chat_completions/helpers.cjs +80 -320
- package/batteries/llm/openai_chat_completions/helpers.cjs.map +1 -1
- package/batteries/llm/openai_chat_completions/helpers.d.ts +68 -144
- package/batteries/llm/openai_chat_completions/helpers.mjs +40 -280
- package/batteries/llm/openai_chat_completions/helpers.mjs.map +1 -1
- package/batteries/llm/openai_chat_completions/types.d.ts +273 -181
- package/batteries/llm/openai_chat_completions/validation.cjs +2 -2
- package/batteries/llm/openai_chat_completions/validation.cjs.map +1 -1
- package/batteries/llm/openai_chat_completions/validation.mjs +2 -2
- package/batteries/llm/openai_chat_completions/validation.mjs.map +1 -1
- package/batteries/llm/openai_chat_completions.cjs +29 -28
- package/batteries/llm/openai_chat_completions.mjs +2 -1
- package/batteries/llm/webllm_chat_completions/adapter.cjs +38 -19
- package/batteries/llm/webllm_chat_completions/adapter.cjs.map +1 -1
- package/batteries/llm/webllm_chat_completions/adapter.d.ts +18 -0
- package/batteries/llm/webllm_chat_completions/adapter.mjs +25 -6
- package/batteries/llm/webllm_chat_completions/adapter.mjs.map +1 -1
- package/batteries/llm/webllm_chat_completions/exceptions.cjs +1 -1
- package/batteries/llm/webllm_chat_completions/exceptions.mjs +1 -1
- package/batteries/llm/webllm_chat_completions/helpers.cjs +29 -28
- package/batteries/llm/webllm_chat_completions/helpers.mjs +2 -1
- package/batteries/llm/webllm_chat_completions/types.d.ts +21 -0
- package/batteries/llm/webllm_chat_completions/validation.cjs +13 -1
- package/batteries/llm/webllm_chat_completions/validation.cjs.map +1 -1
- package/batteries/llm/webllm_chat_completions/validation.d.ts +12 -0
- package/batteries/llm/webllm_chat_completions/validation.mjs +13 -1
- package/batteries/llm/webllm_chat_completions/validation.mjs.map +1 -1
- package/batteries/llm/webllm_chat_completions.cjs +29 -28
- package/batteries/llm/webllm_chat_completions.mjs +2 -1
- package/batteries/llm.cjs +44 -28
- package/batteries/llm.mjs +9 -4
- package/batteries/storage/flydrive.cjs +1 -1
- package/batteries/storage/flydrive.mjs +1 -1
- package/batteries/storage/in_memory/index.d.ts +1 -1
- package/batteries/storage/in_memory.cjs +2 -2
- package/batteries/storage/in_memory.cjs.map +1 -1
- package/batteries/storage/in_memory.mjs +2 -2
- package/batteries/storage/in_memory.mjs.map +1 -1
- package/batteries/storage/opfs/index.d.ts +19 -0
- package/batteries/storage/opfs.cjs +1 -1
- package/batteries/storage/opfs.cjs.map +1 -1
- package/batteries/storage/opfs.mjs +1 -1
- package/batteries/storage/opfs.mjs.map +1 -1
- package/batteries/tools/_shared/index.d.ts +121 -0
- package/batteries/tools/_shared.cjs +157 -0
- package/batteries/tools/_shared.cjs.map +1 -0
- package/batteries/tools/_shared.mjs +149 -0
- package/batteries/tools/_shared.mjs.map +1 -0
- package/batteries/tools/color.cjs +3 -2
- package/batteries/tools/color.cjs.map +1 -1
- package/batteries/tools/color.mjs +3 -2
- package/batteries/tools/color.mjs.map +1 -1
- package/batteries/tools/comparison.cjs +4 -3
- package/batteries/tools/comparison.cjs.map +1 -1
- package/batteries/tools/comparison.mjs +4 -3
- package/batteries/tools/comparison.mjs.map +1 -1
- package/batteries/tools/data_structure.cjs +30 -10
- package/batteries/tools/data_structure.cjs.map +1 -1
- package/batteries/tools/data_structure.mjs +30 -10
- package/batteries/tools/data_structure.mjs.map +1 -1
- package/batteries/tools/datetime_extended.cjs +5 -10
- package/batteries/tools/datetime_extended.cjs.map +1 -1
- package/batteries/tools/datetime_extended.mjs +5 -10
- package/batteries/tools/datetime_extended.mjs.map +1 -1
- package/batteries/tools/datetime_math.cjs +2 -2
- package/batteries/tools/datetime_math.mjs +2 -2
- package/batteries/tools/encoding.cjs +13 -4
- package/batteries/tools/encoding.cjs.map +1 -1
- package/batteries/tools/encoding.mjs +13 -4
- package/batteries/tools/encoding.mjs.map +1 -1
- package/batteries/tools/formatting.cjs +4 -4
- package/batteries/tools/formatting.cjs.map +1 -1
- package/batteries/tools/formatting.mjs +4 -4
- package/batteries/tools/formatting.mjs.map +1 -1
- package/batteries/tools/geo_basics.cjs +2 -2
- package/batteries/tools/geo_basics.mjs +2 -2
- package/batteries/tools/index.d.ts +3 -0
- package/batteries/tools/math.cjs +10 -8
- package/batteries/tools/math.cjs.map +1 -1
- package/batteries/tools/math.mjs +10 -8
- package/batteries/tools/math.mjs.map +1 -1
- package/batteries/tools/memory.cjs +5 -5
- package/batteries/tools/memory.mjs +5 -5
- package/batteries/tools/parsing.cjs +9 -5
- package/batteries/tools/parsing.cjs.map +1 -1
- package/batteries/tools/parsing.mjs +9 -5
- package/batteries/tools/parsing.mjs.map +1 -1
- package/batteries/tools/retrievables.cjs +4 -4
- package/batteries/tools/retrievables.mjs +4 -4
- package/batteries/tools/scrapper/exceptions.d.ts +21 -0
- package/batteries/tools/scrapper/index.d.ts +172 -0
- package/batteries/tools/scrapper/shared.d.ts +139 -0
- package/batteries/tools/scrapper.cjs +8 -0
- package/batteries/tools/scrapper.mjs +2 -0
- package/batteries/tools/searxng/exceptions.d.ts +21 -0
- package/batteries/tools/searxng/index.d.ts +177 -0
- package/batteries/tools/searxng.cjs +6 -0
- package/batteries/tools/searxng.mjs +2 -0
- package/batteries/tools/standing_instructions.cjs +4 -4
- package/batteries/tools/standing_instructions.mjs +4 -4
- package/batteries/tools/statistics.cjs +54 -43
- package/batteries/tools/statistics.cjs.map +1 -1
- package/batteries/tools/statistics.mjs +54 -43
- package/batteries/tools/statistics.mjs.map +1 -1
- package/batteries/tools/string_processing.cjs +5 -5
- package/batteries/tools/string_processing.cjs.map +1 -1
- package/batteries/tools/string_processing.mjs +5 -5
- package/batteries/tools/string_processing.mjs.map +1 -1
- package/batteries/tools/structured_data.cjs +8 -13
- package/batteries/tools/structured_data.cjs.map +1 -1
- package/batteries/tools/structured_data.mjs +8 -13
- package/batteries/tools/structured_data.mjs.map +1 -1
- package/batteries/tools/text_analysis.cjs +3 -3
- package/batteries/tools/text_analysis.mjs +3 -3
- package/batteries/tools/text_comparison.cjs +2 -2
- package/batteries/tools/text_comparison.mjs +2 -2
- package/batteries/tools/time.cjs +2 -2
- package/batteries/tools/time.mjs +2 -2
- package/batteries/tools/unit_conversion.cjs +10 -8
- package/batteries/tools/unit_conversion.cjs.map +1 -1
- package/batteries/tools/unit_conversion.mjs +10 -8
- package/batteries/tools/unit_conversion.mjs.map +1 -1
- package/batteries/tools/web_retrieval/index.d.ts +186 -0
- package/batteries/tools/web_retrieval.cjs +206 -0
- package/batteries/tools/web_retrieval.cjs.map +1 -0
- package/batteries/tools/web_retrieval.mjs +201 -0
- package/batteries/tools/web_retrieval.mjs.map +1 -0
- package/batteries/tools.cjs +15 -0
- package/batteries/tools.mjs +4 -1
- package/batteries/vector/arangodb/index.d.ts +2 -0
- package/batteries/vector/arangodb.cjs +2 -1
- package/batteries/vector/arangodb.cjs.map +1 -1
- package/batteries/vector/arangodb.mjs +2 -1
- package/batteries/vector/arangodb.mjs.map +1 -1
- package/batteries/vector/builder.cjs +31 -0
- package/batteries/vector/builder.cjs.map +1 -1
- package/batteries/vector/builder.d.ts +58 -0
- package/batteries/vector/builder.mjs +31 -0
- package/batteries/vector/builder.mjs.map +1 -1
- package/batteries/vector/chroma/index.d.ts +4 -0
- package/batteries/vector/chroma.cjs +3 -0
- package/batteries/vector/chroma.cjs.map +1 -1
- package/batteries/vector/chroma.mjs +3 -0
- package/batteries/vector/chroma.mjs.map +1 -1
- package/batteries/vector/clickhouse/index.d.ts +2 -0
- package/batteries/vector/clickhouse.cjs +2 -1
- package/batteries/vector/clickhouse.cjs.map +1 -1
- package/batteries/vector/clickhouse.mjs +2 -1
- package/batteries/vector/clickhouse.mjs.map +1 -1
- package/batteries/vector/cloudflare/index.d.ts +2 -0
- package/batteries/vector/cloudflare.cjs +2 -1
- package/batteries/vector/cloudflare.cjs.map +1 -1
- package/batteries/vector/cloudflare.mjs +2 -1
- package/batteries/vector/cloudflare.mjs.map +1 -1
- package/batteries/vector/conformance/index.d.ts +22 -0
- package/batteries/vector/conformance.cjs +22 -0
- package/batteries/vector/conformance.cjs.map +1 -1
- package/batteries/vector/conformance.mjs +22 -0
- package/batteries/vector/conformance.mjs.map +1 -1
- package/batteries/vector/contract.cjs +22 -0
- package/batteries/vector/contract.cjs.map +1 -1
- package/batteries/vector/contract.d.ts +51 -0
- package/batteries/vector/contract.mjs +22 -0
- package/batteries/vector/contract.mjs.map +1 -1
- package/batteries/vector/couchbase/index.d.ts +2 -0
- package/batteries/vector/couchbase.cjs +2 -1
- package/batteries/vector/couchbase.cjs.map +1 -1
- package/batteries/vector/couchbase.mjs +2 -1
- package/batteries/vector/couchbase.mjs.map +1 -1
- package/batteries/vector/duckdb/index.d.ts +2 -0
- package/batteries/vector/duckdb.cjs +2 -1
- package/batteries/vector/duckdb.cjs.map +1 -1
- package/batteries/vector/duckdb.mjs +2 -1
- package/batteries/vector/duckdb.mjs.map +1 -1
- package/batteries/vector/elasticsearch/index.d.ts +2 -0
- package/batteries/vector/elasticsearch.cjs +2 -1
- package/batteries/vector/elasticsearch.cjs.map +1 -1
- package/batteries/vector/elasticsearch.mjs +2 -1
- package/batteries/vector/elasticsearch.mjs.map +1 -1
- package/batteries/vector/exceptions.cjs +1 -1
- package/batteries/vector/exceptions.mjs +1 -1
- package/batteries/vector/factory.cjs +6 -0
- package/batteries/vector/factory.cjs.map +1 -1
- package/batteries/vector/factory.d.ts +14 -0
- package/batteries/vector/factory.mjs +6 -0
- package/batteries/vector/factory.mjs.map +1 -1
- package/batteries/vector/filters.cjs +22 -1
- package/batteries/vector/filters.cjs.map +1 -1
- package/batteries/vector/filters.d.ts +38 -0
- package/batteries/vector/filters.mjs +22 -1
- package/batteries/vector/filters.mjs.map +1 -1
- package/batteries/vector/helpers.cjs +13 -0
- package/batteries/vector/helpers.cjs.map +1 -1
- package/batteries/vector/helpers.d.ts +14 -0
- package/batteries/vector/helpers.mjs +13 -0
- package/batteries/vector/helpers.mjs.map +1 -1
- package/batteries/vector/hnswlib/index.d.ts +2 -0
- package/batteries/vector/hnswlib.cjs +2 -1
- package/batteries/vector/hnswlib.cjs.map +1 -1
- package/batteries/vector/hnswlib.mjs +2 -1
- package/batteries/vector/hnswlib.mjs.map +1 -1
- package/batteries/vector/in_memory/index.d.ts +1 -0
- package/batteries/vector/in_memory.cjs +1 -0
- package/batteries/vector/in_memory.cjs.map +1 -1
- package/batteries/vector/in_memory.mjs +1 -0
- package/batteries/vector/in_memory.mjs.map +1 -1
- package/batteries/vector/lancedb/index.d.ts +2 -0
- package/batteries/vector/lancedb.cjs +2 -1
- package/batteries/vector/lancedb.cjs.map +1 -1
- package/batteries/vector/lancedb.mjs +2 -1
- package/batteries/vector/lancedb.mjs.map +1 -1
- package/batteries/vector/mariadb/index.d.ts +2 -0
- package/batteries/vector/mariadb.cjs +2 -1
- package/batteries/vector/mariadb.cjs.map +1 -1
- package/batteries/vector/mariadb.mjs +2 -1
- package/batteries/vector/mariadb.mjs.map +1 -1
- package/batteries/vector/meilisearch/index.d.ts +2 -0
- package/batteries/vector/meilisearch.cjs +2 -1
- package/batteries/vector/meilisearch.cjs.map +1 -1
- package/batteries/vector/meilisearch.mjs +2 -1
- package/batteries/vector/meilisearch.mjs.map +1 -1
- package/batteries/vector/migrate.cjs +18 -1
- package/batteries/vector/migrate.cjs.map +1 -1
- package/batteries/vector/migrate.d.ts +31 -0
- package/batteries/vector/migrate.mjs +18 -1
- package/batteries/vector/migrate.mjs.map +1 -1
- package/batteries/vector/milvus/index.d.ts +5 -0
- package/batteries/vector/milvus.cjs +4 -0
- package/batteries/vector/milvus.cjs.map +1 -1
- package/batteries/vector/milvus.mjs +4 -0
- package/batteries/vector/milvus.mjs.map +1 -1
- package/batteries/vector/mongodb/index.d.ts +2 -0
- package/batteries/vector/mongodb.cjs +2 -1
- package/batteries/vector/mongodb.cjs.map +1 -1
- package/batteries/vector/mongodb.mjs +2 -1
- package/batteries/vector/mongodb.mjs.map +1 -1
- package/batteries/vector/neo4j/index.d.ts +2 -0
- package/batteries/vector/neo4j.cjs +2 -1
- package/batteries/vector/neo4j.cjs.map +1 -1
- package/batteries/vector/neo4j.mjs +2 -1
- package/batteries/vector/neo4j.mjs.map +1 -1
- package/batteries/vector/opensearch/index.d.ts +2 -0
- package/batteries/vector/opensearch.cjs +2 -1
- package/batteries/vector/opensearch.cjs.map +1 -1
- package/batteries/vector/opensearch.mjs +2 -1
- package/batteries/vector/opensearch.mjs.map +1 -1
- package/batteries/vector/oracle23ai/index.d.ts +2 -0
- package/batteries/vector/oracle23ai.cjs +2 -1
- package/batteries/vector/oracle23ai.cjs.map +1 -1
- package/batteries/vector/oracle23ai.mjs +2 -1
- package/batteries/vector/oracle23ai.mjs.map +1 -1
- package/batteries/vector/orama/index.d.ts +1 -0
- package/batteries/vector/orama.cjs +1 -0
- package/batteries/vector/orama.cjs.map +1 -1
- package/batteries/vector/orama.mjs +1 -0
- package/batteries/vector/orama.mjs.map +1 -1
- package/batteries/vector/pgvector/index.d.ts +9 -2
- package/batteries/vector/pgvector.cjs +4 -0
- package/batteries/vector/pgvector.cjs.map +1 -1
- package/batteries/vector/pgvector.mjs +4 -0
- package/batteries/vector/pgvector.mjs.map +1 -1
- package/batteries/vector/pinecone/index.d.ts +5 -0
- package/batteries/vector/pinecone.cjs +3 -1
- package/batteries/vector/pinecone.cjs.map +1 -1
- package/batteries/vector/pinecone.mjs +3 -1
- package/batteries/vector/pinecone.mjs.map +1 -1
- package/batteries/vector/plan.d.ts +27 -0
- package/batteries/vector/qdrant/index.d.ts +5 -0
- package/batteries/vector/qdrant.cjs +4 -0
- package/batteries/vector/qdrant.cjs.map +1 -1
- package/batteries/vector/qdrant.mjs +4 -0
- package/batteries/vector/qdrant.mjs.map +1 -1
- package/batteries/vector/redis/index.d.ts +2 -0
- package/batteries/vector/redis.cjs +2 -1
- package/batteries/vector/redis.cjs.map +1 -1
- package/batteries/vector/redis.mjs +2 -1
- package/batteries/vector/redis.mjs.map +1 -1
- package/batteries/vector/retrievable.cjs +9 -1
- package/batteries/vector/retrievable.cjs.map +1 -1
- package/batteries/vector/retrievable.mjs +9 -1
- package/batteries/vector/retrievable.mjs.map +1 -1
- package/batteries/vector/retrievable_glue.d.ts +21 -0
- package/batteries/vector/s3vectors/index.d.ts +2 -0
- package/batteries/vector/s3vectors.cjs +2 -1
- package/batteries/vector/s3vectors.cjs.map +1 -1
- package/batteries/vector/s3vectors.mjs +2 -1
- package/batteries/vector/s3vectors.mjs.map +1 -1
- package/batteries/vector/schema.cjs +28 -0
- package/batteries/vector/schema.cjs.map +1 -1
- package/batteries/vector/schema.d.ts +39 -0
- package/batteries/vector/schema.mjs +28 -0
- package/batteries/vector/schema.mjs.map +1 -1
- package/batteries/vector/solr/index.d.ts +2 -0
- package/batteries/vector/solr.cjs +2 -1
- package/batteries/vector/solr.cjs.map +1 -1
- package/batteries/vector/solr.mjs +2 -1
- package/batteries/vector/solr.mjs.map +1 -1
- package/batteries/vector/sqlite_vec/index.d.ts +6 -3
- package/batteries/vector/sqlite_vec.cjs +2 -0
- package/batteries/vector/sqlite_vec.cjs.map +1 -1
- package/batteries/vector/sqlite_vec.mjs +2 -0
- package/batteries/vector/sqlite_vec.mjs.map +1 -1
- package/batteries/vector/surrealdb/index.d.ts +2 -0
- package/batteries/vector/surrealdb.cjs +2 -1
- package/batteries/vector/surrealdb.cjs.map +1 -1
- package/batteries/vector/surrealdb.mjs +2 -1
- package/batteries/vector/surrealdb.mjs.map +1 -1
- package/batteries/vector/types.d.ts +27 -0
- package/batteries/vector/typesense/index.d.ts +2 -0
- package/batteries/vector/typesense.cjs +2 -1
- package/batteries/vector/typesense.cjs.map +1 -1
- package/batteries/vector/typesense.mjs +2 -1
- package/batteries/vector/typesense.mjs.map +1 -1
- package/batteries/vector/validation.cjs +14 -0
- package/batteries/vector/validation.cjs.map +1 -1
- package/batteries/vector/validation.d.ts +14 -0
- package/batteries/vector/validation.mjs +14 -0
- package/batteries/vector/validation.mjs.map +1 -1
- package/batteries/vector/vector_store_constructor.cjs +1 -1
- package/batteries/vector/vector_store_constructor.cjs.map +1 -1
- package/batteries/vector/vector_store_constructor.d.ts +1 -1
- package/batteries/vector/vector_store_constructor.mjs +1 -1
- package/batteries/vector/vector_store_constructor.mjs.map +1 -1
- package/batteries/vector/vespa/index.d.ts +2 -0
- package/batteries/vector/vespa.cjs +2 -1
- package/batteries/vector/vespa.cjs.map +1 -1
- package/batteries/vector/vespa.mjs +2 -1
- package/batteries/vector/vespa.mjs.map +1 -1
- package/batteries/vector/weaviate/index.d.ts +2 -0
- package/batteries/vector/weaviate.cjs +2 -1
- package/batteries/vector/weaviate.cjs.map +1 -1
- package/batteries/vector/weaviate.mjs +2 -1
- package/batteries/vector/weaviate.mjs.map +1 -1
- package/batteries.cjs +58 -28
- package/batteries.mjs +12 -5
- package/{common-BT0nfCi9.mjs → common-DYDUi99O.mjs} +9 -9
- package/common-DYDUi99O.mjs.map +1 -0
- package/{common-Cj8TaQ9U.js → common-DZl3ADJs.js} +9 -9
- package/common-DZl3ADJs.js.map +1 -0
- package/common.cjs +7 -7
- package/common.mjs +7 -7
- package/{dispatch_runner-DPcS7Y_M.mjs → dispatch_runner--ZhdDWRZ.mjs} +27 -5
- package/{dispatch_runner-DPcS7Y_M.mjs.map → dispatch_runner--ZhdDWRZ.mjs.map} +1 -1
- package/{dispatch_runner-BHBNupqp.js → dispatch_runner-nHDKkxye.js} +27 -5
- package/{dispatch_runner-BHBNupqp.js.map → dispatch_runner-nHDKkxye.js.map} +1 -1
- package/dispatch_runner.cjs +1 -1
- package/dispatch_runner.d.ts +1 -1
- package/dispatch_runner.mjs +1 -1
- package/eslint/rules/artifact_tool_forbids_artifact_constructor.cjs +1 -0
- package/eslint/rules/artifact_tool_forbids_artifact_constructor.cjs.map +1 -1
- package/eslint/rules/artifact_tool_forbids_artifact_constructor.d.ts +1 -0
- package/eslint/rules/artifact_tool_forbids_artifact_constructor.mjs +1 -0
- package/eslint/rules/artifact_tool_forbids_artifact_constructor.mjs.map +1 -1
- package/eslint/rules/no_model_in_tool_handler.cjs +1 -0
- package/eslint/rules/no_model_in_tool_handler.cjs.map +1 -1
- package/eslint/rules/no_model_in_tool_handler.d.ts +1 -0
- package/eslint/rules/no_model_in_tool_handler.mjs +1 -0
- package/eslint/rules/no_model_in_tool_handler.mjs.map +1 -1
- package/eslint/rules/require_validator_any_required.cjs +1 -0
- package/eslint/rules/require_validator_any_required.cjs.map +1 -1
- package/eslint/rules/require_validator_any_required.d.ts +1 -0
- package/eslint/rules/require_validator_any_required.mjs +1 -0
- package/eslint/rules/require_validator_any_required.mjs.map +1 -1
- package/eslint/rules/thought_payload_requires_replay_tag.cjs +1 -0
- package/eslint/rules/thought_payload_requires_replay_tag.cjs.map +1 -1
- package/eslint/rules/thought_payload_requires_replay_tag.d.ts +1 -0
- package/eslint/rules/thought_payload_requires_replay_tag.mjs +1 -0
- package/eslint/rules/thought_payload_requires_replay_tag.mjs.map +1 -1
- package/eslint/rules/token_encoding_requires_context_window.cjs +1 -0
- package/eslint/rules/token_encoding_requires_context_window.cjs.map +1 -1
- package/eslint/rules/token_encoding_requires_context_window.d.ts +1 -0
- package/eslint/rules/token_encoding_requires_context_window.mjs +1 -0
- package/eslint/rules/token_encoding_requires_context_window.mjs.map +1 -1
- package/eslint/rules.cjs +1 -1
- package/eslint/rules.mjs +1 -1
- package/eslint.cjs +2 -2
- package/eslint.mjs +2 -2
- package/{exceptions-BeWH2FwP.mjs → exceptions-BDhN0Xzr.mjs} +3 -2
- package/exceptions-BDhN0Xzr.mjs.map +1 -0
- package/{exceptions-CitH5wZI.js → exceptions-BRXrUKiW.js} +3 -2
- package/exceptions-BRXrUKiW.js.map +1 -0
- package/exceptions.cjs +2 -2
- package/exceptions.mjs +2 -2
- package/factories.cjs +1 -1
- package/factories.mjs +1 -1
- package/forge.cjs +4 -4
- package/forge.d.ts +1 -1
- package/forge.mjs +4 -4
- package/guards.cjs +9 -9
- package/guards.mjs +9 -9
- package/helpers-DSTFxTiC.js +497 -0
- package/helpers-DSTFxTiC.js.map +1 -0
- package/helpers-xhrQbMAG.mjs +306 -0
- package/helpers-xhrQbMAG.mjs.map +1 -0
- package/index.cjs +12 -12
- package/index.mjs +12 -12
- package/lib/classes/base_exception.d.ts +1 -0
- package/lib/classes/media.d.ts +10 -0
- package/lib/classes/retrievable.d.ts +1 -1
- package/lib/classes/spooled_json_artifact.d.ts +1 -1
- package/lib/classes/spooled_markdown_artifact.d.ts +1 -0
- package/lib/classes/tokenizable.d.ts +3 -0
- package/lib/classes/tool.d.ts +8 -0
- package/lib/classes/turn_gate.d.ts +6 -0
- package/lib/dispatch_runner.d.ts +4 -32
- package/lib/helpers/bignum.cjs +82 -0
- package/lib/helpers/bignum.cjs.map +1 -0
- package/lib/helpers/bignum.d.ts +52 -0
- package/lib/helpers/bignum.mjs +74 -0
- package/lib/helpers/bignum.mjs.map +1 -0
- package/lib/turn_runner.d.ts +1 -1
- package/lib/types/dispatch_runner.d.ts +83 -0
- package/lib/utils/exceptions.d.ts +1 -1
- package/lib/utils/retry.cjs.map +1 -1
- package/lib/utils/retry.d.ts +2 -0
- package/lib/utils/retry.mjs.map +1 -1
- package/mcp/adk-docs-corpus.json +1 -1
- package/package.json +259 -204
- package/{runtime-j92CNi5z.mjs → runtime-Bz5zA8wc.mjs} +2 -2
- package/{runtime-j92CNi5z.mjs.map → runtime-Bz5zA8wc.mjs.map} +1 -1
- package/{runtime-MFFcJrRv.js → runtime-DslE1aBw.js} +2 -2
- package/{runtime-MFFcJrRv.js.map → runtime-DslE1aBw.js.map} +1 -1
- package/scrapper-BHM1mCde.mjs +432 -0
- package/scrapper-BHM1mCde.mjs.map +1 -0
- package/scrapper-BeweWurk.js +462 -0
- package/scrapper-BeweWurk.js.map +1 -0
- package/searxng-BJFulNcK.mjs +247 -0
- package/searxng-BJFulNcK.mjs.map +1 -0
- package/searxng-B_D--V5q.js +265 -0
- package/searxng-B_D--V5q.js.map +1 -0
- package/skills/adk-assembly/SKILL.md +2 -2
- package/{spooled_artifact-CHoZgWwI.mjs → spooled_artifact-7eePq7JA.mjs} +5 -5
- package/{spooled_artifact-CHoZgWwI.mjs.map → spooled_artifact-7eePq7JA.mjs.map} +1 -1
- package/{spooled_artifact-BTq6Nzfy.js → spooled_artifact-DX8LLyUX.js} +5 -5
- package/{spooled_artifact-BTq6Nzfy.js.map → spooled_artifact-DX8LLyUX.js.map} +1 -1
- package/spooled_artifact.cjs +2 -2
- package/spooled_artifact.mjs +2 -2
- package/{spooled_markdown_artifact-CALSDxIx.js → spooled_markdown_artifact-ClX72lek.js} +4 -4
- package/spooled_markdown_artifact-ClX72lek.js.map +1 -0
- package/{spooled_markdown_artifact-Ci5UL7l4.mjs → spooled_markdown_artifact-wkrBF3oX.mjs} +4 -4
- package/spooled_markdown_artifact-wkrBF3oX.mjs.map +1 -0
- package/{thought-D34QQZZ9.mjs → thought-B_vxAiKU.mjs} +5 -5
- package/{thought-D34QQZZ9.mjs.map → thought-B_vxAiKU.mjs.map} +1 -1
- package/{thought-BbwhJ1wb.js → thought-DLwpF7MI.js} +5 -5
- package/{thought-BbwhJ1wb.js.map → thought-DLwpF7MI.js.map} +1 -1
- package/{tool-CVyZkFC7.js → tool-D5WGVIcI.js} +4 -4
- package/{tool-CVyZkFC7.js.map → tool-D5WGVIcI.js.map} +1 -1
- package/{tool-CMhaDRNd.mjs → tool-wMYMVl60.mjs} +4 -4
- package/{tool-CMhaDRNd.mjs.map → tool-wMYMVl60.mjs.map} +1 -1
- package/{tool_call-CV5qVNlb.mjs → tool_call-B4-_-vjG.mjs} +5 -5
- package/tool_call-B4-_-vjG.mjs.map +1 -0
- package/{tool_call-Db68hB7y.js → tool_call-DixVlW40.js} +5 -5
- package/tool_call-DixVlW40.js.map +1 -0
- package/{tool_registry-D1pSSlsd.mjs → tool_registry-791Vrjtf.mjs} +4 -3
- package/tool_registry-791Vrjtf.mjs.map +1 -0
- package/{tool_registry-DYUYqXvo.js → tool_registry-CKJPze3j.js} +4 -3
- package/tool_registry-CKJPze3j.js.map +1 -0
- package/{turn_runner-DqWHNP80.js → turn_runner-HXImLGIn.js} +7 -7
- package/turn_runner-HXImLGIn.js.map +1 -0
- package/{turn_runner-fg1Wc3dK.mjs → turn_runner-ZyYO-Kti.mjs} +7 -7
- package/turn_runner-ZyYO-Kti.mjs.map +1 -0
- package/turn_runner.cjs +1 -1
- package/turn_runner.mjs +1 -1
- package/types.d.ts +1 -1
- package/common-BT0nfCi9.mjs.map +0 -1
- package/common-Cj8TaQ9U.js.map +0 -1
- package/exceptions-BeWH2FwP.mjs.map +0 -1
- package/exceptions-CitH5wZI.js.map +0 -1
- package/spooled_markdown_artifact-CALSDxIx.js.map +0 -1
- package/spooled_markdown_artifact-Ci5UL7l4.mjs.map +0 -1
- package/tool_call-CV5qVNlb.mjs.map +0 -1
- package/tool_call-Db68hB7y.js.map +0 -1
- package/tool_registry-D1pSSlsd.mjs.map +0 -1
- package/tool_registry-DYUYqXvo.js.map +0 -1
- package/turn_runner-DqWHNP80.js.map +0 -1
- package/turn_runner-fg1Wc3dK.mjs.map +0 -1
|
@@ -8,11 +8,16 @@ import { describe, expect, it } from "vitest";
|
|
|
8
8
|
*
|
|
9
9
|
* @module @nhtio/adk/batteries/vector/conformance
|
|
10
10
|
*/
|
|
11
|
+
/** A deterministic stub encoder producing a 3-dim vector from simple text features. */
|
|
11
12
|
var stubEncoder = async (texts, _kind) => texts.map((tx) => [
|
|
12
13
|
tx.length,
|
|
13
14
|
tx.includes("cat") ? 1 : 0,
|
|
14
15
|
tx.includes("dog") ? 1 : 0
|
|
15
16
|
]);
|
|
17
|
+
/**
|
|
18
|
+
* A dimension-padding encoder factory: wraps {@link stubEncoder} and zero-extends to `dim`. Used by
|
|
19
|
+
* backends that enforce a minimum dimension (e.g. Cloudflare Vectorize requires 32–1536).
|
|
20
|
+
*/
|
|
16
21
|
var paddedStubEncoder = (dim) => async (texts, kind) => {
|
|
17
22
|
return (await stubEncoder(texts, kind)).map((v) => padVector(v, dim));
|
|
18
23
|
};
|
|
@@ -21,6 +26,23 @@ var padVector = (v, dim) => {
|
|
|
21
26
|
if (v.length > dim) return v.slice(0, dim);
|
|
22
27
|
return [...v, ...new Array(dim - v.length).fill(0)];
|
|
23
28
|
};
|
|
29
|
+
/**
|
|
30
|
+
* Drive a vector-store adapter through the shared contract suite.
|
|
31
|
+
*
|
|
32
|
+
* @remarks
|
|
33
|
+
* `makeStore` must return an already-connected store whose `'docs'` collection is created at the
|
|
34
|
+
* matching dimension; it is re-invoked per test so retries are self-contained. `dim` defaults to 3
|
|
35
|
+
* — pass a larger value for backends with a dimension floor (the harness pads every test vector to
|
|
36
|
+
* `dim`). `opts.retry` / `opts.timeout` are forwarded to every `it()` (defaults: retry 0, 5s) and
|
|
37
|
+
* exist for aggressively eventually-consistent managed backends whose read-after-write can flap for
|
|
38
|
+
* seconds — a retried attempt re-runs `makeStore()` against an index that has had more time to
|
|
39
|
+
* settle, without weakening any assertion.
|
|
40
|
+
*
|
|
41
|
+
* @param label - Human-readable label for the suite (the adapter name).
|
|
42
|
+
* @param makeStore - Factory returning a fresh, connected store with the `'docs'` collection.
|
|
43
|
+
* @param dim - Vector dimensionality the harness pads to (default 3).
|
|
44
|
+
* @param opts - Per-`it` retry/timeout overrides.
|
|
45
|
+
*/
|
|
24
46
|
var runVectorStoreConformance = (label, makeStore, dim = 3, opts = {}) => {
|
|
25
47
|
const p = (v) => padVector(v, dim);
|
|
26
48
|
const io = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conformance.mjs","names":[],"sources":["../../../src/batteries/vector/conformance/index.ts"],"sourcesContent":["/**\n * Shared conformance suite for vector-store adapters. Drive any adapter through\n * {@link runVectorStoreConformance} to verify it honours the same contract all shipped adapters do.\n * Public, deep-import-only (`@nhtio/adk/batteries/vector/conformance`) — it imports `vitest`, an\n * optional peer you install to run the suite; it is never pulled in by the battery barrel.\n *\n * @module @nhtio/adk/batteries/vector/conformance\n */\n\nimport { describe, expect, it } from 'vitest'\nimport type { CallableVectorStore } from '../contract'\n\n// A deterministic stub encoder: 3-dim vector from text features.\nexport const stubEncoder = async (\n texts: string[],\n _kind: 'query' | 'document'\n): Promise<number[][]> =>\n texts.map((tx) => [tx.length, tx.includes('cat') ? 1 : 0, tx.includes('dog') ? 1 : 0])\n\n// A dimension-padding encoder factory: wraps the 3-feature stub and zero-extends to `dim`.\n// Used by backends that enforce a minimum dimension (e.g. Cloudflare Vectorize requires 32–1536).\nexport const paddedStubEncoder =\n (dim: number) =>\n async (texts: string[], kind: 'query' | 'document'): Promise<number[][]> => {\n const base = await stubEncoder(texts, kind)\n return base.map((v) => padVector(v, dim))\n }\n\n// Zero-extend (or truncate) a vector to exactly `dim` entries. dim===3 (the default) returns the\n// vector unchanged, so existing callers are byte-for-byte identical.\nconst padVector = (v: number[], dim: number): number[] => {\n if (v.length === dim) return v\n if (v.length > dim) return v.slice(0, dim)\n return [...v, ...new Array(dim - v.length).fill(0)]\n}\n\n// makeStore: () => Promise<CallableVectorStore> | CallableVectorStore (already connected +\n// collection 'docs' created with the matching dimension). `dim` defaults to 3 — pass a larger\n// value for backends with a dimension floor (the harness pads every test vector to `dim`, and the\n// store's collection must be created at the same `dim`).\n//\n// `opts.retry` / `opts.timeout` are forwarded to every `it()`. Both default to vitest's defaults\n// (retry 0), so existing callers are unchanged. They exist for aggressively eventually-consistent\n// managed backends (e.g. Cloudflare Vectorize) whose read-after-write can flap for seconds: a\n// retried attempt re-runs `makeStore()` (re-clearing state) against an index that's had more time\n// to settle, turning transient-consistency flake into deterministic green without weakening any\n// assertion. Each `it` re-derives its store via makeStore, so retries are self-contained.\nexport const runVectorStoreConformance = (\n label: string,\n makeStore: () => Promise<CallableVectorStore>,\n dim = 3,\n opts: { retry?: number; timeout?: number } = {}\n): void => {\n const p = (v: number[]): number[] => padVector(v, dim)\n const io = { retry: opts.retry ?? 0, timeout: opts.timeout ?? 5000 }\n describe('conformance: ' + label, () => {\n it('upserts vectors and searches by nearVector with [0,1] score', io, async () => {\n const vs = await makeStore()\n await vs('docs').upsert([\n { id: '1', vector: p([3, 1, 0]), metadata: { kind: 'animal' } },\n { id: '2', vector: p([3, 0, 1]), metadata: { kind: 'animal' } },\n ])\n const res = await vs('docs')\n .nearVector(p([3, 1, 0]))\n .select('id', 'score')\n .limit(2)\n expect(res.length).toBe(2)\n expect(res[0].id).toBeDefined()\n expect(typeof res[0].score).toBe('number')\n expect(res[0].score! >= 0 && res[0].score! <= 1).toBe(true)\n })\n it('encodes text on upsert+nearText when an encoder is configured', io, async () => {\n const vs = await makeStore()\n await vs('docs').upsert([{ id: 'c', document: 'cat', metadata: {} }])\n const res = await vs('docs').nearText('cat').select('id').limit(1)\n expect(res.length).toBe(1)\n expect(res[0].id).toBe('c')\n })\n it('requires .select() on reads', io, async () => {\n const vs = await makeStore()\n await expect(\n (async () => {\n await vs('docs').nearVector(p([1, 1, 1]))\n })()\n ).rejects.toThrow()\n })\n it('filter-scan (no near) returns rows without score', io, async () => {\n const vs = await makeStore()\n await vs('docs').upsert([{ id: '1', vector: p([1, 0, 0]), metadata: { kind: 'x' } }])\n const res = await vs('docs').where('kind', 'x').select('id', 'metadata').limit(10)\n expect(res.length).toBe(1)\n expect(res[0].score).toBeUndefined()\n })\n it('nested filter A AND (B OR C) selects the right subset', io, async () => {\n const vs = await makeStore()\n // Every record carries all three fields so the test probes nested AND/OR routing, not\n // backend-specific missing-field semantics (e.g. Chroma's $or excludes records missing a\n // referenced key, where the JS evaluator treats that clause as merely false).\n await vs('docs').upsert([\n { id: 'a', vector: p([1, 0, 0]), metadata: { kind: 'doc', year: 2024, pinned: false } }, // kept (year arm)\n { id: 'b', vector: p([0, 1, 0]), metadata: { kind: 'doc', year: 2010, pinned: false } }, // dropped (neither arm)\n { id: 'c', vector: p([0, 0, 1]), metadata: { kind: 'doc', year: 2010, pinned: true } }, // kept (pinned arm)\n { id: 'd', vector: p([1, 1, 0]), metadata: { kind: 'other', year: 2024, pinned: true } }, // dropped (kind mismatch)\n ])\n // kind = 'doc' AND (year >= 2024 OR pinned = true)\n const res = await vs('docs')\n .where('kind', 'doc')\n .andWhere((qb) => qb.where('year', '>=', 2024).orWhere('pinned', true))\n .select('id')\n .limit(10)\n expect(res.map((r) => r.id).sort()).toEqual(['a', 'c'])\n })\n it('projection: vector excluded unless selected', io, async () => {\n const vs = await makeStore()\n await vs('docs').upsert([{ id: '1', vector: p([1, 0, 0]) }])\n const noVec = await vs('docs')\n .nearVector(p([1, 0, 0]))\n .select('id')\n .limit(1)\n expect(noVec[0].vector).toBeUndefined()\n const withVec = await vs('docs')\n .nearVector(p([1, 0, 0]))\n .select('id', 'vector')\n .limit(1)\n expect(Array.isArray(withVec[0].vector)).toBe(true)\n })\n it('deletes by id', io, async () => {\n const vs = await makeStore()\n await vs('docs').upsert([\n { id: '1', vector: p([1, 0, 0]) },\n { id: '2', vector: p([0, 1, 0]) },\n ])\n await vs('docs').whereIn('id', ['1']).delete()\n const all = await vs('docs').select('id').limit(10)\n expect(all.length).toBe(1)\n })\n it('throws transaction-unsupported when capabilities.transactions is false', io, async () => {\n const vs = await makeStore()\n if (!vs.capabilities.transactions) {\n await expect(vs.transaction(async () => {})).rejects.toThrow()\n }\n })\n })\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"conformance.mjs","names":[],"sources":["../../../src/batteries/vector/conformance/index.ts"],"sourcesContent":["/**\n * Shared conformance suite for vector-store adapters. Drive any adapter through\n * {@link runVectorStoreConformance} to verify it honours the same contract all shipped adapters do.\n * Public, deep-import-only (`@nhtio/adk/batteries/vector/conformance`) — it imports `vitest`, an\n * optional peer you install to run the suite; it is never pulled in by the battery barrel.\n *\n * @module @nhtio/adk/batteries/vector/conformance\n */\n\nimport { describe, expect, it } from 'vitest'\nimport type { CallableVectorStore } from '../contract'\n\n/** A deterministic stub encoder producing a 3-dim vector from simple text features. */\nexport const stubEncoder = async (\n texts: string[],\n _kind: 'query' | 'document'\n): Promise<number[][]> =>\n texts.map((tx) => [tx.length, tx.includes('cat') ? 1 : 0, tx.includes('dog') ? 1 : 0])\n\n/**\n * A dimension-padding encoder factory: wraps {@link stubEncoder} and zero-extends to `dim`. Used by\n * backends that enforce a minimum dimension (e.g. Cloudflare Vectorize requires 32–1536).\n */\nexport const paddedStubEncoder =\n (dim: number) =>\n async (texts: string[], kind: 'query' | 'document'): Promise<number[][]> => {\n const base = await stubEncoder(texts, kind)\n return base.map((v) => padVector(v, dim))\n }\n\n// Zero-extend (or truncate) a vector to exactly `dim` entries. dim===3 (the default) returns the\n// vector unchanged, so existing callers are byte-for-byte identical.\nconst padVector = (v: number[], dim: number): number[] => {\n if (v.length === dim) return v\n if (v.length > dim) return v.slice(0, dim)\n return [...v, ...new Array(dim - v.length).fill(0)]\n}\n\n/**\n * Drive a vector-store adapter through the shared contract suite.\n *\n * @remarks\n * `makeStore` must return an already-connected store whose `'docs'` collection is created at the\n * matching dimension; it is re-invoked per test so retries are self-contained. `dim` defaults to 3\n * — pass a larger value for backends with a dimension floor (the harness pads every test vector to\n * `dim`). `opts.retry` / `opts.timeout` are forwarded to every `it()` (defaults: retry 0, 5s) and\n * exist for aggressively eventually-consistent managed backends whose read-after-write can flap for\n * seconds — a retried attempt re-runs `makeStore()` against an index that has had more time to\n * settle, without weakening any assertion.\n *\n * @param label - Human-readable label for the suite (the adapter name).\n * @param makeStore - Factory returning a fresh, connected store with the `'docs'` collection.\n * @param dim - Vector dimensionality the harness pads to (default 3).\n * @param opts - Per-`it` retry/timeout overrides.\n */\nexport const runVectorStoreConformance = (\n label: string,\n makeStore: () => Promise<CallableVectorStore>,\n dim = 3,\n opts: { retry?: number; timeout?: number } = {}\n): void => {\n const p = (v: number[]): number[] => padVector(v, dim)\n const io = { retry: opts.retry ?? 0, timeout: opts.timeout ?? 5000 }\n describe('conformance: ' + label, () => {\n it('upserts vectors and searches by nearVector with [0,1] score', io, async () => {\n const vs = await makeStore()\n await vs('docs').upsert([\n { id: '1', vector: p([3, 1, 0]), metadata: { kind: 'animal' } },\n { id: '2', vector: p([3, 0, 1]), metadata: { kind: 'animal' } },\n ])\n const res = await vs('docs')\n .nearVector(p([3, 1, 0]))\n .select('id', 'score')\n .limit(2)\n expect(res.length).toBe(2)\n expect(res[0].id).toBeDefined()\n expect(typeof res[0].score).toBe('number')\n expect(res[0].score! >= 0 && res[0].score! <= 1).toBe(true)\n })\n it('encodes text on upsert+nearText when an encoder is configured', io, async () => {\n const vs = await makeStore()\n await vs('docs').upsert([{ id: 'c', document: 'cat', metadata: {} }])\n const res = await vs('docs').nearText('cat').select('id').limit(1)\n expect(res.length).toBe(1)\n expect(res[0].id).toBe('c')\n })\n it('requires .select() on reads', io, async () => {\n const vs = await makeStore()\n await expect(\n (async () => {\n await vs('docs').nearVector(p([1, 1, 1]))\n })()\n ).rejects.toThrow()\n })\n it('filter-scan (no near) returns rows without score', io, async () => {\n const vs = await makeStore()\n await vs('docs').upsert([{ id: '1', vector: p([1, 0, 0]), metadata: { kind: 'x' } }])\n const res = await vs('docs').where('kind', 'x').select('id', 'metadata').limit(10)\n expect(res.length).toBe(1)\n expect(res[0].score).toBeUndefined()\n })\n it('nested filter A AND (B OR C) selects the right subset', io, async () => {\n const vs = await makeStore()\n // Every record carries all three fields so the test probes nested AND/OR routing, not\n // backend-specific missing-field semantics (e.g. Chroma's $or excludes records missing a\n // referenced key, where the JS evaluator treats that clause as merely false).\n await vs('docs').upsert([\n { id: 'a', vector: p([1, 0, 0]), metadata: { kind: 'doc', year: 2024, pinned: false } }, // kept (year arm)\n { id: 'b', vector: p([0, 1, 0]), metadata: { kind: 'doc', year: 2010, pinned: false } }, // dropped (neither arm)\n { id: 'c', vector: p([0, 0, 1]), metadata: { kind: 'doc', year: 2010, pinned: true } }, // kept (pinned arm)\n { id: 'd', vector: p([1, 1, 0]), metadata: { kind: 'other', year: 2024, pinned: true } }, // dropped (kind mismatch)\n ])\n // kind = 'doc' AND (year >= 2024 OR pinned = true)\n const res = await vs('docs')\n .where('kind', 'doc')\n .andWhere((qb) => qb.where('year', '>=', 2024).orWhere('pinned', true))\n .select('id')\n .limit(10)\n expect(res.map((r) => r.id).sort()).toEqual(['a', 'c'])\n })\n it('projection: vector excluded unless selected', io, async () => {\n const vs = await makeStore()\n await vs('docs').upsert([{ id: '1', vector: p([1, 0, 0]) }])\n const noVec = await vs('docs')\n .nearVector(p([1, 0, 0]))\n .select('id')\n .limit(1)\n expect(noVec[0].vector).toBeUndefined()\n const withVec = await vs('docs')\n .nearVector(p([1, 0, 0]))\n .select('id', 'vector')\n .limit(1)\n expect(Array.isArray(withVec[0].vector)).toBe(true)\n })\n it('deletes by id', io, async () => {\n const vs = await makeStore()\n await vs('docs').upsert([\n { id: '1', vector: p([1, 0, 0]) },\n { id: '2', vector: p([0, 1, 0]) },\n ])\n await vs('docs').whereIn('id', ['1']).delete()\n const all = await vs('docs').select('id').limit(10)\n expect(all.length).toBe(1)\n })\n it('throws transaction-unsupported when capabilities.transactions is false', io, async () => {\n const vs = await makeStore()\n if (!vs.capabilities.transactions) {\n await expect(vs.transaction(async () => {})).rejects.toThrow()\n }\n })\n })\n}\n"],"mappings":";;;;;;;;;;;AAaA,IAAa,cAAc,OACzB,OACA,UAEA,MAAM,KAAK,OAAO;CAAC,GAAG;CAAQ,GAAG,SAAS,KAAK,IAAI,IAAI;CAAG,GAAG,SAAS,KAAK,IAAI,IAAI;AAAC,CAAC;;;;;AAMvF,IAAa,qBACV,QACD,OAAO,OAAiB,SAAoD;CAE1E,QAAO,MADY,YAAY,OAAO,IAAI,GAC9B,KAAK,MAAM,UAAU,GAAG,GAAG,CAAC;AAC1C;AAIF,IAAM,aAAa,GAAa,QAA0B;CACxD,IAAI,EAAE,WAAW,KAAK,OAAO;CAC7B,IAAI,EAAE,SAAS,KAAK,OAAO,EAAE,MAAM,GAAG,GAAG;CACzC,OAAO,CAAC,GAAG,GAAG,GAAG,IAAI,MAAM,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AACpD;;;;;;;;;;;;;;;;;;AAmBA,IAAa,6BACX,OACA,WACA,MAAM,GACN,OAA6C,CAAC,MACrC;CACT,MAAM,KAAK,MAA0B,UAAU,GAAG,GAAG;CACrD,MAAM,KAAK;EAAE,OAAO,KAAK,SAAS;EAAG,SAAS,KAAK,WAAW;CAAK;CACnE,SAAS,kBAAkB,aAAa;EACtC,GAAG,+DAA+D,IAAI,YAAY;GAChF,MAAM,KAAK,MAAM,UAAU;GAC3B,MAAM,GAAG,MAAM,EAAE,OAAO,CACtB;IAAE,IAAI;IAAK,QAAQ,EAAE;KAAC;KAAG;KAAG;IAAC,CAAC;IAAG,UAAU,EAAE,MAAM,SAAS;GAAE,GAC9D;IAAE,IAAI;IAAK,QAAQ,EAAE;KAAC;KAAG;KAAG;IAAC,CAAC;IAAG,UAAU,EAAE,MAAM,SAAS;GAAE,CAChE,CAAC;GACD,MAAM,MAAM,MAAM,GAAG,MAAM,EACxB,WAAW,EAAE;IAAC;IAAG;IAAG;GAAC,CAAC,CAAC,EACvB,OAAO,MAAM,OAAO,EACpB,MAAM,CAAC;GACV,OAAO,IAAI,MAAM,EAAE,KAAK,CAAC;GACzB,OAAO,IAAI,GAAG,EAAE,EAAE,YAAY;GAC9B,OAAO,OAAO,IAAI,GAAG,KAAK,EAAE,KAAK,QAAQ;GACzC,OAAO,IAAI,GAAG,SAAU,KAAK,IAAI,GAAG,SAAU,CAAC,EAAE,KAAK,IAAI;EAC5D,CAAC;EACD,GAAG,iEAAiE,IAAI,YAAY;GAClF,MAAM,KAAK,MAAM,UAAU;GAC3B,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC;IAAE,IAAI;IAAK,UAAU;IAAO,UAAU,CAAC;GAAE,CAAC,CAAC;GACpE,MAAM,MAAM,MAAM,GAAG,MAAM,EAAE,SAAS,KAAK,EAAE,OAAO,IAAI,EAAE,MAAM,CAAC;GACjE,OAAO,IAAI,MAAM,EAAE,KAAK,CAAC;GACzB,OAAO,IAAI,GAAG,EAAE,EAAE,KAAK,GAAG;EAC5B,CAAC;EACD,GAAG,+BAA+B,IAAI,YAAY;GAChD,MAAM,KAAK,MAAM,UAAU;GAC3B,MAAM,QACH,YAAY;IACX,MAAM,GAAG,MAAM,EAAE,WAAW,EAAE;KAAC;KAAG;KAAG;IAAC,CAAC,CAAC;GAC1C,GAAG,CACL,EAAE,QAAQ,QAAQ;EACpB,CAAC;EACD,GAAG,oDAAoD,IAAI,YAAY;GACrE,MAAM,KAAK,MAAM,UAAU;GAC3B,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC;IAAE,IAAI;IAAK,QAAQ,EAAE;KAAC;KAAG;KAAG;IAAC,CAAC;IAAG,UAAU,EAAE,MAAM,IAAI;GAAE,CAAC,CAAC;GACpF,MAAM,MAAM,MAAM,GAAG,MAAM,EAAE,MAAM,QAAQ,GAAG,EAAE,OAAO,MAAM,UAAU,EAAE,MAAM,EAAE;GACjF,OAAO,IAAI,MAAM,EAAE,KAAK,CAAC;GACzB,OAAO,IAAI,GAAG,KAAK,EAAE,cAAc;EACrC,CAAC;EACD,GAAG,yDAAyD,IAAI,YAAY;GAC1E,MAAM,KAAK,MAAM,UAAU;GAI3B,MAAM,GAAG,MAAM,EAAE,OAAO;IACtB;KAAE,IAAI;KAAK,QAAQ,EAAE;MAAC;MAAG;MAAG;KAAC,CAAC;KAAG,UAAU;MAAE,MAAM;MAAO,MAAM;MAAM,QAAQ;KAAM;IAAE;IACtF;KAAE,IAAI;KAAK,QAAQ,EAAE;MAAC;MAAG;MAAG;KAAC,CAAC;KAAG,UAAU;MAAE,MAAM;MAAO,MAAM;MAAM,QAAQ;KAAM;IAAE;IACtF;KAAE,IAAI;KAAK,QAAQ,EAAE;MAAC;MAAG;MAAG;KAAC,CAAC;KAAG,UAAU;MAAE,MAAM;MAAO,MAAM;MAAM,QAAQ;KAAK;IAAE;IACrF;KAAE,IAAI;KAAK,QAAQ,EAAE;MAAC;MAAG;MAAG;KAAC,CAAC;KAAG,UAAU;MAAE,MAAM;MAAS,MAAM;MAAM,QAAQ;KAAK;IAAE;GACzF,CAAC;GAOD,QAAO,MALW,GAAG,MAAM,EACxB,MAAM,QAAQ,KAAK,EACnB,UAAU,OAAO,GAAG,MAAM,QAAQ,MAAM,IAAI,EAAE,QAAQ,UAAU,IAAI,CAAC,EACrE,OAAO,IAAI,EACX,MAAM,EAAE,GACA,KAAK,MAAM,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,QAAQ,CAAC,KAAK,GAAG,CAAC;EACxD,CAAC;EACD,GAAG,+CAA+C,IAAI,YAAY;GAChE,MAAM,KAAK,MAAM,UAAU;GAC3B,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC;IAAE,IAAI;IAAK,QAAQ,EAAE;KAAC;KAAG;KAAG;IAAC,CAAC;GAAE,CAAC,CAAC;GAK3D,QAAO,MAJa,GAAG,MAAM,EAC1B,WAAW,EAAE;IAAC;IAAG;IAAG;GAAC,CAAC,CAAC,EACvB,OAAO,IAAI,EACX,MAAM,CAAC,GACG,GAAG,MAAM,EAAE,cAAc;GACtC,MAAM,UAAU,MAAM,GAAG,MAAM,EAC5B,WAAW,EAAE;IAAC;IAAG;IAAG;GAAC,CAAC,CAAC,EACvB,OAAO,MAAM,QAAQ,EACrB,MAAM,CAAC;GACV,OAAO,MAAM,QAAQ,QAAQ,GAAG,MAAM,CAAC,EAAE,KAAK,IAAI;EACpD,CAAC;EACD,GAAG,iBAAiB,IAAI,YAAY;GAClC,MAAM,KAAK,MAAM,UAAU;GAC3B,MAAM,GAAG,MAAM,EAAE,OAAO,CACtB;IAAE,IAAI;IAAK,QAAQ,EAAE;KAAC;KAAG;KAAG;IAAC,CAAC;GAAE,GAChC;IAAE,IAAI;IAAK,QAAQ,EAAE;KAAC;KAAG;KAAG;IAAC,CAAC;GAAE,CAClC,CAAC;GACD,MAAM,GAAG,MAAM,EAAE,QAAQ,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO;GAE7C,QAAO,MADW,GAAG,MAAM,EAAE,OAAO,IAAI,EAAE,MAAM,EAAE,GACvC,MAAM,EAAE,KAAK,CAAC;EAC3B,CAAC;EACD,GAAG,0EAA0E,IAAI,YAAY;GAC3F,MAAM,KAAK,MAAM,UAAU;GAC3B,IAAI,CAAC,GAAG,aAAa,cACnB,MAAM,OAAO,GAAG,YAAY,YAAY,CAAC,CAAC,CAAC,EAAE,QAAQ,QAAQ;EAEjE,CAAC;CACH,CAAC;AACH"}
|
|
@@ -7,25 +7,47 @@ const require_batteries_vector_schema = require("./schema.cjs");
|
|
|
7
7
|
/**
|
|
8
8
|
* @module @nhtio/adk/batteries/vector/contract
|
|
9
9
|
*/
|
|
10
|
+
/**
|
|
11
|
+
* Abstract base shared by every bundled vector adapter. It implements the cross-cutting surface
|
|
12
|
+
* (`query`/`schema`/`transaction`/`asCallable`/`encode`) on top of the small set of backend-specific
|
|
13
|
+
* abstract methods each adapter fills in (`connect`, `executeSearch`, `createCollection`, …). Concrete
|
|
14
|
+
* adapters inherit the doc comments below unless they override them.
|
|
15
|
+
*/
|
|
10
16
|
var BaseVectorStore = class {
|
|
17
|
+
/** Construction options (connection details and the optional encoder), held for later use. */
|
|
11
18
|
options;
|
|
12
19
|
constructor(options) {
|
|
13
20
|
this.options = options;
|
|
14
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* Encode text to vectors via the configured encoder. Throws {@link E_VECTOR_STORE_ENCODER_REQUIRED}
|
|
24
|
+
* when the backend has no built-in encoding and no encoder was supplied.
|
|
25
|
+
*/
|
|
15
26
|
async encode(texts, kind) {
|
|
16
27
|
if (this.capabilities.builtInEncoding) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_ENCODER_REQUIRED(["contract"]);
|
|
17
28
|
if (!this.options.encoder) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_ENCODER_REQUIRED([this.constructor.name]);
|
|
18
29
|
return this.options.encoder(texts, kind);
|
|
19
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* Run `fn` inside a backend transaction. The base implementation rejects with
|
|
33
|
+
* {@link E_VECTOR_STORE_TRANSACTIONS_UNSUPPORTED}; adapters whose backend supports transactions
|
|
34
|
+
* override this.
|
|
35
|
+
*/
|
|
20
36
|
async transaction(_fn) {
|
|
21
37
|
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_TRANSACTIONS_UNSUPPORTED([this.constructor.name]);
|
|
22
38
|
}
|
|
39
|
+
/** Schema builder bound to this store, for creating/dropping/migrating collections. */
|
|
23
40
|
get schema() {
|
|
24
41
|
return new require_batteries_vector_schema.VectorSchemaBuilder(this);
|
|
25
42
|
}
|
|
43
|
+
/** Open a {@link VectorQueryBuilder} scoped to `collection` (default top-K of 10). */
|
|
26
44
|
query(collection) {
|
|
27
45
|
return new require_batteries_vector_builder.VectorQueryBuilder(this, collection, 10);
|
|
28
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* Wrap this store in a callable proxy so `store('collection')` is shorthand for
|
|
49
|
+
* `store.query('collection')`, while all other methods/properties pass through unchanged.
|
|
50
|
+
*/
|
|
29
51
|
asCallable() {
|
|
30
52
|
const self = this;
|
|
31
53
|
const fn = ((collection) => self.query(collection));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract.cjs","names":[],"sources":["../../../src/batteries/vector/contract.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/contract\n */\n\nimport { VectorQueryBuilder, type PlanSink } from './builder'\nimport { VectorSchemaBuilder, type SchemaExecutor } from './schema'\nimport {\n E_VECTOR_STORE_ENCODER_REQUIRED,\n E_VECTOR_STORE_TRANSACTIONS_UNSUPPORTED,\n} from './exceptions'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from './plan'\nimport type {\n VectorMatch,\n BaseVectorStoreOptions,\n VectorStoreCapabilities,\n EncodeKind,\n} from './types'\n\nexport interface VectorTx {}\n\nexport interface VectorStore extends PlanSink, SchemaExecutor {\n readonly capabilities: VectorStoreCapabilities\n isAvailable(): boolean\n connect(): Promise<void>\n close(): Promise<void>\n (collection: string): VectorQueryBuilder\n schema: VectorSchemaBuilder\n transaction(fn: (tx: VectorStore) => Promise<void>): Promise<void>\n}\n\nexport abstract class BaseVectorStore implements PlanSink, SchemaExecutor {\n abstract readonly capabilities: VectorStoreCapabilities\n protected options: BaseVectorStoreOptions\n\n constructor(options: BaseVectorStoreOptions) {\n this.options = options\n }\n\n abstract isAvailable(): boolean\n abstract connect(): Promise<void>\n abstract close(): Promise<void>\n\n abstract executeSearch(plan: SearchPlan): Promise<VectorMatch[]>\n abstract executeUpsert(plan: UpsertPlan): Promise<void>\n abstract executeDelete(plan: DeletePlan): Promise<void>\n\n abstract createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void>\n abstract dropCollection(collection: string, ifExists: boolean): Promise<void>\n abstract hasCollection(collection: string): Promise<boolean>\n abstract renameCollection(from: string, to: string): Promise<void>\n\n protected async encode(texts: string[], kind: EncodeKind): Promise<number[][]> {\n if (this.capabilities.builtInEncoding) {\n throw new E_VECTOR_STORE_ENCODER_REQUIRED(['contract'])\n }\n if (!this.options.encoder) throw new E_VECTOR_STORE_ENCODER_REQUIRED([this.constructor.name])\n return this.options.encoder(texts, kind)\n }\n\n async transaction(_fn: (tx: CallableVectorStore) => Promise<void>): Promise<void> {\n throw new E_VECTOR_STORE_TRANSACTIONS_UNSUPPORTED([this.constructor.name])\n }\n\n get schema(): VectorSchemaBuilder {\n return new VectorSchemaBuilder(this)\n }\n\n query(collection: string): VectorQueryBuilder {\n const defaultTopK = 10\n return new VectorQueryBuilder(this, collection, defaultTopK)\n }\n\n asCallable(): CallableVectorStore {\n const self = this\n const fn = ((collection: string) => self.query(collection)) as CallableVectorStore\n return new Proxy(fn, {\n get(target, prop, receiver) {\n if (prop in target) return Reflect.get(target, prop, receiver)\n const val = (self as any)[prop]\n return typeof val === 'function' ? val.bind(self) : val\n },\n })\n }\n}\n\nexport type CallableVectorStore = ((collection: string) => VectorQueryBuilder) & VectorStore\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"contract.cjs","names":[],"sources":["../../../src/batteries/vector/contract.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/contract\n */\n\nimport { VectorQueryBuilder, type PlanSink } from './builder'\nimport { VectorSchemaBuilder, type SchemaExecutor } from './schema'\nimport {\n E_VECTOR_STORE_ENCODER_REQUIRED,\n E_VECTOR_STORE_TRANSACTIONS_UNSUPPORTED,\n} from './exceptions'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from './plan'\nimport type {\n VectorMatch,\n BaseVectorStoreOptions,\n VectorStoreCapabilities,\n EncodeKind,\n} from './types'\n\n/**\n * Opaque handle for a backend transaction. Stores that support transactions return a\n * driver-specific implementation; the harness only passes it back through {@link VectorStore.transaction}.\n */\nexport interface VectorTx {}\n\n/**\n * The public surface every vector store exposes: capability flags, lifecycle (`connect`/`close`),\n * a callable form that opens a {@link VectorQueryBuilder} for a collection, schema access, and an\n * optional transaction wrapper. Adapters extend {@link BaseVectorStore}, which implements this plus\n * the low-level plan/schema executor contracts.\n */\nexport interface VectorStore extends PlanSink, SchemaExecutor {\n /** Static description of what this backend supports (built-in encoding, transactions, filters, etc.). */\n readonly capabilities: VectorStoreCapabilities\n /** Whether the backend's optional peer dependency is installed and the store is usable. */\n isAvailable(): boolean\n /** Open the backing connection (clients, pools, sockets). */\n connect(): Promise<void>\n /** Release the backing connection and any held resources. */\n close(): Promise<void>\n /** Callable form: `store('collection')` returns a query builder scoped to that collection. */\n (collection: string): VectorQueryBuilder\n /** Schema builder for creating, dropping, and migrating collections. */\n schema: VectorSchemaBuilder\n /** Run `fn` inside a backend transaction, where supported; rejects otherwise. */\n transaction(fn: (tx: VectorStore) => Promise<void>): Promise<void>\n}\n\n/**\n * Abstract base shared by every bundled vector adapter. It implements the cross-cutting surface\n * (`query`/`schema`/`transaction`/`asCallable`/`encode`) on top of the small set of backend-specific\n * abstract methods each adapter fills in (`connect`, `executeSearch`, `createCollection`, …). Concrete\n * adapters inherit the doc comments below unless they override them.\n */\nexport abstract class BaseVectorStore implements PlanSink, SchemaExecutor {\n /** Static description of what this backend supports — see {@link VectorStoreCapabilities}. */\n abstract readonly capabilities: VectorStoreCapabilities\n /** Construction options (connection details and the optional encoder), held for later use. */\n protected options: BaseVectorStoreOptions\n\n constructor(options: BaseVectorStoreOptions) {\n this.options = options\n }\n\n /** Whether the backend's optional peer dependency is installed and the store is usable. */\n abstract isAvailable(): boolean\n /** Establish the backing connection (open clients, pools, sockets). Idempotent where the driver allows. */\n abstract connect(): Promise<void>\n /** Release the backing connection and any held resources. */\n abstract close(): Promise<void>\n\n /** Execute a compiled search plan and return the matched records. */\n abstract executeSearch(plan: SearchPlan): Promise<VectorMatch[]>\n /** Execute a compiled upsert plan (insert-or-replace the given records). */\n abstract executeUpsert(plan: UpsertPlan): Promise<void>\n /** Execute a compiled delete plan. */\n abstract executeDelete(plan: DeletePlan): Promise<void>\n\n /** Create a collection from `spec`; a no-op when `ifNotExists` and it already exists. */\n abstract createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void>\n /** Drop a collection; a no-op when `ifExists` and it is absent. */\n abstract dropCollection(collection: string, ifExists: boolean): Promise<void>\n /** Whether a collection currently exists in the backend. */\n abstract hasCollection(collection: string): Promise<boolean>\n /** Rename a collection from `from` to `to`. */\n abstract renameCollection(from: string, to: string): Promise<void>\n\n /**\n * Encode text to vectors via the configured encoder. Throws {@link E_VECTOR_STORE_ENCODER_REQUIRED}\n * when the backend has no built-in encoding and no encoder was supplied.\n */\n protected async encode(texts: string[], kind: EncodeKind): Promise<number[][]> {\n if (this.capabilities.builtInEncoding) {\n throw new E_VECTOR_STORE_ENCODER_REQUIRED(['contract'])\n }\n if (!this.options.encoder) throw new E_VECTOR_STORE_ENCODER_REQUIRED([this.constructor.name])\n return this.options.encoder(texts, kind)\n }\n\n /**\n * Run `fn` inside a backend transaction. The base implementation rejects with\n * {@link E_VECTOR_STORE_TRANSACTIONS_UNSUPPORTED}; adapters whose backend supports transactions\n * override this.\n */\n async transaction(_fn: (tx: CallableVectorStore) => Promise<void>): Promise<void> {\n throw new E_VECTOR_STORE_TRANSACTIONS_UNSUPPORTED([this.constructor.name])\n }\n\n /** Schema builder bound to this store, for creating/dropping/migrating collections. */\n get schema(): VectorSchemaBuilder {\n return new VectorSchemaBuilder(this)\n }\n\n /** Open a {@link VectorQueryBuilder} scoped to `collection` (default top-K of 10). */\n query(collection: string): VectorQueryBuilder {\n const defaultTopK = 10\n return new VectorQueryBuilder(this, collection, defaultTopK)\n }\n\n /**\n * Wrap this store in a callable proxy so `store('collection')` is shorthand for\n * `store.query('collection')`, while all other methods/properties pass through unchanged.\n */\n asCallable(): CallableVectorStore {\n const self = this\n const fn = ((collection: string) => self.query(collection)) as CallableVectorStore\n return new Proxy(fn, {\n get(target, prop, receiver) {\n if (prop in target) return Reflect.get(target, prop, receiver)\n const val = (self as any)[prop]\n return typeof val === 'function' ? val.bind(self) : val\n },\n })\n }\n}\n\n/** A {@link VectorStore} in its callable form — `store('collection')` opens a query builder. */\nexport type CallableVectorStore = ((collection: string) => VectorQueryBuilder) & VectorStore\n"],"mappings":";;;;;;;;;;;;;;;AAqDA,IAAsB,kBAAtB,MAA0E;;CAIxE;CAEA,YAAY,SAAiC;EAC3C,KAAK,UAAU;CACjB;;;;;CA6BA,MAAgB,OAAO,OAAiB,MAAuC;EAC7E,IAAI,KAAK,aAAa,iBACpB,MAAM,IAAI,oCAAA,gCAAgC,CAAC,UAAU,CAAC;EAExD,IAAI,CAAC,KAAK,QAAQ,SAAS,MAAM,IAAI,oCAAA,gCAAgC,CAAC,KAAK,YAAY,IAAI,CAAC;EAC5F,OAAO,KAAK,QAAQ,QAAQ,OAAO,IAAI;CACzC;;;;;;CAOA,MAAM,YAAY,KAAgE;EAChF,MAAM,IAAI,oCAAA,wCAAwC,CAAC,KAAK,YAAY,IAAI,CAAC;CAC3E;;CAGA,IAAI,SAA8B;EAChC,OAAO,IAAI,gCAAA,oBAAoB,IAAI;CACrC;;CAGA,MAAM,YAAwC;EAE5C,OAAO,IAAI,iCAAA,mBAAmB,MAAM,YAAY,EAAW;CAC7D;;;;;CAMA,aAAkC;EAChC,MAAM,OAAO;EACb,MAAM,OAAO,eAAuB,KAAK,MAAM,UAAU;EACzD,OAAO,IAAI,MAAM,IAAI,EACnB,IAAI,QAAQ,MAAM,UAAU;GAC1B,IAAI,QAAQ,QAAQ,OAAO,QAAQ,IAAI,QAAQ,MAAM,QAAQ;GAC7D,MAAM,MAAO,KAAa;GAC1B,OAAO,OAAO,QAAQ,aAAa,IAAI,KAAK,IAAI,IAAI;EACtD,EACF,CAAC;CACH;AACF"}
|
|
@@ -5,35 +5,86 @@ import { VectorQueryBuilder, type PlanSink } from "./builder";
|
|
|
5
5
|
import { VectorSchemaBuilder, type SchemaExecutor } from "./schema";
|
|
6
6
|
import type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from "./plan";
|
|
7
7
|
import type { VectorMatch, BaseVectorStoreOptions, VectorStoreCapabilities, EncodeKind } from "./types";
|
|
8
|
+
/**
|
|
9
|
+
* Opaque handle for a backend transaction. Stores that support transactions return a
|
|
10
|
+
* driver-specific implementation; the harness only passes it back through {@link VectorStore.transaction}.
|
|
11
|
+
*/
|
|
8
12
|
export interface VectorTx {
|
|
9
13
|
}
|
|
14
|
+
/**
|
|
15
|
+
* The public surface every vector store exposes: capability flags, lifecycle (`connect`/`close`),
|
|
16
|
+
* a callable form that opens a {@link VectorQueryBuilder} for a collection, schema access, and an
|
|
17
|
+
* optional transaction wrapper. Adapters extend {@link BaseVectorStore}, which implements this plus
|
|
18
|
+
* the low-level plan/schema executor contracts.
|
|
19
|
+
*/
|
|
10
20
|
export interface VectorStore extends PlanSink, SchemaExecutor {
|
|
21
|
+
/** Static description of what this backend supports (built-in encoding, transactions, filters, etc.). */
|
|
11
22
|
readonly capabilities: VectorStoreCapabilities;
|
|
23
|
+
/** Whether the backend's optional peer dependency is installed and the store is usable. */
|
|
12
24
|
isAvailable(): boolean;
|
|
25
|
+
/** Open the backing connection (clients, pools, sockets). */
|
|
13
26
|
connect(): Promise<void>;
|
|
27
|
+
/** Release the backing connection and any held resources. */
|
|
14
28
|
close(): Promise<void>;
|
|
29
|
+
/** Callable form: `store('collection')` returns a query builder scoped to that collection. */
|
|
15
30
|
(collection: string): VectorQueryBuilder;
|
|
31
|
+
/** Schema builder for creating, dropping, and migrating collections. */
|
|
16
32
|
schema: VectorSchemaBuilder;
|
|
33
|
+
/** Run `fn` inside a backend transaction, where supported; rejects otherwise. */
|
|
17
34
|
transaction(fn: (tx: VectorStore) => Promise<void>): Promise<void>;
|
|
18
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* Abstract base shared by every bundled vector adapter. It implements the cross-cutting surface
|
|
38
|
+
* (`query`/`schema`/`transaction`/`asCallable`/`encode`) on top of the small set of backend-specific
|
|
39
|
+
* abstract methods each adapter fills in (`connect`, `executeSearch`, `createCollection`, …). Concrete
|
|
40
|
+
* adapters inherit the doc comments below unless they override them.
|
|
41
|
+
*/
|
|
19
42
|
export declare abstract class BaseVectorStore implements PlanSink, SchemaExecutor {
|
|
43
|
+
/** Static description of what this backend supports — see {@link VectorStoreCapabilities}. */
|
|
20
44
|
abstract readonly capabilities: VectorStoreCapabilities;
|
|
45
|
+
/** Construction options (connection details and the optional encoder), held for later use. */
|
|
21
46
|
protected options: BaseVectorStoreOptions;
|
|
22
47
|
constructor(options: BaseVectorStoreOptions);
|
|
48
|
+
/** Whether the backend's optional peer dependency is installed and the store is usable. */
|
|
23
49
|
abstract isAvailable(): boolean;
|
|
50
|
+
/** Establish the backing connection (open clients, pools, sockets). Idempotent where the driver allows. */
|
|
24
51
|
abstract connect(): Promise<void>;
|
|
52
|
+
/** Release the backing connection and any held resources. */
|
|
25
53
|
abstract close(): Promise<void>;
|
|
54
|
+
/** Execute a compiled search plan and return the matched records. */
|
|
26
55
|
abstract executeSearch(plan: SearchPlan): Promise<VectorMatch[]>;
|
|
56
|
+
/** Execute a compiled upsert plan (insert-or-replace the given records). */
|
|
27
57
|
abstract executeUpsert(plan: UpsertPlan): Promise<void>;
|
|
58
|
+
/** Execute a compiled delete plan. */
|
|
28
59
|
abstract executeDelete(plan: DeletePlan): Promise<void>;
|
|
60
|
+
/** Create a collection from `spec`; a no-op when `ifNotExists` and it already exists. */
|
|
29
61
|
abstract createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void>;
|
|
62
|
+
/** Drop a collection; a no-op when `ifExists` and it is absent. */
|
|
30
63
|
abstract dropCollection(collection: string, ifExists: boolean): Promise<void>;
|
|
64
|
+
/** Whether a collection currently exists in the backend. */
|
|
31
65
|
abstract hasCollection(collection: string): Promise<boolean>;
|
|
66
|
+
/** Rename a collection from `from` to `to`. */
|
|
32
67
|
abstract renameCollection(from: string, to: string): Promise<void>;
|
|
68
|
+
/**
|
|
69
|
+
* Encode text to vectors via the configured encoder. Throws {@link E_VECTOR_STORE_ENCODER_REQUIRED}
|
|
70
|
+
* when the backend has no built-in encoding and no encoder was supplied.
|
|
71
|
+
*/
|
|
33
72
|
protected encode(texts: string[], kind: EncodeKind): Promise<number[][]>;
|
|
73
|
+
/**
|
|
74
|
+
* Run `fn` inside a backend transaction. The base implementation rejects with
|
|
75
|
+
* {@link E_VECTOR_STORE_TRANSACTIONS_UNSUPPORTED}; adapters whose backend supports transactions
|
|
76
|
+
* override this.
|
|
77
|
+
*/
|
|
34
78
|
transaction(_fn: (tx: CallableVectorStore) => Promise<void>): Promise<void>;
|
|
79
|
+
/** Schema builder bound to this store, for creating/dropping/migrating collections. */
|
|
35
80
|
get schema(): VectorSchemaBuilder;
|
|
81
|
+
/** Open a {@link VectorQueryBuilder} scoped to `collection` (default top-K of 10). */
|
|
36
82
|
query(collection: string): VectorQueryBuilder;
|
|
83
|
+
/**
|
|
84
|
+
* Wrap this store in a callable proxy so `store('collection')` is shorthand for
|
|
85
|
+
* `store.query('collection')`, while all other methods/properties pass through unchanged.
|
|
86
|
+
*/
|
|
37
87
|
asCallable(): CallableVectorStore;
|
|
38
88
|
}
|
|
89
|
+
/** A {@link VectorStore} in its callable form — `store('collection')` opens a query builder. */
|
|
39
90
|
export type CallableVectorStore = ((collection: string) => VectorQueryBuilder) & VectorStore;
|
|
@@ -5,25 +5,47 @@ import { VectorSchemaBuilder } from "./schema.mjs";
|
|
|
5
5
|
/**
|
|
6
6
|
* @module @nhtio/adk/batteries/vector/contract
|
|
7
7
|
*/
|
|
8
|
+
/**
|
|
9
|
+
* Abstract base shared by every bundled vector adapter. It implements the cross-cutting surface
|
|
10
|
+
* (`query`/`schema`/`transaction`/`asCallable`/`encode`) on top of the small set of backend-specific
|
|
11
|
+
* abstract methods each adapter fills in (`connect`, `executeSearch`, `createCollection`, …). Concrete
|
|
12
|
+
* adapters inherit the doc comments below unless they override them.
|
|
13
|
+
*/
|
|
8
14
|
var BaseVectorStore = class {
|
|
15
|
+
/** Construction options (connection details and the optional encoder), held for later use. */
|
|
9
16
|
options;
|
|
10
17
|
constructor(options) {
|
|
11
18
|
this.options = options;
|
|
12
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* Encode text to vectors via the configured encoder. Throws {@link E_VECTOR_STORE_ENCODER_REQUIRED}
|
|
22
|
+
* when the backend has no built-in encoding and no encoder was supplied.
|
|
23
|
+
*/
|
|
13
24
|
async encode(texts, kind) {
|
|
14
25
|
if (this.capabilities.builtInEncoding) throw new E_VECTOR_STORE_ENCODER_REQUIRED(["contract"]);
|
|
15
26
|
if (!this.options.encoder) throw new E_VECTOR_STORE_ENCODER_REQUIRED([this.constructor.name]);
|
|
16
27
|
return this.options.encoder(texts, kind);
|
|
17
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* Run `fn` inside a backend transaction. The base implementation rejects with
|
|
31
|
+
* {@link E_VECTOR_STORE_TRANSACTIONS_UNSUPPORTED}; adapters whose backend supports transactions
|
|
32
|
+
* override this.
|
|
33
|
+
*/
|
|
18
34
|
async transaction(_fn) {
|
|
19
35
|
throw new E_VECTOR_STORE_TRANSACTIONS_UNSUPPORTED([this.constructor.name]);
|
|
20
36
|
}
|
|
37
|
+
/** Schema builder bound to this store, for creating/dropping/migrating collections. */
|
|
21
38
|
get schema() {
|
|
22
39
|
return new VectorSchemaBuilder(this);
|
|
23
40
|
}
|
|
41
|
+
/** Open a {@link VectorQueryBuilder} scoped to `collection` (default top-K of 10). */
|
|
24
42
|
query(collection) {
|
|
25
43
|
return new VectorQueryBuilder(this, collection, 10);
|
|
26
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* Wrap this store in a callable proxy so `store('collection')` is shorthand for
|
|
47
|
+
* `store.query('collection')`, while all other methods/properties pass through unchanged.
|
|
48
|
+
*/
|
|
27
49
|
asCallable() {
|
|
28
50
|
const self = this;
|
|
29
51
|
const fn = ((collection) => self.query(collection));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract.mjs","names":[],"sources":["../../../src/batteries/vector/contract.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/contract\n */\n\nimport { VectorQueryBuilder, type PlanSink } from './builder'\nimport { VectorSchemaBuilder, type SchemaExecutor } from './schema'\nimport {\n E_VECTOR_STORE_ENCODER_REQUIRED,\n E_VECTOR_STORE_TRANSACTIONS_UNSUPPORTED,\n} from './exceptions'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from './plan'\nimport type {\n VectorMatch,\n BaseVectorStoreOptions,\n VectorStoreCapabilities,\n EncodeKind,\n} from './types'\n\nexport interface VectorTx {}\n\nexport interface VectorStore extends PlanSink, SchemaExecutor {\n readonly capabilities: VectorStoreCapabilities\n isAvailable(): boolean\n connect(): Promise<void>\n close(): Promise<void>\n (collection: string): VectorQueryBuilder\n schema: VectorSchemaBuilder\n transaction(fn: (tx: VectorStore) => Promise<void>): Promise<void>\n}\n\nexport abstract class BaseVectorStore implements PlanSink, SchemaExecutor {\n abstract readonly capabilities: VectorStoreCapabilities\n protected options: BaseVectorStoreOptions\n\n constructor(options: BaseVectorStoreOptions) {\n this.options = options\n }\n\n abstract isAvailable(): boolean\n abstract connect(): Promise<void>\n abstract close(): Promise<void>\n\n abstract executeSearch(plan: SearchPlan): Promise<VectorMatch[]>\n abstract executeUpsert(plan: UpsertPlan): Promise<void>\n abstract executeDelete(plan: DeletePlan): Promise<void>\n\n abstract createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void>\n abstract dropCollection(collection: string, ifExists: boolean): Promise<void>\n abstract hasCollection(collection: string): Promise<boolean>\n abstract renameCollection(from: string, to: string): Promise<void>\n\n protected async encode(texts: string[], kind: EncodeKind): Promise<number[][]> {\n if (this.capabilities.builtInEncoding) {\n throw new E_VECTOR_STORE_ENCODER_REQUIRED(['contract'])\n }\n if (!this.options.encoder) throw new E_VECTOR_STORE_ENCODER_REQUIRED([this.constructor.name])\n return this.options.encoder(texts, kind)\n }\n\n async transaction(_fn: (tx: CallableVectorStore) => Promise<void>): Promise<void> {\n throw new E_VECTOR_STORE_TRANSACTIONS_UNSUPPORTED([this.constructor.name])\n }\n\n get schema(): VectorSchemaBuilder {\n return new VectorSchemaBuilder(this)\n }\n\n query(collection: string): VectorQueryBuilder {\n const defaultTopK = 10\n return new VectorQueryBuilder(this, collection, defaultTopK)\n }\n\n asCallable(): CallableVectorStore {\n const self = this\n const fn = ((collection: string) => self.query(collection)) as CallableVectorStore\n return new Proxy(fn, {\n get(target, prop, receiver) {\n if (prop in target) return Reflect.get(target, prop, receiver)\n const val = (self as any)[prop]\n return typeof val === 'function' ? val.bind(self) : val\n },\n })\n }\n}\n\nexport type CallableVectorStore = ((collection: string) => VectorQueryBuilder) & VectorStore\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"contract.mjs","names":[],"sources":["../../../src/batteries/vector/contract.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/contract\n */\n\nimport { VectorQueryBuilder, type PlanSink } from './builder'\nimport { VectorSchemaBuilder, type SchemaExecutor } from './schema'\nimport {\n E_VECTOR_STORE_ENCODER_REQUIRED,\n E_VECTOR_STORE_TRANSACTIONS_UNSUPPORTED,\n} from './exceptions'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from './plan'\nimport type {\n VectorMatch,\n BaseVectorStoreOptions,\n VectorStoreCapabilities,\n EncodeKind,\n} from './types'\n\n/**\n * Opaque handle for a backend transaction. Stores that support transactions return a\n * driver-specific implementation; the harness only passes it back through {@link VectorStore.transaction}.\n */\nexport interface VectorTx {}\n\n/**\n * The public surface every vector store exposes: capability flags, lifecycle (`connect`/`close`),\n * a callable form that opens a {@link VectorQueryBuilder} for a collection, schema access, and an\n * optional transaction wrapper. Adapters extend {@link BaseVectorStore}, which implements this plus\n * the low-level plan/schema executor contracts.\n */\nexport interface VectorStore extends PlanSink, SchemaExecutor {\n /** Static description of what this backend supports (built-in encoding, transactions, filters, etc.). */\n readonly capabilities: VectorStoreCapabilities\n /** Whether the backend's optional peer dependency is installed and the store is usable. */\n isAvailable(): boolean\n /** Open the backing connection (clients, pools, sockets). */\n connect(): Promise<void>\n /** Release the backing connection and any held resources. */\n close(): Promise<void>\n /** Callable form: `store('collection')` returns a query builder scoped to that collection. */\n (collection: string): VectorQueryBuilder\n /** Schema builder for creating, dropping, and migrating collections. */\n schema: VectorSchemaBuilder\n /** Run `fn` inside a backend transaction, where supported; rejects otherwise. */\n transaction(fn: (tx: VectorStore) => Promise<void>): Promise<void>\n}\n\n/**\n * Abstract base shared by every bundled vector adapter. It implements the cross-cutting surface\n * (`query`/`schema`/`transaction`/`asCallable`/`encode`) on top of the small set of backend-specific\n * abstract methods each adapter fills in (`connect`, `executeSearch`, `createCollection`, …). Concrete\n * adapters inherit the doc comments below unless they override them.\n */\nexport abstract class BaseVectorStore implements PlanSink, SchemaExecutor {\n /** Static description of what this backend supports — see {@link VectorStoreCapabilities}. */\n abstract readonly capabilities: VectorStoreCapabilities\n /** Construction options (connection details and the optional encoder), held for later use. */\n protected options: BaseVectorStoreOptions\n\n constructor(options: BaseVectorStoreOptions) {\n this.options = options\n }\n\n /** Whether the backend's optional peer dependency is installed and the store is usable. */\n abstract isAvailable(): boolean\n /** Establish the backing connection (open clients, pools, sockets). Idempotent where the driver allows. */\n abstract connect(): Promise<void>\n /** Release the backing connection and any held resources. */\n abstract close(): Promise<void>\n\n /** Execute a compiled search plan and return the matched records. */\n abstract executeSearch(plan: SearchPlan): Promise<VectorMatch[]>\n /** Execute a compiled upsert plan (insert-or-replace the given records). */\n abstract executeUpsert(plan: UpsertPlan): Promise<void>\n /** Execute a compiled delete plan. */\n abstract executeDelete(plan: DeletePlan): Promise<void>\n\n /** Create a collection from `spec`; a no-op when `ifNotExists` and it already exists. */\n abstract createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void>\n /** Drop a collection; a no-op when `ifExists` and it is absent. */\n abstract dropCollection(collection: string, ifExists: boolean): Promise<void>\n /** Whether a collection currently exists in the backend. */\n abstract hasCollection(collection: string): Promise<boolean>\n /** Rename a collection from `from` to `to`. */\n abstract renameCollection(from: string, to: string): Promise<void>\n\n /**\n * Encode text to vectors via the configured encoder. Throws {@link E_VECTOR_STORE_ENCODER_REQUIRED}\n * when the backend has no built-in encoding and no encoder was supplied.\n */\n protected async encode(texts: string[], kind: EncodeKind): Promise<number[][]> {\n if (this.capabilities.builtInEncoding) {\n throw new E_VECTOR_STORE_ENCODER_REQUIRED(['contract'])\n }\n if (!this.options.encoder) throw new E_VECTOR_STORE_ENCODER_REQUIRED([this.constructor.name])\n return this.options.encoder(texts, kind)\n }\n\n /**\n * Run `fn` inside a backend transaction. The base implementation rejects with\n * {@link E_VECTOR_STORE_TRANSACTIONS_UNSUPPORTED}; adapters whose backend supports transactions\n * override this.\n */\n async transaction(_fn: (tx: CallableVectorStore) => Promise<void>): Promise<void> {\n throw new E_VECTOR_STORE_TRANSACTIONS_UNSUPPORTED([this.constructor.name])\n }\n\n /** Schema builder bound to this store, for creating/dropping/migrating collections. */\n get schema(): VectorSchemaBuilder {\n return new VectorSchemaBuilder(this)\n }\n\n /** Open a {@link VectorQueryBuilder} scoped to `collection` (default top-K of 10). */\n query(collection: string): VectorQueryBuilder {\n const defaultTopK = 10\n return new VectorQueryBuilder(this, collection, defaultTopK)\n }\n\n /**\n * Wrap this store in a callable proxy so `store('collection')` is shorthand for\n * `store.query('collection')`, while all other methods/properties pass through unchanged.\n */\n asCallable(): CallableVectorStore {\n const self = this\n const fn = ((collection: string) => self.query(collection)) as CallableVectorStore\n return new Proxy(fn, {\n get(target, prop, receiver) {\n if (prop in target) return Reflect.get(target, prop, receiver)\n const val = (self as any)[prop]\n return typeof val === 'function' ? val.bind(self) : val\n },\n })\n }\n}\n\n/** A {@link VectorStore} in its callable form — `store('collection')` opens a query builder. */\nexport type CallableVectorStore = ((collection: string) => VectorQueryBuilder) & VectorStore\n"],"mappings":";;;;;;;;;;;;;AAqDA,IAAsB,kBAAtB,MAA0E;;CAIxE;CAEA,YAAY,SAAiC;EAC3C,KAAK,UAAU;CACjB;;;;;CA6BA,MAAgB,OAAO,OAAiB,MAAuC;EAC7E,IAAI,KAAK,aAAa,iBACpB,MAAM,IAAI,gCAAgC,CAAC,UAAU,CAAC;EAExD,IAAI,CAAC,KAAK,QAAQ,SAAS,MAAM,IAAI,gCAAgC,CAAC,KAAK,YAAY,IAAI,CAAC;EAC5F,OAAO,KAAK,QAAQ,QAAQ,OAAO,IAAI;CACzC;;;;;;CAOA,MAAM,YAAY,KAAgE;EAChF,MAAM,IAAI,wCAAwC,CAAC,KAAK,YAAY,IAAI,CAAC;CAC3E;;CAGA,IAAI,SAA8B;EAChC,OAAO,IAAI,oBAAoB,IAAI;CACrC;;CAGA,MAAM,YAAwC;EAE5C,OAAO,IAAI,mBAAmB,MAAM,YAAY,EAAW;CAC7D;;;;;CAMA,aAAkC;EAChC,MAAM,OAAO;EACb,MAAM,OAAO,eAAuB,KAAK,MAAM,UAAU;EACzD,OAAO,IAAI,MAAM,IAAI,EACnB,IAAI,QAAQ,MAAM,UAAU;GAC1B,IAAI,QAAQ,QAAQ,OAAO,QAAQ,IAAI,QAAQ,MAAM,QAAQ;GAC7D,MAAM,MAAO,KAAa;GAC1B,OAAO,OAAO,QAAQ,aAAa,IAAI,KAAK,IAAI,IAAI;EACtD,EACF,CAAC;CACH;AACF"}
|
|
@@ -17,6 +17,7 @@ import { BaseVectorStore } from "../contract";
|
|
|
17
17
|
import type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from "../plan";
|
|
18
18
|
import type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from "../types";
|
|
19
19
|
export interface CouchbaseVectorStoreOptions extends BaseVectorStoreOptions {
|
|
20
|
+
/** Connection and authentication parameters for the backend. */
|
|
20
21
|
connection: {
|
|
21
22
|
url: string;
|
|
22
23
|
username: string;
|
|
@@ -35,6 +36,7 @@ export interface CouchbaseVectorStoreOptions extends BaseVectorStoreOptions {
|
|
|
35
36
|
export declare class CouchbaseVectorStore extends BaseVectorStore {
|
|
36
37
|
#private;
|
|
37
38
|
readonly capabilities: VectorStoreCapabilities;
|
|
39
|
+
/** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
|
|
38
40
|
static isAvailable(): boolean;
|
|
39
41
|
isAvailable(): boolean;
|
|
40
42
|
connect(): Promise<void>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
require("../../chunk-Ble4zEEl.js");
|
|
3
|
-
const require_tool_registry = require("../../tool_registry-
|
|
3
|
+
const require_tool_registry = require("../../tool_registry-CKJPze3j.js");
|
|
4
4
|
require("../../guards.cjs");
|
|
5
5
|
const require_batteries_vector_filters = require("./filters.cjs");
|
|
6
6
|
const require_batteries_vector_helpers = require("./helpers.cjs");
|
|
@@ -96,6 +96,7 @@ var CouchbaseVectorStore = class extends require_batteries_vector_contract.BaseV
|
|
|
96
96
|
#vecIndexName(collection) {
|
|
97
97
|
return `${this.#phys(collection)}_vec`;
|
|
98
98
|
}
|
|
99
|
+
/** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
|
|
99
100
|
static isAvailable() {
|
|
100
101
|
return typeof process !== "undefined";
|
|
101
102
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"couchbase.cjs","names":["#opts","#phys","#cluster","#cb","#bucket","#sleep","#scope","#scopeName","#coll","#dims","#metrics","#vecIndexName","#parseMeta","#project"],"sources":["../../../src/batteries/vector/couchbase/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/couchbase\n *\n * Couchbase (Enterprise) vector-store adapter. Vector search is Enterprise Edition only; the\n * Community Edition will throw \"vector typed fields not supported\". A logical collection maps to a\n * Couchbase scope.collection inside a bucket. KV operations (upsert/get/remove) use strong\n * consistency, while the scoped FTS vector index is async (settle-polled after writes).\n *\n * Scoring rule: do NOT trust FTS native scores (they vary per metric and are unbounded for\n * euclidean/l2_norm). Instead, use FTS only to retrieve the candidate id set, then KV-get each\n * candidate doc and RE-COMPUTE the similarity score from the stored vec vs query vec using\n * normalizeScore — guaranteeing the [0,1] contract regardless of backend metric quirks.\n *\n * Filter-scan, enumerate, and delete-by-filter use N1QL with RequestPlus for strong consistency.\n */\n\nimport { evaluateFilter } from '../filters'\nimport { normalizeScore } from '../helpers'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { isInstanceOf } from '@nhtio/adk/guards'\nimport {\n E_VECTOR_STORE_DRIVER_UNAVAILABLE,\n E_VECTOR_STORE_CONNECTION_FAILED,\n E_VECTOR_STORE_COLLECTION_FAILED,\n E_VECTOR_STORE_UPSERT_FAILED,\n E_VECTOR_STORE_SEARCH_FAILED,\n E_VECTOR_STORE_DELETE_FAILED,\n E_VECTOR_STORE_DIMENSION_MISMATCH,\n E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n} from '../exceptions'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type {\n VectorMatch,\n VectorStoreCapabilities,\n BaseVectorStoreOptions,\n VectorMetadata,\n DistanceMetric,\n} from '../types'\n\nconst similarity = (metric: DistanceMetric): string =>\n metric === 'cosine' ? 'cosine' : metric === 'dot' ? 'dot_product' : 'l2_norm'\n\nconst cosineSim = (a: number[], b: number[]): number => {\n let dot = 0\n let normA = 0\n let normB = 0\n a.forEach((av, i) => {\n const bv = b[i]\n dot += av * bv\n normA += av * av\n normB += bv * bv\n })\n const denom = Math.sqrt(normA) * Math.sqrt(normB)\n return denom === 0 ? 0 : dot / denom\n}\n\nconst dotProd = (a: number[], b: number[]): number => {\n let s = 0\n a.forEach((av, i) => {\n s += av * b[i]\n })\n return s\n}\n\nconst euclideanDist = (a: number[], b: number[]): number => {\n let s = 0\n a.forEach((av, i) => {\n const d = av - b[i]\n s += d * d\n })\n return Math.sqrt(s)\n}\n\nconst computeScore = (vec: number[], query: number[], metric: DistanceMetric): number => {\n if (metric === 'cosine') {\n const raw = cosineSim(vec, query)\n return normalizeScore(raw, 'cosine', 'similarity')\n } else if (metric === 'dot') {\n const raw = dotProd(vec, query)\n return normalizeScore(raw, 'dot', 'similarity')\n } else if (metric === 'euclidean') {\n const raw = euclideanDist(vec, query)\n return normalizeScore(raw, 'euclidean', 'distance')\n } else {\n // Fallback\n const raw = cosineSim(vec, query)\n return normalizeScore(raw, 'cosine', 'similarity')\n }\n}\n\nconst getCB = async (): Promise<any> => {\n try {\n return await import('couchbase')\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['couchbase'])\n }\n}\n\nexport interface CouchbaseVectorStoreOptions extends BaseVectorStoreOptions {\n connection: {\n url: string\n username: string\n password: string\n bucket: string\n scope?: string\n /**\n * When set, the physical Couchbase collection becomes `${collectionPrefix}${collection}`. The\n * logical collection the builder/base see is unchanged. Lets callers (and the test suite)\n * isolate otherwise identically-named collections — useful because the scoped FTS vector index\n * builds asynchronously, so a fresh collection per use avoids drop+rebuild-index churn.\n */\n collectionPrefix?: string\n }\n}\n\nexport class CouchbaseVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: false,\n rawSql: false,\n builtInEncoding: false,\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n\n #cluster: any | null = null\n #bucket: any | null = null\n #cb: any | null = null\n #dims: Map<string, number> = new Map()\n #metrics: Map<string, DistanceMetric> = new Map()\n\n get #opts(): CouchbaseVectorStoreOptions {\n return this.options as CouchbaseVectorStoreOptions\n }\n\n #scopeName(): string {\n return this.#opts.connection.scope ?? '_default'\n }\n\n // Map a logical collection name to its physical Couchbase collection (optional prefix).\n #phys(collection: string): string {\n const prefix = this.#opts.connection.collectionPrefix\n return prefix ? `${prefix}${collection}` : collection\n }\n\n #vecIndexName(collection: string): string {\n return `${this.#phys(collection)}_vec`\n }\n\n static isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n\n isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n\n async connect(): Promise<void> {\n if (this.#cluster) return\n const couchbase = await getCB()\n this.#cb = couchbase\n const c = this.#opts.connection\n try {\n this.#cluster = await couchbase.connect(c.url, { username: c.username, password: c.password })\n this.#bucket = this.#cluster.bucket(c.bucket)\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n\n async close(): Promise<void> {\n if (this.#cluster) {\n await this.#cluster.close()\n this.#cluster = null\n this.#bucket = null\n }\n }\n\n async #sleep(ms: number): Promise<void> {\n await new Promise((r) => setTimeout(r, ms))\n }\n\n async #scope(): Promise<any> {\n if (!this.#bucket) await this.connect()\n return this.#bucket.scope(this.#scopeName())\n }\n\n async #coll(scope: any, collection: string): Promise<any> {\n return scope.collection(this.#phys(collection))\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n if (!this.#bucket) await this.connect()\n const cm = this.#bucket.collections()\n const scopeName = this.#scopeName()\n this.#dims.set(spec.collection, spec.vector.dimensions)\n this.#metrics.set(spec.collection, spec.vector.metric)\n\n // Physical collection name (logical name + optional prefix); the FTS index, N1QL identifiers\n // and the collection-manager ops all key off the physical name.\n const collectionName = this.#phys(spec.collection)\n const indexName = this.#vecIndexName(spec.collection)\n\n try {\n // Create scope.collection\n try {\n await cm.createCollection({ name: collectionName, scopeName })\n } catch (err: any) {\n if (err.message && err.message.includes('CollectionExists')) {\n if (ifNotExists) {\n // Clear existing collection\n try {\n await this.#cluster.query(\n `DELETE FROM \\`${this.#opts.connection.bucket}\\`.\\`${scopeName}\\`.\\`${collectionName}\\``\n )\n } catch {\n // Ignore cleanup failures\n }\n } else {\n // Drop and recreate\n await cm.dropCollection(collectionName, scopeName)\n await cm.createCollection({ name: collectionName, scopeName })\n }\n } else {\n throw err\n }\n }\n\n // Wait for collection to be ready\n await this.#sleep(1000)\n\n // Create primary index\n try {\n await this.#cluster.query(\n `CREATE PRIMARY INDEX ON \\`${this.#opts.connection.bucket}\\`.\\`${scopeName}\\`.\\`${collectionName}\\``\n )\n } catch {\n // Ignore if already exists\n }\n\n // Create FTS vector index\n const mgr = this.#bucket.scope(scopeName).searchIndexes()\n try {\n await mgr.upsertIndex({\n name: indexName,\n sourceType: 'gocbcore',\n sourceName: this.#opts.connection.bucket,\n type: 'fulltext-index',\n planParams: { indexPartitions: 1 },\n params: {\n doc_config: {\n mode: 'scope.collection.type_field',\n type_field: 'type',\n },\n mapping: {\n default_mapping: { enabled: false },\n default_analyzer: 'standard',\n default_type: '_default',\n types: {\n [`${scopeName}.${collectionName}`]: {\n enabled: true,\n dynamic: false,\n properties: {\n vec: {\n enabled: true,\n fields: [\n {\n name: 'vec',\n type: 'vector',\n dims: spec.vector.dimensions,\n similarity: similarity(spec.vector.metric),\n index: true,\n },\n ],\n },\n },\n },\n },\n },\n },\n })\n } catch {\n // Ignore if index already exists\n }\n\n // Poll until index is queryable\n const scope = this.#bucket.scope(scopeName)\n const probe = new Array(spec.vector.dimensions).fill(0)\n probe[0] = 1\n for (let i = 0; i < 60; i++) {\n try {\n const req = this.#cb.SearchRequest.create(\n this.#cb.VectorSearch.fromVectorQuery(\n this.#cb.VectorQuery.create('vec', probe).numCandidates(10)\n )\n )\n await scope.search(indexName, req, { timeout: 10000 })\n break\n } catch {\n await this.#sleep(1000)\n }\n }\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['createCollection', String(err)])\n }\n }\n\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n if (!this.#bucket) await this.connect()\n const cm = this.#bucket.collections()\n const scopeName = this.#scopeName()\n const physical = this.#phys(collection)\n const indexName = this.#vecIndexName(collection)\n const mgr = this.#bucket.scope(scopeName).searchIndexes()\n\n try {\n // Drop FTS index\n try {\n await mgr.dropIndex(indexName)\n } catch {\n // Ignore if index doesn't exist\n }\n\n // Drop collection\n try {\n const scopes = await cm.getAllScopes()\n const scope = scopes.find((s: any) => s.name === scopeName)\n if (!scope) {\n if (ifExists) return\n throw new Error(`scope not found: ${scopeName}`)\n }\n const coll = scope.collections?.find((c: any) => c.name === physical)\n if (!coll) {\n if (ifExists) return\n throw new Error(`collection not found: ${collection}`)\n }\n } catch (err: any) {\n if (err.message && err.message.includes('not found')) {\n if (ifExists) return\n throw err\n }\n throw err\n }\n\n await cm.dropCollection(physical, scopeName)\n this.#dims.delete(collection)\n this.#metrics.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 if (!this.#bucket) await this.connect()\n const cm = this.#bucket.collections()\n const scopeName = this.#scopeName()\n try {\n const scopes = await cm.getAllScopes()\n const scope = scopes.find((s: any) => s.name === scopeName)\n if (!scope) return false\n return !!scope.collections?.find((c: any) => c.name === this.#phys(collection))\n } catch {\n return false\n }\n }\n\n async renameCollection(_from: string, _to: string): Promise<void> {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'couchbase'])\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const scope = await this.#scope()\n const coll = await this.#coll(scope, plan.collection)\n const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection)\n const dims = expected ?? 0\n const indexName = this.#vecIndexName(plan.collection)\n\n try {\n const ids: string[] = []\n for (const r of plan.records) {\n let vector = r.vector\n if (!vector && r.document) {\n const [v] = await this.encode([r.document], 'document')\n vector = v\n }\n if (!vector) {\n throw new E_VECTOR_STORE_UPSERT_FAILED(['Record missing vector and document'])\n }\n if (expected !== undefined && vector.length !== expected) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length])\n }\n await coll.upsert(r.id, {\n id: r.id,\n vec: vector,\n document: r.document ?? '',\n metadata: r.metadata ? JSON.stringify(r.metadata) : '{}',\n type: plan.collection,\n })\n ids.push(r.id)\n }\n\n // Poll until FTS index shows all ids\n const probe = new Array(dims).fill(0)\n probe[0] = 1\n const deadline = Date.now() + 10_000\n while (Date.now() < deadline) {\n let seen = new Set<string>()\n try {\n const req = this.#cb.SearchRequest.create(\n this.#cb.VectorSearch.fromVectorQuery(\n this.#cb.VectorQuery.create('vec', probe).numCandidates(100)\n )\n )\n const res: any = await scope.search(indexName, req, { timeout: 10000 })\n seen = new Set(res.rows?.map((row: any) => row.id) ?? [])\n } catch {\n // Continue polling\n }\n if (ids.every((id) => seen.has(id))) break\n await this.#sleep(300)\n }\n } catch (err) {\n if (\n isInstanceOf(err, 'E_VECTOR_STORE_DIMENSION_MISMATCH', E_VECTOR_STORE_DIMENSION_MISMATCH) ||\n isInstanceOf(err, 'E_VECTOR_STORE_UPSERT_FAILED', E_VECTOR_STORE_UPSERT_FAILED)\n ) {\n throw err\n }\n throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n }\n }\n\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n const scope = await this.#scope()\n const coll = await this.#coll(scope, plan.collection)\n const indexName = this.#vecIndexName(plan.collection)\n const metric: DistanceMetric =\n this.#metrics.get(plan.collection) ?? this.#opts.metric ?? 'cosine'\n const oversample = 10\n\n let queryVector: number[] | undefined\n if (plan.near) {\n if ('vector' in plan.near) {\n queryVector = plan.near.vector\n } else if ('serverText' in plan.near) {\n const [v] = await this.encode([plan.near.serverText], 'query')\n queryVector = v\n } else if ('id' in plan.near) {\n try {\n const got: any = await coll.get(plan.near.id)\n queryVector = got.content?.vec\n if (!queryVector) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n } catch (err: any) {\n if (err.message && err.message.includes('DocumentNotFound')) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\n }\n }\n\n const offset = plan.offset ?? 0\n\n try {\n if (queryVector) {\n // Similarity search: FTS for candidates, then KV-get and re-score\n const k = (plan.filter ? 1000 : (plan.topK + offset) * oversample) || 100\n const req = this.#cb.SearchRequest.create(\n this.#cb.VectorSearch.fromVectorQuery(\n this.#cb.VectorQuery.create('vec', queryVector).numCandidates(Math.max(k, 100))\n )\n )\n const res: any = await scope.search(indexName, req, { timeout: 10000 })\n const candidateIds = res.rows?.map((row: any) => row.id) ?? []\n\n // KV-get each candidate to get full doc\n const candidates: any[] = []\n for (const id of candidateIds) {\n try {\n const got: any = await coll.get(id)\n candidates.push(got.content)\n } catch {\n // Skip docs that can't be read\n }\n }\n\n // Apply filter and compute scores\n const filtered = candidates.filter((d) =>\n evaluateFilter(plan.filter ?? {}, this.#parseMeta(d.metadata))\n )\n\n // Re-compute scores and sort\n const scored = filtered.map((d) => ({\n ...d,\n score: computeScore(d.vec, queryVector, metric),\n }))\n scored.sort((a, b) => b.score - a.score)\n\n return scored\n .slice(offset, offset + plan.topK)\n .map((d: any) => this.#project(d, plan, true))\n } else {\n // Filter-scan: N1QL\n const bucket = this.#opts.connection.bucket\n const scopeName = this.#scopeName()\n const q = await this.#cluster.query(\n `SELECT d.id, d.vec, d.document, d.metadata FROM \\`${bucket}\\`.\\`${scopeName}\\`.\\`${this.#phys(plan.collection)}\\` d`,\n { scanConsistency: this.#cb.QueryScanConsistency.RequestPlus }\n )\n const docs: any[] = q.rows ?? []\n\n const filtered = docs.filter((d) =>\n evaluateFilter(plan.filter ?? {}, this.#parseMeta(d.metadata))\n )\n\n return filtered\n .slice(offset, offset + plan.topK)\n .map((d: any) => this.#project(d, plan, false))\n }\n } catch (err: any) {\n if (err?.message?.includes('Referenced id not found')) {\n throw err\n }\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\n }\n\n #parseMeta(val: unknown): VectorMetadata {\n if (typeof val === 'string') {\n try {\n return JSON.parse(val) as VectorMetadata\n } catch {\n return {}\n }\n }\n if (val && typeof val === 'object') return val as VectorMetadata\n return {}\n }\n\n #project(doc: any, plan: SearchPlan, hasScore: 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 (hasScore && typeof doc.score === 'number') {\n out.score = doc.score\n }\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const scope = await this.#scope()\n const coll = await this.#coll(scope, plan.collection)\n const bucket = this.#opts.connection.bucket\n const scopeName = this.#scopeName()\n\n try {\n if (plan.ids && plan.ids.length > 0) {\n // Delete by ids\n for (const id of plan.ids) {\n try {\n await coll.remove(id)\n } catch {\n // Ignore DocumentNotFoundError\n }\n }\n } else if (plan.filter) {\n // Enumerate via N1QL, filter, then delete\n const q = await this.#cluster.query(\n `SELECT d.id, d.metadata FROM \\`${bucket}\\`.\\`${scopeName}\\`.\\`${this.#phys(plan.collection)}\\` d`,\n { scanConsistency: this.#cb.QueryScanConsistency.RequestPlus }\n )\n const docs: any[] = q.rows ?? []\n\n const targets = docs\n .filter((d) => evaluateFilter(plan.filter!, this.#parseMeta(d.metadata)))\n .map((d: any) => d.id as string)\n\n for (const id of targets) {\n try {\n await coll.remove(id)\n } catch {\n // Ignore DocumentNotFoundError\n }\n }\n } else {\n // Delete all\n await this.#cluster.query(\n `DELETE FROM \\`${bucket}\\`.\\`${scopeName}\\`.\\`${this.#phys(plan.collection)}\\` d`,\n { scanConsistency: this.#cb.QueryScanConsistency.RequestPlus }\n )\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"couchbase.cjs","names":["#opts","#phys","#cluster","#cb","#bucket","#sleep","#scope","#scopeName","#coll","#dims","#metrics","#vecIndexName","#parseMeta","#project"],"sources":["../../../src/batteries/vector/couchbase/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/couchbase\n *\n * Couchbase (Enterprise) vector-store adapter. Vector search is Enterprise Edition only; the\n * Community Edition will throw \"vector typed fields not supported\". A logical collection maps to a\n * Couchbase scope.collection inside a bucket. KV operations (upsert/get/remove) use strong\n * consistency, while the scoped FTS vector index is async (settle-polled after writes).\n *\n * Scoring rule: do NOT trust FTS native scores (they vary per metric and are unbounded for\n * euclidean/l2_norm). Instead, use FTS only to retrieve the candidate id set, then KV-get each\n * candidate doc and RE-COMPUTE the similarity score from the stored vec vs query vec using\n * normalizeScore — guaranteeing the [0,1] contract regardless of backend metric quirks.\n *\n * Filter-scan, enumerate, and delete-by-filter use N1QL with RequestPlus for strong consistency.\n */\n\nimport { evaluateFilter } from '../filters'\nimport { normalizeScore } from '../helpers'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { isInstanceOf } from '@nhtio/adk/guards'\nimport {\n E_VECTOR_STORE_DRIVER_UNAVAILABLE,\n E_VECTOR_STORE_CONNECTION_FAILED,\n E_VECTOR_STORE_COLLECTION_FAILED,\n E_VECTOR_STORE_UPSERT_FAILED,\n E_VECTOR_STORE_SEARCH_FAILED,\n E_VECTOR_STORE_DELETE_FAILED,\n E_VECTOR_STORE_DIMENSION_MISMATCH,\n E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n} from '../exceptions'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type {\n VectorMatch,\n VectorStoreCapabilities,\n BaseVectorStoreOptions,\n VectorMetadata,\n DistanceMetric,\n} from '../types'\n\nconst similarity = (metric: DistanceMetric): string =>\n metric === 'cosine' ? 'cosine' : metric === 'dot' ? 'dot_product' : 'l2_norm'\n\nconst cosineSim = (a: number[], b: number[]): number => {\n let dot = 0\n let normA = 0\n let normB = 0\n a.forEach((av, i) => {\n const bv = b[i]\n dot += av * bv\n normA += av * av\n normB += bv * bv\n })\n const denom = Math.sqrt(normA) * Math.sqrt(normB)\n return denom === 0 ? 0 : dot / denom\n}\n\nconst dotProd = (a: number[], b: number[]): number => {\n let s = 0\n a.forEach((av, i) => {\n s += av * b[i]\n })\n return s\n}\n\nconst euclideanDist = (a: number[], b: number[]): number => {\n let s = 0\n a.forEach((av, i) => {\n const d = av - b[i]\n s += d * d\n })\n return Math.sqrt(s)\n}\n\nconst computeScore = (vec: number[], query: number[], metric: DistanceMetric): number => {\n if (metric === 'cosine') {\n const raw = cosineSim(vec, query)\n return normalizeScore(raw, 'cosine', 'similarity')\n } else if (metric === 'dot') {\n const raw = dotProd(vec, query)\n return normalizeScore(raw, 'dot', 'similarity')\n } else if (metric === 'euclidean') {\n const raw = euclideanDist(vec, query)\n return normalizeScore(raw, 'euclidean', 'distance')\n } else {\n // Fallback\n const raw = cosineSim(vec, query)\n return normalizeScore(raw, 'cosine', 'similarity')\n }\n}\n\nconst getCB = async (): Promise<any> => {\n try {\n return await import('couchbase')\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['couchbase'])\n }\n}\n\nexport interface CouchbaseVectorStoreOptions extends BaseVectorStoreOptions {\n /** Connection and authentication parameters for the backend. */\n connection: {\n url: string\n username: string\n password: string\n bucket: string\n scope?: string\n /**\n * When set, the physical Couchbase collection becomes `${collectionPrefix}${collection}`. The\n * logical collection the builder/base see is unchanged. Lets callers (and the test suite)\n * isolate otherwise identically-named collections — useful because the scoped FTS vector index\n * builds asynchronously, so a fresh collection per use avoids drop+rebuild-index churn.\n */\n collectionPrefix?: string\n }\n}\n\nexport class CouchbaseVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: false,\n rawSql: false,\n builtInEncoding: false,\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n\n #cluster: any | null = null\n #bucket: any | null = null\n #cb: any | null = null\n #dims: Map<string, number> = new Map()\n #metrics: Map<string, DistanceMetric> = new Map()\n\n get #opts(): CouchbaseVectorStoreOptions {\n return this.options as CouchbaseVectorStoreOptions\n }\n\n #scopeName(): string {\n return this.#opts.connection.scope ?? '_default'\n }\n\n // Map a logical collection name to its physical Couchbase collection (optional prefix).\n #phys(collection: string): string {\n const prefix = this.#opts.connection.collectionPrefix\n return prefix ? `${prefix}${collection}` : collection\n }\n\n #vecIndexName(collection: string): string {\n return `${this.#phys(collection)}_vec`\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\n isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n\n async connect(): Promise<void> {\n if (this.#cluster) return\n const couchbase = await getCB()\n this.#cb = couchbase\n const c = this.#opts.connection\n try {\n this.#cluster = await couchbase.connect(c.url, { username: c.username, password: c.password })\n this.#bucket = this.#cluster.bucket(c.bucket)\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n\n async close(): Promise<void> {\n if (this.#cluster) {\n await this.#cluster.close()\n this.#cluster = null\n this.#bucket = null\n }\n }\n\n async #sleep(ms: number): Promise<void> {\n await new Promise((r) => setTimeout(r, ms))\n }\n\n async #scope(): Promise<any> {\n if (!this.#bucket) await this.connect()\n return this.#bucket.scope(this.#scopeName())\n }\n\n async #coll(scope: any, collection: string): Promise<any> {\n return scope.collection(this.#phys(collection))\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n if (!this.#bucket) await this.connect()\n const cm = this.#bucket.collections()\n const scopeName = this.#scopeName()\n this.#dims.set(spec.collection, spec.vector.dimensions)\n this.#metrics.set(spec.collection, spec.vector.metric)\n\n // Physical collection name (logical name + optional prefix); the FTS index, N1QL identifiers\n // and the collection-manager ops all key off the physical name.\n const collectionName = this.#phys(spec.collection)\n const indexName = this.#vecIndexName(spec.collection)\n\n try {\n // Create scope.collection\n try {\n await cm.createCollection({ name: collectionName, scopeName })\n } catch (err: any) {\n if (err.message && err.message.includes('CollectionExists')) {\n if (ifNotExists) {\n // Clear existing collection\n try {\n await this.#cluster.query(\n `DELETE FROM \\`${this.#opts.connection.bucket}\\`.\\`${scopeName}\\`.\\`${collectionName}\\``\n )\n } catch {\n // Ignore cleanup failures\n }\n } else {\n // Drop and recreate\n await cm.dropCollection(collectionName, scopeName)\n await cm.createCollection({ name: collectionName, scopeName })\n }\n } else {\n throw err\n }\n }\n\n // Wait for collection to be ready\n await this.#sleep(1000)\n\n // Create primary index\n try {\n await this.#cluster.query(\n `CREATE PRIMARY INDEX ON \\`${this.#opts.connection.bucket}\\`.\\`${scopeName}\\`.\\`${collectionName}\\``\n )\n } catch {\n // Ignore if already exists\n }\n\n // Create FTS vector index\n const mgr = this.#bucket.scope(scopeName).searchIndexes()\n try {\n await mgr.upsertIndex({\n name: indexName,\n sourceType: 'gocbcore',\n sourceName: this.#opts.connection.bucket,\n type: 'fulltext-index',\n planParams: { indexPartitions: 1 },\n params: {\n doc_config: {\n mode: 'scope.collection.type_field',\n type_field: 'type',\n },\n mapping: {\n default_mapping: { enabled: false },\n default_analyzer: 'standard',\n default_type: '_default',\n types: {\n [`${scopeName}.${collectionName}`]: {\n enabled: true,\n dynamic: false,\n properties: {\n vec: {\n enabled: true,\n fields: [\n {\n name: 'vec',\n type: 'vector',\n dims: spec.vector.dimensions,\n similarity: similarity(spec.vector.metric),\n index: true,\n },\n ],\n },\n },\n },\n },\n },\n },\n })\n } catch {\n // Ignore if index already exists\n }\n\n // Poll until index is queryable\n const scope = this.#bucket.scope(scopeName)\n const probe = new Array(spec.vector.dimensions).fill(0)\n probe[0] = 1\n for (let i = 0; i < 60; i++) {\n try {\n const req = this.#cb.SearchRequest.create(\n this.#cb.VectorSearch.fromVectorQuery(\n this.#cb.VectorQuery.create('vec', probe).numCandidates(10)\n )\n )\n await scope.search(indexName, req, { timeout: 10000 })\n break\n } catch {\n await this.#sleep(1000)\n }\n }\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['createCollection', String(err)])\n }\n }\n\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n if (!this.#bucket) await this.connect()\n const cm = this.#bucket.collections()\n const scopeName = this.#scopeName()\n const physical = this.#phys(collection)\n const indexName = this.#vecIndexName(collection)\n const mgr = this.#bucket.scope(scopeName).searchIndexes()\n\n try {\n // Drop FTS index\n try {\n await mgr.dropIndex(indexName)\n } catch {\n // Ignore if index doesn't exist\n }\n\n // Drop collection\n try {\n const scopes = await cm.getAllScopes()\n const scope = scopes.find((s: any) => s.name === scopeName)\n if (!scope) {\n if (ifExists) return\n throw new Error(`scope not found: ${scopeName}`)\n }\n const coll = scope.collections?.find((c: any) => c.name === physical)\n if (!coll) {\n if (ifExists) return\n throw new Error(`collection not found: ${collection}`)\n }\n } catch (err: any) {\n if (err.message && err.message.includes('not found')) {\n if (ifExists) return\n throw err\n }\n throw err\n }\n\n await cm.dropCollection(physical, scopeName)\n this.#dims.delete(collection)\n this.#metrics.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 if (!this.#bucket) await this.connect()\n const cm = this.#bucket.collections()\n const scopeName = this.#scopeName()\n try {\n const scopes = await cm.getAllScopes()\n const scope = scopes.find((s: any) => s.name === scopeName)\n if (!scope) return false\n return !!scope.collections?.find((c: any) => c.name === this.#phys(collection))\n } catch {\n return false\n }\n }\n\n async renameCollection(_from: string, _to: string): Promise<void> {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'couchbase'])\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const scope = await this.#scope()\n const coll = await this.#coll(scope, plan.collection)\n const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection)\n const dims = expected ?? 0\n const indexName = this.#vecIndexName(plan.collection)\n\n try {\n const ids: string[] = []\n for (const r of plan.records) {\n let vector = r.vector\n if (!vector && r.document) {\n const [v] = await this.encode([r.document], 'document')\n vector = v\n }\n if (!vector) {\n throw new E_VECTOR_STORE_UPSERT_FAILED(['Record missing vector and document'])\n }\n if (expected !== undefined && vector.length !== expected) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length])\n }\n await coll.upsert(r.id, {\n id: r.id,\n vec: vector,\n document: r.document ?? '',\n metadata: r.metadata ? JSON.stringify(r.metadata) : '{}',\n type: plan.collection,\n })\n ids.push(r.id)\n }\n\n // Poll until FTS index shows all ids\n const probe = new Array(dims).fill(0)\n probe[0] = 1\n const deadline = Date.now() + 10_000\n while (Date.now() < deadline) {\n let seen = new Set<string>()\n try {\n const req = this.#cb.SearchRequest.create(\n this.#cb.VectorSearch.fromVectorQuery(\n this.#cb.VectorQuery.create('vec', probe).numCandidates(100)\n )\n )\n const res: any = await scope.search(indexName, req, { timeout: 10000 })\n seen = new Set(res.rows?.map((row: any) => row.id) ?? [])\n } catch {\n // Continue polling\n }\n if (ids.every((id) => seen.has(id))) break\n await this.#sleep(300)\n }\n } catch (err) {\n if (\n isInstanceOf(err, 'E_VECTOR_STORE_DIMENSION_MISMATCH', E_VECTOR_STORE_DIMENSION_MISMATCH) ||\n isInstanceOf(err, 'E_VECTOR_STORE_UPSERT_FAILED', E_VECTOR_STORE_UPSERT_FAILED)\n ) {\n throw err\n }\n throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n }\n }\n\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n const scope = await this.#scope()\n const coll = await this.#coll(scope, plan.collection)\n const indexName = this.#vecIndexName(plan.collection)\n const metric: DistanceMetric =\n this.#metrics.get(plan.collection) ?? this.#opts.metric ?? 'cosine'\n const oversample = 10\n\n let queryVector: number[] | undefined\n if (plan.near) {\n if ('vector' in plan.near) {\n queryVector = plan.near.vector\n } else if ('serverText' in plan.near) {\n const [v] = await this.encode([plan.near.serverText], 'query')\n queryVector = v\n } else if ('id' in plan.near) {\n try {\n const got: any = await coll.get(plan.near.id)\n queryVector = got.content?.vec\n if (!queryVector) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n } catch (err: any) {\n if (err.message && err.message.includes('DocumentNotFound')) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\n }\n }\n\n const offset = plan.offset ?? 0\n\n try {\n if (queryVector) {\n // Similarity search: FTS for candidates, then KV-get and re-score\n const k = (plan.filter ? 1000 : (plan.topK + offset) * oversample) || 100\n const req = this.#cb.SearchRequest.create(\n this.#cb.VectorSearch.fromVectorQuery(\n this.#cb.VectorQuery.create('vec', queryVector).numCandidates(Math.max(k, 100))\n )\n )\n const res: any = await scope.search(indexName, req, { timeout: 10000 })\n const candidateIds = res.rows?.map((row: any) => row.id) ?? []\n\n // KV-get each candidate to get full doc\n const candidates: any[] = []\n for (const id of candidateIds) {\n try {\n const got: any = await coll.get(id)\n candidates.push(got.content)\n } catch {\n // Skip docs that can't be read\n }\n }\n\n // Apply filter and compute scores\n const filtered = candidates.filter((d) =>\n evaluateFilter(plan.filter ?? {}, this.#parseMeta(d.metadata))\n )\n\n // Re-compute scores and sort\n const scored = filtered.map((d) => ({\n ...d,\n score: computeScore(d.vec, queryVector, metric),\n }))\n scored.sort((a, b) => b.score - a.score)\n\n return scored\n .slice(offset, offset + plan.topK)\n .map((d: any) => this.#project(d, plan, true))\n } else {\n // Filter-scan: N1QL\n const bucket = this.#opts.connection.bucket\n const scopeName = this.#scopeName()\n const q = await this.#cluster.query(\n `SELECT d.id, d.vec, d.document, d.metadata FROM \\`${bucket}\\`.\\`${scopeName}\\`.\\`${this.#phys(plan.collection)}\\` d`,\n { scanConsistency: this.#cb.QueryScanConsistency.RequestPlus }\n )\n const docs: any[] = q.rows ?? []\n\n const filtered = docs.filter((d) =>\n evaluateFilter(plan.filter ?? {}, this.#parseMeta(d.metadata))\n )\n\n return filtered\n .slice(offset, offset + plan.topK)\n .map((d: any) => this.#project(d, plan, false))\n }\n } catch (err: any) {\n if (err?.message?.includes('Referenced id not found')) {\n throw err\n }\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\n }\n\n #parseMeta(val: unknown): VectorMetadata {\n if (typeof val === 'string') {\n try {\n return JSON.parse(val) as VectorMetadata\n } catch {\n return {}\n }\n }\n if (val && typeof val === 'object') return val as VectorMetadata\n return {}\n }\n\n #project(doc: any, plan: SearchPlan, hasScore: 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 (hasScore && typeof doc.score === 'number') {\n out.score = doc.score\n }\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const scope = await this.#scope()\n const coll = await this.#coll(scope, plan.collection)\n const bucket = this.#opts.connection.bucket\n const scopeName = this.#scopeName()\n\n try {\n if (plan.ids && plan.ids.length > 0) {\n // Delete by ids\n for (const id of plan.ids) {\n try {\n await coll.remove(id)\n } catch {\n // Ignore DocumentNotFoundError\n }\n }\n } else if (plan.filter) {\n // Enumerate via N1QL, filter, then delete\n const q = await this.#cluster.query(\n `SELECT d.id, d.metadata FROM \\`${bucket}\\`.\\`${scopeName}\\`.\\`${this.#phys(plan.collection)}\\` d`,\n { scanConsistency: this.#cb.QueryScanConsistency.RequestPlus }\n )\n const docs: any[] = q.rows ?? []\n\n const targets = docs\n .filter((d) => evaluateFilter(plan.filter!, this.#parseMeta(d.metadata)))\n .map((d: any) => d.id as string)\n\n for (const id of targets) {\n try {\n await coll.remove(id)\n } catch {\n // Ignore DocumentNotFoundError\n }\n }\n } else {\n // Delete all\n await this.#cluster.query(\n `DELETE FROM \\`${bucket}\\`.\\`${scopeName}\\`.\\`${this.#phys(plan.collection)}\\` d`,\n { scanConsistency: this.#cb.QueryScanConsistency.RequestPlus }\n )\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { s as isInstanceOf } from "../../tool_registry-
|
|
1
|
+
import { s as isInstanceOf } from "../../tool_registry-791Vrjtf.mjs";
|
|
2
2
|
import "../../guards.mjs";
|
|
3
3
|
import { evaluateFilter } from "./filters.mjs";
|
|
4
4
|
import { normalizeScore } from "./helpers.mjs";
|
|
@@ -94,6 +94,7 @@ var CouchbaseVectorStore = class extends BaseVectorStore {
|
|
|
94
94
|
#vecIndexName(collection) {
|
|
95
95
|
return `${this.#phys(collection)}_vec`;
|
|
96
96
|
}
|
|
97
|
+
/** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
|
|
97
98
|
static isAvailable() {
|
|
98
99
|
return typeof process !== "undefined";
|
|
99
100
|
}
|