@nhtio/adk 1.20260604.0 → 1.20260607.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +261 -0
- package/adk-mcp.mjs +1 -1
- package/batteries/embeddings/openai/adapter.cjs +1 -1
- package/batteries/embeddings/openai/adapter.mjs +1 -1
- package/batteries/embeddings/webllm/adapter.cjs +1 -1
- package/batteries/embeddings/webllm/adapter.mjs +1 -1
- package/batteries/index.d.ts +1 -0
- package/batteries/llm/openai_chat_completions/adapter.cjs +6 -6
- package/batteries/llm/openai_chat_completions/adapter.cjs.map +1 -1
- package/batteries/llm/openai_chat_completions/adapter.mjs +6 -6
- package/batteries/llm/openai_chat_completions/adapter.mjs.map +1 -1
- package/batteries/llm/openai_chat_completions/helpers.cjs +2 -2
- package/batteries/llm/openai_chat_completions/helpers.mjs +2 -2
- package/batteries/llm/openai_chat_completions/validation.cjs +2 -2
- package/batteries/llm/openai_chat_completions/validation.cjs.map +1 -1
- package/batteries/llm/openai_chat_completions/validation.mjs +2 -2
- package/batteries/llm/openai_chat_completions/validation.mjs.map +1 -1
- package/batteries/llm/webllm_chat_completions/adapter.cjs +6 -6
- package/batteries/llm/webllm_chat_completions/adapter.cjs.map +1 -1
- package/batteries/llm/webllm_chat_completions/adapter.mjs +6 -6
- package/batteries/llm/webllm_chat_completions/adapter.mjs.map +1 -1
- package/batteries/llm/webllm_chat_completions/validation.cjs +2 -2
- package/batteries/llm/webllm_chat_completions/validation.cjs.map +1 -1
- package/batteries/llm/webllm_chat_completions/validation.mjs +2 -2
- package/batteries/llm/webllm_chat_completions/validation.mjs.map +1 -1
- package/batteries/storage/flydrive.cjs +1 -1
- package/batteries/storage/flydrive.mjs +2 -2
- package/batteries/storage/in_memory.cjs +1 -1
- package/batteries/storage/in_memory.mjs +1 -1
- package/batteries/storage/opfs.cjs +1 -1
- package/batteries/storage/opfs.mjs +1 -1
- package/batteries/tools/color.cjs +2 -2
- package/batteries/tools/color.mjs +2 -2
- package/batteries/tools/comparison.cjs +3 -3
- package/batteries/tools/comparison.mjs +3 -3
- package/batteries/tools/data_structure.cjs +3 -3
- package/batteries/tools/data_structure.mjs +3 -3
- package/batteries/tools/datetime_extended.cjs +2 -2
- package/batteries/tools/datetime_extended.mjs +2 -2
- package/batteries/tools/datetime_math.cjs +2 -2
- package/batteries/tools/datetime_math.mjs +2 -2
- package/batteries/tools/encoding.cjs +3 -3
- package/batteries/tools/encoding.mjs +3 -3
- package/batteries/tools/formatting.cjs +3 -3
- package/batteries/tools/formatting.mjs +3 -3
- package/batteries/tools/geo_basics.cjs +2 -2
- package/batteries/tools/geo_basics.mjs +2 -2
- package/batteries/tools/math/index.d.ts +16 -5
- package/batteries/tools/math.cjs +340 -22
- package/batteries/tools/math.cjs.map +1 -1
- package/batteries/tools/math.mjs +338 -21
- package/batteries/tools/math.mjs.map +1 -1
- package/batteries/tools/memory.cjs +5 -5
- package/batteries/tools/memory.mjs +5 -5
- package/batteries/tools/parsing.cjs +4 -4
- package/batteries/tools/parsing.mjs +4 -4
- package/batteries/tools/retrievables.cjs +4 -4
- package/batteries/tools/retrievables.mjs +4 -4
- package/batteries/tools/standing_instructions.cjs +4 -4
- package/batteries/tools/standing_instructions.mjs +4 -4
- package/batteries/tools/statistics.cjs +4 -4
- package/batteries/tools/statistics.mjs +4 -4
- package/batteries/tools/string_processing.cjs +3 -3
- package/batteries/tools/string_processing.mjs +3 -3
- package/batteries/tools/structured_data.cjs +3 -3
- package/batteries/tools/structured_data.mjs +3 -3
- package/batteries/tools/text_analysis.cjs +3 -3
- package/batteries/tools/text_analysis.mjs +3 -3
- package/batteries/tools/text_comparison.cjs +2 -2
- package/batteries/tools/text_comparison.mjs +2 -2
- package/batteries/tools/time.cjs +2 -2
- package/batteries/tools/time.mjs +2 -2
- package/batteries/tools/unit_conversion.cjs +2 -2
- package/batteries/tools/unit_conversion.mjs +2 -2
- package/batteries/vector/arangodb/index.d.ts +38 -0
- package/batteries/vector/arangodb.cjs +257 -0
- package/batteries/vector/arangodb.cjs.map +1 -0
- package/batteries/vector/arangodb.mjs +255 -0
- package/batteries/vector/arangodb.mjs.map +1 -0
- package/batteries/vector/builder.cjs +297 -0
- package/batteries/vector/builder.cjs.map +1 -0
- package/batteries/vector/builder.d.ts +87 -0
- package/batteries/vector/builder.mjs +294 -0
- package/batteries/vector/builder.mjs.map +1 -0
- package/batteries/vector/chroma/index.d.ts +32 -0
- package/batteries/vector/chroma.cjs +305 -0
- package/batteries/vector/chroma.cjs.map +1 -0
- package/batteries/vector/chroma.mjs +302 -0
- package/batteries/vector/chroma.mjs.map +1 -0
- package/batteries/vector/clickhouse/index.d.ts +39 -0
- package/batteries/vector/clickhouse.cjs +246 -0
- package/batteries/vector/clickhouse.cjs.map +1 -0
- package/batteries/vector/clickhouse.mjs +244 -0
- package/batteries/vector/clickhouse.mjs.map +1 -0
- package/batteries/vector/cloudflare/index.d.ts +43 -0
- package/batteries/vector/cloudflare.cjs +397 -0
- package/batteries/vector/cloudflare.cjs.map +1 -0
- package/batteries/vector/cloudflare.mjs +395 -0
- package/batteries/vector/cloudflare.mjs.map +1 -0
- package/batteries/vector/conformance/index.d.ts +15 -0
- package/batteries/vector/conformance.cjs +209 -0
- package/batteries/vector/conformance.cjs.map +1 -0
- package/batteries/vector/conformance.mjs +205 -0
- package/batteries/vector/conformance.mjs.map +1 -0
- package/batteries/vector/contract.cjs +42 -0
- package/batteries/vector/contract.cjs.map +1 -0
- package/batteries/vector/contract.d.ts +39 -0
- package/batteries/vector/contract.mjs +40 -0
- package/batteries/vector/contract.mjs.map +1 -0
- package/batteries/vector/couchbase/index.d.ts +49 -0
- package/batteries/vector/couchbase.cjs +401 -0
- package/batteries/vector/couchbase.cjs.map +1 -0
- package/batteries/vector/couchbase.mjs +399 -0
- package/batteries/vector/couchbase.mjs.map +1 -0
- package/batteries/vector/duckdb/index.d.ts +33 -0
- package/batteries/vector/duckdb.cjs +218 -0
- package/batteries/vector/duckdb.cjs.map +1 -0
- package/batteries/vector/duckdb.mjs +216 -0
- package/batteries/vector/duckdb.mjs.map +1 -0
- package/batteries/vector/elasticsearch/index.d.ts +43 -0
- package/batteries/vector/elasticsearch.cjs +306 -0
- package/batteries/vector/elasticsearch.cjs.map +1 -0
- package/batteries/vector/elasticsearch.mjs +303 -0
- package/batteries/vector/elasticsearch.mjs.map +1 -0
- package/batteries/vector/exceptions.cjs +126 -0
- package/batteries/vector/exceptions.cjs.map +1 -0
- package/batteries/vector/exceptions.d.ts +142 -0
- package/batteries/vector/exceptions.mjs +107 -0
- package/batteries/vector/exceptions.mjs.map +1 -0
- package/batteries/vector/factory.cjs +28 -0
- package/batteries/vector/factory.cjs.map +1 -0
- package/batteries/vector/factory.d.ts +38 -0
- package/batteries/vector/factory.mjs +25 -0
- package/batteries/vector/factory.mjs.map +1 -0
- package/batteries/vector/filters.cjs +107 -0
- package/batteries/vector/filters.cjs.map +1 -0
- package/batteries/vector/filters.d.ts +34 -0
- package/batteries/vector/filters.mjs +99 -0
- package/batteries/vector/filters.mjs.map +1 -0
- package/batteries/vector/helpers.cjs +23 -0
- package/batteries/vector/helpers.cjs.map +1 -0
- package/batteries/vector/helpers.d.ts +12 -0
- package/batteries/vector/helpers.mjs +17 -0
- package/batteries/vector/helpers.mjs.map +1 -0
- package/batteries/vector/hnswlib/index.d.ts +35 -0
- package/batteries/vector/hnswlib.cjs +237 -0
- package/batteries/vector/hnswlib.cjs.map +1 -0
- package/batteries/vector/hnswlib.mjs +235 -0
- package/batteries/vector/hnswlib.mjs.map +1 -0
- package/batteries/vector/in_memory/index.d.ts +23 -0
- package/batteries/vector/in_memory.cjs +178 -0
- package/batteries/vector/in_memory.cjs.map +1 -0
- package/batteries/vector/in_memory.mjs +176 -0
- package/batteries/vector/in_memory.mjs.map +1 -0
- package/batteries/vector/index.d.ts +18 -0
- package/batteries/vector/lancedb/index.d.ts +34 -0
- package/batteries/vector/lancedb.cjs +224 -0
- package/batteries/vector/lancedb.cjs.map +1 -0
- package/batteries/vector/lancedb.mjs +222 -0
- package/batteries/vector/lancedb.mjs.map +1 -0
- package/batteries/vector/mariadb/index.d.ts +39 -0
- package/batteries/vector/mariadb.cjs +228 -0
- package/batteries/vector/mariadb.cjs.map +1 -0
- package/batteries/vector/mariadb.mjs +226 -0
- package/batteries/vector/mariadb.mjs.map +1 -0
- package/batteries/vector/meilisearch/index.d.ts +36 -0
- package/batteries/vector/meilisearch.cjs +242 -0
- package/batteries/vector/meilisearch.cjs.map +1 -0
- package/batteries/vector/meilisearch.mjs +240 -0
- package/batteries/vector/meilisearch.mjs.map +1 -0
- package/batteries/vector/migrate.cjs +54 -0
- package/batteries/vector/migrate.cjs.map +1 -0
- package/batteries/vector/migrate.d.ts +30 -0
- package/batteries/vector/migrate.mjs +52 -0
- package/batteries/vector/migrate.mjs.map +1 -0
- package/batteries/vector/milvus/index.d.ts +35 -0
- package/batteries/vector/milvus.cjs +357 -0
- package/batteries/vector/milvus.cjs.map +1 -0
- package/batteries/vector/milvus.mjs +354 -0
- package/batteries/vector/milvus.mjs.map +1 -0
- package/batteries/vector/mongodb/index.d.ts +46 -0
- package/batteries/vector/mongodb.cjs +270 -0
- package/batteries/vector/mongodb.cjs.map +1 -0
- package/batteries/vector/mongodb.mjs +268 -0
- package/batteries/vector/mongodb.mjs.map +1 -0
- package/batteries/vector/neo4j/index.d.ts +38 -0
- package/batteries/vector/neo4j.cjs +231 -0
- package/batteries/vector/neo4j.cjs.map +1 -0
- package/batteries/vector/neo4j.mjs +229 -0
- package/batteries/vector/neo4j.mjs.map +1 -0
- package/batteries/vector/opensearch/index.d.ts +46 -0
- package/batteries/vector/opensearch.cjs +316 -0
- package/batteries/vector/opensearch.cjs.map +1 -0
- package/batteries/vector/opensearch.mjs +313 -0
- package/batteries/vector/opensearch.mjs.map +1 -0
- package/batteries/vector/oracle23ai/index.d.ts +45 -0
- package/batteries/vector/oracle23ai.cjs +340 -0
- package/batteries/vector/oracle23ai.cjs.map +1 -0
- package/batteries/vector/oracle23ai.mjs +338 -0
- package/batteries/vector/oracle23ai.mjs.map +1 -0
- package/batteries/vector/orama/index.d.ts +23 -0
- package/batteries/vector/orama.cjs +272 -0
- package/batteries/vector/orama.cjs.map +1 -0
- package/batteries/vector/orama.mjs +270 -0
- package/batteries/vector/orama.mjs.map +1 -0
- package/batteries/vector/pgvector/index.d.ts +43 -0
- package/batteries/vector/pgvector.cjs +411 -0
- package/batteries/vector/pgvector.cjs.map +1 -0
- package/batteries/vector/pgvector.mjs +408 -0
- package/batteries/vector/pgvector.mjs.map +1 -0
- package/batteries/vector/pinecone/index.d.ts +38 -0
- package/batteries/vector/pinecone.cjs +415 -0
- package/batteries/vector/pinecone.cjs.map +1 -0
- package/batteries/vector/pinecone.mjs +412 -0
- package/batteries/vector/pinecone.mjs.map +1 -0
- package/batteries/vector/plan.cjs +2 -0
- package/batteries/vector/plan.d.ts +65 -0
- package/batteries/vector/plan.mjs +0 -0
- package/batteries/vector/qdrant/index.d.ts +34 -0
- package/batteries/vector/qdrant.cjs +286 -0
- package/batteries/vector/qdrant.cjs.map +1 -0
- package/batteries/vector/qdrant.mjs +284 -0
- package/batteries/vector/qdrant.mjs.map +1 -0
- package/batteries/vector/redis/index.d.ts +44 -0
- package/batteries/vector/redis.cjs +391 -0
- package/batteries/vector/redis.cjs.map +1 -0
- package/batteries/vector/redis.mjs +388 -0
- package/batteries/vector/redis.mjs.map +1 -0
- package/batteries/vector/retrievable.cjs +69 -0
- package/batteries/vector/retrievable.cjs.map +1 -0
- package/batteries/vector/retrievable.mjs +67 -0
- package/batteries/vector/retrievable.mjs.map +1 -0
- package/batteries/vector/retrievable_glue.d.ts +24 -0
- package/batteries/vector/s3vectors/index.d.ts +52 -0
- package/batteries/vector/s3vectors.cjs +438 -0
- package/batteries/vector/s3vectors.cjs.map +1 -0
- package/batteries/vector/s3vectors.mjs +436 -0
- package/batteries/vector/s3vectors.mjs.map +1 -0
- package/batteries/vector/schema.cjs +96 -0
- package/batteries/vector/schema.cjs.map +1 -0
- package/batteries/vector/schema.d.ts +40 -0
- package/batteries/vector/schema.mjs +93 -0
- package/batteries/vector/schema.mjs.map +1 -0
- package/batteries/vector/solr/index.d.ts +36 -0
- package/batteries/vector/solr.cjs +230 -0
- package/batteries/vector/solr.cjs.map +1 -0
- package/batteries/vector/solr.mjs +228 -0
- package/batteries/vector/solr.mjs.map +1 -0
- package/batteries/vector/sqlite_vec/index.d.ts +30 -0
- package/batteries/vector/sqlite_vec.cjs +318 -0
- package/batteries/vector/sqlite_vec.cjs.map +1 -0
- package/batteries/vector/sqlite_vec.mjs +316 -0
- package/batteries/vector/sqlite_vec.mjs.map +1 -0
- package/batteries/vector/surrealdb/index.d.ts +37 -0
- package/batteries/vector/surrealdb.cjs +230 -0
- package/batteries/vector/surrealdb.cjs.map +1 -0
- package/batteries/vector/surrealdb.mjs +228 -0
- package/batteries/vector/surrealdb.mjs.map +1 -0
- package/batteries/vector/types.cjs +2 -0
- package/batteries/vector/types.d.ts +100 -0
- package/batteries/vector/types.mjs +0 -0
- package/batteries/vector/typesense/index.d.ts +38 -0
- package/batteries/vector/typesense.cjs +272 -0
- package/batteries/vector/typesense.cjs.map +1 -0
- package/batteries/vector/typesense.mjs +270 -0
- package/batteries/vector/typesense.mjs.map +1 -0
- package/batteries/vector/validation.cjs +90 -0
- package/batteries/vector/validation.cjs.map +1 -0
- package/batteries/vector/validation.d.ts +18 -0
- package/batteries/vector/validation.mjs +83 -0
- package/batteries/vector/validation.mjs.map +1 -0
- package/batteries/vector/vector_store_constructor.cjs +56 -0
- package/batteries/vector/vector_store_constructor.cjs.map +1 -0
- package/batteries/vector/vector_store_constructor.d.ts +30 -0
- package/batteries/vector/vector_store_constructor.mjs +53 -0
- package/batteries/vector/vector_store_constructor.mjs.map +1 -0
- package/batteries/vector/vespa/index.d.ts +39 -0
- package/batteries/vector/vespa.cjs +423 -0
- package/batteries/vector/vespa.cjs.map +1 -0
- package/batteries/vector/vespa.mjs +421 -0
- package/batteries/vector/vespa.mjs.map +1 -0
- package/batteries/vector/weaviate/index.d.ts +57 -0
- package/batteries/vector/weaviate.cjs +325 -0
- package/batteries/vector/weaviate.cjs.map +1 -0
- package/batteries/vector/weaviate.mjs +322 -0
- package/batteries/vector/weaviate.mjs.map +1 -0
- package/batteries/vector.cjs +63 -0
- package/batteries/vector.mjs +14 -0
- package/batteries.cjs +62 -0
- package/batteries.mjs +15 -1
- package/{chunk-kRvK8_k2.mjs → chunk-Bpcn9VDT.mjs} +5 -1
- package/{common-lMrnzoyn.mjs → common-BT0nfCi9.mjs} +8 -8
- package/{common-lMrnzoyn.mjs.map → common-BT0nfCi9.mjs.map} +1 -1
- package/{common-D_e5zYsG.js → common-Cj8TaQ9U.js} +8 -8
- package/{common-D_e5zYsG.js.map → common-Cj8TaQ9U.js.map} +1 -1
- package/common.cjs +7 -7
- package/common.mjs +7 -7
- package/{dispatch_runner-CpuyATj1.js → dispatch_runner-BHBNupqp.js} +2 -2
- package/dispatch_runner-BHBNupqp.js.map +1 -0
- package/{dispatch_runner-CDF3X0nv.mjs → dispatch_runner-DPcS7Y_M.mjs} +2 -2
- package/dispatch_runner-DPcS7Y_M.mjs.map +1 -0
- package/dispatch_runner.cjs +1 -1
- package/dispatch_runner.mjs +1 -1
- package/forge.cjs +4 -4
- package/forge.mjs +4 -4
- package/guards.cjs +8 -8
- package/guards.mjs +8 -8
- package/index.cjs +12 -12
- package/index.mjs +12 -12
- package/lib/classes/tool_registry.d.ts +70 -4
- package/mcp/adk-docs-corpus.json +1 -1
- package/package.json +424 -88
- package/skills/adk-assembly/SKILL.md +2 -2
- package/{spooled_artifact-B8gIIn9h.js → spooled_artifact-BTq6Nzfy.js} +4 -4
- package/spooled_artifact-BTq6Nzfy.js.map +1 -0
- package/{spooled_artifact-CWoKUDEm.mjs → spooled_artifact-CHoZgWwI.mjs} +4 -4
- package/spooled_artifact-CHoZgWwI.mjs.map +1 -0
- package/spooled_artifact.cjs +2 -2
- package/spooled_artifact.mjs +2 -2
- package/{spooled_markdown_artifact-DQX0RCdI.js → spooled_markdown_artifact-CALSDxIx.js} +3 -3
- package/{spooled_markdown_artifact-DQX0RCdI.js.map → spooled_markdown_artifact-CALSDxIx.js.map} +1 -1
- package/{spooled_markdown_artifact-CNle4jXN.mjs → spooled_markdown_artifact-Ci5UL7l4.mjs} +3 -3
- package/{spooled_markdown_artifact-CNle4jXN.mjs.map → spooled_markdown_artifact-Ci5UL7l4.mjs.map} +1 -1
- package/src/types/evaluatex.d.ts +31 -0
- package/{thought-BD6AkkOr.js → thought-BbwhJ1wb.js} +4 -4
- package/thought-BbwhJ1wb.js.map +1 -0
- package/{thought-B_P8LiB6.mjs → thought-D34QQZZ9.mjs} +4 -4
- package/thought-D34QQZZ9.mjs.map +1 -0
- package/{tool-CRZSUcdP.mjs → tool-CMhaDRNd.mjs} +3 -3
- package/tool-CMhaDRNd.mjs.map +1 -0
- package/{tool-CX9vNHAw.js → tool-CVyZkFC7.js} +3 -3
- package/tool-CVyZkFC7.js.map +1 -0
- package/{tool_call-BUeMuCc6.mjs → tool_call-CV5qVNlb.mjs} +3 -3
- package/{tool_call-BUeMuCc6.mjs.map → tool_call-CV5qVNlb.mjs.map} +1 -1
- package/{tool_call--7ti-frB.js → tool_call-Db68hB7y.js} +3 -3
- package/{tool_call--7ti-frB.js.map → tool_call-Db68hB7y.js.map} +1 -1
- package/{tool_registry-BGHg6KTq.mjs → tool_registry-D1pSSlsd.mjs} +109 -22
- package/tool_registry-D1pSSlsd.mjs.map +1 -0
- package/{tool_registry-CtCQ4Xoz.js → tool_registry-DYUYqXvo.js} +109 -22
- package/tool_registry-DYUYqXvo.js.map +1 -0
- package/{turn_runner-BJTtAORU.js → turn_runner-DqWHNP80.js} +5 -5
- package/turn_runner-DqWHNP80.js.map +1 -0
- package/{turn_runner-C02LZHjt.mjs → turn_runner-fg1Wc3dK.mjs} +5 -5
- package/turn_runner-fg1Wc3dK.mjs.map +1 -0
- package/turn_runner.cjs +1 -1
- package/turn_runner.mjs +1 -1
- package/dispatch_runner-CDF3X0nv.mjs.map +0 -1
- package/dispatch_runner-CpuyATj1.js.map +0 -1
- package/spooled_artifact-B8gIIn9h.js.map +0 -1
- package/spooled_artifact-CWoKUDEm.mjs.map +0 -1
- package/thought-BD6AkkOr.js.map +0 -1
- package/thought-B_P8LiB6.mjs.map +0 -1
- package/tool-CRZSUcdP.mjs.map +0 -1
- package/tool-CX9vNHAw.js.map +0 -1
- package/tool_registry-BGHg6KTq.mjs.map +0 -1
- package/tool_registry-CtCQ4Xoz.js.map +0 -1
- package/turn_runner-BJTtAORU.js.map +0 -1
- package/turn_runner-C02LZHjt.mjs.map +0 -1
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
require("../../chunk-Ble4zEEl.js");
|
|
3
|
+
const require_tool_registry = require("../../tool_registry-DYUYqXvo.js");
|
|
4
|
+
require("../../guards.cjs");
|
|
5
|
+
const require_batteries_vector_filters = require("./filters.cjs");
|
|
6
|
+
const require_batteries_vector_helpers = require("./helpers.cjs");
|
|
7
|
+
const require_batteries_vector_exceptions = require("./exceptions.cjs");
|
|
8
|
+
const require_batteries_vector_contract = require("./contract.cjs");
|
|
9
|
+
const require_batteries_vector_validation = require("./validation.cjs");
|
|
10
|
+
//#region src/batteries/vector/typesense/index.ts
|
|
11
|
+
/**
|
|
12
|
+
* @module @nhtio/adk/batteries/vector/typesense
|
|
13
|
+
*
|
|
14
|
+
* Typesense adapter. Each collection is a Typesense collection with a `float[]` vector field
|
|
15
|
+
* (native `vector_query` KNN). Metadata is stored as a JSON string field and filtered with
|
|
16
|
+
* the neutral filter tree's JS reference evaluator for exact cross-adapter parity (Typesense
|
|
17
|
+
* filter_by requires per-field schema declaration, which the neutral metadata model doesn't
|
|
18
|
+
* have). Document + id are plain fields.
|
|
19
|
+
*
|
|
20
|
+
* Driver: `typesense` (pure JS).
|
|
21
|
+
*/
|
|
22
|
+
var getTypesense = async () => {
|
|
23
|
+
try {
|
|
24
|
+
const mod = await import("typesense");
|
|
25
|
+
return mod.default ?? mod;
|
|
26
|
+
} catch {
|
|
27
|
+
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_DRIVER_UNAVAILABLE(["typesense"]);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
var TypesenseVectorStore = class extends require_batteries_vector_contract.BaseVectorStore {
|
|
31
|
+
capabilities = {
|
|
32
|
+
transactions: false,
|
|
33
|
+
namedVectors: false,
|
|
34
|
+
rename: false,
|
|
35
|
+
rawSql: false,
|
|
36
|
+
builtInEncoding: false,
|
|
37
|
+
consistency: {
|
|
38
|
+
configurable: false,
|
|
39
|
+
default: "strong",
|
|
40
|
+
modes: ["strong"]
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
#client = null;
|
|
44
|
+
#dims = /* @__PURE__ */ new Map();
|
|
45
|
+
get #opts() {
|
|
46
|
+
return this.options;
|
|
47
|
+
}
|
|
48
|
+
static isAvailable() {
|
|
49
|
+
return typeof process !== "undefined";
|
|
50
|
+
}
|
|
51
|
+
isAvailable() {
|
|
52
|
+
return typeof process !== "undefined";
|
|
53
|
+
}
|
|
54
|
+
async connect() {
|
|
55
|
+
if (this.#client) return;
|
|
56
|
+
const Typesense = await getTypesense();
|
|
57
|
+
const c = this.#opts.connection || {};
|
|
58
|
+
let node;
|
|
59
|
+
if (c.url) {
|
|
60
|
+
const u = new URL(c.url);
|
|
61
|
+
node = {
|
|
62
|
+
host: u.hostname,
|
|
63
|
+
port: Number(u.port) || (u.protocol === "https:" ? 443 : 8108),
|
|
64
|
+
protocol: u.protocol.replace(":", "")
|
|
65
|
+
};
|
|
66
|
+
} else node = {
|
|
67
|
+
host: c.host ?? "localhost",
|
|
68
|
+
port: c.port ?? 8108,
|
|
69
|
+
protocol: c.protocol ?? "http"
|
|
70
|
+
};
|
|
71
|
+
try {
|
|
72
|
+
this.#client = new Typesense.Client({
|
|
73
|
+
nodes: [node],
|
|
74
|
+
apiKey: c.apiKey ?? "xyz",
|
|
75
|
+
connectionTimeoutSeconds: 5
|
|
76
|
+
});
|
|
77
|
+
} catch (err) {
|
|
78
|
+
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_CONNECTION_FAILED([String(err)]);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async close() {
|
|
82
|
+
this.#client = null;
|
|
83
|
+
}
|
|
84
|
+
async #ensure() {
|
|
85
|
+
if (!this.#client) await this.connect();
|
|
86
|
+
return this.#client;
|
|
87
|
+
}
|
|
88
|
+
async createCollection(spec, ifNotExists) {
|
|
89
|
+
const client = await this.#ensure();
|
|
90
|
+
this.#dims.set(spec.collection, spec.vector.dimensions);
|
|
91
|
+
if (ifNotExists && await this.hasCollection(spec.collection)) return;
|
|
92
|
+
try {
|
|
93
|
+
await client.collections().create({
|
|
94
|
+
name: spec.collection,
|
|
95
|
+
fields: [
|
|
96
|
+
{
|
|
97
|
+
name: "id",
|
|
98
|
+
type: "string"
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
name: "vec",
|
|
102
|
+
type: "float[]",
|
|
103
|
+
num_dim: spec.vector.dimensions
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
name: "document",
|
|
107
|
+
type: "string",
|
|
108
|
+
optional: true
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
name: "metadata",
|
|
112
|
+
type: "string",
|
|
113
|
+
optional: true
|
|
114
|
+
}
|
|
115
|
+
]
|
|
116
|
+
});
|
|
117
|
+
} catch (err) {
|
|
118
|
+
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_COLLECTION_FAILED(["createCollection", String(err)]);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
async dropCollection(collection, ifExists) {
|
|
122
|
+
const client = await this.#ensure();
|
|
123
|
+
if (ifExists && !await this.hasCollection(collection)) return;
|
|
124
|
+
try {
|
|
125
|
+
await client.collections(collection).delete();
|
|
126
|
+
this.#dims.delete(collection);
|
|
127
|
+
} catch (err) {
|
|
128
|
+
const msg = String(err);
|
|
129
|
+
if (ifExists && msg.includes("Not Found")) return;
|
|
130
|
+
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_COLLECTION_FAILED(["dropCollection", msg]);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
async hasCollection(collection) {
|
|
134
|
+
const client = await this.#ensure();
|
|
135
|
+
try {
|
|
136
|
+
await client.collections(collection).retrieve();
|
|
137
|
+
return true;
|
|
138
|
+
} catch {
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
async renameCollection(_from, _to) {
|
|
143
|
+
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_UNSUPPORTED_OPERATION(["renameCollection", "typesense"]);
|
|
144
|
+
}
|
|
145
|
+
async executeUpsert(plan) {
|
|
146
|
+
if (plan.records.length === 0) return;
|
|
147
|
+
require_batteries_vector_validation.validateRecords(plan.records);
|
|
148
|
+
const client = await this.#ensure();
|
|
149
|
+
const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection);
|
|
150
|
+
try {
|
|
151
|
+
const docs = [];
|
|
152
|
+
for (const r of plan.records) {
|
|
153
|
+
let vector = r.vector;
|
|
154
|
+
if (!vector && r.document) {
|
|
155
|
+
const [v] = await this.encode([r.document], "document");
|
|
156
|
+
vector = v;
|
|
157
|
+
}
|
|
158
|
+
if (!vector) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_UPSERT_FAILED(["Record missing vector and document"]);
|
|
159
|
+
if (expected !== void 0 && vector.length !== expected) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length]);
|
|
160
|
+
docs.push({
|
|
161
|
+
id: r.id,
|
|
162
|
+
vec: vector,
|
|
163
|
+
document: r.document ?? "",
|
|
164
|
+
metadata: r.metadata ? JSON.stringify(r.metadata) : "{}"
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
await client.collections(plan.collection).documents().import(docs, { action: "upsert" });
|
|
168
|
+
} catch (err) {
|
|
169
|
+
if (require_tool_registry.isInstanceOf(err, "E_VECTOR_STORE_DIMENSION_MISMATCH", require_batteries_vector_exceptions.E_VECTOR_STORE_DIMENSION_MISMATCH) || require_tool_registry.isInstanceOf(err, "E_VECTOR_STORE_UPSERT_FAILED", require_batteries_vector_exceptions.E_VECTOR_STORE_UPSERT_FAILED)) throw err;
|
|
170
|
+
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_UPSERT_FAILED([String(err)]);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
async executeSearch(plan) {
|
|
174
|
+
const client = await this.#ensure();
|
|
175
|
+
const metric = this.#opts.metric ?? "cosine";
|
|
176
|
+
let queryVector;
|
|
177
|
+
if (plan.near) {
|
|
178
|
+
if ("vector" in plan.near) queryVector = plan.near.vector;
|
|
179
|
+
else if ("serverText" in plan.near) {
|
|
180
|
+
const [v] = await this.encode([plan.near.serverText], "query");
|
|
181
|
+
queryVector = v;
|
|
182
|
+
} else if ("id" in plan.near) {
|
|
183
|
+
try {
|
|
184
|
+
queryVector = (await client.collections(plan.collection).documents(plan.near.id).retrieve()).vec;
|
|
185
|
+
} catch {
|
|
186
|
+
queryVector = void 0;
|
|
187
|
+
}
|
|
188
|
+
if (!queryVector) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_SEARCH_FAILED(["Referenced id not found: " + plan.near.id]);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
const offset = plan.offset ?? 0;
|
|
192
|
+
try {
|
|
193
|
+
const coll = client.collections(plan.collection).documents();
|
|
194
|
+
if (queryVector) {
|
|
195
|
+
const k = Math.max(plan.topK + offset, plan.topK) + (plan.filter ? 250 : 0);
|
|
196
|
+
const mapped = ((await coll.search({
|
|
197
|
+
q: "*",
|
|
198
|
+
vector_query: `vec:([${queryVector.join(",")}], k:${k})`,
|
|
199
|
+
per_page: Math.min(250, k)
|
|
200
|
+
})).hits ?? []).map((hit) => ({
|
|
201
|
+
match: this.#project(hit.document, plan, metric, hit.vector_distance),
|
|
202
|
+
meta: this.#parseMeta(hit.document.metadata)
|
|
203
|
+
}));
|
|
204
|
+
return (plan.filter ? mapped.filter((m) => require_batteries_vector_filters.evaluateFilter(plan.filter, m.meta)) : mapped).slice(offset, offset + plan.topK).map((m) => m.match);
|
|
205
|
+
} else {
|
|
206
|
+
const mapped = ((await coll.search({
|
|
207
|
+
q: "*",
|
|
208
|
+
query_by: "document",
|
|
209
|
+
per_page: 250
|
|
210
|
+
})).hits ?? []).map((hit) => ({
|
|
211
|
+
match: this.#project(hit.document, plan, metric, void 0),
|
|
212
|
+
meta: this.#parseMeta(hit.document.metadata)
|
|
213
|
+
}));
|
|
214
|
+
return (plan.filter ? mapped.filter((m) => require_batteries_vector_filters.evaluateFilter(plan.filter, m.meta)) : mapped).slice(offset, offset + plan.topK).map((m) => m.match);
|
|
215
|
+
}
|
|
216
|
+
} catch (err) {
|
|
217
|
+
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_SEARCH_FAILED([String(err)]);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
#parseMeta(val) {
|
|
221
|
+
if (typeof val === "string") try {
|
|
222
|
+
return JSON.parse(val);
|
|
223
|
+
} catch {
|
|
224
|
+
return {};
|
|
225
|
+
}
|
|
226
|
+
if (val && typeof val === "object") return val;
|
|
227
|
+
return {};
|
|
228
|
+
}
|
|
229
|
+
#project(doc, plan, metric, dist) {
|
|
230
|
+
const proj = plan.projection;
|
|
231
|
+
const out = {};
|
|
232
|
+
if (proj.id) out.id = doc.id;
|
|
233
|
+
if (proj.vector && Array.isArray(doc.vec)) out.vector = doc.vec;
|
|
234
|
+
if (proj.document) out.document = doc.document ?? void 0;
|
|
235
|
+
if (proj.metadata) out.metadata = this.#parseMeta(doc.metadata);
|
|
236
|
+
if (dist !== void 0 && dist !== null) out.score = require_batteries_vector_helpers.normalizeScore(Number(dist), metric, "distance");
|
|
237
|
+
return out;
|
|
238
|
+
}
|
|
239
|
+
async executeDelete(plan) {
|
|
240
|
+
const collection = (await this.#ensure()).collections(plan.collection);
|
|
241
|
+
const coll = collection.documents();
|
|
242
|
+
const deleteOne = async (id) => {
|
|
243
|
+
await collection.documents(id).delete().catch(() => void 0);
|
|
244
|
+
};
|
|
245
|
+
try {
|
|
246
|
+
if (plan.ids && plan.ids.length > 0) for (const id of plan.ids) await deleteOne(id);
|
|
247
|
+
else if (plan.filter) {
|
|
248
|
+
const targets = ((await coll.search({
|
|
249
|
+
q: "*",
|
|
250
|
+
query_by: "document",
|
|
251
|
+
per_page: 250
|
|
252
|
+
})).hits ?? []).filter((hit) => require_batteries_vector_filters.evaluateFilter(plan.filter, this.#parseMeta(hit.document.metadata))).map((hit) => hit.document.id);
|
|
253
|
+
for (const id of targets) await deleteOne(id);
|
|
254
|
+
} else try {
|
|
255
|
+
await coll.delete({ filter_by: "id:!= " });
|
|
256
|
+
} catch {
|
|
257
|
+
const hits = (await coll.search({
|
|
258
|
+
q: "*",
|
|
259
|
+
query_by: "document",
|
|
260
|
+
per_page: 250
|
|
261
|
+
})).hits ?? [];
|
|
262
|
+
for (const hit of hits) await deleteOne(hit.document.id);
|
|
263
|
+
}
|
|
264
|
+
} catch (err) {
|
|
265
|
+
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_DELETE_FAILED([String(err)]);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
};
|
|
269
|
+
//#endregion
|
|
270
|
+
exports.TypesenseVectorStore = TypesenseVectorStore;
|
|
271
|
+
|
|
272
|
+
//# sourceMappingURL=typesense.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typesense.cjs","names":["#opts","#client","#ensure","#dims","#project","#parseMeta"],"sources":["../../../src/batteries/vector/typesense/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/typesense\n *\n * Typesense adapter. Each collection is a Typesense collection with a `float[]` vector field\n * (native `vector_query` KNN). Metadata is stored as a JSON string field and filtered with\n * the neutral filter tree's JS reference evaluator for exact cross-adapter parity (Typesense\n * filter_by requires per-field schema declaration, which the neutral metadata model doesn't\n * have). Document + id are plain fields.\n *\n * Driver: `typesense` (pure JS).\n */\n\nimport { evaluateFilter } from '../filters'\nimport { normalizeScore } from '../helpers'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { isInstanceOf } from '@nhtio/adk/guards'\nimport {\n E_VECTOR_STORE_DRIVER_UNAVAILABLE,\n E_VECTOR_STORE_CONNECTION_FAILED,\n E_VECTOR_STORE_COLLECTION_FAILED,\n E_VECTOR_STORE_UPSERT_FAILED,\n E_VECTOR_STORE_SEARCH_FAILED,\n E_VECTOR_STORE_DELETE_FAILED,\n E_VECTOR_STORE_DIMENSION_MISMATCH,\n E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n} from '../exceptions'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type {\n VectorMatch,\n VectorStoreCapabilities,\n BaseVectorStoreOptions,\n VectorMetadata,\n DistanceMetric,\n} from '../types'\n\nexport interface TypesenseVectorStoreOptions extends BaseVectorStoreOptions {\n connection?: {\n host?: string\n port?: number\n protocol?: string\n apiKey?: string\n url?: string\n }\n}\n\nconst getTypesense = async () => {\n try {\n const mod = await import('typesense')\n return (mod as any).default ?? mod\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['typesense'])\n }\n}\n\nexport class TypesenseVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: false,\n rawSql: false,\n builtInEncoding: false,\n // Typesense indexes writes synchronously (searchable on resolve). The option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n\n #client: any | null = null\n #dims: Map<string, number> = new Map()\n\n get #opts(): TypesenseVectorStoreOptions {\n return this.options as TypesenseVectorStoreOptions\n }\n\n static isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n\n async connect(): Promise<void> {\n if (this.#client) return\n const Typesense = await getTypesense()\n const c = this.#opts.connection || {}\n let node: any\n if (c.url) {\n const u = new URL(c.url)\n node = {\n host: u.hostname,\n port: Number(u.port) || (u.protocol === 'https:' ? 443 : 8108),\n protocol: u.protocol.replace(':', ''),\n }\n } else {\n node = { host: c.host ?? 'localhost', port: c.port ?? 8108, protocol: c.protocol ?? 'http' }\n }\n try {\n this.#client = new Typesense.Client({\n nodes: [node],\n apiKey: c.apiKey ?? 'xyz',\n connectionTimeoutSeconds: 5,\n })\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n\n async close(): Promise<void> {\n this.#client = null\n }\n\n async #ensure(): Promise<any> {\n if (!this.#client) await this.connect()\n return this.#client!\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n const client = await this.#ensure()\n this.#dims.set(spec.collection, spec.vector.dimensions)\n if (ifNotExists && (await this.hasCollection(spec.collection))) return\n try {\n await client.collections().create({\n name: spec.collection,\n fields: [\n { name: 'id', type: 'string' },\n { name: 'vec', type: 'float[]', num_dim: spec.vector.dimensions },\n { name: 'document', type: 'string', optional: true },\n { name: 'metadata', type: 'string', optional: true },\n ],\n })\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['createCollection', String(err)])\n }\n }\n\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n const client = await this.#ensure()\n if (ifExists && !(await this.hasCollection(collection))) return\n try {\n await client.collections(collection).delete()\n this.#dims.delete(collection)\n } catch (err) {\n const msg = String(err)\n if (ifExists && msg.includes('Not Found')) return\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', msg])\n }\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n const client = await this.#ensure()\n try {\n await client.collections(collection).retrieve()\n return true\n } catch {\n return false\n }\n }\n\n async renameCollection(_from: string, _to: string): Promise<void> {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'typesense'])\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const client = await this.#ensure()\n const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection)\n try {\n const docs: any[] = []\n for (const r of plan.records) {\n let vector = r.vector\n if (!vector && r.document) {\n const [v] = await this.encode([r.document], 'document')\n vector = v\n }\n if (!vector) {\n throw new E_VECTOR_STORE_UPSERT_FAILED(['Record missing vector and document'])\n }\n if (expected !== undefined && vector.length !== expected) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length])\n }\n docs.push({\n id: r.id,\n vec: vector,\n document: r.document ?? '',\n metadata: r.metadata ? JSON.stringify(r.metadata) : '{}',\n })\n }\n await client.collections(plan.collection).documents().import(docs, { action: 'upsert' })\n } catch (err) {\n if (\n isInstanceOf(err, 'E_VECTOR_STORE_DIMENSION_MISMATCH', E_VECTOR_STORE_DIMENSION_MISMATCH) ||\n isInstanceOf(err, 'E_VECTOR_STORE_UPSERT_FAILED', E_VECTOR_STORE_UPSERT_FAILED)\n ) {\n throw err\n }\n throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n }\n }\n\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n const client = await this.#ensure()\n const metric = this.#opts.metric ?? 'cosine'\n let queryVector: number[] | undefined\n if (plan.near) {\n if ('vector' in plan.near) {\n queryVector = plan.near.vector\n } else if ('serverText' in plan.near) {\n const [v] = await this.encode([plan.near.serverText], 'query')\n queryVector = v\n } else if ('id' in plan.near) {\n try {\n const doc = await client.collections(plan.collection).documents(plan.near.id).retrieve()\n queryVector = doc.vec as number[]\n } catch {\n queryVector = undefined\n }\n if (!queryVector) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n }\n }\n\n const offset = plan.offset ?? 0\n try {\n const coll = client.collections(plan.collection).documents()\n if (queryVector) {\n // Over-fetch then JS-filter for exact cross-adapter filter semantics.\n const k = Math.max(plan.topK + offset, plan.topK) + (plan.filter ? 250 : 0)\n const res = await coll.search({\n q: '*',\n vector_query: `vec:([${queryVector.join(',')}], k:${k})`,\n per_page: Math.min(250, k),\n })\n const hits = (res.hits ?? []) as any[]\n const mapped = hits.map((hit) => ({\n match: this.#project(hit.document, plan, metric, hit.vector_distance),\n meta: this.#parseMeta(hit.document.metadata),\n }))\n const filtered = plan.filter\n ? mapped.filter((m) => evaluateFilter(plan.filter!, m.meta))\n : mapped\n return filtered.slice(offset, offset + plan.topK).map((m) => m.match)\n } else {\n const res = await coll.search({ q: '*', query_by: 'document', per_page: 250 })\n const hits = (res.hits ?? []) as any[]\n const mapped = hits.map((hit) => ({\n match: this.#project(hit.document, plan, metric, undefined),\n meta: this.#parseMeta(hit.document.metadata),\n }))\n const filtered = plan.filter\n ? mapped.filter((m) => evaluateFilter(plan.filter!, m.meta))\n : mapped\n return filtered.slice(offset, offset + plan.topK).map((m) => m.match)\n }\n } catch (err) {\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\n }\n\n #parseMeta(val: unknown): VectorMetadata {\n if (typeof val === 'string') {\n try {\n return JSON.parse(val) as VectorMetadata\n } catch {\n return {}\n }\n }\n if (val && typeof val === 'object') return val as VectorMetadata\n return {}\n }\n\n #project(doc: any, plan: SearchPlan, metric: string, dist: number | undefined): VectorMatch {\n const proj = plan.projection\n const out: VectorMatch = {}\n if (proj.id) out.id = doc.id as string\n if (proj.vector && Array.isArray(doc.vec)) out.vector = doc.vec as number[]\n if (proj.document) out.document = (doc.document ?? undefined) as string | undefined\n if (proj.metadata) out.metadata = this.#parseMeta(doc.metadata)\n if (dist !== undefined && dist !== null) {\n out.score = normalizeScore(Number(dist), metric as DistanceMetric, 'distance')\n }\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const client = await this.#ensure()\n const collection = client.collections(plan.collection)\n const coll = collection.documents()\n // Delete a single document by id: documents(id).delete() (NOT documents().delete(id),\n // which targets the bulk filter endpoint).\n const deleteOne = async (id: string): Promise<void> => {\n await collection\n .documents(id)\n .delete()\n .catch(() => undefined)\n }\n try {\n if (plan.ids && plan.ids.length > 0) {\n for (const id of plan.ids) await deleteOne(id)\n } else if (plan.filter) {\n // Resolve ids via a scan + JS evaluator, then delete by id.\n const res = await coll.search({ q: '*', query_by: 'document', per_page: 250 })\n const hits = (res.hits ?? []) as any[]\n const targets = hits\n .filter((hit) => evaluateFilter(plan.filter!, this.#parseMeta(hit.document.metadata)))\n .map((hit) => hit.document.id as string)\n for (const id of targets) await deleteOne(id)\n } else {\n // Delete-all: bulk delete by an always-true filter; fall back to per-id on error.\n try {\n await coll.delete({ filter_by: 'id:!= ' })\n } catch {\n const res = await coll.search({ q: '*', query_by: 'document', per_page: 250 })\n const hits = (res.hits ?? []) as any[]\n for (const hit of hits) await deleteOne(hit.document.id as string)\n }\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import { s as isInstanceOf } from "../../tool_registry-D1pSSlsd.mjs";
|
|
2
|
+
import "../../guards.mjs";
|
|
3
|
+
import { evaluateFilter } from "./filters.mjs";
|
|
4
|
+
import { normalizeScore } from "./helpers.mjs";
|
|
5
|
+
import { E_VECTOR_STORE_COLLECTION_FAILED, E_VECTOR_STORE_CONNECTION_FAILED, E_VECTOR_STORE_DELETE_FAILED, E_VECTOR_STORE_DIMENSION_MISMATCH, E_VECTOR_STORE_DRIVER_UNAVAILABLE, E_VECTOR_STORE_SEARCH_FAILED, E_VECTOR_STORE_UNSUPPORTED_OPERATION, E_VECTOR_STORE_UPSERT_FAILED } from "./exceptions.mjs";
|
|
6
|
+
import { BaseVectorStore } from "./contract.mjs";
|
|
7
|
+
import { validateRecords } from "./validation.mjs";
|
|
8
|
+
//#region src/batteries/vector/typesense/index.ts
|
|
9
|
+
/**
|
|
10
|
+
* @module @nhtio/adk/batteries/vector/typesense
|
|
11
|
+
*
|
|
12
|
+
* Typesense adapter. Each collection is a Typesense collection with a `float[]` vector field
|
|
13
|
+
* (native `vector_query` KNN). Metadata is stored as a JSON string field and filtered with
|
|
14
|
+
* the neutral filter tree's JS reference evaluator for exact cross-adapter parity (Typesense
|
|
15
|
+
* filter_by requires per-field schema declaration, which the neutral metadata model doesn't
|
|
16
|
+
* have). Document + id are plain fields.
|
|
17
|
+
*
|
|
18
|
+
* Driver: `typesense` (pure JS).
|
|
19
|
+
*/
|
|
20
|
+
var getTypesense = async () => {
|
|
21
|
+
try {
|
|
22
|
+
const mod = await import("typesense");
|
|
23
|
+
return mod.default ?? mod;
|
|
24
|
+
} catch {
|
|
25
|
+
throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(["typesense"]);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
var TypesenseVectorStore = class extends BaseVectorStore {
|
|
29
|
+
capabilities = {
|
|
30
|
+
transactions: false,
|
|
31
|
+
namedVectors: false,
|
|
32
|
+
rename: false,
|
|
33
|
+
rawSql: false,
|
|
34
|
+
builtInEncoding: false,
|
|
35
|
+
consistency: {
|
|
36
|
+
configurable: false,
|
|
37
|
+
default: "strong",
|
|
38
|
+
modes: ["strong"]
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
#client = null;
|
|
42
|
+
#dims = /* @__PURE__ */ new Map();
|
|
43
|
+
get #opts() {
|
|
44
|
+
return this.options;
|
|
45
|
+
}
|
|
46
|
+
static isAvailable() {
|
|
47
|
+
return typeof process !== "undefined";
|
|
48
|
+
}
|
|
49
|
+
isAvailable() {
|
|
50
|
+
return typeof process !== "undefined";
|
|
51
|
+
}
|
|
52
|
+
async connect() {
|
|
53
|
+
if (this.#client) return;
|
|
54
|
+
const Typesense = await getTypesense();
|
|
55
|
+
const c = this.#opts.connection || {};
|
|
56
|
+
let node;
|
|
57
|
+
if (c.url) {
|
|
58
|
+
const u = new URL(c.url);
|
|
59
|
+
node = {
|
|
60
|
+
host: u.hostname,
|
|
61
|
+
port: Number(u.port) || (u.protocol === "https:" ? 443 : 8108),
|
|
62
|
+
protocol: u.protocol.replace(":", "")
|
|
63
|
+
};
|
|
64
|
+
} else node = {
|
|
65
|
+
host: c.host ?? "localhost",
|
|
66
|
+
port: c.port ?? 8108,
|
|
67
|
+
protocol: c.protocol ?? "http"
|
|
68
|
+
};
|
|
69
|
+
try {
|
|
70
|
+
this.#client = new Typesense.Client({
|
|
71
|
+
nodes: [node],
|
|
72
|
+
apiKey: c.apiKey ?? "xyz",
|
|
73
|
+
connectionTimeoutSeconds: 5
|
|
74
|
+
});
|
|
75
|
+
} catch (err) {
|
|
76
|
+
throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)]);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async close() {
|
|
80
|
+
this.#client = null;
|
|
81
|
+
}
|
|
82
|
+
async #ensure() {
|
|
83
|
+
if (!this.#client) await this.connect();
|
|
84
|
+
return this.#client;
|
|
85
|
+
}
|
|
86
|
+
async createCollection(spec, ifNotExists) {
|
|
87
|
+
const client = await this.#ensure();
|
|
88
|
+
this.#dims.set(spec.collection, spec.vector.dimensions);
|
|
89
|
+
if (ifNotExists && await this.hasCollection(spec.collection)) return;
|
|
90
|
+
try {
|
|
91
|
+
await client.collections().create({
|
|
92
|
+
name: spec.collection,
|
|
93
|
+
fields: [
|
|
94
|
+
{
|
|
95
|
+
name: "id",
|
|
96
|
+
type: "string"
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: "vec",
|
|
100
|
+
type: "float[]",
|
|
101
|
+
num_dim: spec.vector.dimensions
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
name: "document",
|
|
105
|
+
type: "string",
|
|
106
|
+
optional: true
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
name: "metadata",
|
|
110
|
+
type: "string",
|
|
111
|
+
optional: true
|
|
112
|
+
}
|
|
113
|
+
]
|
|
114
|
+
});
|
|
115
|
+
} catch (err) {
|
|
116
|
+
throw new E_VECTOR_STORE_COLLECTION_FAILED(["createCollection", String(err)]);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
async dropCollection(collection, ifExists) {
|
|
120
|
+
const client = await this.#ensure();
|
|
121
|
+
if (ifExists && !await this.hasCollection(collection)) return;
|
|
122
|
+
try {
|
|
123
|
+
await client.collections(collection).delete();
|
|
124
|
+
this.#dims.delete(collection);
|
|
125
|
+
} catch (err) {
|
|
126
|
+
const msg = String(err);
|
|
127
|
+
if (ifExists && msg.includes("Not Found")) return;
|
|
128
|
+
throw new E_VECTOR_STORE_COLLECTION_FAILED(["dropCollection", msg]);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
async hasCollection(collection) {
|
|
132
|
+
const client = await this.#ensure();
|
|
133
|
+
try {
|
|
134
|
+
await client.collections(collection).retrieve();
|
|
135
|
+
return true;
|
|
136
|
+
} catch {
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
async renameCollection(_from, _to) {
|
|
141
|
+
throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(["renameCollection", "typesense"]);
|
|
142
|
+
}
|
|
143
|
+
async executeUpsert(plan) {
|
|
144
|
+
if (plan.records.length === 0) return;
|
|
145
|
+
validateRecords(plan.records);
|
|
146
|
+
const client = await this.#ensure();
|
|
147
|
+
const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection);
|
|
148
|
+
try {
|
|
149
|
+
const docs = [];
|
|
150
|
+
for (const r of plan.records) {
|
|
151
|
+
let vector = r.vector;
|
|
152
|
+
if (!vector && r.document) {
|
|
153
|
+
const [v] = await this.encode([r.document], "document");
|
|
154
|
+
vector = v;
|
|
155
|
+
}
|
|
156
|
+
if (!vector) throw new E_VECTOR_STORE_UPSERT_FAILED(["Record missing vector and document"]);
|
|
157
|
+
if (expected !== void 0 && vector.length !== expected) throw new E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length]);
|
|
158
|
+
docs.push({
|
|
159
|
+
id: r.id,
|
|
160
|
+
vec: vector,
|
|
161
|
+
document: r.document ?? "",
|
|
162
|
+
metadata: r.metadata ? JSON.stringify(r.metadata) : "{}"
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
await client.collections(plan.collection).documents().import(docs, { action: "upsert" });
|
|
166
|
+
} catch (err) {
|
|
167
|
+
if (isInstanceOf(err, "E_VECTOR_STORE_DIMENSION_MISMATCH", E_VECTOR_STORE_DIMENSION_MISMATCH) || isInstanceOf(err, "E_VECTOR_STORE_UPSERT_FAILED", E_VECTOR_STORE_UPSERT_FAILED)) throw err;
|
|
168
|
+
throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)]);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
async executeSearch(plan) {
|
|
172
|
+
const client = await this.#ensure();
|
|
173
|
+
const metric = this.#opts.metric ?? "cosine";
|
|
174
|
+
let queryVector;
|
|
175
|
+
if (plan.near) {
|
|
176
|
+
if ("vector" in plan.near) queryVector = plan.near.vector;
|
|
177
|
+
else if ("serverText" in plan.near) {
|
|
178
|
+
const [v] = await this.encode([plan.near.serverText], "query");
|
|
179
|
+
queryVector = v;
|
|
180
|
+
} else if ("id" in plan.near) {
|
|
181
|
+
try {
|
|
182
|
+
queryVector = (await client.collections(plan.collection).documents(plan.near.id).retrieve()).vec;
|
|
183
|
+
} catch {
|
|
184
|
+
queryVector = void 0;
|
|
185
|
+
}
|
|
186
|
+
if (!queryVector) throw new E_VECTOR_STORE_SEARCH_FAILED(["Referenced id not found: " + plan.near.id]);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
const offset = plan.offset ?? 0;
|
|
190
|
+
try {
|
|
191
|
+
const coll = client.collections(plan.collection).documents();
|
|
192
|
+
if (queryVector) {
|
|
193
|
+
const k = Math.max(plan.topK + offset, plan.topK) + (plan.filter ? 250 : 0);
|
|
194
|
+
const mapped = ((await coll.search({
|
|
195
|
+
q: "*",
|
|
196
|
+
vector_query: `vec:([${queryVector.join(",")}], k:${k})`,
|
|
197
|
+
per_page: Math.min(250, k)
|
|
198
|
+
})).hits ?? []).map((hit) => ({
|
|
199
|
+
match: this.#project(hit.document, plan, metric, hit.vector_distance),
|
|
200
|
+
meta: this.#parseMeta(hit.document.metadata)
|
|
201
|
+
}));
|
|
202
|
+
return (plan.filter ? mapped.filter((m) => evaluateFilter(plan.filter, m.meta)) : mapped).slice(offset, offset + plan.topK).map((m) => m.match);
|
|
203
|
+
} else {
|
|
204
|
+
const mapped = ((await coll.search({
|
|
205
|
+
q: "*",
|
|
206
|
+
query_by: "document",
|
|
207
|
+
per_page: 250
|
|
208
|
+
})).hits ?? []).map((hit) => ({
|
|
209
|
+
match: this.#project(hit.document, plan, metric, void 0),
|
|
210
|
+
meta: this.#parseMeta(hit.document.metadata)
|
|
211
|
+
}));
|
|
212
|
+
return (plan.filter ? mapped.filter((m) => evaluateFilter(plan.filter, m.meta)) : mapped).slice(offset, offset + plan.topK).map((m) => m.match);
|
|
213
|
+
}
|
|
214
|
+
} catch (err) {
|
|
215
|
+
throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)]);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
#parseMeta(val) {
|
|
219
|
+
if (typeof val === "string") try {
|
|
220
|
+
return JSON.parse(val);
|
|
221
|
+
} catch {
|
|
222
|
+
return {};
|
|
223
|
+
}
|
|
224
|
+
if (val && typeof val === "object") return val;
|
|
225
|
+
return {};
|
|
226
|
+
}
|
|
227
|
+
#project(doc, plan, metric, dist) {
|
|
228
|
+
const proj = plan.projection;
|
|
229
|
+
const out = {};
|
|
230
|
+
if (proj.id) out.id = doc.id;
|
|
231
|
+
if (proj.vector && Array.isArray(doc.vec)) out.vector = doc.vec;
|
|
232
|
+
if (proj.document) out.document = doc.document ?? void 0;
|
|
233
|
+
if (proj.metadata) out.metadata = this.#parseMeta(doc.metadata);
|
|
234
|
+
if (dist !== void 0 && dist !== null) out.score = normalizeScore(Number(dist), metric, "distance");
|
|
235
|
+
return out;
|
|
236
|
+
}
|
|
237
|
+
async executeDelete(plan) {
|
|
238
|
+
const collection = (await this.#ensure()).collections(plan.collection);
|
|
239
|
+
const coll = collection.documents();
|
|
240
|
+
const deleteOne = async (id) => {
|
|
241
|
+
await collection.documents(id).delete().catch(() => void 0);
|
|
242
|
+
};
|
|
243
|
+
try {
|
|
244
|
+
if (plan.ids && plan.ids.length > 0) for (const id of plan.ids) await deleteOne(id);
|
|
245
|
+
else if (plan.filter) {
|
|
246
|
+
const targets = ((await coll.search({
|
|
247
|
+
q: "*",
|
|
248
|
+
query_by: "document",
|
|
249
|
+
per_page: 250
|
|
250
|
+
})).hits ?? []).filter((hit) => evaluateFilter(plan.filter, this.#parseMeta(hit.document.metadata))).map((hit) => hit.document.id);
|
|
251
|
+
for (const id of targets) await deleteOne(id);
|
|
252
|
+
} else try {
|
|
253
|
+
await coll.delete({ filter_by: "id:!= " });
|
|
254
|
+
} catch {
|
|
255
|
+
const hits = (await coll.search({
|
|
256
|
+
q: "*",
|
|
257
|
+
query_by: "document",
|
|
258
|
+
per_page: 250
|
|
259
|
+
})).hits ?? [];
|
|
260
|
+
for (const hit of hits) await deleteOne(hit.document.id);
|
|
261
|
+
}
|
|
262
|
+
} catch (err) {
|
|
263
|
+
throw new E_VECTOR_STORE_DELETE_FAILED([String(err)]);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
};
|
|
267
|
+
//#endregion
|
|
268
|
+
export { TypesenseVectorStore };
|
|
269
|
+
|
|
270
|
+
//# sourceMappingURL=typesense.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typesense.mjs","names":["#opts","#client","#ensure","#dims","#project","#parseMeta"],"sources":["../../../src/batteries/vector/typesense/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/typesense\n *\n * Typesense adapter. Each collection is a Typesense collection with a `float[]` vector field\n * (native `vector_query` KNN). Metadata is stored as a JSON string field and filtered with\n * the neutral filter tree's JS reference evaluator for exact cross-adapter parity (Typesense\n * filter_by requires per-field schema declaration, which the neutral metadata model doesn't\n * have). Document + id are plain fields.\n *\n * Driver: `typesense` (pure JS).\n */\n\nimport { evaluateFilter } from '../filters'\nimport { normalizeScore } from '../helpers'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { isInstanceOf } from '@nhtio/adk/guards'\nimport {\n E_VECTOR_STORE_DRIVER_UNAVAILABLE,\n E_VECTOR_STORE_CONNECTION_FAILED,\n E_VECTOR_STORE_COLLECTION_FAILED,\n E_VECTOR_STORE_UPSERT_FAILED,\n E_VECTOR_STORE_SEARCH_FAILED,\n E_VECTOR_STORE_DELETE_FAILED,\n E_VECTOR_STORE_DIMENSION_MISMATCH,\n E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n} from '../exceptions'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type {\n VectorMatch,\n VectorStoreCapabilities,\n BaseVectorStoreOptions,\n VectorMetadata,\n DistanceMetric,\n} from '../types'\n\nexport interface TypesenseVectorStoreOptions extends BaseVectorStoreOptions {\n connection?: {\n host?: string\n port?: number\n protocol?: string\n apiKey?: string\n url?: string\n }\n}\n\nconst getTypesense = async () => {\n try {\n const mod = await import('typesense')\n return (mod as any).default ?? mod\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['typesense'])\n }\n}\n\nexport class TypesenseVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: false,\n rawSql: false,\n builtInEncoding: false,\n // Typesense indexes writes synchronously (searchable on resolve). The option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n\n #client: any | null = null\n #dims: Map<string, number> = new Map()\n\n get #opts(): TypesenseVectorStoreOptions {\n return this.options as TypesenseVectorStoreOptions\n }\n\n static isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n\n async connect(): Promise<void> {\n if (this.#client) return\n const Typesense = await getTypesense()\n const c = this.#opts.connection || {}\n let node: any\n if (c.url) {\n const u = new URL(c.url)\n node = {\n host: u.hostname,\n port: Number(u.port) || (u.protocol === 'https:' ? 443 : 8108),\n protocol: u.protocol.replace(':', ''),\n }\n } else {\n node = { host: c.host ?? 'localhost', port: c.port ?? 8108, protocol: c.protocol ?? 'http' }\n }\n try {\n this.#client = new Typesense.Client({\n nodes: [node],\n apiKey: c.apiKey ?? 'xyz',\n connectionTimeoutSeconds: 5,\n })\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n\n async close(): Promise<void> {\n this.#client = null\n }\n\n async #ensure(): Promise<any> {\n if (!this.#client) await this.connect()\n return this.#client!\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n const client = await this.#ensure()\n this.#dims.set(spec.collection, spec.vector.dimensions)\n if (ifNotExists && (await this.hasCollection(spec.collection))) return\n try {\n await client.collections().create({\n name: spec.collection,\n fields: [\n { name: 'id', type: 'string' },\n { name: 'vec', type: 'float[]', num_dim: spec.vector.dimensions },\n { name: 'document', type: 'string', optional: true },\n { name: 'metadata', type: 'string', optional: true },\n ],\n })\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['createCollection', String(err)])\n }\n }\n\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n const client = await this.#ensure()\n if (ifExists && !(await this.hasCollection(collection))) return\n try {\n await client.collections(collection).delete()\n this.#dims.delete(collection)\n } catch (err) {\n const msg = String(err)\n if (ifExists && msg.includes('Not Found')) return\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', msg])\n }\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n const client = await this.#ensure()\n try {\n await client.collections(collection).retrieve()\n return true\n } catch {\n return false\n }\n }\n\n async renameCollection(_from: string, _to: string): Promise<void> {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'typesense'])\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const client = await this.#ensure()\n const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection)\n try {\n const docs: any[] = []\n for (const r of plan.records) {\n let vector = r.vector\n if (!vector && r.document) {\n const [v] = await this.encode([r.document], 'document')\n vector = v\n }\n if (!vector) {\n throw new E_VECTOR_STORE_UPSERT_FAILED(['Record missing vector and document'])\n }\n if (expected !== undefined && vector.length !== expected) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length])\n }\n docs.push({\n id: r.id,\n vec: vector,\n document: r.document ?? '',\n metadata: r.metadata ? JSON.stringify(r.metadata) : '{}',\n })\n }\n await client.collections(plan.collection).documents().import(docs, { action: 'upsert' })\n } catch (err) {\n if (\n isInstanceOf(err, 'E_VECTOR_STORE_DIMENSION_MISMATCH', E_VECTOR_STORE_DIMENSION_MISMATCH) ||\n isInstanceOf(err, 'E_VECTOR_STORE_UPSERT_FAILED', E_VECTOR_STORE_UPSERT_FAILED)\n ) {\n throw err\n }\n throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n }\n }\n\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n const client = await this.#ensure()\n const metric = this.#opts.metric ?? 'cosine'\n let queryVector: number[] | undefined\n if (plan.near) {\n if ('vector' in plan.near) {\n queryVector = plan.near.vector\n } else if ('serverText' in plan.near) {\n const [v] = await this.encode([plan.near.serverText], 'query')\n queryVector = v\n } else if ('id' in plan.near) {\n try {\n const doc = await client.collections(plan.collection).documents(plan.near.id).retrieve()\n queryVector = doc.vec as number[]\n } catch {\n queryVector = undefined\n }\n if (!queryVector) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n }\n }\n\n const offset = plan.offset ?? 0\n try {\n const coll = client.collections(plan.collection).documents()\n if (queryVector) {\n // Over-fetch then JS-filter for exact cross-adapter filter semantics.\n const k = Math.max(plan.topK + offset, plan.topK) + (plan.filter ? 250 : 0)\n const res = await coll.search({\n q: '*',\n vector_query: `vec:([${queryVector.join(',')}], k:${k})`,\n per_page: Math.min(250, k),\n })\n const hits = (res.hits ?? []) as any[]\n const mapped = hits.map((hit) => ({\n match: this.#project(hit.document, plan, metric, hit.vector_distance),\n meta: this.#parseMeta(hit.document.metadata),\n }))\n const filtered = plan.filter\n ? mapped.filter((m) => evaluateFilter(plan.filter!, m.meta))\n : mapped\n return filtered.slice(offset, offset + plan.topK).map((m) => m.match)\n } else {\n const res = await coll.search({ q: '*', query_by: 'document', per_page: 250 })\n const hits = (res.hits ?? []) as any[]\n const mapped = hits.map((hit) => ({\n match: this.#project(hit.document, plan, metric, undefined),\n meta: this.#parseMeta(hit.document.metadata),\n }))\n const filtered = plan.filter\n ? mapped.filter((m) => evaluateFilter(plan.filter!, m.meta))\n : mapped\n return filtered.slice(offset, offset + plan.topK).map((m) => m.match)\n }\n } catch (err) {\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\n }\n\n #parseMeta(val: unknown): VectorMetadata {\n if (typeof val === 'string') {\n try {\n return JSON.parse(val) as VectorMetadata\n } catch {\n return {}\n }\n }\n if (val && typeof val === 'object') return val as VectorMetadata\n return {}\n }\n\n #project(doc: any, plan: SearchPlan, metric: string, dist: number | undefined): VectorMatch {\n const proj = plan.projection\n const out: VectorMatch = {}\n if (proj.id) out.id = doc.id as string\n if (proj.vector && Array.isArray(doc.vec)) out.vector = doc.vec as number[]\n if (proj.document) out.document = (doc.document ?? undefined) as string | undefined\n if (proj.metadata) out.metadata = this.#parseMeta(doc.metadata)\n if (dist !== undefined && dist !== null) {\n out.score = normalizeScore(Number(dist), metric as DistanceMetric, 'distance')\n }\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const client = await this.#ensure()\n const collection = client.collections(plan.collection)\n const coll = collection.documents()\n // Delete a single document by id: documents(id).delete() (NOT documents().delete(id),\n // which targets the bulk filter endpoint).\n const deleteOne = async (id: string): Promise<void> => {\n await collection\n .documents(id)\n .delete()\n .catch(() => undefined)\n }\n try {\n if (plan.ids && plan.ids.length > 0) {\n for (const id of plan.ids) await deleteOne(id)\n } else if (plan.filter) {\n // Resolve ids via a scan + JS evaluator, then delete by id.\n const res = await coll.search({ q: '*', query_by: 'document', per_page: 250 })\n const hits = (res.hits ?? []) as any[]\n const targets = hits\n .filter((hit) => evaluateFilter(plan.filter!, this.#parseMeta(hit.document.metadata)))\n .map((hit) => hit.document.id as string)\n for (const id of targets) await deleteOne(id)\n } else {\n // Delete-all: bulk delete by an always-true filter; fall back to per-id on error.\n try {\n await coll.delete({ filter_by: 'id:!= ' })\n } catch {\n const res = await coll.search({ q: '*', query_by: 'document', per_page: 250 })\n const hits = (res.hits ?? []) as any[]\n for (const hit of hits) await deleteOne(hit.document.id as string)\n }\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n"],"mappings":"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"}
|