nexus-agents 3.4.7 → 3.5.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 (125) hide show
  1. package/dist/{child-mcp-config-RPGCCPR7.js → child-mcp-config-VVTPONKP.js} +2 -2
  2. package/dist/{chunk-2KOTMA3Y.js → chunk-3FSBTAEC.js} +2 -2
  3. package/dist/{chunk-ZFLZL6JL.js → chunk-45IB3F6G.js} +71 -10
  4. package/dist/chunk-45IB3F6G.js.map +1 -0
  5. package/dist/{chunk-F4SOZWM5.js → chunk-4ZVNCOZH.js} +2 -2
  6. package/dist/{chunk-UAPIH3ZX.js → chunk-5MRYWJVK.js} +2 -2
  7. package/dist/{chunk-QITBS6CA.js → chunk-6DIGIJIY.js} +8 -8
  8. package/dist/{chunk-SLLUTZHU.js → chunk-6H5AM5SG.js} +55 -46
  9. package/dist/{chunk-SLLUTZHU.js.map → chunk-6H5AM5SG.js.map} +1 -1
  10. package/dist/{chunk-J34IF7WA.js → chunk-6ZOZYECZ.js} +8 -8
  11. package/dist/{chunk-PHEB64A5.js → chunk-7GFMCMLF.js} +2 -2
  12. package/dist/{chunk-YF35FKKD.js → chunk-BQTMMLQQ.js} +15 -7
  13. package/dist/chunk-BQTMMLQQ.js.map +1 -0
  14. package/dist/{chunk-GMJGQ2XO.js → chunk-C25JA3SI.js} +4 -4
  15. package/dist/{chunk-WEQNCK5F.js → chunk-CQ4Y7ULT.js} +5 -5
  16. package/dist/{chunk-7BBHGO7A.js → chunk-D3KHLA3D.js} +2 -2
  17. package/dist/{chunk-RGAC3SAM.js → chunk-EKASN4MV.js} +5 -5
  18. package/dist/{chunk-JHIKOTSP.js → chunk-GVLDWGSK.js} +7 -7
  19. package/dist/{chunk-5542NZXG.js → chunk-GWLBIDS6.js} +3 -3
  20. package/dist/{chunk-UOG5ANHL.js → chunk-HKX7HKDV.js} +3 -3
  21. package/dist/{chunk-TU25EPBM.js → chunk-HPAYIX7E.js} +2 -2
  22. package/dist/{chunk-OR2CJF3R.js → chunk-IK45M7J3.js} +5 -5
  23. package/dist/{chunk-Z53SVS5A.js → chunk-KBVU2GGV.js} +2 -2
  24. package/dist/{chunk-W4GN7VPG.js → chunk-L4J7AXP3.js} +2 -2
  25. package/dist/{chunk-SC7OLO76.js → chunk-LMGXSMC6.js} +2 -2
  26. package/dist/{chunk-YO2OXOPU.js → chunk-QDH2SQKE.js} +2 -2
  27. package/dist/{chunk-FTH6XZFA.js → chunk-QDUZSOOU.js} +2 -2
  28. package/dist/{chunk-RSUQCA2E.js → chunk-ROIGF7ZF.js} +4 -4
  29. package/dist/{chunk-6DDKUQFD.js → chunk-TPKK4ANS.js} +2 -2
  30. package/dist/{chunk-KJ2M2L6J.js → chunk-U76AVHIW.js} +2 -2
  31. package/dist/{chunk-H5BWZMLU.js → chunk-UFJDYK22.js} +4 -4
  32. package/dist/{chunk-SC522IDR.js → chunk-UKIFG26L.js} +3 -3
  33. package/dist/{chunk-XND2FD6I.js → chunk-UOA23X5A.js} +2 -2
  34. package/dist/{chunk-WGBVREBV.js → chunk-XKAUANYB.js} +2 -2
  35. package/dist/{chunk-YHSWBCZJ.js → chunk-XKGEKKKQ.js} +3 -3
  36. package/dist/{chunk-CG5TS6GJ.js → chunk-XOWOOBY7.js} +5 -5
  37. package/dist/{chunk-FBTBH65X.js → chunk-YFY64CCU.js} +5 -4
  38. package/dist/chunk-YFY64CCU.js.map +1 -0
  39. package/dist/{chunk-DXORNOYR.js → chunk-Z5HKO4TN.js} +2 -2
  40. package/dist/{cli-circuit-breaker-PETQMWAX.js → cli-circuit-breaker-BKCDXF7A.js} +3 -3
  41. package/dist/cli.js +41 -41
  42. package/dist/{codebase-search-LUF5YJLQ.js → codebase-search-AATGEN2H.js} +2 -2
  43. package/dist/{composite-router-D36RXDEN.js → composite-router-7ZQW5X6M.js} +2 -2
  44. package/dist/{consensus-vote-CVXD54KV.js → consensus-vote-JAQXK6NR.js} +16 -16
  45. package/dist/{context-retriever-TCS3ZCHM.js → context-retriever-4BWVW6Z3.js} +8 -8
  46. package/dist/{doctor-deep-KCBA7PRP.js → doctor-deep-XEIFQH2B.js} +3 -3
  47. package/dist/{expert-bridge-4N5Q5T6J.js → expert-bridge-KXXOPEZF.js} +4 -4
  48. package/dist/{factory-KDJP6PLO.js → factory-DFOM4HM5.js} +5 -5
  49. package/dist/{factory-ASP7H2N6.js → factory-L74ZN3ZO.js} +9 -9
  50. package/dist/{improvement-review-5SWVO5KR.js → improvement-review-P5OTBXCR.js} +5 -5
  51. package/dist/index.d.ts +75 -1
  52. package/dist/index.js +31 -31
  53. package/dist/{init-opencode-Q6YEYFJK.js → init-opencode-ZYRLCXUF.js} +6 -6
  54. package/dist/{issue-triage-AOTQZ7RB.js → issue-triage-R543HBHK.js} +6 -6
  55. package/dist/{pr-reviewer-helpers-GAXKDXOB.js → pr-reviewer-helpers-T33G7ACC.js} +4 -4
  56. package/dist/{registry-command-AUHXXQMZ.js → registry-command-PW7PXQDH.js} +2 -2
  57. package/dist/{repo-security-plan-EGRREARY.js → repo-security-plan-RVKAJD7N.js} +3 -3
  58. package/dist/{research-helpers-synthesize-HBR26XOL.js → research-helpers-synthesize-FPBPUTJJ.js} +4 -4
  59. package/dist/{routing-memory-UJ6EC6HP.js → routing-memory-X5KJULU7.js} +2 -2
  60. package/dist/{session-memory-J47B6D5W.js → session-memory-UX5SU2ZG.js} +3 -3
  61. package/dist/{setup-command-OZLCZC5Q.js → setup-command-VWOUSXWP.js} +14 -14
  62. package/dist/{setup-config-FTSQUTS7.js → setup-config-IEH3CVR5.js} +3 -3
  63. package/dist/{setup-custom-api-7FACD7AZ.js → setup-custom-api-V4K6SQQN.js} +4 -4
  64. package/dist/{tool-memory-HDV46HBY.js → tool-memory-IALII4YE.js} +5 -5
  65. package/dist/{unified-registry-OOS6RFJT.js → unified-registry-RUA3EHP4.js} +10 -10
  66. package/dist/{weather-report-SMQFSLI4.js → weather-report-PBVXX2HU.js} +2 -2
  67. package/package.json +1 -1
  68. package/dist/chunk-FBTBH65X.js.map +0 -1
  69. package/dist/chunk-YF35FKKD.js.map +0 -1
  70. package/dist/chunk-ZFLZL6JL.js.map +0 -1
  71. /package/dist/{child-mcp-config-RPGCCPR7.js.map → child-mcp-config-VVTPONKP.js.map} +0 -0
  72. /package/dist/{chunk-2KOTMA3Y.js.map → chunk-3FSBTAEC.js.map} +0 -0
  73. /package/dist/{chunk-F4SOZWM5.js.map → chunk-4ZVNCOZH.js.map} +0 -0
  74. /package/dist/{chunk-UAPIH3ZX.js.map → chunk-5MRYWJVK.js.map} +0 -0
  75. /package/dist/{chunk-QITBS6CA.js.map → chunk-6DIGIJIY.js.map} +0 -0
  76. /package/dist/{chunk-J34IF7WA.js.map → chunk-6ZOZYECZ.js.map} +0 -0
  77. /package/dist/{chunk-PHEB64A5.js.map → chunk-7GFMCMLF.js.map} +0 -0
  78. /package/dist/{chunk-GMJGQ2XO.js.map → chunk-C25JA3SI.js.map} +0 -0
  79. /package/dist/{chunk-WEQNCK5F.js.map → chunk-CQ4Y7ULT.js.map} +0 -0
  80. /package/dist/{chunk-7BBHGO7A.js.map → chunk-D3KHLA3D.js.map} +0 -0
  81. /package/dist/{chunk-RGAC3SAM.js.map → chunk-EKASN4MV.js.map} +0 -0
  82. /package/dist/{chunk-JHIKOTSP.js.map → chunk-GVLDWGSK.js.map} +0 -0
  83. /package/dist/{chunk-5542NZXG.js.map → chunk-GWLBIDS6.js.map} +0 -0
  84. /package/dist/{chunk-UOG5ANHL.js.map → chunk-HKX7HKDV.js.map} +0 -0
  85. /package/dist/{chunk-TU25EPBM.js.map → chunk-HPAYIX7E.js.map} +0 -0
  86. /package/dist/{chunk-OR2CJF3R.js.map → chunk-IK45M7J3.js.map} +0 -0
  87. /package/dist/{chunk-Z53SVS5A.js.map → chunk-KBVU2GGV.js.map} +0 -0
  88. /package/dist/{chunk-W4GN7VPG.js.map → chunk-L4J7AXP3.js.map} +0 -0
  89. /package/dist/{chunk-SC7OLO76.js.map → chunk-LMGXSMC6.js.map} +0 -0
  90. /package/dist/{chunk-YO2OXOPU.js.map → chunk-QDH2SQKE.js.map} +0 -0
  91. /package/dist/{chunk-FTH6XZFA.js.map → chunk-QDUZSOOU.js.map} +0 -0
  92. /package/dist/{chunk-RSUQCA2E.js.map → chunk-ROIGF7ZF.js.map} +0 -0
  93. /package/dist/{chunk-6DDKUQFD.js.map → chunk-TPKK4ANS.js.map} +0 -0
  94. /package/dist/{chunk-KJ2M2L6J.js.map → chunk-U76AVHIW.js.map} +0 -0
  95. /package/dist/{chunk-H5BWZMLU.js.map → chunk-UFJDYK22.js.map} +0 -0
  96. /package/dist/{chunk-SC522IDR.js.map → chunk-UKIFG26L.js.map} +0 -0
  97. /package/dist/{chunk-XND2FD6I.js.map → chunk-UOA23X5A.js.map} +0 -0
  98. /package/dist/{chunk-WGBVREBV.js.map → chunk-XKAUANYB.js.map} +0 -0
  99. /package/dist/{chunk-YHSWBCZJ.js.map → chunk-XKGEKKKQ.js.map} +0 -0
  100. /package/dist/{chunk-CG5TS6GJ.js.map → chunk-XOWOOBY7.js.map} +0 -0
  101. /package/dist/{chunk-DXORNOYR.js.map → chunk-Z5HKO4TN.js.map} +0 -0
  102. /package/dist/{cli-circuit-breaker-PETQMWAX.js.map → cli-circuit-breaker-BKCDXF7A.js.map} +0 -0
  103. /package/dist/{codebase-search-LUF5YJLQ.js.map → codebase-search-AATGEN2H.js.map} +0 -0
  104. /package/dist/{composite-router-D36RXDEN.js.map → composite-router-7ZQW5X6M.js.map} +0 -0
  105. /package/dist/{consensus-vote-CVXD54KV.js.map → consensus-vote-JAQXK6NR.js.map} +0 -0
  106. /package/dist/{context-retriever-TCS3ZCHM.js.map → context-retriever-4BWVW6Z3.js.map} +0 -0
  107. /package/dist/{doctor-deep-KCBA7PRP.js.map → doctor-deep-XEIFQH2B.js.map} +0 -0
  108. /package/dist/{expert-bridge-4N5Q5T6J.js.map → expert-bridge-KXXOPEZF.js.map} +0 -0
  109. /package/dist/{factory-ASP7H2N6.js.map → factory-DFOM4HM5.js.map} +0 -0
  110. /package/dist/{factory-KDJP6PLO.js.map → factory-L74ZN3ZO.js.map} +0 -0
  111. /package/dist/{improvement-review-5SWVO5KR.js.map → improvement-review-P5OTBXCR.js.map} +0 -0
  112. /package/dist/{init-opencode-Q6YEYFJK.js.map → init-opencode-ZYRLCXUF.js.map} +0 -0
  113. /package/dist/{issue-triage-AOTQZ7RB.js.map → issue-triage-R543HBHK.js.map} +0 -0
  114. /package/dist/{pr-reviewer-helpers-GAXKDXOB.js.map → pr-reviewer-helpers-T33G7ACC.js.map} +0 -0
  115. /package/dist/{registry-command-AUHXXQMZ.js.map → registry-command-PW7PXQDH.js.map} +0 -0
  116. /package/dist/{repo-security-plan-EGRREARY.js.map → repo-security-plan-RVKAJD7N.js.map} +0 -0
  117. /package/dist/{research-helpers-synthesize-HBR26XOL.js.map → research-helpers-synthesize-FPBPUTJJ.js.map} +0 -0
  118. /package/dist/{routing-memory-UJ6EC6HP.js.map → routing-memory-X5KJULU7.js.map} +0 -0
  119. /package/dist/{session-memory-J47B6D5W.js.map → session-memory-UX5SU2ZG.js.map} +0 -0
  120. /package/dist/{setup-command-OZLCZC5Q.js.map → setup-command-VWOUSXWP.js.map} +0 -0
  121. /package/dist/{setup-config-FTSQUTS7.js.map → setup-config-IEH3CVR5.js.map} +0 -0
  122. /package/dist/{setup-custom-api-7FACD7AZ.js.map → setup-custom-api-V4K6SQQN.js.map} +0 -0
  123. /package/dist/{tool-memory-HDV46HBY.js.map → tool-memory-IALII4YE.js.map} +0 -0
  124. /package/dist/{unified-registry-OOS6RFJT.js.map → unified-registry-RUA3EHP4.js.map} +0 -0
  125. /package/dist/{weather-report-SMQFSLI4.js.map → weather-report-PBVXX2HU.js.map} +0 -0
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  readOpenAICompatEnv
3
- } from "./chunk-CG5TS6GJ.js";
3
+ } from "./chunk-XOWOOBY7.js";
4
4
  import {
5
5
  resolveInsideRoot
6
6
  } from "./chunk-NUBSJGQZ.js";
@@ -10,10 +10,10 @@ import {
10
10
  import {
11
11
  createAllAdapters,
12
12
  probeCli
13
- } from "./chunk-ZFLZL6JL.js";
13
+ } from "./chunk-45IB3F6G.js";
14
14
  import {
15
15
  DEFAULTS
16
- } from "./chunk-2KOTMA3Y.js";
16
+ } from "./chunk-3FSBTAEC.js";
17
17
  import {
18
18
  getNexusTmpDir
19
19
  } from "./chunk-SNJNRDKZ.js";
@@ -33,7 +33,7 @@ import {
33
33
  ok,
34
34
  symbols,
35
35
  writeLine
36
- } from "./chunk-FBTBH65X.js";
36
+ } from "./chunk-YFY64CCU.js";
37
37
  import {
38
38
  getLearningDir,
39
39
  getOutcomesFile,
@@ -49,7 +49,7 @@ import {
49
49
  } from "./chunk-OQLFRJCW.js";
50
50
 
51
51
  // src/version.ts
52
- var VERSION = true ? "3.4.7" : "dev";
52
+ var VERSION = true ? "3.5.1" : "dev";
53
53
 
54
54
  // src/config/schemas-core.ts
55
55
  import { z } from "zod";
@@ -2287,7 +2287,7 @@ async function runDoctorFix(result) {
2287
2287
  writeLine2("\u2500".repeat(40));
2288
2288
  let fixCount = 0;
2289
2289
  if (!result.dataDirectory.rootExists || result.dataDirectory.subdirectories.some((d) => !d.exists || !d.writable)) {
2290
- const { runSetup } = await import("./setup-command-OZLCZC5Q.js");
2290
+ const { runSetup } = await import("./setup-command-VWOUSXWP.js");
2291
2291
  const setupResult = runSetup({
2292
2292
  skipMcp: true,
2293
2293
  skipRules: true,
@@ -2301,7 +2301,7 @@ async function runDoctorFix(result) {
2301
2301
  }
2302
2302
  }
2303
2303
  if (!result.configFile.found) {
2304
- const { runConfigInitSync } = await import("./setup-config-FTSQUTS7.js");
2304
+ const { runConfigInitSync } = await import("./setup-config-IEH3CVR5.js");
2305
2305
  const configResult = runConfigInitSync(process.cwd(), false, false);
2306
2306
  if (configResult.success && configResult.created) {
2307
2307
  writeLine2(`\u2713 Generated config: ${configResult.path}`);
@@ -2400,4 +2400,4 @@ export {
2400
2400
  startStdioServer,
2401
2401
  closeServer
2402
2402
  };
2403
- //# sourceMappingURL=chunk-J34IF7WA.js.map
2403
+ //# sourceMappingURL=chunk-6ZOZYECZ.js.map
@@ -11,7 +11,7 @@ import {
11
11
  isRateLimitLikeError,
12
12
  lookupInTreeCapability,
13
13
  ok
14
- } from "./chunk-FBTBH65X.js";
14
+ } from "./chunk-YFY64CCU.js";
15
15
 
16
16
  // src/config/model-parameter-support.ts
17
17
  function parseClaudeMajorMinor(bareId) {
@@ -828,4 +828,4 @@ export {
828
828
  DEFAULT_COLLECT_STREAM_MAX_CHUNKS,
829
829
  collectStream
830
830
  };
831
- //# sourceMappingURL=chunk-PHEB64A5.js.map
831
+ //# sourceMappingURL=chunk-7GFMCMLF.js.map
@@ -6,6 +6,7 @@ import { resolve, extname as extname2, relative } from "path";
6
6
  import { readFile } from "fs/promises";
7
7
  import { extname } from "path";
8
8
  import ts from "typescript";
9
+ var SUPPORTED_EXTENSIONS = [".ts", ".tsx", ".js", ".jsx"];
9
10
  function getKind(node) {
10
11
  if (ts.isFunctionDeclaration(node)) return "function";
11
12
  if (ts.isClassDeclaration(node)) return "class";
@@ -86,14 +87,15 @@ function computeSavings(totalChars, symbolChars) {
86
87
  }
87
88
  async function extractSymbols(filePath) {
88
89
  const ext = extname(filePath).toLowerCase();
89
- if (![".ts", ".tsx", ".js", ".jsx"].includes(ext)) {
90
+ if (!SUPPORTED_EXTENSIONS.includes(ext)) {
90
91
  return {
91
92
  filePath,
92
93
  symbols: [],
93
94
  totalLines: 0,
94
95
  totalChars: 0,
95
96
  symbolChars: 0,
96
- savingsPercent: 0
97
+ savingsPercent: 0,
98
+ parsed: false
97
99
  };
98
100
  }
99
101
  const source = await readFile(filePath, "utf-8");
@@ -110,12 +112,17 @@ async function extractSymbols(filePath) {
110
112
  totalLines: source.split("\n").length,
111
113
  totalChars,
112
114
  symbolChars,
113
- savingsPercent: computeSavings(totalChars, symbolChars)
115
+ savingsPercent: computeSavings(totalChars, symbolChars),
116
+ parsed: true
114
117
  };
115
118
  }
116
- async function extractSymbolIndex(filePath) {
119
+ async function extractSymbolIndexResult(filePath) {
117
120
  const result = await extractSymbols(filePath);
118
- if (result.symbols.length === 0) return "";
121
+ if (!result.parsed) return { kind: "empty", reason: "unsupported" };
122
+ if (result.symbols.length === 0) return { kind: "empty", reason: "no-declarations" };
123
+ return { kind: "index", index: renderIndex(filePath, result) };
124
+ }
125
+ function renderIndex(filePath, result) {
119
126
  const lines = result.symbols.map((s) => {
120
127
  const exp = s.exported ? "export " : "";
121
128
  return `${exp}${s.kind} ${s.name} (L${String(s.startLine)}-${String(s.endLine)})`;
@@ -257,11 +264,12 @@ var CodebaseIndex = class {
257
264
  };
258
265
 
259
266
  export {
267
+ SUPPORTED_EXTENSIONS,
260
268
  extractSymbols,
261
- extractSymbolIndex,
269
+ extractSymbolIndexResult,
262
270
  DEFAULT_INDEX_MAX_DEPTH,
263
271
  MAX_INDEX_MAX_DEPTH,
264
272
  findSourceFiles,
265
273
  CodebaseIndex
266
274
  };
267
- //# sourceMappingURL=chunk-YF35FKKD.js.map
275
+ //# sourceMappingURL=chunk-BQTMMLQQ.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 /** Directories not descended into because `maxDepth` was exhausted (#4243). */\n skippedDirs: number;\n}\n\n/** Default recursion depth for `CodebaseIndex.index()` (#4243 — was hardcoded 4). */\nexport const DEFAULT_INDEX_MAX_DEPTH = 24;\n/** Upper clamp for caller-supplied `maxDepth` to bound worst-case tree-walk cost. */\nexport const MAX_INDEX_MAX_DEPTH = 64;\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\n/** Result of a recursive source-file walk: the files found plus a truncation signal. */\nexport interface FindSourceFilesResult {\n files: string[];\n /** Count of directories that were NOT descended into because maxDepth hit 0. */\n skippedDirs: number;\n}\n\n/**\n * Recursively collect TS/JS source files under `dir`, bounded by `maxDepth`,\n * skipping `node_modules`/`dist` and test/declaration files. Exported so the\n * `search_usages` tool (#4265) reuses the exact same source-file set the symbol\n * index walks — keeping the two tools' scopes apples-to-apples (DRY).\n */\nexport async function findSourceFiles(\n dir: string,\n maxDepth: number\n): Promise<FindSourceFilesResult> {\n if (maxDepth <= 0) return { files: [], skippedDirs: 1 };\n const files: string[] = [];\n let skippedDirs = 0;\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 const sub = await findSourceFiles(fullPath, maxDepth - 1);\n files.push(...sub.files);\n skippedDirs += sub.skippedDirs;\n }\n if (entry.isFile() && isSourceFile(entry.name)) {\n files.push(fullPath);\n }\n }\n return { files, skippedDirs };\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 private skippedDirs = 0;\n\n constructor(rootDir: string) {\n this.rootDir = rootDir;\n }\n\n /**\n * Index all TS/JS source files in the directory.\n *\n * `maxDepth` is clamped to `[1, MAX_INDEX_MAX_DEPTH]` so a caller-supplied\n * value can't force an unbounded tree-walk (#4243).\n */\n async index(maxDepth: number = DEFAULT_INDEX_MAX_DEPTH): Promise<IndexStats> {\n const clampedDepth = Math.min(Math.max(maxDepth, 1), MAX_INDEX_MAX_DEPTH);\n const { files, skippedDirs } = await findSourceFiles(this.rootDir, clampedDepth);\n this.skippedDirs = skippedDirs;\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 skippedDirs,\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; skippedDirs: number } {\n return {\n files: this.fileResults.size,\n symbols: this.symbols.length,\n skippedDirs: this.skippedDirs,\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/**\n * Extensions the TypeScript compiler API path can parse (#4517).\n *\n * Exported so the tool layer can name them in its error message instead of\n * asserting a file \"may not be TypeScript/JavaScript\" without saying what\n * would count.\n */\nexport const SUPPORTED_EXTENSIONS: readonly string[] = ['.ts', '.tsx', '.js', '.jsx'];\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 * Whether the file was actually parsed (#4517).\n *\n * `false` means the extension is not supported, so `symbols: []` reports\n * that nothing was READ — not that nothing is there. An unsupported file and\n * a genuinely symbol-free file previously returned identical results, and\n * the tool guessed between them wrongly: a valid TypeScript barrel of 20\n * re-exports was reported as possibly-not-TypeScript.\n */\n parsed: boolean;\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 (!SUPPORTED_EXTENSIONS.includes(ext)) {\n return {\n filePath,\n symbols: [],\n totalLines: 0,\n totalChars: 0,\n symbolChars: 0,\n savingsPercent: 0,\n parsed: false,\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 parsed: true,\n };\n}\n\n/**\n * Why {@link extractSymbolIndex} produced no index (#4517).\n *\n * `unsupported` and `no-declarations` are different facts about the world:\n * the first says the file was never read, the second says it was read and\n * genuinely declares nothing locally — a re-export barrel, typically. Callers\n * that collapse them tell the user to check a file type that was never the\n * problem.\n */\nexport type EmptyIndexReason = 'unsupported' | 'no-declarations';\n\n/** A symbol index, or the reason there is none. */\nexport type SymbolIndexResult =\n | { readonly kind: 'index'; readonly index: string }\n | { readonly kind: 'empty'; readonly reason: EmptyIndexReason };\n\n/**\n * Extract a compact symbol index, reporting why when there is nothing to show.\n *\n * Names + locations only, no source text — the minimal representation for LLM\n * context (~95%+ token savings). Replaced the earlier `extractSymbolIndex`,\n * which returned a bare `''` for both \"could not read\" and \"read, found\n * nothing\" and so could not tell a caller which had happened.\n */\nexport async function extractSymbolIndexResult(filePath: string): Promise<SymbolIndexResult> {\n const result = await extractSymbols(filePath);\n if (!result.parsed) return { kind: 'empty', reason: 'unsupported' };\n if (result.symbols.length === 0) return { kind: 'empty', reason: 'no-declarations' };\n return { kind: 'index', index: renderIndex(filePath, result) };\n}\n\nfunction renderIndex(filePath: string, result: SymbolExtractionResult): string {\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 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
  GitHubProvider,
3
3
  ScmError
4
- } from "./chunk-KJ2M2L6J.js";
4
+ } from "./chunk-U76AVHIW.js";
5
5
  import {
6
6
  resolveToken
7
- } from "./chunk-6DDKUQFD.js";
7
+ } from "./chunk-TPKK4ANS.js";
8
8
  import {
9
9
  err,
10
10
  ok
11
- } from "./chunk-FBTBH65X.js";
11
+ } from "./chunk-YFY64CCU.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-GMJGQ2XO.js.map
44
+ //# sourceMappingURL=chunk-C25JA3SI.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  runConfigInitSync
3
- } from "./chunk-FTH6XZFA.js";
3
+ } from "./chunk-QDUZSOOU.js";
4
4
  import {
5
5
  VERSION,
6
6
  checkApiKeys,
@@ -8,13 +8,13 @@ import {
8
8
  checkSqlite,
9
9
  defaultConfig,
10
10
  initDataDirectories
11
- } from "./chunk-J34IF7WA.js";
11
+ } from "./chunk-6ZOZYECZ.js";
12
12
  import {
13
13
  BUILT_IN_EXPERTS
14
14
  } from "./chunk-YPNQPT2F.js";
15
15
  import {
16
16
  probeAllClis
17
- } from "./chunk-ZFLZL6JL.js";
17
+ } from "./chunk-45IB3F6G.js";
18
18
  import {
19
19
  CLI_SUBPROCESS_TIMEOUTS,
20
20
  colors,
@@ -25,7 +25,7 @@ import {
25
25
  getErrorMessage,
26
26
  getTimeProvider,
27
27
  symbols
28
- } from "./chunk-FBTBH65X.js";
28
+ } from "./chunk-YFY64CCU.js";
29
29
  import {
30
30
  ensureGitignored,
31
31
  findRepoRoot
@@ -2001,4 +2001,4 @@ export {
2001
2001
  setupCommand,
2002
2002
  setupCommandAsync
2003
2003
  };
2004
- //# sourceMappingURL=chunk-WEQNCK5F.js.map
2004
+ //# sourceMappingURL=chunk-CQ4Y7ULT.js.map
@@ -8,7 +8,7 @@ import {
8
8
  getTimeProvider,
9
9
  isRateLimitText,
10
10
  ok
11
- } from "./chunk-FBTBH65X.js";
11
+ } from "./chunk-YFY64CCU.js";
12
12
 
13
13
  // src/cli-adapters/circuit-breaker-types.ts
14
14
  var CircuitErrorCode = {
@@ -540,4 +540,4 @@ export {
540
540
  CliCircuitBreakerIntegration,
541
541
  createCliCircuitBreakerIntegration
542
542
  };
543
- //# sourceMappingURL=chunk-7BBHGO7A.js.map
543
+ //# sourceMappingURL=chunk-D3KHLA3D.js.map
@@ -1,19 +1,19 @@
1
1
  import {
2
2
  resolveToken
3
- } from "./chunk-6DDKUQFD.js";
3
+ } from "./chunk-TPKK4ANS.js";
4
4
  import {
5
5
  REGISTRY_PATH,
6
6
  getProjectRoot,
7
7
  loadPapersRegistry,
8
8
  loadTechniquesRegistry,
9
9
  savePapersRegistry
10
- } from "./chunk-YO2OXOPU.js";
10
+ } from "./chunk-QDH2SQKE.js";
11
11
  import {
12
12
  resolveInsideRoot
13
13
  } from "./chunk-NUBSJGQZ.js";
14
14
  import {
15
15
  getToolMemory
16
- } from "./chunk-RSUQCA2E.js";
16
+ } from "./chunk-ROIGF7ZF.js";
17
17
  import {
18
18
  capitalizeWords,
19
19
  truncateSentence
@@ -38,7 +38,7 @@ import {
38
38
  getTimeProvider,
39
39
  ok,
40
40
  registerPersistentDistillerFactory
41
- } from "./chunk-FBTBH65X.js";
41
+ } from "./chunk-YFY64CCU.js";
42
42
  import {
43
43
  ensureLearningDir,
44
44
  getRulesFile
@@ -4090,4 +4090,4 @@ export {
4090
4090
  DEFAULT_CONTEXT_BUDGET_TOKENS,
4091
4091
  getContextPromptPrefix
4092
4092
  };
4093
- //# sourceMappingURL=chunk-RGAC3SAM.js.map
4093
+ //# sourceMappingURL=chunk-EKASN4MV.js.map
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  resolveCliSlot
3
- } from "./chunk-SC7OLO76.js";
3
+ } from "./chunk-LMGXSMC6.js";
4
4
  import {
5
5
  createLogger,
6
6
  getTimeProvider,
7
7
  isRateLimitText
8
- } from "./chunk-FBTBH65X.js";
8
+ } from "./chunk-YFY64CCU.js";
9
9
 
10
10
  // src/pipeline/expert-bridge.ts
11
11
  function resolveCliFromModelString(model) {
@@ -21,7 +21,7 @@ async function getMcpConfigPath() {
21
21
  if (cachedMcpConfigPath !== null) return cachedMcpConfigPath;
22
22
  mcpConfigInitPromise ??= (async () => {
23
23
  try {
24
- const { generateMcpConfig } = await import("./child-mcp-config-RPGCCPR7.js");
24
+ const { generateMcpConfig } = await import("./child-mcp-config-VVTPONKP.js");
25
25
  const config = await generateMcpConfig();
26
26
  cachedMcpConfigPath = config.configPath;
27
27
  cachedMcpConfigCleanup = config.cleanup;
@@ -93,8 +93,8 @@ var routerInitPromise = null;
93
93
  async function getRouter() {
94
94
  if (cachedRouter !== null) return cachedRouter;
95
95
  routerInitPromise ??= (async () => {
96
- const { createAllAdapters } = await import("./factory-ASP7H2N6.js");
97
- const { createCompositeRouter } = await import("./composite-router-D36RXDEN.js");
96
+ const { createAllAdapters } = await import("./factory-L74ZN3ZO.js");
97
+ const { createCompositeRouter } = await import("./composite-router-7ZQW5X6M.js");
98
98
  const adapters = createAllAdapters();
99
99
  if (adapters.size === 0) {
100
100
  routerInitPromise = null;
@@ -102,7 +102,7 @@ async function getRouter() {
102
102
  }
103
103
  cachedRouter = adaptCompositeRouter(createCompositeRouter(adapters));
104
104
  try {
105
- const { createCliCircuitBreakerIntegration } = await import("./cli-circuit-breaker-PETQMWAX.js");
105
+ const { createCliCircuitBreakerIntegration } = await import("./cli-circuit-breaker-BKCDXF7A.js");
106
106
  cachedCircuitBreaker = createCliCircuitBreakerIntegration([...adapters.values()]);
107
107
  } catch (error) {
108
108
  const msg = error instanceof Error ? error.message : String(error);
@@ -213,4 +213,4 @@ export {
213
213
  tokenSplitFromUsage,
214
214
  executeExpert
215
215
  };
216
- //# sourceMappingURL=chunk-JHIKOTSP.js.map
216
+ //# sourceMappingURL=chunk-GVLDWGSK.js.map
@@ -9,11 +9,11 @@ import {
9
9
  gateWithReputation,
10
10
  resolveReputationGatingMode,
11
11
  sanitizeInput
12
- } from "./chunk-Z53SVS5A.js";
12
+ } from "./chunk-KBVU2GGV.js";
13
13
  import {
14
14
  createLogger,
15
15
  getTimeProvider
16
- } from "./chunk-FBTBH65X.js";
16
+ } from "./chunk-YFY64CCU.js";
17
17
 
18
18
  // src/dogfooding/pr-reviewer-helpers.ts
19
19
  import { randomUUID } from "crypto";
@@ -288,4 +288,4 @@ export {
288
288
  formatReviewComment,
289
289
  createFailedReview
290
290
  };
291
- //# sourceMappingURL=chunk-5542NZXG.js.map
291
+ //# sourceMappingURL=chunk-GWLBIDS6.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  emitClawGuardViolation
3
- } from "./chunk-W4GN7VPG.js";
3
+ } from "./chunk-L4J7AXP3.js";
4
4
  import {
5
5
  CACHE_TIMEOUTS,
6
6
  MCP_TIMEOUTS,
@@ -16,7 +16,7 @@ import {
16
16
  getTimeProvider,
17
17
  ok,
18
18
  resolveToolClassGuardMs
19
- } from "./chunk-FBTBH65X.js";
19
+ } from "./chunk-YFY64CCU.js";
20
20
  import {
21
21
  getNexusDataDir
22
22
  } from "./chunk-OQLFRJCW.js";
@@ -2028,4 +2028,4 @@ export {
2028
2028
  VOTING_THRESHOLDS,
2029
2029
  ConsensusMetricsSchema
2030
2030
  };
2031
- //# sourceMappingURL=chunk-UOG5ANHL.js.map
2031
+ //# sourceMappingURL=chunk-HKX7HKDV.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getDefaultRegistry
3
- } from "./chunk-FBTBH65X.js";
3
+ } from "./chunk-YFY64CCU.js";
4
4
  import {
5
5
  getNexusDataDir
6
6
  } from "./chunk-OQLFRJCW.js";
@@ -124,4 +124,4 @@ export {
124
124
  loadUsageEvents,
125
125
  rollupByModel
126
126
  };
127
- //# sourceMappingURL=chunk-TU25EPBM.js.map
127
+ //# sourceMappingURL=chunk-HPAYIX7E.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  GitHubProvider,
3
3
  ScmError
4
- } from "./chunk-KJ2M2L6J.js";
4
+ } from "./chunk-U76AVHIW.js";
5
5
  import {
6
6
  ROLE_DEFAULT_TRUST,
7
7
  ReputationCache,
@@ -11,17 +11,17 @@ import {
11
11
  gateWithReputation,
12
12
  resolveReputationGatingMode,
13
13
  sanitizeInput
14
- } from "./chunk-Z53SVS5A.js";
14
+ } from "./chunk-KBVU2GGV.js";
15
15
  import {
16
16
  emitPolicyEvent
17
- } from "./chunk-W4GN7VPG.js";
17
+ } from "./chunk-L4J7AXP3.js";
18
18
  import {
19
19
  CLI_SUBPROCESS_TIMEOUTS,
20
20
  createLogger,
21
21
  err,
22
22
  getTimeProvider,
23
23
  ok
24
- } from "./chunk-FBTBH65X.js";
24
+ } from "./chunk-YFY64CCU.js";
25
25
 
26
26
  // src/security/trust-classifier.ts
27
27
  function mapAuthorAssociation(association) {
@@ -1219,4 +1219,4 @@ export {
1219
1219
  IssueTriage,
1220
1220
  createIssueTriage
1221
1221
  };
1222
- //# sourceMappingURL=chunk-OR2CJF3R.js.map
1222
+ //# sourceMappingURL=chunk-IK45M7J3.js.map
@@ -2,7 +2,7 @@ import {
2
2
  CACHE_TIMEOUTS,
3
3
  createLogger,
4
4
  getTimeProvider
5
- } from "./chunk-FBTBH65X.js";
5
+ } from "./chunk-YFY64CCU.js";
6
6
 
7
7
  // src/security/trust-types.ts
8
8
  import { z } from "zod";
@@ -560,4 +560,4 @@ export {
560
560
  resolveReputationGatingMode,
561
561
  gateWithReputation
562
562
  };
563
- //# sourceMappingURL=chunk-Z53SVS5A.js.map
563
+ //# sourceMappingURL=chunk-KBVU2GGV.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getTimeProvider
3
- } from "./chunk-FBTBH65X.js";
3
+ } from "./chunk-YFY64CCU.js";
4
4
 
5
5
  // src/security/audit-trail.ts
6
6
  var MAX_EVENTS = 1e4;
@@ -205,4 +205,4 @@ export {
205
205
  createGraphAuditBridge,
206
206
  createAuditTrail
207
207
  };
208
- //# sourceMappingURL=chunk-W4GN7VPG.js.map
208
+ //# sourceMappingURL=chunk-L4J7AXP3.js.map
@@ -3,7 +3,7 @@ import {
3
3
  MODEL_IDS,
4
4
  getTimeProvider,
5
5
  resolveModelIdentitySync
6
- } from "./chunk-FBTBH65X.js";
6
+ } from "./chunk-YFY64CCU.js";
7
7
 
8
8
  // src/config/model-availability.ts
9
9
  var DEFAULT_TTL_MS = 6e4;
@@ -150,4 +150,4 @@ export {
150
150
  resetAvailabilityCache,
151
151
  filterAvailableModels
152
152
  };
153
- //# sourceMappingURL=chunk-SC7OLO76.js.map
153
+ //# sourceMappingURL=chunk-LMGXSMC6.js.map
@@ -8,7 +8,7 @@ import {
8
8
  getErrorMessage,
9
9
  ok,
10
10
  parseBoolEnv
11
- } from "./chunk-FBTBH65X.js";
11
+ } from "./chunk-YFY64CCU.js";
12
12
 
13
13
  // src/cli/research-helpers-io.ts
14
14
  import * as fs2 from "fs/promises";
@@ -146,4 +146,4 @@ export {
146
146
  loadPapersRegistry,
147
147
  savePapersRegistry
148
148
  };
149
- //# sourceMappingURL=chunk-YO2OXOPU.js.map
149
+ //# sourceMappingURL=chunk-QDH2SQKE.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getErrorMessage
3
- } from "./chunk-FBTBH65X.js";
3
+ } from "./chunk-YFY64CCU.js";
4
4
 
5
5
  // src/cli/setup-config.ts
6
6
  import { copyFileSync, existsSync, mkdirSync, writeFileSync } from "fs";
@@ -77,4 +77,4 @@ function ensureBackup(outputPath) {
77
77
  export {
78
78
  runConfigInitSync
79
79
  };
80
- //# sourceMappingURL=chunk-FTH6XZFA.js.map
80
+ //# sourceMappingURL=chunk-QDUZSOOU.js.map
@@ -5,7 +5,7 @@ import {
5
5
  } from "./chunk-6T3EPABN.js";
6
6
  import {
7
7
  SessionMemory
8
- } from "./chunk-DXORNOYR.js";
8
+ } from "./chunk-Z5HKO4TN.js";
9
9
  import {
10
10
  StatsOnlyAdapter,
11
11
  ensureSharedMemoryRegistry
@@ -15,7 +15,7 @@ import {
15
15
  } from "./chunk-KSQSWEFH.js";
16
16
  import {
17
17
  generateId
18
- } from "./chunk-UAPIH3ZX.js";
18
+ } from "./chunk-5MRYWJVK.js";
19
19
  import {
20
20
  ErrorCode,
21
21
  NexusError,
@@ -28,7 +28,7 @@ import {
28
28
  getTimeProvider,
29
29
  ok,
30
30
  setSharedMobiMemDbPathResolver
31
- } from "./chunk-FBTBH65X.js";
31
+ } from "./chunk-YFY64CCU.js";
32
32
  import {
33
33
  nexusDataPath
34
34
  } from "./chunk-OQLFRJCW.js";
@@ -5552,4 +5552,4 @@ export {
5552
5552
  reinitializeMemoryBackends,
5553
5553
  ToolMemoryManager
5554
5554
  };
5555
- //# sourceMappingURL=chunk-RSUQCA2E.js.map
5555
+ //# sourceMappingURL=chunk-ROIGF7ZF.js.map
@@ -2,7 +2,7 @@ import {
2
2
  createLogger,
3
3
  err,
4
4
  ok
5
- } from "./chunk-FBTBH65X.js";
5
+ } from "./chunk-YFY64CCU.js";
6
6
 
7
7
  // src/scm/token-resolver.ts
8
8
  import { execFile } from "child_process";
@@ -87,4 +87,4 @@ export {
87
87
  hasToken,
88
88
  getTokenEnvVars
89
89
  };
90
- //# sourceMappingURL=chunk-6DDKUQFD.js.map
90
+ //# sourceMappingURL=chunk-TPKK4ANS.js.map
@@ -4,7 +4,7 @@ import {
4
4
  err,
5
5
  getErrorMessage,
6
6
  ok
7
- } from "./chunk-FBTBH65X.js";
7
+ } from "./chunk-YFY64CCU.js";
8
8
 
9
9
  // src/scm/types.ts
10
10
  var ScmError = class extends Error {
@@ -263,4 +263,4 @@ export {
263
263
  ScmError,
264
264
  GitHubProvider
265
265
  };
266
- //# sourceMappingURL=chunk-KJ2M2L6J.js.map
266
+ //# sourceMappingURL=chunk-U76AVHIW.js.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  createAutoAdapter
3
- } from "./chunk-ZFLZL6JL.js";
3
+ } from "./chunk-45IB3F6G.js";
4
4
  import {
5
5
  mapModelErrorToCategory
6
- } from "./chunk-7BBHGO7A.js";
6
+ } from "./chunk-D3KHLA3D.js";
7
7
  import {
8
8
  CLI_NAMES,
9
9
  CircularBuffer,
@@ -21,7 +21,7 @@ import {
21
21
  ok,
22
22
  recordRateLimitEvent,
23
23
  toRateLimitError
24
- } from "./chunk-FBTBH65X.js";
24
+ } from "./chunk-YFY64CCU.js";
25
25
 
26
26
  // src/agents/collaboration/event-bus-helpers.ts
27
27
  import { randomUUID } from "crypto";
@@ -833,4 +833,4 @@ export {
833
833
  getGlobalRegistry,
834
834
  resetGlobalRegistry
835
835
  };
836
- //# sourceMappingURL=chunk-H5BWZMLU.js.map
836
+ //# sourceMappingURL=chunk-UFJDYK22.js.map
@@ -7,7 +7,7 @@ import {
7
7
  toolStructuredError,
8
8
  toolSuccessStructured,
9
9
  wrapToolWithTimeout
10
- } from "./chunk-UOG5ANHL.js";
10
+ } from "./chunk-HKX7HKDV.js";
11
11
  import {
12
12
  JsonlStore,
13
13
  SECURITY_KEYWORDS,
@@ -19,7 +19,7 @@ import {
19
19
  getPipelineEventBus,
20
20
  getTimeProvider,
21
21
  isDeclaredNeverDeprecate
22
- } from "./chunk-FBTBH65X.js";
22
+ } from "./chunk-YFY64CCU.js";
23
23
  import {
24
24
  getNexusDataDir,
25
25
  nexusDataPath
@@ -2132,4 +2132,4 @@ export {
2132
2132
  runImprovementReview,
2133
2133
  registerImprovementReviewTool
2134
2134
  };
2135
- //# sourceMappingURL=chunk-SC522IDR.js.map
2135
+ //# sourceMappingURL=chunk-UKIFG26L.js.map
@@ -3,7 +3,7 @@ import {
3
3
  createLogger,
4
4
  err,
5
5
  ok
6
- } from "./chunk-FBTBH65X.js";
6
+ } from "./chunk-YFY64CCU.js";
7
7
 
8
8
  // src/adapters/sdk/types.ts
9
9
  var PROVIDER_ENV_KEYS = {
@@ -169,4 +169,4 @@ export {
169
169
  validateCustomApiBaseUrl,
170
170
  assertCustomApiHostResolvesPublic
171
171
  };
172
- //# sourceMappingURL=chunk-XND2FD6I.js.map
172
+ //# sourceMappingURL=chunk-UOA23X5A.js.map