nexus-agents 8.74.2 → 8.75.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 (137) hide show
  1. package/dist/{ast-rule-runner-K35WYUOD.js → ast-rule-runner-TCI3CB7K.js} +3 -3
  2. package/dist/{child-mcp-config-B2CWZ2ZK.js → child-mcp-config-J7HDNVYD.js} +2 -2
  3. package/dist/{chunk-22VQMTR6.js → chunk-2FQGQTMQ.js} +2 -2
  4. package/dist/{chunk-M6DJ6AE3.js → chunk-2RWMVCFQ.js} +9 -9
  5. package/dist/{chunk-ADHIHFBA.js → chunk-2WYASA3M.js} +2 -2
  6. package/dist/{chunk-I2KBD37Y.js → chunk-3GTY2CQ5.js} +3 -3
  7. package/dist/{chunk-3PI3INR3.js → chunk-3TBIIXNO.js} +5 -5
  8. package/dist/{chunk-NLRIEHAY.js → chunk-4WWQHHD4.js} +4 -4
  9. package/dist/{chunk-43RJNTUZ.js → chunk-5DTXWI36.js} +2 -2
  10. package/dist/{chunk-6Y24JDBR.js → chunk-5J2JXRFK.js} +51 -41
  11. package/dist/chunk-5J2JXRFK.js.map +1 -0
  12. package/dist/{chunk-CYZ3DUQV.js → chunk-5KE6TDTR.js} +2 -2
  13. package/dist/{chunk-M7DUOIAK.js → chunk-7ETWTSTB.js} +11 -2
  14. package/dist/chunk-7ETWTSTB.js.map +1 -0
  15. package/dist/{chunk-ST7RKS3P.js → chunk-AQ4EN6ST.js} +2 -2
  16. package/dist/{chunk-MYGTMAHW.js → chunk-BOFMEYN3.js} +3 -3
  17. package/dist/{chunk-ZKEULHX6.js → chunk-CZTXBFF7.js} +7 -7
  18. package/dist/{chunk-GENL3TXA.js → chunk-DVP6Q6FV.js} +2 -2
  19. package/dist/{chunk-B227FYGQ.js → chunk-G7XHATON.js} +4 -4
  20. package/dist/{chunk-6DPQOIE7.js → chunk-GAUJEB2Q.js} +2 -2
  21. package/dist/{chunk-5E33WGDR.js → chunk-ICRAAJNV.js} +2 -2
  22. package/dist/{chunk-2KXRL4OW.js → chunk-J5KJSH7X.js} +2 -2
  23. package/dist/{chunk-GW7SZ555.js → chunk-JOZFWG7Z.js} +2 -2
  24. package/dist/{chunk-5QE6DJMH.js → chunk-K5RSOZA2.js} +9 -6
  25. package/dist/{chunk-5QE6DJMH.js.map → chunk-K5RSOZA2.js.map} +1 -1
  26. package/dist/{chunk-TUTS6S2G.js → chunk-KP526GCE.js} +8 -8
  27. package/dist/{chunk-ZDVNHXRV.js → chunk-LZHSNTUX.js} +2 -2
  28. package/dist/{chunk-NC7X6WQL.js → chunk-M32SPAVJ.js} +2 -2
  29. package/dist/{chunk-QW5FSTLJ.js → chunk-N55572YJ.js} +2 -2
  30. package/dist/{chunk-DSTEEVDR.js → chunk-OC63XXB7.js} +2 -2
  31. package/dist/{chunk-I5DGPV2X.js → chunk-OFBBSPDK.js} +3 -3
  32. package/dist/{chunk-PWEGOADT.js → chunk-P5JIBL7V.js} +22 -14
  33. package/dist/chunk-P5JIBL7V.js.map +1 -0
  34. package/dist/{chunk-D5ST2Y4W.js → chunk-QBBHX62B.js} +3 -3
  35. package/dist/{chunk-47624RRN.js → chunk-RAMD5SM3.js} +2 -2
  36. package/dist/{chunk-HO2UPJ7T.js → chunk-SGSFVIVA.js} +36 -11
  37. package/dist/{chunk-HO2UPJ7T.js.map → chunk-SGSFVIVA.js.map} +1 -1
  38. package/dist/{chunk-TL5NV5JH.js → chunk-T62P7IRM.js} +4 -4
  39. package/dist/{chunk-RGEJZIOJ.js → chunk-TIT3LPGB.js} +2 -2
  40. package/dist/{chunk-4PWDDMLH.js → chunk-UBXS4Z36.js} +51 -10
  41. package/dist/chunk-UBXS4Z36.js.map +1 -0
  42. package/dist/{chunk-IQTHG5BO.js → chunk-VNOCNVSN.js} +2 -2
  43. package/dist/chunk-W654ME6B.js +17 -0
  44. package/dist/chunk-W654ME6B.js.map +1 -0
  45. package/dist/{chunk-Z2XB5IKO.js → chunk-WVUCQSOB.js} +2 -2
  46. package/dist/{cli-circuit-breaker-Q73YH6FS.js → cli-circuit-breaker-7RAGD3XB.js} +3 -3
  47. package/dist/cli.js +266 -64
  48. package/dist/cli.js.map +1 -1
  49. package/dist/{codebase-search-6WTMNKLE.js → codebase-search-7YYPTFPL.js} +3 -2
  50. package/dist/{composite-router-XKE225G5.js → composite-router-FX7VCZGG.js} +2 -2
  51. package/dist/{consensus-vote-YCETKP4M.js → consensus-vote-4JEMCYF2.js} +16 -16
  52. package/dist/{context-retriever-5BL34V6Y.js → context-retriever-6ZD3LQTB.js} +9 -8
  53. package/dist/{doctor-deep-UYXLA4HG.js → doctor-deep-QSNUGWT5.js} +3 -3
  54. package/dist/{doctor-live-7I6STRL7.js → doctor-live-XDL6NHPH.js} +10 -10
  55. package/dist/{expert-bridge-PLY7MNUK.js → expert-bridge-O3PVHUY7.js} +4 -4
  56. package/dist/{factory-ZCMLOSDY.js → factory-3GA4UEAV.js} +9 -9
  57. package/dist/{factory-5XIEO5EA.js → factory-OIRZP4UC.js} +5 -5
  58. package/dist/{improvement-review-CF5SWXUB.js → improvement-review-6U34DUAY.js} +5 -5
  59. package/dist/index.js +33 -32
  60. package/dist/index.js.map +1 -1
  61. package/dist/{init-opencode-UTF4K2LR.js → init-opencode-EZ2WZL4U.js} +6 -6
  62. package/dist/issue-triage-MJKN6FQY.js +16 -0
  63. package/dist/{pr-reviewer-helpers-RMOEXYCO.js → pr-reviewer-helpers-NFSVOOIG.js} +4 -4
  64. package/dist/{registry-command-XFM4XIGJ.js → registry-command-AY5RBNW2.js} +2 -2
  65. package/dist/{repo-security-plan-YWANNRJE.js → repo-security-plan-HDB3CQ2I.js} +3 -3
  66. package/dist/{research-helpers-synthesize-QFKDDHRE.js → research-helpers-synthesize-SQ7NIY76.js} +4 -4
  67. package/dist/{routing-memory-T22PQ5FF.js → routing-memory-SYX26ZNK.js} +2 -2
  68. package/dist/{session-memory-ZNIJGF7Z.js → session-memory-LYFWPS3L.js} +3 -3
  69. package/dist/{setup-config-XC5KSYGO.js → setup-config-HUPTMNWM.js} +3 -3
  70. package/dist/{setup-custom-api-5WL5D24S.js → setup-custom-api-NDCTK7FZ.js} +4 -4
  71. package/dist/setup-data-dir-TXQQO54X.js +31 -0
  72. package/dist/{tool-memory-JNHE2VP2.js → tool-memory-26IMPPPK.js} +5 -5
  73. package/dist/{unified-registry-5IIFYGBI.js → unified-registry-XUZZIJSZ.js} +10 -10
  74. package/dist/{weather-report-3AZHFDM3.js → weather-report-C577KPRB.js} +2 -2
  75. package/package.json +1 -1
  76. package/dist/chunk-4PWDDMLH.js.map +0 -1
  77. package/dist/chunk-6Y24JDBR.js.map +0 -1
  78. package/dist/chunk-M7DUOIAK.js.map +0 -1
  79. package/dist/chunk-PWEGOADT.js.map +0 -1
  80. package/dist/issue-triage-KCRQNDYX.js +0 -16
  81. package/dist/setup-data-dir-6PEJ3YF7.js +0 -31
  82. /package/dist/{ast-rule-runner-K35WYUOD.js.map → ast-rule-runner-TCI3CB7K.js.map} +0 -0
  83. /package/dist/{child-mcp-config-B2CWZ2ZK.js.map → child-mcp-config-J7HDNVYD.js.map} +0 -0
  84. /package/dist/{chunk-22VQMTR6.js.map → chunk-2FQGQTMQ.js.map} +0 -0
  85. /package/dist/{chunk-M6DJ6AE3.js.map → chunk-2RWMVCFQ.js.map} +0 -0
  86. /package/dist/{chunk-ADHIHFBA.js.map → chunk-2WYASA3M.js.map} +0 -0
  87. /package/dist/{chunk-I2KBD37Y.js.map → chunk-3GTY2CQ5.js.map} +0 -0
  88. /package/dist/{chunk-3PI3INR3.js.map → chunk-3TBIIXNO.js.map} +0 -0
  89. /package/dist/{chunk-NLRIEHAY.js.map → chunk-4WWQHHD4.js.map} +0 -0
  90. /package/dist/{chunk-43RJNTUZ.js.map → chunk-5DTXWI36.js.map} +0 -0
  91. /package/dist/{chunk-CYZ3DUQV.js.map → chunk-5KE6TDTR.js.map} +0 -0
  92. /package/dist/{chunk-ST7RKS3P.js.map → chunk-AQ4EN6ST.js.map} +0 -0
  93. /package/dist/{chunk-MYGTMAHW.js.map → chunk-BOFMEYN3.js.map} +0 -0
  94. /package/dist/{chunk-ZKEULHX6.js.map → chunk-CZTXBFF7.js.map} +0 -0
  95. /package/dist/{chunk-GENL3TXA.js.map → chunk-DVP6Q6FV.js.map} +0 -0
  96. /package/dist/{chunk-B227FYGQ.js.map → chunk-G7XHATON.js.map} +0 -0
  97. /package/dist/{chunk-6DPQOIE7.js.map → chunk-GAUJEB2Q.js.map} +0 -0
  98. /package/dist/{chunk-5E33WGDR.js.map → chunk-ICRAAJNV.js.map} +0 -0
  99. /package/dist/{chunk-2KXRL4OW.js.map → chunk-J5KJSH7X.js.map} +0 -0
  100. /package/dist/{chunk-GW7SZ555.js.map → chunk-JOZFWG7Z.js.map} +0 -0
  101. /package/dist/{chunk-TUTS6S2G.js.map → chunk-KP526GCE.js.map} +0 -0
  102. /package/dist/{chunk-ZDVNHXRV.js.map → chunk-LZHSNTUX.js.map} +0 -0
  103. /package/dist/{chunk-NC7X6WQL.js.map → chunk-M32SPAVJ.js.map} +0 -0
  104. /package/dist/{chunk-QW5FSTLJ.js.map → chunk-N55572YJ.js.map} +0 -0
  105. /package/dist/{chunk-DSTEEVDR.js.map → chunk-OC63XXB7.js.map} +0 -0
  106. /package/dist/{chunk-I5DGPV2X.js.map → chunk-OFBBSPDK.js.map} +0 -0
  107. /package/dist/{chunk-D5ST2Y4W.js.map → chunk-QBBHX62B.js.map} +0 -0
  108. /package/dist/{chunk-47624RRN.js.map → chunk-RAMD5SM3.js.map} +0 -0
  109. /package/dist/{chunk-TL5NV5JH.js.map → chunk-T62P7IRM.js.map} +0 -0
  110. /package/dist/{chunk-RGEJZIOJ.js.map → chunk-TIT3LPGB.js.map} +0 -0
  111. /package/dist/{chunk-IQTHG5BO.js.map → chunk-VNOCNVSN.js.map} +0 -0
  112. /package/dist/{chunk-Z2XB5IKO.js.map → chunk-WVUCQSOB.js.map} +0 -0
  113. /package/dist/{cli-circuit-breaker-Q73YH6FS.js.map → cli-circuit-breaker-7RAGD3XB.js.map} +0 -0
  114. /package/dist/{codebase-search-6WTMNKLE.js.map → codebase-search-7YYPTFPL.js.map} +0 -0
  115. /package/dist/{composite-router-XKE225G5.js.map → composite-router-FX7VCZGG.js.map} +0 -0
  116. /package/dist/{consensus-vote-YCETKP4M.js.map → consensus-vote-4JEMCYF2.js.map} +0 -0
  117. /package/dist/{context-retriever-5BL34V6Y.js.map → context-retriever-6ZD3LQTB.js.map} +0 -0
  118. /package/dist/{doctor-deep-UYXLA4HG.js.map → doctor-deep-QSNUGWT5.js.map} +0 -0
  119. /package/dist/{doctor-live-7I6STRL7.js.map → doctor-live-XDL6NHPH.js.map} +0 -0
  120. /package/dist/{expert-bridge-PLY7MNUK.js.map → expert-bridge-O3PVHUY7.js.map} +0 -0
  121. /package/dist/{factory-5XIEO5EA.js.map → factory-3GA4UEAV.js.map} +0 -0
  122. /package/dist/{factory-ZCMLOSDY.js.map → factory-OIRZP4UC.js.map} +0 -0
  123. /package/dist/{improvement-review-CF5SWXUB.js.map → improvement-review-6U34DUAY.js.map} +0 -0
  124. /package/dist/{init-opencode-UTF4K2LR.js.map → init-opencode-EZ2WZL4U.js.map} +0 -0
  125. /package/dist/{issue-triage-KCRQNDYX.js.map → issue-triage-MJKN6FQY.js.map} +0 -0
  126. /package/dist/{pr-reviewer-helpers-RMOEXYCO.js.map → pr-reviewer-helpers-NFSVOOIG.js.map} +0 -0
  127. /package/dist/{registry-command-XFM4XIGJ.js.map → registry-command-AY5RBNW2.js.map} +0 -0
  128. /package/dist/{repo-security-plan-YWANNRJE.js.map → repo-security-plan-HDB3CQ2I.js.map} +0 -0
  129. /package/dist/{research-helpers-synthesize-QFKDDHRE.js.map → research-helpers-synthesize-SQ7NIY76.js.map} +0 -0
  130. /package/dist/{routing-memory-T22PQ5FF.js.map → routing-memory-SYX26ZNK.js.map} +0 -0
  131. /package/dist/{session-memory-ZNIJGF7Z.js.map → session-memory-LYFWPS3L.js.map} +0 -0
  132. /package/dist/{setup-config-XC5KSYGO.js.map → setup-config-HUPTMNWM.js.map} +0 -0
  133. /package/dist/{setup-custom-api-5WL5D24S.js.map → setup-custom-api-NDCTK7FZ.js.map} +0 -0
  134. /package/dist/{setup-data-dir-6PEJ3YF7.js.map → setup-data-dir-TXQQO54X.js.map} +0 -0
  135. /package/dist/{tool-memory-JNHE2VP2.js.map → tool-memory-26IMPPPK.js.map} +0 -0
  136. /package/dist/{unified-registry-5IIFYGBI.js.map → unified-registry-XUZZIJSZ.js.map} +0 -0
  137. /package/dist/{weather-report-3AZHFDM3.js.map → weather-report-C577KPRB.js.map} +0 -0
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  createLogger,
6
6
  getTimeProvider
7
- } from "./chunk-4PWDDMLH.js";
7
+ } from "./chunk-UBXS4Z36.js";
8
8
 
9
9
  // src/mcp/tools/scanner-registry-fetcher.ts
10
10
  import { z } from "zod";
@@ -740,4 +740,4 @@ export {
740
740
  generateSecurityPlan,
741
741
  buildPlanFromAnalysis
742
742
  };
743
- //# sourceMappingURL=chunk-CYZ3DUQV.js.map
743
+ //# sourceMappingURL=chunk-5KE6TDTR.js.map
@@ -1,3 +1,7 @@
1
+ import {
2
+ getTypescript
3
+ } from "./chunk-W654ME6B.js";
4
+
1
5
  // src/indexer/codebase-search.ts
2
6
  import { readdir } from "node:fs/promises";
3
7
  import { resolve, extname as extname2, relative } from "node:path";
@@ -5,9 +9,9 @@ import { resolve, extname as extname2, relative } from "node:path";
5
9
  // src/indexer/symbol-extractor.ts
6
10
  import { readFile } from "node:fs/promises";
7
11
  import { extname } from "node:path";
8
- import ts from "typescript";
9
12
  var SUPPORTED_EXTENSIONS = [".ts", ".tsx", ".js", ".jsx"];
10
13
  function getKind(node) {
14
+ const ts = getTypescript();
11
15
  if (ts.isFunctionDeclaration(node)) return "function";
12
16
  if (ts.isClassDeclaration(node)) return "class";
13
17
  if (ts.isInterfaceDeclaration(node)) return "interface";
@@ -18,6 +22,7 @@ function getKind(node) {
18
22
  return null;
19
23
  }
20
24
  function getName(node) {
25
+ const ts = getTypescript();
21
26
  if (ts.isFunctionDeclaration(node) || ts.isClassDeclaration(node) || ts.isInterfaceDeclaration(node) || ts.isTypeAliasDeclaration(node) || ts.isEnumDeclaration(node) || ts.isMethodDeclaration(node)) {
22
27
  const nameNode = node.name;
23
28
  return nameNode ? nameNode.getText() : "<anonymous>";
@@ -32,6 +37,7 @@ function getName(node) {
32
37
  return "<anonymous>";
33
38
  }
34
39
  function isExported(node) {
40
+ const ts = getTypescript();
35
41
  const modifiers = ts.canHaveModifiers(node) ? ts.getModifiers(node) : void 0;
36
42
  if (modifiers) {
37
43
  return modifiers.some((m) => m.kind === ts.SyntaxKind.ExportKeyword);
@@ -39,6 +45,7 @@ function isExported(node) {
39
45
  return false;
40
46
  }
41
47
  function visitNode(node, sourceFile, symbols) {
48
+ const ts = getTypescript();
42
49
  const kind = getKind(node);
43
50
  if (kind !== null) {
44
51
  const name = getName(node);
@@ -64,6 +71,7 @@ function visitNode(node, sourceFile, symbols) {
64
71
  });
65
72
  }
66
73
  function visitClassMembers(node, sourceFile, symbols) {
74
+ const ts = getTypescript();
67
75
  for (const member of node.members) {
68
76
  if (ts.isMethodDeclaration(member) || ts.isPropertyDeclaration(member)) {
69
77
  const memberName = member.name.getText();
@@ -98,6 +106,7 @@ async function extractSymbols(filePath) {
98
106
  parsed: false
99
107
  };
100
108
  }
109
+ const ts = getTypescript();
101
110
  const source = await readFile(filePath, "utf-8");
102
111
  const sourceFile = ts.createSourceFile(filePath, source, ts.ScriptTarget.Latest, true);
103
112
  const symbols = [];
@@ -292,4 +301,4 @@ export {
292
301
  findSourceFiles,
293
302
  CodebaseIndex
294
303
  };
295
- //# sourceMappingURL=chunk-M7DUOIAK.js.map
304
+ //# sourceMappingURL=chunk-7ETWTSTB.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 SUPPORTED_EXTENSIONS,\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 // #4640: take the list from the extractor rather than keeping a copy. The\n // two sat on opposite sides of the same decision — `extract_symbols` reaches\n // the extension gate at symbol-extractor.ts:162, while this sweep filters\n // *before* it — so a language added to SUPPORTED_EXTENSIONS was parsed by\n // one tool and silently never indexed by the other.\n SUPPORTED_EXTENSIONS.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 return this.searchWithTotal(query, limit).results;\n }\n\n /**\n * Search symbols, reporting how many matched BEFORE the limit was applied.\n *\n * `search` discards that number, so a caller could not tell \"20 results\" from\n * \"the first 20 of 340\" — and `search_codebase` reported the former.\n * The sibling `search_usages` has carried `truncated`/`omittedMatches`/`limit`\n * since it was written; this is the seam that lets `search_codebase` say the\n * same thing.\n */\n searchWithTotal(query: string, limit = 20): { results: SearchResult[]; total: number } {\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 const sorted = results.sort((a, b) => b.score - a.score);\n return { results: sorted.slice(0, limit), total: sorted.length };\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 * The compiler is ts-morph's bundled copy, loaded on first call through\n * `indexer/lazy-compiler.ts` (#6405) — never at import, and never the\n * standalone `typescript` package (a second 76 MB copy).\n *\n * @module indexer/symbol-extractor\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { extname } from 'node:path';\nimport type { ts } from 'ts-morph';\nimport { getTypescript } from './lazy-compiler.js';\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 const ts = getTypescript();\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 const ts = getTypescript();\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 ts = getTypescript();\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 ts = getTypescript();\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 const ts = getTypescript();\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 ts = getTypescript();\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"]}
@@ -5,7 +5,7 @@ import {
5
5
  MCP_TIMEOUTS,
6
6
  TEST_TIMEOUTS,
7
7
  WORKFLOW_TIMEOUTS
8
- } from "./chunk-4PWDDMLH.js";
8
+ } from "./chunk-UBXS4Z36.js";
9
9
  import {
10
10
  createGetToolRateLimit
11
11
  } from "./chunk-RNDHNRSX.js";
@@ -220,4 +220,4 @@ export {
220
220
  CUSTOM_API_DEFAULT_MODEL,
221
221
  DEFAULTS
222
222
  };
223
- //# sourceMappingURL=chunk-ST7RKS3P.js.map
223
+ //# sourceMappingURL=chunk-AQ4EN6ST.js.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  loadPapersRegistry
3
- } from "./chunk-GW7SZ555.js";
3
+ } from "./chunk-JOZFWG7Z.js";
4
4
  import {
5
5
  getErrorMessage
6
- } from "./chunk-4PWDDMLH.js";
6
+ } from "./chunk-UBXS4Z36.js";
7
7
 
8
8
  // src/cli/research-helpers-synthesize.ts
9
9
  import { z } from "zod";
@@ -876,4 +876,4 @@ export {
876
876
  AttributedInsightSchema,
877
877
  synthesizeResearch
878
878
  };
879
- //# sourceMappingURL=chunk-MYGTMAHW.js.map
879
+ //# sourceMappingURL=chunk-BOFMEYN3.js.map
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  resolveCliSlot
3
- } from "./chunk-RGEJZIOJ.js";
3
+ } from "./chunk-TIT3LPGB.js";
4
4
  import {
5
5
  createLogger,
6
6
  getTimeProvider,
7
7
  isRateLimitText
8
- } from "./chunk-4PWDDMLH.js";
8
+ } from "./chunk-UBXS4Z36.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-B2CWZ2ZK.js");
24
+ const { generateMcpConfig } = await import("./child-mcp-config-J7HDNVYD.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-ZCMLOSDY.js");
97
- const { createCompositeRouter } = await import("./composite-router-XKE225G5.js");
96
+ const { createAllAdapters } = await import("./factory-3GA4UEAV.js");
97
+ const { createCompositeRouter } = await import("./composite-router-FX7VCZGG.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-Q73YH6FS.js");
105
+ const { createCliCircuitBreakerIntegration } = await import("./cli-circuit-breaker-7RAGD3XB.js");
106
106
  cachedCircuitBreaker = createCliCircuitBreakerIntegration([...adapters.values()]);
107
107
  } catch (error) {
108
108
  const msg = error instanceof Error ? error.message : String(error);
@@ -216,4 +216,4 @@ export {
216
216
  tokenSplitFromUsage,
217
217
  executeExpert
218
218
  };
219
- //# sourceMappingURL=chunk-ZKEULHX6.js.map
219
+ //# sourceMappingURL=chunk-CZTXBFF7.js.map
@@ -10,7 +10,7 @@ import {
10
10
  isRateLimitText,
11
11
  observedArmDisplaySlot,
12
12
  ok
13
- } from "./chunk-4PWDDMLH.js";
13
+ } from "./chunk-UBXS4Z36.js";
14
14
 
15
15
  // src/cli-adapters/circuit-breaker-types.ts
16
16
  var CircuitErrorCode = {
@@ -592,4 +592,4 @@ export {
592
592
  CliCircuitBreakerIntegration,
593
593
  createCliCircuitBreakerIntegration
594
594
  };
595
- //# sourceMappingURL=chunk-GENL3TXA.js.map
595
+ //# sourceMappingURL=chunk-DVP6Q6FV.js.map
@@ -5,7 +5,7 @@ import {
5
5
  } from "./chunk-7LP6VJRP.js";
6
6
  import {
7
7
  SessionMemory
8
- } from "./chunk-6DPQOIE7.js";
8
+ } from "./chunk-GAUJEB2Q.js";
9
9
  import {
10
10
  StatsOnlyAdapter,
11
11
  ensureSharedMemoryRegistry
@@ -15,7 +15,7 @@ import {
15
15
  } from "./chunk-MUJCGBZW.js";
16
16
  import {
17
17
  generateId
18
- } from "./chunk-IQTHG5BO.js";
18
+ } from "./chunk-VNOCNVSN.js";
19
19
  import {
20
20
  ErrorCode,
21
21
  NexusError,
@@ -29,7 +29,7 @@ import {
29
29
  ok,
30
30
  openSqliteDatabase,
31
31
  setSharedMobiMemDbPathResolver
32
- } from "./chunk-4PWDDMLH.js";
32
+ } from "./chunk-UBXS4Z36.js";
33
33
  import {
34
34
  nexusDataPath
35
35
  } from "./chunk-RNDHNRSX.js";
@@ -5822,4 +5822,4 @@ export {
5822
5822
  reinitializeMemoryBackends,
5823
5823
  ToolMemoryManager
5824
5824
  };
5825
- //# sourceMappingURL=chunk-B227FYGQ.js.map
5825
+ //# sourceMappingURL=chunk-G7XHATON.js.map
@@ -4,7 +4,7 @@ import {
4
4
  getErrorMessage,
5
5
  getTimeProvider,
6
6
  ok
7
- } from "./chunk-4PWDDMLH.js";
7
+ } from "./chunk-UBXS4Z36.js";
8
8
 
9
9
  // src/context/session-memory.ts
10
10
  import * as fs from "node:fs";
@@ -370,4 +370,4 @@ export {
370
370
  SessionMemory,
371
371
  createSessionMemory
372
372
  };
373
- //# sourceMappingURL=chunk-6DPQOIE7.js.map
373
+ //# sourceMappingURL=chunk-GAUJEB2Q.js.map
@@ -4,7 +4,7 @@ import {
4
4
  createLogger,
5
5
  err,
6
6
  ok
7
- } from "./chunk-4PWDDMLH.js";
7
+ } from "./chunk-UBXS4Z36.js";
8
8
 
9
9
  // src/adapters/sdk/custom-api-validation.ts
10
10
  import { isIPv4, isIPv6 } from "node:net";
@@ -248,4 +248,4 @@ export {
248
248
  validateCustomApiBaseUrl,
249
249
  assertCustomApiHostResolvesPublic
250
250
  };
251
- //# sourceMappingURL=chunk-5E33WGDR.js.map
251
+ //# sourceMappingURL=chunk-ICRAAJNV.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getErrorMessage
3
- } from "./chunk-4PWDDMLH.js";
3
+ } from "./chunk-UBXS4Z36.js";
4
4
 
5
5
  // src/cli/setup-config.ts
6
6
  import { copyFileSync, existsSync, mkdirSync, writeFileSync } from "node:fs";
@@ -77,4 +77,4 @@ function ensureBackup(outputPath) {
77
77
  export {
78
78
  runConfigInitSync
79
79
  };
80
- //# sourceMappingURL=chunk-2KXRL4OW.js.map
80
+ //# sourceMappingURL=chunk-J5KJSH7X.js.map
@@ -5,7 +5,7 @@ import {
5
5
  err,
6
6
  getErrorMessage,
7
7
  ok
8
- } from "./chunk-4PWDDMLH.js";
8
+ } from "./chunk-UBXS4Z36.js";
9
9
  import {
10
10
  findRepoRoot,
11
11
  getActiveWorkspaceRoot,
@@ -223,4 +223,4 @@ export {
223
223
  loadPapersRegistry,
224
224
  savePapersRegistry
225
225
  };
226
- //# sourceMappingURL=chunk-GW7SZ555.js.map
226
+ //# sourceMappingURL=chunk-JOZFWG7Z.js.map
@@ -1,3 +1,6 @@
1
+ import {
2
+ getTsMorph
3
+ } from "./chunk-W654ME6B.js";
1
4
  import {
2
5
  REGISTRY_PATH,
3
6
  getProjectRoot,
@@ -5,13 +8,13 @@ import {
5
8
  loadTechniquesRegistry,
6
9
  resolveInsideRoot,
7
10
  savePapersRegistry
8
- } from "./chunk-GW7SZ555.js";
11
+ } from "./chunk-JOZFWG7Z.js";
9
12
  import {
10
13
  resolveToken
11
- } from "./chunk-22VQMTR6.js";
14
+ } from "./chunk-2FQGQTMQ.js";
12
15
  import {
13
16
  getToolMemory
14
- } from "./chunk-B227FYGQ.js";
17
+ } from "./chunk-G7XHATON.js";
15
18
  import {
16
19
  capitalizeWords,
17
20
  tokenizeFiltered,
@@ -40,7 +43,7 @@ import {
40
43
  ok,
41
44
  registerPersistentDistillerFactory,
42
45
  sigmoidConfidence
43
- } from "./chunk-4PWDDMLH.js";
46
+ } from "./chunk-UBXS4Z36.js";
44
47
  import {
45
48
  ensureLearningDir,
46
49
  getRulesFile
@@ -3201,7 +3204,6 @@ function extractDescription(sourceFile) {
3201
3204
  }
3202
3205
 
3203
3206
  // src/indexer/project-extraction.ts
3204
- import { Project } from "ts-morph";
3205
3207
  import * as path5 from "node:path";
3206
3208
 
3207
3209
  // src/indexer/types.ts
@@ -3298,6 +3300,7 @@ function processSourceFiles(project, rootDir, extractDescriptions) {
3298
3300
  function extractProject(options = {}) {
3299
3301
  const opts = { ...DEFAULT_EXTRACTOR_OPTIONS, ...options };
3300
3302
  const startTime = getTimeProvider().now();
3303
+ const { Project } = getTsMorph();
3301
3304
  const project = new Project({
3302
3305
  skipAddingFilesFromTsConfig: true,
3303
3306
  skipFileDependencyResolution: true
@@ -4238,4 +4241,4 @@ export {
4238
4241
  DEFAULT_CONTEXT_BUDGET_TOKENS,
4239
4242
  getContextPromptPrefix
4240
4243
  };
4241
- //# sourceMappingURL=chunk-5QE6DJMH.js.map
4244
+ //# sourceMappingURL=chunk-K5RSOZA2.js.map