yandecode 0.1.1 → 0.2.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 (226) hide show
  1. package/dist/bin.js +14 -8
  2. package/dist/bin.js.map +7 -1
  3. package/dist/chunks/chunk-23DG7PZZ.js +58 -0
  4. package/dist/chunks/chunk-23DG7PZZ.js.map +7 -0
  5. package/dist/chunks/chunk-2S6B3DDQ.js +1769 -0
  6. package/dist/chunks/chunk-2S6B3DDQ.js.map +7 -0
  7. package/dist/chunks/chunk-6J5CZVCJ.js +120 -0
  8. package/dist/chunks/chunk-6J5CZVCJ.js.map +7 -0
  9. package/dist/chunks/chunk-7L6DD2VD.js +768 -0
  10. package/dist/chunks/chunk-7L6DD2VD.js.map +7 -0
  11. package/dist/chunks/chunk-DWD37AI2.js +39 -0
  12. package/dist/chunks/chunk-DWD37AI2.js.map +7 -0
  13. package/dist/chunks/chunk-KPDBXQ62.js +62 -0
  14. package/dist/chunks/chunk-KPDBXQ62.js.map +7 -0
  15. package/dist/chunks/chunk-KVBKQXTU.js +351 -0
  16. package/dist/chunks/chunk-KVBKQXTU.js.map +7 -0
  17. package/dist/chunks/chunk-L2DDIZPI.js +53 -0
  18. package/dist/chunks/chunk-L2DDIZPI.js.map +7 -0
  19. package/dist/chunks/chunk-OIAMKDTQ.js +27 -0
  20. package/dist/chunks/chunk-OIAMKDTQ.js.map +7 -0
  21. package/dist/chunks/chunk-PUWSEWX3.js +61 -0
  22. package/dist/chunks/chunk-PUWSEWX3.js.map +7 -0
  23. package/dist/chunks/chunk-QCQC73WX.js +122 -0
  24. package/dist/chunks/chunk-QCQC73WX.js.map +7 -0
  25. package/dist/chunks/chunk-TYLH4NIC.js +39 -0
  26. package/dist/chunks/chunk-TYLH4NIC.js.map +7 -0
  27. package/dist/chunks/chunk-VKVJGBNJ.js +72 -0
  28. package/dist/chunks/chunk-VKVJGBNJ.js.map +7 -0
  29. package/dist/chunks/chunk-Y2MIXROU.js +20072 -0
  30. package/dist/chunks/chunk-Y2MIXROU.js.map +7 -0
  31. package/dist/chunks/cli-V6PJTDLM.js +3464 -0
  32. package/dist/chunks/cli-V6PJTDLM.js.map +7 -0
  33. package/dist/chunks/doctor-LLDVEPWL.js +184 -0
  34. package/dist/chunks/doctor-LLDVEPWL.js.map +7 -0
  35. package/dist/chunks/entry-YAOEX3EB.js +187 -0
  36. package/dist/chunks/entry-YAOEX3EB.js.map +7 -0
  37. package/dist/chunks/init-4ZJFCKIJ.js +46 -0
  38. package/dist/chunks/init-4ZJFCKIJ.js.map +7 -0
  39. package/dist/chunks/mcp-serve-KWKMUGWZ.js +22575 -0
  40. package/dist/chunks/mcp-serve-KWKMUGWZ.js.map +7 -0
  41. package/dist/chunks/modules-CJB5IKUJ.js +121 -0
  42. package/dist/chunks/modules-CJB5IKUJ.js.map +7 -0
  43. package/dist/chunks/runtime-3E4NIFAL.js +208 -0
  44. package/dist/chunks/runtime-3E4NIFAL.js.map +7 -0
  45. package/dist/chunks/runtime-7CRR63B5.js +395 -0
  46. package/dist/chunks/runtime-7CRR63B5.js.map +7 -0
  47. package/dist/chunks/runtime-CKMVHAU4.js +64 -0
  48. package/dist/chunks/runtime-CKMVHAU4.js.map +7 -0
  49. package/dist/chunks/runtime-CVZMWIJO.js +318 -0
  50. package/dist/chunks/runtime-CVZMWIJO.js.map +7 -0
  51. package/dist/chunks/runtime-DBNXBOAL.js +295 -0
  52. package/dist/chunks/runtime-DBNXBOAL.js.map +7 -0
  53. package/dist/chunks/runtime-EKHO2JXB.js +197 -0
  54. package/dist/chunks/runtime-EKHO2JXB.js.map +7 -0
  55. package/dist/chunks/runtime-EY6SVZYP.js +539 -0
  56. package/dist/chunks/runtime-EY6SVZYP.js.map +7 -0
  57. package/dist/chunks/runtime-UB2O2HUN.js +212 -0
  58. package/dist/chunks/runtime-UB2O2HUN.js.map +7 -0
  59. package/dist/chunks/runtime-WAFQWW4M.js +755 -0
  60. package/dist/chunks/runtime-WAFQWW4M.js.map +7 -0
  61. package/dist/chunks/runtime-ZGGF6RVA.js +271 -0
  62. package/dist/chunks/runtime-ZGGF6RVA.js.map +7 -0
  63. package/dist/chunks/status-SPIESL4F.js +38 -0
  64. package/dist/chunks/status-SPIESL4F.js.map +7 -0
  65. package/dist/chunks/uninstall-J2OWCX4A.js +54 -0
  66. package/dist/chunks/uninstall-J2OWCX4A.js.map +7 -0
  67. package/dist/chunks/update-OX5MZYQY.js +34 -0
  68. package/dist/chunks/update-OX5MZYQY.js.map +7 -0
  69. package/dist/content/agents/yandecode-reviewer.md +22 -0
  70. package/dist/content/agents/yandecode-security-reviewer.md +23 -0
  71. package/dist/content/skills/NOTICE.md +29 -0
  72. package/dist/content/skills/yandecode-code-review/SKILL.md +37 -0
  73. package/dist/content/skills/yandecode-debugging/SKILL.md +33 -0
  74. package/dist/content/skills/yandecode-instructions/SKILL.md +26 -0
  75. package/dist/content/skills/yandecode-memory/SKILL.md +36 -0
  76. package/dist/content/skills/yandecode-security-review/SKILL.md +24 -0
  77. package/dist/content/skills/yandecode-tdd/SKILL.md +38 -0
  78. package/dist/content/skills/yandecode-verification/SKILL.md +29 -0
  79. package/dist/content/skills/yandecode-workflow/SKILL.md +50 -0
  80. package/package.json +25 -19
  81. package/dist/bin.d.ts +0 -3
  82. package/dist/bin.d.ts.map +0 -1
  83. package/dist/claude-bin.d.ts +0 -2
  84. package/dist/claude-bin.d.ts.map +0 -1
  85. package/dist/claude-bin.js +0 -4
  86. package/dist/claude-bin.js.map +0 -1
  87. package/dist/cli.d.ts +0 -6
  88. package/dist/cli.d.ts.map +0 -1
  89. package/dist/cli.js +0 -21
  90. package/dist/cli.js.map +0 -1
  91. package/dist/commands/doctor.d.ts +0 -2
  92. package/dist/commands/doctor.d.ts.map +0 -1
  93. package/dist/commands/doctor.js +0 -19
  94. package/dist/commands/doctor.js.map +0 -1
  95. package/dist/commands/hook.d.ts +0 -2
  96. package/dist/commands/hook.d.ts.map +0 -1
  97. package/dist/commands/hook.js +0 -23
  98. package/dist/commands/hook.js.map +0 -1
  99. package/dist/commands/index-cmd.d.ts +0 -2
  100. package/dist/commands/index-cmd.d.ts.map +0 -1
  101. package/dist/commands/index-cmd.js +0 -47
  102. package/dist/commands/index-cmd.js.map +0 -1
  103. package/dist/commands/index.d.ts +0 -13
  104. package/dist/commands/index.d.ts.map +0 -1
  105. package/dist/commands/index.js +0 -15
  106. package/dist/commands/index.js.map +0 -1
  107. package/dist/commands/init.d.ts +0 -2
  108. package/dist/commands/init.d.ts.map +0 -1
  109. package/dist/commands/init.js +0 -22
  110. package/dist/commands/init.js.map +0 -1
  111. package/dist/commands/mcp.d.ts +0 -2
  112. package/dist/commands/mcp.d.ts.map +0 -1
  113. package/dist/commands/mcp.js +0 -71
  114. package/dist/commands/mcp.js.map +0 -1
  115. package/dist/commands/rag.d.ts +0 -2
  116. package/dist/commands/rag.d.ts.map +0 -1
  117. package/dist/commands/rag.js +0 -27
  118. package/dist/commands/rag.js.map +0 -1
  119. package/dist/commands/start.d.ts +0 -5
  120. package/dist/commands/start.d.ts.map +0 -1
  121. package/dist/commands/start.js +0 -74
  122. package/dist/commands/start.js.map +0 -1
  123. package/dist/commands/status.d.ts +0 -2
  124. package/dist/commands/status.d.ts.map +0 -1
  125. package/dist/commands/status.js +0 -29
  126. package/dist/commands/status.js.map +0 -1
  127. package/dist/commands/statusline.d.ts +0 -2
  128. package/dist/commands/statusline.d.ts.map +0 -1
  129. package/dist/commands/statusline.js +0 -90
  130. package/dist/commands/statusline.js.map +0 -1
  131. package/dist/commands/swarm.d.ts +0 -4
  132. package/dist/commands/swarm.d.ts.map +0 -1
  133. package/dist/commands/swarm.js +0 -48
  134. package/dist/commands/swarm.js.map +0 -1
  135. package/dist/commands/uninstall.d.ts +0 -2
  136. package/dist/commands/uninstall.d.ts.map +0 -1
  137. package/dist/commands/uninstall.js +0 -16
  138. package/dist/commands/uninstall.js.map +0 -1
  139. package/dist/context.d.ts +0 -13
  140. package/dist/context.d.ts.map +0 -1
  141. package/dist/context.js +0 -31
  142. package/dist/context.js.map +0 -1
  143. package/dist/doctor/checks.d.ts +0 -18
  144. package/dist/doctor/checks.d.ts.map +0 -1
  145. package/dist/doctor/checks.js +0 -270
  146. package/dist/doctor/checks.js.map +0 -1
  147. package/dist/hooks/handlers.d.ts +0 -21
  148. package/dist/hooks/handlers.d.ts.map +0 -1
  149. package/dist/hooks/handlers.js +0 -191
  150. package/dist/hooks/handlers.js.map +0 -1
  151. package/dist/index.d.ts +0 -10
  152. package/dist/index.d.ts.map +0 -1
  153. package/dist/index.js +0 -10
  154. package/dist/index.js.map +0 -1
  155. package/dist/integration/claude-md.d.ts +0 -6
  156. package/dist/integration/claude-md.d.ts.map +0 -1
  157. package/dist/integration/claude-md.js +0 -30
  158. package/dist/integration/claude-md.js.map +0 -1
  159. package/dist/integration/gitignore.d.ts +0 -3
  160. package/dist/integration/gitignore.d.ts.map +0 -1
  161. package/dist/integration/gitignore.js +0 -13
  162. package/dist/integration/gitignore.js.map +0 -1
  163. package/dist/integration/init.d.ts +0 -17
  164. package/dist/integration/init.d.ts.map +0 -1
  165. package/dist/integration/init.js +0 -86
  166. package/dist/integration/init.js.map +0 -1
  167. package/dist/integration/json-utils.d.ts +0 -13
  168. package/dist/integration/json-utils.d.ts.map +0 -1
  169. package/dist/integration/json-utils.js +0 -33
  170. package/dist/integration/json-utils.js.map +0 -1
  171. package/dist/integration/manifest.d.ts +0 -17
  172. package/dist/integration/manifest.d.ts.map +0 -1
  173. package/dist/integration/manifest.js +0 -26
  174. package/dist/integration/manifest.js.map +0 -1
  175. package/dist/integration/materialize.d.ts +0 -9
  176. package/dist/integration/materialize.d.ts.map +0 -1
  177. package/dist/integration/materialize.js +0 -21
  178. package/dist/integration/materialize.js.map +0 -1
  179. package/dist/integration/mcp-config.d.ts +0 -4
  180. package/dist/integration/mcp-config.d.ts.map +0 -1
  181. package/dist/integration/mcp-config.js +0 -11
  182. package/dist/integration/mcp-config.js.map +0 -1
  183. package/dist/integration/settings.d.ts +0 -7
  184. package/dist/integration/settings.d.ts.map +0 -1
  185. package/dist/integration/settings.js +0 -70
  186. package/dist/integration/settings.js.map +0 -1
  187. package/dist/integration/uninstall.d.ts +0 -10
  188. package/dist/integration/uninstall.d.ts.map +0 -1
  189. package/dist/integration/uninstall.js +0 -71
  190. package/dist/integration/uninstall.js.map +0 -1
  191. package/dist/launcher.d.ts +0 -8
  192. package/dist/launcher.d.ts.map +0 -1
  193. package/dist/launcher.js +0 -18
  194. package/dist/launcher.js.map +0 -1
  195. package/dist/mcp/server.d.ts +0 -27
  196. package/dist/mcp/server.d.ts.map +0 -1
  197. package/dist/mcp/server.js +0 -311
  198. package/dist/mcp/server.js.map +0 -1
  199. package/dist/plugin-content.d.ts +0 -21
  200. package/dist/plugin-content.d.ts.map +0 -1
  201. package/dist/plugin-content.js +0 -67
  202. package/dist/plugin-content.js.map +0 -1
  203. package/dist/rag/format.d.ts +0 -3
  204. package/dist/rag/format.d.ts.map +0 -1
  205. package/dist/rag/format.js +0 -12
  206. package/dist/rag/format.js.map +0 -1
  207. package/dist/retrieval-runtime.d.ts +0 -21
  208. package/dist/retrieval-runtime.d.ts.map +0 -1
  209. package/dist/retrieval-runtime.js +0 -47
  210. package/dist/retrieval-runtime.js.map +0 -1
  211. package/dist/status-line/git.d.ts +0 -3
  212. package/dist/status-line/git.d.ts.map +0 -1
  213. package/dist/status-line/git.js +0 -34
  214. package/dist/status-line/git.js.map +0 -1
  215. package/dist/status-line/render.d.ts +0 -29
  216. package/dist/status-line/render.d.ts.map +0 -1
  217. package/dist/status-line/render.js +0 -72
  218. package/dist/status-line/render.js.map +0 -1
  219. package/dist/swarm-runtime.d.ts +0 -11
  220. package/dist/swarm-runtime.d.ts.map +0 -1
  221. package/dist/swarm-runtime.js +0 -76
  222. package/dist/swarm-runtime.js.map +0 -1
  223. package/dist/version.d.ts +0 -2
  224. package/dist/version.d.ts.map +0 -1
  225. package/dist/version.js +0 -5
  226. package/dist/version.js.map +0 -1
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../node_modules/ignore/index.js", "../../../retrieval/src/chunking/languages.ts", "../../../retrieval/src/chunking/parser-loader.ts", "../../../retrieval/src/symbols/extract.ts", "../../../retrieval/src/code-index/code-index.ts", "../../../retrieval/src/chunking/tokens.ts", "../../../retrieval/src/chunking/types.ts", "../../../retrieval/src/chunking/line-chunker.ts", "../../../retrieval/src/chunking/markdown-chunker.ts", "../../../retrieval/src/chunking/tree-sitter-chunker.ts", "../../../retrieval/src/chunking/router.ts", "../../../retrieval/src/graph/import-extractor.ts", "../../../retrieval/src/graph/pagerank.ts", "../../../retrieval/src/graph/symbol-graph.ts", "../../../retrieval/src/lexical/identifiers.ts", "../../../retrieval/src/scanner/rules.ts", "../../../retrieval/src/scanner/scanner.ts", "../../../retrieval/src/code-index/schema.ts"],
4
+ "sourcesContent": ["// A simple implementation of make-array\nfunction makeArray (subject) {\n return Array.isArray(subject)\n ? subject\n : [subject]\n}\n\nconst EMPTY = ''\nconst SPACE = ' '\nconst ESCAPE = '\\\\'\nconst REGEX_TEST_BLANK_LINE = /^\\s+$/\nconst REGEX_INVALID_TRAILING_BACKSLASH = /(?:[^\\\\]|^)\\\\$/\nconst REGEX_REPLACE_LEADING_EXCAPED_EXCLAMATION = /^\\\\!/\nconst REGEX_REPLACE_LEADING_EXCAPED_HASH = /^\\\\#/\nconst REGEX_SPLITALL_CRLF = /\\r?\\n/g\n// /foo,\n// ./foo,\n// ../foo,\n// .\n// ..\nconst REGEX_TEST_INVALID_PATH = /^\\.*\\/|^\\.+$/\n\nconst SLASH = '/'\n\n// Do not use ternary expression here, since \"istanbul ignore next\" is buggy\nlet TMP_KEY_IGNORE = 'node-ignore'\n/* istanbul ignore else */\nif (typeof Symbol !== 'undefined') {\n TMP_KEY_IGNORE = Symbol.for('node-ignore')\n}\nconst KEY_IGNORE = TMP_KEY_IGNORE\n\nconst define = (object, key, value) =>\n Object.defineProperty(object, key, {value})\n\nconst REGEX_REGEXP_RANGE = /([0-z])-([0-z])/g\n\nconst RETURN_FALSE = () => false\n\n// Sanitize the range of a regular expression\n// The cases are complicated, see test cases for details\nconst sanitizeRange = range => range.replace(\n REGEX_REGEXP_RANGE,\n (match, from, to) => from.charCodeAt(0) <= to.charCodeAt(0)\n ? match\n // Invalid range (out of order) which is ok for gitignore rules but\n // fatal for JavaScript regular expression, so eliminate it.\n : EMPTY\n)\n\n// See fixtures #59\nconst cleanRangeBackSlash = slashes => {\n const {length} = slashes\n return slashes.slice(0, length - length % 2)\n}\n\n// > If the pattern ends with a slash,\n// > it is removed for the purpose of the following description,\n// > but it would only find a match with a directory.\n// > In other words, foo/ will match a directory foo and paths underneath it,\n// > but will not match a regular file or a symbolic link foo\n// > (this is consistent with the way how pathspec works in general in Git).\n// '`foo/`' will not match regular file '`foo`' or symbolic link '`foo`'\n// -> ignore-rules will not deal with it, because it costs extra `fs.stat` call\n// you could use option `mark: true` with `glob`\n\n// '`foo/`' should not continue with the '`..`'\nconst REPLACERS = [\n\n [\n // remove BOM\n // TODO:\n // Other similar zero-width characters?\n /^\\uFEFF/,\n () => EMPTY\n ],\n\n // > Trailing spaces are ignored unless they are quoted with backslash (\"\\\")\n [\n // (a\\ ) -> (a )\n // (a ) -> (a)\n // (a ) -> (a)\n // (a \\ ) -> (a )\n /((?:\\\\\\\\)*?)(\\\\?\\s+)$/,\n (_, m1, m2) => m1 + (\n m2.indexOf('\\\\') === 0\n ? SPACE\n : EMPTY\n )\n ],\n\n // replace (\\ ) with ' '\n // (\\ ) -> ' '\n // (\\\\ ) -> '\\\\ '\n // (\\\\\\ ) -> '\\\\ '\n [\n /(\\\\+?)\\s/g,\n (_, m1) => {\n const {length} = m1\n return m1.slice(0, length - length % 2) + SPACE\n }\n ],\n\n // Escape metacharacters\n // which is written down by users but means special for regular expressions.\n\n // > There are 12 characters with special meanings:\n // > - the backslash \\,\n // > - the caret ^,\n // > - the dollar sign $,\n // > - the period or dot .,\n // > - the vertical bar or pipe symbol |,\n // > - the question mark ?,\n // > - the asterisk or star *,\n // > - the plus sign +,\n // > - the opening parenthesis (,\n // > - the closing parenthesis ),\n // > - and the opening square bracket [,\n // > - the opening curly brace {,\n // > These special characters are often called \"metacharacters\".\n [\n /[\\\\$.|*+(){^]/g,\n match => `\\\\${match}`\n ],\n\n [\n // > a question mark (?) matches a single character\n /(?!\\\\)\\?/g,\n () => '[^/]'\n ],\n\n // leading slash\n [\n\n // > A leading slash matches the beginning of the pathname.\n // > For example, \"/*.c\" matches \"cat-file.c\" but not \"mozilla-sha1/sha1.c\".\n // A leading slash matches the beginning of the pathname\n /^\\//,\n () => '^'\n ],\n\n // replace special metacharacter slash after the leading slash\n [\n /\\//g,\n () => '\\\\/'\n ],\n\n [\n // > A leading \"**\" followed by a slash means match in all directories.\n // > For example, \"**/foo\" matches file or directory \"foo\" anywhere,\n // > the same as pattern \"foo\".\n // > \"**/foo/bar\" matches file or directory \"bar\" anywhere that is directly\n // > under directory \"foo\".\n // Notice that the '*'s have been replaced as '\\\\*'\n /^\\^*\\\\\\*\\\\\\*\\\\\\//,\n\n // '**/foo' <-> 'foo'\n () => '^(?:.*\\\\/)?'\n ],\n\n // starting\n [\n // there will be no leading '/'\n // (which has been replaced by section \"leading slash\")\n // If starts with '**', adding a '^' to the regular expression also works\n /^(?=[^^])/,\n function startingReplacer () {\n // If has a slash `/` at the beginning or middle\n return !/\\/(?!$)/.test(this)\n // > Prior to 2.22.1\n // > If the pattern does not contain a slash /,\n // > Git treats it as a shell glob pattern\n // Actually, if there is only a trailing slash,\n // git also treats it as a shell glob pattern\n\n // After 2.22.1 (compatible but clearer)\n // > If there is a separator at the beginning or middle (or both)\n // > of the pattern, then the pattern is relative to the directory\n // > level of the particular .gitignore file itself.\n // > Otherwise the pattern may also match at any level below\n // > the .gitignore level.\n ? '(?:^|\\\\/)'\n\n // > Otherwise, Git treats the pattern as a shell glob suitable for\n // > consumption by fnmatch(3)\n : '^'\n }\n ],\n\n // two globstars\n [\n // Use lookahead assertions so that we could match more than one `'/**'`\n /\\\\\\/\\\\\\*\\\\\\*(?=\\\\\\/|$)/g,\n\n // Zero, one or several directories\n // should not use '*', or it will be replaced by the next replacer\n\n // Check if it is not the last `'/**'`\n (_, index, str) => index + 6 < str.length\n\n // case: /**/\n // > A slash followed by two consecutive asterisks then a slash matches\n // > zero or more directories.\n // > For example, \"a/**/b\" matches \"a/b\", \"a/x/b\", \"a/x/y/b\" and so on.\n // '/**/'\n ? '(?:\\\\/[^\\\\/]+)*'\n\n // case: /**\n // > A trailing `\"/**\"` matches everything inside.\n\n // #21: everything inside but it should not include the current folder\n : '\\\\/.+'\n ],\n\n // normal intermediate wildcards\n [\n // Never replace escaped '*'\n // ignore rule '\\*' will match the path '*'\n\n // 'abc.*/' -> go\n // 'abc.*' -> skip this rule,\n // coz trailing single wildcard will be handed by [trailing wildcard]\n /(^|[^\\\\]+)(\\\\\\*)+(?=.+)/g,\n\n // '*.js' matches '.js'\n // '*.js' doesn't match 'abc'\n (_, p1, p2) => {\n // 1.\n // > An asterisk \"*\" matches anything except a slash.\n // 2.\n // > Other consecutive asterisks are considered regular asterisks\n // > and will match according to the previous rules.\n const unescaped = p2.replace(/\\\\\\*/g, '[^\\\\/]*')\n return p1 + unescaped\n }\n ],\n\n [\n // unescape, revert step 3 except for back slash\n // For example, if a user escape a '\\\\*',\n // after step 3, the result will be '\\\\\\\\\\\\*'\n /\\\\\\\\\\\\(?=[$.|*+(){^])/g,\n () => ESCAPE\n ],\n\n [\n // '\\\\\\\\' -> '\\\\'\n /\\\\\\\\/g,\n () => ESCAPE\n ],\n\n [\n // > The range notation, e.g. [a-zA-Z],\n // > can be used to match one of the characters in a range.\n\n // `\\` is escaped by step 3\n /(\\\\)?\\[([^\\]/]*?)(\\\\*)($|\\])/g,\n (match, leadEscape, range, endEscape, close) => leadEscape === ESCAPE\n // '\\\\[bar]' -> '\\\\\\\\[bar\\\\]'\n ? `\\\\[${range}${cleanRangeBackSlash(endEscape)}${close}`\n : close === ']'\n ? endEscape.length % 2 === 0\n // A normal case, and it is a range notation\n // '[bar]'\n // '[bar\\\\\\\\]'\n ? `[${sanitizeRange(range)}${endEscape}]`\n // Invalid range notaton\n // '[bar\\\\]' -> '[bar\\\\\\\\]'\n : '[]'\n : '[]'\n ],\n\n // ending\n [\n // 'js' will not match 'js.'\n // 'ab' will not match 'abc'\n /(?:[^*])$/,\n\n // WTF!\n // https://git-scm.com/docs/gitignore\n // changes in [2.22.1](https://git-scm.com/docs/gitignore/2.22.1)\n // which re-fixes #24, #38\n\n // > If there is a separator at the end of the pattern then the pattern\n // > will only match directories, otherwise the pattern can match both\n // > files and directories.\n\n // 'js*' will not match 'a.js'\n // 'js/' will not match 'a.js'\n // 'js' will match 'a.js' and 'a.js/'\n match => /\\/$/.test(match)\n // foo/ will not match 'foo'\n ? `${match}$`\n // foo matches 'foo' and 'foo/'\n : `${match}(?=$|\\\\/$)`\n ],\n\n // trailing wildcard\n [\n /(\\^|\\\\\\/)?\\\\\\*$/,\n (_, p1) => {\n const prefix = p1\n // '\\^':\n // '/*' does not match EMPTY\n // '/*' does not match everything\n\n // '\\\\\\/':\n // 'abc/*' does not match 'abc/'\n ? `${p1}[^/]+`\n\n // 'a*' matches 'a'\n // 'a*' matches 'aa'\n : '[^/]*'\n\n return `${prefix}(?=$|\\\\/$)`\n }\n ],\n]\n\n// A simple cache, because an ignore rule only has only one certain meaning\nconst regexCache = Object.create(null)\n\n// @param {pattern}\nconst makeRegex = (pattern, ignoreCase) => {\n let source = regexCache[pattern]\n\n if (!source) {\n source = REPLACERS.reduce(\n (prev, [matcher, replacer]) =>\n prev.replace(matcher, replacer.bind(pattern)),\n pattern\n )\n regexCache[pattern] = source\n }\n\n return ignoreCase\n ? new RegExp(source, 'i')\n : new RegExp(source)\n}\n\nconst isString = subject => typeof subject === 'string'\n\n// > A blank line matches no files, so it can serve as a separator for readability.\nconst checkPattern = pattern => pattern\n && isString(pattern)\n && !REGEX_TEST_BLANK_LINE.test(pattern)\n && !REGEX_INVALID_TRAILING_BACKSLASH.test(pattern)\n\n // > A line starting with # serves as a comment.\n && pattern.indexOf('#') !== 0\n\nconst splitPattern = pattern => pattern.split(REGEX_SPLITALL_CRLF)\n\nclass IgnoreRule {\n constructor (\n origin,\n pattern,\n negative,\n regex\n ) {\n this.origin = origin\n this.pattern = pattern\n this.negative = negative\n this.regex = regex\n }\n}\n\nconst createRule = (pattern, ignoreCase) => {\n const origin = pattern\n let negative = false\n\n // > An optional prefix \"!\" which negates the pattern;\n if (pattern.indexOf('!') === 0) {\n negative = true\n pattern = pattern.substr(1)\n }\n\n pattern = pattern\n // > Put a backslash (\"\\\") in front of the first \"!\" for patterns that\n // > begin with a literal \"!\", for example, `\"\\!important!.txt\"`.\n .replace(REGEX_REPLACE_LEADING_EXCAPED_EXCLAMATION, '!')\n // > Put a backslash (\"\\\") in front of the first hash for patterns that\n // > begin with a hash.\n .replace(REGEX_REPLACE_LEADING_EXCAPED_HASH, '#')\n\n const regex = makeRegex(pattern, ignoreCase)\n\n return new IgnoreRule(\n origin,\n pattern,\n negative,\n regex\n )\n}\n\nconst throwError = (message, Ctor) => {\n throw new Ctor(message)\n}\n\nconst checkPath = (path, originalPath, doThrow) => {\n if (!isString(path)) {\n return doThrow(\n `path must be a string, but got \\`${originalPath}\\``,\n TypeError\n )\n }\n\n // We don't know if we should ignore EMPTY, so throw\n if (!path) {\n return doThrow(`path must not be empty`, TypeError)\n }\n\n // Check if it is a relative path\n if (checkPath.isNotRelative(path)) {\n const r = '`path.relative()`d'\n return doThrow(\n `path should be a ${r} string, but got \"${originalPath}\"`,\n RangeError\n )\n }\n\n return true\n}\n\nconst isNotRelative = path => REGEX_TEST_INVALID_PATH.test(path)\n\ncheckPath.isNotRelative = isNotRelative\ncheckPath.convert = p => p\n\nclass Ignore {\n constructor ({\n ignorecase = true,\n ignoreCase = ignorecase,\n allowRelativePaths = false\n } = {}) {\n define(this, KEY_IGNORE, true)\n\n this._rules = []\n this._ignoreCase = ignoreCase\n this._allowRelativePaths = allowRelativePaths\n this._initCache()\n }\n\n _initCache () {\n this._ignoreCache = Object.create(null)\n this._testCache = Object.create(null)\n }\n\n _addPattern (pattern) {\n // #32\n if (pattern && pattern[KEY_IGNORE]) {\n this._rules = this._rules.concat(pattern._rules)\n this._added = true\n return\n }\n\n if (checkPattern(pattern)) {\n const rule = createRule(pattern, this._ignoreCase)\n this._added = true\n this._rules.push(rule)\n }\n }\n\n // @param {Array<string> | string | Ignore} pattern\n add (pattern) {\n this._added = false\n\n makeArray(\n isString(pattern)\n ? splitPattern(pattern)\n : pattern\n ).forEach(this._addPattern, this)\n\n // Some rules have just added to the ignore,\n // making the behavior changed.\n if (this._added) {\n this._initCache()\n }\n\n return this\n }\n\n // legacy\n addPattern (pattern) {\n return this.add(pattern)\n }\n\n // | ignored : unignored\n // negative | 0:0 | 0:1 | 1:0 | 1:1\n // -------- | ------- | ------- | ------- | --------\n // 0 | TEST | TEST | SKIP | X\n // 1 | TESTIF | SKIP | TEST | X\n\n // - SKIP: always skip\n // - TEST: always test\n // - TESTIF: only test if checkUnignored\n // - X: that never happen\n\n // @param {boolean} whether should check if the path is unignored,\n // setting `checkUnignored` to `false` could reduce additional\n // path matching.\n\n // @returns {TestResult} true if a file is ignored\n _testOne (path, checkUnignored) {\n let ignored = false\n let unignored = false\n\n this._rules.forEach(rule => {\n const {negative} = rule\n if (\n unignored === negative && ignored !== unignored\n || negative && !ignored && !unignored && !checkUnignored\n ) {\n return\n }\n\n const matched = rule.regex.test(path)\n\n if (matched) {\n ignored = !negative\n unignored = negative\n }\n })\n\n return {\n ignored,\n unignored\n }\n }\n\n // @returns {TestResult}\n _test (originalPath, cache, checkUnignored, slices) {\n const path = originalPath\n // Supports nullable path\n && checkPath.convert(originalPath)\n\n checkPath(\n path,\n originalPath,\n this._allowRelativePaths\n ? RETURN_FALSE\n : throwError\n )\n\n return this._t(path, cache, checkUnignored, slices)\n }\n\n _t (path, cache, checkUnignored, slices) {\n if (path in cache) {\n return cache[path]\n }\n\n if (!slices) {\n // path/to/a.js\n // ['path', 'to', 'a.js']\n slices = path.split(SLASH)\n }\n\n slices.pop()\n\n // If the path has no parent directory, just test it\n if (!slices.length) {\n return cache[path] = this._testOne(path, checkUnignored)\n }\n\n const parent = this._t(\n slices.join(SLASH) + SLASH,\n cache,\n checkUnignored,\n slices\n )\n\n // If the path contains a parent directory, check the parent first\n return cache[path] = parent.ignored\n // > It is not possible to re-include a file if a parent directory of\n // > that file is excluded.\n ? parent\n : this._testOne(path, checkUnignored)\n }\n\n ignores (path) {\n return this._test(path, this._ignoreCache, false).ignored\n }\n\n createFilter () {\n return path => !this.ignores(path)\n }\n\n filter (paths) {\n return makeArray(paths).filter(this.createFilter())\n }\n\n // @returns {TestResult}\n test (path) {\n return this._test(path, this._testCache, true)\n }\n}\n\nconst factory = options => new Ignore(options)\n\nconst isPathValid = path =>\n checkPath(path && checkPath.convert(path), path, RETURN_FALSE)\n\nfactory.isPathValid = isPathValid\n\n// Fixes typescript\nfactory.default = factory\n\nmodule.exports = factory\n\n// Windows\n// --------------------------------------------------------------\n/* istanbul ignore if */\nif (\n // Detect `process` so that it can run in browsers.\n typeof process !== 'undefined'\n && (\n process.env && process.env.IGNORE_TEST_WIN32\n || process.platform === 'win32'\n )\n) {\n /* eslint no-control-regex: \"off\" */\n const makePosix = str => /^\\\\\\\\\\?\\\\/.test(str)\n || /[\"<>|\\u0000-\\u001F]+/u.test(str)\n ? str\n : str.replace(/\\\\/g, '/')\n\n checkPath.convert = makePosix\n\n // 'C:\\\\foo' <- 'C:\\\\foo' has been converted to 'C:/'\n // 'd:\\\\foo'\n const REGIX_IS_WINDOWS_PATH_ABSOLUTE = /^[a-z]:\\//i\n checkPath.isNotRelative = path =>\n REGIX_IS_WINDOWS_PATH_ABSOLUTE.test(path)\n || isNotRelative(path)\n}\n", "import { basename, extname } from 'node:path';\n\nconst BY_EXT: Record<string, string> = {\n ts: 'typescript',\n mts: 'typescript',\n cts: 'typescript',\n tsx: 'tsx',\n js: 'javascript',\n mjs: 'javascript',\n cjs: 'javascript',\n jsx: 'javascript',\n py: 'python',\n go: 'go',\n java: 'java',\n rs: 'rust',\n md: 'markdown',\n mdx: 'markdown',\n json: 'json',\n yml: 'yaml',\n yaml: 'yaml',\n toml: 'toml',\n sh: 'shell',\n bash: 'shell',\n css: 'css',\n scss: 'css',\n html: 'html',\n sql: 'sql',\n txt: 'text',\n};\nconst BY_NAME: Record<string, string> = { Dockerfile: 'text', Makefile: 'text' };\n\nexport function detectLanguage(path: string): string | null {\n const name = basename(path);\n if (BY_NAME[name]) return BY_NAME[name];\n const ext = extname(name).slice(1).toLowerCase();\n return BY_EXT[ext] ?? null;\n}\n\nexport const GRAMMAR_FILES: Record<string, string> = {\n typescript: 'tree-sitter-typescript.wasm',\n tsx: 'tree-sitter-tsx.wasm',\n javascript: 'tree-sitter-javascript.wasm',\n python: 'tree-sitter-python.wasm',\n go: 'tree-sitter-go.wasm',\n java: 'tree-sitter-java.wasm',\n rust: 'tree-sitter-rust.wasm',\n};\n", "import { createRequire } from 'node:module';\nimport Parser from 'web-tree-sitter';\nimport { GRAMMAR_FILES } from './languages';\n\nconst require = createRequire(import.meta.url);\n\nlet parserInit: Promise<void> | null = null;\nconst languages = new Map<string, Promise<Parser.Language>>();\n\nexport async function loadLanguage(language: string): Promise<Parser.Language> {\n parserInit ??= Parser.init();\n await parserInit;\n let lang = languages.get(language);\n if (!lang) {\n const file = GRAMMAR_FILES[language];\n if (!file) throw new Error(`no grammar for ${language}`);\n lang = Parser.Language.load(require.resolve(`tree-sitter-wasms/out/${file}`));\n languages.set(language, lang);\n }\n return lang;\n}\n\nexport async function createParser(language: string): Promise<Parser> {\n const lang = await loadLanguage(language);\n const parser = new Parser();\n parser.setLanguage(lang);\n return parser;\n}\n", "import type Parser from 'web-tree-sitter';\nimport { createParser } from '@retrieval/chunking/parser-loader';\n\ntype Node = Parser.SyntaxNode;\n\nexport interface Unit {\n kind: string;\n symbol: string | null;\n startRow: number;\n endRow: number;\n members: Unit[];\n}\n\ninterface Classified {\n kind: string;\n symbol: string | null;\n}\n\ninterface Rules {\n unwrap: (n: Node) => Node;\n classify: (n: Node) => Classified | null;\n members: (n: Node, parentSymbol: string | null) => Unit[];\n}\n\nfunction name(n: Node): string | null {\n return n.childForFieldName('name')?.text ?? null;\n}\n\nfunction endRowOf(n: Node): number {\n return n.endPosition.column === 0 && n.endPosition.row > n.startPosition.row\n ? n.endPosition.row - 1\n : n.endPosition.row;\n}\n\nfunction unitOf(n: Node, kind: string, symbol: string | null, members: Unit[] = []): Unit {\n return { kind, symbol, startRow: n.startPosition.row, endRow: endRowOf(n), members };\n}\n\nfunction firstStringArg(call: Node): string | null {\n const args = call.childForFieldName('arguments');\n const s = args?.namedChildren.find((c) => c.type === 'string' || c.type === 'template_string');\n return s ? s.text.replace(/^['\"`]|['\"`]$/g, '') : null;\n}\n\nconst TEST_FNS = new Set(['describe', 'it', 'test', 'context', 'suite']);\n\nfunction jsMembers(body: Node | null, parent: string | null): Unit[] {\n if (!body) return [];\n const out: Unit[] = [];\n for (const m of body.namedChildren) {\n if (\n m.type === 'method_definition' ||\n m.type === 'abstract_method_signature' ||\n m.type === 'method_signature'\n ) {\n const n = name(m);\n out.push(unitOf(m, 'method', parent && n ? `${parent}/${n}` : n));\n }\n }\n return out;\n}\n\n/** Node types that declare a named symbol directly, by language family. */\nconst JS_DECLARATIONS: Readonly<Record<string, string>> = {\n class_declaration: 'class',\n abstract_class_declaration: 'class',\n interface_declaration: 'interface',\n type_alias_declaration: 'type',\n enum_declaration: 'enum',\n function_declaration: 'function',\n generator_function_declaration: 'function',\n /** `declare function f(): T;` in .d.ts files. */\n function_signature: 'function',\n};\n\nconst FUNCTION_VALUES = new Set(['arrow_function', 'function', 'function_expression']);\n\n/** `const f = () => \u2026` and friends count as functions; other variables are not symbols. */\nfunction jsFunctionVariable(n: Node): Classified | null {\n const decl = n.namedChildren.find((c) => c.type === 'variable_declarator');\n const value = decl?.childForFieldName('value');\n if (!value || !FUNCTION_VALUES.has(value.type)) return null;\n return { kind: 'function', symbol: decl ? name(decl) : null };\n}\n\n/** `describe('\u2026', \u2026)` / `it('\u2026', \u2026)` blocks become `test` symbols named by their title. */\nfunction jsTestCall(n: Node): Classified | null {\n const call = n.namedChildren[0];\n if (call?.type !== 'call_expression') return null;\n const fn = call.childForFieldName('function')?.text ?? '';\n return TEST_FNS.has(fn.split('.')[0] ?? '')\n ? { kind: 'test', symbol: firstStringArg(call) }\n : null;\n}\n\n/** `export \u2026` and `declare \u2026` (ambient, .d.ts) wrap the actual declaration. */\nfunction jsUnwrap(n: Node): Node {\n const exported = n.type === 'export_statement' ? (n.childForFieldName('declaration') ?? n) : n;\n return exported.type === 'ambient_declaration'\n ? (exported.namedChildren[0] ?? exported)\n : exported;\n}\n\nconst JS_RULES: Rules = {\n unwrap: jsUnwrap,\n classify: (n) => {\n const kind = JS_DECLARATIONS[n.type];\n if (kind) return { kind, symbol: name(n) };\n if (n.type === 'lexical_declaration' || n.type === 'variable_declaration') {\n return jsFunctionVariable(n);\n }\n return n.type === 'expression_statement' ? jsTestCall(n) : null;\n },\n members: (n, parent) =>\n n.type.endsWith('class_declaration') ? jsMembers(n.childForFieldName('body'), parent) : [],\n};\n\nconst PY_RULES: Rules = {\n unwrap: (n) => (n.type === 'decorated_definition' ? (n.childForFieldName('definition') ?? n) : n),\n classify: (n) => {\n if (n.type === 'class_definition') return { kind: 'class', symbol: name(n) };\n if (n.type === 'function_definition') return { kind: 'function', symbol: name(n) };\n return null;\n },\n members: (n, parent) => {\n if (n.type !== 'class_definition') return [];\n const body = n.childForFieldName('body');\n const out: Unit[] = [];\n for (const raw of body?.namedChildren ?? []) {\n const m = PY_RULES.unwrap(raw);\n if (m.type === 'function_definition') {\n const nm = name(m);\n out.push(unitOf(raw, 'method', parent && nm ? `${parent}/${nm}` : nm));\n }\n }\n return out;\n },\n};\n\n/** `func (s *Server) Do()` \u2192 `Server/Do`. */\nfunction goMethod(n: Node): Classified {\n const receiver = n.childForFieldName('receiver')?.namedChildren[0];\n const receiverType = receiver?.childForFieldName('type')?.text.replace(/^\\*/, '') ?? null;\n const method = name(n);\n return { kind: 'method', symbol: receiverType && method ? `${receiverType}/${method}` : method };\n}\n\nconst GO_TYPE_KINDS: Readonly<Record<string, string>> = {\n struct_type: 'struct',\n interface_type: 'interface',\n};\n\nfunction goType(n: Node): Classified {\n const spec = n.namedChildren.find((c) => c.type === 'type_spec');\n const shape = spec?.childForFieldName('type')?.type ?? '';\n return { kind: GO_TYPE_KINDS[shape] ?? 'type', symbol: spec ? name(spec) : null };\n}\n\nconst GO_RULES: Rules = {\n unwrap: (n) => n,\n classify: (n) => {\n if (n.type === 'function_declaration') return { kind: 'function', symbol: name(n) };\n if (n.type === 'method_declaration') return goMethod(n);\n return n.type === 'type_declaration' ? goType(n) : null;\n },\n members: () => [],\n};\n\nconst JAVA_RULES: Rules = {\n unwrap: (n) => n,\n classify: (n) => {\n if (n.type === 'class_declaration') return { kind: 'class', symbol: name(n) };\n if (n.type === 'interface_declaration') return { kind: 'interface', symbol: name(n) };\n if (n.type === 'enum_declaration') return { kind: 'enum', symbol: name(n) };\n if (n.type === 'record_declaration') return { kind: 'class', symbol: name(n) };\n return null;\n },\n members: (n, parent) => {\n const body = n.childForFieldName('body');\n const out: Unit[] = [];\n for (const m of body?.namedChildren ?? []) {\n if (m.type === 'method_declaration' || m.type === 'constructor_declaration') {\n const nm = name(m);\n out.push(unitOf(m, 'method', parent && nm ? `${parent}/${nm}` : nm));\n }\n }\n return out;\n },\n};\n\nconst RUST_DECLARATIONS: Readonly<Record<string, string>> = {\n function_item: 'function',\n struct_item: 'struct',\n enum_item: 'enum',\n trait_item: 'trait',\n mod_item: 'module',\n};\n\nconst RUST_RULES: Rules = {\n unwrap: (n) => n,\n classify: (n) => {\n if (n.type === 'impl_item') {\n return { kind: 'impl', symbol: n.childForFieldName('type')?.text ?? null };\n }\n const kind = RUST_DECLARATIONS[n.type];\n return kind ? { kind, symbol: name(n) } : null;\n },\n members: (n, parent) => {\n if (n.type !== 'impl_item' && n.type !== 'trait_item') return [];\n const body = n.childForFieldName('body');\n const out: Unit[] = [];\n for (const m of body?.namedChildren ?? []) {\n if (m.type === 'function_item' || m.type === 'function_signature_item') {\n const nm = name(m);\n out.push(unitOf(m, 'method', parent && nm ? `${parent}/${nm}` : nm));\n }\n }\n return out;\n },\n};\n\nexport const RULES: Record<string, Rules> = {\n typescript: JS_RULES,\n tsx: JS_RULES,\n javascript: JS_RULES,\n python: PY_RULES,\n go: GO_RULES,\n java: JAVA_RULES,\n rust: RUST_RULES,\n};\n\nexport interface CodeSymbol {\n /** Serena-style path of nested names, e.g. `AuthService/login`. */\n namePath: string;\n name: string;\n kind: string;\n /** 1-based inclusive line range. */\n startLine: number;\n endLine: number;\n /** First line of the declaration, trimmed (max 200 chars). */\n signature: string;\n /** name_path of the enclosing symbol, or null for top-level symbols. */\n parent: string | null;\n}\n\nexport function supportsSymbols(language: string | null): boolean {\n return language !== null && language in RULES;\n}\n\n/** Top-level declaration units (with their members) of a parsed file, in source order. */\nexport async function extractUnits(content: string, language: string): Promise<Unit[]> {\n const rules = RULES[language];\n if (!rules) throw new Error(`unsupported language ${language}`);\n const parser = await createParser(language);\n const tree = parser.parse(content);\n try {\n const units: Unit[] = [];\n for (const top of tree.rootNode.namedChildren) {\n const inner = rules.unwrap(top);\n const cls = rules.classify(inner);\n if (!cls) continue;\n units.push(unitOf(top, cls.kind, cls.symbol, rules.members(inner, cls.symbol)));\n }\n return units.sort((a, b) => a.startRow - b.startRow);\n } finally {\n tree.delete();\n parser.delete();\n }\n}\n\nfunction signatureOf(lines: string[], row: number): string {\n const line = (lines[row] ?? '').trim().replace(/\\s*\\{\\s*$/, '');\n return line.length > 200 ? `${line.slice(0, 197)}...` : line;\n}\n\n/** Named declarations of a file, flattened (parents before their members). */\nexport async function extractSymbols(content: string, language: string): Promise<CodeSymbol[]> {\n const lines = content.split('\\n');\n const out: CodeSymbol[] = [];\n const visit = (unit: Unit, parent: string | null): void => {\n if (unit.symbol) {\n out.push({\n namePath: unit.symbol,\n name: unit.symbol.split('/').pop()!,\n kind: unit.kind,\n startLine: unit.startRow + 1,\n endLine: unit.endRow + 1,\n signature: signatureOf(lines, unit.startRow),\n parent,\n });\n }\n for (const member of unit.members) visit(member, unit.symbol);\n };\n for (const unit of await extractUnits(content, language)) visit(unit, null);\n return out;\n}\n", "import { createHash } from 'node:crypto';\nimport { mkdirSync, readFileSync, statSync } from 'node:fs';\nimport { basename, dirname, join } from 'node:path';\nimport { openModuleDb, splitIdentifier, toFtsQuery, type Database } from '@yandecode/core';\nimport { ApproxTokenCounter } from '@retrieval/chunking/tokens';\nimport { detectLanguage } from '@retrieval/chunking/languages';\nimport { createDefaultChunker } from '@retrieval/chunking/router';\nimport type { Chunk, Chunker } from '@retrieval/chunking/types';\nimport { extractImports } from '@retrieval/graph/import-extractor';\nimport { pagerank } from '@retrieval/graph/pagerank';\nimport { buildFileGraph } from '@retrieval/graph/symbol-graph';\nimport { identifiersOf } from '@retrieval/lexical/identifiers';\nimport { isProbablyBinary } from '@retrieval/scanner/rules';\nimport { listCandidatePaths } from '@retrieval/scanner/scanner';\nimport { extractSymbols, supportsSymbols, type CodeSymbol } from '@retrieval/symbols/extract';\nimport { CODE_INDEX_MIGRATIONS } from './schema';\n\n/** Text hits scoring below this fraction of the best hit are dropped (they rarely help). */\nconst RELATIVE_SCORE_FLOOR = 0.25;\n\n/** Question words that carry no meaning for matching symbol names. */\nconst STOPWORDS = new Set([\n 'the',\n 'and',\n 'for',\n 'how',\n 'does',\n 'what',\n 'where',\n 'why',\n 'when',\n 'which',\n 'who',\n 'are',\n 'was',\n 'with',\n 'from',\n 'into',\n 'that',\n 'this',\n 'there',\n 'then',\n 'than',\n 'can',\n 'should',\n 'returned',\n]);\n\n/** Light suffix stripping so \"hashed\", \"hashes\" and \"hash\" meet (both sides use it). */\nfunction stem(word: string): string {\n const w = word.toLowerCase();\n const stemmed = w.replace(/(ies|ied)$/, 'y').replace(/(ing|ed|es|s|e)$/, '');\n return stemmed.length >= 3 ? stemmed : w;\n}\n\n/** Space-delimited stems of every word in a name path: `UserRepository/findOrCreateBySso` \u2192 ` user repository find create sso `. */\nfunction nameTerms(namePath: string): string {\n const words = namePath.split(/[/.]/).flatMap((part) => splitIdentifier(part));\n return ` ${[...new Set(words.filter((w) => w.length >= 3).map(stem))].join(' ')} `;\n}\n\n/** Prose is indexed by the knowledge module; the code index skips it. */\nconst PROSE_LANGUAGES = new Set(['markdown']);\n\nexport interface SyncReport {\n added: number;\n changed: number;\n removed: number;\n unchanged: number;\n durationMs: number;\n /** Files indexed without symbols/imports because parsing failed (still searchable as text). */\n parseFailures: { path: string; error: string }[];\n}\n\nexport interface SymbolRow extends CodeSymbol {\n path: string;\n}\n\nexport interface Definition extends SymbolRow {\n body: string;\n}\n\nexport interface Reference {\n path: string;\n line: number;\n text: string;\n}\n\nexport interface TextHit {\n path: string;\n startLine: number;\n endLine: number;\n symbol: string | null;\n snippet: string;\n score: number;\n}\n\nexport interface FindSymbolOptions {\n substring?: boolean;\n path?: string;\n limit?: number;\n}\n\ninterface FileRow {\n path: string;\n size: number;\n mtime_ms: number;\n hash: string;\n}\n\ninterface SymbolDbRow {\n path: string;\n name: string;\n name_path: string;\n kind: string;\n start_line: number;\n end_line: number;\n signature: string;\n parent: string | null;\n}\n\nfunction toSymbol(row: SymbolDbRow): SymbolRow {\n return {\n path: row.path,\n name: row.name,\n namePath: row.name_path,\n kind: row.kind,\n startLine: row.start_line,\n endLine: row.end_line,\n signature: row.signature,\n parent: row.parent,\n };\n}\n\nfunction escapeLike(text: string): string {\n return text.replace(/[\\\\%_]/g, (c) => `\\\\${c}`);\n}\n\nfunction escapeRegExp(text: string): string {\n return text.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Structural index of a repository's source code (ADR-017): tree-sitter symbols with Serena-style\n * name paths, BM25 over code chunks, and an import graph ranked by PageRank. `sync()` stats every\n * candidate file and re-parses only the ones whose size/mtime/hash changed, so callers can run it\n * before every query and always see fresh results without any edit hook.\n */\nexport class CodeIndex {\n private readonly chunker: Chunker = createDefaultChunker(new ApproxTokenCounter());\n\n private constructor(\n private readonly db: Database,\n readonly root: string,\n ) {}\n\n static open(dbFile: string, root: string): CodeIndex {\n mkdirSync(dirname(dbFile), { recursive: true });\n return new CodeIndex(openModuleDb(dbFile, CODE_INDEX_MIGRATIONS), root);\n }\n\n close(): void {\n this.db.close();\n }\n\n stats(): { files: number; symbols: number; chunks: number } {\n const count = (table: string): number =>\n (this.db.prepare(`SELECT COUNT(*) AS n FROM ${table}`).get() as { n: number }).n;\n return { files: count('files'), symbols: count('symbols'), chunks: count('chunks') };\n }\n\n async sync(): Promise<SyncReport> {\n const started = Date.now();\n const known = new Map(\n (this.db.prepare('SELECT path, size, mtime_ms, hash FROM files').all() as FileRow[]).map(\n (r) => [r.path, r],\n ),\n );\n const report: SyncReport = {\n added: 0,\n changed: 0,\n removed: 0,\n unchanged: 0,\n durationMs: 0,\n parseFailures: [],\n };\n const seen = new Set<string>();\n const toIndex: {\n path: string;\n size: number;\n mtimeMs: number;\n hash: string;\n content: string;\n }[] = [];\n\n for (const path of listCandidatePaths(this.root)) {\n const language = detectLanguage(path);\n if (language !== null && PROSE_LANGUAGES.has(language)) continue;\n const abs = join(this.root, path);\n const st = statSync(abs, { throwIfNoEntry: false });\n if (!st) continue;\n const previous = known.get(path);\n if (previous && previous.size === st.size && previous.mtime_ms === Math.trunc(st.mtimeMs)) {\n seen.add(path);\n report.unchanged++;\n continue;\n }\n const buffer = readFileSync(abs);\n if (isProbablyBinary(buffer)) continue;\n seen.add(path);\n const hash = createHash('sha256').update(buffer).digest('hex');\n if (previous && previous.hash === hash) {\n this.db\n .prepare('UPDATE files SET size = ?, mtime_ms = ? WHERE path = ?')\n .run(st.size, Math.trunc(st.mtimeMs), path);\n report.unchanged++;\n continue;\n }\n if (previous) report.changed++;\n else report.added++;\n toIndex.push({\n path,\n size: st.size,\n mtimeMs: Math.trunc(st.mtimeMs),\n hash,\n content: buffer.toString('utf8'),\n });\n }\n const removed = [...known.keys()].filter((p) => !seen.has(p));\n report.removed = removed.length;\n\n // Sequential on purpose: parsing is CPU-bound, and many concurrent WASM parsers exhaust memory.\n const prepared: ((typeof toIndex)[number] & {\n language: string | null;\n symbols: CodeSymbol[];\n chunks: Chunk[];\n imports: string[];\n })[] = [];\n for (const file of toIndex) {\n const language = detectLanguage(file.path);\n let symbols: CodeSymbol[] = [];\n let imports: string[] = [];\n try {\n if (supportsSymbols(language)) symbols = await extractSymbols(file.content, language!);\n imports = await extractImports(file.content, language);\n } catch (error) {\n report.parseFailures.push({ path: file.path, error: (error as Error).message });\n }\n const chunks = await this.chunker.chunk(file.path, file.content, language);\n prepared.push({ ...file, language, symbols, chunks, imports });\n }\n\n const deleteFile = (path: string): void => {\n this.db.prepare('DELETE FROM symbols WHERE path = ?').run(path);\n this.db.prepare('DELETE FROM chunks_fts WHERE path = ?').run(path);\n this.db.prepare('DELETE FROM chunks WHERE path = ?').run(path);\n this.db.prepare('DELETE FROM imports WHERE path = ?').run(path);\n this.db.prepare('DELETE FROM files WHERE path = ?').run(path);\n };\n this.db.transaction(() => {\n for (const path of removed) deleteFile(path);\n const insertSymbol = this.db.prepare(\n 'INSERT INTO symbols (path, name, name_path, kind, start_line, end_line, signature, parent, name_terms) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)',\n );\n const insertChunk = this.db.prepare(\n 'INSERT INTO chunks (path, start_line, end_line, symbol, content) VALUES (?, ?, ?, ?, ?)',\n );\n const insertFts = this.db.prepare(\n 'INSERT INTO chunks_fts (rowid, body, idents, path) VALUES (?, ?, ?, ?)',\n );\n const insertImport = this.db.prepare('INSERT INTO imports (path, specifier) VALUES (?, ?)');\n for (const file of prepared) {\n deleteFile(file.path);\n this.db\n .prepare(\n 'INSERT INTO files (path, language, size, mtime_ms, hash, indexed_at) VALUES (?, ?, ?, ?, ?, ?)',\n )\n .run(\n file.path,\n file.language,\n file.size,\n file.mtimeMs,\n file.hash,\n new Date().toISOString(),\n );\n for (const s of file.symbols) {\n insertSymbol.run(\n file.path,\n s.name,\n s.namePath,\n s.kind,\n s.startLine,\n s.endLine,\n s.signature,\n s.parent,\n nameTerms(s.namePath),\n );\n }\n for (const c of file.chunks) {\n const id = insertChunk.run(\n file.path,\n c.startLine,\n c.endLine,\n c.symbol,\n c.content,\n ).lastInsertRowid;\n const idents = `${identifiersOf(c.content)} ${c.symbol ? identifiersOf(c.symbol) : ''}`;\n insertFts.run(\n id,\n c.content,\n idents,\n `${file.path} ${identifiersOf(basename(file.path))}`,\n );\n }\n for (const spec of new Set(file.imports)) insertImport.run(file.path, spec);\n }\n if (prepared.length > 0 || removed.length > 0) this.rebuildGraph();\n })();\n\n report.durationMs = Date.now() - started;\n return report;\n }\n\n private rebuildGraph(): void {\n const files = this.db.prepare('SELECT path, language FROM files').all() as {\n path: string;\n language: string | null;\n }[];\n const importsByPath = new Map<string, string[]>();\n for (const row of this.db.prepare('SELECT path, specifier FROM imports').all() as {\n path: string;\n specifier: string;\n }[]) {\n const list = importsByPath.get(row.path) ?? [];\n list.push(row.specifier);\n importsByPath.set(row.path, list);\n }\n const graph = buildFileGraph(\n files.map((f) => ({\n path: f.path,\n language: f.language,\n imports: importsByPath.get(f.path) ?? [],\n })),\n );\n const ranks = pagerank(graph);\n this.db.prepare('DELETE FROM edges').run();\n this.db.prepare('DELETE FROM centrality').run();\n const insertEdge = this.db.prepare('INSERT INTO edges (src, dst) VALUES (?, ?)');\n for (const [src, targets] of graph.edges) for (const dst of targets) insertEdge.run(src, dst);\n const insertRank = this.db.prepare('INSERT INTO centrality (path, score) VALUES (?, ?)');\n for (const [path, score] of ranks) insertRank.run(path, score);\n }\n\n findSymbols(pattern: string, options: FindSymbolOptions = {}): SymbolRow[] {\n const limit = options.limit ?? 20;\n const clauses: string[] = [];\n const params: unknown[] = [];\n if (pattern.includes('/')) {\n if (options.substring) {\n clauses.push(\"name_path LIKE ? ESCAPE '\\\\'\");\n params.push(`%${escapeLike(pattern)}%`);\n } else {\n clauses.push(\"(name_path = ? OR name_path LIKE ? ESCAPE '\\\\')\");\n params.push(pattern, `%/${escapeLike(pattern)}`);\n }\n } else if (options.substring) {\n clauses.push(\"name LIKE ? ESCAPE '\\\\'\");\n params.push(`%${escapeLike(pattern)}%`);\n } else {\n clauses.push('name = ? COLLATE NOCASE');\n params.push(pattern);\n }\n if (options.path) {\n clauses.push(\"(path = ? OR path LIKE ? ESCAPE '\\\\')\");\n params.push(options.path, `${escapeLike(options.path.replace(/\\/$/, ''))}/%`);\n }\n const rows = this.db\n .prepare(\n `SELECT s.* FROM symbols s LEFT JOIN centrality c ON c.path = s.path\n WHERE ${clauses.join(' AND ')}\n ORDER BY (s.name = ?) DESC, COALESCE(c.score, 0) DESC, s.path, s.start_line LIMIT ?`,\n )\n .all(...params, pattern, limit) as SymbolDbRow[];\n return rows.map(toSymbol);\n }\n\n /**\n * Symbols whose name shares at least `minMatches` words with a natural-language query\n * (\"how does SSO login create or find a user\" \u2192 `UserRepository/findOrCreateBySso`).\n */\n findSymbolsByTerms(\n query: string,\n options: { limit?: number; minMatches?: number } = {},\n ): SymbolRow[] {\n const terms = [\n ...new Set(\n (query.toLowerCase().match(/[a-z0-9]{3,}/g) ?? [])\n .filter((w) => !STOPWORDS.has(w))\n .map(stem),\n ),\n ];\n if (terms.length === 0) return [];\n const rows = this.db\n .prepare(\n `SELECT s.*, COALESCE(c.score, 0) AS centrality FROM symbols s LEFT JOIN centrality c ON c.path = s.path\n WHERE ${terms.map(() => \"instr(s.name_terms, ' ' || ? || ' ') > 0\").join(' OR ')}`,\n )\n .all(...terms) as (SymbolDbRow & { name_terms: string; centrality: number })[];\n return rows\n .map((row) => ({\n row,\n matches: terms.filter((t) => row.name_terms.includes(` ${t} `)).length,\n }))\n .filter((r) => r.matches >= (options.minMatches ?? 2))\n .sort(\n (a, b) =>\n b.matches - a.matches ||\n b.row.centrality - a.row.centrality ||\n a.row.name_path.length - b.row.name_path.length,\n )\n .slice(0, options.limit ?? 3)\n .map((r) => toSymbol(r.row));\n }\n\n outline(path: string): SymbolRow[] {\n return (\n this.db\n .prepare('SELECT * FROM symbols WHERE path = ? ORDER BY start_line, end_line DESC')\n .all(path) as SymbolDbRow[]\n ).map(toSymbol);\n }\n\n definition(namePath: string, path?: string): Definition | null {\n const symbol = this.findSymbols(namePath, path ? { path, limit: 1 } : { limit: 1 })[0];\n if (!symbol) return null;\n const lines = readFileSync(join(this.root, symbol.path), 'utf8').split('\\n');\n return { ...symbol, body: lines.slice(symbol.startLine - 1, symbol.endLine).join('\\n') };\n }\n\n /** Distinct file paths whose body matches a bare identifier (FTS), for reference scanning. */\n private pathsMatchingBody(identifier: string): string[] {\n if (!toFtsQuery(identifier)) return [];\n return (\n this.db\n .prepare('SELECT DISTINCT path FROM chunks_fts WHERE chunks_fts MATCH ?')\n .all(`body:\"${identifier.replace(/\"/g, '')}\"`) as { path: string }[]\n ).map((r) => r.path.split(' ')[0]!);\n }\n\n /**\n * Lines that mention the symbol's name as a whole identifier, outside its own definition.\n *\n * This is a lexical approximation (the precise path is `lsp_references`). To avoid grepping the\n * bare last token, a qualified name path is anchored to a real definition first \u2014 like Serena,\n * which resolves the symbol before finding references. An unresolvable qualified name returns\n * nothing rather than every occurrence of the method name, and when the name is qualified the\n * scan is narrowed to files related to the target (its definition files and files that mention\n * the qualifying class), which cuts false positives for common method names.\n */\n references(namePath: string, limit = 50): Reference[] {\n const name = namePath.split('/').pop()!;\n const qualifier = namePath.includes('/') ? namePath.split('/').slice(0, -1).pop()! : null;\n const definitions = this.findSymbols(namePath, { limit: 50 });\n // A qualified name we cannot resolve is not a symbol we can find references for: reporting\n // every line with the bare method name would be a guess, not a reference set.\n if (qualifier !== null && definitions.length === 0) return [];\n const query = toFtsQuery(name);\n if (!query) return [];\n let candidatePaths = this.pathsMatchingBody(name);\n if (qualifier !== null) {\n const related = new Set([\n ...definitions.map((d) => d.path),\n ...this.pathsMatchingBody(qualifier),\n ]);\n candidatePaths = candidatePaths.filter((p) => related.has(p));\n }\n const pattern = new RegExp(`\\\\b${escapeRegExp(name)}\\\\b`);\n const out: Reference[] = [];\n for (const path of [...new Set(candidatePaths)].sort()) {\n let lines: string[];\n try {\n lines = readFileSync(join(this.root, path), 'utf8').split('\\n');\n } catch {\n continue;\n }\n lines.forEach((text, i) => {\n const line = i + 1;\n const insideDefinition = definitions.some(\n (d) => d.path === path && line >= d.startLine && line <= d.endLine,\n );\n if (!insideDefinition && pattern.test(text) && out.length < limit) {\n out.push({ path, line, text: text.trim().slice(0, 200) });\n }\n });\n }\n return out;\n }\n\n searchText(query: string, limit = 8): TextHit[] {\n const fts = toFtsQuery(query);\n if (!fts) return [];\n const rows = this.db\n .prepare(\n `SELECT c.path, c.start_line, c.end_line, c.symbol,\n snippet(chunks_fts, 0, '', '', ' \u2026 ', 16) AS snippet,\n bm25(chunks_fts, 1.0, 1.5, 0.5) AS rank, COALESCE(k.score, 0) AS centrality\n FROM chunks_fts JOIN chunks c ON c.id = chunks_fts.rowid\n LEFT JOIN centrality k ON k.path = c.path\n WHERE chunks_fts MATCH ? ORDER BY rank LIMIT ?`,\n )\n .all(fts, limit * 4) as {\n path: string;\n start_line: number;\n end_line: number;\n symbol: string | null;\n snippet: string;\n rank: number;\n centrality: number;\n }[];\n const scored = rows\n .map((r) => ({ ...r, score: -r.rank * (1 + Math.min(r.centrality * 5, 0.5)) }))\n .sort((a, b) => b.score - a.score);\n // Adaptive precision: one row per file, and nothing far below the best match.\n const floor = (scored[0]?.score ?? 0) * RELATIVE_SCORE_FLOOR;\n const seenFiles = new Set<string>();\n const hits: TextHit[] = [];\n for (const row of scored) {\n if (row.score < floor || seenFiles.has(row.path)) continue;\n seenFiles.add(row.path);\n hits.push({\n path: row.path,\n startLine: row.start_line,\n endLine: row.end_line,\n symbol: row.symbol,\n snippet: row.snippet.replace(/\\s+/g, ' ').trim().slice(0, 140),\n score: row.score,\n });\n if (hits.length >= limit) break;\n }\n return hits;\n }\n\n /** Paths whose characters contain the query as a subsequence, best (tightest, shortest) first. */\n searchPaths(query: string, limit = 10): string[] {\n const needle = query.toLowerCase().replace(/\\s+/g, '');\n if (!needle) return [];\n const paths = (this.db.prepare('SELECT path FROM files').all() as { path: string }[]).map(\n (r) => r.path,\n );\n const scored: { path: string; score: number }[] = [];\n for (const path of paths) {\n const hay = path.toLowerCase();\n const base = basename(hay);\n if (hay.includes(needle)) {\n scored.push({ path, score: (base.includes(needle) ? 0 : 1000) + path.length });\n continue;\n }\n let from = 0;\n let first = -1;\n let last = -1;\n let ok = true;\n for (const ch of needle) {\n const at = hay.indexOf(ch, from);\n if (at < 0) {\n ok = false;\n break;\n }\n if (first < 0) first = at;\n last = at;\n from = at + 1;\n }\n if (ok) scored.push({ path, score: 2000 + (last - first) * 10 + path.length });\n }\n return scored\n .sort((a, b) => a.score - b.score || a.path.localeCompare(b.path))\n .slice(0, limit)\n .map((s) => s.path);\n }\n\n importersOf(path: string): string[] {\n return (\n this.db.prepare('SELECT src FROM edges WHERE dst = ? ORDER BY src').all(path) as {\n src: string;\n }[]\n ).map((r) => r.src);\n }\n\n importsOf(path: string): string[] {\n return (\n this.db.prepare('SELECT dst FROM edges WHERE src = ? ORDER BY dst').all(path) as {\n dst: string;\n }[]\n ).map((r) => r.dst);\n }\n\n /**\n * Aider-style repository map: files by import centrality with their top-level declarations,\n * cut at whole-file boundaries to fit `maxChars`. `focus` restricts to paths under a prefix.\n */\n repoMap(options: { maxChars: number; focus?: string }): string {\n const files = this.db\n .prepare(\n `SELECT f.path FROM files f LEFT JOIN centrality c ON c.path = f.path\n WHERE f.path LIKE ? ESCAPE '\\\\'\n ORDER BY COALESCE(c.score, 0) DESC, f.path`,\n )\n .all(`${escapeLike(options.focus ?? '')}%`) as { path: string }[];\n const topLevel = this.db.prepare(\n 'SELECT signature FROM symbols WHERE path = ? AND parent IS NULL ORDER BY start_line LIMIT 12',\n );\n const blocks: string[] = [];\n let used = 0;\n let omitted = 0;\n for (const { path } of files) {\n const signatures = (topLevel.all(path) as { signature: string }[]).map(\n (r) => ` ${r.signature}`,\n );\n const block = [path, ...signatures].join('\\n');\n if (used + block.length + 1 > options.maxChars - 60) {\n omitted++;\n continue;\n }\n blocks.push(block);\n used += block.length + 1;\n }\n if (omitted > 0) blocks.push(`\u2026 ${omitted} more file(s); narrow with focus=<dir>`);\n return blocks.join('\\n');\n }\n}\n", "export interface TokenCounter {\n countTokens(text: string): Promise<number>;\n}\n\n/** ~4 characters per token: good enough for chunk sizing, no tokenizer download. */\nexport class ApproxTokenCounter implements TokenCounter {\n countTokens(text: string): Promise<number> {\n return Promise.resolve(Math.ceil(text.length / 4));\n }\n}\n", "export interface Chunk {\n kind: string;\n symbol: string | null;\n startLine: number;\n endLine: number;\n content: string;\n}\n\nexport interface ChunkLimits {\n targetTokens: number;\n maxTokens: number;\n overlapTokens: number;\n}\n\nexport const DEFAULT_LIMITS: ChunkLimits = { targetTokens: 350, maxTokens: 450, overlapTokens: 50 };\n\nexport interface Chunker {\n chunk(path: string, content: string, language: string | null): Promise<Chunk[]>;\n}\n", "import type { TokenCounter } from './tokens';\nimport { DEFAULT_LIMITS, type Chunk, type ChunkLimits, type Chunker } from './types';\n\nconst FRAGMENT_CHARS = 1600;\n\nexport class LineChunker implements Chunker {\n constructor(\n private readonly counter: TokenCounter,\n private readonly limits: ChunkLimits = DEFAULT_LIMITS,\n ) {}\n\n chunk(_path: string, content: string, language: string | null): Promise<Chunk[]> {\n return this.chunkLines(content.split('\\n'), 1, language ?? 'text', null);\n }\n\n async chunkLines(\n lines: string[],\n firstLine: number,\n kind: string,\n symbol: string | null,\n ): Promise<Chunk[]> {\n const tokens = await Promise.all(lines.map((l) => this.counter.countTokens(l)));\n const out: Chunk[] = [];\n let current: number[] = [];\n let currentTokens = 0;\n\n const emit = (indices: number[]): void => {\n if (indices.length === 0) return;\n const text = indices.map((i) => lines[i] ?? '').join('\\n');\n if (text.trim().length === 0) return;\n out.push({\n kind,\n symbol,\n startLine: firstLine + indices[0]!,\n endLine: firstLine + indices[indices.length - 1]!,\n content: text,\n });\n };\n\n for (let i = 0; i < lines.length; i++) {\n const t = tokens[i] ?? 0;\n if (t > this.limits.maxTokens) {\n emit(current);\n current = [];\n currentTokens = 0;\n const line = lines[i] ?? '';\n for (let off = 0; off < line.length; off += FRAGMENT_CHARS) {\n out.push({\n kind: 'fragment',\n symbol,\n startLine: firstLine + i,\n endLine: firstLine + i,\n content: line.slice(off, off + FRAGMENT_CHARS),\n });\n }\n continue;\n }\n if (currentTokens + t > this.limits.targetTokens && current.length > 0) {\n emit(current);\n const overlap: number[] = [];\n let overlapTokens = 0;\n for (let j = current.length - 1; j >= 0; j--) {\n const idx = current[j]!;\n const lt = tokens[idx] ?? 0;\n if (overlapTokens + lt > this.limits.overlapTokens) break;\n overlap.unshift(idx);\n overlapTokens += lt;\n }\n current = overlap;\n currentTokens = overlapTokens;\n }\n current.push(i);\n currentTokens += t;\n }\n emit(current);\n return out;\n }\n}\n", "import type { TokenCounter } from './tokens';\nimport type { LineChunker } from './line-chunker';\nimport { DEFAULT_LIMITS, type Chunk, type ChunkLimits, type Chunker } from './types';\n\nconst HEADING = /^#{1,6}\\s+(.*)$/;\n\nexport class MarkdownChunker implements Chunker {\n constructor(\n private readonly counter: TokenCounter,\n private readonly line: LineChunker,\n private readonly limits: ChunkLimits = DEFAULT_LIMITS,\n ) {}\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async chunk(_path: string, content: string, _language: string | null): Promise<Chunk[]> {\n const lines = content.split('\\n');\n const sections: { symbol: string | null; start: number; end: number }[] = [];\n let current = { symbol: null as string | null, start: 0, end: -1 };\n for (let i = 0; i < lines.length; i++) {\n const m = HEADING.exec(lines[i] ?? '');\n if (m) {\n current.end = i - 1;\n if (current.end >= current.start) sections.push(current);\n current = { symbol: m[1]!.trim(), start: i, end: -1 };\n }\n }\n current.end = lines.length - 1;\n if (current.end >= current.start) sections.push(current);\n\n const out: Chunk[] = [];\n for (const s of sections) {\n const body = lines.slice(s.start, s.end + 1);\n if (body.join('\\n').trim().length === 0) continue;\n const tokens = await this.counter.countTokens(body.join('\\n'));\n if (tokens <= this.limits.maxTokens) {\n out.push({\n kind: 'section',\n symbol: s.symbol,\n startLine: s.start + 1,\n endLine: s.end + 1,\n content: body.join('\\n'),\n });\n } else {\n out.push(...(await this.line.chunkLines(body, s.start + 1, 'section', s.symbol)));\n }\n }\n return out;\n }\n}\n", "import type { TokenCounter } from './tokens';\nimport { extractUnits, supportsSymbols, type Unit } from '@retrieval/symbols/extract';\nimport type { LineChunker } from './line-chunker';\nimport { DEFAULT_LIMITS, type Chunk, type ChunkLimits, type Chunker } from './types';\n\nexport class TreeSitterChunker implements Chunker {\n constructor(\n private readonly counter: TokenCounter,\n private readonly line: LineChunker,\n private readonly limits: ChunkLimits = DEFAULT_LIMITS,\n ) {}\n\n supports(language: string | null): boolean {\n return supportsSymbols(language);\n }\n\n async chunk(_path: string, content: string, language: string | null): Promise<Chunk[]> {\n if (!this.supports(language)) throw new Error(`unsupported language ${String(language)}`);\n const units = await extractUnits(content, language!);\n const lines = content.split('\\n');\n\n const out: Chunk[] = [];\n let cursor = 0;\n for (const u of units) {\n if (u.startRow > cursor) out.push(...(await this.gap(lines, cursor, u.startRow - 1)));\n out.push(...(await this.unitChunks(lines, u)));\n cursor = Math.max(cursor, u.endRow + 1);\n }\n if (cursor <= lines.length - 1) out.push(...(await this.gap(lines, cursor, lines.length - 1)));\n return out.sort((a, b) => a.startLine - b.startLine || a.endLine - b.endLine);\n }\n\n private async gap(lines: string[], startRow: number, endRow: number): Promise<Chunk[]> {\n let start = startRow;\n let end = endRow;\n while (start <= end && (lines[start] ?? '').trim().length === 0) start++;\n while (end >= start && (lines[end] ?? '').trim().length === 0) end--;\n if (start > end) return [];\n const slice = lines.slice(start, end + 1);\n return this.line.chunkLines(slice, start + 1, 'module', null);\n }\n\n private async unitChunks(lines: string[], u: Unit): Promise<Chunk[]> {\n const text = lines.slice(u.startRow, u.endRow + 1).join('\\n');\n const tokens = await this.counter.countTokens(text);\n if (tokens <= this.limits.maxTokens) {\n return [\n {\n kind: u.kind,\n symbol: u.symbol,\n startLine: u.startRow + 1,\n endLine: u.endRow + 1,\n content: text,\n },\n ];\n }\n if (u.members.length === 0)\n return this.line.chunkLines(\n lines.slice(u.startRow, u.endRow + 1),\n u.startRow + 1,\n u.kind,\n u.symbol,\n );\n\n const out: Chunk[] = [];\n const covered = new Set<number>();\n for (const m of u.members) {\n for (let r = m.startRow; r <= m.endRow; r++) covered.add(r);\n const mText = lines.slice(m.startRow, m.endRow + 1).join('\\n');\n const mTokens = await this.counter.countTokens(mText);\n if (mTokens <= this.limits.maxTokens)\n out.push({\n kind: m.kind,\n symbol: m.symbol,\n startLine: m.startRow + 1,\n endLine: m.endRow + 1,\n content: mText,\n });\n else\n out.push(\n ...(await this.line.chunkLines(\n lines.slice(m.startRow, m.endRow + 1),\n m.startRow + 1,\n m.kind,\n m.symbol,\n )),\n );\n }\n const shellRows: number[] = [];\n for (let r = u.startRow; r <= u.endRow; r++) if (!covered.has(r)) shellRows.push(r);\n const shellLines = shellRows.map((r) => lines[r] ?? '');\n if (shellLines.some((l) => l.trim().length > 0)) {\n const first = shellRows[0]!;\n const shell = await this.line.chunkLines(shellLines, first + 1, u.kind, u.symbol);\n // shell rows are not contiguous; report the unit's full range for attribution\n out.push(...shell.map((c) => ({ ...c, startLine: u.startRow + 1, endLine: u.endRow + 1 })));\n }\n return out;\n }\n}\n", "import type { TokenCounter } from './tokens';\nimport { LineChunker } from './line-chunker';\nimport { MarkdownChunker } from './markdown-chunker';\nimport { TreeSitterChunker } from './tree-sitter-chunker';\nimport { DEFAULT_LIMITS, type Chunk, type ChunkLimits, type Chunker } from './types';\n\nexport class ChunkerRouter implements Chunker {\n constructor(\n private readonly treeSitter: TreeSitterChunker,\n private readonly markdown: MarkdownChunker,\n private readonly line: LineChunker,\n ) {}\n\n async chunk(path: string, content: string, language: string | null): Promise<Chunk[]> {\n if (language === 'markdown') return this.markdown.chunk(path, content, language);\n if (this.treeSitter.supports(language)) {\n try {\n return await this.treeSitter.chunk(path, content, language);\n } catch {\n return this.line.chunk(path, content, language);\n }\n }\n return this.line.chunk(path, content, language ?? 'text');\n }\n}\n\nexport function createDefaultChunker(\n counter: TokenCounter,\n limits: ChunkLimits = DEFAULT_LIMITS,\n): ChunkerRouter {\n const line = new LineChunker(counter, limits);\n return new ChunkerRouter(\n new TreeSitterChunker(counter, line, limits),\n new MarkdownChunker(counter, line, limits),\n line,\n );\n}\n", "import type Parser from 'web-tree-sitter';\nimport { createParser } from '@retrieval/chunking/parser-loader';\n\ntype Node = Parser.SyntaxNode;\n\nconst JS_LANGUAGES = new Set(['typescript', 'tsx', 'javascript']);\n\nfunction stripQuotes(text: string): string {\n return text.replace(/^['\"`]|['\"`]$/g, '');\n}\n\nfunction jsSpecifiers(root: Node): string[] {\n const out: string[] = [];\n for (const top of root.namedChildren) {\n if (top.type !== 'import_statement' && top.type !== 'export_statement') continue;\n const source = top.childForFieldName('source');\n if (source) out.push(stripQuotes(source.text));\n }\n return out;\n}\n\nfunction pythonSpecifiers(root: Node): string[] {\n const out: string[] = [];\n for (const top of root.namedChildren) {\n if (top.type === 'import_statement') {\n for (const child of top.namedChildren) {\n if (child.type === 'dotted_name') out.push(child.text);\n else if (child.type === 'aliased_import') {\n const dotted = child.namedChildren.find((c) => c.type === 'dotted_name');\n if (dotted) out.push(dotted.text);\n }\n }\n } else if (top.type === 'import_from_statement') {\n const moduleName = top.childForFieldName('module_name');\n if (moduleName) out.push(moduleName.text);\n }\n }\n return out;\n}\n\nexport async function extractImports(content: string, language: string | null): Promise<string[]> {\n if (language === null || !(JS_LANGUAGES.has(language) || language === 'python')) return [];\n const parser = await createParser(language);\n try {\n const tree = parser.parse(content);\n try {\n return JS_LANGUAGES.has(language)\n ? jsSpecifiers(tree.rootNode)\n : pythonSpecifiers(tree.rootNode);\n } finally {\n tree.delete();\n }\n } finally {\n parser.delete();\n }\n}\n", "import type { FileGraph } from './types';\n\nexport interface PageRankOptions {\n dampingFactor?: number;\n iterations?: number;\n}\n\nfunction adjacency(\n graph: FileGraph,\n nodes: readonly string[],\n): { outDegree: Map<string, number>; incoming: Map<string, string[]> } {\n const outDegree = new Map<string, number>();\n const incoming = new Map<string, string[]>(nodes.map((node) => [node, []]));\n for (const node of nodes) {\n const targets = [...(graph.edges.get(node) ?? [])];\n outDegree.set(node, targets.length);\n for (const target of targets) incoming.get(target)?.push(node);\n }\n return { outDegree, incoming };\n}\n\nexport function pagerank(graph: FileGraph, options: PageRankOptions = {}): Map<string, number> {\n const d = options.dampingFactor ?? 0.85;\n const iterations = options.iterations ?? 20;\n const nodes = [...graph.nodes];\n const n = nodes.length;\n if (n === 0) return new Map();\n\n const { outDegree, incoming } = adjacency(graph, nodes);\n\n let scores = new Map(nodes.map((node) => [node, 1 / n]));\n for (let iter = 0; iter < iterations; iter += 1) {\n const danglingSum = nodes\n .filter((node) => (outDegree.get(node) ?? 0) === 0)\n .reduce((sum, node) => sum + (scores.get(node) ?? 0), 0);\n const next = new Map<string, number>();\n for (const node of nodes) {\n let incomingSum = 0;\n for (const source of incoming.get(node) ?? []) {\n const degree = outDegree.get(source) ?? 0;\n if (degree > 0) incomingSum += (scores.get(source) ?? 0) / degree;\n }\n next.set(node, (1 - d) / n + d * (danglingSum / n + incomingSum));\n }\n scores = next;\n }\n return scores;\n}\n", "import { posix } from 'node:path';\nimport type { FileGraph, ImportedFile } from './types';\n\nconst JS_SUFFIXES = ['', '.ts', '.tsx', '.js', '.jsx'];\nconst JS_INDEX_SUFFIXES = ['/index.ts', '/index.tsx', '/index.js', '/index.jsx'];\nconst PY_SUFFIXES = ['', '.py', '/__init__.py'];\n\nfunction pythonSpecifierToRelativePath(specifier: string): string {\n const dots = /^\\.+/.exec(specifier)?.[0].length ?? 0;\n const rest = specifier.slice(dots).replace(/\\./g, '/');\n const prefix = dots <= 1 ? './' : '../'.repeat(dots - 1);\n return rest.length > 0 ? `${prefix}${rest}` : prefix.replace(/\\/$/, '') || '.';\n}\n\nfunction withoutJsExtension(path: string): string | null {\n const match = /\\.jsx?$/.exec(path);\n return match ? path.slice(0, -match[0].length) : null;\n}\n\nfunction resolveOne(\n fromPath: string,\n relativeSpecifier: string,\n known: Set<string>,\n): string | null {\n const base = posix.dirname(fromPath);\n const joined = posix.normalize(posix.join(base, relativeSpecifier));\n const suffixes = [...JS_SUFFIXES, ...JS_INDEX_SUFFIXES, ...PY_SUFFIXES];\n for (const suffix of suffixes) {\n const candidate = suffix ? `${joined}${suffix}` : joined;\n if (known.has(candidate)) return candidate;\n }\n // ESM-style TS imports write `./x.js` for a source file that is actually `x.ts` (compiled\n // output extension, not the source extension) \u2014 this is the dominant style in this very repo\n // (see packages/retrieval/src/chunking/router.ts). Try substituting the extension too.\n const withoutExt = withoutJsExtension(joined);\n if (withoutExt) {\n for (const candidate of [`${withoutExt}.ts`, `${withoutExt}.tsx`]) {\n if (known.has(candidate)) return candidate;\n }\n }\n return null;\n}\n\nfunction resolveSpecifier(\n fromPath: string,\n specifier: string,\n language: string | null,\n known: Set<string>,\n): string | null {\n if (language === 'python') {\n if (!specifier.startsWith('.')) return null;\n return resolveOne(fromPath, pythonSpecifierToRelativePath(specifier), known);\n }\n if (!specifier.startsWith('.')) return null;\n return resolveOne(fromPath, specifier, known);\n}\n\nexport function buildFileGraph(files: ImportedFile[]): FileGraph {\n const known = new Set(files.map((f) => f.path));\n const edges = new Map<string, Set<string>>();\n for (const file of files) {\n const targets = new Set<string>();\n for (const specifier of file.imports) {\n const resolved = resolveSpecifier(file.path, specifier, file.language, known);\n if (resolved && resolved !== file.path) targets.add(resolved);\n }\n edges.set(file.path, targets);\n }\n return { nodes: known, edges };\n}\n", "import { splitIdentifier } from '@yandecode/core';\n\nconst KEYWORDS = new Set([\n 'const',\n 'let',\n 'var',\n 'function',\n 'return',\n 'import',\n 'export',\n 'from',\n 'class',\n 'this',\n 'new',\n 'if',\n 'else',\n 'for',\n 'while',\n 'true',\n 'false',\n 'null',\n 'undefined',\n 'async',\n 'await',\n 'public',\n 'private',\n 'protected',\n 'static',\n 'void',\n 'string',\n 'number',\n 'boolean',\n 'def',\n 'self',\n 'pub',\n 'mut',\n 'impl',\n 'struct',\n 'enum',\n 'use',\n 'package',\n 'func',\n 'type',\n 'interface',\n 'extends',\n 'implements',\n 'default',\n 'switch',\n 'case',\n 'break',\n 'continue',\n 'try',\n 'catch',\n 'finally',\n 'throw',\n 'typeof',\n 'instanceof',\n]);\nconst MAX = 200;\n\nexport function identifiersOf(text: string): string {\n const out: string[] = [];\n const seen = new Set<string>();\n const push = (t: string): void => {\n if (t.length < 3 || KEYWORDS.has(t) || seen.has(t) || out.length >= MAX) return;\n seen.add(t);\n out.push(t);\n };\n for (const id of text.match(/[A-Za-z_][A-Za-z0-9_]*/g) ?? []) {\n push(id.toLowerCase());\n const parts = splitIdentifier(id);\n if (parts.length > 1) for (const p of parts) push(p);\n }\n return out.join(' ');\n}\n", "import { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { CONFIG_FILENAME } from '@yandecode/core';\nimport ignore, { type Ignore } from 'ignore';\n\nexport const DEFAULT_IGNORED_DIRS = [\n '.git',\n 'node_modules',\n 'dist',\n 'build',\n 'coverage',\n 'target',\n 'vendor',\n '.next',\n '.cache',\n '.yandecode',\n] as const;\n\nconst SECRET_PATTERNS: readonly string[] = [\n '.env',\n '.env.*',\n '*.pem',\n '*.key',\n 'id_rsa',\n 'id_ed25519',\n // Data/config files only: `secrets.ts` or `credentials.py` are source code and must stay indexed.\n ...['credentials', 'secrets'].flatMap((base) =>\n ['json', 'yml', 'yaml', 'toml', 'ini', 'env', 'txt'].map((ext) => `${base}.${ext}`),\n ),\n];\n\nexport const MAX_FILE_BYTES = 512 * 1024;\n\nexport function isProbablyBinary(buf: Buffer): boolean {\n return buf.subarray(0, 8192).includes(0);\n}\n\nexport function buildIgnore(root: string): Ignore {\n const ig = ignore();\n ig.add(DEFAULT_IGNORED_DIRS.map((dir) => `${dir}/`));\n ig.add([...SECRET_PATTERNS]);\n // The workspace's own config marker lives at the project root; it is workspace\n // metadata, not repository content, so it never belongs in the searchable index.\n ig.add(`/${CONFIG_FILENAME}`);\n const custom = join(root, '.yandecodeignore');\n if (existsSync(custom)) ig.add(readFileSync(custom, 'utf8'));\n return ig;\n}\n", "import { spawnSync } from 'node:child_process';\nimport { lstatSync, readdirSync, realpathSync, statSync } from 'node:fs';\nimport { join, relative, sep } from 'node:path';\nimport { buildIgnore, DEFAULT_IGNORED_DIRS, MAX_FILE_BYTES } from './rules';\n\nfunction toPosix(p: string): string {\n return p.split(sep).join('/');\n}\n\nfunction isInsideRoot(root: string, target: string): boolean {\n const rel = relative(root, target);\n return rel !== '' && !rel.startsWith('..') && !rel.startsWith(`..${sep}`);\n}\n\nfunction isGitRepo(root: string): boolean {\n const r = spawnSync('git', ['rev-parse', '--is-inside-work-tree'], {\n cwd: root,\n encoding: 'utf8',\n });\n return r.status === 0 && r.stdout.trim() === 'true';\n}\n\nfunction listViaGit(root: string): string[] {\n const r = spawnSync(\n 'git',\n ['-C', root, 'ls-files', '-z', '--cached', '--others', '--exclude-standard'],\n {\n encoding: 'utf8',\n maxBuffer: 64 * 1024 * 1024,\n },\n );\n return r.stdout\n .split('\\0')\n .filter((p) => p.length > 0)\n .map(toPosix);\n}\n\nfunction listViaWalk(root: string): string[] {\n const out: string[] = [];\n const stack = [root];\n while (stack.length > 0) {\n const dir = stack.pop() as string;\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n if (entry.isDirectory()) {\n if ((DEFAULT_IGNORED_DIRS as readonly string[]).includes(entry.name)) continue;\n stack.push(join(dir, entry.name));\n continue;\n }\n out.push(toPosix(relative(root, join(dir, entry.name))));\n }\n }\n return out;\n}\n\n/**\n * Repository-relative paths that pass ignore rules, are regular files inside the root and are\n * within the size limit. Does not read file contents (cheap enough to run on every query).\n */\nexport function listCandidatePaths(root: string): string[] {\n const raw = isGitRepo(root) ? listViaGit(root) : listViaWalk(root);\n const ig = buildIgnore(root);\n const kept: string[] = [];\n for (const relPath of ig.filter(raw)) {\n const absPath = join(root, relPath);\n const lst = lstatSync(absPath, { throwIfNoEntry: false });\n if (!lst) continue;\n if (lst.isSymbolicLink()) {\n let real: string;\n try {\n real = realpathSync(absPath);\n } catch {\n continue;\n }\n if (!isInsideRoot(root, real)) continue;\n }\n const st = statSync(absPath, { throwIfNoEntry: false });\n if (!st || !st.isFile()) continue;\n if (st.size > MAX_FILE_BYTES) continue;\n kept.push(relPath);\n }\n return kept;\n}\n", "/** Migrations for .yandecode/code.db; index i brings the schema to version i + 1. */\nexport const CODE_INDEX_MIGRATIONS: readonly string[] = [\n `\n CREATE TABLE files (\n path TEXT PRIMARY KEY,\n language TEXT,\n size INTEGER NOT NULL,\n mtime_ms INTEGER NOT NULL,\n hash TEXT NOT NULL,\n indexed_at TEXT NOT NULL\n );\n CREATE TABLE symbols (\n id INTEGER PRIMARY KEY,\n path TEXT NOT NULL,\n name TEXT NOT NULL,\n name_path TEXT NOT NULL,\n kind TEXT NOT NULL,\n start_line INTEGER NOT NULL,\n end_line INTEGER NOT NULL,\n signature TEXT NOT NULL,\n parent TEXT\n );\n CREATE INDEX symbols_name ON symbols (name COLLATE NOCASE);\n CREATE INDEX symbols_name_path ON symbols (name_path);\n CREATE INDEX symbols_path ON symbols (path);\n CREATE TABLE chunks (\n id INTEGER PRIMARY KEY,\n path TEXT NOT NULL,\n start_line INTEGER NOT NULL,\n end_line INTEGER NOT NULL,\n symbol TEXT,\n content TEXT NOT NULL\n );\n CREATE INDEX chunks_path ON chunks (path);\n CREATE VIRTUAL TABLE chunks_fts USING fts5 (body, idents, path, tokenize = 'porter unicode61');\n CREATE TABLE imports (path TEXT NOT NULL, specifier TEXT NOT NULL);\n CREATE INDEX imports_path ON imports (path);\n CREATE TABLE edges (src TEXT NOT NULL, dst TEXT NOT NULL);\n CREATE INDEX edges_dst ON edges (dst);\n CREATE INDEX edges_src ON edges (src);\n CREATE TABLE centrality (path TEXT PRIMARY KEY, score REAL NOT NULL);\n `,\n // v2: split symbol-name words (findOrCreateBySso \u2192 \" find or create by sso \") for\n // natural-language symbol matching; clearing files forces a full re-index to fill them.\n `\n ALTER TABLE symbols ADD COLUMN name_terms TEXT NOT NULL DEFAULT '';\n DELETE FROM files;\n DELETE FROM symbols;\n DELETE FROM chunks;\n DELETE FROM chunks_fts;\n DELETE FROM imports;\n `,\n];\n"],
5
+ "mappings": "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",
6
+ "names": ["name", "require", "readFileSync", "statSync", "basename", "join", "ignore", "join", "join", "join", "statSync", "readFileSync", "basename", "name"]
7
+ }
@@ -0,0 +1,120 @@
1
+ import { createRequire as __yandecodeCreateRequire } from 'node:module';
2
+ const require = __yandecodeCreateRequire(import.meta.url);
3
+
4
+ // packages/cli/src/shared/digest.ts
5
+ var SIGNAL = /(errors?|exception|fail(ed|ure|ing|s)?|panic|traceback|fatal|assert(ion)?|denied|refused|timed? ?out)\b|✗|×/i;
6
+ var MAX_LINE_CHARS = 300;
7
+ function numbered(lines, index) {
8
+ const line = lines[index] ?? "";
9
+ const clipped = line.length > MAX_LINE_CHARS ? `${line.slice(0, MAX_LINE_CHARS)}\u2026` : line;
10
+ return `${index + 1}: ${clipped}`;
11
+ }
12
+ function render(lines, signals, plan) {
13
+ const head = Array.from({ length: Math.min(plan.head, lines.length) }, (_, i) => i);
14
+ const tailStart = Math.max(head.length, lines.length - plan.tail);
15
+ const tail = Array.from({ length: lines.length - tailStart }, (_, i) => tailStart + i);
16
+ const edges = /* @__PURE__ */ new Set([...head, ...tail]);
17
+ const middle = signals.filter((i) => !edges.has(i)).slice(0, plan.signal);
18
+ const blocks = [`[lines 1-${head.length}]`, ...head.map((i) => numbered(lines, i))];
19
+ if (middle.length > 0) {
20
+ blocks.push(
21
+ `[${middle.length} notable line(s) in between]`,
22
+ ...middle.map((i) => numbered(lines, i))
23
+ );
24
+ }
25
+ if (tail.length > 0) {
26
+ blocks.push(`[lines ${tailStart + 1}-${lines.length}]`, ...tail.map((i) => numbered(lines, i)));
27
+ }
28
+ return { text: blocks.join("\n"), shown: head.length + middle.length + tail.length };
29
+ }
30
+ function shrink(plan) {
31
+ if (plan.signal > 4) return { ...plan, signal: Math.ceil(plan.signal / 2) };
32
+ if (plan.tail > 8) return { ...plan, tail: plan.tail - 4 };
33
+ if (plan.head > 3) return { ...plan, head: plan.head - 2 };
34
+ if (plan.signal > 0) return { ...plan, signal: plan.signal - 1 };
35
+ if (plan.tail > 2) return { ...plan, tail: plan.tail - 2 };
36
+ return null;
37
+ }
38
+ function digest(output, options) {
39
+ if (output.length <= options.maxChars) return { text: output, omittedLines: 0 };
40
+ const lines = output.split("\n");
41
+ const signals = [
42
+ .../* @__PURE__ */ new Set([
43
+ ...options.focus ?? [],
44
+ ...lines.flatMap((line, i) => SIGNAL.test(line) ? [i] : [])
45
+ ])
46
+ ].sort((a, b) => a - b);
47
+ let plan = { head: 10, signal: 40, tail: 30 };
48
+ let result = render(lines, signals, plan);
49
+ while (result.text.length > options.maxChars && (plan = shrink(plan)) !== null) {
50
+ result = render(lines, signals, plan);
51
+ }
52
+ const text = result.text.length > options.maxChars ? `${result.text.slice(0, options.maxChars - 1)}\u2026` : result.text;
53
+ return { text, omittedLines: lines.length - result.shown };
54
+ }
55
+
56
+ // packages/cli/src/shared/exec.ts
57
+ import { spawn } from "node:child_process";
58
+ function execShell(command, options) {
59
+ const started = Date.now();
60
+ return new Promise((resolve) => {
61
+ const child = spawn(command, {
62
+ cwd: options.cwd,
63
+ shell: true,
64
+ stdio: ["ignore", "pipe", "pipe"],
65
+ detached: process.platform !== "win32"
66
+ });
67
+ const killTree = (signal) => {
68
+ try {
69
+ if (process.platform === "win32" || child.pid === void 0) child.kill(signal);
70
+ else process.kill(-child.pid, signal);
71
+ } catch {
72
+ }
73
+ };
74
+ const chunks = [];
75
+ let kept = 0;
76
+ let truncatedBytes = 0;
77
+ let timedOut = false;
78
+ const collect = (chunk) => {
79
+ const room = options.maxBytes - kept;
80
+ if (room > 0) {
81
+ const part = chunk.length <= room ? chunk : chunk.subarray(0, room);
82
+ chunks.push(part);
83
+ kept += part.length;
84
+ }
85
+ truncatedBytes += Math.max(0, chunk.length - Math.max(0, room));
86
+ };
87
+ child.stdout.on("data", collect);
88
+ child.stderr.on("data", collect);
89
+ const timer = setTimeout(() => {
90
+ timedOut = true;
91
+ killTree("SIGTERM");
92
+ setTimeout(() => {
93
+ killTree("SIGKILL");
94
+ }, 2e3).unref();
95
+ }, options.timeoutMs);
96
+ const finish = (exitCode, extra = "") => {
97
+ clearTimeout(timer);
98
+ resolve({
99
+ output: Buffer.concat(chunks).toString("utf8") + extra,
100
+ exitCode,
101
+ durationMs: Date.now() - started,
102
+ timedOut,
103
+ truncatedBytes
104
+ });
105
+ };
106
+ child.on("error", (error) => {
107
+ finish(null, `
108
+ [failed to start: ${error.message}]`);
109
+ });
110
+ child.on("close", (code) => {
111
+ finish(code);
112
+ });
113
+ });
114
+ }
115
+
116
+ export {
117
+ digest,
118
+ execShell
119
+ };
120
+ //# sourceMappingURL=chunk-6J5CZVCJ.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/shared/digest.ts", "../../src/shared/exec.ts"],
4
+ "sourcesContent": ["/**\n * Lines that usually explain a failure. No leading \\b: camelCase names such as\n * `AssertionError` or `TypeError` must match too.\n */\nconst SIGNAL =\n /(errors?|exception|fail(ed|ure|ing|s)?|panic|traceback|fatal|assert(ion)?|denied|refused|timed? ?out)\\b|\u2717|\u00D7/i;\nconst MAX_LINE_CHARS = 300;\n\nexport interface Digest {\n text: string;\n omittedLines: number;\n}\n\nexport interface DigestOptions {\n maxChars: number;\n /** Extra line numbers (0-based) to keep, e.g. search hits for the caller's intent. */\n focus?: readonly number[];\n}\n\ninterface Plan {\n head: number;\n signal: number;\n tail: number;\n}\n\nfunction numbered(lines: readonly string[], index: number): string {\n const line = lines[index] ?? '';\n const clipped = line.length > MAX_LINE_CHARS ? `${line.slice(0, MAX_LINE_CHARS)}\u2026` : line;\n return `${index + 1}: ${clipped}`;\n}\n\nfunction render(\n lines: readonly string[],\n signals: readonly number[],\n plan: Plan,\n): { text: string; shown: number } {\n const head = Array.from({ length: Math.min(plan.head, lines.length) }, (_, i) => i);\n const tailStart = Math.max(head.length, lines.length - plan.tail);\n const tail = Array.from({ length: lines.length - tailStart }, (_, i) => tailStart + i);\n const edges = new Set([...head, ...tail]);\n const middle = signals.filter((i) => !edges.has(i)).slice(0, plan.signal);\n const blocks = [`[lines 1-${head.length}]`, ...head.map((i) => numbered(lines, i))];\n if (middle.length > 0) {\n blocks.push(\n `[${middle.length} notable line(s) in between]`,\n ...middle.map((i) => numbered(lines, i)),\n );\n }\n if (tail.length > 0) {\n blocks.push(`[lines ${tailStart + 1}-${lines.length}]`, ...tail.map((i) => numbered(lines, i)));\n }\n return { text: blocks.join('\\n'), shown: head.length + middle.length + tail.length };\n}\n\nfunction shrink(plan: Plan): Plan | null {\n if (plan.signal > 4) return { ...plan, signal: Math.ceil(plan.signal / 2) };\n if (plan.tail > 8) return { ...plan, tail: plan.tail - 4 };\n if (plan.head > 3) return { ...plan, head: plan.head - 2 };\n if (plan.signal > 0) return { ...plan, signal: plan.signal - 1 };\n if (plan.tail > 2) return { ...plan, tail: plan.tail - 2 };\n return null;\n}\n\n/**\n * Condenses long output to what usually matters \u2014 the start, the end, and lines that look like\n * failures (plus caller-chosen focus lines) \u2014 numbered so the caller can fetch exact ranges later.\n * Output that already fits is returned verbatim: a digest must never cost more than the original.\n */\nexport function digest(output: string, options: DigestOptions): Digest {\n if (output.length <= options.maxChars) return { text: output, omittedLines: 0 };\n const lines = output.split('\\n');\n const signals = [\n ...new Set([\n ...(options.focus ?? []),\n ...lines.flatMap((line, i) => (SIGNAL.test(line) ? [i] : [])),\n ]),\n ].sort((a, b) => a - b);\n let plan: Plan | null = { head: 10, signal: 40, tail: 30 };\n let result = render(lines, signals, plan);\n while (result.text.length > options.maxChars && (plan = shrink(plan)) !== null) {\n result = render(lines, signals, plan);\n }\n const text =\n result.text.length > options.maxChars\n ? `${result.text.slice(0, options.maxChars - 1)}\u2026`\n : result.text;\n return { text, omittedLines: lines.length - result.shown };\n}\n", "import { spawn } from 'node:child_process';\n\nexport interface ExecResult {\n output: string;\n exitCode: number | null;\n durationMs: number;\n timedOut: boolean;\n truncatedBytes: number;\n}\n\n/**\n * Runs a shell command capturing stdout and stderr interleaved in arrival order, with a byte cap\n * (the rest is counted, not kept) and a timeout that escalates SIGTERM \u2192 SIGKILL.\n */\nexport function execShell(\n command: string,\n options: { cwd: string; timeoutMs: number; maxBytes: number },\n): Promise<ExecResult> {\n const started = Date.now();\n return new Promise((resolve) => {\n // Own process group (POSIX), so a timeout kills the shell *and* everything it started;\n // killing only the shell leaves children holding the pipes open.\n const child = spawn(command, {\n cwd: options.cwd,\n shell: true,\n stdio: ['ignore', 'pipe', 'pipe'],\n detached: process.platform !== 'win32',\n });\n const killTree = (signal: NodeJS.Signals): void => {\n try {\n if (process.platform === 'win32' || child.pid === undefined) child.kill(signal);\n else process.kill(-child.pid, signal);\n } catch {\n // Already gone.\n }\n };\n const chunks: Buffer[] = [];\n let kept = 0;\n let truncatedBytes = 0;\n let timedOut = false;\n const collect = (chunk: Buffer): void => {\n const room = options.maxBytes - kept;\n if (room > 0) {\n const part = chunk.length <= room ? chunk : chunk.subarray(0, room);\n chunks.push(part);\n kept += part.length;\n }\n truncatedBytes += Math.max(0, chunk.length - Math.max(0, room));\n };\n child.stdout.on('data', collect);\n child.stderr.on('data', collect);\n const timer = setTimeout(() => {\n timedOut = true;\n killTree('SIGTERM');\n setTimeout(() => {\n killTree('SIGKILL');\n }, 2_000).unref();\n }, options.timeoutMs);\n const finish = (exitCode: number | null, extra = ''): void => {\n clearTimeout(timer);\n resolve({\n output: Buffer.concat(chunks).toString('utf8') + extra,\n exitCode,\n durationMs: Date.now() - started,\n timedOut,\n truncatedBytes,\n });\n };\n child.on('error', (error) => {\n finish(null, `\\n[failed to start: ${error.message}]`);\n });\n child.on('close', (code) => {\n finish(code);\n });\n });\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }