nexus-agents 2.167.1 → 2.169.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.
Files changed (131) hide show
  1. package/README.md +1 -1
  2. package/dist/{child-mcp-config-X4YLQKGK.js → child-mcp-config-FJRGAMUU.js} +2 -2
  3. package/dist/{chunk-UNIDAVVR.js → chunk-3JH3FMEJ.js} +2 -2
  4. package/dist/{chunk-6KCZA3IO.js → chunk-3ON2P4WL.js} +4 -4
  5. package/dist/{chunk-GRWHPG72.js → chunk-4G5W5EPU.js} +7 -7
  6. package/dist/{chunk-O6VL6LA4.js → chunk-5O4JRXNQ.js} +2 -2
  7. package/dist/{chunk-7K5LSUEU.js → chunk-7S43YASS.js} +3 -3
  8. package/dist/{chunk-QV52AXTF.js → chunk-BWG54OJS.js} +2 -2
  9. package/dist/{chunk-XUMLVCFL.js → chunk-CD2NZFAI.js} +2 -2
  10. package/dist/{chunk-7YD3TRDX.js → chunk-CHF63T3L.js} +4 -4
  11. package/dist/{chunk-GVNY4ZB6.js → chunk-DSMSYENI.js} +2 -2
  12. package/dist/{chunk-ZIC6ZZFU.js → chunk-EQRN5FRZ.js} +3 -3
  13. package/dist/{chunk-TGAVZ2ZL.js → chunk-F6HJJG3E.js} +8 -8
  14. package/dist/{chunk-PC4Y4VPX.js → chunk-HAVBBSYN.js} +2 -2
  15. package/dist/{chunk-VNVGGM73.js → chunk-HNNSCTOI.js} +2 -2
  16. package/dist/{chunk-STMW5BSR.js → chunk-IQC2K3KY.js} +3 -3
  17. package/dist/{chunk-2NU774CB.js → chunk-JCJHQSAY.js} +2 -2
  18. package/dist/{chunk-IFSIKGHI.js → chunk-MCT7JJF6.js} +2 -2
  19. package/dist/{chunk-2S7T66IQ.js → chunk-N7FIUFQL.js} +811 -598
  20. package/dist/chunk-N7FIUFQL.js.map +1 -0
  21. package/dist/{chunk-S6HCREYY.js → chunk-NT3KCLT6.js} +7 -7
  22. package/dist/{chunk-7USEQLMS.js → chunk-OOFPDA3B.js} +2 -2
  23. package/dist/{chunk-GGYQTV2Y.js → chunk-P7MYTCE6.js} +4 -4
  24. package/dist/{chunk-COIZLMGV.js → chunk-PZF67XDY.js} +3 -3
  25. package/dist/{chunk-KM3YEIEN.js → chunk-Q3UMNYV2.js} +4 -4
  26. package/dist/{chunk-CURHM4TH.js → chunk-QXSR5KPG.js} +25 -4
  27. package/dist/chunk-QXSR5KPG.js.map +1 -0
  28. package/dist/{chunk-RKIPSMCN.js → chunk-R46SBPLH.js} +5 -5
  29. package/dist/{chunk-BB7KSLNA.js → chunk-RO23OT47.js} +2 -2
  30. package/dist/{chunk-EUQNHT7O.js → chunk-ROCNXZBC.js} +12 -8
  31. package/dist/chunk-ROCNXZBC.js.map +1 -0
  32. package/dist/{chunk-SRNAXDOT.js → chunk-SX4E2W3Z.js} +2 -2
  33. package/dist/{chunk-ZTTUXPBQ.js → chunk-T3VD32JY.js} +2 -2
  34. package/dist/{chunk-ZAPCPHGZ.js → chunk-TB26XNJH.js} +2 -2
  35. package/dist/{chunk-QPSYBHK6.js → chunk-W76DOL27.js} +2 -2
  36. package/dist/{chunk-3T6KLPGT.js → chunk-WB33EPTV.js} +5 -5
  37. package/dist/{chunk-ZSUN7BHE.js → chunk-XGNB7LQB.js} +696 -14
  38. package/dist/chunk-XGNB7LQB.js.map +1 -0
  39. package/dist/{chunk-AO4X3BMP.js → chunk-YF35FKKD.js} +2 -1
  40. package/dist/chunk-YF35FKKD.js.map +1 -0
  41. package/dist/{chunk-JKUX73VD.js → chunk-ZXFIBDT3.js} +3 -3
  42. package/dist/{cli-circuit-breaker-2AAHSCHR.js → cli-circuit-breaker-FJQXDC5M.js} +4 -4
  43. package/dist/cli.js +394 -893
  44. package/dist/cli.js.map +1 -1
  45. package/dist/codebase-search-LUF5YJLQ.js +14 -0
  46. package/dist/{composite-router-WOVGICBS.js → composite-router-UQTCPADM.js} +2 -2
  47. package/dist/{consensus-vote-322S65GQ.js → consensus-vote-FEDF24T5.js} +15 -15
  48. package/dist/{context-retriever-YMJY6YBJ.js → context-retriever-TIJGFLGO.js} +8 -8
  49. package/dist/{doctor-deep-DALT3OXC.js → doctor-deep-EULAHWTK.js} +3 -3
  50. package/dist/{expert-bridge-WNV3ST2T.js → expert-bridge-7HQ54XYU.js} +4 -4
  51. package/dist/{factory-33HQYVCK.js → factory-QZZQVDGQ.js} +8 -8
  52. package/dist/{factory-TLSTFONW.js → factory-RW2ROEDS.js} +5 -5
  53. package/dist/{improvement-review-2W6LKP74.js → improvement-review-DGQPADKS.js} +5 -5
  54. package/dist/index.d.ts +40 -1
  55. package/dist/index.js +35 -31
  56. package/dist/index.js.map +1 -1
  57. package/dist/{init-opencode-XVTVJ6FN.js → init-opencode-MK2NUEWH.js} +5 -5
  58. package/dist/{issue-triage-CVMVZ3IV.js → issue-triage-RVDZEM53.js} +6 -6
  59. package/dist/{pr-reviewer-helpers-SAMOVLNJ.js → pr-reviewer-helpers-TKXJBDT6.js} +4 -4
  60. package/dist/{registry-command-5D2DJT53.js → registry-command-VXXKVZ3H.js} +2 -2
  61. package/dist/{repo-security-plan-F7V5SHAQ.js → repo-security-plan-YCTKRAGA.js} +3 -3
  62. package/dist/{research-helpers-synthesize-F4PV4B4B.js → research-helpers-synthesize-4L6SXYQU.js} +4 -4
  63. package/dist/{routing-memory-G6YBK4WI.js → routing-memory-INY5DC2P.js} +2 -2
  64. package/dist/{session-memory-DAJHLPOY.js → session-memory-TQMLN67N.js} +3 -3
  65. package/dist/{setup-command-NUNIRAFN.js → setup-command-FT5LBTSR.js} +13 -13
  66. package/dist/{setup-config-HKUWFV5N.js → setup-config-U3WLC5OO.js} +3 -3
  67. package/dist/{setup-custom-api-XRUPWEPF.js → setup-custom-api-2E4MZ5MF.js} +3 -3
  68. package/dist/{tool-memory-XJ5VRMNQ.js → tool-memory-IV5BVIV4.js} +5 -5
  69. package/dist/{unified-registry-ETKPTZBU.js → unified-registry-6LFTI4MG.js} +9 -9
  70. package/dist/{weather-report-TWBLIHPZ.js → weather-report-7NZ6D4C7.js} +2 -2
  71. package/package.json +2 -1
  72. package/dist/chunk-2S7T66IQ.js.map +0 -1
  73. package/dist/chunk-AO4X3BMP.js.map +0 -1
  74. package/dist/chunk-CURHM4TH.js.map +0 -1
  75. package/dist/chunk-EUQNHT7O.js.map +0 -1
  76. package/dist/chunk-ZSUN7BHE.js.map +0 -1
  77. package/dist/codebase-search-DKLEA4PR.js +0 -12
  78. /package/dist/{child-mcp-config-X4YLQKGK.js.map → child-mcp-config-FJRGAMUU.js.map} +0 -0
  79. /package/dist/{chunk-UNIDAVVR.js.map → chunk-3JH3FMEJ.js.map} +0 -0
  80. /package/dist/{chunk-6KCZA3IO.js.map → chunk-3ON2P4WL.js.map} +0 -0
  81. /package/dist/{chunk-GRWHPG72.js.map → chunk-4G5W5EPU.js.map} +0 -0
  82. /package/dist/{chunk-O6VL6LA4.js.map → chunk-5O4JRXNQ.js.map} +0 -0
  83. /package/dist/{chunk-7K5LSUEU.js.map → chunk-7S43YASS.js.map} +0 -0
  84. /package/dist/{chunk-QV52AXTF.js.map → chunk-BWG54OJS.js.map} +0 -0
  85. /package/dist/{chunk-XUMLVCFL.js.map → chunk-CD2NZFAI.js.map} +0 -0
  86. /package/dist/{chunk-7YD3TRDX.js.map → chunk-CHF63T3L.js.map} +0 -0
  87. /package/dist/{chunk-GVNY4ZB6.js.map → chunk-DSMSYENI.js.map} +0 -0
  88. /package/dist/{chunk-ZIC6ZZFU.js.map → chunk-EQRN5FRZ.js.map} +0 -0
  89. /package/dist/{chunk-TGAVZ2ZL.js.map → chunk-F6HJJG3E.js.map} +0 -0
  90. /package/dist/{chunk-PC4Y4VPX.js.map → chunk-HAVBBSYN.js.map} +0 -0
  91. /package/dist/{chunk-VNVGGM73.js.map → chunk-HNNSCTOI.js.map} +0 -0
  92. /package/dist/{chunk-STMW5BSR.js.map → chunk-IQC2K3KY.js.map} +0 -0
  93. /package/dist/{chunk-2NU774CB.js.map → chunk-JCJHQSAY.js.map} +0 -0
  94. /package/dist/{chunk-IFSIKGHI.js.map → chunk-MCT7JJF6.js.map} +0 -0
  95. /package/dist/{chunk-S6HCREYY.js.map → chunk-NT3KCLT6.js.map} +0 -0
  96. /package/dist/{chunk-7USEQLMS.js.map → chunk-OOFPDA3B.js.map} +0 -0
  97. /package/dist/{chunk-GGYQTV2Y.js.map → chunk-P7MYTCE6.js.map} +0 -0
  98. /package/dist/{chunk-COIZLMGV.js.map → chunk-PZF67XDY.js.map} +0 -0
  99. /package/dist/{chunk-KM3YEIEN.js.map → chunk-Q3UMNYV2.js.map} +0 -0
  100. /package/dist/{chunk-RKIPSMCN.js.map → chunk-R46SBPLH.js.map} +0 -0
  101. /package/dist/{chunk-BB7KSLNA.js.map → chunk-RO23OT47.js.map} +0 -0
  102. /package/dist/{chunk-SRNAXDOT.js.map → chunk-SX4E2W3Z.js.map} +0 -0
  103. /package/dist/{chunk-ZTTUXPBQ.js.map → chunk-T3VD32JY.js.map} +0 -0
  104. /package/dist/{chunk-ZAPCPHGZ.js.map → chunk-TB26XNJH.js.map} +0 -0
  105. /package/dist/{chunk-QPSYBHK6.js.map → chunk-W76DOL27.js.map} +0 -0
  106. /package/dist/{chunk-3T6KLPGT.js.map → chunk-WB33EPTV.js.map} +0 -0
  107. /package/dist/{chunk-JKUX73VD.js.map → chunk-ZXFIBDT3.js.map} +0 -0
  108. /package/dist/{cli-circuit-breaker-2AAHSCHR.js.map → cli-circuit-breaker-FJQXDC5M.js.map} +0 -0
  109. /package/dist/{codebase-search-DKLEA4PR.js.map → codebase-search-LUF5YJLQ.js.map} +0 -0
  110. /package/dist/{composite-router-WOVGICBS.js.map → composite-router-UQTCPADM.js.map} +0 -0
  111. /package/dist/{consensus-vote-322S65GQ.js.map → consensus-vote-FEDF24T5.js.map} +0 -0
  112. /package/dist/{context-retriever-YMJY6YBJ.js.map → context-retriever-TIJGFLGO.js.map} +0 -0
  113. /package/dist/{doctor-deep-DALT3OXC.js.map → doctor-deep-EULAHWTK.js.map} +0 -0
  114. /package/dist/{expert-bridge-WNV3ST2T.js.map → expert-bridge-7HQ54XYU.js.map} +0 -0
  115. /package/dist/{factory-33HQYVCK.js.map → factory-QZZQVDGQ.js.map} +0 -0
  116. /package/dist/{factory-TLSTFONW.js.map → factory-RW2ROEDS.js.map} +0 -0
  117. /package/dist/{improvement-review-2W6LKP74.js.map → improvement-review-DGQPADKS.js.map} +0 -0
  118. /package/dist/{init-opencode-XVTVJ6FN.js.map → init-opencode-MK2NUEWH.js.map} +0 -0
  119. /package/dist/{issue-triage-CVMVZ3IV.js.map → issue-triage-RVDZEM53.js.map} +0 -0
  120. /package/dist/{pr-reviewer-helpers-SAMOVLNJ.js.map → pr-reviewer-helpers-TKXJBDT6.js.map} +0 -0
  121. /package/dist/{registry-command-5D2DJT53.js.map → registry-command-VXXKVZ3H.js.map} +0 -0
  122. /package/dist/{repo-security-plan-F7V5SHAQ.js.map → repo-security-plan-YCTKRAGA.js.map} +0 -0
  123. /package/dist/{research-helpers-synthesize-F4PV4B4B.js.map → research-helpers-synthesize-4L6SXYQU.js.map} +0 -0
  124. /package/dist/{routing-memory-G6YBK4WI.js.map → routing-memory-INY5DC2P.js.map} +0 -0
  125. /package/dist/{session-memory-DAJHLPOY.js.map → session-memory-TQMLN67N.js.map} +0 -0
  126. /package/dist/{setup-command-NUNIRAFN.js.map → setup-command-FT5LBTSR.js.map} +0 -0
  127. /package/dist/{setup-config-HKUWFV5N.js.map → setup-config-U3WLC5OO.js.map} +0 -0
  128. /package/dist/{setup-custom-api-XRUPWEPF.js.map → setup-custom-api-2E4MZ5MF.js.map} +0 -0
  129. /package/dist/{tool-memory-XJ5VRMNQ.js.map → tool-memory-IV5BVIV4.js.map} +0 -0
  130. /package/dist/{unified-registry-ETKPTZBU.js.map → unified-registry-6LFTI4MG.js.map} +0 -0
  131. /package/dist/{weather-report-TWBLIHPZ.js.map → weather-report-7NZ6D4C7.js.map} +0 -0
@@ -261,6 +261,7 @@ export {
261
261
  extractSymbolIndex,
262
262
  DEFAULT_INDEX_MAX_DEPTH,
263
263
  MAX_INDEX_MAX_DEPTH,
264
+ findSourceFiles,
264
265
  CodebaseIndex
265
266
  };
266
- //# sourceMappingURL=chunk-AO4X3BMP.js.map
267
+ //# sourceMappingURL=chunk-YF35FKKD.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/** 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"]}
@@ -9,11 +9,11 @@ import {
9
9
  gateWithReputation,
10
10
  resolveReputationGatingMode,
11
11
  sanitizeInput
12
- } from "./chunk-SRNAXDOT.js";
12
+ } from "./chunk-SX4E2W3Z.js";
13
13
  import {
14
14
  createLogger,
15
15
  getTimeProvider
16
- } from "./chunk-CURHM4TH.js";
16
+ } from "./chunk-QXSR5KPG.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-JKUX73VD.js.map
291
+ //# sourceMappingURL=chunk-ZXFIBDT3.js.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  CliCircuitBreakerIntegration,
3
3
  createCliCircuitBreakerIntegration
4
- } from "./chunk-COIZLMGV.js";
5
- import "./chunk-GVNY4ZB6.js";
6
- import "./chunk-CURHM4TH.js";
4
+ } from "./chunk-PZF67XDY.js";
5
+ import "./chunk-DSMSYENI.js";
6
+ import "./chunk-QXSR5KPG.js";
7
7
  import "./chunk-AXTD4TFK.js";
8
8
  import "./chunk-DHVMSIT5.js";
9
9
  import "./chunk-ZPWHCABL.js";
@@ -11,4 +11,4 @@ export {
11
11
  CliCircuitBreakerIntegration,
12
12
  createCliCircuitBreakerIntegration
13
13
  };
14
- //# sourceMappingURL=cli-circuit-breaker-2AAHSCHR.js.map
14
+ //# sourceMappingURL=cli-circuit-breaker-FJQXDC5M.js.map