@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,107 @@
|
|
|
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
|
+
let _nhtio_validation = require("@nhtio/validation");
|
|
6
|
+
//#region src/batteries/vector/filters.ts
|
|
7
|
+
/**
|
|
8
|
+
* Filter types and evaluator for the vector battery.
|
|
9
|
+
*
|
|
10
|
+
* @module @nhtio/adk/batteries/vector/filters
|
|
11
|
+
*/
|
|
12
|
+
var raw = (sql, bindings = []) => ({
|
|
13
|
+
__raw: sql,
|
|
14
|
+
bindings
|
|
15
|
+
});
|
|
16
|
+
var isRawExpr = (v) => require_tool_registry.isObject(v) && typeof v.__raw === "string" && Array.isArray(v.bindings);
|
|
17
|
+
var isFilterCondition = (f) => typeof f.field === "string" && typeof f.op === "string";
|
|
18
|
+
var isRawFilter = (f) => typeof f.$dialect === "string";
|
|
19
|
+
var isFilterGroup = (f) => !isFilterCondition(f) && !isRawFilter(f);
|
|
20
|
+
var rawFilterSchema = _nhtio_validation.validator.object({
|
|
21
|
+
$dialect: _nhtio_validation.validator.string().required(),
|
|
22
|
+
$raw: _nhtio_validation.validator.alternatives(_nhtio_validation.validator.string(), _nhtio_validation.validator.any()).required(),
|
|
23
|
+
$bindings: _nhtio_validation.validator.array().items(_nhtio_validation.validator.any()).optional()
|
|
24
|
+
});
|
|
25
|
+
var filterConditionSchema = _nhtio_validation.validator.object({
|
|
26
|
+
field: _nhtio_validation.validator.string().required(),
|
|
27
|
+
op: _nhtio_validation.validator.string().valid("eq", "ne", "gt", "gte", "lt", "lte", "in", "nin", "exists", "contains").required(),
|
|
28
|
+
value: _nhtio_validation.validator.alternatives(_nhtio_validation.validator.any(), _nhtio_validation.validator.array().items(_nhtio_validation.validator.any())).optional()
|
|
29
|
+
});
|
|
30
|
+
var vectorFilterSchema = _nhtio_validation.validator.alternatives(filterConditionSchema, rawFilterSchema, _nhtio_validation.validator.object({
|
|
31
|
+
and: _nhtio_validation.validator.array().items(_nhtio_validation.validator.link("#vectorFilter")).optional(),
|
|
32
|
+
or: _nhtio_validation.validator.array().items(_nhtio_validation.validator.link("#vectorFilter")).optional(),
|
|
33
|
+
not: _nhtio_validation.validator.link("#vectorFilter").optional()
|
|
34
|
+
}).unknown(false)).id("vectorFilter");
|
|
35
|
+
var getField = (metadata, path) => {
|
|
36
|
+
const keys = path.split(".");
|
|
37
|
+
let current = metadata;
|
|
38
|
+
for (const key of keys) {
|
|
39
|
+
if (current === void 0 || current === null) return;
|
|
40
|
+
if (typeof current !== "object") return;
|
|
41
|
+
current = current[key];
|
|
42
|
+
}
|
|
43
|
+
return current;
|
|
44
|
+
};
|
|
45
|
+
var evaluateFilter = (filter, metadata) => {
|
|
46
|
+
if (isRawFilter(filter)) throw new Error("raw filters are not evaluable by the in-memory filter evaluator");
|
|
47
|
+
if (isFilterCondition(filter)) {
|
|
48
|
+
const { field, op, value } = filter;
|
|
49
|
+
const fieldVal = getField(metadata, field);
|
|
50
|
+
if (isRawExpr(value)) throw new Error("raw expressions are not evaluable by the in-memory filter evaluator");
|
|
51
|
+
switch (op) {
|
|
52
|
+
case "eq": return fieldVal === value;
|
|
53
|
+
case "ne": return fieldVal !== value;
|
|
54
|
+
case "gt":
|
|
55
|
+
if (fieldVal === void 0 || value === void 0) return false;
|
|
56
|
+
if (typeof fieldVal === "number" && typeof value === "number") return fieldVal > value;
|
|
57
|
+
if (typeof fieldVal === "string" && typeof value === "string") return fieldVal > value;
|
|
58
|
+
return false;
|
|
59
|
+
case "gte":
|
|
60
|
+
if (fieldVal === void 0 || value === void 0) return false;
|
|
61
|
+
if (typeof fieldVal === "number" && typeof value === "number") return fieldVal >= value;
|
|
62
|
+
if (typeof fieldVal === "string" && typeof value === "string") return fieldVal >= value;
|
|
63
|
+
return false;
|
|
64
|
+
case "lt":
|
|
65
|
+
if (fieldVal === void 0 || value === void 0) return false;
|
|
66
|
+
if (typeof fieldVal === "number" && typeof value === "number") return fieldVal < value;
|
|
67
|
+
if (typeof fieldVal === "string" && typeof value === "string") return fieldVal < value;
|
|
68
|
+
return false;
|
|
69
|
+
case "lte":
|
|
70
|
+
if (fieldVal === void 0 || value === void 0) return false;
|
|
71
|
+
if (typeof fieldVal === "number" && typeof value === "number") return fieldVal <= value;
|
|
72
|
+
if (typeof fieldVal === "string" && typeof value === "string") return fieldVal <= value;
|
|
73
|
+
return false;
|
|
74
|
+
case "in":
|
|
75
|
+
if (!Array.isArray(value)) return false;
|
|
76
|
+
return value.includes(fieldVal);
|
|
77
|
+
case "nin":
|
|
78
|
+
if (!Array.isArray(value)) return true;
|
|
79
|
+
return !value.includes(fieldVal);
|
|
80
|
+
case "exists": return value === void 0 || value === true ? fieldVal !== void 0 : fieldVal === void 0;
|
|
81
|
+
case "contains":
|
|
82
|
+
if (fieldVal === void 0) return false;
|
|
83
|
+
if (Array.isArray(fieldVal)) return fieldVal.includes(value);
|
|
84
|
+
if (typeof fieldVal === "string") return fieldVal.includes(String(value));
|
|
85
|
+
return false;
|
|
86
|
+
default: return false;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (isFilterGroup(filter)) {
|
|
90
|
+
const { and, or, not } = filter;
|
|
91
|
+
if (and !== void 0) return and.every((child) => evaluateFilter(child, metadata));
|
|
92
|
+
if (or !== void 0) return or.some((child) => evaluateFilter(child, metadata));
|
|
93
|
+
if (not !== void 0) return !evaluateFilter(not, metadata);
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
return false;
|
|
97
|
+
};
|
|
98
|
+
//#endregion
|
|
99
|
+
exports.evaluateFilter = evaluateFilter;
|
|
100
|
+
exports.isFilterCondition = isFilterCondition;
|
|
101
|
+
exports.isFilterGroup = isFilterGroup;
|
|
102
|
+
exports.isRawExpr = isRawExpr;
|
|
103
|
+
exports.isRawFilter = isRawFilter;
|
|
104
|
+
exports.raw = raw;
|
|
105
|
+
exports.vectorFilterSchema = vectorFilterSchema;
|
|
106
|
+
|
|
107
|
+
//# sourceMappingURL=filters.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filters.cjs","names":[],"sources":["../../../src/batteries/vector/filters.ts"],"sourcesContent":["/**\n * Filter types and evaluator for the vector battery.\n *\n * @module @nhtio/adk/batteries/vector/filters\n */\n\nimport { isObject } from '@nhtio/adk/guards'\nimport { validator } from '@nhtio/validation'\nimport type { VectorMetadata, VectorMetadataValue } from './types'\n\nexport type FilterOperator =\n | 'eq'\n | 'ne'\n | 'gt'\n | 'gte'\n | 'lt'\n | 'lte'\n | 'in'\n | 'nin'\n | 'exists'\n | 'contains'\n\nexport interface RawExpr {\n __raw: string\n bindings: unknown[]\n}\n\nexport const raw = (sql: string, bindings: unknown[] = []): RawExpr => ({ __raw: sql, bindings })\n\nexport const isRawExpr = (v: unknown): v is RawExpr =>\n isObject(v) && typeof v.__raw === 'string' && Array.isArray(v.bindings)\n\nexport interface FilterCondition {\n field: string\n op: FilterOperator\n value?: VectorMetadataValue | VectorMetadataValue[] | RawExpr\n}\nexport interface FilterGroup {\n and?: VectorFilter[]\n or?: VectorFilter[]\n not?: VectorFilter\n}\nexport interface RawFilter {\n $dialect: string\n $raw: string | unknown\n $bindings?: unknown[]\n}\nexport type VectorFilter = FilterCondition | FilterGroup | RawFilter\n\nexport const isFilterCondition = (f: VectorFilter): f is FilterCondition =>\n typeof (f as FilterCondition).field === 'string' && typeof (f as FilterCondition).op === 'string'\n\nexport const isRawFilter = (f: VectorFilter): f is RawFilter =>\n typeof (f as RawFilter).$dialect === 'string'\n\nexport const isFilterGroup = (f: VectorFilter): f is FilterGroup =>\n !isFilterCondition(f) && !isRawFilter(f)\n\nconst rawFilterSchema = validator.object<RawFilter>({\n $dialect: validator.string().required(),\n // eslint-disable-next-line adk/require-validator-any-required -- value type-arg: $raw is any structured dialect payload; disposition is set by the .required() on the alternatives\n $raw: validator.alternatives(validator.string(), validator.any()).required(),\n // eslint-disable-next-line adk/require-validator-any-required -- item type-arg: bindings hold arbitrary values; disposition is set by .optional() on the array\n $bindings: validator.array().items(validator.any()).optional(),\n})\n\nconst filterConditionSchema = validator.object<FilterCondition>({\n field: validator.string().required(),\n op: validator\n .string()\n .valid('eq', 'ne', 'gt', 'gte', 'lt', 'lte', 'in', 'nin', 'exists', 'contains')\n .required(),\n value: validator\n // eslint-disable-next-line adk/require-validator-any-required -- value type-arg: a filter value is any scalar or array of any; disposition is set by .optional() below\n .alternatives(validator.any(), validator.array().items(validator.any()))\n .optional(),\n})\n\nexport const vectorFilterSchema = validator\n .alternatives(\n filterConditionSchema,\n rawFilterSchema,\n validator\n .object<FilterGroup>({\n and: validator.array().items(validator.link('#vectorFilter')).optional(),\n or: validator.array().items(validator.link('#vectorFilter')).optional(),\n not: validator.link('#vectorFilter').optional(),\n })\n .unknown(false)\n )\n .id('vectorFilter')\n\nconst getField = (metadata: VectorMetadata, path: string): VectorMetadataValue | undefined => {\n const keys = path.split('.')\n let current: VectorMetadataValue | undefined = metadata\n for (const key of keys) {\n if (current === undefined || current === null) {\n return undefined\n }\n if (typeof current !== 'object') {\n return undefined\n }\n current = (current as Record<string, VectorMetadataValue>)[key]\n }\n return current\n}\n\nexport const evaluateFilter = (filter: VectorFilter, metadata: VectorMetadata): boolean => {\n if (isRawFilter(filter)) {\n throw new Error('raw filters are not evaluable by the in-memory filter evaluator')\n }\n\n if (isFilterCondition(filter)) {\n const { field, op, value } = filter\n const fieldVal = getField(metadata, field)\n\n if (isRawExpr(value)) {\n throw new Error('raw expressions are not evaluable by the in-memory filter evaluator')\n }\n\n switch (op) {\n case 'eq': {\n return fieldVal === value\n }\n\n case 'ne': {\n return fieldVal !== value\n }\n\n case 'gt': {\n if (fieldVal === undefined || value === undefined) {\n return false\n }\n if (typeof fieldVal === 'number' && typeof value === 'number') {\n return fieldVal > value\n }\n if (typeof fieldVal === 'string' && typeof value === 'string') {\n return fieldVal > value\n }\n return false\n }\n\n case 'gte': {\n if (fieldVal === undefined || value === undefined) {\n return false\n }\n if (typeof fieldVal === 'number' && typeof value === 'number') {\n return fieldVal >= value\n }\n if (typeof fieldVal === 'string' && typeof value === 'string') {\n return fieldVal >= value\n }\n return false\n }\n\n case 'lt': {\n if (fieldVal === undefined || value === undefined) {\n return false\n }\n if (typeof fieldVal === 'number' && typeof value === 'number') {\n return fieldVal < value\n }\n if (typeof fieldVal === 'string' && typeof value === 'string') {\n return fieldVal < value\n }\n return false\n }\n\n case 'lte': {\n if (fieldVal === undefined || value === undefined) {\n return false\n }\n if (typeof fieldVal === 'number' && typeof value === 'number') {\n return fieldVal <= value\n }\n if (typeof fieldVal === 'string' && typeof value === 'string') {\n return fieldVal <= value\n }\n return false\n }\n\n case 'in': {\n if (!Array.isArray(value)) {\n return false\n }\n return value.includes(fieldVal as never)\n }\n\n case 'nin': {\n if (!Array.isArray(value)) {\n return true\n }\n return !value.includes(fieldVal as never)\n }\n\n case 'exists': {\n const checkExists = value === undefined || value === true\n return checkExists ? fieldVal !== undefined : fieldVal === undefined\n }\n\n case 'contains': {\n if (fieldVal === undefined) {\n return false\n }\n if (Array.isArray(fieldVal)) {\n return fieldVal.includes(value as never)\n }\n if (typeof fieldVal === 'string') {\n return fieldVal.includes(String(value))\n }\n return false\n }\n\n default: {\n return false\n }\n }\n }\n\n if (isFilterGroup(filter)) {\n const { and, or, not } = filter\n\n if (and !== undefined) {\n return and.every((child) => evaluateFilter(child, metadata))\n }\n\n if (or !== undefined) {\n return or.some((child) => evaluateFilter(child, metadata))\n }\n\n if (not !== undefined) {\n return !evaluateFilter(not, metadata)\n }\n\n return true\n }\n\n return false\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filter types and evaluator for the vector battery.
|
|
3
|
+
*
|
|
4
|
+
* @module @nhtio/adk/batteries/vector/filters
|
|
5
|
+
*/
|
|
6
|
+
import type { VectorMetadata, VectorMetadataValue } from "./types";
|
|
7
|
+
export type FilterOperator = 'eq' | 'ne' | 'gt' | 'gte' | 'lt' | 'lte' | 'in' | 'nin' | 'exists' | 'contains';
|
|
8
|
+
export interface RawExpr {
|
|
9
|
+
__raw: string;
|
|
10
|
+
bindings: unknown[];
|
|
11
|
+
}
|
|
12
|
+
export declare const raw: (sql: string, bindings?: unknown[]) => RawExpr;
|
|
13
|
+
export declare const isRawExpr: (v: unknown) => v is RawExpr;
|
|
14
|
+
export interface FilterCondition {
|
|
15
|
+
field: string;
|
|
16
|
+
op: FilterOperator;
|
|
17
|
+
value?: VectorMetadataValue | VectorMetadataValue[] | RawExpr;
|
|
18
|
+
}
|
|
19
|
+
export interface FilterGroup {
|
|
20
|
+
and?: VectorFilter[];
|
|
21
|
+
or?: VectorFilter[];
|
|
22
|
+
not?: VectorFilter;
|
|
23
|
+
}
|
|
24
|
+
export interface RawFilter {
|
|
25
|
+
$dialect: string;
|
|
26
|
+
$raw: string | unknown;
|
|
27
|
+
$bindings?: unknown[];
|
|
28
|
+
}
|
|
29
|
+
export type VectorFilter = FilterCondition | FilterGroup | RawFilter;
|
|
30
|
+
export declare const isFilterCondition: (f: VectorFilter) => f is FilterCondition;
|
|
31
|
+
export declare const isRawFilter: (f: VectorFilter) => f is RawFilter;
|
|
32
|
+
export declare const isFilterGroup: (f: VectorFilter) => f is FilterGroup;
|
|
33
|
+
export declare const vectorFilterSchema: import("@nhtio/validation").AlternativesSchema<any>;
|
|
34
|
+
export declare const evaluateFilter: (filter: VectorFilter, metadata: VectorMetadata) => boolean;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { c as isObject } from "../../tool_registry-D1pSSlsd.mjs";
|
|
2
|
+
import "../../guards.mjs";
|
|
3
|
+
import { validator } from "@nhtio/validation";
|
|
4
|
+
//#region src/batteries/vector/filters.ts
|
|
5
|
+
/**
|
|
6
|
+
* Filter types and evaluator for the vector battery.
|
|
7
|
+
*
|
|
8
|
+
* @module @nhtio/adk/batteries/vector/filters
|
|
9
|
+
*/
|
|
10
|
+
var raw = (sql, bindings = []) => ({
|
|
11
|
+
__raw: sql,
|
|
12
|
+
bindings
|
|
13
|
+
});
|
|
14
|
+
var isRawExpr = (v) => isObject(v) && typeof v.__raw === "string" && Array.isArray(v.bindings);
|
|
15
|
+
var isFilterCondition = (f) => typeof f.field === "string" && typeof f.op === "string";
|
|
16
|
+
var isRawFilter = (f) => typeof f.$dialect === "string";
|
|
17
|
+
var isFilterGroup = (f) => !isFilterCondition(f) && !isRawFilter(f);
|
|
18
|
+
var rawFilterSchema = validator.object({
|
|
19
|
+
$dialect: validator.string().required(),
|
|
20
|
+
$raw: validator.alternatives(validator.string(), validator.any()).required(),
|
|
21
|
+
$bindings: validator.array().items(validator.any()).optional()
|
|
22
|
+
});
|
|
23
|
+
var filterConditionSchema = validator.object({
|
|
24
|
+
field: validator.string().required(),
|
|
25
|
+
op: validator.string().valid("eq", "ne", "gt", "gte", "lt", "lte", "in", "nin", "exists", "contains").required(),
|
|
26
|
+
value: validator.alternatives(validator.any(), validator.array().items(validator.any())).optional()
|
|
27
|
+
});
|
|
28
|
+
var vectorFilterSchema = validator.alternatives(filterConditionSchema, rawFilterSchema, validator.object({
|
|
29
|
+
and: validator.array().items(validator.link("#vectorFilter")).optional(),
|
|
30
|
+
or: validator.array().items(validator.link("#vectorFilter")).optional(),
|
|
31
|
+
not: validator.link("#vectorFilter").optional()
|
|
32
|
+
}).unknown(false)).id("vectorFilter");
|
|
33
|
+
var getField = (metadata, path) => {
|
|
34
|
+
const keys = path.split(".");
|
|
35
|
+
let current = metadata;
|
|
36
|
+
for (const key of keys) {
|
|
37
|
+
if (current === void 0 || current === null) return;
|
|
38
|
+
if (typeof current !== "object") return;
|
|
39
|
+
current = current[key];
|
|
40
|
+
}
|
|
41
|
+
return current;
|
|
42
|
+
};
|
|
43
|
+
var evaluateFilter = (filter, metadata) => {
|
|
44
|
+
if (isRawFilter(filter)) throw new Error("raw filters are not evaluable by the in-memory filter evaluator");
|
|
45
|
+
if (isFilterCondition(filter)) {
|
|
46
|
+
const { field, op, value } = filter;
|
|
47
|
+
const fieldVal = getField(metadata, field);
|
|
48
|
+
if (isRawExpr(value)) throw new Error("raw expressions are not evaluable by the in-memory filter evaluator");
|
|
49
|
+
switch (op) {
|
|
50
|
+
case "eq": return fieldVal === value;
|
|
51
|
+
case "ne": return fieldVal !== value;
|
|
52
|
+
case "gt":
|
|
53
|
+
if (fieldVal === void 0 || value === void 0) return false;
|
|
54
|
+
if (typeof fieldVal === "number" && typeof value === "number") return fieldVal > value;
|
|
55
|
+
if (typeof fieldVal === "string" && typeof value === "string") return fieldVal > value;
|
|
56
|
+
return false;
|
|
57
|
+
case "gte":
|
|
58
|
+
if (fieldVal === void 0 || value === void 0) return false;
|
|
59
|
+
if (typeof fieldVal === "number" && typeof value === "number") return fieldVal >= value;
|
|
60
|
+
if (typeof fieldVal === "string" && typeof value === "string") return fieldVal >= value;
|
|
61
|
+
return false;
|
|
62
|
+
case "lt":
|
|
63
|
+
if (fieldVal === void 0 || value === void 0) return false;
|
|
64
|
+
if (typeof fieldVal === "number" && typeof value === "number") return fieldVal < value;
|
|
65
|
+
if (typeof fieldVal === "string" && typeof value === "string") return fieldVal < value;
|
|
66
|
+
return false;
|
|
67
|
+
case "lte":
|
|
68
|
+
if (fieldVal === void 0 || value === void 0) return false;
|
|
69
|
+
if (typeof fieldVal === "number" && typeof value === "number") return fieldVal <= value;
|
|
70
|
+
if (typeof fieldVal === "string" && typeof value === "string") return fieldVal <= value;
|
|
71
|
+
return false;
|
|
72
|
+
case "in":
|
|
73
|
+
if (!Array.isArray(value)) return false;
|
|
74
|
+
return value.includes(fieldVal);
|
|
75
|
+
case "nin":
|
|
76
|
+
if (!Array.isArray(value)) return true;
|
|
77
|
+
return !value.includes(fieldVal);
|
|
78
|
+
case "exists": return value === void 0 || value === true ? fieldVal !== void 0 : fieldVal === void 0;
|
|
79
|
+
case "contains":
|
|
80
|
+
if (fieldVal === void 0) return false;
|
|
81
|
+
if (Array.isArray(fieldVal)) return fieldVal.includes(value);
|
|
82
|
+
if (typeof fieldVal === "string") return fieldVal.includes(String(value));
|
|
83
|
+
return false;
|
|
84
|
+
default: return false;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (isFilterGroup(filter)) {
|
|
88
|
+
const { and, or, not } = filter;
|
|
89
|
+
if (and !== void 0) return and.every((child) => evaluateFilter(child, metadata));
|
|
90
|
+
if (or !== void 0) return or.some((child) => evaluateFilter(child, metadata));
|
|
91
|
+
if (not !== void 0) return !evaluateFilter(not, metadata);
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
return false;
|
|
95
|
+
};
|
|
96
|
+
//#endregion
|
|
97
|
+
export { evaluateFilter, isFilterCondition, isFilterGroup, isRawExpr, isRawFilter, raw, vectorFilterSchema };
|
|
98
|
+
|
|
99
|
+
//# sourceMappingURL=filters.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filters.mjs","names":[],"sources":["../../../src/batteries/vector/filters.ts"],"sourcesContent":["/**\n * Filter types and evaluator for the vector battery.\n *\n * @module @nhtio/adk/batteries/vector/filters\n */\n\nimport { isObject } from '@nhtio/adk/guards'\nimport { validator } from '@nhtio/validation'\nimport type { VectorMetadata, VectorMetadataValue } from './types'\n\nexport type FilterOperator =\n | 'eq'\n | 'ne'\n | 'gt'\n | 'gte'\n | 'lt'\n | 'lte'\n | 'in'\n | 'nin'\n | 'exists'\n | 'contains'\n\nexport interface RawExpr {\n __raw: string\n bindings: unknown[]\n}\n\nexport const raw = (sql: string, bindings: unknown[] = []): RawExpr => ({ __raw: sql, bindings })\n\nexport const isRawExpr = (v: unknown): v is RawExpr =>\n isObject(v) && typeof v.__raw === 'string' && Array.isArray(v.bindings)\n\nexport interface FilterCondition {\n field: string\n op: FilterOperator\n value?: VectorMetadataValue | VectorMetadataValue[] | RawExpr\n}\nexport interface FilterGroup {\n and?: VectorFilter[]\n or?: VectorFilter[]\n not?: VectorFilter\n}\nexport interface RawFilter {\n $dialect: string\n $raw: string | unknown\n $bindings?: unknown[]\n}\nexport type VectorFilter = FilterCondition | FilterGroup | RawFilter\n\nexport const isFilterCondition = (f: VectorFilter): f is FilterCondition =>\n typeof (f as FilterCondition).field === 'string' && typeof (f as FilterCondition).op === 'string'\n\nexport const isRawFilter = (f: VectorFilter): f is RawFilter =>\n typeof (f as RawFilter).$dialect === 'string'\n\nexport const isFilterGroup = (f: VectorFilter): f is FilterGroup =>\n !isFilterCondition(f) && !isRawFilter(f)\n\nconst rawFilterSchema = validator.object<RawFilter>({\n $dialect: validator.string().required(),\n // eslint-disable-next-line adk/require-validator-any-required -- value type-arg: $raw is any structured dialect payload; disposition is set by the .required() on the alternatives\n $raw: validator.alternatives(validator.string(), validator.any()).required(),\n // eslint-disable-next-line adk/require-validator-any-required -- item type-arg: bindings hold arbitrary values; disposition is set by .optional() on the array\n $bindings: validator.array().items(validator.any()).optional(),\n})\n\nconst filterConditionSchema = validator.object<FilterCondition>({\n field: validator.string().required(),\n op: validator\n .string()\n .valid('eq', 'ne', 'gt', 'gte', 'lt', 'lte', 'in', 'nin', 'exists', 'contains')\n .required(),\n value: validator\n // eslint-disable-next-line adk/require-validator-any-required -- value type-arg: a filter value is any scalar or array of any; disposition is set by .optional() below\n .alternatives(validator.any(), validator.array().items(validator.any()))\n .optional(),\n})\n\nexport const vectorFilterSchema = validator\n .alternatives(\n filterConditionSchema,\n rawFilterSchema,\n validator\n .object<FilterGroup>({\n and: validator.array().items(validator.link('#vectorFilter')).optional(),\n or: validator.array().items(validator.link('#vectorFilter')).optional(),\n not: validator.link('#vectorFilter').optional(),\n })\n .unknown(false)\n )\n .id('vectorFilter')\n\nconst getField = (metadata: VectorMetadata, path: string): VectorMetadataValue | undefined => {\n const keys = path.split('.')\n let current: VectorMetadataValue | undefined = metadata\n for (const key of keys) {\n if (current === undefined || current === null) {\n return undefined\n }\n if (typeof current !== 'object') {\n return undefined\n }\n current = (current as Record<string, VectorMetadataValue>)[key]\n }\n return current\n}\n\nexport const evaluateFilter = (filter: VectorFilter, metadata: VectorMetadata): boolean => {\n if (isRawFilter(filter)) {\n throw new Error('raw filters are not evaluable by the in-memory filter evaluator')\n }\n\n if (isFilterCondition(filter)) {\n const { field, op, value } = filter\n const fieldVal = getField(metadata, field)\n\n if (isRawExpr(value)) {\n throw new Error('raw expressions are not evaluable by the in-memory filter evaluator')\n }\n\n switch (op) {\n case 'eq': {\n return fieldVal === value\n }\n\n case 'ne': {\n return fieldVal !== value\n }\n\n case 'gt': {\n if (fieldVal === undefined || value === undefined) {\n return false\n }\n if (typeof fieldVal === 'number' && typeof value === 'number') {\n return fieldVal > value\n }\n if (typeof fieldVal === 'string' && typeof value === 'string') {\n return fieldVal > value\n }\n return false\n }\n\n case 'gte': {\n if (fieldVal === undefined || value === undefined) {\n return false\n }\n if (typeof fieldVal === 'number' && typeof value === 'number') {\n return fieldVal >= value\n }\n if (typeof fieldVal === 'string' && typeof value === 'string') {\n return fieldVal >= value\n }\n return false\n }\n\n case 'lt': {\n if (fieldVal === undefined || value === undefined) {\n return false\n }\n if (typeof fieldVal === 'number' && typeof value === 'number') {\n return fieldVal < value\n }\n if (typeof fieldVal === 'string' && typeof value === 'string') {\n return fieldVal < value\n }\n return false\n }\n\n case 'lte': {\n if (fieldVal === undefined || value === undefined) {\n return false\n }\n if (typeof fieldVal === 'number' && typeof value === 'number') {\n return fieldVal <= value\n }\n if (typeof fieldVal === 'string' && typeof value === 'string') {\n return fieldVal <= value\n }\n return false\n }\n\n case 'in': {\n if (!Array.isArray(value)) {\n return false\n }\n return value.includes(fieldVal as never)\n }\n\n case 'nin': {\n if (!Array.isArray(value)) {\n return true\n }\n return !value.includes(fieldVal as never)\n }\n\n case 'exists': {\n const checkExists = value === undefined || value === true\n return checkExists ? fieldVal !== undefined : fieldVal === undefined\n }\n\n case 'contains': {\n if (fieldVal === undefined) {\n return false\n }\n if (Array.isArray(fieldVal)) {\n return fieldVal.includes(value as never)\n }\n if (typeof fieldVal === 'string') {\n return fieldVal.includes(String(value))\n }\n return false\n }\n\n default: {\n return false\n }\n }\n }\n\n if (isFilterGroup(filter)) {\n const { and, or, not } = filter\n\n if (and !== undefined) {\n return and.every((child) => evaluateFilter(child, metadata))\n }\n\n if (or !== undefined) {\n return or.some((child) => evaluateFilter(child, metadata))\n }\n\n if (not !== undefined) {\n return !evaluateFilter(not, metadata)\n }\n\n return true\n }\n\n return false\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
require("../../chunk-Ble4zEEl.js");
|
|
3
|
+
//#region src/batteries/vector/helpers.ts
|
|
4
|
+
var clamp01 = (n) => Math.min(1, Math.max(0, n));
|
|
5
|
+
var normalizeScore = (raw, metric, kind) => {
|
|
6
|
+
if (metric === "cosine") if (kind === "similarity") return clamp01((raw + 1) / 2);
|
|
7
|
+
else return clamp01((1 - raw + 1) / 2);
|
|
8
|
+
else if (metric === "dot") if (kind === "similarity") return clamp01(1 / (1 + Math.exp(-raw)));
|
|
9
|
+
else return clamp01(1 / (1 + Math.exp(raw)));
|
|
10
|
+
else if (metric === "euclidean") return clamp01(1 / (1 + Math.max(0, raw)));
|
|
11
|
+
else return clamp01(raw);
|
|
12
|
+
};
|
|
13
|
+
var mapMetric = (metric, map) => map[metric];
|
|
14
|
+
var dimensionsMatch = (vector, expected) => expected === void 0 ? true : vector.length === expected;
|
|
15
|
+
var isFiniteVector = (vector) => Array.isArray(vector) && vector.every((n) => typeof n === "number" && Number.isFinite(n));
|
|
16
|
+
//#endregion
|
|
17
|
+
exports.clamp01 = clamp01;
|
|
18
|
+
exports.dimensionsMatch = dimensionsMatch;
|
|
19
|
+
exports.isFiniteVector = isFiniteVector;
|
|
20
|
+
exports.mapMetric = mapMetric;
|
|
21
|
+
exports.normalizeScore = normalizeScore;
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=helpers.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.cjs","names":[],"sources":["../../../src/batteries/vector/helpers.ts"],"sourcesContent":["/**\n * Helper utilities for the vector storage provider battery.\n *\n * @module @nhtio/adk/batteries/vector/helpers\n */\n\nimport type { DistanceMetric } from './types'\n\nexport type ScoreKind = 'similarity' | 'distance'\n\nexport const clamp01 = (n: number): number => Math.min(1, Math.max(0, n))\n\nexport const normalizeScore = (raw: number, metric: DistanceMetric, kind: ScoreKind): number => {\n if (metric === 'cosine') {\n if (kind === 'similarity') {\n return clamp01((raw + 1) / 2)\n } else {\n const sim = 1 - raw\n return clamp01((sim + 1) / 2)\n }\n } else if (metric === 'dot') {\n if (kind === 'similarity') {\n return clamp01(1 / (1 + Math.exp(-raw)))\n } else {\n return clamp01(1 / (1 + Math.exp(raw)))\n }\n } else if (metric === 'euclidean') {\n const d = Math.max(0, raw)\n return clamp01(1 / (1 + d))\n } else {\n return clamp01(raw)\n }\n}\n\nexport const mapMetric = <T>(metric: DistanceMetric, map: Record<DistanceMetric, T>): T =>\n map[metric]\n\nexport const dimensionsMatch = (vector: number[], expected: number | undefined): boolean =>\n expected === undefined ? true : vector.length === expected\n\nexport const isFiniteVector = (vector: number[]): boolean =>\n Array.isArray(vector) && vector.every((n) => typeof n === 'number' && Number.isFinite(n))\n"],"mappings":";;;AAUA,IAAa,WAAW,MAAsB,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,CAAC,CAAC;AAExE,IAAa,kBAAkB,KAAa,QAAwB,SAA4B;CAC9F,IAAI,WAAW,UACb,IAAI,SAAS,cACX,OAAO,SAAS,MAAM,KAAK,CAAC;MAG5B,OAAO,SADK,IAAI,MACM,KAAK,CAAC;MAEzB,IAAI,WAAW,OACpB,IAAI,SAAS,cACX,OAAO,QAAQ,KAAK,IAAI,KAAK,IAAI,CAAC,GAAG,EAAE;MAEvC,OAAO,QAAQ,KAAK,IAAI,KAAK,IAAI,GAAG,EAAE;MAEnC,IAAI,WAAW,aAEpB,OAAO,QAAQ,KAAK,IADV,KAAK,IAAI,GAAG,GACE,EAAE;MAE1B,OAAO,QAAQ,GAAG;AAEtB;AAEA,IAAa,aAAgB,QAAwB,QACnD,IAAI;AAEN,IAAa,mBAAmB,QAAkB,aAChD,aAAa,KAAA,IAAY,OAAO,OAAO,WAAW;AAEpD,IAAa,kBAAkB,WAC7B,MAAM,QAAQ,MAAM,KAAK,OAAO,OAAO,MAAM,OAAO,MAAM,YAAY,OAAO,SAAS,CAAC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helper utilities for the vector storage provider battery.
|
|
3
|
+
*
|
|
4
|
+
* @module @nhtio/adk/batteries/vector/helpers
|
|
5
|
+
*/
|
|
6
|
+
import type { DistanceMetric } from "./types";
|
|
7
|
+
export type ScoreKind = 'similarity' | 'distance';
|
|
8
|
+
export declare const clamp01: (n: number) => number;
|
|
9
|
+
export declare const normalizeScore: (raw: number, metric: DistanceMetric, kind: ScoreKind) => number;
|
|
10
|
+
export declare const mapMetric: <T>(metric: DistanceMetric, map: Record<DistanceMetric, T>) => T;
|
|
11
|
+
export declare const dimensionsMatch: (vector: number[], expected: number | undefined) => boolean;
|
|
12
|
+
export declare const isFiniteVector: (vector: number[]) => boolean;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
//#region src/batteries/vector/helpers.ts
|
|
2
|
+
var clamp01 = (n) => Math.min(1, Math.max(0, n));
|
|
3
|
+
var normalizeScore = (raw, metric, kind) => {
|
|
4
|
+
if (metric === "cosine") if (kind === "similarity") return clamp01((raw + 1) / 2);
|
|
5
|
+
else return clamp01((1 - raw + 1) / 2);
|
|
6
|
+
else if (metric === "dot") if (kind === "similarity") return clamp01(1 / (1 + Math.exp(-raw)));
|
|
7
|
+
else return clamp01(1 / (1 + Math.exp(raw)));
|
|
8
|
+
else if (metric === "euclidean") return clamp01(1 / (1 + Math.max(0, raw)));
|
|
9
|
+
else return clamp01(raw);
|
|
10
|
+
};
|
|
11
|
+
var mapMetric = (metric, map) => map[metric];
|
|
12
|
+
var dimensionsMatch = (vector, expected) => expected === void 0 ? true : vector.length === expected;
|
|
13
|
+
var isFiniteVector = (vector) => Array.isArray(vector) && vector.every((n) => typeof n === "number" && Number.isFinite(n));
|
|
14
|
+
//#endregion
|
|
15
|
+
export { clamp01, dimensionsMatch, isFiniteVector, mapMetric, normalizeScore };
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=helpers.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.mjs","names":[],"sources":["../../../src/batteries/vector/helpers.ts"],"sourcesContent":["/**\n * Helper utilities for the vector storage provider battery.\n *\n * @module @nhtio/adk/batteries/vector/helpers\n */\n\nimport type { DistanceMetric } from './types'\n\nexport type ScoreKind = 'similarity' | 'distance'\n\nexport const clamp01 = (n: number): number => Math.min(1, Math.max(0, n))\n\nexport const normalizeScore = (raw: number, metric: DistanceMetric, kind: ScoreKind): number => {\n if (metric === 'cosine') {\n if (kind === 'similarity') {\n return clamp01((raw + 1) / 2)\n } else {\n const sim = 1 - raw\n return clamp01((sim + 1) / 2)\n }\n } else if (metric === 'dot') {\n if (kind === 'similarity') {\n return clamp01(1 / (1 + Math.exp(-raw)))\n } else {\n return clamp01(1 / (1 + Math.exp(raw)))\n }\n } else if (metric === 'euclidean') {\n const d = Math.max(0, raw)\n return clamp01(1 / (1 + d))\n } else {\n return clamp01(raw)\n }\n}\n\nexport const mapMetric = <T>(metric: DistanceMetric, map: Record<DistanceMetric, T>): T =>\n map[metric]\n\nexport const dimensionsMatch = (vector: number[], expected: number | undefined): boolean =>\n expected === undefined ? true : vector.length === expected\n\nexport const isFiniteVector = (vector: number[]): boolean =>\n Array.isArray(vector) && vector.every((n) => typeof n === 'number' && Number.isFinite(n))\n"],"mappings":";AAUA,IAAa,WAAW,MAAsB,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,CAAC,CAAC;AAExE,IAAa,kBAAkB,KAAa,QAAwB,SAA4B;CAC9F,IAAI,WAAW,UACb,IAAI,SAAS,cACX,OAAO,SAAS,MAAM,KAAK,CAAC;MAG5B,OAAO,SADK,IAAI,MACM,KAAK,CAAC;MAEzB,IAAI,WAAW,OACpB,IAAI,SAAS,cACX,OAAO,QAAQ,KAAK,IAAI,KAAK,IAAI,CAAC,GAAG,EAAE;MAEvC,OAAO,QAAQ,KAAK,IAAI,KAAK,IAAI,GAAG,EAAE;MAEnC,IAAI,WAAW,aAEpB,OAAO,QAAQ,KAAK,IADV,KAAK,IAAI,GAAG,GACE,EAAE;MAE1B,OAAO,QAAQ,GAAG;AAEtB;AAEA,IAAa,aAAgB,QAAwB,QACnD,IAAI;AAEN,IAAa,mBAAmB,QAAkB,aAChD,aAAa,KAAA,IAAY,OAAO,OAAO,WAAW;AAEpD,IAAa,kBAAkB,WAC7B,MAAM,QAAQ,MAAM,KAAK,OAAO,OAAO,MAAM,OAAO,MAAM,YAAY,OAAO,SAAS,CAAC,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module @nhtio/adk/batteries/vector/hnswlib
|
|
3
|
+
*
|
|
4
|
+
* Embedded HNSWLib adapter (in-process, no server — like in_memory/sqlite_vec/duckdb). hnswlib is
|
|
5
|
+
* a pure ANN index keyed by integer labels and holding ONLY vectors, so this adapter pairs the
|
|
6
|
+
* index with a JS sidecar that owns id↔label mapping plus the document/metadata records. KNN runs
|
|
7
|
+
* through the HNSW index; metadata filtering, filter-scans, projection and delete are served from
|
|
8
|
+
* the sidecar via the neutral filter tree's JS reference evaluator (exact cross-adapter parity).
|
|
9
|
+
*
|
|
10
|
+
* Driver: `hnswlib-node` (native addon; requires the build to be approved — see
|
|
11
|
+
* pnpm-workspace.yaml `allowBuilds`). Persistence is in-memory per process; pass a fresh store per
|
|
12
|
+
* use. (The index supports writeIndex/readIndex on disk, but the sidecar would need its own
|
|
13
|
+
* persistence — out of scope for the in-memory contract here.)
|
|
14
|
+
*/
|
|
15
|
+
import { BaseVectorStore } from "../contract";
|
|
16
|
+
import type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from "../plan";
|
|
17
|
+
import type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from "../types";
|
|
18
|
+
export interface HnswlibVectorStoreOptions extends BaseVectorStoreOptions {
|
|
19
|
+
initialCapacity?: number;
|
|
20
|
+
}
|
|
21
|
+
export declare class HnswlibVectorStore extends BaseVectorStore {
|
|
22
|
+
#private;
|
|
23
|
+
readonly capabilities: VectorStoreCapabilities;
|
|
24
|
+
static isAvailable(): boolean;
|
|
25
|
+
isAvailable(): boolean;
|
|
26
|
+
connect(): Promise<void>;
|
|
27
|
+
close(): Promise<void>;
|
|
28
|
+
createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void>;
|
|
29
|
+
dropCollection(collection: string, ifExists: boolean): Promise<void>;
|
|
30
|
+
hasCollection(collection: string): Promise<boolean>;
|
|
31
|
+
renameCollection(from: string, to: string): Promise<void>;
|
|
32
|
+
executeUpsert(plan: UpsertPlan): Promise<void>;
|
|
33
|
+
executeSearch(plan: SearchPlan): Promise<VectorMatch[]>;
|
|
34
|
+
executeDelete(plan: DeletePlan): Promise<void>;
|
|
35
|
+
}
|
|
@@ -0,0 +1,237 @@
|
|
|
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/hnswlib/index.ts
|
|
11
|
+
/**
|
|
12
|
+
* @module @nhtio/adk/batteries/vector/hnswlib
|
|
13
|
+
*
|
|
14
|
+
* Embedded HNSWLib adapter (in-process, no server — like in_memory/sqlite_vec/duckdb). hnswlib is
|
|
15
|
+
* a pure ANN index keyed by integer labels and holding ONLY vectors, so this adapter pairs the
|
|
16
|
+
* index with a JS sidecar that owns id↔label mapping plus the document/metadata records. KNN runs
|
|
17
|
+
* through the HNSW index; metadata filtering, filter-scans, projection and delete are served from
|
|
18
|
+
* the sidecar via the neutral filter tree's JS reference evaluator (exact cross-adapter parity).
|
|
19
|
+
*
|
|
20
|
+
* Driver: `hnswlib-node` (native addon; requires the build to be approved — see
|
|
21
|
+
* pnpm-workspace.yaml `allowBuilds`). Persistence is in-memory per process; pass a fresh store per
|
|
22
|
+
* use. (The index supports writeIndex/readIndex on disk, but the sidecar would need its own
|
|
23
|
+
* persistence — out of scope for the in-memory contract here.)
|
|
24
|
+
*/
|
|
25
|
+
var getHnswlib = async () => {
|
|
26
|
+
try {
|
|
27
|
+
const mod = await import("hnswlib-node");
|
|
28
|
+
return mod.default ?? mod;
|
|
29
|
+
} catch {
|
|
30
|
+
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_DRIVER_UNAVAILABLE(["hnswlib-node"]);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
var spaceFor = (metric) => metric === "euclidean" ? "l2" : metric === "dot" ? "ip" : "cosine";
|
|
34
|
+
var HnswlibVectorStore = class extends require_batteries_vector_contract.BaseVectorStore {
|
|
35
|
+
capabilities = {
|
|
36
|
+
transactions: false,
|
|
37
|
+
namedVectors: false,
|
|
38
|
+
rename: true,
|
|
39
|
+
rawSql: false,
|
|
40
|
+
builtInEncoding: false,
|
|
41
|
+
consistency: {
|
|
42
|
+
configurable: false,
|
|
43
|
+
default: "strong",
|
|
44
|
+
modes: ["strong"]
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
#lib = null;
|
|
48
|
+
#collections = /* @__PURE__ */ new Map();
|
|
49
|
+
get #opts() {
|
|
50
|
+
return this.options;
|
|
51
|
+
}
|
|
52
|
+
static isAvailable() {
|
|
53
|
+
return typeof process !== "undefined";
|
|
54
|
+
}
|
|
55
|
+
isAvailable() {
|
|
56
|
+
return typeof process !== "undefined";
|
|
57
|
+
}
|
|
58
|
+
async connect() {
|
|
59
|
+
if (this.#lib) return;
|
|
60
|
+
this.#lib = await getHnswlib();
|
|
61
|
+
}
|
|
62
|
+
async close() {
|
|
63
|
+
this.#collections.clear();
|
|
64
|
+
this.#lib = null;
|
|
65
|
+
}
|
|
66
|
+
async #ensureLib() {
|
|
67
|
+
if (!this.#lib) await this.connect();
|
|
68
|
+
return this.#lib;
|
|
69
|
+
}
|
|
70
|
+
#coll(collection) {
|
|
71
|
+
const c = this.#collections.get(collection);
|
|
72
|
+
if (!c) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_COLLECTION_FAILED(["collection", "unknown collection: " + collection]);
|
|
73
|
+
return c;
|
|
74
|
+
}
|
|
75
|
+
async createCollection(spec, ifNotExists) {
|
|
76
|
+
const lib = await this.#ensureLib();
|
|
77
|
+
if (this.#collections.has(spec.collection)) {
|
|
78
|
+
if (ifNotExists) return;
|
|
79
|
+
this.#collections.delete(spec.collection);
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
const capacity = this.#opts.initialCapacity ?? 1024;
|
|
83
|
+
const index = new lib.HierarchicalNSW(spaceFor(spec.vector.metric), spec.vector.dimensions);
|
|
84
|
+
index.initIndex(capacity);
|
|
85
|
+
this.#collections.set(spec.collection, {
|
|
86
|
+
index,
|
|
87
|
+
dims: spec.vector.dimensions,
|
|
88
|
+
metric: spec.vector.metric,
|
|
89
|
+
byId: /* @__PURE__ */ new Map(),
|
|
90
|
+
idByLabel: /* @__PURE__ */ new Map(),
|
|
91
|
+
nextLabel: 0,
|
|
92
|
+
capacity
|
|
93
|
+
});
|
|
94
|
+
} catch (err) {
|
|
95
|
+
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_COLLECTION_FAILED(["createCollection", String(err)]);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async dropCollection(collection, ifExists) {
|
|
99
|
+
if (!this.#collections.has(collection)) {
|
|
100
|
+
if (ifExists) return;
|
|
101
|
+
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_COLLECTION_FAILED(["dropCollection", "unknown collection"]);
|
|
102
|
+
}
|
|
103
|
+
this.#collections.delete(collection);
|
|
104
|
+
}
|
|
105
|
+
async hasCollection(collection) {
|
|
106
|
+
return this.#collections.has(collection);
|
|
107
|
+
}
|
|
108
|
+
async renameCollection(from, to) {
|
|
109
|
+
const c = this.#collections.get(from);
|
|
110
|
+
if (!c) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_UNSUPPORTED_OPERATION(["renameCollection", "unknown: " + from]);
|
|
111
|
+
this.#collections.set(to, c);
|
|
112
|
+
this.#collections.delete(from);
|
|
113
|
+
}
|
|
114
|
+
#ensureCapacity(c, additional) {
|
|
115
|
+
const needed = c.byId.size + additional;
|
|
116
|
+
if (needed > c.capacity) {
|
|
117
|
+
const next = Math.max(needed, c.capacity * 2);
|
|
118
|
+
c.index.resizeIndex(next);
|
|
119
|
+
c.capacity = next;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
async executeUpsert(plan) {
|
|
123
|
+
if (plan.records.length === 0) return;
|
|
124
|
+
require_batteries_vector_validation.validateRecords(plan.records);
|
|
125
|
+
await this.#ensureLib();
|
|
126
|
+
const c = this.#coll(plan.collection);
|
|
127
|
+
const expected = this.#opts.dimensions ?? c.dims;
|
|
128
|
+
try {
|
|
129
|
+
this.#ensureCapacity(c, plan.records.length);
|
|
130
|
+
for (const r of plan.records) {
|
|
131
|
+
let vector = r.vector;
|
|
132
|
+
if (!vector && r.document) {
|
|
133
|
+
const [v] = await this.encode([r.document], "document");
|
|
134
|
+
vector = v;
|
|
135
|
+
}
|
|
136
|
+
if (!vector) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_UPSERT_FAILED(["Record missing vector and document"]);
|
|
137
|
+
if (expected !== void 0 && vector.length !== expected) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length]);
|
|
138
|
+
const existing = c.byId.get(r.id);
|
|
139
|
+
if (existing) try {
|
|
140
|
+
c.index.markDelete(existing.label);
|
|
141
|
+
} catch {}
|
|
142
|
+
this.#ensureCapacity(c, 1);
|
|
143
|
+
const label = c.nextLabel++;
|
|
144
|
+
c.index.addPoint(vector, label);
|
|
145
|
+
c.idByLabel.set(label, r.id);
|
|
146
|
+
c.byId.set(r.id, {
|
|
147
|
+
id: r.id,
|
|
148
|
+
label,
|
|
149
|
+
vector,
|
|
150
|
+
document: r.document,
|
|
151
|
+
metadata: r.metadata
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
} catch (err) {
|
|
155
|
+
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;
|
|
156
|
+
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_UPSERT_FAILED([String(err)]);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
async executeSearch(plan) {
|
|
160
|
+
await this.#ensureLib();
|
|
161
|
+
const c = this.#coll(plan.collection);
|
|
162
|
+
const metric = this.#opts.metric ?? c.metric;
|
|
163
|
+
let queryVector;
|
|
164
|
+
if (plan.near) {
|
|
165
|
+
if ("vector" in plan.near) queryVector = plan.near.vector;
|
|
166
|
+
else if ("serverText" in plan.near) {
|
|
167
|
+
const [v] = await this.encode([plan.near.serverText], "query");
|
|
168
|
+
queryVector = v;
|
|
169
|
+
} else if ("id" in plan.near) {
|
|
170
|
+
const rec = c.byId.get(plan.near.id);
|
|
171
|
+
if (!rec) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_SEARCH_FAILED(["Referenced id not found: " + plan.near.id]);
|
|
172
|
+
queryVector = rec.vector;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
const offset = plan.offset ?? 0;
|
|
176
|
+
try {
|
|
177
|
+
if (queryVector) {
|
|
178
|
+
const live = c.byId.size;
|
|
179
|
+
if (live === 0) return [];
|
|
180
|
+
const want = plan.filter ? live : Math.min(plan.topK + offset, live);
|
|
181
|
+
const k = Math.min(Math.max(want, 1), live);
|
|
182
|
+
const res = c.index.searchKnn(queryVector, k);
|
|
183
|
+
const hits = [];
|
|
184
|
+
for (let i = 0; i < res.neighbors.length; i++) {
|
|
185
|
+
const id = c.idByLabel.get(res.neighbors[i]);
|
|
186
|
+
if (id === void 0) continue;
|
|
187
|
+
const rec = c.byId.get(id);
|
|
188
|
+
if (rec) hits.push({
|
|
189
|
+
rec,
|
|
190
|
+
dist: res.distances[i]
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
return (plan.filter ? hits.filter((h) => require_batteries_vector_filters.evaluateFilter(plan.filter, h.rec.metadata ?? {})) : hits).slice(offset, offset + plan.topK).map((h) => this.#project(h.rec, plan, metric, h.dist));
|
|
194
|
+
} else {
|
|
195
|
+
const rows = [...c.byId.values()];
|
|
196
|
+
return (plan.filter ? rows.filter((rec) => require_batteries_vector_filters.evaluateFilter(plan.filter, rec.metadata ?? {})) : rows).slice(offset, offset + plan.topK).map((rec) => this.#project(rec, plan, metric, void 0));
|
|
197
|
+
}
|
|
198
|
+
} catch (err) {
|
|
199
|
+
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_SEARCH_FAILED([String(err)]);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
#project(rec, plan, metric, dist) {
|
|
203
|
+
const proj = plan.projection;
|
|
204
|
+
const out = {};
|
|
205
|
+
if (proj.id) out.id = rec.id;
|
|
206
|
+
if (proj.vector) out.vector = rec.vector.slice();
|
|
207
|
+
if (proj.document) out.document = rec.document;
|
|
208
|
+
if (proj.metadata) out.metadata = rec.metadata ?? {};
|
|
209
|
+
if (dist !== void 0) out.score = require_batteries_vector_helpers.normalizeScore(dist, metric, "distance");
|
|
210
|
+
return out;
|
|
211
|
+
}
|
|
212
|
+
async executeDelete(plan) {
|
|
213
|
+
await this.#ensureLib();
|
|
214
|
+
const c = this.#coll(plan.collection);
|
|
215
|
+
try {
|
|
216
|
+
let targets;
|
|
217
|
+
if (plan.ids && plan.ids.length > 0) targets = plan.ids;
|
|
218
|
+
else if (plan.filter) targets = [...c.byId.values()].filter((rec) => require_batteries_vector_filters.evaluateFilter(plan.filter, rec.metadata ?? {})).map((rec) => rec.id);
|
|
219
|
+
else targets = [...c.byId.keys()];
|
|
220
|
+
for (const id of targets) {
|
|
221
|
+
const rec = c.byId.get(id);
|
|
222
|
+
if (!rec) continue;
|
|
223
|
+
try {
|
|
224
|
+
c.index.markDelete(rec.label);
|
|
225
|
+
} catch {}
|
|
226
|
+
c.idByLabel.delete(rec.label);
|
|
227
|
+
c.byId.delete(id);
|
|
228
|
+
}
|
|
229
|
+
} catch (err) {
|
|
230
|
+
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_DELETE_FAILED([String(err)]);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
//#endregion
|
|
235
|
+
exports.HnswlibVectorStore = HnswlibVectorStore;
|
|
236
|
+
|
|
237
|
+
//# sourceMappingURL=hnswlib.cjs.map
|