daftari 1.28.0 → 1.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +197 -0
- package/README.md +167 -28
- package/dist/asof/git-read.d.ts +17 -0
- package/dist/asof/git-read.d.ts.map +1 -0
- package/dist/asof/git-read.js +163 -0
- package/dist/asof/git-read.js.map +1 -0
- package/dist/asof/index.d.ts +2 -0
- package/dist/asof/index.d.ts.map +1 -0
- package/dist/asof/index.js +151 -0
- package/dist/asof/index.js.map +1 -0
- package/dist/asof/report.d.ts +11 -0
- package/dist/asof/report.d.ts.map +1 -0
- package/dist/asof/report.js +119 -0
- package/dist/asof/report.js.map +1 -0
- package/dist/asof/snapshot.d.ts +72 -0
- package/dist/asof/snapshot.d.ts.map +1 -0
- package/dist/asof/snapshot.js +207 -0
- package/dist/asof/snapshot.js.map +1 -0
- package/dist/backfill/apply.js +2 -2
- package/dist/backfill/apply.js.map +1 -1
- package/dist/backfill/plan.js +2 -2
- package/dist/backfill/plan.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +18 -0
- package/dist/cli.js.map +1 -1
- package/dist/consolidate/call-budget.d.ts +3 -0
- package/dist/consolidate/call-budget.d.ts.map +1 -0
- package/dist/consolidate/call-budget.js +37 -0
- package/dist/consolidate/call-budget.js.map +1 -0
- package/dist/consolidate/constants.d.ts +1 -0
- package/dist/consolidate/constants.d.ts.map +1 -1
- package/dist/consolidate/constants.js +5 -0
- package/dist/consolidate/constants.js.map +1 -1
- package/dist/consolidate/index.d.ts.map +1 -1
- package/dist/consolidate/index.js +96 -27
- package/dist/consolidate/index.js.map +1 -1
- package/dist/court/docket.d.ts +39 -0
- package/dist/court/docket.d.ts.map +1 -0
- package/dist/court/docket.js +103 -0
- package/dist/court/docket.js.map +1 -0
- package/dist/court/index.d.ts +2 -0
- package/dist/court/index.d.ts.map +1 -0
- package/dist/court/index.js +169 -0
- package/dist/court/index.js.map +1 -0
- package/dist/court/precedent.d.ts +18 -0
- package/dist/court/precedent.d.ts.map +1 -0
- package/dist/court/precedent.js +84 -0
- package/dist/court/precedent.js.map +1 -0
- package/dist/court/report.d.ts +10 -0
- package/dist/court/report.d.ts.map +1 -0
- package/dist/court/report.js +77 -0
- package/dist/court/report.js.map +1 -0
- package/dist/curation/staged-actions.d.ts.map +1 -1
- package/dist/curation/staged-actions.js +15 -6
- package/dist/curation/staged-actions.js.map +1 -1
- package/dist/curation/staleness.js +1 -1
- package/dist/curation/staleness.js.map +1 -1
- package/dist/curation/tension-access.d.ts +7 -0
- package/dist/curation/tension-access.d.ts.map +1 -0
- package/dist/curation/tension-access.js +44 -0
- package/dist/curation/tension-access.js.map +1 -0
- package/dist/curation/tension-blast.d.ts +2 -1
- package/dist/curation/tension-blast.d.ts.map +1 -1
- package/dist/curation/tension-blast.js +2 -2
- package/dist/curation/tension-blast.js.map +1 -1
- package/dist/curation/tension-clusters.d.ts +1 -1
- package/dist/curation/tension-clusters.d.ts.map +1 -1
- package/dist/curation/tension-clusters.js +5 -2
- package/dist/curation/tension-clusters.js.map +1 -1
- package/dist/curation/tension.d.ts +1 -0
- package/dist/curation/tension.d.ts.map +1 -1
- package/dist/curation/tension.js +18 -10
- package/dist/curation/tension.js.map +1 -1
- package/dist/curation/vault-docs.js +1 -1
- package/dist/curation/vault-docs.js.map +1 -1
- package/dist/eval/llm-openrouter.d.ts +9 -0
- package/dist/eval/llm-openrouter.d.ts.map +1 -0
- package/dist/eval/llm-openrouter.js +171 -0
- package/dist/eval/llm-openrouter.js.map +1 -0
- package/dist/frontmatter/parser.d.ts +1 -0
- package/dist/frontmatter/parser.d.ts.map +1 -1
- package/dist/frontmatter/parser.js +12 -0
- package/dist/frontmatter/parser.js.map +1 -1
- package/dist/frontmatter/schema.d.ts.map +1 -1
- package/dist/frontmatter/schema.js +19 -2
- package/dist/frontmatter/schema.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/search/contested.d.ts +18 -0
- package/dist/search/contested.d.ts.map +1 -0
- package/dist/search/contested.js +119 -0
- package/dist/search/contested.js.map +1 -0
- package/dist/search/hybrid.d.ts +5 -0
- package/dist/search/hybrid.d.ts.map +1 -1
- package/dist/search/hybrid.js +112 -9
- package/dist/search/hybrid.js.map +1 -1
- package/dist/search/reindex.d.ts.map +1 -1
- package/dist/search/reindex.js +16 -13
- package/dist/search/reindex.js.map +1 -1
- package/dist/search/watcher.js +2 -2
- package/dist/search/watcher.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +4 -0
- package/dist/server.js.map +1 -1
- package/dist/sleep/cycle.d.ts +59 -0
- package/dist/sleep/cycle.d.ts.map +1 -0
- package/dist/sleep/cycle.js +127 -0
- package/dist/sleep/cycle.js.map +1 -0
- package/dist/sleep/index.d.ts +3 -0
- package/dist/sleep/index.d.ts.map +1 -0
- package/dist/sleep/index.js +129 -0
- package/dist/sleep/index.js.map +1 -0
- package/dist/sleep/report.d.ts +11 -0
- package/dist/sleep/report.d.ts.map +1 -0
- package/dist/sleep/report.js +87 -0
- package/dist/sleep/report.js.map +1 -0
- package/dist/storage/index-db.d.ts +2 -0
- package/dist/storage/index-db.d.ts.map +1 -1
- package/dist/storage/index-db.js +106 -19
- package/dist/storage/index-db.js.map +1 -1
- package/dist/storage/local.d.ts +6 -1
- package/dist/storage/local.d.ts.map +1 -1
- package/dist/storage/local.js +30 -4
- package/dist/storage/local.js.map +1 -1
- package/dist/tools/curation.d.ts.map +1 -1
- package/dist/tools/curation.js +60 -3
- package/dist/tools/curation.js.map +1 -1
- package/dist/tools/edges.js +2 -2
- package/dist/tools/edges.js.map +1 -1
- package/dist/tools/read.js +2 -2
- package/dist/tools/read.js.map +1 -1
- package/dist/tools/receipt.d.ts +65 -0
- package/dist/tools/receipt.d.ts.map +1 -0
- package/dist/tools/receipt.js +248 -0
- package/dist/tools/receipt.js.map +1 -0
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/search.js +40 -8
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/staged-actions.js +1 -1
- package/dist/tools/staged-actions.js.map +1 -1
- package/dist/tools/themes.d.ts +1 -0
- package/dist/tools/themes.d.ts.map +1 -1
- package/dist/tools/themes.js +159 -45
- package/dist/tools/themes.js.map +1 -1
- package/dist/tools/witness.d.ts +9 -0
- package/dist/tools/witness.d.ts.map +1 -0
- package/dist/tools/witness.js +66 -0
- package/dist/tools/witness.js.map +1 -0
- package/dist/tools/write.d.ts.map +1 -1
- package/dist/tools/write.js +101 -53
- package/dist/tools/write.js.map +1 -1
- package/dist/utils/config.d.ts +2 -0
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +48 -2
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/paths.d.ts +2 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +15 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/redos.d.ts +2 -0
- package/dist/utils/redos.d.ts.map +1 -0
- package/dist/utils/redos.js +101 -0
- package/dist/utils/redos.js.map +1 -0
- package/dist/utils/vault-gitignore.d.ts +1 -1
- package/dist/utils/vault-gitignore.d.ts.map +1 -1
- package/dist/utils/vault-gitignore.js +2 -0
- package/dist/utils/vault-gitignore.js.map +1 -1
- package/dist/witness/track-record.d.ts +42 -0
- package/dist/witness/track-record.d.ts.map +1 -0
- package/dist/witness/track-record.js +189 -0
- package/dist/witness/track-record.js.map +1 -0
- package/package.json +7 -2
|
@@ -7,7 +7,19 @@
|
|
|
7
7
|
import matter from "gray-matter";
|
|
8
8
|
import { validateFrontmatter } from "./schema.js";
|
|
9
9
|
import { err, ok } from "./types.js";
|
|
10
|
+
// Upper bound on the source we will hand to gray-matter's synchronous parse.
|
|
11
|
+
// A pathologically large `.md` — reachable via `daftari import` over an
|
|
12
|
+
// arbitrary folder — would otherwise block the event loop (and risk OOM) while
|
|
13
|
+
// matter() parses it in one shot. 5 MiB is far larger than any legitimate
|
|
14
|
+
// curated markdown doc; anything past it is treated as non-content and skipped
|
|
15
|
+
// with an err Result rather than parsed. Measured in UTF-8 bytes, not JS string
|
|
16
|
+
// length, so multi-byte content is bounded by real memory cost.
|
|
17
|
+
export const MAX_PARSE_BYTES = 5 * 1024 * 1024;
|
|
10
18
|
export function parseDocument(source) {
|
|
19
|
+
const byteLength = Buffer.byteLength(source, "utf-8");
|
|
20
|
+
if (byteLength > MAX_PARSE_BYTES) {
|
|
21
|
+
return err(new Error(`document too large to parse: ${byteLength} bytes exceeds the ${MAX_PARSE_BYTES}-byte cap`));
|
|
22
|
+
}
|
|
11
23
|
let extracted;
|
|
12
24
|
try {
|
|
13
25
|
extracted = matter(source);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/frontmatter/parser.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,EAAE;AACF,+EAA+E;AAC/E,yEAAyE;AACzE,yEAAyE;AACzE,6EAA6E;AAE7E,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,GAAG,EAAoB,EAAE,EAAsC,MAAM,YAAY,CAAC;AAU3F,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,IAAI,SAAwC,CAAC;IAC7C,IAAI,CAAC;QACH,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,MAAM,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC1D,OAAO,GAAG,CAAC,IAAI,KAAK,CAAC,+BAA+B,MAAM,EAAE,CAAC,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,CAA4B,CAAC;IAC9D,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAEzD,OAAO,EAAE,CAAC;QACR,WAAW;QACX,OAAO,EAAE,SAAS,CAAC,OAAO;QAC1B,GAAG;QACH,UAAU,EAAE,MAAM;QAClB,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC;KAC5C,CAAC,CAAC;AACL,CAAC"}
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/frontmatter/parser.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,EAAE;AACF,+EAA+E;AAC/E,yEAAyE;AACzE,yEAAyE;AACzE,6EAA6E;AAE7E,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,GAAG,EAAoB,EAAE,EAAsC,MAAM,YAAY,CAAC;AAU3F,6EAA6E;AAC7E,wEAAwE;AACxE,+EAA+E;AAC/E,0EAA0E;AAC1E,+EAA+E;AAC/E,gFAAgF;AAChF,gEAAgE;AAChE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAE/C,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtD,IAAI,UAAU,GAAG,eAAe,EAAE,CAAC;QACjC,OAAO,GAAG,CACR,IAAI,KAAK,CACP,gCAAgC,UAAU,sBAAsB,eAAe,WAAW,CAC3F,CACF,CAAC;IACJ,CAAC;IAED,IAAI,SAAwC,CAAC;IAC7C,IAAI,CAAC;QACH,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,MAAM,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC1D,OAAO,GAAG,CAAC,IAAI,KAAK,CAAC,+BAA+B,MAAM,EAAE,CAAC,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,CAA4B,CAAC;IAC9D,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAEzD,OAAO,EAAE,CAAC;QACR,WAAW;QACX,OAAO,EAAE,SAAS,CAAC,OAAO;QAC1B,GAAG;QACH,UAAU,EAAE,MAAM;QAClB,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC;KAC5C,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/frontmatter/schema.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,OAAO,EAKL,KAAK,WAAW,EAMhB,KAAK,gBAAgB,EACtB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,EAAE,gBAAgB,CAAC;CAC1B;
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/frontmatter/schema.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,OAAO,EAKL,KAAK,WAAW,EAMhB,KAAK,gBAAgB,EACtB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,EAAE,gBAAgB,CAAC;CAC1B;AA2FD,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,UAAU,GAAE,eAAe,EAAO,GACjC,qBAAqB,CAoHvB"}
|
|
@@ -7,6 +7,12 @@
|
|
|
7
7
|
// tension, superseded_by consistency) — that is the curation engine's job.
|
|
8
8
|
import { normalizeIsoDate } from "../utils/dates.js";
|
|
9
9
|
import { CONFIDENCES, DOMAINS, PROVENANCES, STATUSES, } from "./types.js";
|
|
10
|
+
// Upper bound on the length of a value a config-declared `pattern` is run
|
|
11
|
+
// against. Config load already screens patterns for catastrophic backtracking
|
|
12
|
+
// (utils/redos.ts), but JS regex is synchronous — this caps worst-case work so
|
|
13
|
+
// no pattern, safe or not, can be driven by an unbounded value. Generous enough
|
|
14
|
+
// for the structured short fields patterns are meant for (ids, slugs, urls).
|
|
15
|
+
const MAX_PATTERN_INPUT_LENGTH = 4096;
|
|
10
16
|
// Validates one config-declared extension field against the raw frontmatter,
|
|
11
17
|
// appending any problem to `issues`. Advisory, like the built-in checks: a
|
|
12
18
|
// missing optional field is fine, a missing field with a declared default is
|
|
@@ -26,8 +32,19 @@ function validateExtensionField(data, ext, issues) {
|
|
|
26
32
|
issues.push({ field, message: `expected string, got ${typeof v}` });
|
|
27
33
|
return;
|
|
28
34
|
}
|
|
29
|
-
if (ext.pattern
|
|
30
|
-
|
|
35
|
+
if (ext.pattern) {
|
|
36
|
+
// Defense-in-depth against ReDoS: config load screens patterns for
|
|
37
|
+
// catastrophic backtracking, but JS regex is synchronous, so never run
|
|
38
|
+
// even a linear-safe pattern against an unbounded value.
|
|
39
|
+
if (v.length > MAX_PATTERN_INPUT_LENGTH) {
|
|
40
|
+
issues.push({
|
|
41
|
+
field,
|
|
42
|
+
message: `value too long to pattern-validate (${v.length} > ${MAX_PATTERN_INPUT_LENGTH})`,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
else if (!new RegExp(ext.pattern).test(v)) {
|
|
46
|
+
issues.push({ field, message: `does not match pattern /${ext.pattern}/` });
|
|
47
|
+
}
|
|
31
48
|
}
|
|
32
49
|
return;
|
|
33
50
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/frontmatter/schema.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,EAAE;AACF,wEAAwE;AACxE,6EAA6E;AAC7E,4EAA4E;AAC5E,2EAA2E;AAC3E,2EAA2E;AAG3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EACL,WAAW,EAEX,OAAO,EAGP,WAAW,EAEX,QAAQ,GAIT,MAAM,YAAY,CAAC;AAOpB,6EAA6E;AAC7E,2EAA2E;AAC3E,6EAA6E;AAC7E,uDAAuD;AACvD,SAAS,sBAAsB,CAC7B,IAA6B,EAC7B,GAAoB,EACpB,MAAyB;IAEzB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC1B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;IAExB,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QAClC,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC9C,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO;IACT,CAAC;IAED,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAC1B,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,wBAAwB,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;gBACpE,OAAO;YACT,CAAC;YACD,IAAI,GAAG,CAAC,OAAO,IAAI,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/frontmatter/schema.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -29,7 +29,7 @@ import { directoryExists } from "./storage/local.js";
|
|
|
29
29
|
import { loadConfig } from "./utils/config.js";
|
|
30
30
|
// Kept in sync with package.json. Surfaced in the process lockfile for
|
|
31
31
|
// operator diagnostics. Bump both together on a release.
|
|
32
|
-
const DAFTARI_VERSION = "1.
|
|
32
|
+
const DAFTARI_VERSION = "1.29.0";
|
|
33
33
|
// Reads `--name value` or `--name=value` from argv; null if absent.
|
|
34
34
|
export function parseFlag(argv, name) {
|
|
35
35
|
const flag = `--${name}`;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { AccessContext } from "../access/rbac.js";
|
|
2
|
+
import { type TensionKind } from "../curation/tension.js";
|
|
3
|
+
import type { IndexDb } from "../storage/index-db.js";
|
|
4
|
+
export interface ContestedTension {
|
|
5
|
+
id?: string;
|
|
6
|
+
kind: TensionKind;
|
|
7
|
+
counterpart: string;
|
|
8
|
+
claimSelf: string;
|
|
9
|
+
claimOther: string;
|
|
10
|
+
loggedAt: string;
|
|
11
|
+
}
|
|
12
|
+
export declare const CONTESTED_CAP = 3;
|
|
13
|
+
export declare function clearContestedCache(): void;
|
|
14
|
+
export declare function contestedFor(vaultRoot: string, db: IndexDb, hitPath: string, access?: AccessContext): {
|
|
15
|
+
contested: ContestedTension[];
|
|
16
|
+
contestedCount: number;
|
|
17
|
+
} | null;
|
|
18
|
+
//# sourceMappingURL=contested.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contested.d.ts","sourceRoot":"","sources":["../../src/search/contested.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAmB,KAAK,WAAW,EAAgB,MAAM,wBAAwB,CAAC;AAEzF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAGtD,MAAM,WAAW,gBAAgB;IAC/B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,WAAW,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAID,eAAO,MAAM,aAAa,IAAI,CAAC;AA2B/B,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAkED,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,OAAO,EACX,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,aAAa,GACrB;IAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAwBlE"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
// contested — post-join of the tension log onto search hits.
|
|
2
|
+
//
|
|
3
|
+
// The tension-graph feud benchmark (2026-07-04) measured this shape: a
|
|
4
|
+
// contradiction surfaced INLINE in the retrieval payload is acted on ~6x more
|
|
5
|
+
// often than one reachable through a dedicated tool the agent must choose to
|
|
6
|
+
// call (tg-3b vs tg-3a, all three panel models). This module is the inline
|
|
7
|
+
// half: vaultSearch asks contestedFor per surviving hit, in the same
|
|
8
|
+
// enrichment pass as resolveCurrentSource.
|
|
9
|
+
//
|
|
10
|
+
// Advisory, additive, lossless: contested-ness never feeds ranking, and a
|
|
11
|
+
// missing or malformed tension log degrades to "no annotations", never a
|
|
12
|
+
// failed search. Unresolved tensions only — a resolved tension's outcome is
|
|
13
|
+
// already expressed through supersede/deprecate edges, and the live marker
|
|
14
|
+
// must mean live disagreement.
|
|
15
|
+
import { readFileSync, statSync } from "node:fs";
|
|
16
|
+
import { resolve } from "node:path";
|
|
17
|
+
import { parseTensionLog, tensionsPath } from "../curation/tension.js";
|
|
18
|
+
import { sourceReadable } from "../curation/tension-access.js";
|
|
19
|
+
import { canonicalRel } from "../utils/paths.js";
|
|
20
|
+
// Payload bound per hit. contestedCount reports the true total, so the cap
|
|
21
|
+
// never silently truncates.
|
|
22
|
+
export const CONTESTED_CAP = 3;
|
|
23
|
+
const cache = new Map();
|
|
24
|
+
// Test-only hook, mirroring clearConfigCache.
|
|
25
|
+
export function clearContestedCache() {
|
|
26
|
+
cache.clear();
|
|
27
|
+
}
|
|
28
|
+
function buildByPath(raw) {
|
|
29
|
+
const byPath = new Map();
|
|
30
|
+
const add = (key, record) => {
|
|
31
|
+
const list = byPath.get(key);
|
|
32
|
+
if (list)
|
|
33
|
+
list.push(record);
|
|
34
|
+
else
|
|
35
|
+
byPath.set(key, [record]);
|
|
36
|
+
};
|
|
37
|
+
parseTensionLog(raw).forEach((entry, order) => {
|
|
38
|
+
if (entry.resolved)
|
|
39
|
+
return;
|
|
40
|
+
const a = canonicalRel(entry.sourceA);
|
|
41
|
+
const b = canonicalRel(entry.sourceB);
|
|
42
|
+
if (a.length === 0 || b.length === 0)
|
|
43
|
+
return;
|
|
44
|
+
const base = { order, id: entry.id, kind: entry.kind, date: entry.date };
|
|
45
|
+
add(a, { ...base, counterpart: b, claimSelf: entry.claimA, claimOther: entry.claimB });
|
|
46
|
+
// A self-tension (an intra-document contradiction — legitimate advisory
|
|
47
|
+
// input) has one hit to annotate, not two: the mirrored add would land
|
|
48
|
+
// under the same key and inflate contested/contestedCount.
|
|
49
|
+
if (a !== b) {
|
|
50
|
+
add(b, { ...base, counterpart: a, claimSelf: entry.claimB, claimOther: entry.claimA });
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
return byPath;
|
|
54
|
+
}
|
|
55
|
+
function tensionsByPath(vaultRoot) {
|
|
56
|
+
const path = tensionsPath(vaultRoot);
|
|
57
|
+
const key = resolve(vaultRoot);
|
|
58
|
+
let mtimeMs;
|
|
59
|
+
try {
|
|
60
|
+
mtimeMs = statSync(path).mtimeMs;
|
|
61
|
+
}
|
|
62
|
+
catch (e) {
|
|
63
|
+
mtimeMs = e.code === "ENOENT" ? null : Number.NaN;
|
|
64
|
+
}
|
|
65
|
+
const cached = cache.get(key);
|
|
66
|
+
if (cached !== undefined && cached.mtimeMs === mtimeMs)
|
|
67
|
+
return cached.byPath;
|
|
68
|
+
let byPath;
|
|
69
|
+
if (mtimeMs === null) {
|
|
70
|
+
byPath = new Map();
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
let raw = "";
|
|
74
|
+
try {
|
|
75
|
+
raw = readFileSync(path, "utf-8");
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// Race (log deleted between stat and read) or unreadable file: degrade
|
|
79
|
+
// to no annotations for this call. Never fail the search.
|
|
80
|
+
}
|
|
81
|
+
byPath = buildByPath(raw);
|
|
82
|
+
}
|
|
83
|
+
cache.set(key, { mtimeMs, byPath });
|
|
84
|
+
return byPath;
|
|
85
|
+
}
|
|
86
|
+
// The per-hit join. Returns null when the hit has no visible unresolved
|
|
87
|
+
// tensions — callers leave the hit untouched (fields absent, never empty).
|
|
88
|
+
//
|
|
89
|
+
// RBAC: an annotation quotes the counterpart's claim, so it crosses the ACL
|
|
90
|
+
// boundary. A record is visible only when the caller can read the
|
|
91
|
+
// counterpart's collection; invisible records are omitted entirely (no
|
|
92
|
+
// existence leak) and excluded from contestedCount — the count never reveals
|
|
93
|
+
// hidden tensions. `access` undefined ⇒ RBAC unconfigured ⇒ all visible,
|
|
94
|
+
// matching vaultSearch's own filtering.
|
|
95
|
+
export function contestedFor(vaultRoot, db, hitPath, access) {
|
|
96
|
+
const records = tensionsByPath(vaultRoot).get(canonicalRel(hitPath));
|
|
97
|
+
if (records === undefined)
|
|
98
|
+
return null;
|
|
99
|
+
const visible = access
|
|
100
|
+
? records.filter((r) => sourceReadable(db, access, r.counterpart))
|
|
101
|
+
: records;
|
|
102
|
+
if (visible.length === 0)
|
|
103
|
+
return null;
|
|
104
|
+
// Date desc, then log position desc: dates are day-granular, so the file
|
|
105
|
+
// position (logged order) is the load-bearing same-day tiebreak.
|
|
106
|
+
const ordered = [...visible].sort((x, y) => y.date.localeCompare(x.date) || y.order - x.order);
|
|
107
|
+
return {
|
|
108
|
+
contested: ordered.slice(0, CONTESTED_CAP).map((r) => ({
|
|
109
|
+
...(r.id !== undefined ? { id: r.id } : {}),
|
|
110
|
+
kind: r.kind,
|
|
111
|
+
counterpart: r.counterpart,
|
|
112
|
+
claimSelf: r.claimSelf,
|
|
113
|
+
claimOther: r.claimOther,
|
|
114
|
+
loggedAt: r.date,
|
|
115
|
+
})),
|
|
116
|
+
contestedCount: ordered.length,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=contested.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contested.js","sourceRoot":"","sources":["../../src/search/contested.ts"],"names":[],"mappings":"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"}
|
package/dist/search/hybrid.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type DecayState } from "../curation/decay.js";
|
|
2
2
|
import { type Result } from "../frontmatter/types.js";
|
|
3
3
|
import { type IndexDb } from "../storage/index-db.js";
|
|
4
|
+
import type { ContestedTension } from "./contested.js";
|
|
4
5
|
import type { CurrentSource } from "./current-source.js";
|
|
5
6
|
export interface HybridWeights {
|
|
6
7
|
bm25: number;
|
|
@@ -18,6 +19,8 @@ export interface HybridHit {
|
|
|
18
19
|
snippet: string;
|
|
19
20
|
decay: DecayState | null;
|
|
20
21
|
currentSource?: CurrentSource;
|
|
22
|
+
contested?: ContestedTension[];
|
|
23
|
+
contestedCount?: number;
|
|
21
24
|
viaCoverage?: boolean;
|
|
22
25
|
coverageReason?: "edge" | "entity-window";
|
|
23
26
|
}
|
|
@@ -31,6 +34,8 @@ export interface HybridSearchResult {
|
|
|
31
34
|
export interface HybridSearchOptions {
|
|
32
35
|
weights?: HybridWeights;
|
|
33
36
|
limit?: number;
|
|
37
|
+
lexicalGranularity?: "document" | "chunk";
|
|
38
|
+
overFetch?: boolean;
|
|
34
39
|
}
|
|
35
40
|
export declare function hybridSearch(db: IndexDb, query: string, options?: HybridSearchOptions): Promise<Result<HybridSearchResult, Error>>;
|
|
36
41
|
export interface RelatedSearchResult {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hybrid.d.ts","sourceRoot":"","sources":["../../src/search/hybrid.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAM,KAAK,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAKL,KAAK,OAAO,EACb,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,eAAe,EAAE,aAA0C,CAAC;AAEzE,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IACzB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,GAAG,eAAe,CAAC;CAC3C;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,aAAa,CAAC;IACvB,IAAI,EAAE,SAAS,EAAE,CAAC;CACnB;
|
|
1
|
+
{"version":3,"file":"hybrid.d.ts","sourceRoot":"","sources":["../../src/search/hybrid.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAM,KAAK,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAKL,KAAK,OAAO,EACb,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,eAAe,EAAE,aAA0C,CAAC;AAEzE,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IACzB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,SAAS,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,GAAG,eAAe,CAAC;CAC3C;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,aAAa,CAAC;IACvB,IAAI,EAAE,SAAS,EAAE,CAAC;CACnB;AA0QD,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC;IAQ1C,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAGD,wBAAsB,YAAY,CAChC,EAAE,EAAE,OAAO,EACX,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,MAAM,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC,CAqC5C;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,aAAa,CAAC;IACvB,IAAI,EAAE,SAAS,EAAE,CAAC;CACnB;AAOD,wBAAgB,aAAa,CAC3B,EAAE,EAAE,OAAO,EACX,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,mBAAwB,GAChC,MAAM,CAAC,mBAAmB,EAAE,KAAK,CAAC,CA+CpC"}
|
package/dist/search/hybrid.js
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
// lexical-only and reports vectorUsed: false rather than failing.
|
|
18
18
|
import { computeDecay } from "../curation/decay.js";
|
|
19
19
|
import { ok } from "../frontmatter/types.js";
|
|
20
|
-
import { embeddingToBlob,
|
|
20
|
+
import { embeddingToBlob, getChunksForPath, getDocument, getDocumentsByPaths, } from "../storage/index-db.js";
|
|
21
21
|
import { buildMatchQuery, tokenize } from "./bm25.js";
|
|
22
22
|
import { embedQuery, getProvider, meanEmbedding } from "./vector.js";
|
|
23
23
|
export const DEFAULT_WEIGHTS = { bm25: 0.5, vector: 0.5 };
|
|
@@ -69,6 +69,38 @@ function normalize(scores) {
|
|
|
69
69
|
return new Map([...scores].map(([k]) => [k, 0]));
|
|
70
70
|
return new Map([...scores].map(([k, v]) => [k, v / max]));
|
|
71
71
|
}
|
|
72
|
+
// Wraps a prefix-OR'd FTS match string in an FTS5 column filter (e.g. "{title tags}"). Null query → null.
|
|
73
|
+
function columnRestrict(matchQuery, columns) {
|
|
74
|
+
return matchQuery === null ? null : `${columns} : (${matchQuery})`;
|
|
75
|
+
}
|
|
76
|
+
// Band boundary for the chunk-mode tiered lexical combine. Documents with any
|
|
77
|
+
// chunk-body match occupy the upper band (0.5, 1]; documents matched only via
|
|
78
|
+
// title/tags occupy the lower band (0, 0.5]. A body match therefore always
|
|
79
|
+
// outranks a title-only match by construction — no tunable weight. (Any split
|
|
80
|
+
// in (0,1) gives the same strict ordering; 0.5 is the natural midpoint.)
|
|
81
|
+
const TIER_SPLIT = 0.5;
|
|
82
|
+
// Tiered combine of two normalized lexical signals. chunkNorm (body) is primary:
|
|
83
|
+
// its docs land in the upper band, ordered by body score. titleTagNorm docs that
|
|
84
|
+
// are NOT already body-matched land in the lower band, ordered by title/tag score
|
|
85
|
+
// — a strict fallback that surfaces docs the body ranker missed (the native
|
|
86
|
+
// title/tag case) without ever displacing a real body match (the RB case).
|
|
87
|
+
// Both inputs are normalized to (0,1] (no zeros) by the callers, so upper band
|
|
88
|
+
// is strictly >0.5 and lower band is <=0.5: strict, tie-free separation. The
|
|
89
|
+
// `> 0` guards make that precondition self-enforcing rather than relying on the
|
|
90
|
+
// upstream invariant — a non-positive score never creates a band entry (so it
|
|
91
|
+
// can't floor a body match to exactly 0.5 and tie a title-only match).
|
|
92
|
+
function tieredLexical(chunkNorm, titleTagNorm) {
|
|
93
|
+
const out = new Map();
|
|
94
|
+
for (const [p, c] of chunkNorm)
|
|
95
|
+
if (c > 0)
|
|
96
|
+
out.set(p, TIER_SPLIT + (1 - TIER_SPLIT) * c);
|
|
97
|
+
for (const [p, t] of titleTagNorm) {
|
|
98
|
+
if (out.has(p) || t <= 0)
|
|
99
|
+
continue; // already body-matched, or no real title/tag signal
|
|
100
|
+
out.set(p, TIER_SPLIT * t);
|
|
101
|
+
}
|
|
102
|
+
return out;
|
|
103
|
+
}
|
|
72
104
|
// Runs an FTS5 MATCH against `documents_fts` and returns a path → score
|
|
73
105
|
// map. The FTS5 `bm25()` function is INVERSE (smaller = better, can be
|
|
74
106
|
// negative for strong hits), so we flip the sign to `larger = better` and
|
|
@@ -119,6 +151,40 @@ function vecRanking(db, queryEmbedding, modelId) {
|
|
|
119
151
|
}
|
|
120
152
|
return result;
|
|
121
153
|
}
|
|
154
|
+
// Chunk-level lexical ranking. Runs an FTS5 MATCH over `chunks_fts` (one row
|
|
155
|
+
// per chunk), reads the inverse bm25 (flip to larger=better), joins back to
|
|
156
|
+
// `chunks` on rowid to map onto document paths, and collapses to each
|
|
157
|
+
// document's BEST chunk score (max) — mirroring vecRanking's best-per-doc.
|
|
158
|
+
// A relevant topic's own chunk scores high even when its whole document is
|
|
159
|
+
// long and multi-topic. Null query (no usable tokens) returns an empty map.
|
|
160
|
+
function chunkFtsRanking(db, query) {
|
|
161
|
+
if (query === null)
|
|
162
|
+
return new Map();
|
|
163
|
+
const rows = db
|
|
164
|
+
.prepare(`SELECT c.path AS path, -bm25(chunks_fts) AS score
|
|
165
|
+
FROM chunks_fts
|
|
166
|
+
JOIN chunks AS c ON c.rowid = chunks_fts.rowid
|
|
167
|
+
WHERE chunks_fts MATCH ?
|
|
168
|
+
ORDER BY bm25(chunks_fts)`)
|
|
169
|
+
.all(query);
|
|
170
|
+
const result = new Map();
|
|
171
|
+
for (const r of rows) {
|
|
172
|
+
// Some rows may produce a non-positive flipped score if FTS5 returned a
|
|
173
|
+
// positive bm25 (rare with prefix matches); drop them so the normalize
|
|
174
|
+
// step sees only positive values.
|
|
175
|
+
// Note: BM25 scores here are computed over the CHUNK corpus (avgdl =
|
|
176
|
+
// average chunk length), a different normalization base than ftsRanking's
|
|
177
|
+
// document corpus. The two rankers are never mixed in the same call —
|
|
178
|
+
// rankDocuments routes to exactly one based on lexicalGranularity — so
|
|
179
|
+
// their raw scores are never directly compared.
|
|
180
|
+
if (r.score <= 0)
|
|
181
|
+
continue;
|
|
182
|
+
const prev = result.get(r.path) ?? -Infinity;
|
|
183
|
+
if (r.score > prev)
|
|
184
|
+
result.set(r.path, r.score);
|
|
185
|
+
}
|
|
186
|
+
return result;
|
|
187
|
+
}
|
|
122
188
|
// Core ranker shared by query search and related-document search.
|
|
123
189
|
// `matchQuery` is the FTS5 MATCH string (already prefix-OR'd, or null);
|
|
124
190
|
// `queryEmbedding` (when present) drives sqlite-vec KNN against every
|
|
@@ -126,9 +192,20 @@ function vecRanking(db, queryEmbedding, modelId) {
|
|
|
126
192
|
// `queryTokensForSnippet` is used purely to centre snippets on the first
|
|
127
193
|
// matching term — it doesn't drive ranking.
|
|
128
194
|
function rankDocuments(db, matchQuery, queryEmbedding, queryTokensForSnippet, opts) {
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
195
|
+
let bm25Norm;
|
|
196
|
+
if (opts.lexicalGranularity === "chunk") {
|
|
197
|
+
// Body granularity (the dilution fix) TIERED with a clean title/tag signal
|
|
198
|
+
// (the native-shape fix). Each is normalized to its own max to reconcile the
|
|
199
|
+
// two FTS score scales; tieredLexical then ranks every body match above every
|
|
200
|
+
// title-only match. The title/tag signal reuses ftsRanking with a column-
|
|
201
|
+
// restricted query so it scores title+tags only (no body dilution).
|
|
202
|
+
const chunkNorm = normalize(chunkFtsRanking(db, matchQuery));
|
|
203
|
+
const titleTagNorm = normalize(ftsRanking(db, columnRestrict(matchQuery, "{title tags}")));
|
|
204
|
+
bm25Norm = tieredLexical(chunkNorm, titleTagNorm);
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
bm25Norm = normalize(ftsRanking(db, matchQuery));
|
|
208
|
+
}
|
|
132
209
|
let vectorRaw = new Map();
|
|
133
210
|
let vectorUsed = false;
|
|
134
211
|
if (queryEmbedding) {
|
|
@@ -137,11 +214,18 @@ function rankDocuments(db, matchQuery, queryEmbedding, queryTokensForSnippet, op
|
|
|
137
214
|
if (vectorRaw.size > 0)
|
|
138
215
|
vectorUsed = true;
|
|
139
216
|
}
|
|
140
|
-
const bm25Norm = normalize(bm25Raw);
|
|
141
217
|
const vectorNorm = normalize(vectorRaw);
|
|
142
218
|
// With no usable vector signal, lexical ranking carries the full weight.
|
|
143
219
|
const weights = vectorUsed ? opts.weights : { bm25: 1, vector: 0 };
|
|
144
220
|
const candidates = new Set([...bm25Norm.keys(), ...vectorNorm.keys()]);
|
|
221
|
+
// Fetch full rows for ONLY the candidate paths — not the whole vault. The
|
|
222
|
+
// FTS + vector rankers above have already collapsed the vault to a small set
|
|
223
|
+
// (typically < 100), so the expensive full-row read (content blob + JSON
|
|
224
|
+
// tag/token parse in rowToDocument) is scoped to that set instead of running
|
|
225
|
+
// O(vault) on every query. The related-search source path is excluded from
|
|
226
|
+
// the fetch — the loop below skips it anyway, so its row is never needed.
|
|
227
|
+
const fetchPaths = [...candidates].filter((path) => path !== opts.excludePath);
|
|
228
|
+
const byPath = new Map(getDocumentsByPaths(db, fetchPaths).map((d) => [d.path, d]));
|
|
145
229
|
const hits = [];
|
|
146
230
|
for (const path of candidates) {
|
|
147
231
|
if (path === opts.excludePath)
|
|
@@ -180,14 +264,29 @@ function rankDocuments(db, matchQuery, queryEmbedding, queryTokensForSnippet, op
|
|
|
180
264
|
export async function hybridSearch(db, query, options = {}) {
|
|
181
265
|
const weights = options.weights ?? DEFAULT_WEIGHTS;
|
|
182
266
|
const limit = options.limit ?? 10;
|
|
267
|
+
// Default flipped to "chunk" in v1.29.0: chunk-level BM25 recovers the
|
|
268
|
+
// multi-topic-document dilution gap (RB recall + SQuAD retrieval) and produces
|
|
269
|
+
// better end-to-end answers where it out-retrieves document, with no regression
|
|
270
|
+
// where it doesn't (docs/superpowers/results/2026-06-24-chunk-bm25-answer-quality.md).
|
|
271
|
+
// Title/tag-safe via the tiered combine (#157). Callers opt back with "document".
|
|
272
|
+
const lexicalGranularity = options.lexicalGranularity ?? "chunk";
|
|
273
|
+
// Over-fetch returns all ranked candidates so an RBAC caller can filter then
|
|
274
|
+
// slice; the plain path keeps the top-`limit` contract other callers rely on.
|
|
275
|
+
const rankLimit = options.overFetch ? Number.POSITIVE_INFINITY : limit;
|
|
183
276
|
const matchQuery = buildMatchQuery(query);
|
|
184
277
|
const snippetTokens = tokenize(query);
|
|
185
|
-
|
|
186
|
-
|
|
278
|
+
// Skip embedding when vector weight is zero — avoids vectorUsed:true being
|
|
279
|
+
// reported for a pure-lexical call, which would misrepresent the ranking mode.
|
|
280
|
+
let queryEmbedding = null;
|
|
281
|
+
if (weights.vector > 0) {
|
|
282
|
+
const embedResult = await embedQuery(query);
|
|
283
|
+
queryEmbedding = embedResult.ok ? embedResult.value : null;
|
|
284
|
+
}
|
|
187
285
|
const { hits, vectorUsed } = rankDocuments(db, matchQuery, queryEmbedding, snippetTokens, {
|
|
188
286
|
weights,
|
|
189
|
-
limit,
|
|
287
|
+
limit: rankLimit,
|
|
190
288
|
excludePath: undefined,
|
|
289
|
+
lexicalGranularity,
|
|
191
290
|
});
|
|
192
291
|
return ok({
|
|
193
292
|
query,
|
|
@@ -205,6 +304,9 @@ export async function hybridSearch(db, query, options = {}) {
|
|
|
205
304
|
export function relatedSearch(db, path, options = {}) {
|
|
206
305
|
const weights = options.weights ?? DEFAULT_WEIGHTS;
|
|
207
306
|
const limit = options.limit ?? 10;
|
|
307
|
+
// See hybridSearch: over-fetch lets the RBAC-filtering tool handler drop
|
|
308
|
+
// restricted hits before slicing to the user-facing limit.
|
|
309
|
+
const rankLimit = options.overFetch ? Number.POSITIVE_INFINITY : limit;
|
|
208
310
|
const doc = getDocument(db, path);
|
|
209
311
|
if (!doc) {
|
|
210
312
|
return {
|
|
@@ -229,8 +331,9 @@ export function relatedSearch(db, path, options = {}) {
|
|
|
229
331
|
const matchQuery = sourceTokens.length === 0 ? null : sourceTokens.map((t) => `${t}*`).join(" OR ");
|
|
230
332
|
const { hits, vectorUsed } = rankDocuments(db, matchQuery, queryEmbedding, doc.tokens, {
|
|
231
333
|
weights,
|
|
232
|
-
limit,
|
|
334
|
+
limit: rankLimit,
|
|
233
335
|
excludePath: path,
|
|
336
|
+
lexicalGranularity: "document",
|
|
234
337
|
});
|
|
235
338
|
return ok({
|
|
236
339
|
path,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hybrid.js","sourceRoot":"","sources":["../../src/search/hybrid.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hybrid.js","sourceRoot":"","sources":["../../src/search/hybrid.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reindex.d.ts","sourceRoot":"","sources":["../../src/search/reindex.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAmH/D,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CActE;AAMD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IAGvB,OAAO,EAAE,eAAe,EAAE,CAAC;IAM3B,kBAAkB,EAAE,eAAe,EAAE,CAAC;IACtC,SAAS,EAAE,MAAM,CAAC;IAIlB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAM7B,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACpD;AAOD,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,EAAE,CAc/D;AA0ID,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,cAAmB,GACxB,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,CAyHvC;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IAKvB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AASD,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"reindex.d.ts","sourceRoot":"","sources":["../../src/search/reindex.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAmH/D,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CActE;AAMD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IAGvB,OAAO,EAAE,eAAe,EAAE,CAAC;IAM3B,kBAAkB,EAAE,eAAe,EAAE,CAAC;IACtC,SAAS,EAAE,MAAM,CAAC;IAIlB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAM7B,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACpD;AAOD,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,EAAE,CAc/D;AA0ID,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,cAAmB,GACxB,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,CAyHvC;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IAKvB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AASD,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC,CAmH7C"}
|
package/dist/search/reindex.js
CHANGED
|
@@ -73,7 +73,7 @@ async function buildManifest(vaultRoot) {
|
|
|
73
73
|
if (!resolved.ok)
|
|
74
74
|
return null;
|
|
75
75
|
try {
|
|
76
|
-
const st = await stat(resolved.value);
|
|
76
|
+
const st = await stat(resolved.value.absPath);
|
|
77
77
|
manifest[relPath] = st.mtimeMs;
|
|
78
78
|
}
|
|
79
79
|
catch {
|
|
@@ -164,7 +164,7 @@ async function stageOne(vaultRoot, relPath) {
|
|
|
164
164
|
const resolved = resolveVaultPath(vaultRoot, relPath);
|
|
165
165
|
if (!resolved.ok)
|
|
166
166
|
return { kind: "skipped", reason: `path could not be resolved: ${resolved.error.message}` };
|
|
167
|
-
const file = await readFile(resolved.value);
|
|
167
|
+
const file = await readFile(resolved.value.absPath);
|
|
168
168
|
if (!file.ok)
|
|
169
169
|
return { kind: "skipped", reason: `file could not be read: ${file.error.message}` };
|
|
170
170
|
const parsed = parseDocument(file.value);
|
|
@@ -390,12 +390,18 @@ export async function reindexVault(vaultRoot, opts = {}) {
|
|
|
390
390
|
// embeds only those whose (hash, model) pair is not already in the embeddings
|
|
391
391
|
// cache, evicts the document's stale chunk rows, and re-inserts.
|
|
392
392
|
export async function indexDocument(vaultRoot, relPath) {
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
393
|
+
// Open the index once and keep this handle for both the empty-check and the
|
|
394
|
+
// incremental write. The previous code opened, checked the count, closed,
|
|
395
|
+
// then reopened — paying the sqlite-vec extension load and 1-vector ABI
|
|
396
|
+
// smoke-test twice per write (finding E5). If the index turns out to be
|
|
397
|
+
// empty we close this handle and delegate to reindexVault, which manages
|
|
398
|
+
// its own connection.
|
|
399
|
+
const dbResult = openIndexForActiveProvider(vaultRoot);
|
|
400
|
+
if (!dbResult.ok)
|
|
401
|
+
return dbResult;
|
|
402
|
+
const db = dbResult.value;
|
|
403
|
+
if (documentCount(db) === 0) {
|
|
404
|
+
db.close();
|
|
399
405
|
const full = await reindexVault(vaultRoot);
|
|
400
406
|
if (!full.ok)
|
|
401
407
|
return full;
|
|
@@ -407,13 +413,10 @@ export async function indexDocument(vaultRoot, relPath) {
|
|
|
407
413
|
}
|
|
408
414
|
const outcome = await stageOne(vaultRoot, relPath);
|
|
409
415
|
if (outcome.kind !== "staged") {
|
|
416
|
+
db.close();
|
|
410
417
|
return err(new Error(`cannot index document: ${relPath} (${outcome.reason})`));
|
|
411
418
|
}
|
|
412
419
|
const { doc, chunks, hashes } = outcome.staged;
|
|
413
|
-
const dbResult = openIndexForActiveProvider(vaultRoot);
|
|
414
|
-
if (!dbResult.ok)
|
|
415
|
-
return dbResult;
|
|
416
|
-
const db = dbResult.value;
|
|
417
420
|
const createdAt = new Date().toISOString();
|
|
418
421
|
try {
|
|
419
422
|
const provider = getProvider();
|
|
@@ -480,7 +483,7 @@ export async function indexDocument(vaultRoot, relPath) {
|
|
|
480
483
|
const resolved = resolveVaultPath(vaultRoot, relPath);
|
|
481
484
|
if (resolved.ok) {
|
|
482
485
|
try {
|
|
483
|
-
const st = await stat(resolved.value);
|
|
486
|
+
const st = await stat(resolved.value.absPath);
|
|
484
487
|
stored[relPath] = st.mtimeMs;
|
|
485
488
|
writeManifest(db, stored);
|
|
486
489
|
}
|