nexus-agents 2.81.4 → 2.83.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/{child-mcp-config-HVGU73XG.js → child-mcp-config-XVPIO5HV.js} +2 -2
- package/dist/{chunk-XZECNG2Q.js → chunk-2W4QJ27D.js} +3 -3
- package/dist/{chunk-BQ4YXGGQ.js → chunk-3ACDP4E6.js} +124 -2
- package/dist/chunk-3ACDP4E6.js.map +1 -0
- package/dist/{chunk-BZVYU4YD.js → chunk-3ASED5PR.js} +4 -4
- package/dist/{chunk-S5HMID6I.js → chunk-3GJAAENS.js} +4 -4
- package/dist/chunk-3GJAAENS.js.map +1 -0
- package/dist/{chunk-6M44ZXB4.js → chunk-3WUVWZUC.js} +2 -2
- package/dist/{chunk-R2VJY7Z4.js → chunk-4BXQ2OZY.js} +148 -103
- package/dist/chunk-4BXQ2OZY.js.map +1 -0
- package/dist/{chunk-M5ABED6T.js → chunk-54UXPJVM.js} +2 -2
- package/dist/{chunk-5TM5VL23.js → chunk-5T6SYCH2.js} +2 -2
- package/dist/{chunk-YW72ORKM.js → chunk-6WDJ3IE4.js} +3 -3
- package/dist/{chunk-EGK4RZV5.js → chunk-AFPHR72D.js} +2 -2
- package/dist/{chunk-F7N2T53R.js → chunk-AINOJRZX.js} +12 -23
- package/dist/chunk-AINOJRZX.js.map +1 -0
- package/dist/{chunk-ITMLH7TF.js → chunk-BZUEUD4G.js} +3 -3
- package/dist/{chunk-WVSQGGAH.js → chunk-FHGDJKCZ.js} +16 -13
- package/dist/{chunk-WVSQGGAH.js.map → chunk-FHGDJKCZ.js.map} +1 -1
- package/dist/{chunk-ZBABWKEA.js → chunk-FI77TGBY.js} +2 -2
- package/dist/{chunk-7J7PNOJQ.js → chunk-HFOQKCD2.js} +22 -5
- package/dist/chunk-HFOQKCD2.js.map +1 -0
- package/dist/{chunk-PPV23O3J.js → chunk-L362KRSU.js} +2 -2
- package/dist/{chunk-2GW2FZXY.js → chunk-NLPMYBIV.js} +50 -22
- package/dist/chunk-NLPMYBIV.js.map +1 -0
- package/dist/{chunk-M6KXR4LO.js → chunk-PMLVZXAE.js} +1246 -1068
- package/dist/chunk-PMLVZXAE.js.map +1 -0
- package/dist/{chunk-FAU7LVIG.js → chunk-PPBZQKRP.js} +28 -15
- package/dist/chunk-PPBZQKRP.js.map +1 -0
- package/dist/{chunk-7JLSKX3U.js → chunk-Q6PZMGLU.js} +2 -2
- package/dist/{chunk-RGKUBFTE.js → chunk-RVRXKNND.js} +3 -3
- package/dist/{chunk-HFSSADUV.js → chunk-RXVH52UI.js} +44 -28
- package/dist/{chunk-HFSSADUV.js.map → chunk-RXVH52UI.js.map} +1 -1
- package/dist/{chunk-B3MCX46I.js → chunk-U6LDVJS7.js} +2 -2
- package/dist/{chunk-K7WUEKCD.js → chunk-WGSRH5EQ.js} +3 -3
- package/dist/{chunk-M3KVQK54.js → chunk-WJFUTRHX.js} +2 -2
- package/dist/{chunk-JSQV2EOZ.js → chunk-YO27YAEX.js} +3 -3
- package/dist/{chunk-ZAY5M2AN.js → chunk-Z64MSLEK.js} +2 -2
- package/dist/{chunk-AMFVUDWI.js → chunk-ZIWEEVMI.js} +2 -2
- package/dist/{chunk-2HBQ6XXA.js → chunk-ZM5JKJHI.js} +9 -60
- package/dist/chunk-ZM5JKJHI.js.map +1 -0
- package/dist/{cli-circuit-breaker-NUZGOAVD.js → cli-circuit-breaker-Y26NPPNO.js} +4 -4
- package/dist/cli.js +460 -379
- package/dist/cli.js.map +1 -1
- package/dist/codebase-search-ZFJUVMVR.js +8 -0
- package/dist/{composite-router-4CF3P5D4.js → composite-router-X2ZYIEHH.js} +2 -2
- package/dist/{consensus-vote-7PLEGFWZ.js → consensus-vote-KZ6UURUI.js} +11 -11
- package/dist/{context-retriever-R5W4I4IB.js → context-retriever-QY4FNTDZ.js} +5 -5
- package/dist/{doctor-deep-7JTGI33O.js → doctor-deep-2E2GBMYR.js} +3 -3
- package/dist/expert-bridge-FHPWDFJX.js +13 -0
- package/dist/{factory-E2CKCYIK.js → factory-STNVY3Y3.js} +4 -4
- package/dist/{factory-DD2FPM3H.js → factory-W6KROBFN.js} +5 -5
- package/dist/index.d.ts +117 -61
- package/dist/index.js +100 -105
- package/dist/index.js.map +1 -1
- package/dist/{init-opencode-2BZWAACW.js → init-opencode-6LVZ4CAQ.js} +5 -5
- package/dist/{issue-triage-CRUJLWFY.js → issue-triage-Y77JI7WF.js} +4 -4
- package/dist/{registry-command-OHIJNUZJ.js → registry-command-P5VIAEOL.js} +2 -2
- package/dist/{repo-analyze-D2OY2QSR.js → repo-analyze-JZEMBE6R.js} +2 -2
- package/dist/{repo-security-plan-I4FZP7QA.js → repo-security-plan-RHSLO7H6.js} +4 -4
- package/dist/{research-helpers-synthesize-NMYYERCP.js → research-helpers-synthesize-PVP6JRZV.js} +3 -3
- package/dist/{routing-memory-7DA6WNSA.js → routing-memory-QRIJPRVD.js} +2 -2
- package/dist/{session-memory-LV35VSBK.js → session-memory-WARRGYY7.js} +3 -3
- package/dist/{setup-command-2OUPZSU7.js → setup-command-GMP5FI7F.js} +10 -10
- package/dist/{setup-config-TMXG3O7K.js → setup-config-G3KKZM7O.js} +3 -3
- package/dist/{setup-custom-api-N5VE2YPO.js → setup-custom-api-B63X7ISD.js} +4 -4
- package/dist/{tool-memory-JL5TF5BI.js → tool-memory-E7JW4YLT.js} +4 -4
- package/dist/{weather-report-CCOWOPFG.js → weather-report-RACZWJQL.js} +2 -2
- package/package.json +1 -1
- package/dist/chunk-2GW2FZXY.js.map +0 -1
- package/dist/chunk-2HBQ6XXA.js.map +0 -1
- package/dist/chunk-7J7PNOJQ.js.map +0 -1
- package/dist/chunk-AP2FD37C.js +0 -127
- package/dist/chunk-AP2FD37C.js.map +0 -1
- package/dist/chunk-BQ4YXGGQ.js.map +0 -1
- package/dist/chunk-ED6VQWNG.js +0 -63
- package/dist/chunk-ED6VQWNG.js.map +0 -1
- package/dist/chunk-F7N2T53R.js.map +0 -1
- package/dist/chunk-FAU7LVIG.js.map +0 -1
- package/dist/chunk-M6KXR4LO.js.map +0 -1
- package/dist/chunk-R2VJY7Z4.js.map +0 -1
- package/dist/chunk-S5HMID6I.js.map +0 -1
- package/dist/codebase-search-PIBRTGBE.js +0 -9
- package/dist/expert-bridge-J5ZKCYL5.js +0 -11
- package/dist/shared-memory-CM6T2MYE.js +0 -8
- package/dist/symbol-extractor-WYXPJH65.js +0 -10
- package/dist/tool-memory-JL5TF5BI.js.map +0 -1
- package/dist/weather-report-CCOWOPFG.js.map +0 -1
- /package/dist/{child-mcp-config-HVGU73XG.js.map → child-mcp-config-XVPIO5HV.js.map} +0 -0
- /package/dist/{chunk-XZECNG2Q.js.map → chunk-2W4QJ27D.js.map} +0 -0
- /package/dist/{chunk-BZVYU4YD.js.map → chunk-3ASED5PR.js.map} +0 -0
- /package/dist/{chunk-6M44ZXB4.js.map → chunk-3WUVWZUC.js.map} +0 -0
- /package/dist/{chunk-M5ABED6T.js.map → chunk-54UXPJVM.js.map} +0 -0
- /package/dist/{chunk-5TM5VL23.js.map → chunk-5T6SYCH2.js.map} +0 -0
- /package/dist/{chunk-YW72ORKM.js.map → chunk-6WDJ3IE4.js.map} +0 -0
- /package/dist/{chunk-EGK4RZV5.js.map → chunk-AFPHR72D.js.map} +0 -0
- /package/dist/{chunk-ITMLH7TF.js.map → chunk-BZUEUD4G.js.map} +0 -0
- /package/dist/{chunk-ZBABWKEA.js.map → chunk-FI77TGBY.js.map} +0 -0
- /package/dist/{chunk-PPV23O3J.js.map → chunk-L362KRSU.js.map} +0 -0
- /package/dist/{chunk-7JLSKX3U.js.map → chunk-Q6PZMGLU.js.map} +0 -0
- /package/dist/{chunk-RGKUBFTE.js.map → chunk-RVRXKNND.js.map} +0 -0
- /package/dist/{chunk-B3MCX46I.js.map → chunk-U6LDVJS7.js.map} +0 -0
- /package/dist/{chunk-K7WUEKCD.js.map → chunk-WGSRH5EQ.js.map} +0 -0
- /package/dist/{chunk-M3KVQK54.js.map → chunk-WJFUTRHX.js.map} +0 -0
- /package/dist/{chunk-JSQV2EOZ.js.map → chunk-YO27YAEX.js.map} +0 -0
- /package/dist/{chunk-ZAY5M2AN.js.map → chunk-Z64MSLEK.js.map} +0 -0
- /package/dist/{chunk-AMFVUDWI.js.map → chunk-ZIWEEVMI.js.map} +0 -0
- /package/dist/{cli-circuit-breaker-NUZGOAVD.js.map → cli-circuit-breaker-Y26NPPNO.js.map} +0 -0
- /package/dist/{codebase-search-PIBRTGBE.js.map → codebase-search-ZFJUVMVR.js.map} +0 -0
- /package/dist/{composite-router-4CF3P5D4.js.map → composite-router-X2ZYIEHH.js.map} +0 -0
- /package/dist/{consensus-vote-7PLEGFWZ.js.map → consensus-vote-KZ6UURUI.js.map} +0 -0
- /package/dist/{context-retriever-R5W4I4IB.js.map → context-retriever-QY4FNTDZ.js.map} +0 -0
- /package/dist/{doctor-deep-7JTGI33O.js.map → doctor-deep-2E2GBMYR.js.map} +0 -0
- /package/dist/{expert-bridge-J5ZKCYL5.js.map → expert-bridge-FHPWDFJX.js.map} +0 -0
- /package/dist/{factory-DD2FPM3H.js.map → factory-STNVY3Y3.js.map} +0 -0
- /package/dist/{factory-E2CKCYIK.js.map → factory-W6KROBFN.js.map} +0 -0
- /package/dist/{init-opencode-2BZWAACW.js.map → init-opencode-6LVZ4CAQ.js.map} +0 -0
- /package/dist/{issue-triage-CRUJLWFY.js.map → issue-triage-Y77JI7WF.js.map} +0 -0
- /package/dist/{registry-command-OHIJNUZJ.js.map → registry-command-P5VIAEOL.js.map} +0 -0
- /package/dist/{repo-analyze-D2OY2QSR.js.map → repo-analyze-JZEMBE6R.js.map} +0 -0
- /package/dist/{repo-security-plan-I4FZP7QA.js.map → repo-security-plan-RHSLO7H6.js.map} +0 -0
- /package/dist/{research-helpers-synthesize-NMYYERCP.js.map → research-helpers-synthesize-PVP6JRZV.js.map} +0 -0
- /package/dist/{routing-memory-7DA6WNSA.js.map → routing-memory-QRIJPRVD.js.map} +0 -0
- /package/dist/{session-memory-LV35VSBK.js.map → session-memory-WARRGYY7.js.map} +0 -0
- /package/dist/{setup-command-2OUPZSU7.js.map → setup-command-GMP5FI7F.js.map} +0 -0
- /package/dist/{setup-config-TMXG3O7K.js.map → setup-config-G3KKZM7O.js.map} +0 -0
- /package/dist/{setup-custom-api-N5VE2YPO.js.map → setup-custom-api-B63X7ISD.js.map} +0 -0
- /package/dist/{shared-memory-CM6T2MYE.js.map → tool-memory-E7JW4YLT.js.map} +0 -0
- /package/dist/{symbol-extractor-WYXPJH65.js.map → weather-report-RACZWJQL.js.map} +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createLogger
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-RXVH52UI.js";
|
|
4
4
|
import "./chunk-I2HMWH4R.js";
|
|
5
5
|
import "./chunk-PR4QN5HX.js";
|
|
6
6
|
|
|
@@ -59,4 +59,4 @@ export {
|
|
|
59
59
|
generateMcpConfig,
|
|
60
60
|
getDefaultAllowedTools
|
|
61
61
|
};
|
|
62
|
-
//# sourceMappingURL=child-mcp-config-
|
|
62
|
+
//# sourceMappingURL=child-mcp-config-XVPIO5HV.js.map
|
|
@@ -2,14 +2,14 @@ import {
|
|
|
2
2
|
CircuitBreakerRegistry,
|
|
3
3
|
CircuitError,
|
|
4
4
|
mapCliErrorToCategory
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-5T6SYCH2.js";
|
|
6
6
|
import {
|
|
7
7
|
createLogger,
|
|
8
8
|
err,
|
|
9
9
|
getFallbackChainForCategory,
|
|
10
10
|
getTimeProvider,
|
|
11
11
|
ok
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-RXVH52UI.js";
|
|
13
13
|
|
|
14
14
|
// src/cli-adapters/cli-circuit-breaker.ts
|
|
15
15
|
var CATEGORY_TO_FALLBACK = {
|
|
@@ -152,4 +152,4 @@ export {
|
|
|
152
152
|
CliCircuitBreakerIntegration,
|
|
153
153
|
createCliCircuitBreakerIntegration
|
|
154
154
|
};
|
|
155
|
-
//# sourceMappingURL=chunk-
|
|
155
|
+
//# sourceMappingURL=chunk-2W4QJ27D.js.map
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
// src/indexer/codebase-search.ts
|
|
2
|
+
import { readdir } from "fs/promises";
|
|
3
|
+
import { resolve, extname as extname2, relative } from "path";
|
|
4
|
+
|
|
1
5
|
// src/indexer/symbol-extractor.ts
|
|
2
6
|
import { readFile } from "fs/promises";
|
|
3
7
|
import { extname } from "path";
|
|
@@ -120,8 +124,126 @@ async function extractSymbolIndex(filePath) {
|
|
|
120
124
|
${lines.join("\n")}`;
|
|
121
125
|
}
|
|
122
126
|
|
|
127
|
+
// src/indexer/codebase-search.ts
|
|
128
|
+
var SCORE_EXACT = 20;
|
|
129
|
+
var SCORE_PREFIX = 10;
|
|
130
|
+
var SCORE_WORD = 5;
|
|
131
|
+
var SCORE_SUBSTRING = 2;
|
|
132
|
+
var SCORE_EXPORTED_BONUS = 3;
|
|
133
|
+
function isSourceFile(name) {
|
|
134
|
+
const ext = extname2(name).toLowerCase();
|
|
135
|
+
return [".ts", ".tsx", ".js", ".jsx"].includes(ext) && !name.endsWith(".test.ts") && !name.endsWith(".test.tsx") && !name.endsWith(".d.ts");
|
|
136
|
+
}
|
|
137
|
+
async function findSourceFiles(dir, maxDepth) {
|
|
138
|
+
if (maxDepth <= 0) return [];
|
|
139
|
+
const files = [];
|
|
140
|
+
const entries = await readdir(dir, { withFileTypes: true }).catch(() => []);
|
|
141
|
+
for (const entry of entries) {
|
|
142
|
+
const fullPath = resolve(dir, entry.name);
|
|
143
|
+
if (entry.isDirectory() && entry.name !== "node_modules" && entry.name !== "dist") {
|
|
144
|
+
files.push(...await findSourceFiles(fullPath, maxDepth - 1));
|
|
145
|
+
}
|
|
146
|
+
if (entry.isFile() && isSourceFile(entry.name)) {
|
|
147
|
+
files.push(fullPath);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return files;
|
|
151
|
+
}
|
|
152
|
+
function scoreMatch(symbolName, query) {
|
|
153
|
+
const nameLower = symbolName.toLowerCase();
|
|
154
|
+
const queryLower = query.toLowerCase();
|
|
155
|
+
if (nameLower === queryLower) return SCORE_EXACT;
|
|
156
|
+
if (nameLower.startsWith(queryLower)) return SCORE_PREFIX;
|
|
157
|
+
const words = symbolName.replace(/([a-z])([A-Z])/g, "$1 $2").toLowerCase().split(/[\s_-]+/);
|
|
158
|
+
if (words.some((w) => w === queryLower)) return SCORE_WORD;
|
|
159
|
+
if (nameLower.includes(queryLower)) return SCORE_SUBSTRING;
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
function getMatchType(score) {
|
|
163
|
+
if (score >= SCORE_EXACT) return "exact";
|
|
164
|
+
if (score >= SCORE_PREFIX) return "prefix";
|
|
165
|
+
if (score >= SCORE_WORD) return "word";
|
|
166
|
+
return "substring";
|
|
167
|
+
}
|
|
168
|
+
var CodebaseIndex = class {
|
|
169
|
+
symbols = [];
|
|
170
|
+
fileResults = /* @__PURE__ */ new Map();
|
|
171
|
+
rootDir;
|
|
172
|
+
constructor(rootDir) {
|
|
173
|
+
this.rootDir = rootDir;
|
|
174
|
+
}
|
|
175
|
+
/** Index all TS/JS source files in the directory. */
|
|
176
|
+
async index(maxDepth = 4) {
|
|
177
|
+
const files = await findSourceFiles(this.rootDir, maxDepth);
|
|
178
|
+
for (const file of files) {
|
|
179
|
+
const result = await extractSymbols(file);
|
|
180
|
+
const relPath = relative(this.rootDir, file);
|
|
181
|
+
this.fileResults.set(relPath, result);
|
|
182
|
+
for (const symbol of result.symbols) {
|
|
183
|
+
this.symbols.push({ ...symbol, filePath: relPath });
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return {
|
|
187
|
+
totalFiles: files.length,
|
|
188
|
+
totalSymbols: this.symbols.length,
|
|
189
|
+
indexedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
/** Search symbols by keyword. Returns top N results sorted by relevance. */
|
|
193
|
+
search(query, limit = 20) {
|
|
194
|
+
const results = [];
|
|
195
|
+
for (const symbol of this.symbols) {
|
|
196
|
+
const baseScore = scoreMatch(symbol.name, query);
|
|
197
|
+
if (baseScore === null) continue;
|
|
198
|
+
const bonus = symbol.exported ? SCORE_EXPORTED_BONUS : 0;
|
|
199
|
+
results.push({
|
|
200
|
+
symbol,
|
|
201
|
+
score: baseScore + bonus,
|
|
202
|
+
matchType: getMatchType(baseScore)
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
return results.sort((a, b) => b.score - a.score).slice(0, limit);
|
|
206
|
+
}
|
|
207
|
+
/** Get a compact summary of a file's symbols. */
|
|
208
|
+
getFileSummary(filePath) {
|
|
209
|
+
const result = this.fileResults.get(filePath);
|
|
210
|
+
if (result === void 0) return void 0;
|
|
211
|
+
const kinds = {};
|
|
212
|
+
let exported = 0;
|
|
213
|
+
let priv = 0;
|
|
214
|
+
for (const s of result.symbols) {
|
|
215
|
+
kinds[s.kind] = (kinds[s.kind] ?? 0) + 1;
|
|
216
|
+
if (s.exported) exported++;
|
|
217
|
+
else priv++;
|
|
218
|
+
}
|
|
219
|
+
return {
|
|
220
|
+
filePath,
|
|
221
|
+
totalLines: result.totalLines,
|
|
222
|
+
exportedSymbols: exported,
|
|
223
|
+
privateSymbols: priv,
|
|
224
|
+
kinds
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
/** List all indexed files with symbol counts. */
|
|
228
|
+
listFiles() {
|
|
229
|
+
return [...this.fileResults.entries()].map(([path, result]) => ({
|
|
230
|
+
path,
|
|
231
|
+
symbols: result.symbols.length,
|
|
232
|
+
lines: result.totalLines
|
|
233
|
+
}));
|
|
234
|
+
}
|
|
235
|
+
/** Get index statistics. */
|
|
236
|
+
get stats() {
|
|
237
|
+
return {
|
|
238
|
+
files: this.fileResults.size,
|
|
239
|
+
symbols: this.symbols.length
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
};
|
|
243
|
+
|
|
123
244
|
export {
|
|
124
245
|
extractSymbols,
|
|
125
|
-
extractSymbolIndex
|
|
246
|
+
extractSymbolIndex,
|
|
247
|
+
CodebaseIndex
|
|
126
248
|
};
|
|
127
|
-
//# sourceMappingURL=chunk-
|
|
249
|
+
//# sourceMappingURL=chunk-3ACDP4E6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/indexer/codebase-search.ts","../src/indexer/symbol-extractor.ts"],"sourcesContent":["/**\n * Codebase search — keyword search across symbol indices.\n *\n * Builds an in-memory symbol index for a directory of TS/JS files,\n * then supports keyword search, file summaries, and symbol lookup.\n *\n * Inspired by Augment Code's Context Engine. Uses the existing\n * extractSymbols() function for AST parsing.\n *\n * @module indexer/codebase-search\n */\n\nimport { readdir } from 'node:fs/promises';\nimport { resolve, extname, relative } from 'node:path';\nimport {\n extractSymbols,\n type CodeSymbol,\n type SymbolExtractionResult,\n} from './symbol-extractor.js';\n\n/** A symbol with its source file path. */\nexport interface IndexedSymbol extends CodeSymbol {\n /** Relative file path from the indexed root. */\n filePath: string;\n}\n\n/** Search result with relevance scoring. */\nexport interface SearchResult {\n symbol: IndexedSymbol;\n /** Relevance score (higher = better match). */\n score: number;\n /** How the query matched (exact, prefix, substring, word). */\n matchType: 'exact' | 'prefix' | 'substring' | 'word';\n}\n\n/** File summary — compact overview of a source file. */\nexport interface FileSummary {\n filePath: string;\n totalLines: number;\n exportedSymbols: number;\n privateSymbols: number;\n kinds: Record<string, number>;\n}\n\n/** Index statistics. */\nexport interface IndexStats {\n totalFiles: number;\n totalSymbols: number;\n indexedAt: string;\n}\n\n// Score weights for different match types\nconst SCORE_EXACT = 20;\nconst SCORE_PREFIX = 10;\nconst SCORE_WORD = 5;\nconst SCORE_SUBSTRING = 2;\nconst SCORE_EXPORTED_BONUS = 3;\n\nfunction isSourceFile(name: string): boolean {\n const ext = extname(name).toLowerCase();\n return (\n ['.ts', '.tsx', '.js', '.jsx'].includes(ext) &&\n !name.endsWith('.test.ts') &&\n !name.endsWith('.test.tsx') &&\n !name.endsWith('.d.ts')\n );\n}\n\nasync function findSourceFiles(dir: string, maxDepth: number): Promise<string[]> {\n if (maxDepth <= 0) return [];\n const files: string[] = [];\n const entries = await readdir(dir, { withFileTypes: true }).catch(() => []);\n for (const entry of entries) {\n const fullPath = resolve(dir, entry.name);\n if (entry.isDirectory() && entry.name !== 'node_modules' && entry.name !== 'dist') {\n files.push(...(await findSourceFiles(fullPath, maxDepth - 1)));\n }\n if (entry.isFile() && isSourceFile(entry.name)) {\n files.push(fullPath);\n }\n }\n return files;\n}\n\nfunction scoreMatch(symbolName: string, query: string): SearchResult['score'] | null {\n const nameLower = symbolName.toLowerCase();\n const queryLower = query.toLowerCase();\n\n if (nameLower === queryLower) return SCORE_EXACT;\n if (nameLower.startsWith(queryLower)) return SCORE_PREFIX;\n\n // Word boundary match (camelCase splitting)\n const words = symbolName\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .toLowerCase()\n .split(/[\\s_-]+/);\n if (words.some((w) => w === queryLower)) return SCORE_WORD;\n\n if (nameLower.includes(queryLower)) return SCORE_SUBSTRING;\n\n return null;\n}\n\nfunction getMatchType(score: number): SearchResult['matchType'] {\n if (score >= SCORE_EXACT) return 'exact';\n if (score >= SCORE_PREFIX) return 'prefix';\n if (score >= SCORE_WORD) return 'word';\n return 'substring';\n}\n\n/** In-memory codebase symbol index. */\nexport class CodebaseIndex {\n private readonly symbols: IndexedSymbol[] = [];\n private readonly fileResults = new Map<string, SymbolExtractionResult>();\n private readonly rootDir: string;\n\n constructor(rootDir: string) {\n this.rootDir = rootDir;\n }\n\n /** Index all TS/JS source files in the directory. */\n async index(maxDepth = 4): Promise<IndexStats> {\n const files = await findSourceFiles(this.rootDir, maxDepth);\n\n for (const file of files) {\n const result = await extractSymbols(file);\n const relPath = relative(this.rootDir, file);\n this.fileResults.set(relPath, result);\n\n for (const symbol of result.symbols) {\n this.symbols.push({ ...symbol, filePath: relPath });\n }\n }\n\n return {\n totalFiles: files.length,\n totalSymbols: this.symbols.length,\n indexedAt: new Date().toISOString(),\n };\n }\n\n /** Search symbols by keyword. Returns top N results sorted by relevance. */\n search(query: string, limit = 20): SearchResult[] {\n const results: SearchResult[] = [];\n\n for (const symbol of this.symbols) {\n const baseScore = scoreMatch(symbol.name, query);\n if (baseScore === null) continue;\n\n const bonus = symbol.exported ? SCORE_EXPORTED_BONUS : 0;\n results.push({\n symbol,\n score: baseScore + bonus,\n matchType: getMatchType(baseScore),\n });\n }\n\n return results.sort((a, b) => b.score - a.score).slice(0, limit);\n }\n\n /** Get a compact summary of a file's symbols. */\n getFileSummary(filePath: string): FileSummary | undefined {\n const result = this.fileResults.get(filePath);\n if (result === undefined) return undefined;\n\n const kinds: Record<string, number> = {};\n let exported = 0;\n let priv = 0;\n\n for (const s of result.symbols) {\n kinds[s.kind] = (kinds[s.kind] ?? 0) + 1;\n if (s.exported) exported++;\n else priv++;\n }\n\n return {\n filePath,\n totalLines: result.totalLines,\n exportedSymbols: exported,\n privateSymbols: priv,\n kinds,\n };\n }\n\n /** List all indexed files with symbol counts. */\n listFiles(): Array<{ path: string; symbols: number; lines: number }> {\n return [...this.fileResults.entries()].map(([path, result]) => ({\n path,\n symbols: result.symbols.length,\n lines: result.totalLines,\n }));\n }\n\n /** Get index statistics. */\n get stats(): { files: number; symbols: number } {\n return {\n files: this.fileResults.size,\n symbols: this.symbols.length,\n };\n }\n}\n","/**\n * AST symbol extraction for token-efficient code retrieval.\n *\n * Uses TypeScript's compiler API to extract function, class, method,\n * interface, and type definitions from source files.\n *\n * Token savings: ~80-99% vs reading full files.\n * No additional dependencies — uses TypeScript (already a project dep).\n *\n * @module indexer/symbol-extractor\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { extname } from 'node:path';\nimport ts from 'typescript';\n\n/** A symbol extracted from source code. */\nexport interface CodeSymbol {\n /** Symbol name */\n name: string;\n /** Symbol kind */\n kind: 'function' | 'class' | 'method' | 'interface' | 'type' | 'variable' | 'enum';\n /** Start line (1-based) */\n startLine: number;\n /** End line (1-based) */\n endLine: number;\n /** Full source text of the symbol */\n text: string;\n /** Whether the symbol is exported */\n exported: boolean;\n}\n\n/** Result of extracting symbols from a file. */\nexport interface SymbolExtractionResult {\n filePath: string;\n symbols: CodeSymbol[];\n totalLines: number;\n totalChars: number;\n symbolChars: number;\n savingsPercent: number;\n}\n\nfunction getKind(node: ts.Node): CodeSymbol['kind'] | null {\n if (ts.isFunctionDeclaration(node)) return 'function';\n if (ts.isClassDeclaration(node)) return 'class';\n if (ts.isInterfaceDeclaration(node)) return 'interface';\n if (ts.isTypeAliasDeclaration(node)) return 'type';\n if (ts.isEnumDeclaration(node)) return 'enum';\n if (ts.isMethodDeclaration(node)) return 'method';\n if (ts.isVariableStatement(node)) return 'variable';\n return null;\n}\n\nfunction getName(node: ts.Node): string {\n if (\n ts.isFunctionDeclaration(node) ||\n ts.isClassDeclaration(node) ||\n ts.isInterfaceDeclaration(node) ||\n ts.isTypeAliasDeclaration(node) ||\n ts.isEnumDeclaration(node) ||\n ts.isMethodDeclaration(node)\n ) {\n const nameNode = (node as ts.NamedDeclaration).name;\n return nameNode ? nameNode.getText() : '<anonymous>';\n }\n if (ts.isVariableStatement(node)) {\n const decls = node.declarationList.declarations;\n const firstDecl = decls[0];\n if (firstDecl !== undefined) {\n return firstDecl.name.getText();\n }\n }\n return '<anonymous>';\n}\n\nfunction isExported(node: ts.Node): boolean {\n const modifiers = ts.canHaveModifiers(node) ? ts.getModifiers(node) : undefined;\n if (modifiers) {\n return modifiers.some((m) => m.kind === ts.SyntaxKind.ExportKeyword);\n }\n return false;\n}\n\nfunction visitNode(node: ts.Node, sourceFile: ts.SourceFile, symbols: CodeSymbol[]): void {\n const kind = getKind(node);\n if (kind !== null) {\n const name = getName(node);\n if (name !== '<anonymous>') {\n const start = sourceFile.getLineAndCharacterOfPosition(node.getStart());\n const end = sourceFile.getLineAndCharacterOfPosition(node.getEnd());\n symbols.push({\n name,\n kind,\n startLine: start.line + 1,\n endLine: end.line + 1,\n text: node.getText(sourceFile),\n exported: isExported(node),\n });\n }\n }\n if (ts.isClassDeclaration(node)) {\n visitClassMembers(node, sourceFile, symbols);\n return;\n }\n ts.forEachChild(node, (child) => {\n visitNode(child, sourceFile, symbols);\n });\n}\n\nfunction visitClassMembers(\n node: ts.ClassDeclaration,\n sourceFile: ts.SourceFile,\n symbols: CodeSymbol[]\n): void {\n for (const member of node.members) {\n if (ts.isMethodDeclaration(member) || ts.isPropertyDeclaration(member)) {\n const memberName = member.name.getText();\n if (memberName !== '<anonymous>') {\n const start = sourceFile.getLineAndCharacterOfPosition(member.getStart());\n const end = sourceFile.getLineAndCharacterOfPosition(member.getEnd());\n symbols.push({\n name: memberName,\n kind: 'method',\n startLine: start.line + 1,\n endLine: end.line + 1,\n text: member.getText(sourceFile),\n exported: false,\n });\n }\n }\n }\n}\n\nfunction computeSavings(totalChars: number, symbolChars: number): number {\n return totalChars > 0 ? Math.round(100 * (1 - symbolChars / totalChars) * 10) / 10 : 0;\n}\n\n/**\n * Extract symbols from a TypeScript/JavaScript file.\n */\nexport async function extractSymbols(filePath: string): Promise<SymbolExtractionResult> {\n const ext = extname(filePath).toLowerCase();\n if (!['.ts', '.tsx', '.js', '.jsx'].includes(ext)) {\n return {\n filePath,\n symbols: [],\n totalLines: 0,\n totalChars: 0,\n symbolChars: 0,\n savingsPercent: 0,\n };\n }\n\n const source = await readFile(filePath, 'utf-8');\n const sourceFile = ts.createSourceFile(filePath, source, ts.ScriptTarget.Latest, true);\n const symbols: CodeSymbol[] = [];\n\n ts.forEachChild(sourceFile, (node) => {\n visitNode(node, sourceFile, symbols);\n });\n\n const totalChars = source.length;\n const symbolChars = symbols.reduce((sum, s) => sum + s.text.length, 0);\n\n return {\n filePath,\n symbols,\n totalLines: source.split('\\n').length,\n totalChars,\n symbolChars,\n savingsPercent: computeSavings(totalChars, symbolChars),\n };\n}\n\n/**\n * Extract a compact symbol index (names + locations only, no source text).\n * This is the minimal representation for LLM context — ~95%+ token savings.\n */\nexport async function extractSymbolIndex(filePath: string): Promise<string> {\n const result = await extractSymbols(filePath);\n if (result.symbols.length === 0) return '';\n\n const lines = result.symbols.map((s) => {\n const exp = s.exported ? 'export ' : '';\n return `${exp}${s.kind} ${s.name} (L${String(s.startLine)}-${String(s.endLine)})`;\n });\n\n return `// ${filePath} — ${String(result.symbols.length)} symbols\\n${lines.join('\\n')}`;\n}\n"],"mappings":"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","names":["extname","extname"]}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
2
|
resolveToken
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-Z64MSLEK.js";
|
|
4
4
|
import {
|
|
5
5
|
GitHubProvider,
|
|
6
6
|
ScmError
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-L362KRSU.js";
|
|
8
8
|
import {
|
|
9
9
|
err,
|
|
10
10
|
ok
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-RXVH52UI.js";
|
|
12
12
|
|
|
13
13
|
// src/scm/factory.ts
|
|
14
14
|
async function createScmProvider(config) {
|
|
@@ -41,4 +41,4 @@ export {
|
|
|
41
41
|
createScmProvider,
|
|
42
42
|
createGitHubProvider
|
|
43
43
|
};
|
|
44
|
-
//# sourceMappingURL=chunk-
|
|
44
|
+
//# sourceMappingURL=chunk-3ASED5PR.js.map
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getToolMemory
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-YO27YAEX.js";
|
|
4
4
|
import {
|
|
5
5
|
CLI_NAMES,
|
|
6
6
|
StrategyDistiller,
|
|
7
7
|
createLogger,
|
|
8
8
|
getOutcomeStore,
|
|
9
9
|
registerPersistentDistillerFactory
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-RXVH52UI.js";
|
|
11
11
|
import {
|
|
12
12
|
ensureLearningDir,
|
|
13
13
|
getRulesFile
|
|
@@ -94,7 +94,7 @@ var PersistentStrategyDistiller = class extends StrategyDistiller {
|
|
|
94
94
|
savedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
95
95
|
rules
|
|
96
96
|
};
|
|
97
|
-
const tmpPath = this.filePath
|
|
97
|
+
const tmpPath = `${this.filePath}.tmp.${String(process.pid)}`;
|
|
98
98
|
try {
|
|
99
99
|
ensureLearningDir(dirname(this.filePath));
|
|
100
100
|
writeFileSync(tmpPath, JSON.stringify(snapshot, null, 2), "utf-8");
|
|
@@ -273,4 +273,4 @@ export {
|
|
|
273
273
|
inferTaskCategory,
|
|
274
274
|
summarizeContextForPrompt
|
|
275
275
|
};
|
|
276
|
-
//# sourceMappingURL=chunk-
|
|
276
|
+
//# sourceMappingURL=chunk-3GJAAENS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/learning/strategy-distiller-persistence.ts","../src/context/context-retriever.ts"],"sourcesContent":["/**\n * Persistent StrategyDistiller — JSON-backed cross-session persistence.\n *\n * Extends StrategyDistiller with atomic disk writes (write tmp + rename)\n * for distilled rules. Hydrates from a versioned JSON snapshot on\n * construction; saves after every distill() call.\n *\n * @module learning/strategy-distiller-persistence\n * (Source: Issue #1009 — Cross-session persistence)\n */\n\nimport { writeFileSync, readFileSync, renameSync, unlinkSync, existsSync } from 'node:fs';\nimport { dirname } from 'node:path';\nimport { z } from 'zod';\nimport { CLI_NAMES } from '../config/model-capabilities-types.js';\n\nimport type { ILogger } from '../core/index.js';\nimport { createLogger } from '../core/index.js';\nimport type { OutcomeStore } from '../orchestration/outcomes/outcome-store.js';\nimport type { DistilledRule, DistillerConfig } from './strategy-distiller-types.js';\nimport { StrategyDistiller, registerPersistentDistillerFactory } from './strategy-distiller.js';\nimport { ensureLearningDir, getRulesFile } from '../config/learning-persistence.js';\n\n// ============================================================================\n// Versioned Schema\n// ============================================================================\n\nconst DistilledRuleSchema = z.object({\n id: z.string(),\n patternType: z.enum(['failure-rate', 'success-rate', 'latency-spike']),\n cli: z.enum(CLI_NAMES),\n category: z.string(),\n action: z.enum(['penalize', 'boost', 'avoid']),\n confidence: z.number(),\n observationCount: z.number(),\n metric: z.number(),\n status: z.enum(['draft', 'active', 'promoted', 'expired']),\n createdAt: z.number(),\n updatedAt: z.number(),\n tainted: z.boolean(),\n});\n\n/** Versioned snapshot schema for atomic saves. */\nexport const RulesSnapshotSchema = z.object({\n version: z.literal(1),\n savedAt: z.string(),\n rules: z.array(DistilledRuleSchema),\n});\n\nexport type RulesSnapshot = z.infer<typeof RulesSnapshotSchema>;\n\n// ============================================================================\n// Configuration\n// ============================================================================\n\nexport interface PersistentDistillerConfig {\n /** Override the file path (useful for testing). */\n readonly filePath?: string;\n /** Override the data directory (useful for testing). */\n readonly dataDir?: string;\n}\n\n// ============================================================================\n// Implementation\n// ============================================================================\n\n/**\n * StrategyDistiller that persists distilled rules to a JSON file.\n *\n * - Construction: hydrates from rules.json via Zod validation\n * - distill(): calls super.distill() then atomically saves snapshot\n * - Corruption: warn + start fresh (no partial loads)\n */\nexport class PersistentStrategyDistiller extends StrategyDistiller {\n private readonly filePath: string;\n private readonly persistLogger: ILogger;\n\n constructor(\n outcomeStore: OutcomeStore,\n persistConfig?: PersistentDistillerConfig,\n logger?: ILogger,\n distillerConfig?: Partial<DistillerConfig>\n ) {\n super(outcomeStore, logger, distillerConfig);\n this.filePath = persistConfig?.filePath ?? getRulesFile();\n this.persistLogger = logger ?? createLogger({ component: 'PersistentStrategyDistiller' });\n\n const dataDir = persistConfig?.dataDir;\n ensureLearningDir(dataDir);\n this.hydrate();\n }\n\n /** Override distill to persist rules after each run. */\n override distill(): void {\n super.distill();\n this.saveSnapshot();\n }\n\n // ==========================================================================\n // Private\n // ==========================================================================\n\n private hydrate(): void {\n if (!existsSync(this.filePath)) {\n this.persistLogger.debug('No rules file found, starting fresh', {\n path: this.filePath,\n });\n return;\n }\n\n try {\n const content = readFileSync(this.filePath, 'utf-8');\n const parsed: unknown = JSON.parse(content);\n const result = RulesSnapshotSchema.safeParse(parsed);\n\n if (!result.success) {\n this.persistLogger.warn('Rules file failed validation, starting fresh', {\n path: this.filePath,\n error: result.error.message,\n });\n return;\n }\n\n this.loadRules(result.data.rules);\n this.persistLogger.info('Hydrated distilled rules from disk', {\n ruleCount: result.data.rules.length,\n savedAt: result.data.savedAt,\n path: this.filePath,\n });\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n this.persistLogger.warn('Failed to hydrate rules from disk', {\n error: msg,\n path: this.filePath,\n });\n }\n }\n\n private saveSnapshot(): void {\n const rules = this.getRules();\n const snapshot: RulesSnapshot = {\n version: 1,\n savedAt: new Date().toISOString(),\n rules: rules as DistilledRule[],\n };\n\n // PID-suffixed temp path so two processes saving concurrently don't truncate each\n // other's temp file mid-renameSync. Matches the convention in correlation-persistence.ts\n // and research-auto-catalog.ts. Closes #2972.\n const tmpPath = `${this.filePath}.tmp.${String(process.pid)}`;\n try {\n // Ensure parent directory exists\n ensureLearningDir(dirname(this.filePath));\n // Atomic write: temp file + rename\n writeFileSync(tmpPath, JSON.stringify(snapshot, null, 2), 'utf-8');\n renameSync(tmpPath, this.filePath);\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n this.persistLogger.warn('Failed to persist rules to disk', {\n error: msg,\n path: this.filePath,\n });\n // Clean up temp file on failure\n try {\n if (existsSync(tmpPath)) unlinkSync(tmpPath);\n } catch (cleanupErr: unknown) {\n const msg = cleanupErr instanceof Error ? cleanupErr.message : String(cleanupErr);\n this.persistLogger.debug('Failed to clean up temp file during persist', {\n path: tmpPath,\n error: msg,\n });\n }\n }\n }\n}\n\n// Self-register factory so CompositeRouter can create PersistentStrategyDistiller\n// without a circular top-level import.\nregisterPersistentDistillerFactory(\n (outcomeStore, logger) => new PersistentStrategyDistiller(outcomeStore, undefined, logger)\n);\n\n/**\n * Phase 5 of #2792 — read the persisted distilled rules from disk\n * without needing a live `StrategyDistiller` instance.\n *\n * `ContextRetriever` uses this so `UnifiedContext.priorStrategies`\n * surfaces the routing learnings the CompositeRouter has already\n * derived, even when the consumer is in a different process / scope\n * (e.g. an `orchestrate` invocation that hasn't constructed its own\n * router yet).\n *\n * Returns `[]` when the file is missing, corrupt, or unreadable; never\n * throws. The caller is responsible for filtering to status / category /\n * tainted as appropriate — this loader returns the raw rule set so\n * future consumers can apply their own predicates.\n */\nexport function loadPersistedRules(filePath: string = getRulesFile()): readonly DistilledRule[] {\n if (!existsSync(filePath)) return [];\n try {\n const content = readFileSync(filePath, 'utf-8');\n const parsed: unknown = JSON.parse(content);\n const result = RulesSnapshotSchema.safeParse(parsed);\n if (!result.success) return [];\n return result.data.rules;\n } catch {\n // Disk read / parse failures contribute an empty list — the consumer\n // contract is \"absence means no signal,\" never an exception.\n return [];\n }\n}\n","/**\n * ContextRetriever — the unified read surface every entry point should call\n * to learn what we already know about a task.\n *\n * Phase 2 of #2792. Before this module, each entry point (routing, orchestration,\n * graph workflow, expert creation) reinvented memory access — or, more commonly,\n * skipped it entirely. That made every backend write-only in practice.\n *\n * `getContextForTask({ task, category })` is the one function every entry point\n * calls. It fans out across the shared backends in parallel, tolerates\n * individual failures (never throws), and returns a typed `UnifiedContext`\n * the consumer can either use directly or summarize into a prompt.\n *\n * **Implementation choice — typed singletons, not registry fan-out.**\n * Phase 1 (#2793) made `IMemoryBackend.query()` real on every attached\n * domain, so a registry-level `Promise.all(...domains.map(d => d.query()))`\n * would now work. But the result type is `unknown[]` per domain, which\n * loses the typed shapes consumers want. For typed reads, reaching into\n * `getToolMemory()` and `getOutcomeStore()` directly is cleaner. The\n * registry-level fan-out remains the right path for opaque/observability\n * consumers like `memory_stats`.\n *\n * @module context/context-retriever\n * (Source: #2792 / #2794)\n */\n\nimport type { Belief } from './belief-core-types.js';\nimport type { AgenticMemoryEntry } from './agentic-memory.js';\nimport type { ScoredMemoryEntry } from './adaptive-memory-types.js';\nimport type { ExperienceEntry } from './mobimem-types.js';\nimport type { PerformanceSummary } from '../orchestration/outcomes/outcome-types.js';\nimport type { TaskCategory } from '../config/task-specialization-types.js';\nimport type { DistilledRule } from '../learning/strategy-distiller-types.js';\nimport type { ILogger } from '../core/logger.js';\nimport { createLogger } from '../core/logger.js';\nimport { getToolMemory } from '../mcp/tools/tool-memory.js';\nimport { getOutcomeStore } from '../orchestration/outcomes/outcome-store.js';\nimport { loadPersistedRules } from '../learning/strategy-distiller-persistence.js';\n\n/**\n * What we know about a task, derived from every shared memory backend.\n *\n * Every field is `readonly` and may be empty — consumers should treat\n * absence as \"no signal,\" not failure. Errors fetching any single backend\n * are logged and produce empty results for that field; the function as a\n * whole never throws.\n */\nexport interface UnifiedContext {\n /** Beliefs whose subject matches the task text. */\n readonly beliefs: readonly Belief[];\n /** A-MEM Zettelkasten entries similar to the task. */\n readonly similarMemories: readonly AgenticMemoryEntry[];\n /** Adaptive priority-scored entries ranked by relevance + recency + importance. */\n readonly recentLearnings: readonly ScoredMemoryEntry[];\n /** MobiMem patterns observed for the task type. */\n readonly experiencePatterns: readonly ExperienceEntry[];\n /** Performance summary scoped to the requested category. */\n readonly outcomes: PerformanceSummary | null;\n /** Distilled routing rules — populated once #2797 lands; empty until then. */\n readonly priorStrategies: readonly DistilledRule[];\n}\n\n/** Options accepted by {@link getContextForTask}. */\nexport interface ContextRetrieverOptions {\n /** Free-text description of the task. Used as the search term. */\n readonly task: string;\n /** Canonical category for outcome scoping. */\n readonly category: TaskCategory;\n /** Per-backend cap on returned rows. Defaults to 5. */\n readonly limit?: number;\n /** Optional logger override. */\n readonly logger?: ILogger;\n}\n\n/** Sensible default — small enough to embed in a prompt, large enough to be useful. */\nconst DEFAULT_LIMIT = 5;\n\n/**\n * The canonical \"what do we already know about this task\" read.\n *\n * Wire this at the top of every entry point: `CompositeRouter.route`,\n * `orchestrate`, graph workflow start, `create_expert`. Even if the\n * consumer initially just logs the result, every backend's read path\n * gets exercised and the silos visibly converge.\n *\n * Latency: O(slowest individual backend). Each backend's call is wrapped\n * so a slow/failing one doesn't block the others. No caching in this\n * version — if a hot caller emerges, layer a TTL cache on top.\n */\nexport async function getContextForTask(options: ContextRetrieverOptions): Promise<UnifiedContext> {\n const limit = options.limit ?? DEFAULT_LIMIT;\n const logger = options.logger ?? createLogger({ component: 'ContextRetriever' });\n\n const [beliefs, similarMemories, recentLearnings, experiencePatterns, outcomes] =\n await Promise.all([\n fetchBeliefs(options.task, limit, logger),\n fetchSimilarMemories(options.task, limit, logger),\n fetchRecentLearnings(options.task, limit, logger),\n fetchExperiencePatterns(options.task, limit, logger),\n fetchOutcomes(options.category, logger),\n ]);\n\n const priorStrategies = fetchPriorStrategies(options.category, limit, logger);\n\n return {\n beliefs,\n similarMemories,\n recentLearnings,\n experiencePatterns,\n outcomes,\n priorStrategies,\n };\n}\n\n/**\n * Phase 5 of #2792 — surface distilled routing rules in the unified\n * context. Reads from the persisted rules file (written by\n * `PersistentStrategyDistiller`) so consumers see the same learnings the\n * CompositeRouter applies at decision time, without needing a live\n * router instance.\n *\n * Filters to (a) `status === 'active'` (rules that aren't deprecated or\n * shadowed), (b) `tainted === false` (security gate — tainted rules\n * never reach consumers per Phase 5 acceptance), and (c) category\n * matching the task's category or a global rule.\n */\nfunction fetchPriorStrategies(\n category: TaskCategory,\n limit: number,\n logger: ILogger\n): readonly DistilledRule[] {\n try {\n const all = loadPersistedRules();\n return all\n .filter((r) => r.status === 'active' && !r.tainted)\n .filter((r) => r.category === category || r.category === '*')\n .slice(0, limit);\n } catch (error: unknown) {\n logger.debug('ContextRetriever: prior-strategies fetch failed', {\n error: formatError(error),\n });\n return [];\n }\n}\n\nasync function fetchBeliefs(\n task: string,\n limit: number,\n logger: ILogger\n): Promise<readonly Belief[]> {\n try {\n const tm = getToolMemory(logger);\n const beliefs = tm.getBeliefMemory();\n const result = await beliefs.recallBySubject(task, limit);\n return result.ok ? result.value : [];\n } catch (error: unknown) {\n logger.debug('ContextRetriever: belief fetch failed', { error: formatError(error) });\n return [];\n }\n}\n\nasync function fetchSimilarMemories(\n task: string,\n limit: number,\n logger: ILogger\n): Promise<readonly AgenticMemoryEntry[]> {\n try {\n const tm = getToolMemory(logger);\n const agentic = tm.getAgenticMemoryBackend();\n if (agentic === null) return [];\n const result = await agentic.searchAgentic(task, limit);\n return result.ok ? result.value : [];\n } catch (error: unknown) {\n logger.debug('ContextRetriever: agentic search failed', { error: formatError(error) });\n return [];\n }\n}\n\nasync function fetchRecentLearnings(\n task: string,\n limit: number,\n logger: ILogger\n): Promise<readonly ScoredMemoryEntry[]> {\n try {\n const tm = getToolMemory(logger);\n const adaptive = tm.getAdaptiveMemoryBackend();\n if (adaptive === null) return [];\n const result = await adaptive.retrieveByPriority({ query: task, limit });\n return result.ok ? result.value : [];\n } catch (error: unknown) {\n logger.debug('ContextRetriever: adaptive fetch failed', { error: formatError(error) });\n return [];\n }\n}\n\nfunction fetchExperiencePatterns(\n task: string,\n limit: number,\n logger: ILogger\n): Promise<readonly ExperienceEntry[]> {\n try {\n const tm = getToolMemory(logger);\n const mobimem = tm.getMobiMem();\n if (mobimem === null) return Promise.resolve([]);\n return Promise.resolve(mobimem.experience.findPatterns(task, limit));\n } catch (error: unknown) {\n logger.debug('ContextRetriever: mobimem fetch failed', { error: formatError(error) });\n return Promise.resolve([]);\n }\n}\n\nfunction fetchOutcomes(\n category: TaskCategory,\n logger: ILogger\n): Promise<PerformanceSummary | null> {\n try {\n const store = getOutcomeStore();\n return Promise.resolve(store.summarize({ category }));\n } catch (error: unknown) {\n logger.debug('ContextRetriever: outcomes fetch failed', { error: formatError(error) });\n return Promise.resolve(null);\n }\n}\n\nfunction formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n/**\n * Best-effort {@link TaskCategory} inference from free-text task content.\n * Used by entry-point wiring (Phase 3 / #2795) when the caller doesn't\n * carry a structured category. Keyword-based; if nothing matches,\n * returns `'exploration'` (which scopes the outcomes summary to the\n * broadest historical baseline).\n *\n * Intentionally simple — this is a *fallback*, not a classifier. Real\n * classification happens at routing time via `cli-adapters/task-classifier`.\n */\nexport function inferTaskCategory(task: string): TaskCategory {\n const t = task.toLowerCase();\n if (/security|vulnerab|cve|threat|owasp|injection|xss/.test(t)) return 'security_review';\n if (/architect|design doc|rfc|adr|system design/.test(t)) return 'architecture';\n if (/test|spec|coverage|vitest|jest|pytest/.test(t)) return 'testing';\n if (/review|audit|critique|feedback/.test(t)) return 'code_review';\n if (/docs|documentation|readme|tutorial|guide/.test(t)) return 'documentation';\n if (/plan|roadmap|epic|sprint|breakdown/.test(t)) return 'planning';\n if (/research|investigate|explore|survey|analyze/.test(t)) return 'research';\n if (/deploy| ci |\\bcd\\b|pipeline|kubernetes|docker|infra|terraform/.test(t)) return 'devops';\n if (/implement|build|create|add|refactor|fix|bug|feature/.test(t)) return 'code_generation';\n return 'exploration';\n}\n\n/**\n * Project a {@link UnifiedContext} into a compact human-readable block\n * suitable for prepending to a system prompt. Skips empty sections so\n * the prefix never wastes tokens on \\\"no signal.\\\"\n *\n * Phase 3 of #2792 — used by `orchestrate` and graph workflow start to\n * surface accumulated memory at the entry point.\n */\nexport function summarizeContextForPrompt(ctx: UnifiedContext): string {\n const sections: string[] = [];\n\n if (ctx.beliefs.length > 0) {\n const lines = ctx.beliefs\n .slice(0, 5)\n .map((b) => `- ${b.subject} ${b.predicate} ${b.object} (confidence: ${b.confidence})`);\n sections.push(`### Beliefs\\n${lines.join('\\n')}`);\n }\n\n if (ctx.similarMemories.length > 0) {\n const lines = ctx.similarMemories\n .slice(0, 3)\n .map((m) => `- ${m.attributes.contextDescription}`);\n sections.push(`### Similar prior work\\n${lines.join('\\n')}`);\n }\n\n if (ctx.experiencePatterns.length > 0) {\n const lines = ctx.experiencePatterns\n .slice(0, 3)\n .map(\n (p) =>\n `- ${p.taskType}: ${(p.successRate * 100).toFixed(0)}% success over ${String(p.attemptCount)} attempts`\n );\n sections.push(`### Observed patterns\\n${lines.join('\\n')}`);\n }\n\n if (ctx.outcomes !== null && ctx.outcomes.totalTasks > 0) {\n sections.push(\n `### Outcomes for this category\\n- ${String(ctx.outcomes.totalTasks)} prior tasks, ${(ctx.outcomes.successRate * 100).toFixed(0)}% success`\n );\n }\n\n return sections.length === 0 ? '' : `## Prior Context (Nexus Memory)\\n${sections.join('\\n\\n')}`;\n}\n"],"mappings":"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","names":["msg"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
DEFAULT_MODEL_PER_CLI,
|
|
3
3
|
getTimeProvider
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-RXVH52UI.js";
|
|
5
5
|
|
|
6
6
|
// src/config/model-availability.ts
|
|
7
7
|
var DEFAULT_TTL_MS = 6e4;
|
|
@@ -133,4 +133,4 @@ export {
|
|
|
133
133
|
resetAvailabilityCache,
|
|
134
134
|
filterAvailableModels
|
|
135
135
|
};
|
|
136
|
-
//# sourceMappingURL=chunk-
|
|
136
|
+
//# sourceMappingURL=chunk-3WUVWZUC.js.map
|