@massa-ai/core 1.15.0 → 1.16.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/dist/services/search/contextual-search-rlm.d.ts +35 -14
- package/dist/services/search/contextual-search-rlm.d.ts.map +1 -1
- package/dist/services/search/contextual-search-rlm.js +274 -53
- package/dist/services/search/contextual-search-rlm.js.map +1 -1
- package/dist/services/search/graph-stream.d.ts +36 -0
- package/dist/services/search/graph-stream.d.ts.map +1 -0
- package/dist/services/search/{rlm-synapse.js → graph-stream.js} +11 -90
- package/dist/services/search/graph-stream.js.map +1 -0
- package/dist/services/search/hybrid-search.d.ts +101 -0
- package/dist/services/search/hybrid-search.d.ts.map +1 -0
- package/dist/services/search/{rlm-search.js → hybrid-search.js} +89 -46
- package/dist/services/search/hybrid-search.js.map +1 -0
- package/dist/services/search/index-admin.d.ts +130 -0
- package/dist/services/search/index-admin.d.ts.map +1 -0
- package/dist/services/search/{rlm-admin.js → index-admin.js} +34 -18
- package/dist/services/search/index-admin.js.map +1 -0
- package/dist/services/search/project-indexer.d.ts +159 -0
- package/dist/services/search/project-indexer.d.ts.map +1 -0
- package/dist/services/search/{rlm-indexing.js → project-indexer.js} +51 -79
- package/dist/services/search/project-indexer.js.map +1 -0
- package/dist/services/search/session-bias.d.ts +41 -0
- package/dist/services/search/session-bias.d.ts.map +1 -0
- package/dist/services/search/session-bias.js +76 -0
- package/dist/services/search/session-bias.js.map +1 -0
- package/package.json +2 -2
- package/dist/services/search/rlm-admin.d.ts +0 -22
- package/dist/services/search/rlm-admin.d.ts.map +0 -1
- package/dist/services/search/rlm-admin.js.map +0 -1
- package/dist/services/search/rlm-indexing.d.ts +0 -71
- package/dist/services/search/rlm-indexing.d.ts.map +0 -1
- package/dist/services/search/rlm-indexing.js.map +0 -1
- package/dist/services/search/rlm-search.d.ts +0 -27
- package/dist/services/search/rlm-search.d.ts.map +0 -1
- package/dist/services/search/rlm-search.js.map +0 -1
- package/dist/services/search/rlm-synapse.d.ts +0 -44
- package/dist/services/search/rlm-synapse.d.ts.map +0 -1
- package/dist/services/search/rlm-synapse.js.map +0 -1
|
@@ -25,17 +25,18 @@ import { FileFilterCache } from "./file-filter-cache.js";
|
|
|
25
25
|
import { QueryUnderstandingService } from "./query-understanding.js";
|
|
26
26
|
import type { SynapseManager } from "../synapse/synapse-manager.js";
|
|
27
27
|
import type { SessionRegistry } from "../synapse/session/session-registry.js";
|
|
28
|
-
import
|
|
29
|
-
import
|
|
30
|
-
import
|
|
31
|
-
import
|
|
32
|
-
import
|
|
33
|
-
import { type IndexProjectOptions } from "./
|
|
34
|
-
import type
|
|
28
|
+
import { getKeywordSearch } from "../../data/keyword/keyword-search-factory.js";
|
|
29
|
+
import { getVectorStore } from "../../data/vector/vector-store-factory.js";
|
|
30
|
+
import { getSearchCache } from "./cache-factory.js";
|
|
31
|
+
import { getSearchAnalytics } from "./analytics-factory.js";
|
|
32
|
+
import { getSymbolRepository } from "../../data/symbol/symbol-repository-factory.js";
|
|
33
|
+
import { type IndexProjectOptions } from "./project-indexer.js";
|
|
34
|
+
import { type SearchDegradation, type SearchDegradationReporter } from "./search-diagnostics.js";
|
|
35
35
|
/**
|
|
36
36
|
* ContextualSearchRLM - Main contextual search service
|
|
37
37
|
*/
|
|
38
38
|
export declare class ContextualSearchRLM {
|
|
39
|
+
#private;
|
|
39
40
|
keywordSearch: Awaited<ReturnType<typeof getKeywordSearch>>;
|
|
40
41
|
vectorStore: Awaited<ReturnType<typeof getVectorStore>>;
|
|
41
42
|
indexManager: IndexManager;
|
|
@@ -52,6 +53,26 @@ export declare class ContextualSearchRLM {
|
|
|
52
53
|
* `ensureInitialized` skips the factory calls (which are process-wide
|
|
53
54
|
* mock.module targets in the full test suite) and uses these instances
|
|
54
55
|
* directly. Production callers pass nothing and resolve via factories.
|
|
56
|
+
*
|
|
57
|
+
* PR-B T11 adds `indexManager`, the F4 seam (design.md §2.3 F4, D-R5). It is
|
|
58
|
+
* the one collaborator that could not be injected at all before this commit:
|
|
59
|
+
* every other member arrives from a factory this record can pre-empt, while
|
|
60
|
+
* `IndexManager` was built by direct construction inside `ensureInitialized`
|
|
61
|
+
* with no field to override it. It is the only *added* seam in PR-B; every
|
|
62
|
+
* other task moves a seam that already existed.
|
|
63
|
+
*
|
|
64
|
+
* **Every field here must stay optional, and for `indexManager` that is a
|
|
65
|
+
* G-HUB precondition rather than a style choice.** `IndexManager` is declared
|
|
66
|
+
* inside this gated directory, and `search-hub-metric.ts:139`'s annotation
|
|
67
|
+
* pattern `([A-Za-z0-9_]+)\s*:\s*<Type>\b` does not distinguish an interface
|
|
68
|
+
* field declaration from a parameter — that is the seventh plan defect, which
|
|
69
|
+
* took `IndexManager`'s `maxForeignReach` from 0 to 4 when `IndexerDeps` typed
|
|
70
|
+
* the same collaborator with a bare colon. The `?` here is what keeps the
|
|
71
|
+
* binding uncaptured (`\s*` cannot match `?`, the same reason the field at
|
|
72
|
+
* `indexManager!: IndexManager` above is invisible). Measured at T11: this
|
|
73
|
+
* record leaves `IndexManager` at foreign 0 / reach 0. Dropping the `?` — or
|
|
74
|
+
* restyling this record to `IndexerDeps`' required-field shape — reopens that
|
|
75
|
+
* hole, and nothing fails until T14's gate.
|
|
55
76
|
*/
|
|
56
77
|
readonly injectedDeps?: {
|
|
57
78
|
keywordSearch?: Awaited<ReturnType<typeof getKeywordSearch>>;
|
|
@@ -59,6 +80,11 @@ export declare class ContextualSearchRLM {
|
|
|
59
80
|
searchCache?: Awaited<ReturnType<typeof getSearchCache>>;
|
|
60
81
|
analytics?: Awaited<ReturnType<typeof getSearchAnalytics>>;
|
|
61
82
|
symbolRepo?: Awaited<ReturnType<typeof getSymbolRepository>>;
|
|
83
|
+
/** F4 (T11). Full `IndexManager`, not `Pick<>`: the value is assigned to the
|
|
84
|
+
* public `indexManager` field, which design.md §4.3.1 keeps at the full type
|
|
85
|
+
* for its 18 post-construction stub sites, so a narrowed seam would need a
|
|
86
|
+
* cast to land there. The `?` is the G-HUB guard — see above. */
|
|
87
|
+
indexManager?: IndexManager;
|
|
62
88
|
sessionRegistry?: Pick<SessionRegistry, "getAsync">;
|
|
63
89
|
synapseManager?: Pick<SynapseManager, "process">;
|
|
64
90
|
};
|
|
@@ -68,6 +94,7 @@ export declare class ContextualSearchRLM {
|
|
|
68
94
|
searchCache?: Awaited<ReturnType<typeof getSearchCache>>;
|
|
69
95
|
analytics?: Awaited<ReturnType<typeof getSearchAnalytics>>;
|
|
70
96
|
symbolRepo?: Awaited<ReturnType<typeof getSymbolRepository>>;
|
|
97
|
+
indexManager?: IndexManager;
|
|
71
98
|
sessionRegistry?: Pick<SessionRegistry, "getAsync">;
|
|
72
99
|
synapseManager?: Pick<SynapseManager, "process">;
|
|
73
100
|
});
|
|
@@ -155,13 +182,7 @@ export declare class ContextualSearchRLM {
|
|
|
155
182
|
* Invalid and workspace-mismatched sessions return the exact base array.
|
|
156
183
|
*/
|
|
157
184
|
applySynapseState(baseResults: SearchResult[], query: string, projectId: string, sessionId?: string, reportDegradation?: SearchDegradationReporter): Promise<SearchResult[]>;
|
|
158
|
-
/**
|
|
159
|
-
* Fuzzy-correct each non-stopword query term via the keyword store's
|
|
160
|
-
* vocabulary. Returns the corrected query string (lowercased, space-joined),
|
|
161
|
-
* or null when no term corrects to a different word or fuzzyCorrect is
|
|
162
|
-
* unavailable. Only words of length >= 3 are considered (shorter tokens
|
|
163
|
-
* can't be reliably corrected).
|
|
164
|
-
*/
|
|
185
|
+
/** Fuzzy-correct query terms against the keyword store's vocabulary; see hybrid-search.ts. */
|
|
165
186
|
correctQuery(query: string): Promise<string | null>;
|
|
166
187
|
/**
|
|
167
188
|
* Phase 7c: build the graph-neighbor RRF stream. BFS depth-2 over outgoing
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contextual-search-rlm.d.ts","sourceRoot":"","sources":["../../../src/services/search/contextual-search-rlm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"contextual-search-rlm.d.ts","sourceRoot":"","sources":["../../../src/services/search/contextual-search-rlm.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,37 +17,66 @@
|
|
|
17
17
|
* - Per-projectId namespace for isolation
|
|
18
18
|
* - Embedding reuse across projects
|
|
19
19
|
*/
|
|
20
|
+
import { logger } from "@massa-ai/shared";
|
|
21
|
+
import { IndexManager } from "./index-manager.js";
|
|
20
22
|
import { FileFilterCache } from "./file-filter-cache.js";
|
|
21
23
|
import { QueryUnderstandingService } from "./query-understanding.js";
|
|
22
24
|
import { assertParserReadyForIndexing } from "../structural/parser-readiness.js";
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
//
|
|
25
|
+
// PR-B T10: these five were `import type` while `ensureInitializedImpl` owned
|
|
26
|
+
// the factory calls in rlm-indexing.ts. That body is now `ensureInitialized()`
|
|
27
|
+
// below, so the root needs them as *values*. The five specifiers are unchanged,
|
|
28
|
+
// which is what keeps every `mock.module("…-factory.js")` in the suite pointing
|
|
29
|
+
// at the same resolved module it always did.
|
|
30
|
+
import { getKeywordSearch } from "../../data/keyword/keyword-search-factory.js";
|
|
31
|
+
import { getVectorStore } from "../../data/vector/vector-store-factory.js";
|
|
32
|
+
import { getSearchCache } from "./cache-factory.js";
|
|
33
|
+
import { getSearchAnalytics } from "./analytics-factory.js";
|
|
34
|
+
import { getSymbolRepository } from "../../data/symbol/symbol-repository-factory.js";
|
|
35
|
+
// Capability modules (design.md §4.1). These share a name with the class
|
|
27
36
|
// methods that delegate to them — the shape §4.3 sketches. Class members are
|
|
28
37
|
// not in lexical scope, so a bare call inside a method body resolves to the
|
|
29
|
-
// module import, not to itself.
|
|
38
|
+
// module import, not to itself. Same arity too, so `tsc` cannot tell a correct
|
|
39
|
+
// delegation from a `this.`-prefixed infinite recursion; the coverage suite's
|
|
40
|
+
// forwarding tests are what prove it at runtime.
|
|
30
41
|
import { fuseResults, generateScoreExplanation } from "./result-fusion.js";
|
|
31
|
-
import {
|
|
42
|
+
import { buildGraphStream } from "./graph-stream.js";
|
|
43
|
+
import { applySynapseState } from "./session-bias.js";
|
|
44
|
+
import { search, correctQuery, addContextToResults, extractPreview, calculateAvgScore, filterByPatterns, } from "./hybrid-search.js";
|
|
45
|
+
import { runWithIndexLock, indexProjectInternal, ensureFreshIndex, indexFile, loadGitignore, checkSearchAdmission, } from "./project-indexer.js";
|
|
46
|
+
import { recordSearchFailure, searchBackendUnavailable, } from "./search-diagnostics.js";
|
|
47
|
+
import { clearProjectIndex, getProjectStats, warmupCache, getAnalytics, } from "./index-admin.js";
|
|
32
48
|
/**
|
|
33
49
|
* ContextualSearchRLM - Main contextual search service
|
|
34
50
|
*/
|
|
35
51
|
export class ContextualSearchRLM {
|
|
36
|
-
// NOTE (M14 Phase 3): fields below were `private
|
|
37
|
-
//
|
|
38
|
-
// rlm
|
|
39
|
-
//
|
|
40
|
-
//
|
|
52
|
+
// NOTE (M14 Phase 3): the fields below were `private`, relaxed to `public`
|
|
53
|
+
// so the extracted delegate modules could read them off the instance via a
|
|
54
|
+
// passed `rlm` parameter (.specs/features/god-files-refactor/design.md,
|
|
55
|
+
// "Encapsulation decision (accepted cost)"). That reason is spent: PR-B T10
|
|
56
|
+
// dropped rlm-indexing.ts from that list, T12 dropped rlm-admin.ts and T13
|
|
57
|
+
// dropped rlm-search.ts — each reads what it needs through its own deps
|
|
58
|
+
// record, never off the instance, and all three files are deleted. **No
|
|
59
|
+
// extracted module reads any of these fields any more.** They stay public on
|
|
60
|
+
// their own merits — per field below, and per design.md §4.3.1: the ~80
|
|
61
|
+
// post-construction `(rlm as any).<member> = …` sites a `private` breaks.
|
|
41
62
|
keywordSearch;
|
|
42
63
|
vectorStore;
|
|
43
64
|
indexManager;
|
|
44
65
|
searchCache;
|
|
45
66
|
analytics;
|
|
46
67
|
symbolRepo;
|
|
47
|
-
//
|
|
68
|
+
// Was relaxed from `private` so rlm-admin.ts could read it via the rlm param.
|
|
69
|
+
// T12 removed that reader: index-admin.ts takes it through `IndexAdminDeps`.
|
|
70
|
+
// Still public because 4 test sites assign it post-construction
|
|
71
|
+
// (contextual-search-rlm-coverage.test.ts:343,354; search-facade-admin.test.ts:85,96).
|
|
48
72
|
fileFilterCache;
|
|
49
73
|
/** Phase 2: query understanding (LLM rewrite + HyDE). Default-off, silent-degrade. */
|
|
50
|
-
//
|
|
74
|
+
// Was relaxed from `private` so rlm-search.ts could read it via the rlm
|
|
75
|
+
// param; T13 removed that reader — hybrid-search.ts takes it through
|
|
76
|
+
// `HybridSearchDeps`. Still public for two reasons: design.md §4.3.1's
|
|
77
|
+
// post-construction stub sites, and a live production reader at
|
|
78
|
+
// project-identity/production-wiring.ts:51 — the only one of these ten
|
|
79
|
+
// members a gate can see, since reprivatising it is TS2341.
|
|
51
80
|
queryUnderstanding;
|
|
52
81
|
// RRF_K was a public field only so rlm-fusion.ts could read it off the
|
|
53
82
|
// instance. It is the literal 60 and is now a module constant in
|
|
@@ -61,27 +90,137 @@ export class ContextualSearchRLM {
|
|
|
61
90
|
* `ensureInitialized` skips the factory calls (which are process-wide
|
|
62
91
|
* mock.module targets in the full test suite) and uses these instances
|
|
63
92
|
* directly. Production callers pass nothing and resolve via factories.
|
|
93
|
+
*
|
|
94
|
+
* PR-B T11 adds `indexManager`, the F4 seam (design.md §2.3 F4, D-R5). It is
|
|
95
|
+
* the one collaborator that could not be injected at all before this commit:
|
|
96
|
+
* every other member arrives from a factory this record can pre-empt, while
|
|
97
|
+
* `IndexManager` was built by direct construction inside `ensureInitialized`
|
|
98
|
+
* with no field to override it. It is the only *added* seam in PR-B; every
|
|
99
|
+
* other task moves a seam that already existed.
|
|
100
|
+
*
|
|
101
|
+
* **Every field here must stay optional, and for `indexManager` that is a
|
|
102
|
+
* G-HUB precondition rather than a style choice.** `IndexManager` is declared
|
|
103
|
+
* inside this gated directory, and `search-hub-metric.ts:139`'s annotation
|
|
104
|
+
* pattern `([A-Za-z0-9_]+)\s*:\s*<Type>\b` does not distinguish an interface
|
|
105
|
+
* field declaration from a parameter — that is the seventh plan defect, which
|
|
106
|
+
* took `IndexManager`'s `maxForeignReach` from 0 to 4 when `IndexerDeps` typed
|
|
107
|
+
* the same collaborator with a bare colon. The `?` here is what keeps the
|
|
108
|
+
* binding uncaptured (`\s*` cannot match `?`, the same reason the field at
|
|
109
|
+
* `indexManager!: IndexManager` above is invisible). Measured at T11: this
|
|
110
|
+
* record leaves `IndexManager` at foreign 0 / reach 0. Dropping the `?` — or
|
|
111
|
+
* restyling this record to `IndexerDeps`' required-field shape — reopens that
|
|
112
|
+
* hole, and nothing fails until T14's gate.
|
|
64
113
|
*/
|
|
65
114
|
injectedDeps;
|
|
115
|
+
// Mirrors `injectedDeps` field-for-field, and the mirror is load-bearing: a
|
|
116
|
+
// field added to only one side makes the matching object literal fail excess
|
|
117
|
+
// property checking at every un-cast call site.
|
|
66
118
|
constructor(deps) {
|
|
67
119
|
this.fileFilterCache = new FileFilterCache();
|
|
68
120
|
this.queryUnderstanding = new QueryUnderstandingService();
|
|
69
121
|
this.injectedDeps = deps;
|
|
70
122
|
}
|
|
71
|
-
// Delegate-preservation contract: stays
|
|
72
|
-
//
|
|
73
|
-
//
|
|
74
|
-
//
|
|
75
|
-
//
|
|
76
|
-
//
|
|
123
|
+
// Delegate-preservation contract: stays a public patchable instance method,
|
|
124
|
+
// because concurrent-indexing.test.ts:67, the characterization test and
|
|
125
|
+
// search-facade-hybrid.test.ts:156 monkey-patch `.ensureInitialized` on the instance and
|
|
126
|
+
// every internal caller routes through `this.` (constraint PATCHABLE).
|
|
127
|
+
//
|
|
128
|
+
// PR-B T10: this body **is** the former `ensureInitializedImpl`, moved here
|
|
129
|
+
// verbatim with `rlm.` → `this.` and the export deleted. It read 8 facade
|
|
130
|
+
// members and 8 > G-HUB's ceiling of 3, so no capability module could hold it
|
|
131
|
+
// without failing the gate permanently — design.md §4.5(b) decided lazy init
|
|
132
|
+
// stays in the root, §4.1's module table never recorded the consequence, and
|
|
133
|
+
// tasks.md T10 owns it. Absorbing it is what lets rlm-indexing.ts die whole in
|
|
134
|
+
// one commit instead of surviving as the one-function husk GMS-04 AC-1 forbids.
|
|
135
|
+
//
|
|
136
|
+
// It does exactly what it did: resolve the six factories, assign the six
|
|
137
|
+
// fields, set the flag. It does **not** construct capability modules — there
|
|
138
|
+
// are none to construct — so the 25 test sites that set `initialized = true`
|
|
139
|
+
// to skip it still skip only factory resolution, never wiring (§4.3.1).
|
|
77
140
|
async ensureInitialized() {
|
|
78
|
-
|
|
141
|
+
if (this.initialized)
|
|
142
|
+
return;
|
|
143
|
+
const injected = this.injectedDeps ?? {};
|
|
144
|
+
const resolveKeyword = injected.keywordSearch
|
|
145
|
+
? Promise.resolve(injected.keywordSearch)
|
|
146
|
+
: getKeywordSearch();
|
|
147
|
+
const resolveVector = injected.vectorStore
|
|
148
|
+
? Promise.resolve(injected.vectorStore)
|
|
149
|
+
: getVectorStore();
|
|
150
|
+
const resolveCache = injected.searchCache
|
|
151
|
+
? Promise.resolve(injected.searchCache)
|
|
152
|
+
: getSearchCache();
|
|
153
|
+
const resolveAnalytics = injected.analytics
|
|
154
|
+
? Promise.resolve(injected.analytics)
|
|
155
|
+
: getSearchAnalytics();
|
|
156
|
+
const resolveSymbolRepo = injected.symbolRepo
|
|
157
|
+
? Promise.resolve(injected.symbolRepo)
|
|
158
|
+
: getSymbolRepository();
|
|
159
|
+
[
|
|
160
|
+
this.keywordSearch,
|
|
161
|
+
this.vectorStore,
|
|
162
|
+
this.searchCache,
|
|
163
|
+
this.analytics,
|
|
164
|
+
this.symbolRepo,
|
|
165
|
+
] = await Promise.all([
|
|
166
|
+
resolveKeyword,
|
|
167
|
+
resolveVector,
|
|
168
|
+
resolveCache,
|
|
169
|
+
resolveAnalytics,
|
|
170
|
+
resolveSymbolRepo,
|
|
171
|
+
]);
|
|
172
|
+
// F4 seam (T11). `??` rather than the ternary the five reads above use:
|
|
173
|
+
// those wrap in `Promise.resolve()` to enter the `Promise.all`, this one is
|
|
174
|
+
// synchronous. Nullish and truthy coincide for a class instance, so the two
|
|
175
|
+
// forms cannot differ on any input reachable here.
|
|
176
|
+
//
|
|
177
|
+
// Position is load-bearing, not incidental: this runs *after* the
|
|
178
|
+
// `Promise.all` above, so the default construction reads an already-resolved
|
|
179
|
+
// `this.vectorStore`. Hoisting it would hand `IndexManager` `undefined` while
|
|
180
|
+
// still satisfying an `instanceof` check — which is why the seam's sensor
|
|
181
|
+
// asserts the manager's own `vectorStore`, not just its class.
|
|
182
|
+
this.indexManager = injected.indexManager ?? new IndexManager(this.vectorStore);
|
|
183
|
+
this.initialized = true;
|
|
184
|
+
logger.info("ContextualSearchRLM initialized", {
|
|
185
|
+
via: injected.vectorStore ? "injected-seam" : "factory",
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Assemble project-indexer.ts's narrow deps record — per call, from whatever
|
|
190
|
+
* the fields hold right now (LATE-BIND, design.md §4.3.1). Never hoist this to
|
|
191
|
+
* a constructor-time capture *or* a first-call memo: `initialized` has 25
|
|
192
|
+
* post-construction assignment sites, `indexManager` 18, `symbolRepo` 7, and
|
|
193
|
+
* `search-facade-indexing.test.ts` alone holds 52 of the ~80 — a capture would leave
|
|
194
|
+
* every one of them stubbing a field nothing reads.
|
|
195
|
+
*
|
|
196
|
+
* Property reads only, never a dereference. That is load-bearing:
|
|
197
|
+
* `search-facade-indexing.test.ts:327-339` stubs `indexManager` and `searchCache` but
|
|
198
|
+
* *not* `symbolRepo`, because the full-reindex branch returns before touching
|
|
199
|
+
* it. Reading an undefined field into the record is fine; dereferencing one
|
|
200
|
+
* here would turn that test red on a member the original never reached.
|
|
201
|
+
*
|
|
202
|
+
* `indexFile` and `indexProject` are arrow wrappers, not `.bind(this)` and not
|
|
203
|
+
* bare method references. Both alternatives resolve the method at *assembly*
|
|
204
|
+
* time; the arrow body re-reads `this.<method>` at *call* time, which is the
|
|
205
|
+
* only shape under which the 6 sites that stub those two methods on the
|
|
206
|
+
* instance stay effective. See project-indexer.ts's `IndexerDeps` doc.
|
|
207
|
+
*/
|
|
208
|
+
#indexerDeps() {
|
|
209
|
+
return {
|
|
210
|
+
indexManager: this.indexManager,
|
|
211
|
+
symbolRepo: this.symbolRepo,
|
|
212
|
+
keywordSearch: this.keywordSearch,
|
|
213
|
+
vectorStore: this.vectorStore,
|
|
214
|
+
searchCache: this.searchCache,
|
|
215
|
+
indexFile: (filePath, projectId, projectRoot, centralityMap) => this.indexFile(filePath, projectId, projectRoot, centralityMap),
|
|
216
|
+
indexProject: (projectPath, projectId, options) => this.indexProject(projectPath, projectId, options),
|
|
217
|
+
};
|
|
79
218
|
}
|
|
80
219
|
/**
|
|
81
220
|
* Load and parse .gitignore file (delegates to shared ignore-patterns module)
|
|
82
221
|
*/
|
|
83
222
|
loadGitignore(projectPath) {
|
|
84
|
-
return
|
|
223
|
+
return loadGitignore(projectPath);
|
|
85
224
|
}
|
|
86
225
|
/**
|
|
87
226
|
* Index an entire project
|
|
@@ -102,13 +241,15 @@ export class ContextualSearchRLM {
|
|
|
102
241
|
// the characterization test monkey-patch `(inst as any)._indexProjectInternal`
|
|
103
242
|
// on the instance; routing through a module-local function would bypass it.
|
|
104
243
|
async _indexProjectInternal(projectPath, projectId, options = {}) {
|
|
105
|
-
|
|
244
|
+
await this.ensureInitialized();
|
|
245
|
+
return indexProjectInternal(this.#indexerDeps(), projectPath, projectId, options);
|
|
106
246
|
}
|
|
107
247
|
/**
|
|
108
248
|
* Check if index is stale and optionally trigger reindexing
|
|
109
249
|
*/
|
|
110
250
|
async ensureFreshIndex(projectId, projectPath, options = {}) {
|
|
111
|
-
|
|
251
|
+
await this.ensureInitialized();
|
|
252
|
+
return ensureFreshIndex(this.#indexerDeps(), projectId, projectPath, options);
|
|
112
253
|
}
|
|
113
254
|
/**
|
|
114
255
|
* Search admission preflight — two-tier gate run before `search()`.
|
|
@@ -124,7 +265,8 @@ export class ContextualSearchRLM {
|
|
|
124
265
|
* When `projectPath` is absent the stale check is skipped gracefully.
|
|
125
266
|
*/
|
|
126
267
|
async checkSearchAdmission(projectId, projectPath) {
|
|
127
|
-
|
|
268
|
+
await this.ensureInitialized();
|
|
269
|
+
return checkSearchAdmission(this.#indexerDeps(), projectId, projectPath);
|
|
128
270
|
}
|
|
129
271
|
/**
|
|
130
272
|
* Index a single file, splitting it into semantic chunks
|
|
@@ -135,35 +277,93 @@ export class ContextualSearchRLM {
|
|
|
135
277
|
* - YAML: splits by document separators or top-level keys
|
|
136
278
|
* - Code: splits by functions/classes with preceding comments
|
|
137
279
|
*/
|
|
138
|
-
//
|
|
139
|
-
// `
|
|
280
|
+
// Stays public: project-indexer.ts reaches it back through
|
|
281
|
+
// `IndexerDeps.indexFile`, an arrow wrapper over `this.indexFile`, so the 5
|
|
282
|
+
// sites in search-facade-indexing.test.ts that stub this method on the instance keep
|
|
283
|
+
// taking effect (LATE-BIND).
|
|
284
|
+
//
|
|
285
|
+
// It deliberately does **not** `await this.ensureInitialized()`. The original
|
|
286
|
+
// `indexFileImpl` never did either — its callers init first — and adding it
|
|
287
|
+
// here would be a behavior change, not a tidy-up.
|
|
140
288
|
async indexFile(filePath, projectId, projectRoot, centralityMap) {
|
|
141
|
-
return
|
|
289
|
+
return indexFile(this.#indexerDeps(), filePath, projectId, projectRoot, centralityMap);
|
|
142
290
|
}
|
|
143
291
|
/**
|
|
144
292
|
* Hybrid search (vector + keyword) with projectId filter
|
|
145
293
|
*/
|
|
146
294
|
async search(query, projectId, options = {}) {
|
|
147
|
-
|
|
295
|
+
// The hoist carries its wrapper. T10's and T12's delegates called
|
|
296
|
+
// `ensureInitialized` bare; `searchImpl` wrapped a failure in
|
|
297
|
+
// `searchBackendUnavailable(…)` and recorded it, so a bare hoist would drop
|
|
298
|
+
// both. The hoist itself is mandatory, not stylistic — the record snapshots
|
|
299
|
+
// five stores by value (measurements in tasks.md, T13).
|
|
300
|
+
try {
|
|
301
|
+
await this.ensureInitialized();
|
|
302
|
+
}
|
|
303
|
+
catch (error) {
|
|
304
|
+
const failure = searchBackendUnavailable("search_initialization", error);
|
|
305
|
+
recordSearchFailure(failure, projectId);
|
|
306
|
+
throw failure;
|
|
307
|
+
}
|
|
308
|
+
return search(this.#hybridSearchDeps(), query, projectId, options);
|
|
148
309
|
}
|
|
310
|
+
// The nine public methods from here to `filterByPatterns` all delegate to a
|
|
311
|
+
// capability module. They were relaxed from `private` so rlm-search.ts could
|
|
312
|
+
// call them via the rlm param; T13 removed that caller and deleted the file.
|
|
313
|
+
// They stay public under design.md §4.3, "the class keeps its 21 public
|
|
314
|
+
// methods", a compatibility surface for 24 importers — and under nothing
|
|
315
|
+
// mechanical: measured at T14, reprivatising all nine produces zero gate
|
|
316
|
+
// failures, because packages/core/tsconfig.json excludes src/__tests__.
|
|
149
317
|
/**
|
|
150
318
|
* Apply session state after the session-independent base result is cached.
|
|
151
319
|
* Invalid and workspace-mismatched sessions return the exact base array.
|
|
152
320
|
*/
|
|
153
|
-
// Visibility relaxed from `private` so rlm-search.ts can call via rlm param.
|
|
154
321
|
async applySynapseState(baseResults, query, projectId, sessionId, reportDegradation) {
|
|
155
|
-
return
|
|
322
|
+
return applySynapseState(this.#sessionBiasDeps(), baseResults, query, projectId, sessionId, reportDegradation);
|
|
156
323
|
}
|
|
157
324
|
/**
|
|
158
|
-
*
|
|
159
|
-
*
|
|
160
|
-
*
|
|
161
|
-
*
|
|
162
|
-
*
|
|
325
|
+
* Assemble session-bias.ts's narrow deps record — per call, from whatever the
|
|
326
|
+
* fields hold right now (LATE-BIND, design.md §4.3.1). Never hoist this to a
|
|
327
|
+
* constructor-time capture: the ~80 test sites that stub facade state *after*
|
|
328
|
+
* construction would go on passing while exercising the real collaborator,
|
|
329
|
+
* which is this repository's signature defect class.
|
|
330
|
+
*
|
|
331
|
+
* Property reads only. Resolving the factory fallbacks here instead of inside
|
|
332
|
+
* the module would call both on every search, including the no-session calls
|
|
333
|
+
* that today touch neither.
|
|
334
|
+
*/
|
|
335
|
+
#sessionBiasDeps() {
|
|
336
|
+
return {
|
|
337
|
+
sessionRegistry: this.injectedDeps?.sessionRegistry,
|
|
338
|
+
synapseManager: this.injectedDeps?.synapseManager,
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Assemble hybrid-search.ts's narrow deps record — per call, from current
|
|
343
|
+
* field values (LATE-BIND, design.md §4.3.1). Never hoist to a constructor
|
|
344
|
+
* capture or a first-call memo. Property reads only, and the stores read the
|
|
345
|
+
* **field**, not `injectedDeps.<store>` — contrast `#sessionBiasDeps()` above,
|
|
346
|
+
* whose originals genuinely read the seam. The three callbacks are arrow
|
|
347
|
+
* wrappers for the same call-time-dispatch reason as `#indexerDeps()`'s two.
|
|
348
|
+
* Where each of §2.1's thirteen members landed is on `HybridSearchDeps` in
|
|
349
|
+
* hybrid-search.ts and in tasks.md; both files sit under G-HUB's 700-line
|
|
350
|
+
* ceiling and T13 pushed each of them over it once.
|
|
163
351
|
*/
|
|
164
|
-
|
|
352
|
+
#hybridSearchDeps() {
|
|
353
|
+
return {
|
|
354
|
+
keywordSearch: this.keywordSearch,
|
|
355
|
+
vectorStore: this.vectorStore,
|
|
356
|
+
searchCache: this.searchCache,
|
|
357
|
+
analytics: this.analytics,
|
|
358
|
+
queryUnderstanding: this.queryUnderstanding,
|
|
359
|
+
buildGraphStream: (resultSets, maxResults, projectId, reportDegradation) => this.buildGraphStream(resultSets, maxResults, projectId, reportDegradation),
|
|
360
|
+
addContextToResults: (results, projectId) => this.addContextToResults(results, projectId),
|
|
361
|
+
applySynapseState: (baseResults, query, projectId, sessionId, reportDegradation) => this.applySynapseState(baseResults, query, projectId, sessionId, reportDegradation),
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
/** Fuzzy-correct query terms against the keyword store's vocabulary; see hybrid-search.ts. */
|
|
165
365
|
async correctQuery(query) {
|
|
166
|
-
return
|
|
366
|
+
return correctQuery(this.#hybridSearchDeps(), query);
|
|
167
367
|
}
|
|
168
368
|
/**
|
|
169
369
|
* Phase 7c: build the graph-neighbor RRF stream. BFS depth-2 over outgoing
|
|
@@ -185,9 +385,8 @@ export class ContextualSearchRLM {
|
|
|
185
385
|
* appends the stream when non-empty, so `resultSets.length` (and thus the
|
|
186
386
|
* `search:reranked` streamCount) always reflects the real stream count.
|
|
187
387
|
*/
|
|
188
|
-
// Visibility relaxed from `private` so rlm-search.ts can call via rlm param.
|
|
189
388
|
async buildGraphStream(resultSets, maxResults, projectId, reportDegradation) {
|
|
190
|
-
return
|
|
389
|
+
return buildGraphStream(resultSets, maxResults, projectId, reportDegradation);
|
|
191
390
|
}
|
|
192
391
|
/**
|
|
193
392
|
* Reciprocal Rank Fusion (RRF) - Combines multiple result lists
|
|
@@ -196,56 +395,73 @@ export class ContextualSearchRLM {
|
|
|
196
395
|
* - Keywords get higher weight when query contains function/class names
|
|
197
396
|
* - Exact matches in keyword results get additional boost
|
|
198
397
|
*/
|
|
199
|
-
// Visibility relaxed from `private` so rlm-search.ts can call via rlm param.
|
|
200
398
|
fuseResults(resultSets, query, explainScores = false) {
|
|
201
399
|
return fuseResults(resultSets, query, explainScores);
|
|
202
400
|
}
|
|
203
401
|
/**
|
|
204
402
|
* Generate detailed score explanation
|
|
205
403
|
*/
|
|
206
|
-
// Visibility relaxed from `private` so rlm-search.ts (fuseResults) can call via rlm param.
|
|
207
404
|
generateScoreExplanation(finalScore, rrfScore, vectorScore, keywordScore, vectorRank, keywordRank, combinedRank) {
|
|
208
405
|
return generateScoreExplanation(finalScore, rrfScore, vectorScore, keywordScore, vectorRank, keywordRank, combinedRank);
|
|
209
406
|
}
|
|
210
407
|
/**
|
|
211
408
|
* Add expanded context to results
|
|
212
409
|
*/
|
|
213
|
-
// Visibility relaxed from `private` so rlm-search.ts can call via rlm param.
|
|
214
410
|
async addContextToResults(results, _projectId) {
|
|
215
|
-
return
|
|
411
|
+
return addContextToResults(results, _projectId);
|
|
216
412
|
}
|
|
217
413
|
/**
|
|
218
414
|
* Extract content preview (first lines)
|
|
219
415
|
*/
|
|
220
|
-
// Visibility relaxed from `private` so rlm-search.ts can call via rlm param.
|
|
221
416
|
extractPreview(content, maxLines = 5) {
|
|
222
|
-
return
|
|
417
|
+
return extractPreview(content, maxLines);
|
|
223
418
|
}
|
|
224
419
|
/**
|
|
225
420
|
* Calculate average score
|
|
226
421
|
*/
|
|
227
|
-
// Visibility relaxed from `private` so rlm-search.ts can call via rlm param.
|
|
228
422
|
calculateAvgScore(results) {
|
|
229
|
-
return
|
|
423
|
+
return calculateAvgScore(results);
|
|
230
424
|
}
|
|
231
425
|
/**
|
|
232
426
|
* Filter results by glob patterns
|
|
233
427
|
*/
|
|
234
|
-
// Visibility relaxed from `private` so rlm-search.ts can call via rlm param.
|
|
235
428
|
filterByPatterns(results, include, exclude) {
|
|
236
|
-
return
|
|
429
|
+
return filterByPatterns(results, include, exclude);
|
|
430
|
+
}
|
|
431
|
+
/**
|
|
432
|
+
* Assemble index-admin.ts's narrow deps record — per call, from current field
|
|
433
|
+
* values (LATE-BIND, design.md §4.3.1). Never hoist to a constructor capture or
|
|
434
|
+
* a first-call memo. Property reads only: `getAnalytics` does not await init, so
|
|
435
|
+
* on a fresh facade these are all `undefined`, and a dereference here would
|
|
436
|
+
* redden a path the original never reached. `search` is an arrow wrapper for the
|
|
437
|
+
* same call-time-dispatch reason as `#indexerDeps()`'s two. Measurements for
|
|
438
|
+
* both, and the 7 stub sites that make `search` load-bearing, live on
|
|
439
|
+
* `IndexAdminDeps` in index-admin.ts — kept there so this file stays under
|
|
440
|
+
* G-HUB's 700-line ceiling (685 after T12).
|
|
441
|
+
*/
|
|
442
|
+
#indexAdminDeps() {
|
|
443
|
+
return {
|
|
444
|
+
vectorStore: this.vectorStore,
|
|
445
|
+
keywordSearch: this.keywordSearch,
|
|
446
|
+
searchCache: this.searchCache,
|
|
447
|
+
fileFilterCache: this.fileFilterCache,
|
|
448
|
+
analytics: this.analytics,
|
|
449
|
+
search: (query, projectId, options) => this.search(query, projectId, options),
|
|
450
|
+
};
|
|
237
451
|
}
|
|
238
452
|
/**
|
|
239
453
|
* Clear project index
|
|
240
454
|
*/
|
|
241
455
|
async clearProjectIndex(projectId) {
|
|
242
|
-
|
|
456
|
+
await this.ensureInitialized();
|
|
457
|
+
return clearProjectIndex(this.#indexAdminDeps(), projectId);
|
|
243
458
|
}
|
|
244
459
|
/**
|
|
245
460
|
* Get project statistics
|
|
246
461
|
*/
|
|
247
462
|
async getProjectStats(projectId) {
|
|
248
|
-
|
|
463
|
+
await this.ensureInitialized();
|
|
464
|
+
return getProjectStats(this.#indexAdminDeps(), projectId);
|
|
249
465
|
}
|
|
250
466
|
/**
|
|
251
467
|
* Warmup cache with common queries
|
|
@@ -253,13 +469,18 @@ export class ContextualSearchRLM {
|
|
|
253
469
|
* Pre-caches typical search patterns to improve initial search performance
|
|
254
470
|
*/
|
|
255
471
|
async warmupCache(projectId, _projectPath, customQueries) {
|
|
256
|
-
|
|
472
|
+
await this.ensureInitialized();
|
|
473
|
+
return warmupCache(this.#indexAdminDeps(), projectId, _projectPath, customQueries);
|
|
257
474
|
}
|
|
258
475
|
/**
|
|
259
476
|
* Get analytics instance for querying metrics
|
|
260
477
|
*/
|
|
478
|
+
// No `await this.ensureInitialized()` — the original never had one, so adding
|
|
479
|
+
// it would be a behavior change. That makes this T12's blind-recursion mutation
|
|
480
|
+
// subject: the only delegate with no `await` ahead of it, so it overflows the
|
|
481
|
+
// stack at once instead of starving the macrotask queue as T10's did.
|
|
261
482
|
getAnalytics() {
|
|
262
|
-
return
|
|
483
|
+
return getAnalytics(this.#indexAdminDeps());
|
|
263
484
|
}
|
|
264
485
|
}
|
|
265
486
|
//# sourceMappingURL=contextual-search-rlm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contextual-search-rlm.js","sourceRoot":"","sources":["../../../src/services/search/contextual-search-rlm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;
|
|
1
|
+
{"version":3,"file":"contextual-search-rlm.js","sourceRoot":"","sources":["../../../src/services/search/contextual-search-rlm.ts"],"names":[],"mappings":"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"}
|