@ruso-0/nreki 11.0.2 → 11.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/CHANGELOG.md +179 -0
  2. package/dist/bm25-engine.d.ts +102 -0
  3. package/dist/bm25-engine.d.ts.map +1 -0
  4. package/dist/bm25-engine.js +246 -0
  5. package/dist/bm25-engine.js.map +1 -0
  6. package/dist/compressor-foveal.d.ts.map +1 -1
  7. package/dist/compressor-foveal.js +27 -0
  8. package/dist/compressor-foveal.js.map +1 -1
  9. package/dist/engine/indexer.d.ts.map +1 -1
  10. package/dist/engine/indexer.js +11 -0
  11. package/dist/engine/indexer.js.map +1 -1
  12. package/dist/engine-types.d.ts +8 -0
  13. package/dist/engine-types.d.ts.map +1 -1
  14. package/dist/engine.d.ts +26 -0
  15. package/dist/engine.d.ts.map +1 -1
  16. package/dist/engine.js +112 -4
  17. package/dist/engine.js.map +1 -1
  18. package/dist/handlers/navigate.d.ts +15 -0
  19. package/dist/handlers/navigate.d.ts.map +1 -1
  20. package/dist/handlers/navigate.js +131 -8
  21. package/dist/handlers/navigate.js.map +1 -1
  22. package/dist/hybrid-engine.d.ts +92 -0
  23. package/dist/hybrid-engine.d.ts.map +1 -0
  24. package/dist/hybrid-engine.js +197 -0
  25. package/dist/hybrid-engine.js.map +1 -0
  26. package/dist/index.js +27 -5
  27. package/dist/index.js.map +1 -1
  28. package/dist/repo-map.d.ts.map +1 -1
  29. package/dist/repo-map.js +7 -0
  30. package/dist/repo-map.js.map +1 -1
  31. package/dist/router.d.ts +2 -1
  32. package/dist/router.d.ts.map +1 -1
  33. package/dist/router.js +6 -2
  34. package/dist/router.js.map +1 -1
  35. package/dist/utils/token-estimator.d.ts +4 -4
  36. package/dist/utils/token-estimator.d.ts.map +1 -1
  37. package/dist/utils/token-estimator.js +34 -6
  38. package/dist/utils/token-estimator.js.map +1 -1
  39. package/package.json +1 -1
  40. package/src/.nreki/repo-map.json +1 -0
  41. package/src/bm25-engine.ts +295 -0
  42. package/src/compressor-foveal.ts +28 -0
  43. package/src/engine/indexer.ts +10 -0
  44. package/src/engine-types.ts +8 -0
  45. package/src/engine.ts +156 -45
  46. package/src/handlers/navigate.ts +162 -16
  47. package/src/hybrid-engine.ts +282 -0
  48. package/src/index.ts +38 -12
  49. package/src/repo-map.ts +34 -28
  50. package/src/router.ts +4 -2
  51. package/src/utils/token-estimator.ts +43 -15
  52. package/templates/AGENTS.md +17 -37
  53. package/templates/CLAUDE.md +22 -36
  54. package/templates/SKILL.md +2 -1
package/CHANGELOG.md CHANGED
@@ -2,6 +2,185 @@
2
2
 
3
3
  All notable changes to NREKI will be documented in this file.
4
4
 
5
+ ## [11.2.1] - 2026-05-19
6
+
7
+ Hot-fix release. v11.2.0 surfaced an EOF-style MCP crash on real-world
8
+ repositories when Claude Code invoked `nreki_navigate action="hybrid_search"`
9
+ (and to a lesser extent `search`, `map`, `orphan_oracle`, `fast_grep`).
10
+ Empirical reproduction via stdio probe in this repo (D:/Nreki, ~12k source
11
+ files, heavy dot-trees `.eval-phase5-cache/` and `.venv-aider/`) showed the
12
+ server never responded inside the client's tool-call timeout window — Claude
13
+ Code surfaced this as `connection closed: calling tools/call: client is closing: EOF`.
14
+
15
+ ### Fixed
16
+
17
+ - **MCP EOF on first `hybrid_search` / `search` on real repos** — three
18
+ independent directory walks (NREKI indexer `walkDirectory`, the Phase 5
19
+ repo-map `walkFiles`, and chokidar's initial scan) used synchronous
20
+ `fs.readdirSync` and did NOT skip dot-prefixed directories. Heavy
21
+ dot-trees (`.venv*`, `.cache`, `.turbo`, `.parcel-cache`, `.pytest_cache`,
22
+ `.mypy_cache`, `.ruff_cache`, `.eval-phase5-cache`, `.nreki-runtime`,
23
+ etc.) blocked the MCP event loop for tens of seconds to minutes. All
24
+ three walkers now mirror `BM25Engine.walkSourceFiles`'s policy and skip
25
+ any dot-prefixed directory.
26
+ - **Watcher initialization no longer blocks server startup** — pre-v11.2.1
27
+ `await engine.startWatcher()` ran inside `main()` AFTER `server.connect(transport)`,
28
+ so the MCP transport accepted requests but the watcher's chokidar scan
29
+ prevented handlers from making forward progress. The watcher now starts
30
+ in the background; readiness is logged when chokidar emits `ready`.
31
+ - **First-call full-project indexing no longer awaited inside tool
32
+ handlers** — `hybrid_search`, `search`, `map`, and `orphan_oracle` now
33
+ kick off `engine.indexDirectory()` in the background via
34
+ `engine.ensureIndexedBackground()` and return immediately with whatever
35
+ the current index supports. `hybrid_search` surfaces useful BM25 results
36
+ on the first call even while NREKI's semantic index warms up; `search`
37
+ returns a "warming" hint guiding the user to `hybrid_search` / `fast_grep`
38
+ for an immediate answer. `fast_grep` keeps its existing synchronous
39
+ bootstrap because the RAM cache contract depends on it.
40
+ - **Defensive `unhandledRejection` / `uncaughtException` handlers** —
41
+ unexpected async errors no longer terminate the MCP process. Both are
42
+ logged to stderr (never stdout, which would corrupt JSON-RPC) and the
43
+ server keeps serving.
44
+
45
+ ### Internal
46
+
47
+ - `NrekiEngine.ensureIndexedBackground()` coalesces concurrent
48
+ first-call indexing requests onto a single in-flight promise.
49
+ - chokidar v4 `ignored` option migrated from an array of glob strings
50
+ (a v3 form not natively interpreted by v4) to a predicate function
51
+ that combines dot-prefix skipping with the configured glob list via
52
+ `picomatch.isMatch`.
53
+
54
+ ## [11.2.0] - 2026-05-18
55
+
56
+ ### Added
57
+ - **Hybrid Runtime Integration (Phase 5.5.2)**: New `nreki_navigate
58
+ action="hybrid_search"` exposes the Type Ledger semantic + BM25
59
+ lexical fusion (RRF) documented in the Phase 5 paper to the
60
+ production MCP runtime. Previously only reachable via eval scripts.
61
+ - **`src/bm25-engine.ts`**: BM25 lexical retrieval migrated from
62
+ `scripts/eval-phase5/runners/bm25-runner.ts` to production runtime.
63
+ Standard Okapi (k1=1.5, b=0.75); code-aware tokenization (PascalCase
64
+ / snake_case / camelCase decomposition, 2-char minimum). Lazy
65
+ in-memory index built on first `search()`; invalidated on
66
+ `indexFile()` / `indexDirectory()` mutations.
67
+ - **`src/hybrid-engine.ts`**: Hybrid RRF engine. Calls NREKI semantic
68
+ search + BM25 in parallel, fuses file rankings via Reciprocal Rank
69
+ Fusion (k=60), deterministic tie-break by `localeCompare`. Returns
70
+ unified results with `source: "nreki" | "bm25" | "both"` origin
71
+ tracking.
72
+ - **Foveal compression on BM25-only files (Reto 5)**: Files surfaced
73
+ exclusively by BM25 (≥100 lines) receive `tfcCompress` with a focus
74
+ symbol extracted from the query. Aligns with the
75
+ `compressor-foveal.ts:109` small-file bypass threshold to avoid
76
+ no-op compressor calls.
77
+ - **`NrekiEngine.getHybridEngine()` + `invalidateHybridIndex()`**:
78
+ lazy-construction of the hybrid stack; BM25 cache auto-invalidates
79
+ on `indexFile()` and `indexDirectory()`.
80
+ - **`BM25EngineOptions.excludedDirs`**: configurable directory exclusion
81
+ for projects with non-standard build/fixture roots. Default excludes
82
+ `node_modules`, `.git`, `.nreki`, `dist`, `build`, `coverage`,
83
+ `.next`, `__pycache__`, `corpus`, plus any dot-prefixed directory.
84
+ - **`scripts/benchmark-hybrid-smoke.ts`**: reproducible dogfood smoke
85
+ bench (`action="search"` vs `action="hybrid_search"`) on NREKI's own
86
+ `src/`. Run with `npx tsx scripts/benchmark-hybrid-smoke.ts`.
87
+ - **`docs/sprint-6.5-empirical.md`**: honest Sprint 6.5 empirical
88
+ findings + N=99 PolyBench re-bench deferral disclosure.
89
+ - **28 new tests**: `tests/bm25-engine.test.ts` (16) +
90
+ `tests/hybrid-engine.test.ts` (12). Full suite: 1384 pass.
91
+
92
+ ### Changed
93
+ - **`nreki_navigate` action enum**: `hybrid_search` added to
94
+ `src/index.ts` MCP schema and `src/router.ts` switch dispatch.
95
+ Existing actions (`search`, `fast_grep`, `definition`, `references`,
96
+ `outline`, `map`, `prepare_refactor`, `orphan_oracle`, `type_shape`,
97
+ `type_graph`) preserved unchanged — backward compatible.
98
+
99
+ ### Internal
100
+ - Hybrid retrieval previously available only in eval scripts
101
+ (`scripts/eval-phase5/runners/hybrid-runner.ts`). The eval runner
102
+ remains unchanged for paper reproducibility; production now uses
103
+ the migrated `src/hybrid-engine.ts`.
104
+ - "El mejor que se quede" architectural decision: hybrid USES the
105
+ underlying retrievers, does NOT replace them. Users still pick
106
+ `search` for pure topological queries (lower tokens) and
107
+ `hybrid_search` for accuracy-critical retrieval (≈3-5x tokens, per
108
+ Sprint 6.4 paper; dogfood smoke shows up to ~3x on tiny corpora).
109
+
110
+ ### Empirical findings (honest)
111
+ - **Dogfood smoke (73 files, 8 queries)**: `search` recall 60% vs
112
+ `hybrid_search` recall 60% (Δ=0pp). Hybrid pays 207% token overhead
113
+ with no recall gain on this micro-corpus. This is expected — the
114
+ Sprint 6.4 paper's +15pp FHR gain was measured on N=99 diverse
115
+ external repos, not on a single internal codebase.
116
+ - **Sprint 6.5 N=99 PolyBench re-benchmark: DEFERRED**. The directive
117
+ required this empirical step; this commit ships without it. Reason:
118
+ the eval orchestrator (`scripts/eval-phase5/orchestrate.ts`)
119
+ constructs its own runners and would need re-plumbing to invoke the
120
+ migrated `HybridEngine`; the bench itself is multi-hour. Tracked as
121
+ Sprint 6.5.1 in `docs/sprint-6.5-empirical.md`.
122
+ - **Token cost is real, not noise**. BM25 returns file-level payloads;
123
+ even with foveal compression on BM25-only files ≥100 lines, hybrid
124
+ hits cost more than NREKI-only AST chunks.
125
+
126
+ ### Wall-clock honesty
127
+ - Original Pipipi estimate: 4 hours. Actual: ~3 hours implementation
128
+ + path-rooting bug discovery + dot-dir corpus walk bug discovery +
129
+ bench-corpus hang debug. Closer to the directive's "1-2 días"
130
+ honest estimate than the 4-hour Pipipi figure.
131
+
132
+ ## [11.1.0] - 2026-05-18
133
+
134
+ ### Added
135
+ - **Real BPE tokenizer**: tiktoken cl100k_base integration via
136
+ `src/utils/token-estimator.ts`. Replaces chars/3.5 heuristic for
137
+ token cost estimation. Heuristic preserved as fallback (zero-downtime).
138
+ Empirical verification: 72-file benchmark 276,516 raw → 60,732
139
+ compressed = 78% savings sostained con real BPE tokenizer.
140
+ - **Defense-in-depth conditional compression**: compressor-level
141
+ bypass for files <100 lines OR <1024 bytes (`src/compressor-foveal.ts`
142
+ :102-123). Complements existing handler-level bypass
143
+ (`src/handlers/code/read.ts:84`). Zero overhead instances confirmed
144
+ empirically across all file-size buckets (72 files tested).
145
+ - **`bySize` SessionReport field**: per-file-size tracking buckets
146
+ (<100L, 100-299L, 300-999L, ≥1000L) in `engine.getSessionReport()`
147
+ output. Enables empirical analysis of compression effectiveness by
148
+ file size class.
149
+ - **Empirical benchmark scripts**: `scripts/benchmark-token-economics.ts`
150
+ + `scripts/simulate-claude-session.ts` for ongoing verification.
151
+ - **Token economics empirical verify documentation**:
152
+ `docs/token-economics-empirical-verify.md` documents Sprint Empirical
153
+ Verify findings honest including methodology caveats.
154
+
155
+ ### Changed
156
+ - **Template adelgazamiento**:
157
+ `templates/CLAUDE.md` 3,965 → 1,670 bytes (495 BPE tokens, ~58% reduction)
158
+ `templates/AGENTS.md` 3,885 → 1,253 bytes (372 BPE tokens, ~68% reduction)
159
+ Combined 867 BPE tokens (~61% reduction, ~8% over Apr 2026 target
160
+ of 800 combined tokens, honest disclosure of remaining gap).
161
+ - **Token cost estimation accuracy**: real BPE tokenizer measurement
162
+ replaces direccional-but-imprecise chars/3.5 heuristic. Heuristic
163
+ validated within ~10% magnitude accuracy of real BPE empírico.
164
+
165
+ ### Internal
166
+ - Sprint Empirical Token Economics Verify executed pre-Phase 5.5.1:
167
+ - 72-file per-bucket benchmark
168
+ - 45-file session simulation
169
+ - Zero overhead instances confirmed empírico
170
+ - Claim "29 calls vs 5-7 without TFC-Pro" marked UNVERIFIABLE
171
+ (no measurement code exists)
172
+ - Reto 8 Causal Program Slicing Phase 0 design committed
173
+ (`docs/adrs/reto-8-causal-slicing/`, strategic pause Nova Phase 8.2-8.5
174
+ prerequisite for Reto 7 Compiler-Hijacking)
175
+
176
+ ### Deferred
177
+ - **Phase 5.5.2**: Hybrid runtime integration (Reto 5).
178
+ Migrate `scripts/eval-phase5/runners/hybrid-runner.ts` →
179
+ `src/hybrid-engine.ts`. Foveal compression on BM25-fused files.
180
+ - **Phase 5.5.3**: Comparative head-to-head benchmarks
181
+ (NREKI vs Corsa, Zilliz Claude Context, codebase-memory-mcp, GitNexus).
182
+ Currently disclosed as research gap.
183
+
5
184
  ## [11.0.2] - 2026-05-16
6
185
 
7
186
  Mini-sprint closure for v11.0.1 cabos sueltos. No new features; only
@@ -0,0 +1,102 @@
1
+ /**
2
+ * src/bm25-engine.ts — Production BM25 lexical retrieval engine.
3
+ *
4
+ * Phase 5.5.2 migration: ported from
5
+ * scripts/eval-phase5/runners/bm25-runner.ts
6
+ * to production runtime so nreki_navigate action="hybrid_search" can
7
+ * fuse Type Ledger semantic + BM25 lexical via RRF.
8
+ *
9
+ * Standard Okapi BM25 (Robertson/Walker 1994, k1=1.5, b=0.75):
10
+ * score(D, Q) = Σ IDF(qi) · (f(qi,D)·(k1+1)) /
11
+ * (f(qi,D) + k1·(1 - b + b·|D|/avgdl))
12
+ * IDF(qi) = ln((N - n(qi) + 0.5) / (n(qi) + 0.5) + 1)
13
+ *
14
+ * Tokenization: code-aware (PascalCase + snake_case + camelCase split,
15
+ * 2-char minimum, no stopword removal — IDF handles common terms).
16
+ *
17
+ * Production differences vs. eval runner:
18
+ * - Index built lazily on first search() call, cached in-memory
19
+ * (eval rebuilds per-task).
20
+ * - File walk uses NREKI's project root + DEFAULT_EXTENSIONS via
21
+ * constructor params (eval hard-codes .ts/.tsx/.js/.jsx).
22
+ * - No anti-tests filter by default (eval excludes for ground-truth
23
+ * alignment; production users may legitimately search tests).
24
+ * - `invalidate()` method for chokidar wiring (call on file change).
25
+ */
26
+ export declare const BM25_K1 = 1.5;
27
+ export declare const BM25_B = 0.75;
28
+ export interface BM25DocStats {
29
+ path: string;
30
+ term_freq: Map<string, number>;
31
+ length: number;
32
+ }
33
+ export interface BM25Index {
34
+ docs: BM25DocStats[];
35
+ avg_doc_length: number;
36
+ doc_freq: Map<string, number>;
37
+ total_docs: number;
38
+ }
39
+ export interface BM25SearchResult {
40
+ /** Workspace-relative, forward-slash path. */
41
+ path: string;
42
+ /** Raw BM25 score (not normalized; higher = more relevant). */
43
+ score: number;
44
+ }
45
+ export interface BM25EngineOptions {
46
+ /** Override default source extensions (e.g. for narrow language scope). */
47
+ extensions?: ReadonlySet<string>;
48
+ /**
49
+ * Override default excluded directory names. Use this when your
50
+ * project has a custom build/fixture root (e.g. ".turbo", "vendor").
51
+ * Pattern is exact-name match on directory basename.
52
+ */
53
+ excludedDirs?: ReadonlySet<string>;
54
+ /** k1 saturation parameter. Default 1.5 (Robertson/Walker canonical). */
55
+ k1?: number;
56
+ /** b length-normalization parameter. Default 0.75. */
57
+ b?: number;
58
+ }
59
+ /**
60
+ * Decompose an identifier-shaped token into subtokens. Returns the
61
+ * original lowercase token plus PascalCase / snake_case parts.
62
+ * Returns [] for tokens shorter than 2 chars.
63
+ */
64
+ export declare function splitIdentifier(token: string): string[];
65
+ /** Tokenize text for BM25 indexing. See module doc for design notes. */
66
+ export declare function tokenizeForBM25(text: string): string[];
67
+ /**
68
+ * Score a doc against query terms. Repeated query terms accumulate
69
+ * (so ["foo","foo","bar"] weighs foo twice).
70
+ */
71
+ export declare function scoreBM25(doc: BM25DocStats, queryTerms: string[], index: BM25Index, k1?: number, b?: number): number;
72
+ /** Tokenize a free-text query the same way docs are tokenized. */
73
+ export declare function tokenizeQuery(query: string): string[];
74
+ /**
75
+ * Production BM25 retrieval engine. Lazy-builds an in-memory file-level
76
+ * index on first search(); caches until invalidate() is called.
77
+ */
78
+ export declare class BM25Engine {
79
+ private readonly projectRoot;
80
+ private indexCache;
81
+ private readonly extensions;
82
+ private readonly excludedDirs;
83
+ private readonly k1;
84
+ private readonly b;
85
+ constructor(projectRoot: string, opts?: BM25EngineOptions);
86
+ /** Drop the cached index. Call when project files change on disk. */
87
+ invalidate(): void;
88
+ /** True if an index has been built and cached. */
89
+ hasIndex(): boolean;
90
+ /** Number of files in the cached index (0 if not built). */
91
+ indexedFileCount(): number;
92
+ /**
93
+ * Top-K BM25 retrieval. Returns ranked file-level scores
94
+ * (highest first). Empty array if query has no indexable tokens
95
+ * or no doc matches.
96
+ */
97
+ search(query: string, topK?: number): Promise<BM25SearchResult[]>;
98
+ private ensureIndex;
99
+ private buildIndex;
100
+ private walkSourceFiles;
101
+ }
102
+ //# sourceMappingURL=bm25-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bm25-engine.d.ts","sourceRoot":"","sources":["../src/bm25-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAKH,eAAO,MAAM,OAAO,MAAM,CAAC;AAC3B,eAAO,MAAM,MAAM,OAAO,CAAC;AAsB3B,MAAM,WAAW,YAAY;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACtB,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC7B,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAC9B,2EAA2E;IAC3E,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC;;;;OAIG;IACH,YAAY,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACnC,yEAAyE;IACzE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,sDAAsD;IACtD,CAAC,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAwBvD;AAED,wEAAwE;AACxE,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAUtD;AAWD;;;GAGG;AACH,wBAAgB,SAAS,CACrB,GAAG,EAAE,YAAY,EACjB,UAAU,EAAE,MAAM,EAAE,EACpB,KAAK,EAAE,SAAS,EAChB,EAAE,GAAE,MAAgB,EACpB,CAAC,GAAE,MAAe,GACnB,MAAM,CAgBR;AAED,kEAAkE;AAClE,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAErD;AAED;;;GAGG;AACH,qBAAa,UAAU;IAOP,OAAO,CAAC,QAAQ,CAAC,WAAW;IANxC,OAAO,CAAC,UAAU,CAA0B;IAC5C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsB;IACjD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IACnD,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAS;gBAEE,WAAW,EAAE,MAAM,EAAE,IAAI,GAAE,iBAAsB;IAO9E,qEAAqE;IACrE,UAAU,IAAI,IAAI;IAIlB,kDAAkD;IAClD,QAAQ,IAAI,OAAO;IAInB,4DAA4D;IAC5D,gBAAgB,IAAI,MAAM;IAI1B;;;;OAIG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,MAAW,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;YAiB7D,WAAW;YAMX,UAAU;YA8BV,eAAe;CA8BhC"}
@@ -0,0 +1,246 @@
1
+ /**
2
+ * src/bm25-engine.ts — Production BM25 lexical retrieval engine.
3
+ *
4
+ * Phase 5.5.2 migration: ported from
5
+ * scripts/eval-phase5/runners/bm25-runner.ts
6
+ * to production runtime so nreki_navigate action="hybrid_search" can
7
+ * fuse Type Ledger semantic + BM25 lexical via RRF.
8
+ *
9
+ * Standard Okapi BM25 (Robertson/Walker 1994, k1=1.5, b=0.75):
10
+ * score(D, Q) = Σ IDF(qi) · (f(qi,D)·(k1+1)) /
11
+ * (f(qi,D) + k1·(1 - b + b·|D|/avgdl))
12
+ * IDF(qi) = ln((N - n(qi) + 0.5) / (n(qi) + 0.5) + 1)
13
+ *
14
+ * Tokenization: code-aware (PascalCase + snake_case + camelCase split,
15
+ * 2-char minimum, no stopword removal — IDF handles common terms).
16
+ *
17
+ * Production differences vs. eval runner:
18
+ * - Index built lazily on first search() call, cached in-memory
19
+ * (eval rebuilds per-task).
20
+ * - File walk uses NREKI's project root + DEFAULT_EXTENSIONS via
21
+ * constructor params (eval hard-codes .ts/.tsx/.js/.jsx).
22
+ * - No anti-tests filter by default (eval excludes for ground-truth
23
+ * alignment; production users may legitimately search tests).
24
+ * - `invalidate()` method for chokidar wiring (call on file change).
25
+ */
26
+ import * as fs from "node:fs/promises";
27
+ import * as path from "node:path";
28
+ export const BM25_K1 = 1.5;
29
+ export const BM25_B = 0.75;
30
+ const CAMEL_SEP = String.fromCharCode(124);
31
+ /** Extensions BM25 indexes by default. Mirrors NREKI engine DEFAULT_EXTENSIONS. */
32
+ const DEFAULT_SOURCE_EXTENSIONS = new Set([
33
+ ".ts", ".tsx", ".mts", ".cts",
34
+ ".js", ".jsx", ".mjs", ".cjs",
35
+ ".py", ".go",
36
+ ".kt", ".kts",
37
+ ".java",
38
+ ".cpp", ".cc", ".cxx", ".hpp", ".hh", ".hxx",
39
+ ".c", ".h",
40
+ ]);
41
+ /** Directory names excluded during the walk. Mirrors NREKI engine DEFAULT_IGNORE
42
+ * plus benchmark/fixture roots that bloat lexical signal without user value. */
43
+ const DEFAULT_EXCLUDED_DIRS = new Set([
44
+ "node_modules", ".git", ".nreki", "dist", "build", "coverage",
45
+ ".next", "__pycache__", "corpus",
46
+ ]);
47
+ /**
48
+ * Decompose an identifier-shaped token into subtokens. Returns the
49
+ * original lowercase token plus PascalCase / snake_case parts.
50
+ * Returns [] for tokens shorter than 2 chars.
51
+ */
52
+ export function splitIdentifier(token) {
53
+ const lower = token.toLowerCase();
54
+ if (lower.length < 2)
55
+ return [];
56
+ const parts = new Set();
57
+ parts.add(lower);
58
+ for (const piece of lower.split("_")) {
59
+ if (piece.length >= 2)
60
+ parts.add(piece);
61
+ }
62
+ // PascalCase / camelCase split:
63
+ // "SuggestModel" -> ["Suggest", "Model"]
64
+ // "HTTPServer" -> ["HTTP", "Server"]
65
+ // "parseURLPath" -> ["parse", "URL", "Path"]
66
+ const camelBoundary = token
67
+ .replace(/([a-z0-9])([A-Z])/g, `$1${CAMEL_SEP}$2`)
68
+ .replace(/([A-Z]+)([A-Z][a-z])/g, `$1${CAMEL_SEP}$2`)
69
+ .split(CAMEL_SEP);
70
+ for (const piece of camelBoundary) {
71
+ const p = piece.toLowerCase();
72
+ if (p.length >= 2)
73
+ parts.add(p);
74
+ }
75
+ return [...parts];
76
+ }
77
+ /** Tokenize text for BM25 indexing. See module doc for design notes. */
78
+ export function tokenizeForBM25(text) {
79
+ const out = [];
80
+ const raw = text.split(/[^a-zA-Z0-9_]+/);
81
+ for (const tok of raw) {
82
+ if (tok.length < 2)
83
+ continue;
84
+ for (const sub of splitIdentifier(tok)) {
85
+ out.push(sub);
86
+ }
87
+ }
88
+ return out;
89
+ }
90
+ function buildDocStats(rel, content) {
91
+ const tokens = tokenizeForBM25(content);
92
+ const tf = new Map();
93
+ for (const t of tokens) {
94
+ tf.set(t, (tf.get(t) ?? 0) + 1);
95
+ }
96
+ return { path: rel, term_freq: tf, length: tokens.length };
97
+ }
98
+ /**
99
+ * Score a doc against query terms. Repeated query terms accumulate
100
+ * (so ["foo","foo","bar"] weighs foo twice).
101
+ */
102
+ export function scoreBM25(doc, queryTerms, index, k1 = BM25_K1, b = BM25_B) {
103
+ if (index.total_docs === 0 || index.avg_doc_length === 0)
104
+ return 0;
105
+ let score = 0;
106
+ const avgdl = index.avg_doc_length;
107
+ const N = index.total_docs;
108
+ for (const qi of queryTerms) {
109
+ const tf = doc.term_freq.get(qi);
110
+ if (tf === undefined)
111
+ continue;
112
+ const df = index.doc_freq.get(qi) ?? 0;
113
+ const idf = Math.log((N - df + 0.5) / (df + 0.5) + 1);
114
+ const denom = tf + k1 * (1 - b + b * (doc.length / avgdl));
115
+ const tfPart = (tf * (k1 + 1)) / denom;
116
+ score += idf * tfPart;
117
+ }
118
+ return score;
119
+ }
120
+ /** Tokenize a free-text query the same way docs are tokenized. */
121
+ export function tokenizeQuery(query) {
122
+ return tokenizeForBM25(query);
123
+ }
124
+ /**
125
+ * Production BM25 retrieval engine. Lazy-builds an in-memory file-level
126
+ * index on first search(); caches until invalidate() is called.
127
+ */
128
+ export class BM25Engine {
129
+ projectRoot;
130
+ indexCache = null;
131
+ extensions;
132
+ excludedDirs;
133
+ k1;
134
+ b;
135
+ constructor(projectRoot, opts = {}) {
136
+ this.projectRoot = projectRoot;
137
+ this.extensions = opts.extensions ?? DEFAULT_SOURCE_EXTENSIONS;
138
+ this.excludedDirs = opts.excludedDirs ?? DEFAULT_EXCLUDED_DIRS;
139
+ this.k1 = opts.k1 ?? BM25_K1;
140
+ this.b = opts.b ?? BM25_B;
141
+ }
142
+ /** Drop the cached index. Call when project files change on disk. */
143
+ invalidate() {
144
+ this.indexCache = null;
145
+ }
146
+ /** True if an index has been built and cached. */
147
+ hasIndex() {
148
+ return this.indexCache !== null;
149
+ }
150
+ /** Number of files in the cached index (0 if not built). */
151
+ indexedFileCount() {
152
+ return this.indexCache?.total_docs ?? 0;
153
+ }
154
+ /**
155
+ * Top-K BM25 retrieval. Returns ranked file-level scores
156
+ * (highest first). Empty array if query has no indexable tokens
157
+ * or no doc matches.
158
+ */
159
+ async search(query, topK = 10) {
160
+ const index = await this.ensureIndex();
161
+ const queryTerms = tokenizeQuery(query);
162
+ if (queryTerms.length === 0)
163
+ return [];
164
+ const scored = [];
165
+ for (const doc of index.docs) {
166
+ const s = scoreBM25(doc, queryTerms, index, this.k1, this.b);
167
+ if (s > 0)
168
+ scored.push([doc.path, s]);
169
+ }
170
+ scored.sort((a, b2) => {
171
+ const d = b2[1] - a[1];
172
+ return d !== 0 ? d : a[0].localeCompare(b2[0]);
173
+ });
174
+ return scored.slice(0, topK).map(([p, score]) => ({ path: p, score }));
175
+ }
176
+ async ensureIndex() {
177
+ if (this.indexCache)
178
+ return this.indexCache;
179
+ this.indexCache = await this.buildIndex();
180
+ return this.indexCache;
181
+ }
182
+ async buildIndex() {
183
+ const files = await this.walkSourceFiles();
184
+ const docs = [];
185
+ const docFreq = new Map();
186
+ let totalLength = 0;
187
+ for (const rel of files) {
188
+ const abs = path.join(this.projectRoot, rel);
189
+ let content;
190
+ try {
191
+ content = await fs.readFile(abs, "utf-8");
192
+ }
193
+ catch {
194
+ continue;
195
+ }
196
+ const stats = buildDocStats(rel, content);
197
+ docs.push(stats);
198
+ totalLength += stats.length;
199
+ for (const term of stats.term_freq.keys()) {
200
+ docFreq.set(term, (docFreq.get(term) ?? 0) + 1);
201
+ }
202
+ }
203
+ return {
204
+ docs,
205
+ avg_doc_length: docs.length > 0 ? totalLength / docs.length : 0,
206
+ doc_freq: docFreq,
207
+ total_docs: docs.length,
208
+ };
209
+ }
210
+ async walkSourceFiles() {
211
+ const out = [];
212
+ const walk = async (dir) => {
213
+ let entries;
214
+ try {
215
+ entries = await fs.readdir(dir, { withFileTypes: true });
216
+ }
217
+ catch {
218
+ return;
219
+ }
220
+ for (const e of entries) {
221
+ const abs = path.join(dir, e.name);
222
+ if (e.isDirectory()) {
223
+ // Skip explicit excludes + ANY dot-prefixed directory.
224
+ // Dot dirs catch .git, .next, .nreki, .venv-*, .cache,
225
+ // and any tool-specific scratch space without enumeration.
226
+ if (this.excludedDirs.has(e.name))
227
+ continue;
228
+ if (e.name.startsWith("."))
229
+ continue;
230
+ await walk(abs);
231
+ continue;
232
+ }
233
+ if (!e.isFile())
234
+ continue;
235
+ if (!this.extensions.has(path.extname(e.name).toLowerCase()))
236
+ continue;
237
+ const rel = path.relative(this.projectRoot, abs).split(path.sep).join("/");
238
+ out.push(rel);
239
+ }
240
+ };
241
+ await walk(this.projectRoot);
242
+ out.sort();
243
+ return out;
244
+ }
245
+ }
246
+ //# sourceMappingURL=bm25-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bm25-engine.js","sourceRoot":"","sources":["../src/bm25-engine.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"compressor-foveal.d.ts","sourceRoot":"","sources":["../src/compressor-foveal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAOH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAgB/C,MAAM,WAAW,SAAS;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE;QACH,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,cAAc,EAAE,MAAM,CAAC;QACvB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,QAAQ,EAAE,MAAM,CAAC;QACjB,eAAe,EAAE,MAAM,CAAC;QAExB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,mBAAmB,EAAE,MAAM,CAAC;QAC5B,kBAAkB,EAAE,MAAM,CAAC;KAC9B,CAAC;CACL;AAED,MAAM,MAAM,gBAAgB,GACtB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC;AAsB9F,MAAM,WAAW,mBAAmB;IAChC,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAsB,WAAW,CAC7B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,WAAW,EACnB,aAAa,CAAC,EAAE,mBAAmB,GACpC,OAAO,CAAC,gBAAgB,CAAC,CA8R3B"}
1
+ {"version":3,"file":"compressor-foveal.d.ts","sourceRoot":"","sources":["../src/compressor-foveal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAOH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAgB/C,MAAM,WAAW,SAAS;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE;QACH,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,cAAc,EAAE,MAAM,CAAC;QACvB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,QAAQ,EAAE,MAAM,CAAC;QACjB,eAAe,EAAE,MAAM,CAAC;QAExB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,mBAAmB,EAAE,MAAM,CAAC;QAC5B,kBAAkB,EAAE,MAAM,CAAC;KAC9B,CAAC;CACL;AAED,MAAM,MAAM,gBAAgB,GACtB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC;AAsB9F,MAAM,WAAW,mBAAmB;IAChC,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAsB,WAAW,CAC7B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,WAAW,EACnB,aAAa,CAAC,EAAE,mBAAmB,GACpC,OAAO,CAAC,gBAAgB,CAAC,CA0T3B"}
@@ -60,6 +60,33 @@ function extractCausalRefs(code) {
60
60
  }
61
61
  export async function tfcCompress(filePath, content, focusInput, engine, crossFileOpts) {
62
62
  const originalSize = content.length;
63
+ // Phase 5.5.1 defense-in-depth: small-file bypass at compressor level.
64
+ // Handler-level bypass (read.ts:84) handles the common path, but this
65
+ // protects against direct tfcCompress calls with tiny files where
66
+ // compression header overhead would exceed savings.
67
+ const lineCount = content.split("\n").length;
68
+ if (lineCount < 100 || originalSize < 1024) {
69
+ return {
70
+ kind: "success",
71
+ data: {
72
+ compressed: content,
73
+ originalSize,
74
+ compressedSize: originalSize,
75
+ ratio: 0,
76
+ tokensSaved: 0,
77
+ zones: {
78
+ foveas: focusInput.split(",").map(s => s.trim()).filter(Boolean),
79
+ localParafovea: 0,
80
+ externalParafovea: 0,
81
+ upstream: 0,
82
+ darkMatterLines: 0,
83
+ crossFileUpstream: 0,
84
+ crossFileDownstream: 0,
85
+ crossFileTruncated: 0,
86
+ },
87
+ },
88
+ };
89
+ }
63
90
  // O(1) parse cache by content hash
64
91
  const contentHash = crypto.createHash("sha256").update(content).digest("hex");
65
92
  let parseResult;
@@ -1 +1 @@
1
- {"version":3,"file":"compressor-foveal.js","sourceRoot":"","sources":["../src/compressor-foveal.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compressor-foveal.js","sourceRoot":"","sources":["../src/compressor-foveal.ts"],"names":[],"mappings":"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"}