{"_id":"@adhd/sox-hybrid-search","_rev":"23-2f571333ac8c019ffe8abeb245742d4b","name":"@adhd/sox-hybrid-search","dist-tags":{"latest":"0.6.0"},"versions":{"0.2.0":{"name":"@adhd/sox-hybrid-search","version":"0.2.0","license":"MIT","_id":"@adhd/sox-hybrid-search@0.2.0","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"sox":{"area":"data","group":"search","concerns":["SearchBackend interface (mechanism-agnostic: textScore / vecScore, not BM25 / cosine)","SqliteSearchBackend — DI constructor (VectorBackend, GraphBackend)","hybrid fusion: normalize-before-combine (min_max / L2 / z_score)","degrade-to-text when vec signal absent ([def:degrade-to-text-only])","pure fuse() + normalize() exports (no storage dep)","explain mode (signal-level breakdown only — not field-level)","SchemaAdapter is SQLite-internal (NOT exported — filters wired into SqliteSearchBackend)","vector-channel filter parity (BL-294) — SqliteSearchBackend resolves query.filters through graph.queryNodes() and constrains vec.knn() to the matching id set, so namespace/kind/topic/projectPath/agentId filters scope BOTH channels identically, not just the text channel","degrade signal (BL-294) — SearchBackend.search() results carry an additive degraded?: { unsupportedFilters: string[] } field whenever query.filters included a key with no NodeFilter mapping; surfaced unconditionally on SearchResult, not gated behind explain"],"invariants":["SearchBackend.search() degrades to text-only when query.vec is absent, degrades to vec-only when query.text is absent — never errors on a missing signal","scores are normalized BEFORE combining (never raw scale-blind additive merge)","textScore / vecScore are mechanism-agnostic names — BM25 / cosine are implementation details inside backends (never surfaced through SearchBackend interface)","SchemaAdapter is an internal SQLite concern — NOT exported; MCP handlers pass raw filters via SearchQuery.filters; SqliteSearchBackend resolves them internally","fuse() weights must be multiplicative (field boosting), never additive (scale-blind)","a NodeFilter that matches zero nodes yields zero vector candidates — never an unfiltered knn() fallback (an empty VecFilter.ids means \"no filter\" to the vector backend, not \"match nothing\")"],"entrypoints":["dist/index.js"]},"dist":{"shasum":"b243cf76d47f7d1b0967abc956e9eddbe1a8646f","tarball":"https://registry.npmjs.org/@adhd/sox-hybrid-search/-/sox-hybrid-search-0.2.0.tgz","fileCount":15,"integrity":"sha512-/5uz+Y5wXTex6alJWZAClTQiHNeAk+8bEdU8VNEbrVNjKKGEyQIiPbj2sk0ahch8atI2hqIzIAELlPhi6VGt7Q==","signatures":[{"sig":"MEQCIFyEW3MW/SScLz1BfT14n9xbuGtuVbPHudsiWYoIy6wLAiAlQoGIkyjvKwfHo8FQ1TXfS09NEZBYtMehj8MCU7zbJQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":70826},"main":"./dist/index.js","type":"module","_from":"file:adhd-sox-hybrid-search-0.2.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"private":false,"_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_resolved":"/private/var/folders/yg/cfczgtx54bzfh74lx2_mv0z80000gp/T/e33e5e62add40c33dd3be073a5f3c171/adhd-sox-hybrid-search-0.2.0.tgz","_integrity":"sha512-/5uz+Y5wXTex6alJWZAClTQiHNeAk+8bEdU8VNEbrVNjKKGEyQIiPbj2sk0ahch8atI2hqIzIAELlPhi6VGt7Q==","_npmVersion":"11.6.2","description":"Generic hybrid retrieval ranker — fuses vector similarity + text relevance signals (mechanism-agnostic: textScore / vecScore) via normalized RRF/max-score fusion. SearchBackend interface decouples ranking logic from storage. SqliteSearchBackend wires Vect","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@adhd/sox-graph-store":"0.3.0","@adhd/sox-vector-store":"0.1.0","@adhd/sox-embedding-provider":"0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/sox-hybrid-search_0.2.0_1784239337697_0.44422016247139484","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@adhd/sox-hybrid-search","version":"0.3.0","license":"MIT","_id":"@adhd/sox-hybrid-search@0.3.0","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"sox":{"area":"data","group":"search","concerns":["SearchBackend interface (mechanism-agnostic: textScore / vecScore, not BM25 / cosine)","SqliteSearchBackend — DI constructor (VectorBackend, GraphBackend)","hybrid fusion: normalize-before-combine (min_max / L2 / z_score)","degrade-to-text when vec signal absent ([def:degrade-to-text-only])","pure fuse() + normalize() exports (no storage dep)","explain mode (signal-level breakdown only — not field-level)","SchemaAdapter is SQLite-internal (NOT exported — filters wired into SqliteSearchBackend)","vector-channel filter parity (BL-294) — SqliteSearchBackend resolves query.filters through graph.queryNodes() and constrains vec.knn() to the matching id set, so namespace/kind/topic/projectPath/agentId filters scope BOTH channels identically, not just the text channel","degrade signal (BL-294) — SearchBackend.search() results carry an additive degraded?: { unsupportedFilters: string[] } field whenever query.filters included a key with no NodeFilter mapping; surfaced unconditionally on SearchResult, not gated behind explain"],"invariants":["SearchBackend.search() degrades to text-only when query.vec is absent, degrades to vec-only when query.text is absent — never errors on a missing signal","scores are normalized BEFORE combining (never raw scale-blind additive merge)","textScore / vecScore are mechanism-agnostic names — BM25 / cosine are implementation details inside backends (never surfaced through SearchBackend interface)","SchemaAdapter is an internal SQLite concern — NOT exported; MCP handlers pass raw filters via SearchQuery.filters; SqliteSearchBackend resolves them internally","fuse() weights must be multiplicative (field boosting), never additive (scale-blind)","a NodeFilter that matches zero nodes yields zero vector candidates — never an unfiltered knn() fallback (an empty VecFilter.ids means \"no filter\" to the vector backend, not \"match nothing\")"],"entrypoints":["dist/index.js"]},"dist":{"shasum":"35d9ed65c6f67f8760a521a70663918ea116f93b","tarball":"https://registry.npmjs.org/@adhd/sox-hybrid-search/-/sox-hybrid-search-0.3.0.tgz","fileCount":15,"integrity":"sha512-+1ORxxjrWATNIHKFTvgoGvmPwlUuTvEPpGaW6ULndYpwaHieK2TTcvk1Keu+kwZKMml+SCfSv/tGM/sGN4gNkw==","signatures":[{"sig":"MEUCIQCLZ5MQiuarsXENNhyRF+1YtuU1llfVsUI/lagKTNCozQIgCPbfDgNRqNe5Ow9LhUTCQNI+utWHF8LuUnAdUEXsOMY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":70210},"main":"./dist/index.js","type":"module","_from":"file:adhd-sox-hybrid-search-0.3.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"private":false,"_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_resolved":"/private/var/folders/yg/cfczgtx54bzfh74lx2_mv0z80000gp/T/fc4ea33ee1fde4bbbf6b939cfba45675/adhd-sox-hybrid-search-0.3.0.tgz","_integrity":"sha512-+1ORxxjrWATNIHKFTvgoGvmPwlUuTvEPpGaW6ULndYpwaHieK2TTcvk1Keu+kwZKMml+SCfSv/tGM/sGN4gNkw==","_npmVersion":"11.6.2","description":"Generic hybrid retrieval ranker — fuses vector similarity + text relevance signals (mechanism-agnostic: textScore / vecScore) via normalized RRF/max-score fusion. SearchBackend interface decouples ranking logic from storage. SqliteSearchBackend wires Vect","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@adhd/sox-graph-store":"0.4.0","@adhd/sox-vector-store":"0.2.0","@adhd/sox-embedding-provider":"0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/sox-hybrid-search_0.3.0_1784829261076_0.46679191888146154","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@adhd/sox-hybrid-search","version":"0.3.1","license":"MIT","_id":"@adhd/sox-hybrid-search@0.3.1","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"sox":{"area":"data","group":"search","concerns":["SearchBackend interface (mechanism-agnostic: textScore / vecScore, not BM25 / cosine)","SqliteSearchBackend — DI constructor (VectorBackend, GraphBackend)","hybrid fusion: normalize-before-combine (min_max / L2 / z_score)","degrade-to-text when vec signal absent ([def:degrade-to-text-only])","pure fuse() + normalize() exports (no storage dep)","explain mode (signal-level breakdown only — not field-level)","SchemaAdapter is SQLite-internal (NOT exported — filters wired into SqliteSearchBackend)","vector-channel filter parity (BL-294) — SqliteSearchBackend resolves query.filters through graph.queryNodes() and constrains vec.knn() to the matching id set, so namespace/kind/topic/projectPath/agentId filters scope BOTH channels identically, not just the text channel","degrade signal (BL-294) — SearchBackend.search() results carry an additive degraded?: { unsupportedFilters: string[] } field whenever query.filters included a key with no NodeFilter mapping; surfaced unconditionally on SearchResult, not gated behind explain"],"invariants":["SearchBackend.search() degrades to text-only when query.vec is absent, degrades to vec-only when query.text is absent — never errors on a missing signal","scores are normalized BEFORE combining (never raw scale-blind additive merge)","textScore / vecScore are mechanism-agnostic names — BM25 / cosine are implementation details inside backends (never surfaced through SearchBackend interface)","SchemaAdapter is an internal SQLite concern — NOT exported; MCP handlers pass raw filters via SearchQuery.filters; SqliteSearchBackend resolves them internally","fuse() weights must be multiplicative (field boosting), never additive (scale-blind)","a NodeFilter that matches zero nodes yields zero vector candidates — never an unfiltered knn() fallback (an empty VecFilter.ids means \"no filter\" to the vector backend, not \"match nothing\")"],"entrypoints":["dist/index.js"]},"dist":{"shasum":"e80c74099587293688a9bad0e941e20ff5c0bf66","tarball":"https://registry.npmjs.org/@adhd/sox-hybrid-search/-/sox-hybrid-search-0.3.1.tgz","fileCount":15,"integrity":"sha512-CoyrF60HUl6Xss8DotQzy9NnGZT54DaQcaxH+Rlch+naawLxU8fIUZqrQmwkVFG+xOyUchP7kHyUnzhKWq2CHQ==","signatures":[{"sig":"MEYCIQDs/E354byPt78FTgNMQpgGwgf/tUWy8jYEm2APt/Y1fQIhAIL5EDcs0gWzu6+EXk/a63rBN4TNy5qOxF3+WBQa1lm8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":70487},"main":"./dist/index.js","type":"module","_from":"file:adhd-sox-hybrid-search-0.3.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"private":false,"_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_resolved":"/Users/nix/.adhd/sox-ecosystem/publish-verify-201412/adhd-sox-hybrid-search-0.3.1.tgz","_integrity":"sha512-CoyrF60HUl6Xss8DotQzy9NnGZT54DaQcaxH+Rlch+naawLxU8fIUZqrQmwkVFG+xOyUchP7kHyUnzhKWq2CHQ==","_npmVersion":"11.6.2","description":"Generic hybrid retrieval ranker — fuses vector similarity + text relevance signals (mechanism-agnostic: textScore / vecScore) via normalized RRF/max-score fusion. SearchBackend interface decouples ranking logic from storage. SqliteSearchBackend wires Vect","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@adhd/sox-graph-store":"0.5.1","@adhd/sox-vector-store":"0.3.1","@adhd/sox-embedding-provider":"0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@adhd/sox-store-adapter":"0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/sox-hybrid-search_0.3.1_1785892772703_0.9564118649900777","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@adhd/sox-hybrid-search","version":"0.3.2","license":"MIT","_id":"@adhd/sox-hybrid-search@0.3.2","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"sox":{"area":"data","group":"search","concerns":["SearchBackend interface (mechanism-agnostic: textScore / vecScore, not BM25 / cosine)","SqliteSearchBackend — DI constructor (VectorBackend, GraphBackend)","hybrid fusion: normalize-before-combine (min_max / L2 / z_score)","degrade-to-text when vec signal absent ([def:degrade-to-text-only])","pure fuse() + normalize() exports (no storage dep)","explain mode (signal-level breakdown only — not field-level)","SchemaAdapter is SQLite-internal (NOT exported — filters wired into SqliteSearchBackend)","vector-channel filter parity (BL-294) — SqliteSearchBackend resolves query.filters through graph.queryNodes() and constrains vec.knn() to the matching id set, so namespace/kind/topic/projectPath/agentId filters scope BOTH channels identically, not just the text channel","degrade signal (BL-294) — SearchBackend.search() results carry an additive degraded?: { unsupportedFilters: string[] } field whenever query.filters included a key with no NodeFilter mapping; surfaced unconditionally on SearchResult, not gated behind explain"],"invariants":["SearchBackend.search() degrades to text-only when query.vec is absent, degrades to vec-only when query.text is absent — never errors on a missing signal","scores are normalized BEFORE combining (never raw scale-blind additive merge)","textScore / vecScore are mechanism-agnostic names — BM25 / cosine are implementation details inside backends (never surfaced through SearchBackend interface)","SchemaAdapter is an internal SQLite concern — NOT exported; MCP handlers pass raw filters via SearchQuery.filters; SqliteSearchBackend resolves them internally","fuse() weights must be multiplicative (field boosting), never additive (scale-blind)","a NodeFilter that matches zero nodes yields zero vector candidates — never an unfiltered knn() fallback (an empty VecFilter.ids means \"no filter\" to the vector backend, not \"match nothing\")"],"entrypoints":["dist/index.js"]},"dist":{"shasum":"26a6bd8a1d0cf61c4b75755b7333f39548f65bc4","tarball":"https://registry.npmjs.org/@adhd/sox-hybrid-search/-/sox-hybrid-search-0.3.2.tgz","fileCount":15,"integrity":"sha512-VM0V7/VmyYaDe88cA/9+GnJdvUGkhtuDtnWxB4BVii7Axd+ohd+UxWGOSkD3Xsa+qit1XpxhJJNRiLerD7BIyw==","signatures":[{"sig":"MEUCIQDEJ4yIKKDr3LIx8m1P+h7gbwWH4cBcrFbJEKtw/khEqgIgXd4qN/DFtF3H1x3Je6IIiVmGztXL6EHUzdq6JbFb+Fo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":70487},"main":"./dist/index.js","type":"module","_from":"file:adhd-sox-hybrid-search-0.3.2.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"private":false,"_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_resolved":"/Users/nix/.adhd/sox-ecosystem/publish-verify2-203027/adhd-sox-hybrid-search-0.3.2.tgz","_integrity":"sha512-VM0V7/VmyYaDe88cA/9+GnJdvUGkhtuDtnWxB4BVii7Axd+ohd+UxWGOSkD3Xsa+qit1XpxhJJNRiLerD7BIyw==","_npmVersion":"11.6.2","description":"Generic hybrid retrieval ranker — fuses vector similarity + text relevance signals (mechanism-agnostic: textScore / vecScore) via normalized RRF/max-score fusion. SearchBackend interface decouples ranking logic from storage. SqliteSearchBackend wires Vect","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@adhd/sox-graph-store":"0.5.2","@adhd/sox-vector-store":"0.3.2","@adhd/sox-embedding-provider":"0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@adhd/sox-store-adapter":"0.1.2"},"_npmOperationalInternal":{"tmp":"tmp/sox-hybrid-search_0.3.2_1785893496838_0.3283942049115982","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"@adhd/sox-hybrid-search","version":"0.3.3","license":"MIT","_id":"@adhd/sox-hybrid-search@0.3.3","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"sox":{"area":"data","group":"search","concerns":["SearchBackend interface (mechanism-agnostic: textScore / vecScore, not BM25 / cosine)","SqliteSearchBackend — DI constructor (VectorBackend, GraphBackend)","hybrid fusion: normalize-before-combine (min_max / L2 / z_score)","degrade-to-text when vec signal absent ([def:degrade-to-text-only])","pure fuse() + normalize() exports (no storage dep)","explain mode (signal-level breakdown only — not field-level)","SchemaAdapter is SQLite-internal (NOT exported — filters wired into SqliteSearchBackend)","vector-channel filter parity (BL-294) — SqliteSearchBackend resolves query.filters through graph.queryNodes() and constrains vec.knn() to the matching id set, so namespace/kind/topic/projectPath/agentId filters scope BOTH channels identically, not just the text channel","degrade signal (BL-294) — SearchBackend.search() results carry an additive degraded?: { unsupportedFilters: string[] } field whenever query.filters included a key with no NodeFilter mapping; surfaced unconditionally on SearchResult, not gated behind explain"],"invariants":["SearchBackend.search() degrades to text-only when query.vec is absent, degrades to vec-only when query.text is absent — never errors on a missing signal","scores are normalized BEFORE combining (never raw scale-blind additive merge)","textScore / vecScore are mechanism-agnostic names — BM25 / cosine are implementation details inside backends (never surfaced through SearchBackend interface)","SchemaAdapter is an internal SQLite concern — NOT exported; MCP handlers pass raw filters via SearchQuery.filters; SqliteSearchBackend resolves them internally","fuse() weights must be multiplicative (field boosting), never additive (scale-blind)","a NodeFilter that matches zero nodes yields zero vector candidates — never an unfiltered knn() fallback (an empty VecFilter.ids means \"no filter\" to the vector backend, not \"match nothing\")"],"entrypoints":["dist/index.js"]},"dist":{"shasum":"c6d79db35e51269ea453810a5c778bd417214933","tarball":"https://registry.npmjs.org/@adhd/sox-hybrid-search/-/sox-hybrid-search-0.3.3.tgz","fileCount":15,"integrity":"sha512-Qq0Bs8snMnu/PhBfCOl0qc62BySb+LtARmNbSRgojgt8NxKLv2hRKHYF55HzGrq2gpTJzkF/bBWfJB7g5UdNaA==","signatures":[{"sig":"MEYCIQDGyqfVDqr0KHtW0vK/zZ7Bi5jZ6hqerkJGzNrPjTgX5gIhALKCwUsjIqHboMxsqGNMdqjOM26vTcoZGX/mUG0vwpsS","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":70487},"main":"./dist/index.js","type":"module","_from":"file:adhd-sox-hybrid-search-0.3.3.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"private":false,"_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_resolved":"/Users/nix/.adhd/sox-ecosystem/pubv3-142121/adhd-sox-hybrid-search-0.3.3.tgz","_integrity":"sha512-Qq0Bs8snMnu/PhBfCOl0qc62BySb+LtARmNbSRgojgt8NxKLv2hRKHYF55HzGrq2gpTJzkF/bBWfJB7g5UdNaA==","_npmVersion":"11.6.2","description":"Generic hybrid retrieval ranker — fuses vector similarity + text relevance signals (mechanism-agnostic: textScore / vecScore) via normalized RRF/max-score fusion. SearchBackend interface decouples ranking logic from storage. SqliteSearchBackend wires Vect","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@adhd/sox-graph-store":"0.5.3","@adhd/sox-vector-store":"0.3.3","@adhd/sox-embedding-provider":"0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@adhd/sox-store-adapter":"0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/sox-hybrid-search_0.3.3_1785957744367_0.5960355847017433","host":"s3://npm-registry-packages-npm-production"}},"0.3.4":{"name":"@adhd/sox-hybrid-search","version":"0.3.4","license":"MIT","_id":"@adhd/sox-hybrid-search@0.3.4","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"sox":{"area":"data","group":"search","concerns":["SearchBackend interface (mechanism-agnostic: textScore / vecScore, not BM25 / cosine)","SqliteSearchBackend — DI constructor (VectorBackend, GraphBackend)","hybrid fusion: normalize-before-combine (min_max / L2 / z_score)","degrade-to-text when vec signal absent ([def:degrade-to-text-only])","pure fuse() + normalize() exports (no storage dep)","explain mode (signal-level breakdown only — not field-level)","SchemaAdapter is SQLite-internal (NOT exported — filters wired into SqliteSearchBackend)","vector-channel filter parity (BL-294) — SqliteSearchBackend resolves query.filters through graph.queryNodes() and constrains vec.knn() to the matching id set, so namespace/kind/topic/projectPath/agentId filters scope BOTH channels identically, not just the text channel","degrade signal (BL-294) — SearchBackend.search() results carry an additive degraded?: { unsupportedFilters: string[] } field whenever query.filters included a key with no NodeFilter mapping; surfaced unconditionally on SearchResult, not gated behind explain"],"invariants":["SearchBackend.search() degrades to text-only when query.vec is absent, degrades to vec-only when query.text is absent — never errors on a missing signal","scores are normalized BEFORE combining (never raw scale-blind additive merge)","textScore / vecScore are mechanism-agnostic names — BM25 / cosine are implementation details inside backends (never surfaced through SearchBackend interface)","SchemaAdapter is an internal SQLite concern — NOT exported; MCP handlers pass raw filters via SearchQuery.filters; SqliteSearchBackend resolves them internally","fuse() weights must be multiplicative (field boosting), never additive (scale-blind)","a NodeFilter that matches zero nodes yields zero vector candidates — never an unfiltered knn() fallback (an empty VecFilter.ids means \"no filter\" to the vector backend, not \"match nothing\")"],"entrypoints":["dist/index.js"]},"dist":{"shasum":"f85cda40fd3dd85d54473bedf5f124ec715d511a","tarball":"https://registry.npmjs.org/@adhd/sox-hybrid-search/-/sox-hybrid-search-0.3.4.tgz","fileCount":15,"integrity":"sha512-S3rX6cj+J/bysSlmvMq17jAvpA30TEMBn4+dYSSXLWXw2dUYIuky30Th/MOr/Ke6aiGCY8Lkr0Q4keyLpqniLw==","signatures":[{"sig":"MEUCIQDLf3Oo4Td/BbTMbIokoIwB2w/tWpmg4RoVh5Bt0e91hwIgNAhh3DyOq8Pp96oivuRcLyLUS1tYhezz0RAuSKs1AOo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":73698},"main":"./dist/index.js","type":"module","_from":"file:adhd-sox-hybrid-search-0.3.4.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"private":false,"_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_resolved":"/private/var/folders/yg/cfczgtx54bzfh74lx2_mv0z80000gp/T/b30c1a0eca94385c336acda1953a1717/adhd-sox-hybrid-search-0.3.4.tgz","_integrity":"sha512-S3rX6cj+J/bysSlmvMq17jAvpA30TEMBn4+dYSSXLWXw2dUYIuky30Th/MOr/Ke6aiGCY8Lkr0Q4keyLpqniLw==","_npmVersion":"11.6.2","description":"Generic hybrid retrieval ranker — fuses vector similarity + text relevance signals (mechanism-agnostic: textScore / vecScore) via normalized RRF/max-score fusion. SearchBackend interface decouples ranking logic from storage. SqliteSearchBackend wires Vect","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@adhd/sox-graph-store":"0.6.0","@adhd/sox-vector-store":"0.4.0","@adhd/sox-embedding-provider":"0.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@adhd/sox-store-adapter":"0.3.0"},"_npmOperationalInternal":{"tmp":"tmp/sox-hybrid-search_0.3.4_1786144734444_0.41878547777606245","host":"s3://npm-registry-packages-npm-production"}},"0.3.6":{"name":"@adhd/sox-hybrid-search","version":"0.3.6","license":"MIT","_id":"@adhd/sox-hybrid-search@0.3.6","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"sox":{"area":"data","group":"search","concerns":["SearchBackend interface (mechanism-agnostic: textScore / vecScore, not BM25 / cosine)","SqliteSearchBackend — DI constructor (VectorBackend, GraphBackend)","hybrid fusion: normalize-before-combine (min_max / L2 / z_score)","degrade-to-text when vec signal absent ([def:degrade-to-text-only])","pure fuse() + normalize() exports (no storage dep)","explain mode (signal-level breakdown only — not field-level)","SchemaAdapter is SQLite-internal (NOT exported — filters wired into SqliteSearchBackend)","vector-channel filter parity (BL-294) — SqliteSearchBackend resolves query.filters through graph.queryNodes() and constrains vec.knn() to the matching id set, so namespace/kind/topic/projectPath/agentId filters scope BOTH channels identically, not just the text channel","degrade signal (BL-294) — SearchBackend.search() results carry an additive degraded?: { unsupportedFilters: string[] } field whenever query.filters included a key with no NodeFilter mapping; surfaced unconditionally on SearchResult, not gated behind explain"],"invariants":["SearchBackend.search() degrades to text-only when query.vec is absent, degrades to vec-only when query.text is absent — never errors on a missing signal","scores are normalized BEFORE combining (never raw scale-blind additive merge)","textScore / vecScore are mechanism-agnostic names — BM25 / cosine are implementation details inside backends (never surfaced through SearchBackend interface)","SchemaAdapter is an internal SQLite concern — NOT exported; MCP handlers pass raw filters via SearchQuery.filters; SqliteSearchBackend resolves them internally","fuse() weights must be multiplicative (field boosting), never additive (scale-blind)","a NodeFilter that matches zero nodes yields zero vector candidates — never an unfiltered knn() fallback (an empty VecFilter.ids means \"no filter\" to the vector backend, not \"match nothing\")"],"entrypoints":["dist/index.js"]},"dist":{"shasum":"ed833403344cf3ac4f9839b622244f41d7808759","tarball":"https://registry.npmjs.org/@adhd/sox-hybrid-search/-/sox-hybrid-search-0.3.6.tgz","fileCount":15,"integrity":"sha512-8UtNxIjdThq223e1ek+ngDOdO8ZFSZyRpCecAyXgAfHYOVV2afRA9VdDlvECr2nZOklQLvnHiEEJXa+HT1ZW8Q==","signatures":[{"sig":"MEYCIQCtWnUtwXWUssIgnkNo+GPVoDOuBONdwTQQ3fWBhspM4AIhAKzf8AX40DQiYTVqEPJ6kEjFoY0tUUlJ9w1OAh/wwdOB","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":73698},"main":"./dist/index.js","type":"module","_from":"file:adhd-sox-hybrid-search-0.3.6.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"private":false,"_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_resolved":"/private/var/folders/yg/cfczgtx54bzfh74lx2_mv0z80000gp/T/bb30f54a99db871af056cb953cea0cf0/adhd-sox-hybrid-search-0.3.6.tgz","_integrity":"sha512-8UtNxIjdThq223e1ek+ngDOdO8ZFSZyRpCecAyXgAfHYOVV2afRA9VdDlvECr2nZOklQLvnHiEEJXa+HT1ZW8Q==","_npmVersion":"11.6.2","description":"Generic hybrid retrieval ranker — fuses vector similarity + text relevance signals (mechanism-agnostic: textScore / vecScore) via normalized RRF/max-score fusion. SearchBackend interface decouples ranking logic from storage. SqliteSearchBackend wires Vect","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@adhd/sox-graph-store":"0.8.2","@adhd/sox-vector-store":"0.4.2","@adhd/sox-embedding-provider":"0.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@adhd/sox-store-adapter":"0.5.2"},"_npmOperationalInternal":{"tmp":"tmp/sox-hybrid-search_0.3.6_1786494959874_0.37488997447097905","host":"s3://npm-registry-packages-npm-production"}},"0.3.7":{"name":"@adhd/sox-hybrid-search","version":"0.3.7","license":"MIT","_id":"@adhd/sox-hybrid-search@0.3.7","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"sox":{"area":"data","group":"search","concerns":["SearchBackend interface (mechanism-agnostic: textScore / vecScore, not BM25 / cosine)","SqliteSearchBackend — DI constructor (VectorBackend, GraphBackend)","hybrid fusion: normalize-before-combine (min_max / L2 / z_score)","degrade-to-text when vec signal absent ([def:degrade-to-text-only])","pure fuse() + normalize() exports (no storage dep)","explain mode (signal-level breakdown only — not field-level)","SchemaAdapter is SQLite-internal (NOT exported — filters wired into SqliteSearchBackend)","vector-channel filter parity (BL-294) — SqliteSearchBackend resolves query.filters through graph.queryNodes() and constrains vec.knn() to the matching id set, so namespace/kind/topic/projectPath/agentId filters scope BOTH channels identically, not just the text channel","degrade signal (BL-294) — SearchBackend.search() results carry an additive degraded?: { unsupportedFilters: string[] } field whenever query.filters included a key with no NodeFilter mapping; surfaced unconditionally on SearchResult, not gated behind explain"],"invariants":["SearchBackend.search() degrades to text-only when query.vec is absent, degrades to vec-only when query.text is absent — never errors on a missing signal","scores are normalized BEFORE combining (never raw scale-blind additive merge)","textScore / vecScore are mechanism-agnostic names — BM25 / cosine are implementation details inside backends (never surfaced through SearchBackend interface)","SchemaAdapter is an internal SQLite concern — NOT exported; MCP handlers pass raw filters via SearchQuery.filters; SqliteSearchBackend resolves them internally","fuse() weights must be multiplicative (field boosting), never additive (scale-blind)","a NodeFilter that matches zero nodes yields zero vector candidates — never an unfiltered knn() fallback (an empty VecFilter.ids means \"no filter\" to the vector backend, not \"match nothing\")"],"entrypoints":["dist/index.js"]},"dist":{"shasum":"4c85d71d433168df8cd308a8e81ecbe63bf08187","tarball":"https://registry.npmjs.org/@adhd/sox-hybrid-search/-/sox-hybrid-search-0.3.7.tgz","fileCount":15,"integrity":"sha512-csW3p7qJaDeoJtteRzagSAk1ElkNzyuWX5RF1aj2rvYQGHApfu1FceOKzBuEZnFErEx/B+2n9iebH8V0z974zg==","signatures":[{"sig":"MEYCIQCrN6rBNrAqYB7ofBQ5clCsCy7uIkjwKv1mMVNp24C+igIhAKS824ZdtgJzFEf1dtOas/tpENS0YXBiz9V7by7xQ2q7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":73698},"main":"./dist/index.js","type":"module","_from":"file:adhd-sox-hybrid-search-0.3.7.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"private":false,"_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_resolved":"/private/var/folders/yg/cfczgtx54bzfh74lx2_mv0z80000gp/T/839734da6936355d867f1bbad0cad2e0/adhd-sox-hybrid-search-0.3.7.tgz","_integrity":"sha512-csW3p7qJaDeoJtteRzagSAk1ElkNzyuWX5RF1aj2rvYQGHApfu1FceOKzBuEZnFErEx/B+2n9iebH8V0z974zg==","_npmVersion":"11.6.2","description":"Generic hybrid retrieval ranker — fuses vector similarity + text relevance signals (mechanism-agnostic: textScore / vecScore) via normalized RRF/max-score fusion. SearchBackend interface decouples ranking logic from storage. SqliteSearchBackend wires Vect","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@adhd/sox-graph-store":"0.8.3","@adhd/sox-vector-store":"0.4.3","@adhd/sox-embedding-provider":"0.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@adhd/sox-store-adapter":"0.5.3"},"_npmOperationalInternal":{"tmp":"tmp/sox-hybrid-search_0.3.7_1786506948706_0.8948857842118172","host":"s3://npm-registry-packages-npm-production"}},"0.3.8":{"name":"@adhd/sox-hybrid-search","version":"0.3.8","license":"MIT","_id":"@adhd/sox-hybrid-search@0.3.8","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"sox":{"area":"data","group":"search","concerns":["SearchBackend interface (mechanism-agnostic: textScore / vecScore, not BM25 / cosine)","SqliteSearchBackend — DI constructor (VectorBackend, GraphBackend)","hybrid fusion: normalize-before-combine (min_max / L2 / z_score)","degrade-to-text when vec signal absent ([def:degrade-to-text-only])","pure fuse() + normalize() exports (no storage dep)","explain mode (signal-level breakdown only — not field-level)","SchemaAdapter is SQLite-internal (NOT exported — filters wired into SqliteSearchBackend)","vector-channel filter parity (BL-294) — SqliteSearchBackend resolves query.filters through graph.queryNodes() and constrains vec.knn() to the matching id set, so namespace/kind/topic/projectPath/agentId filters scope BOTH channels identically, not just the text channel","degrade signal (BL-294) — SearchBackend.search() results carry an additive degraded?: { unsupportedFilters: string[] } field whenever query.filters included a key with no NodeFilter mapping; surfaced unconditionally on SearchResult, not gated behind explain"],"invariants":["SearchBackend.search() degrades to text-only when query.vec is absent, degrades to vec-only when query.text is absent — never errors on a missing signal","scores are normalized BEFORE combining (never raw scale-blind additive merge)","textScore / vecScore are mechanism-agnostic names — BM25 / cosine are implementation details inside backends (never surfaced through SearchBackend interface)","SchemaAdapter is an internal SQLite concern — NOT exported; MCP handlers pass raw filters via SearchQuery.filters; SqliteSearchBackend resolves them internally","fuse() weights must be multiplicative (field boosting), never additive (scale-blind)","a NodeFilter that matches zero nodes yields zero vector candidates — never an unfiltered knn() fallback (an empty VecFilter.ids means \"no filter\" to the vector backend, not \"match nothing\")"],"entrypoints":["dist/index.js"]},"dist":{"shasum":"043abd0a298d3d4a2bcc067d88690e2bb1d651b5","tarball":"https://registry.npmjs.org/@adhd/sox-hybrid-search/-/sox-hybrid-search-0.3.8.tgz","fileCount":15,"integrity":"sha512-KONekVxhbvftYTJNgY5tX9ZQ1iB4PBg2Zh61+rE/86pO9CZPt/xB32FaH1Ck8tEGihE8eWlbzUkAavkDsu0UaA==","signatures":[{"sig":"MEUCIQCbDOiiuvWByGQYeTetI7+HGH6fFId4GZ2WxccsHuDPLgIgZAnWwh4GIO5+cuQ9DL/I1ahM2BXWvZIwy9815okMuMA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":73702},"main":"./dist/index.js","type":"module","_from":"file:adhd-sox-hybrid-search-0.3.8.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"private":false,"_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_resolved":"/private/var/folders/yg/cfczgtx54bzfh74lx2_mv0z80000gp/T/5c3b3da998dae10ecb8560d61c8851f2/adhd-sox-hybrid-search-0.3.8.tgz","_integrity":"sha512-KONekVxhbvftYTJNgY5tX9ZQ1iB4PBg2Zh61+rE/86pO9CZPt/xB32FaH1Ck8tEGihE8eWlbzUkAavkDsu0UaA==","_npmVersion":"11.6.2","description":"Generic hybrid retrieval ranker — fuses vector similarity + text relevance signals (mechanism-agnostic: textScore / vecScore) via normalized RRF/max-score fusion. SearchBackend interface decouples ranking logic from storage. SqliteSearchBackend wires Vect","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@adhd/sox-graph-store":"^0.8.6","@adhd/sox-vector-store":"^0.4.5","@adhd/sox-embedding-provider":"^0.4.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@adhd/sox-store-adapter":"^0.7.0"},"_npmOperationalInternal":{"tmp":"tmp/sox-hybrid-search_0.3.8_1787113043900_0.20746743383385224","host":"s3://npm-registry-packages-npm-production"}},"0.3.9":{"name":"@adhd/sox-hybrid-search","version":"0.3.9","license":"MIT","_id":"@adhd/sox-hybrid-search@0.3.9","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"sox":{"area":"data","group":"search","concerns":["SearchBackend interface (mechanism-agnostic: textScore / vecScore, not BM25 / cosine)","SqliteSearchBackend — DI constructor (VectorBackend, GraphBackend)","hybrid fusion: normalize-before-combine (min_max / L2 / z_score)","degrade-to-text when vec signal absent ([def:degrade-to-text-only])","pure fuse() + normalize() exports (no storage dep)","explain mode (signal-level breakdown only — not field-level)","SchemaAdapter is SQLite-internal (NOT exported — filters wired into SqliteSearchBackend)","vector-channel filter parity (BL-294) — SqliteSearchBackend resolves query.filters through graph.queryNodes() and constrains vec.knn() to the matching id set, so namespace/kind/topic/projectPath/agentId filters scope BOTH channels identically, not just the text channel","degrade signal (BL-294) — SearchBackend.search() results carry an additive degraded?: { unsupportedFilters: string[] } field whenever query.filters included a key with no NodeFilter mapping; surfaced unconditionally on SearchResult, not gated behind explain"],"invariants":["SearchBackend.search() degrades to text-only when query.vec is absent, degrades to vec-only when query.text is absent — never errors on a missing signal","scores are normalized BEFORE combining (never raw scale-blind additive merge)","textScore / vecScore are mechanism-agnostic names — BM25 / cosine are implementation details inside backends (never surfaced through SearchBackend interface)","SchemaAdapter is an internal SQLite concern — NOT exported; MCP handlers pass raw filters via SearchQuery.filters; SqliteSearchBackend resolves them internally","fuse() weights must be multiplicative (field boosting), never additive (scale-blind)","a NodeFilter that matches zero nodes yields zero vector candidates — never an unfiltered knn() fallback (an empty VecFilter.ids means \"no filter\" to the vector backend, not \"match nothing\")"],"entrypoints":["dist/index.js"]},"dist":{"shasum":"37772330a0ac6d232bc5a754e7304f763234c317","tarball":"https://registry.npmjs.org/@adhd/sox-hybrid-search/-/sox-hybrid-search-0.3.9.tgz","fileCount":15,"integrity":"sha512-lPQwT6To+EPZg//S/LmIRgoCw0gAcBnxQ6Pc+IQGFKjJfBp26FhVq7dBQNqUAuXuBv9NcAqksL841cIDU4DSdg==","signatures":[{"sig":"MEQCIF1RGFtTDw/1THq+hEqBb48XG+JPhKPTG/cQV3DmKnCOAiB51UuAdoJi9sNmNmTBum10P5A0o4hSXr+/0XKnhgLc9Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":73702},"main":"./dist/index.js","type":"module","_from":"file:adhd-sox-hybrid-search-0.3.9.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"private":false,"_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_resolved":"/private/var/folders/yg/cfczgtx54bzfh74lx2_mv0z80000gp/T/c304feee253e15a4fb18493f9b39d37e/adhd-sox-hybrid-search-0.3.9.tgz","_integrity":"sha512-lPQwT6To+EPZg//S/LmIRgoCw0gAcBnxQ6Pc+IQGFKjJfBp26FhVq7dBQNqUAuXuBv9NcAqksL841cIDU4DSdg==","_npmVersion":"11.6.2","description":"Generic hybrid retrieval ranker — fuses vector similarity + text relevance signals (mechanism-agnostic: textScore / vecScore) via normalized RRF/max-score fusion. SearchBackend interface decouples ranking logic from storage. SqliteSearchBackend wires Vect","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@adhd/sox-graph-store":"^0.8.6","@adhd/sox-vector-store":"^0.5.0","@adhd/sox-embedding-provider":"^0.4.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@adhd/sox-store-adapter":"^0.7.1"},"_npmOperationalInternal":{"tmp":"tmp/sox-hybrid-search_0.3.9_1787786395306_0.9247946741017523","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@adhd/sox-hybrid-search","version":"0.4.0","keywords":["search","hybrid","vector","ranking","retrieval","typescript"],"license":"MIT","_id":"@adhd/sox-hybrid-search@0.4.0","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"homepage":"https://github.com/PseudoSky/adhd","bugs":{"url":"https://github.com/PseudoSky/adhd/issues"},"sox":{"area":"data","group":"search","concerns":["SearchBackend interface (mechanism-agnostic: textScore / vecScore, not BM25 / cosine)","StoreSearchBackend — DI constructor (VectorBackend, GraphBackend)","hybrid fusion: normalize-before-combine (min_max / L2 / z_score)","degrade-to-text when vec signal absent ([def:degrade-to-text-only])","pure fuse() + normalize() exports (no storage dep)","explain mode (signal-level breakdown only — not field-level)","SchemaAdapter is SQLite-internal (NOT exported — filters wired into StoreSearchBackend)","vector-channel filter parity (BL-294) — StoreSearchBackend resolves query.filters through graph.queryNodes() and constrains vec.knn() to the matching id set, so namespace/kind/topic/projectPath/agentId filters scope BOTH channels identically, not just the text channel","degrade signal (BL-294) — SearchBackend.search() results carry an additive degraded?: { unsupportedFilters: string[] } field whenever query.filters included a key with no NodeFilter mapping; surfaced unconditionally on SearchResult, not gated behind explain"],"invariants":["SearchBackend.search() degrades to text-only when query.vec is absent, degrades to vec-only when query.text is absent — never errors on a missing signal","scores are normalized BEFORE combining (never raw scale-blind additive merge)","textScore / vecScore are mechanism-agnostic names — BM25 / cosine are implementation details inside backends (never surfaced through SearchBackend interface)","SchemaAdapter is an internal SQLite concern — NOT exported; MCP handlers pass raw filters via SearchQuery.filters; StoreSearchBackend resolves them internally","fuse() weights must be multiplicative (field boosting), never additive (scale-blind)","a NodeFilter that matches zero nodes yields zero vector candidates — never an unfiltered knn() fallback (an empty VecFilter.ids means \"no filter\" to the vector backend, not \"match nothing\")"],"entrypoints":["dist/index.js"]},"dist":{"shasum":"e281c9f57187b398da931eb0fda2788b9aa5f939","tarball":"https://registry.npmjs.org/@adhd/sox-hybrid-search/-/sox-hybrid-search-0.4.0.tgz","fileCount":16,"integrity":"sha512-iYjZYdsOXBR61sLr029DZ//YWauytx1luY1M0PcJMmfPGpzODKfQrwhS5C18js3bkDmmA9QbRCT0ewZZV/4JMw==","signatures":[{"sig":"MEUCIGsU8ySK/8G/VRuD4DQETSECc+8UP7ZIRb1Vig0UlKggAiEA530R9kX20tnTmu9Vx/NpLnZZYb8PRxLPiiKSmu4+n7w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":94779},"main":"./dist/index.js","type":"module","_from":"file:adhd-sox-hybrid-search-0.4.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"private":false,"_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_resolved":"/private/var/folders/yg/cfczgtx54bzfh74lx2_mv0z80000gp/T/7a4b843a5e2dd8e7bdaedd32cf91bbae/adhd-sox-hybrid-search-0.4.0.tgz","_integrity":"sha512-iYjZYdsOXBR61sLr029DZ//YWauytx1luY1M0PcJMmfPGpzODKfQrwhS5C18js3bkDmmA9QbRCT0ewZZV/4JMw==","repository":{"url":"git+https://github.com/PseudoSky/adhd.git","type":"git"},"_npmVersion":"11.6.2","description":"Generic hybrid retrieval ranker — fuses vector similarity + text relevance signals (mechanism-agnostic: textScore / vecScore) via normalized RRF/max-score fusion. SearchBackend interface decouples ranking logic from storage. StoreSearchBackend wires Vecto","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@adhd/sox-graph-store":"^0.9.0","@adhd/sox-vector-store":"^0.6.0","@adhd/sox-embedding-provider":"^0.4.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@adhd/sox-store-adapter":"^0.8.0"},"_npmOperationalInternal":{"tmp":"tmp/sox-hybrid-search_0.4.0_1787933934717_0.08168899539612906","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@adhd/sox-hybrid-search","version":"0.4.1","keywords":["search","hybrid","vector","ranking","retrieval","typescript"],"license":"MIT","_id":"@adhd/sox-hybrid-search@0.4.1","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"homepage":"https://github.com/PseudoSky/adhd","bugs":{"url":"https://github.com/PseudoSky/adhd/issues"},"sox":{"area":"data","group":"search","concerns":["SearchBackend interface (mechanism-agnostic: textScore / vecScore, not BM25 / cosine)","StoreSearchBackend — DI constructor (VectorBackend, GraphBackend)","hybrid fusion: normalize-before-combine (min_max / L2 / z_score)","degrade-to-text when vec signal absent ([def:degrade-to-text-only])","pure fuse() + normalize() exports (no storage dep)","explain mode (signal-level breakdown only — not field-level)","SchemaAdapter is SQLite-internal (NOT exported — filters wired into StoreSearchBackend)","vector-channel filter parity (BL-294) — StoreSearchBackend resolves query.filters through graph.queryNodes() and constrains vec.knn() to the matching id set, so namespace/kind/topic/projectPath/agentId filters scope BOTH channels identically, not just the text channel","degrade signal (BL-294) — SearchBackend.search() results carry an additive degraded?: { unsupportedFilters: string[] } field whenever query.filters included a key with no NodeFilter mapping; surfaced unconditionally on SearchResult, not gated behind explain"],"invariants":["SearchBackend.search() degrades to text-only when query.vec is absent, degrades to vec-only when query.text is absent — never errors on a missing signal","scores are normalized BEFORE combining (never raw scale-blind additive merge)","textScore / vecScore are mechanism-agnostic names — BM25 / cosine are implementation details inside backends (never surfaced through SearchBackend interface)","SchemaAdapter is an internal SQLite concern — NOT exported; MCP handlers pass raw filters via SearchQuery.filters; StoreSearchBackend resolves them internally","fuse() weights must be multiplicative (field boosting), never additive (scale-blind)","a NodeFilter that matches zero nodes yields zero vector candidates — never an unfiltered knn() fallback (an empty VecFilter.ids means \"no filter\" to the vector backend, not \"match nothing\")"],"entrypoints":["dist/index.js"]},"dist":{"shasum":"c2def6ea976600d39b2e23e5431fed0e2a510df7","tarball":"https://registry.npmjs.org/@adhd/sox-hybrid-search/-/sox-hybrid-search-0.4.1.tgz","fileCount":15,"integrity":"sha512-C88VrsmF9+nZf+Zu8B39MLcYXZOvVSveqQf9i+2Ub8mrbYLRVQfT38zpZUprVbj3TU2qtm/7L83bq0/aFtTMWw==","signatures":[{"sig":"MEUCIAjegZ1NOk2UFncrvUH3ThmdtbfFYsYO52NFE8irSkUbAiEA+klB5AwmSn70MyQ89FdEpEKcTtV51YXOc/2f6vIDQkQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":92833},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"b94dfb4ca6b570ebe54e28ad7861311aad6e4c49","private":false,"_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"deprecated":"broken: shipped unrewritten workspace:^ deps — use 0.4.2","repository":{"url":"git+https://github.com/PseudoSky/adhd.git","type":"git"},"_npmVersion":"11.6.2","description":"Generic hybrid retrieval ranker — fuses vector similarity + text relevance signals (mechanism-agnostic: textScore / vecScore) via normalized RRF/max-score fusion. SearchBackend interface decouples ranking logic from storage. StoreSearchBackend wires Vecto","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@adhd/sox-graph-store":"workspace:^","@adhd/sox-vector-store":"workspace:^","@adhd/sox-embedding-provider":"workspace:^"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@adhd/sox-store-adapter":"workspace:^"},"_npmOperationalInternal":{"tmp":"tmp/sox-hybrid-search_0.4.1_1787934394489_0.7932798426470851","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@adhd/sox-hybrid-search","version":"0.4.2","keywords":["search","hybrid","vector","ranking","retrieval","typescript"],"license":"MIT","_id":"@adhd/sox-hybrid-search@0.4.2","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"homepage":"https://github.com/PseudoSky/adhd","bugs":{"url":"https://github.com/PseudoSky/adhd/issues"},"sox":{"area":"data","group":"search","concerns":["SearchBackend interface (mechanism-agnostic: textScore / vecScore, not BM25 / cosine)","StoreSearchBackend — DI constructor (VectorBackend, GraphBackend)","hybrid fusion: normalize-before-combine (min_max / L2 / z_score)","degrade-to-text when vec signal absent ([def:degrade-to-text-only])","pure fuse() + normalize() exports (no storage dep)","explain mode (signal-level breakdown only — not field-level)","SchemaAdapter is SQLite-internal (NOT exported — filters wired into StoreSearchBackend)","vector-channel filter parity (BL-294) — StoreSearchBackend resolves query.filters through graph.queryNodes() and constrains vec.knn() to the matching id set, so namespace/kind/topic/projectPath/agentId filters scope BOTH channels identically, not just the text channel","degrade signal (BL-294) — SearchBackend.search() results carry an additive degraded?: { unsupportedFilters: string[] } field whenever query.filters included a key with no NodeFilter mapping; surfaced unconditionally on SearchResult, not gated behind explain"],"invariants":["SearchBackend.search() degrades to text-only when query.vec is absent, degrades to vec-only when query.text is absent — never errors on a missing signal","scores are normalized BEFORE combining (never raw scale-blind additive merge)","textScore / vecScore are mechanism-agnostic names — BM25 / cosine are implementation details inside backends (never surfaced through SearchBackend interface)","SchemaAdapter is an internal SQLite concern — NOT exported; MCP handlers pass raw filters via SearchQuery.filters; StoreSearchBackend resolves them internally","fuse() weights must be multiplicative (field boosting), never additive (scale-blind)","a NodeFilter that matches zero nodes yields zero vector candidates — never an unfiltered knn() fallback (an empty VecFilter.ids means \"no filter\" to the vector backend, not \"match nothing\")"],"entrypoints":["dist/index.js"]},"dist":{"shasum":"f214a4d6be378a71ccffe8a44b8cb55585af9e42","tarball":"https://registry.npmjs.org/@adhd/sox-hybrid-search/-/sox-hybrid-search-0.4.2.tgz","fileCount":16,"integrity":"sha512-xX4M2PPqOBvml3l4r0TiDave8OERx3nQ1Gr6BvQQhAf6htcKv4c2fX0sCEIcfgEB8GJ6Yoiw25FOeQ4vOi+csA==","signatures":[{"sig":"MEQCICKLQFMP52vboEXr7dUnQBufRMS5PsY/SI6fvooIEFneAiB2xq/+B7woHVja4AMXJPt5IZh7YOPFsB+SFmiI1PTEkg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":93848},"main":"./dist/index.js","type":"module","_from":"file:adhd-sox-hybrid-search-0.4.2.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"private":false,"_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_resolved":"/private/var/folders/yg/cfczgtx54bzfh74lx2_mv0z80000gp/T/12247d29e6695507ec5d33e07d32d82c/adhd-sox-hybrid-search-0.4.2.tgz","_integrity":"sha512-xX4M2PPqOBvml3l4r0TiDave8OERx3nQ1Gr6BvQQhAf6htcKv4c2fX0sCEIcfgEB8GJ6Yoiw25FOeQ4vOi+csA==","repository":{"url":"git+https://github.com/PseudoSky/adhd.git","type":"git"},"_npmVersion":"11.6.2","description":"Generic hybrid retrieval ranker — fuses vector similarity + text relevance signals (mechanism-agnostic: textScore / vecScore) via normalized RRF/max-score fusion. SearchBackend interface decouples ranking logic from storage. StoreSearchBackend wires Vecto","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@adhd/sox-graph-store":"^0.9.0","@adhd/sox-vector-store":"^0.6.0","@adhd/sox-embedding-provider":"^0.4.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@adhd/sox-store-adapter":"^0.8.0"},"_npmOperationalInternal":{"tmp":"tmp/sox-hybrid-search_0.4.2_1787935974131_0.005470688360854403","host":"s3://npm-registry-packages-npm-production"}},"0.4.3":{"name":"@adhd/sox-hybrid-search","version":"0.4.3","keywords":["search","hybrid","vector","ranking","retrieval","typescript"],"license":"MIT","_id":"@adhd/sox-hybrid-search@0.4.3","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"homepage":"https://github.com/PseudoSky/adhd","bugs":{"url":"https://github.com/PseudoSky/adhd/issues"},"sox":{"area":"data","group":"search","concerns":["SearchBackend interface (mechanism-agnostic: textScore / vecScore, not BM25 / cosine)","StoreSearchBackend — DI constructor (VectorBackend, GraphBackend)","hybrid fusion: normalize-before-combine (min_max / L2 / z_score)","degrade-to-text when vec signal absent ([def:degrade-to-text-only])","pure fuse() + normalize() exports (no storage dep)","explain mode (signal-level breakdown only — not field-level)","SchemaAdapter is SQLite-internal (NOT exported — filters wired into StoreSearchBackend)","vector-channel filter parity (BL-294) — StoreSearchBackend resolves query.filters through graph.queryNodes() and constrains vec.knn() to the matching id set, so namespace/kind/topic/projectPath/agentId filters scope BOTH channels identically, not just the text channel","degrade signal (BL-294) — SearchBackend.search() results carry an additive degraded?: { unsupportedFilters: string[] } field whenever query.filters included a key with no NodeFilter mapping; surfaced unconditionally on SearchResult, not gated behind explain"],"invariants":["SearchBackend.search() degrades to text-only when query.vec is absent, degrades to vec-only when query.text is absent — never errors on a missing signal","scores are normalized BEFORE combining (never raw scale-blind additive merge)","textScore / vecScore are mechanism-agnostic names — BM25 / cosine are implementation details inside backends (never surfaced through SearchBackend interface)","SchemaAdapter is an internal SQLite concern — NOT exported; MCP handlers pass raw filters via SearchQuery.filters; StoreSearchBackend resolves them internally","fuse() weights must be multiplicative (field boosting), never additive (scale-blind)","a NodeFilter that matches zero nodes yields zero vector candidates — never an unfiltered knn() fallback (an empty VecFilter.ids means \"no filter\" to the vector backend, not \"match nothing\")"],"entrypoints":["dist/index.js"]},"dist":{"shasum":"95d7b67d069c70ffd23438247ced9dc58d6aa2cc","tarball":"https://registry.npmjs.org/@adhd/sox-hybrid-search/-/sox-hybrid-search-0.4.3.tgz","fileCount":16,"integrity":"sha512-9sM/7eZIfR8qF7e77dSZE07wBbCaQeQs6R2UiSZgq1Ju7hqjCfw2+C6AXSuHlPPKZ5xEk7wXrLH3Z62HXiwFAg==","signatures":[{"sig":"MEQCIA/4blbLcFAJXF//ZmRjJXQXbC0U6SizrkQdPcVrxwGPAiBHD85WdGYxqIeIxRqpucs61LixZSnBGA2fbI8h//lIgw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":101265},"main":"./dist/index.js","type":"module","_from":"file:adhd-sox-hybrid-search-0.4.3.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"private":false,"_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_resolved":"/private/var/folders/yg/cfczgtx54bzfh74lx2_mv0z80000gp/T/4deef03e63bcfc61149f5aa004cc051e/adhd-sox-hybrid-search-0.4.3.tgz","_integrity":"sha512-9sM/7eZIfR8qF7e77dSZE07wBbCaQeQs6R2UiSZgq1Ju7hqjCfw2+C6AXSuHlPPKZ5xEk7wXrLH3Z62HXiwFAg==","repository":{"url":"git+https://github.com/PseudoSky/adhd.git","type":"git"},"_npmVersion":"11.6.2","description":"Generic hybrid retrieval ranker — fuses vector similarity + text relevance signals (mechanism-agnostic: textScore / vecScore) via normalized RRF/max-score fusion. SearchBackend interface decouples ranking logic from storage. StoreSearchBackend wires Vecto","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@adhd/sox-graph-store":"^0.9.2","@adhd/sox-vector-store":"^0.6.1","@adhd/sox-embedding-provider":"^0.5.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@adhd/sox-store-adapter":"^0.9.0"},"_npmOperationalInternal":{"tmp":"tmp/sox-hybrid-search_0.4.3_1788566483296_0.5810154713912397","host":"s3://npm-registry-packages-npm-production"}},"0.4.4":{"name":"@adhd/sox-hybrid-search","version":"0.4.4","keywords":["search","hybrid","vector","ranking","retrieval","typescript"],"license":"MIT","_id":"@adhd/sox-hybrid-search@0.4.4","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"homepage":"https://github.com/PseudoSky/adhd","bugs":{"url":"https://github.com/PseudoSky/adhd/issues"},"sox":{"area":"data","group":"search","concerns":["SearchBackend interface (mechanism-agnostic: textScore / vecScore, not BM25 / cosine)","StoreSearchBackend — DI constructor (VectorBackend, GraphBackend)","hybrid fusion: normalize-before-combine (min_max / L2 / z_score)","degrade-to-text when vec signal absent ([def:degrade-to-text-only])","pure fuse() + normalize() exports (no storage dep)","explain mode (signal-level breakdown only — not field-level)","SchemaAdapter is SQLite-internal (NOT exported — filters wired into StoreSearchBackend)","vector-channel filter parity (BL-294) — StoreSearchBackend resolves query.filters through graph.queryNodes() and constrains vec.knn() to the matching id set, so namespace/kind/topic/projectPath/agentId filters scope BOTH channels identically, not just the text channel","degrade signal (BL-294) — SearchBackend.search() results carry an additive degraded?: { unsupportedFilters: string[] } field whenever query.filters included a key with no NodeFilter mapping; surfaced unconditionally on SearchResult, not gated behind explain"],"invariants":["SearchBackend.search() degrades to text-only when query.vec is absent, degrades to vec-only when query.text is absent — never errors on a missing signal","scores are normalized BEFORE combining (never raw scale-blind additive merge)","textScore / vecScore are mechanism-agnostic names — BM25 / cosine are implementation details inside backends (never surfaced through SearchBackend interface)","SchemaAdapter is an internal SQLite concern — NOT exported; MCP handlers pass raw filters via SearchQuery.filters; StoreSearchBackend resolves them internally","fuse() weights must be multiplicative (field boosting), never additive (scale-blind)","a NodeFilter that matches zero nodes yields zero vector candidates — never an unfiltered knn() fallback (an empty VecFilter.ids means \"no filter\" to the vector backend, not \"match nothing\")"],"entrypoints":["dist/index.js"]},"dist":{"shasum":"f4a8114093109e2caab363e0d5ab66f076b8e064","tarball":"https://registry.npmjs.org/@adhd/sox-hybrid-search/-/sox-hybrid-search-0.4.4.tgz","fileCount":16,"integrity":"sha512-Qq3CXI7yx3LtroLIeMnb3qCL8UzhTrZlcpcs4TBVHAmSDW4liCtpgJZDbkMs5bVdCkhAYJgW+N/jbQ/F0gVPdg==","signatures":[{"sig":"MEUCIDVLjtNpyUx6elKpLsqsQt6RqBEi3WjloLncgxZHnHl1AiEA2he5SFATUwrfpCXPf2rdbWscVCvb/xSIJuV3Jm9wIQI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCICtW6nTbGtIKt5yTTx9jhiEz1Y/YPANyXVk5EIR69idpAiBScxo34T5stXxgghG+jW4TNKhPllruMqlbJAh0whHj3A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":101374},"main":"./dist/index.js","type":"module","_from":"file:adhd-sox-hybrid-search-0.4.4.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"private":false,"_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_resolved":"/private/var/folders/yg/cfczgtx54bzfh74lx2_mv0z80000gp/T/3cae730d7860c7d866cb66634e57d6d3/adhd-sox-hybrid-search-0.4.4.tgz","_integrity":"sha512-Qq3CXI7yx3LtroLIeMnb3qCL8UzhTrZlcpcs4TBVHAmSDW4liCtpgJZDbkMs5bVdCkhAYJgW+N/jbQ/F0gVPdg==","repository":{"url":"git+https://github.com/PseudoSky/adhd.git","type":"git"},"_npmVersion":"11.6.2","description":"Generic hybrid retrieval ranker — fuses vector similarity + text relevance signals (mechanism-agnostic: textScore / vecScore) via normalized RRF/max-score fusion. SearchBackend interface decouples ranking logic from storage. StoreSearchBackend wires Vecto","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@adhd/sox-graph-store":"^0.9.2","@adhd/sox-vector-store":"^0.6.1","@adhd/sox-embedding-provider":"^0.5.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@adhd/sox-store-adapter":"^0.9.2"},"_npmOperationalInternal":{"tmp":"tmp/sox-hybrid-search_0.4.4_1789422526227_0.7778623505915945","host":"s3://npm-registry-packages-npm-production"}},"0.4.5":{"name":"@adhd/sox-hybrid-search","version":"0.4.5","keywords":["search","hybrid","vector","ranking","retrieval","typescript"],"license":"MIT","_id":"@adhd/sox-hybrid-search@0.4.5","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"homepage":"https://github.com/PseudoSky/adhd","bugs":{"url":"https://github.com/PseudoSky/adhd/issues"},"sox":{"area":"data","group":"search","concerns":["SearchBackend interface (mechanism-agnostic: textScore / vecScore, not BM25 / cosine)","StoreSearchBackend — DI constructor (VectorBackend, GraphBackend)","hybrid fusion: normalize-before-combine (min_max / L2 / z_score)","degrade-to-text when vec signal absent ([def:degrade-to-text-only])","pure fuse() + normalize() exports (no storage dep)","explain mode (signal-level breakdown only — not field-level)","SchemaAdapter is SQLite-internal (NOT exported — filters wired into StoreSearchBackend)","vector-channel filter parity (BL-294) — StoreSearchBackend resolves query.filters through graph.queryNodes() and constrains vec.knn() to the matching id set, so namespace/kind/topic/projectPath/agentId filters scope BOTH channels identically, not just the text channel","degrade signal (BL-294) — SearchBackend.search() results carry an additive degraded?: { unsupportedFilters: string[] } field whenever query.filters included a key with no NodeFilter mapping; surfaced unconditionally on SearchResult, not gated behind explain"],"invariants":["SearchBackend.search() degrades to text-only when query.vec is absent, degrades to vec-only when query.text is absent — never errors on a missing signal","scores are normalized BEFORE combining (never raw scale-blind additive merge)","textScore / vecScore are mechanism-agnostic names — BM25 / cosine are implementation details inside backends (never surfaced through SearchBackend interface)","SchemaAdapter is an internal SQLite concern — NOT exported; MCP handlers pass raw filters via SearchQuery.filters; StoreSearchBackend resolves them internally","fuse() weights must be multiplicative (field boosting), never additive (scale-blind)","a NodeFilter that matches zero nodes yields zero vector candidates — never an unfiltered knn() fallback (an empty VecFilter.ids means \"no filter\" to the vector backend, not \"match nothing\")"],"entrypoints":["dist/index.js"]},"dist":{"shasum":"55327495fd11469448714b554afd56e19ac3da0b","tarball":"https://registry.npmjs.org/@adhd/sox-hybrid-search/-/sox-hybrid-search-0.4.5.tgz","fileCount":16,"integrity":"sha512-zYJary9gZsTpj16V0dm0IlVKBLgfwP0QEmX0ZOUAncPJj7LZDIZ1f7N9WhemhE3aVILDvEDqzBk9iKhvtzOByg==","signatures":[{"sig":"MEQCIFIgvzWfnSl572D7vpDDuSdYcejHM5rfNnPJ92WC4rbFAiBTk1uS6eX3pWijpW4CxGbF9PPuJXUHizoU99w4TiJ08Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDQd1d8d0Cc+LLMkmmW879/GOPUZ0nCyUQQmsfHBXFRUAIhAIbzd2ii48CFxRegiBvymPicLGqTPgAQcrhC991X+VPY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":101375},"main":"./dist/index.js","type":"module","_from":"file:adhd-sox-hybrid-search-0.4.5.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"private":false,"_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_resolved":"/private/var/folders/yg/cfczgtx54bzfh74lx2_mv0z80000gp/T/894f609b13ffc3b35967073966080dd5/adhd-sox-hybrid-search-0.4.5.tgz","_integrity":"sha512-zYJary9gZsTpj16V0dm0IlVKBLgfwP0QEmX0ZOUAncPJj7LZDIZ1f7N9WhemhE3aVILDvEDqzBk9iKhvtzOByg==","repository":{"url":"git+https://github.com/PseudoSky/adhd.git","type":"git"},"_npmVersion":"11.6.2","description":"Generic hybrid retrieval ranker — fuses vector similarity + text relevance signals (mechanism-agnostic: textScore / vecScore) via normalized RRF/max-score fusion. SearchBackend interface decouples ranking logic from storage. StoreSearchBackend wires Vecto","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@adhd/sox-graph-store":"^0.10.0","@adhd/sox-vector-store":"^0.6.1","@adhd/sox-embedding-provider":"^0.5.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@adhd/sox-store-adapter":"^0.9.2"},"_npmOperationalInternal":{"tmp":"tmp/sox-hybrid-search_0.4.5_1789655040604_0.057203651548959566","host":"s3://npm-registry-packages-npm-production"}},"0.4.6":{"name":"@adhd/sox-hybrid-search","version":"0.4.6","keywords":["search","hybrid","vector","ranking","retrieval","typescript"],"license":"MIT","_id":"@adhd/sox-hybrid-search@0.4.6","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"homepage":"https://github.com/PseudoSky/adhd","bugs":{"url":"https://github.com/PseudoSky/adhd/issues"},"sox":{"area":"data","group":"search","concerns":["SearchBackend interface (mechanism-agnostic: textScore / vecScore, not BM25 / cosine)","StoreSearchBackend — DI constructor (VectorBackend, GraphBackend)","hybrid fusion: normalize-before-combine (min_max / L2 / z_score)","degrade-to-text when vec signal absent ([def:degrade-to-text-only])","pure fuse() + normalize() exports (no storage dep)","explain mode (signal-level breakdown only — not field-level)","SchemaAdapter is SQLite-internal (NOT exported — filters wired into StoreSearchBackend)","vector-channel filter parity (BL-294) — StoreSearchBackend resolves query.filters through graph.queryNodes() and constrains vec.knn() to the matching id set, so namespace/kind/topic/projectPath/agentId filters scope BOTH channels identically, not just the text channel","degrade signal (BL-294) — SearchBackend.search() results carry an additive degraded?: { unsupportedFilters: string[] } field whenever query.filters included a key with no NodeFilter mapping; surfaced unconditionally on SearchResult, not gated behind explain"],"invariants":["SearchBackend.search() degrades to text-only when query.vec is absent, degrades to vec-only when query.text is absent — never errors on a missing signal","scores are normalized BEFORE combining (never raw scale-blind additive merge)","textScore / vecScore are mechanism-agnostic names — BM25 / cosine are implementation details inside backends (never surfaced through SearchBackend interface)","SchemaAdapter is an internal SQLite concern — NOT exported; MCP handlers pass raw filters via SearchQuery.filters; StoreSearchBackend resolves them internally","fuse() weights must be multiplicative (field boosting), never additive (scale-blind)","a NodeFilter that matches zero nodes yields zero vector candidates — never an unfiltered knn() fallback (a PRESENT-BUT-EMPTY VecFilter.ids means \"match nothing\", never \"no filter\": a scope that resolves to zero candidates yields zero results at every layer — BUG-032 / ADR-0017)"],"entrypoints":["dist/index.js"]},"dist":{"shasum":"ff90996bd5e0cb9216f72bae18a0135c2ed9f612","tarball":"https://registry.npmjs.org/@adhd/sox-hybrid-search/-/sox-hybrid-search-0.4.6.tgz","fileCount":16,"integrity":"sha512-WFbJ1/rkdMGvOs43BIVHJaSIoqo9jUvk13XnWKt1XsQfN3zbkIxTITY+1S/3VXVV7AacU3+takxcj269tEPokQ==","signatures":[{"sig":"MEQCIE1eQ5u3XmscG1Ho0JruXq8X9qKvG41xcd7ipZO7dntnAiBgLqcI6QGObGX++voZ37+M0g2nY9WCCE2gNUbo4ok1gA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIAvbAmV1C9mY6PXbdF297zCC5BSiMIvF5XLCgyGnyfE6AiEAgjd94/WaiHlQKp0y/2BvYH5LcBdbY/3IFbcqcyjAZJ8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":104681},"main":"./dist/index.js","type":"module","_from":"file:adhd-sox-hybrid-search-0.4.6.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"private":false,"_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_resolved":"/private/var/folders/yg/cfczgtx54bzfh74lx2_mv0z80000gp/T/aef64a685c3fd461499db8cbfe5171ba/adhd-sox-hybrid-search-0.4.6.tgz","_integrity":"sha512-WFbJ1/rkdMGvOs43BIVHJaSIoqo9jUvk13XnWKt1XsQfN3zbkIxTITY+1S/3VXVV7AacU3+takxcj269tEPokQ==","repository":{"url":"git+https://github.com/PseudoSky/adhd.git","type":"git"},"_npmVersion":"11.6.2","description":"Generic hybrid retrieval ranker — fuses vector similarity + text relevance signals (mechanism-agnostic: textScore / vecScore) via normalized RRF/max-score fusion. SearchBackend interface decouples ranking logic from storage. StoreSearchBackend wires Vecto","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@adhd/sox-graph-store":"^0.10.1","@adhd/sox-vector-store":"^0.6.2","@adhd/sox-embedding-provider":"^0.5.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@adhd/sox-store-adapter":"^0.9.2"},"_npmOperationalInternal":{"tmp":"tmp/sox-hybrid-search_0.4.6_1790047970297_0.8534183282783034","host":"s3://npm-registry-packages-npm-production"}},"0.4.7":{"name":"@adhd/sox-hybrid-search","version":"0.4.7","keywords":["search","hybrid","vector","ranking","retrieval","typescript"],"license":"MIT","_id":"@adhd/sox-hybrid-search@0.4.7","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"homepage":"https://github.com/PseudoSky/adhd","bugs":{"url":"https://github.com/PseudoSky/adhd/issues"},"sox":{"area":"data","group":"search","concerns":["SearchBackend interface (mechanism-agnostic: textScore / vecScore, not BM25 / cosine)","StoreSearchBackend — DI constructor (VectorBackend, GraphBackend)","hybrid fusion: normalize-before-combine (min_max / L2 / z_score)","degrade-to-text when vec signal absent ([def:degrade-to-text-only])","pure fuse() + normalize() exports (no storage dep)","explain mode (signal-level breakdown only — not field-level)","SchemaAdapter is SQLite-internal (NOT exported — filters wired into StoreSearchBackend)","vector-channel filter parity (BL-294) — StoreSearchBackend resolves query.filters through graph.queryNodes() and constrains vec.knn() to the matching id set, so namespace/kind/topic/projectPath/agentId filters scope BOTH channels identically, not just the text channel","degrade signal (BL-294) — SearchBackend.search() results carry an additive degraded?: { unsupportedFilters: string[] } field whenever query.filters included a key with no NodeFilter mapping; surfaced unconditionally on SearchResult, not gated behind explain"],"invariants":["SearchBackend.search() degrades to text-only when query.vec is absent, degrades to vec-only when query.text is absent — never errors on a missing signal","scores are normalized BEFORE combining (never raw scale-blind additive merge)","textScore / vecScore are mechanism-agnostic names — BM25 / cosine are implementation details inside backends (never surfaced through SearchBackend interface)","SchemaAdapter is an internal SQLite concern — NOT exported; MCP handlers pass raw filters via SearchQuery.filters; StoreSearchBackend resolves them internally","fuse() weights must be multiplicative (field boosting), never additive (scale-blind)","a NodeFilter that matches zero nodes yields zero vector candidates — never an unfiltered knn() fallback (a PRESENT-BUT-EMPTY VecFilter.ids means \"match nothing\", never \"no filter\": a scope that resolves to zero candidates yields zero results at every layer — BUG-032 / ADR-0017)"],"entrypoints":["dist/index.js"]},"dist":{"shasum":"01566acddf22047103a45e9d7d070193f5836afe","tarball":"https://registry.npmjs.org/@adhd/sox-hybrid-search/-/sox-hybrid-search-0.4.7.tgz","fileCount":16,"integrity":"sha512-SryFf4qCLT1Qcm8CorWkQa2K0f2VEo5yJV3064oekEG2p5bddSy66b2rgAGMXmGB2ZOUPh9RFGVOZOBXy1wXtQ==","signatures":[{"sig":"MEYCIQCd1hUabY2napGGYSNgLDVtv9/04HmYd1Nv5A1lEylMKwIhANwXoVqEaLHK7u9A+j4JbqIJ7ltFc3cMnRHqWhJq6Sd4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCsIfysJTi96FP//RcctXIFKlTeycqW3uJWa2ckvYcpDAIgHxcB9lMoN2CXrbsPjJnECVyJDCbriPIh8eCj3pKbaFI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":104681},"main":"./dist/index.js","type":"module","_from":"file:adhd-sox-hybrid-search-0.4.7.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"private":false,"_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_resolved":"/private/var/folders/yg/cfczgtx54bzfh74lx2_mv0z80000gp/T/7116eff6bda0cda7c8efcbeb45626815/adhd-sox-hybrid-search-0.4.7.tgz","_integrity":"sha512-SryFf4qCLT1Qcm8CorWkQa2K0f2VEo5yJV3064oekEG2p5bddSy66b2rgAGMXmGB2ZOUPh9RFGVOZOBXy1wXtQ==","repository":{"url":"git+https://github.com/PseudoSky/adhd.git","type":"git"},"_npmVersion":"11.6.2","description":"Generic hybrid retrieval ranker — fuses vector similarity + text relevance signals (mechanism-agnostic: textScore / vecScore) via normalized RRF/max-score fusion. SearchBackend interface decouples ranking logic from storage. StoreSearchBackend wires Vecto","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@adhd/sox-graph-store":"^0.11.0","@adhd/sox-vector-store":"^0.6.2","@adhd/sox-embedding-provider":"^0.5.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@adhd/sox-store-adapter":"^0.9.2"},"_npmOperationalInternal":{"tmp":"tmp/sox-hybrid-search_0.4.7_1790054201575_0.47526179890572484","host":"s3://npm-registry-packages-npm-production"}},"0.4.8":{"name":"@adhd/sox-hybrid-search","version":"0.4.8","keywords":["search","hybrid","vector","ranking","retrieval","typescript"],"license":"MIT","_id":"@adhd/sox-hybrid-search@0.4.8","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"homepage":"https://github.com/PseudoSky/adhd","bugs":{"url":"https://github.com/PseudoSky/adhd/issues"},"sox":{"area":"data","group":"search","concerns":["SearchBackend interface (mechanism-agnostic: textScore / vecScore, not BM25 / cosine)","StoreSearchBackend — DI constructor (VectorBackend, GraphBackend)","hybrid fusion: normalize-before-combine (min_max / L2 / z_score)","degrade-to-text when vec signal absent ([def:degrade-to-text-only])","pure fuse() + normalize() exports (no storage dep)","explain mode (signal-level breakdown only — not field-level)","SchemaAdapter is SQLite-internal (NOT exported — filters wired into StoreSearchBackend)","vector-channel filter parity (BL-294) — StoreSearchBackend resolves query.filters through graph.queryNodes() and constrains vec.knn() to the matching id set, so namespace/kind/topic/projectPath/agentId filters scope BOTH channels identically, not just the text channel","degrade signal (BL-294) — SearchBackend.search() results carry an additive degraded?: { unsupportedFilters: string[] } field whenever query.filters included a key with no NodeFilter mapping; surfaced unconditionally on SearchResult, not gated behind explain"],"invariants":["SearchBackend.search() degrades to text-only when query.vec is absent, degrades to vec-only when query.text is absent — never errors on a missing signal","scores are normalized BEFORE combining (never raw scale-blind additive merge)","textScore / vecScore are mechanism-agnostic names — BM25 / cosine are implementation details inside backends (never surfaced through SearchBackend interface)","SchemaAdapter is an internal SQLite concern — NOT exported; MCP handlers pass raw filters via SearchQuery.filters; StoreSearchBackend resolves them internally","fuse() weights must be multiplicative (field boosting), never additive (scale-blind)","a NodeFilter that matches zero nodes yields zero vector candidates — never an unfiltered knn() fallback (a PRESENT-BUT-EMPTY VecFilter.ids means \"match nothing\", never \"no filter\": a scope that resolves to zero candidates yields zero results at every layer — BUG-032 / ADR-0017)"],"entrypoints":["dist/index.js"]},"dist":{"shasum":"e87353df0820211548ff23344882d38ee6f1b642","tarball":"https://registry.npmjs.org/@adhd/sox-hybrid-search/-/sox-hybrid-search-0.4.8.tgz","fileCount":16,"integrity":"sha512-xfuHKqoVW7rUIVChZZ6P8Iu97RtO7ZifX7RCaaIus22mr/PgK70gIuFi5AS1Gn11tviMnjQF9LFFN9sdYZRJew==","signatures":[{"sig":"MEYCIQCLCSMgIifvB9oCaG3bzilN0AyVt3rS6HlkYDf0ZcAu4AIhAIzAfINGsXZITrmM84fhppRszHpWojNwDIS/Rr1/ctsx","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQD12Z5c4o0jmVHihVZUSgdXS68OIkYwyk9YbMtiGxy/BAIge8UA+hbdjjN0bhEiABuI/L0Nb4dDPXsw3aneAilmZP8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":104681},"main":"./dist/index.js","type":"module","_from":"file:adhd-sox-hybrid-search-0.4.8.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"private":false,"_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_resolved":"/private/var/folders/yg/cfczgtx54bzfh74lx2_mv0z80000gp/T/f9b1035e450ad312192ae30b9371639d/adhd-sox-hybrid-search-0.4.8.tgz","_integrity":"sha512-xfuHKqoVW7rUIVChZZ6P8Iu97RtO7ZifX7RCaaIus22mr/PgK70gIuFi5AS1Gn11tviMnjQF9LFFN9sdYZRJew==","repository":{"url":"git+https://github.com/PseudoSky/adhd.git","type":"git"},"_npmVersion":"11.6.2","description":"Generic hybrid retrieval ranker — fuses vector similarity + text relevance signals (mechanism-agnostic: textScore / vecScore) via normalized RRF/max-score fusion. SearchBackend interface decouples ranking logic from storage. StoreSearchBackend wires Vecto","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@adhd/sox-graph-store":"^0.11.0","@adhd/sox-vector-store":"^0.7.0","@adhd/sox-embedding-provider":"^0.5.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@adhd/sox-store-adapter":"^0.9.2"},"_npmOperationalInternal":{"tmp":"tmp/sox-hybrid-search_0.4.8_1790088177036_0.9446750341282653","host":"s3://npm-registry-packages-npm-production"}},"0.4.9":{"name":"@adhd/sox-hybrid-search","version":"0.4.9","keywords":["search","hybrid","vector","ranking","retrieval","typescript"],"license":"MIT","_id":"@adhd/sox-hybrid-search@0.4.9","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"homepage":"https://github.com/PseudoSky/adhd","bugs":{"url":"https://github.com/PseudoSky/adhd/issues"},"sox":{"area":"data","group":"search","concerns":["SearchBackend interface (mechanism-agnostic: textScore / vecScore, not BM25 / cosine)","StoreSearchBackend — DI constructor (VectorBackend, GraphBackend)","hybrid fusion: normalize-before-combine (min_max / L2 / z_score)","degrade-to-text when vec signal absent ([def:degrade-to-text-only])","pure fuse() + normalize() exports (no storage dep)","explain mode (signal-level breakdown only — not field-level)","SchemaAdapter is SQLite-internal (NOT exported — filters wired into StoreSearchBackend)","vector-channel filter parity (BL-294) — StoreSearchBackend resolves query.filters through graph.queryNodes() and constrains vec.knn() to the matching id set, so namespace/kind/topic/projectPath/agentId filters scope BOTH channels identically, not just the text channel","degrade signal (BL-294) — SearchBackend.search() results carry an additive degraded?: { unsupportedFilters: string[] } field whenever query.filters included a key with no NodeFilter mapping; surfaced unconditionally on SearchResult, not gated behind explain"],"invariants":["SearchBackend.search() degrades to text-only when query.vec is absent, degrades to vec-only when query.text is absent — never errors on a missing signal","scores are normalized BEFORE combining (never raw scale-blind additive merge)","textScore / vecScore are mechanism-agnostic names — BM25 / cosine are implementation details inside backends (never surfaced through SearchBackend interface)","SchemaAdapter is an internal SQLite concern — NOT exported; MCP handlers pass raw filters via SearchQuery.filters; StoreSearchBackend resolves them internally","fuse() weights must be multiplicative (field boosting), never additive (scale-blind)","a NodeFilter that matches zero nodes yields zero vector candidates — never an unfiltered knn() fallback (a PRESENT-BUT-EMPTY VecFilter.ids means \"match nothing\", never \"no filter\": a scope that resolves to zero candidates yields zero results at every layer — BUG-032 / ADR-0017)","the pure surface (fuse/normalize/rrfFuse) and StoreSearchBackend over injected backends resolve NEITHER @adhd/sox-vector-store NOR @adhd/sox-embedding-provider; the cross-encoder is the only path that resolves embedding-provider, and only on first createCrossEncoder() — both are optionalDependencies loaded lazily (ADR-0019)"],"entrypoints":["dist/index.js"],"externalConsumers":[{"name":"@adhd/backlog","note":"hard dep on hybrid-search; lists the heavy two as optionalDependencies","path":"entrypoint/backlog","repo":"/Users/nix/dev/node/adhd"}]},"dist":{"shasum":"7574cdd507c05d0166087b3734a307aa609b1b07","tarball":"https://registry.npmjs.org/@adhd/sox-hybrid-search/-/sox-hybrid-search-0.4.9.tgz","fileCount":16,"integrity":"sha512-fGizN/ayP/sFBGrTofhSkfpnB6kUGrDbU07MMJ56OqNtCN3hauIcDwZuzxxNXNJgeWEn4aW1O3J6omI/PE4JTQ==","signatures":[{"sig":"MEYCIQCC6A6R/5x59ypgm8sTF1pvjkx0hbffqnU59LL124kAZgIhAPW9PXGHK5DHztBwSkT+5FrMQj67r+alAMS0WoNAI7ey","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCk9Qn9MA7XgDibI6vbsp3iUshHmZ5kPBYRllaRfyN0jgIhAImkSxaGGd0pojA3K1KHIQ/2WNmZJqLS6g1m4RIgtVmD","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108434},"main":"./dist/index.js","type":"module","_from":"file:adhd-sox-hybrid-search-0.4.9.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"private":false,"_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_resolved":"/private/var/folders/yg/cfczgtx54bzfh74lx2_mv0z80000gp/T/3072eaf6cd66dfb58e124e379cf5e764/adhd-sox-hybrid-search-0.4.9.tgz","_integrity":"sha512-fGizN/ayP/sFBGrTofhSkfpnB6kUGrDbU07MMJ56OqNtCN3hauIcDwZuzxxNXNJgeWEn4aW1O3J6omI/PE4JTQ==","repository":{"url":"git+https://github.com/PseudoSky/adhd.git","type":"git"},"_npmVersion":"11.6.2","description":"Generic hybrid retrieval ranker — fuses vector similarity + text relevance signals (mechanism-agnostic: textScore / vecScore) via normalized RRF/max-score fusion. SearchBackend interface decouples ranking logic from storage. StoreSearchBackend wires Vecto","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@adhd/sox-graph-store":"^0.11.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@adhd/sox-store-adapter":"^0.9.2"},"optionalDependencies":{"@adhd/sox-vector-store":"^0.7.1","@adhd/sox-embedding-provider":"^0.5.1"},"_npmOperationalInternal":{"tmp":"tmp/sox-hybrid-search_0.4.9_1790113778743_0.6401336198377738","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@adhd/sox-hybrid-search","version":"0.5.0","keywords":["search","hybrid","vector","ranking","retrieval","typescript"],"license":"MIT","_id":"@adhd/sox-hybrid-search@0.5.0","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"homepage":"https://github.com/PseudoSky/adhd","bugs":{"url":"https://github.com/PseudoSky/adhd/issues"},"sox":{"area":"data","group":"search","concerns":["SearchBackend interface (mechanism-agnostic: textScore / vecScore, not BM25 / cosine)","StoreSearchBackend — DI constructor (VectorBackend, GraphBackend)","hybrid fusion: normalize-before-combine (min_max / L2 / z_score)","degrade-to-text when vec signal absent ([def:degrade-to-text-only])","pure fuse() + normalize() exports (no storage dep)","explain mode (signal-level breakdown only — not field-level)","SchemaAdapter is SQLite-internal (NOT exported — filters wired into StoreSearchBackend)","vector-channel filter parity (BL-294) — StoreSearchBackend resolves query.filters through graph.queryNodes() and constrains vec.knn() to the matching id set, so namespace/kind/topic/projectPath/agentId filters scope BOTH channels identically, not just the text channel","degrade signal (BL-294) — SearchBackend.search() results carry an additive degraded?: { unsupportedFilters: string[] } field whenever query.filters included a key with no NodeFilter mapping; surfaced unconditionally on SearchResult, not gated behind explain"],"invariants":["SearchBackend.search() degrades to text-only when query.vec is absent, degrades to vec-only when query.text is absent — never errors on a missing signal","scores are normalized BEFORE combining (never raw scale-blind additive merge)","textScore / vecScore are mechanism-agnostic names — BM25 / cosine are implementation details inside backends (never surfaced through SearchBackend interface)","SchemaAdapter is an internal SQLite concern — NOT exported; MCP handlers pass raw filters via SearchQuery.filters; StoreSearchBackend resolves them internally","fuse() weights must be multiplicative (field boosting), never additive (scale-blind)","a NodeFilter that matches zero nodes yields zero vector candidates — never an unfiltered knn() fallback (a PRESENT-BUT-EMPTY VecFilter.ids means \"match nothing\", never \"no filter\": a scope that resolves to zero candidates yields zero results at every layer — BUG-032 / ADR-0017)","the pure surface (fuse/normalize/rrfFuse) and StoreSearchBackend over injected backends resolve NEITHER @adhd/sox-vector-store NOR @adhd/sox-embedding-provider; the cross-encoder is the only path that resolves embedding-provider, and only on first createCrossEncoder() — both are optionalDependencies loaded lazily (ADR-0019)"],"entrypoints":["dist/index.js"],"externalConsumers":[{"name":"@adhd/backlog","note":"hard dep on hybrid-search; lists the heavy two as optionalDependencies","path":"entrypoint/backlog","repo":"/Users/nix/dev/node/adhd"}]},"dist":{"shasum":"4b11a017fea5bf5480036cbb4c8bb090ef314110","tarball":"https://registry.npmjs.org/@adhd/sox-hybrid-search/-/sox-hybrid-search-0.5.0.tgz","fileCount":16,"integrity":"sha512-bYTLj87xuPnyBcYg4RVSqJw3EpaQbdnY8dESJHIPrtR64C0zESqMuGwLtibQ9ogNywjZ8U7I3NNERXsgkibndA==","signatures":[{"sig":"MEUCIAkYK9UWbq84lyhYme0mxoahIiGEV9+Qpvx4xJxxymxQAiEA2ui6ZmkbFJYzjHfkvcydQrZSEGnBHrcQK7ihtpyCoyE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIB5xDupyRVjxjuBtZeuIMNf+L5g+uqo0O4k6A1wthiHxAiAOkjhZOMnVPHNRoqYEdMZd277LrHz+41MOhOf+HyxNMQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":109936},"main":"./dist/index.js","type":"module","_from":"file:adhd-sox-hybrid-search-0.5.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"private":false,"_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_resolved":"/private/var/folders/yg/cfczgtx54bzfh74lx2_mv0z80000gp/T/e16b1c0b51c000f209b231dbece8d1a9/adhd-sox-hybrid-search-0.5.0.tgz","_integrity":"sha512-bYTLj87xuPnyBcYg4RVSqJw3EpaQbdnY8dESJHIPrtR64C0zESqMuGwLtibQ9ogNywjZ8U7I3NNERXsgkibndA==","repository":{"url":"git+https://github.com/PseudoSky/adhd.git","type":"git"},"_npmVersion":"11.6.2","description":"Generic hybrid retrieval ranker — fuses vector similarity + text relevance signals (mechanism-agnostic: textScore / vecScore) via normalized RRF/max-score fusion. SearchBackend interface decouples ranking logic from storage. StoreSearchBackend wires Vecto","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@adhd/sox-graph-store":"^0.11.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@adhd/sox-store-adapter":"^0.10.0"},"optionalDependencies":{"@adhd/sox-vector-store":"^0.7.2","@adhd/sox-embedding-provider":"^0.6.0"},"_npmOperationalInternal":{"tmp":"tmp/sox-hybrid-search_0.5.0_1790391162958_0.4334333893811382","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"_id":"@adhd/sox-hybrid-search@0.6.0","sox":{"area":"data","group":"search","concerns":["SearchBackend interface (mechanism-agnostic: textScore / vecScore, not BM25 / cosine)","StoreSearchBackend — DI constructor (VectorBackend, GraphBackend)","hybrid fusion: normalize-before-combine (min_max / L2 / z_score)","degrade-to-text when vec signal absent ([def:degrade-to-text-only])","pure fuse() + normalize() exports (no storage dep)","explain mode (signal-level breakdown only — not field-level)","SchemaAdapter is SQLite-internal (NOT exported — filters wired into StoreSearchBackend)","vector-channel filter parity (BL-294) — StoreSearchBackend resolves query.filters through graph.queryNodes() and constrains vec.knn() to the matching id set, so namespace/kind/topic/projectPath/agentId filters scope BOTH channels identically, not just the text channel","degrade signal (BL-294) — SearchBackend.search() results carry an additive degraded?: { unsupportedFilters: string[] } field whenever query.filters included a key with no NodeFilter mapping; surfaced unconditionally on SearchResult, not gated behind explain"],"invariants":["SearchBackend.search() degrades to text-only when query.vec is absent, degrades to vec-only when query.text is absent — never errors on a missing signal","scores are normalized BEFORE combining (never raw scale-blind additive merge)","textScore / vecScore are mechanism-agnostic names — BM25 / cosine are implementation details inside backends (never surfaced through SearchBackend interface)","SchemaAdapter is an internal SQLite concern — NOT exported; MCP handlers pass raw filters via SearchQuery.filters; StoreSearchBackend resolves them internally","fuse() weights must be multiplicative (field boosting), never additive (scale-blind)","a NodeFilter that matches zero nodes yields zero vector candidates — never an unfiltered knn() fallback (a PRESENT-BUT-EMPTY VecFilter.ids means \"match nothing\", never \"no filter\": a scope that resolves to zero candidates yields zero results at every layer — BUG-032 / ADR-0017)","the pure surface (fuse/normalize/rrfFuse) and StoreSearchBackend over injected backends resolve NEITHER @adhd/sox-vector-store NOR @adhd/sox-embedding-provider; the cross-encoder is the only path that resolves embedding-provider, and only on first createCrossEncoder() — both are optionalDependencies loaded lazily (ADR-0019)"],"entrypoints":["dist/index.js"],"externalConsumers":[{"name":"@adhd/backlog","note":"hard dep on hybrid-search; lists the heavy two as optionalDependencies","path":"entrypoint/backlog","repo":"/Users/nix/dev/node/adhd"}]},"bugs":{"url":"https://github.com/PseudoSky/adhd/issues"},"dist":{"shasum":"cb9228f657aba7fe3613cea555ba1e415722558b","tarball":"https://registry.npmjs.org/@adhd/sox-hybrid-search/-/sox-hybrid-search-0.6.0.tgz","fileCount":16,"integrity":"sha512-83JwYlKCbxIWXV6JY10/nVE0XNbIhzBhksxZxAHsjGlqcBjL98EKdQOk2x5Wi2Gtsun9nYKqlVXunvyP1WSrzw==","signatures":[{"sig":"MEYCIQCOoF4Ibx5J/JjV2i6AmF9wwypA0oMtb+unw3uKa+fWnAIhALyx9zWSYPeTOZWzl+1lCaOuJVMhcOwmWXa+viHTK3t1","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQC2icxCgWTuejnyEDC3oTgO+Nk5ryfDxNfuhLx/1lEXMgIhAJ0TNoM/6F/Q41axhbSh66x6TmJOf4IOKjzsts44Y6j8"}],"unpackedSize":111719},"main":"./dist/index.js","name":"@adhd/sox-hybrid-search","type":"module","_from":"file:adhd-sox-hybrid-search-0.6.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"license":"MIT","private":false,"version":"0.6.0","_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"homepage":"https://github.com/PseudoSky/adhd","keywords":["search","hybrid","vector","ranking","retrieval","typescript"],"_resolved":"/private/var/folders/yg/cfczgtx54bzfh74lx2_mv0z80000gp/T/ce40780fe031c7dcf4bf69a0faed3f02/adhd-sox-hybrid-search-0.6.0.tgz","_integrity":"sha512-83JwYlKCbxIWXV6JY10/nVE0XNbIhzBhksxZxAHsjGlqcBjL98EKdQOk2x5Wi2Gtsun9nYKqlVXunvyP1WSrzw==","repository":{"url":"git+https://github.com/PseudoSky/adhd.git","type":"git"},"_npmVersion":"11.6.2","description":"Generic hybrid retrieval ranker — fuses vector similarity + text relevance signals (mechanism-agnostic: textScore / vecScore) via normalized RRF/max-score fusion. SearchBackend interface decouples ranking logic from storage. StoreSearchBackend wires Vecto","directories":{},"maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"_nodeVersion":"24.11.1","dependencies":{"@adhd/sox-graph-store":"^0.12.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@adhd/sox-store-adapter":"^0.11.0"},"optionalDependencies":{"@adhd/sox-vector-store":"^0.7.3","@adhd/sox-embedding-provider":"^0.6.2"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sox-hybrid-search_0.6.0_1790650390321_0.4714429450124138"}}},"time":{"created":"2026-07-16T22:02:17.509Z","modified":"2026-09-29T02:53:10.580Z","0.2.0":"2026-07-16T22:02:17.829Z","0.3.0":"2026-07-23T17:54:21.233Z","0.3.1":"2026-08-05T01:19:32.863Z","0.3.2":"2026-08-05T01:31:37.051Z","0.3.3":"2026-08-05T19:22:24.503Z","0.3.4":"2026-08-07T23:18:54.598Z","0.3.6":"2026-08-12T00:36:00.001Z","0.3.7":"2026-08-12T03:55:48.844Z","0.3.8":"2026-08-19T04:17:24.047Z","0.3.9":"2026-08-26T23:19:55.446Z","0.4.0":"2026-08-28T16:18:54.843Z","0.4.1":"2026-08-28T16:26:34.643Z","0.4.2":"2026-08-28T16:52:54.287Z","0.4.3":"2026-09-05T00:01:23.435Z","0.4.4":"2026-09-14T21:48:46.348Z","0.4.5":"2026-09-17T14:24:00.681Z","0.4.6":"2026-09-22T03:32:50.412Z","0.4.7":"2026-09-22T05:16:41.656Z","0.4.8":"2026-09-22T14:42:57.127Z","0.4.9":"2026-09-22T21:49:38.830Z","0.5.0":"2026-09-26T02:52:43.051Z","0.6.0":"2026-09-29T02:53:10.418Z"},"bugs":{"url":"https://github.com/PseudoSky/adhd/issues"},"license":"MIT","homepage":"https://github.com/PseudoSky/adhd","keywords":["search","hybrid","vector","ranking","retrieval","typescript"],"repository":{"url":"git+https://github.com/PseudoSky/adhd.git","type":"git"},"description":"Generic hybrid retrieval ranker — fuses vector similarity + text relevance signals (mechanism-agnostic: textScore / vecScore) via normalized RRF/max-score fusion. SearchBackend interface decouples ranking logic from storage. StoreSearchBackend wires Vecto","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"readme":"# @adhd/sox-hybrid-search\n\nA mechanism-agnostic hybrid retrieval ranker. It fuses a text-relevance signal and a\nvector-similarity signal into one ranked result list — via normalized min-max/L2/z-score fusion,\nor via reciprocal-rank fusion (RRF) across an arbitrary number of ranked signals — without ever\nnaming BM25 or cosine in its public interface. The `SearchBackend` interface decouples ranking\nlogic from storage; `StoreSearchBackend` wires a\n[`@adhd/sox-vector-store`](https://www.npmjs.com/package/@adhd/sox-vector-store) backend and a\n[`@adhd/sox-graph-store`](https://www.npmjs.com/package/@adhd/sox-graph-store) backend together via\ndependency injection. If you have your own signal sources, the pure `fuse()` / `normalize()` /\n`rrfFuse()` functions carry no storage dependency at all.\n\n`StoreSearchBackend` operates over backends that are themselves built on\n[`@adhd/sox-store-adapter`](https://www.npmjs.com/package/@adhd/sox-store-adapter), so it inherits\nthat adapter's concurrency model at one remove: when the graph/vector backends you hand it are\nbacked by Turso (the adapter's default), that store runs in `multiprocess-wal` mode — multiple\nprocesses can hold concurrent write connections to the same store file, serialized through a\ncoordinator sidecar, with no opt-out. Run many search-serving processes against one store file and\ntheir reads/writes through the underlying backends stay safe concurrently.\n\n```bash\npnpm add @adhd/sox-hybrid-search\n```\n\n## Quick start\n\n```typescript\nimport Database from 'better-sqlite3';\nimport * as sqliteVec from 'sqlite-vec';\nimport { createSqliteAdapter } from '@adhd/sox-store-adapter';\nimport { StoreGraphBackend } from '@adhd/sox-graph-store';\nimport { SqliteVectorBackend } from '@adhd/sox-vector-store';\nimport { StoreSearchBackend, search } from '@adhd/sox-hybrid-search';\n\n// One shared connection, wired into both a graph backend and a vector backend.\nconst db = new Database(':memory:');\nsqliteVec.load(db);\nconst adapter = createSqliteAdapter(db);\n\nconst graph = new StoreGraphBackend(adapter);\nawait graph.applySchema();\n\nconst vec = new SqliteVectorBackend(adapter);\nvec.ensureSpace({ modelId: 'demo-model', dim: 4 });\n\nconst backend = new StoreSearchBackend(vec, graph);\n\n// Seed a couple of nodes with both text content and a vector.\nconst pythonId = await graph.writeNode(\n  'Python is a great language for AI and data science',\n  { name: 'python', topic: 'python', tags: ['ai', 'programming'], importance: 5 },\n);\nvec.upsert(pythonId, new Float32Array([1.0, 0.0, 0.0, 0.0]), { modelId: 'demo-model', dim: 4 });\n\nconst rustId = await graph.writeNode(\n  'Rust is a systems language with memory safety',\n  { name: 'rust', topic: 'rust', tags: ['systems', 'programming'], importance: 5 },\n);\nvec.upsert(rustId, new Float32Array([0.0, 1.0, 0.0, 0.0]), { modelId: 'demo-model', dim: 4 });\n\n// Hybrid search: fuses the text match against the vector match, normalized before combining.\nconst results = await search(backend, {\n  text: 'python',\n  vec: new Float32Array([1.0, 0.0, 0.0, 0.0]),\n});\nfor (const r of results) {\n  console.log(r.score.toFixed(4), r.fields.topic);\n}\n```\n\n## API reference\n\n### `search(backend, query, opts?): Promise<SearchResult[]>`\n\nThe top-level ranked search entry point. Degrades to text-only when `query.vec` is absent, and to\nvec-only when `query.text` is absent — it never errors on a missing signal.\n\n```typescript\ninterface SearchQuery {\n  text?: string;\n  vec?: Float32Array;\n  /** Rank signals to fuse via RRF. Default: one signal per present input ({ kind: 'text' } / { kind: 'vec' }). */\n  signals?: SignalSpec[];\n  /** Continuous signals applied AFTER rank-signal fusion (e.g. temporal decay). Default: none. */\n  rescore?: ContinuousSignalSpec[];\n  filters?: Record<string, unknown>;\n}\n\ninterface SearchOpts {\n  normalizer?: 'min_max' | 'L2' | 'z_score';  // default 'min_max'\n  explain?: boolean;                          // include per-signal score breakdown\n  limit?: number;                             // default 20\n}\n\ninterface SearchResult {\n  id: number;\n  score: number;\n  signalScores?: { text?: number; vec?: number };  // present when opts.explain is true\n  fields: Record<string, unknown>;\n  degraded?: { unsupportedFilters: string[] };      // present when a filter key had no backend mapping\n}\n```\n\n### `StoreSearchBackend`\n\n```typescript\nclass StoreSearchBackend implements SearchBackend {\n  constructor(vec: VectorBackend, graph: GraphBackend, opts?: StoreSearchOpts);\n\n  // The raw per-signal candidate fetch — search() calls this and fuses the result.\n  search(query: SearchQuery, limit: number): Promise<Array<{\n    id: number;\n    textScore?: number;\n    vecScore?: number;\n    fields: Record<string, unknown>;\n    degraded?: SearchDegradeInfo;\n  }>>;\n\n  // N-signal reciprocal-rank fusion, applied directly (bypasses the min-max `search()` path).\n  // Returns scores on the raw RRF magnitude scale, NOT comparable to search()'s [0,1] scale.\n  searchRanked(query: SearchQuery, limit: number): Promise<SearchResult[]>;\n}\n```\n\n`query.filters` (e.g. `{ namespace: 'tenant-a' }`) is resolved through `graph.queryNodes()` and used\nto constrain the vector channel's `knn()` call to the matching id set — so a filter scopes *both*\nchannels identically, not just the text channel. A filter matching zero nodes yields zero vector\ncandidates; it is never treated as \"no filter.\" A present-but-empty scope (`ids: []`, `kind: []`, …)\nis itself a zero-candidate scope: the ranker returns zero results directly rather than relying on the\ngraph backend to compile the empty scope to a false predicate (BUG-032 / ADR-0017).\n\n### Pure fusion functions (no storage dependency)\n\n```typescript\nfunction normalize(scores: number[], method: 'min_max' | 'L2' | 'z_score'): number[];\n\nfunction fuse(\n  candidates: Array<{ id: number; textScore?: number; vecScore?: number }>,\n  opts?: { normalizer?: 'min_max' | 'L2' | 'z_score'; weights?: { text?: number; vec?: number } },\n): Array<{ id: number; score: number }>;\n\n// Same algorithm as fuse(), but also returns a per-channel breakdown that sums to the score.\nfunction fuseWithBreakdown(\n  candidates: Array<{ id: number; textScore?: number; vecScore?: number }>,\n  opts?: FusionOpts,\n): Array<{ id: number; score: number; breakdown: { bm25: number; vec: number; total: number } }>;\n```\n\n```typescript\nimport { fuse, normalize } from '@adhd/sox-hybrid-search';\n\nconst fused = fuse(\n  [\n    { id: 1, textScore: 8.2, vecScore: 0.91 },\n    { id: 2, textScore: 3.1 },\n    { id: 3, vecScore: 0.62 },\n  ],\n  { normalizer: 'min_max', weights: { text: 1.0, vec: 1.5 } },\n);\n```\n\n### N-signal reciprocal-rank fusion\n\n```typescript\nconst RRF_K = 60;\nfunction rrfScore(rank: number): number;  // 1 / (RRF_K + rank)\n\nfunction rrfFuse(\n  rankedIdsBySignal: Map<string, number[]>,  // signal name -> ordered ids, best first\n  weights: Map<string, number>,\n): Array<{ id: number; score: number }>;\n\n// Post-fusion recency multiplier — never a peer RRF signal.\nfunction temporalRescore(\n  results: Array<{ id: number; score: number }>,\n  recencyMs: Map<number, number>,\n  decay?: number,\n  nowMs?: number,\n): Array<{ id: number; score: number }>;\n```\n\n```typescript\nimport { rrfFuse } from '@adhd/sox-hybrid-search';\n\nconst ranked = rrfFuse(\n  new Map([\n    ['text', [3, 1, 2]],   // id 3 ranked best by text search\n    ['vec', [1, 3, 4]],    // id 1 ranked best by vector search\n  ]),\n  new Map([['text', 1.0], ['vec', 1.0]]),\n);\n// id 1 and id 3 both appear in two channels and outrank id 2 / id 4, which appear in one.\n```\n\n### Cross-encoder reranking\n\n`createCrossEncoder` loads a real ONNX sequence-classification model (routed through\n`@adhd/sox-embedding-provider`'s shared inference worker — never a second competing\n`worker_threads.Worker`) and scores query/candidate pairs directly, which is more accurate than\neither channel alone for a final top-K rerank pass:\n\n```typescript\nimport { createCrossEncoder } from '@adhd/sox-hybrid-search';\n\nconst encoder = await createCrossEncoder({ modelId: 'MiniCheck' });\nconst scores = await encoder.rerank('What is the capital of France?', [\n  { id: 'a', text: 'Paris is the capital and most populous city of France.' },\n  { id: 'b', text: 'Bananas are a good source of potassium and fiber.' },\n]);\n// scores[0] > scores[1] — passage 'a' is ranked as more relevant.\nawait encoder.dispose();\n```\n\n```typescript\ninterface CrossEncoder {\n  readonly metadata: { modelId: string; maxTokens: number };\n  rerank(query: string, candidates: Array<{ id: number | string; text: string }>, opts?: { timeoutMs?: number }): Promise<Float32Array>;\n  rerankBatch(queries: string[], candidateSets: Array<Array<{ id: number | string; text: string }>>, opts?: { timeoutMs?: number }): Promise<Float32Array[]>;\n  dispose(): Promise<void>;\n}\n```\n\n## Invariants\n\n- `search()` / `StoreSearchBackend.search()` degrade to text-only when `query.vec` is absent, and\n  to vec-only when `query.text` is absent — never errors on a missing signal.\n- Scores are normalized **before** combining — never a raw, scale-blind additive merge.\n- `textScore` / `vecScore` are mechanism-agnostic names; BM25 and cosine are implementation details\n  of the backends behind them, never surfaced through the `SearchBackend` interface itself.\n- Field boosting (e.g. an exact topic match) is applied multiplicatively, never additively.\n- A `NodeFilter` that matches zero nodes yields zero vector candidates — never an unfiltered `knn()`\n  fallback. A **present-but-empty** scope (`ids: []`, `kind: []`, `topic: []`, `tags: []`) is a scope\n  that resolves to zero candidates: it yields zero results here, at the ranker layer, independent of\n  the graph backend's empty-scope handling (BUG-032 / ADR-0017).\n- `rrfFuse` operates purely on ranks, so a continuous value (recency) can never be smuggled in as a\n  peer signal — it is applied afterward, via `temporalRescore`.\n","readmeFilename":"README.md"}