@j0hanz/filesystem-context-mcp 1.1.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (305) hide show
  1. package/README.md +106 -29
  2. package/dist/__tests__/lib/errors.test.js +3 -23
  3. package/dist/__tests__/lib/errors.test.js.map +1 -1
  4. package/dist/__tests__/lib/file-operations.test.js +34 -0
  5. package/dist/__tests__/lib/file-operations.test.js.map +1 -1
  6. package/dist/__tests__/lib/path-validation.test.js +8 -0
  7. package/dist/__tests__/lib/path-validation.test.js.map +1 -1
  8. package/dist/__tests__/schemas/validators.test.js +101 -122
  9. package/dist/__tests__/schemas/validators.test.js.map +1 -1
  10. package/dist/__tests__/security/filesystem-boundary.test.js +1 -1
  11. package/dist/__tests__/security/filesystem-boundary.test.js.map +1 -1
  12. package/dist/config/types.d.ts +1 -85
  13. package/dist/config/types.d.ts.map +1 -1
  14. package/dist/config/types.js +0 -2
  15. package/dist/config/types.js.map +1 -1
  16. package/dist/index.js +3 -3
  17. package/dist/index.js.map +1 -1
  18. package/dist/instructions.md +1 -2
  19. package/dist/lib/constants.d.ts +3 -1
  20. package/dist/lib/constants.d.ts.map +1 -1
  21. package/dist/lib/constants.js +73 -259
  22. package/dist/lib/constants.js.map +1 -1
  23. package/dist/lib/errors.d.ts +25 -3
  24. package/dist/lib/errors.d.ts.map +1 -1
  25. package/dist/lib/errors.js +4 -94
  26. package/dist/lib/errors.js.map +1 -1
  27. package/dist/lib/file-operations/analyze-directory.d.ts +8 -0
  28. package/dist/lib/file-operations/analyze-directory.d.ts.map +1 -0
  29. package/dist/lib/file-operations/analyze-directory.js +117 -0
  30. package/dist/lib/file-operations/analyze-directory.js.map +1 -0
  31. package/dist/lib/file-operations/directory-helpers.d.ts +35 -0
  32. package/dist/lib/file-operations/directory-helpers.d.ts.map +1 -0
  33. package/dist/lib/file-operations/directory-helpers.js +136 -0
  34. package/dist/lib/file-operations/directory-helpers.js.map +1 -0
  35. package/dist/lib/file-operations/directory-items.d.ts +20 -0
  36. package/dist/lib/file-operations/directory-items.d.ts.map +1 -0
  37. package/dist/lib/file-operations/directory-items.js +85 -0
  38. package/dist/lib/file-operations/directory-items.js.map +1 -0
  39. package/dist/lib/file-operations/directory-iteration.d.ts +17 -0
  40. package/dist/lib/file-operations/directory-iteration.d.ts.map +1 -0
  41. package/dist/lib/file-operations/directory-iteration.js +55 -0
  42. package/dist/lib/file-operations/directory-iteration.js.map +1 -0
  43. package/dist/lib/file-operations/directory-tree.d.ts +9 -0
  44. package/dist/lib/file-operations/directory-tree.d.ts.map +1 -0
  45. package/dist/lib/file-operations/directory-tree.js +175 -0
  46. package/dist/lib/file-operations/directory-tree.js.map +1 -0
  47. package/dist/lib/file-operations/file-info.d.ts +3 -0
  48. package/dist/lib/file-operations/file-info.d.ts.map +1 -0
  49. package/dist/lib/file-operations/file-info.js +56 -0
  50. package/dist/lib/file-operations/file-info.js.map +1 -0
  51. package/dist/lib/file-operations/list-directory.d.ts +10 -0
  52. package/dist/lib/file-operations/list-directory.d.ts.map +1 -0
  53. package/dist/lib/file-operations/list-directory.js +189 -0
  54. package/dist/lib/file-operations/list-directory.js.map +1 -0
  55. package/dist/lib/file-operations/pattern-complexity.d.ts +16 -0
  56. package/dist/lib/file-operations/pattern-complexity.d.ts.map +1 -0
  57. package/dist/lib/file-operations/pattern-complexity.js +86 -0
  58. package/dist/lib/file-operations/pattern-complexity.js.map +1 -0
  59. package/dist/lib/file-operations/pattern-validator.d.ts +15 -0
  60. package/dist/lib/file-operations/pattern-validator.d.ts.map +1 -0
  61. package/dist/lib/file-operations/pattern-validator.js +69 -0
  62. package/dist/lib/file-operations/pattern-validator.js.map +1 -0
  63. package/dist/lib/file-operations/read-media-file.d.ts +5 -0
  64. package/dist/lib/file-operations/read-media-file.d.ts.map +1 -0
  65. package/dist/lib/file-operations/read-media-file.js +31 -0
  66. package/dist/lib/file-operations/read-media-file.js.map +1 -0
  67. package/dist/lib/file-operations/read-multiple-files.d.ts +16 -0
  68. package/dist/lib/file-operations/read-multiple-files.d.ts.map +1 -0
  69. package/dist/lib/file-operations/read-multiple-files.js +100 -0
  70. package/dist/lib/file-operations/read-multiple-files.js.map +1 -0
  71. package/dist/lib/file-operations/search-content.d.ts +18 -0
  72. package/dist/lib/file-operations/search-content.d.ts.map +1 -0
  73. package/dist/lib/file-operations/search-content.js +436 -0
  74. package/dist/lib/file-operations/search-content.js.map +1 -0
  75. package/dist/lib/file-operations/search-files.d.ts +11 -0
  76. package/dist/lib/file-operations/search-files.d.ts.map +1 -0
  77. package/dist/lib/file-operations/search-files.js +143 -0
  78. package/dist/lib/file-operations/search-files.js.map +1 -0
  79. package/dist/lib/file-operations/sorting.d.ts +12 -0
  80. package/dist/lib/file-operations/sorting.d.ts.map +1 -0
  81. package/dist/lib/file-operations/sorting.js +24 -0
  82. package/dist/lib/file-operations/sorting.js.map +1 -0
  83. package/dist/lib/file-operations.d.ts +9 -57
  84. package/dist/lib/file-operations.d.ts.map +1 -1
  85. package/dist/lib/file-operations.js +9 -773
  86. package/dist/lib/file-operations.js.map +1 -1
  87. package/dist/lib/fs-helpers/binary-detect.d.ts +3 -0
  88. package/dist/lib/fs-helpers/binary-detect.d.ts.map +1 -0
  89. package/dist/lib/fs-helpers/binary-detect.js +54 -0
  90. package/dist/lib/fs-helpers/binary-detect.js.map +1 -0
  91. package/dist/lib/fs-helpers/concurrency.d.ts +11 -0
  92. package/dist/lib/fs-helpers/concurrency.d.ts.map +1 -0
  93. package/dist/lib/fs-helpers/concurrency.js +95 -0
  94. package/dist/lib/fs-helpers/concurrency.js.map +1 -0
  95. package/dist/lib/fs-helpers/fs-utils.d.ts +5 -0
  96. package/dist/lib/fs-helpers/fs-utils.d.ts.map +1 -0
  97. package/dist/lib/fs-helpers/fs-utils.js +13 -0
  98. package/dist/lib/fs-helpers/fs-utils.js.map +1 -0
  99. package/dist/lib/fs-helpers/readers/head-file.d.ts +2 -0
  100. package/dist/lib/fs-helpers/readers/head-file.d.ts.map +1 -0
  101. package/dist/lib/fs-helpers/readers/head-file.js +73 -0
  102. package/dist/lib/fs-helpers/readers/head-file.js.map +1 -0
  103. package/dist/lib/fs-helpers/readers/line-range.d.ts +7 -0
  104. package/dist/lib/fs-helpers/readers/line-range.d.ts.map +1 -0
  105. package/dist/lib/fs-helpers/readers/line-range.js +46 -0
  106. package/dist/lib/fs-helpers/readers/line-range.js.map +1 -0
  107. package/dist/lib/fs-helpers/readers/read-file.d.ts +16 -0
  108. package/dist/lib/fs-helpers/readers/read-file.d.ts.map +1 -0
  109. package/dist/lib/fs-helpers/readers/read-file.js +87 -0
  110. package/dist/lib/fs-helpers/readers/read-file.js.map +1 -0
  111. package/dist/lib/fs-helpers/readers/stream-lines.d.ts +7 -0
  112. package/dist/lib/fs-helpers/readers/stream-lines.d.ts.map +1 -0
  113. package/dist/lib/fs-helpers/readers/stream-lines.js +61 -0
  114. package/dist/lib/fs-helpers/readers/stream-lines.js.map +1 -0
  115. package/dist/lib/fs-helpers/readers/tail-file.d.ts +2 -0
  116. package/dist/lib/fs-helpers/readers/tail-file.d.ts.map +1 -0
  117. package/dist/lib/fs-helpers/readers/tail-file.js +98 -0
  118. package/dist/lib/fs-helpers/readers/tail-file.js.map +1 -0
  119. package/dist/lib/fs-helpers/readers/utf8.d.ts +3 -0
  120. package/dist/lib/fs-helpers/readers/utf8.d.ts.map +1 -0
  121. package/dist/lib/fs-helpers/readers/utf8.js +22 -0
  122. package/dist/lib/fs-helpers/readers/utf8.js.map +1 -0
  123. package/dist/lib/fs-helpers/readers.d.ts +4 -0
  124. package/dist/lib/fs-helpers/readers.d.ts.map +1 -0
  125. package/dist/lib/fs-helpers/readers.js +4 -0
  126. package/dist/lib/fs-helpers/readers.js.map +1 -0
  127. package/dist/lib/fs-helpers.d.ts +4 -25
  128. package/dist/lib/fs-helpers.d.ts.map +1 -1
  129. package/dist/lib/fs-helpers.js +4 -327
  130. package/dist/lib/fs-helpers.js.map +1 -1
  131. package/dist/lib/path-validation/allowed-directories.d.ts +9 -0
  132. package/dist/lib/path-validation/allowed-directories.d.ts.map +1 -0
  133. package/dist/lib/path-validation/allowed-directories.js +94 -0
  134. package/dist/lib/path-validation/allowed-directories.js.map +1 -0
  135. package/dist/lib/path-validation/errors.d.ts +5 -0
  136. package/dist/lib/path-validation/errors.d.ts.map +1 -0
  137. package/dist/lib/path-validation/errors.js +33 -0
  138. package/dist/lib/path-validation/errors.js.map +1 -0
  139. package/dist/lib/path-validation/roots.d.ts +3 -0
  140. package/dist/lib/path-validation/roots.d.ts.map +1 -0
  141. package/dist/lib/path-validation/roots.js +49 -0
  142. package/dist/lib/path-validation/roots.js.map +1 -0
  143. package/dist/lib/path-validation/validators.d.ts +9 -0
  144. package/dist/lib/path-validation/validators.d.ts.map +1 -0
  145. package/dist/lib/path-validation/validators.js +70 -0
  146. package/dist/lib/path-validation/validators.js.map +1 -0
  147. package/dist/lib/path-validation.d.ts +3 -7
  148. package/dist/lib/path-validation.d.ts.map +1 -1
  149. package/dist/lib/path-validation.js +3 -141
  150. package/dist/lib/path-validation.js.map +1 -1
  151. package/dist/lib/performance/monitor.d.ts +25 -0
  152. package/dist/lib/performance/monitor.d.ts.map +1 -0
  153. package/dist/lib/performance/monitor.js +84 -0
  154. package/dist/lib/performance/monitor.js.map +1 -0
  155. package/dist/schemas/input-helpers.d.ts +27 -0
  156. package/dist/schemas/input-helpers.d.ts.map +1 -0
  157. package/dist/schemas/input-helpers.js +176 -0
  158. package/dist/schemas/input-helpers.js.map +1 -0
  159. package/dist/schemas/inputs.d.ts +14 -7
  160. package/dist/schemas/inputs.d.ts.map +1 -1
  161. package/dist/schemas/inputs.js +56 -228
  162. package/dist/schemas/inputs.js.map +1 -1
  163. package/dist/schemas/output-helpers.d.ts +24 -0
  164. package/dist/schemas/output-helpers.d.ts.map +1 -0
  165. package/dist/schemas/output-helpers.js +13 -0
  166. package/dist/schemas/output-helpers.js.map +1 -0
  167. package/dist/schemas/outputs.d.ts +476 -42
  168. package/dist/schemas/outputs.d.ts.map +1 -1
  169. package/dist/schemas/outputs.js +26 -41
  170. package/dist/schemas/outputs.js.map +1 -1
  171. package/dist/server.d.ts +9 -1
  172. package/dist/server.d.ts.map +1 -1
  173. package/dist/server.js +29 -45
  174. package/dist/server.js.map +1 -1
  175. package/dist/tools/analyze-directory.d.ts.map +1 -1
  176. package/dist/tools/analyze-directory.js +115 -53
  177. package/dist/tools/analyze-directory.js.map +1 -1
  178. package/dist/tools/directory-tree.d.ts.map +1 -1
  179. package/dist/tools/directory-tree.js +86 -49
  180. package/dist/tools/directory-tree.js.map +1 -1
  181. package/dist/tools/get-file-info.d.ts.map +1 -1
  182. package/dist/tools/get-file-info.js +71 -37
  183. package/dist/tools/get-file-info.js.map +1 -1
  184. package/dist/tools/list-allowed-dirs.d.ts.map +1 -1
  185. package/dist/tools/list-allowed-dirs.js +48 -35
  186. package/dist/tools/list-allowed-dirs.js.map +1 -1
  187. package/dist/tools/list-directory.d.ts.map +1 -1
  188. package/dist/tools/list-directory.js +129 -58
  189. package/dist/tools/list-directory.js.map +1 -1
  190. package/dist/tools/read-file.d.ts.map +1 -1
  191. package/dist/tools/read-file.js +70 -56
  192. package/dist/tools/read-file.js.map +1 -1
  193. package/dist/tools/read-media-file.d.ts.map +1 -1
  194. package/dist/tools/read-media-file.js +39 -41
  195. package/dist/tools/read-media-file.js.map +1 -1
  196. package/dist/tools/read-multiple-files.d.ts.map +1 -1
  197. package/dist/tools/read-multiple-files.js +58 -50
  198. package/dist/tools/read-multiple-files.js.map +1 -1
  199. package/dist/tools/search-content.d.ts.map +1 -1
  200. package/dist/tools/search-content.js +148 -89
  201. package/dist/tools/search-content.js.map +1 -1
  202. package/dist/tools/search-files.d.ts.map +1 -1
  203. package/dist/tools/search-files.js +123 -50
  204. package/dist/tools/search-files.js.map +1 -1
  205. package/dist/tools/tool-response.d.ts +9 -0
  206. package/dist/tools/tool-response.d.ts.map +1 -0
  207. package/dist/tools/tool-response.js +7 -0
  208. package/dist/tools/tool-response.js.map +1 -0
  209. package/package.json +2 -1
  210. package/dist/__tests__/errors.test.d.ts +0 -2
  211. package/dist/__tests__/errors.test.d.ts.map +0 -1
  212. package/dist/__tests__/errors.test.js +0 -88
  213. package/dist/__tests__/errors.test.js.map +0 -1
  214. package/dist/__tests__/file-operations.test.d.ts +0 -2
  215. package/dist/__tests__/file-operations.test.d.ts.map +0 -1
  216. package/dist/__tests__/file-operations.test.js +0 -230
  217. package/dist/__tests__/file-operations.test.js.map +0 -1
  218. package/dist/__tests__/lib/formatters.test.d.ts +0 -2
  219. package/dist/__tests__/lib/formatters.test.d.ts.map +0 -1
  220. package/dist/__tests__/lib/formatters.test.js +0 -248
  221. package/dist/__tests__/lib/formatters.test.js.map +0 -1
  222. package/dist/__tests__/lib/image-parsing.test.d.ts +0 -2
  223. package/dist/__tests__/lib/image-parsing.test.d.ts.map +0 -1
  224. package/dist/__tests__/lib/image-parsing.test.js +0 -262
  225. package/dist/__tests__/lib/image-parsing.test.js.map +0 -1
  226. package/dist/__tests__/path-validation.test.d.ts +0 -2
  227. package/dist/__tests__/path-validation.test.d.ts.map +0 -1
  228. package/dist/__tests__/path-validation.test.js +0 -92
  229. package/dist/__tests__/path-validation.test.js.map +0 -1
  230. package/dist/lib/directory-helpers.d.ts +0 -4
  231. package/dist/lib/directory-helpers.d.ts.map +0 -1
  232. package/dist/lib/directory-helpers.js +0 -36
  233. package/dist/lib/directory-helpers.js.map +0 -1
  234. package/dist/lib/formatters.d.ts +0 -10
  235. package/dist/lib/formatters.d.ts.map +0 -1
  236. package/dist/lib/formatters.js +0 -202
  237. package/dist/lib/formatters.js.map +0 -1
  238. package/dist/lib/image-parsing.d.ts +0 -4
  239. package/dist/lib/image-parsing.d.ts.map +0 -1
  240. package/dist/lib/image-parsing.js +0 -124
  241. package/dist/lib/image-parsing.js.map +0 -1
  242. package/dist/lib/mcp-logger.d.ts +0 -11
  243. package/dist/lib/mcp-logger.d.ts.map +0 -1
  244. package/dist/lib/mcp-logger.js +0 -49
  245. package/dist/lib/mcp-logger.js.map +0 -1
  246. package/dist/lib/roots-utils.d.ts +0 -7
  247. package/dist/lib/roots-utils.d.ts.map +0 -1
  248. package/dist/lib/roots-utils.js +0 -39
  249. package/dist/lib/roots-utils.js.map +0 -1
  250. package/dist/lib/search-helpers.d.ts +0 -16
  251. package/dist/lib/search-helpers.d.ts.map +0 -1
  252. package/dist/lib/search-helpers.js +0 -169
  253. package/dist/lib/search-helpers.js.map +0 -1
  254. package/dist/lib/sorting.d.ts +0 -12
  255. package/dist/lib/sorting.d.ts.map +0 -1
  256. package/dist/lib/sorting.js +0 -41
  257. package/dist/lib/sorting.js.map +0 -1
  258. package/dist/lib/types.d.ts +0 -6
  259. package/dist/lib/types.d.ts.map +0 -1
  260. package/dist/lib/types.js +0 -2
  261. package/dist/lib/types.js.map +0 -1
  262. package/dist/prompts/analyze-codebase.d.ts +0 -3
  263. package/dist/prompts/analyze-codebase.d.ts.map +0 -1
  264. package/dist/prompts/analyze-codebase.js +0 -144
  265. package/dist/prompts/analyze-codebase.js.map +0 -1
  266. package/dist/prompts/filesystem-query.d.ts +0 -3
  267. package/dist/prompts/filesystem-query.d.ts.map +0 -1
  268. package/dist/prompts/filesystem-query.js +0 -168
  269. package/dist/prompts/filesystem-query.js.map +0 -1
  270. package/dist/prompts/find-duplicates.d.ts +0 -3
  271. package/dist/prompts/find-duplicates.d.ts.map +0 -1
  272. package/dist/prompts/find-duplicates.js +0 -77
  273. package/dist/prompts/find-duplicates.js.map +0 -1
  274. package/dist/prompts/index.d.ts +0 -3
  275. package/dist/prompts/index.d.ts.map +0 -1
  276. package/dist/prompts/index.js +0 -13
  277. package/dist/prompts/index.js.map +0 -1
  278. package/dist/prompts/project-overview.d.ts +0 -3
  279. package/dist/prompts/project-overview.d.ts.map +0 -1
  280. package/dist/prompts/project-overview.js +0 -122
  281. package/dist/prompts/project-overview.js.map +0 -1
  282. package/dist/prompts/search-and-replace.d.ts +0 -3
  283. package/dist/prompts/search-and-replace.d.ts.map +0 -1
  284. package/dist/prompts/search-and-replace.js +0 -130
  285. package/dist/prompts/search-and-replace.js.map +0 -1
  286. package/dist/prompts/shared.d.ts +0 -11
  287. package/dist/prompts/shared.d.ts.map +0 -1
  288. package/dist/prompts/shared.js +0 -32
  289. package/dist/prompts/shared.js.map +0 -1
  290. package/dist/resources/index.d.ts +0 -3
  291. package/dist/resources/index.d.ts.map +0 -1
  292. package/dist/resources/index.js +0 -54
  293. package/dist/resources/index.js.map +0 -1
  294. package/dist/schemas/validators.d.ts +0 -12
  295. package/dist/schemas/validators.d.ts.map +0 -1
  296. package/dist/schemas/validators.js +0 -35
  297. package/dist/schemas/validators.js.map +0 -1
  298. package/dist/utils/index.d.ts +0 -2
  299. package/dist/utils/index.d.ts.map +0 -1
  300. package/dist/utils/index.js +0 -2
  301. package/dist/utils/index.js.map +0 -1
  302. package/dist/utils/response-helpers.d.ts +0 -22
  303. package/dist/utils/response-helpers.d.ts.map +0 -1
  304. package/dist/utils/response-helpers.js +0 -24
  305. package/dist/utils/response-helpers.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-lines.js","sourceRoot":"","sources":["../../../../src/lib/fs-helpers/readers/stream-lines.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAEhE,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,iBAAiB,CACtC,QAAgB,EAChB,OAAuC;IAEvC,MAAM,SAAS,GAAG,MAAM,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IACvD,MAAM,UAAU,GAAG,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACxD,MAAM,EAAE,GAAG,eAAe,CAAC;QACzB,KAAK,EAAE,UAAU;QACjB,SAAS,EAAE,QAAQ;KACpB,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,EAAE,EAAE,CAAC;YAC5B,MAAM,IAAI,CAAC;QACb,CAAC;IACH,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,UAAU,CAAC,OAAO,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAgB,EAChB,KAAa,EACb,WAA2B,MAAM;IAEjC,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAE1B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,iBAAiB,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QACnE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK;YAAE,MAAM;IACnC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAgB,EAChB,KAAa,EACb,WAA2B,MAAM;IAEjC,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAE1B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,iBAAiB,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QACnE,IAAI,MAAM,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC;YAC7B,KAAK,EAAE,CAAC;QACV,CAAC;IACH,CAAC;IAED,+CAA+C;IAC/C,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACzC,MAAM,QAAQ,GAAG,KAAK,GAAG,KAAK,CAAC;QAC/B,OAAO,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrD,KAAK,IAAI,CAAC;QACV,KAAK,EAAE,CAAC;IACV,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function tailFile(filePath: string, numLines: number, encoding?: BufferEncoding, maxBytesRead?: number): Promise<string>;
2
+ //# sourceMappingURL=tail-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tail-file.d.ts","sourceRoot":"","sources":["../../../../src/lib/fs-helpers/readers/tail-file.ts"],"names":[],"mappings":"AAiJA,wBAAsB,QAAQ,CAC5B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,cAAwB,EAClC,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CAiBjB"}
@@ -0,0 +1,98 @@
1
+ import * as fs from 'node:fs/promises';
2
+ import { validateExistingPath } from '../../path-validation.js';
3
+ import { findUTF8Boundary } from './utf8.js';
4
+ const CHUNK_SIZE = 256 * 1024;
5
+ function initTailState(fileSize) {
6
+ return {
7
+ position: fileSize,
8
+ bytesReadTotal: 0,
9
+ remainingText: '',
10
+ linesFound: 0,
11
+ lines: [],
12
+ };
13
+ }
14
+ function shouldContinue(state, numLines) {
15
+ return state.position > 0 && state.linesFound < numLines;
16
+ }
17
+ function clampWindow(position, maxBytesRead, bytesReadTotal) {
18
+ if (position <= 0)
19
+ return null;
20
+ let size = Math.min(CHUNK_SIZE, position);
21
+ let startPos = position - size;
22
+ if (maxBytesRead !== undefined) {
23
+ const remainingBytes = maxBytesRead - bytesReadTotal;
24
+ if (remainingBytes <= 0)
25
+ return null;
26
+ if (size > remainingBytes) {
27
+ size = remainingBytes;
28
+ startPos = position - size;
29
+ }
30
+ }
31
+ return { startPos, size };
32
+ }
33
+ async function alignWindow(handle, window, position, maxBytesRead, bytesReadTotal) {
34
+ if (window.startPos <= 0)
35
+ return window;
36
+ const alignedPos = await findUTF8Boundary(handle, window.startPos);
37
+ const alignedSize = position - alignedPos;
38
+ if (maxBytesRead === undefined ||
39
+ alignedSize <= maxBytesRead - bytesReadTotal) {
40
+ return { startPos: alignedPos, size: alignedSize };
41
+ }
42
+ return window;
43
+ }
44
+ function applyChunkLines(state, chunkText, numLines, hasMoreBefore) {
45
+ const chunkLines = chunkText.replace(/\r\n/g, '\n').split('\n');
46
+ if (hasMoreBefore) {
47
+ state.remainingText = chunkLines.shift() ?? '';
48
+ }
49
+ else {
50
+ state.remainingText = '';
51
+ }
52
+ for (let i = chunkLines.length - 1; i >= 0; i--) {
53
+ if (state.linesFound >= numLines)
54
+ break;
55
+ const line = chunkLines[i];
56
+ if (line !== undefined) {
57
+ state.lines.unshift(line);
58
+ state.linesFound++;
59
+ }
60
+ }
61
+ }
62
+ async function readTailChunk(handle, state, numLines, encoding, maxBytesRead) {
63
+ const window = clampWindow(state.position, maxBytesRead, state.bytesReadTotal);
64
+ if (!window) {
65
+ state.position = 0;
66
+ return;
67
+ }
68
+ const aligned = await alignWindow(handle, window, state.position, maxBytesRead, state.bytesReadTotal);
69
+ state.position = aligned.startPos;
70
+ const chunk = Buffer.alloc(aligned.size + 4);
71
+ const { bytesRead } = await handle.read(chunk, 0, aligned.size, aligned.startPos);
72
+ if (bytesRead === 0) {
73
+ state.position = 0;
74
+ return;
75
+ }
76
+ state.bytesReadTotal += bytesRead;
77
+ const readData = chunk.subarray(0, bytesRead).toString(encoding);
78
+ const combined = readData + state.remainingText;
79
+ applyChunkLines(state, combined, numLines, state.position > 0);
80
+ }
81
+ export async function tailFile(filePath, numLines, encoding = 'utf-8', maxBytesRead) {
82
+ const validPath = await validateExistingPath(filePath);
83
+ const stats = await fs.stat(validPath);
84
+ if (stats.size === 0)
85
+ return '';
86
+ const handle = await fs.open(validPath, 'r');
87
+ try {
88
+ const state = initTailState(stats.size);
89
+ while (shouldContinue(state, numLines)) {
90
+ await readTailChunk(handle, state, numLines, encoding, maxBytesRead);
91
+ }
92
+ return state.lines.join('\n');
93
+ }
94
+ finally {
95
+ await handle.close().catch(() => { });
96
+ }
97
+ }
98
+ //# sourceMappingURL=tail-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tail-file.js","sourceRoot":"","sources":["../../../../src/lib/fs-helpers/readers/tail-file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { FileHandle } from 'node:fs/promises';
2
+ export declare function findUTF8Boundary(handle: FileHandle, position: number): Promise<number>;
3
+ //# sourceMappingURL=utf8.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utf8.d.ts","sourceRoot":"","sources":["../../../../src/lib/fs-helpers/readers/utf8.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAyBjB"}
@@ -0,0 +1,22 @@
1
+ export async function findUTF8Boundary(handle, position) {
2
+ if (position <= 0)
3
+ return 0;
4
+ const backtrackSize = Math.min(4, position);
5
+ const startPos = position - backtrackSize;
6
+ const buf = Buffer.allocUnsafe(backtrackSize);
7
+ try {
8
+ const { bytesRead } = await handle.read(buf, 0, backtrackSize, startPos);
9
+ for (let i = bytesRead - 1; i >= 0; i--) {
10
+ const byte = buf[i];
11
+ if (byte !== undefined && (byte & 0xc0) !== 0x80) {
12
+ return startPos + i;
13
+ }
14
+ }
15
+ }
16
+ catch (error) {
17
+ console.error(`[findUTF8Boundary] Read error at position ${position}:`, error instanceof Error ? error.message : String(error));
18
+ return position;
19
+ }
20
+ return position;
21
+ }
22
+ //# sourceMappingURL=utf8.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utf8.js","sourceRoot":"","sources":["../../../../src/lib/fs-helpers/readers/utf8.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAkB,EAClB,QAAgB;IAEhB,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAE5B,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,QAAQ,GAAG,aAAa,CAAC;IAC1C,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;IAE9C,IAAI,CAAC;QACH,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;QAEzE,KAAK,IAAI,CAAC,GAAG,SAAS,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YACpB,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;gBACjD,OAAO,QAAQ,GAAG,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,6CAA6C,QAAQ,GAAG,EACxD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;QACF,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { headFile } from './readers/head-file.js';
2
+ export { readFile } from './readers/read-file.js';
3
+ export { tailFile } from './readers/tail-file.js';
4
+ //# sourceMappingURL=readers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readers.d.ts","sourceRoot":"","sources":["../../../src/lib/fs-helpers/readers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { headFile } from './readers/head-file.js';
2
+ export { readFile } from './readers/read-file.js';
3
+ export { tailFile } from './readers/tail-file.js';
4
+ //# sourceMappingURL=readers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readers.js","sourceRoot":"","sources":["../../../src/lib/fs-helpers/readers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC"}
@@ -1,26 +1,5 @@
1
- import * as fs from 'node:fs/promises';
2
- import type { Stats } from 'node:fs';
3
- import type { FileType, ParallelResult } from '../config/types.js';
4
- export declare function runWorkQueue<T>(initialItems: T[], worker: (item: T, enqueue: (item: T) => void) => Promise<void>, concurrency: number, signal?: AbortSignal): Promise<void>;
5
- export declare function getFileType(stats: Stats): FileType;
6
- export declare function isHidden(name: string): boolean;
7
- export declare function isProbablyBinary(filePath: string, existingHandle?: fs.FileHandle): Promise<boolean>;
8
- export declare function tailFile(filePath: string, numLines: number): Promise<string>;
9
- export declare function headFile(filePath: string, numLines: number): Promise<string>;
10
- export declare function readFile(filePath: string, options?: {
11
- encoding?: BufferEncoding;
12
- maxSize?: number;
13
- lineRange?: {
14
- start: number;
15
- end: number;
16
- };
17
- head?: number;
18
- tail?: number;
19
- }): Promise<{
20
- path: string;
21
- content: string;
22
- truncated: boolean;
23
- totalLines?: number;
24
- }>;
25
- export declare function processInParallel<T, R>(items: T[], processor: (item: T) => Promise<R>, concurrency?: number): Promise<ParallelResult<R>>;
1
+ export { isProbablyBinary } from './fs-helpers/binary-detect.js';
2
+ export { processInParallel, runWorkQueue } from './fs-helpers/concurrency.js';
3
+ export { getFileType, isHidden } from './fs-helpers/fs-utils.js';
4
+ export { headFile, readFile, tailFile } from './fs-helpers/readers.js';
26
5
  //# sourceMappingURL=fs-helpers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fs-helpers.d.ts","sourceRoot":"","sources":["../../src/lib/fs-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAGvC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAIrC,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAWnE,wBAAsB,YAAY,CAAC,CAAC,EAClC,YAAY,EAAE,CAAC,EAAE,EACjB,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,EAC9D,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CA6Df;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,QAAQ,CAKlD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE9C;AAED,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,cAAc,CAAC,EAAE,EAAE,CAAC,UAAU,GAC7B,OAAO,CAAC,OAAO,CAAC,CA0DlB;AAiCD,wBAAsB,QAAQ,CAC5B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAyDjB;AAED,wBAAsB,QAAQ,CAC5B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CA6CjB;AAgDD,wBAAsB,QAAQ,CAC5B,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IACP,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACV,GACL,OAAO,CAAC;IACT,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC,CAyFD;AAED,wBAAsB,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAC1C,KAAK,EAAE,CAAC,EAAE,EACV,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAClC,WAAW,GAAE,MAA6B,GACzC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAwB5B"}
1
+ {"version":3,"file":"fs-helpers.d.ts","sourceRoot":"","sources":["../../src/lib/fs-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC"}
@@ -1,328 +1,5 @@
1
- import * as fs from 'node:fs/promises';
2
- import * as path from 'node:path';
3
- import * as readline from 'node:readline';
4
- import { createReadStream } from 'node:fs';
5
- import { StringDecoder } from 'node:string_decoder';
6
- import { BINARY_CHECK_BUFFER_SIZE, KNOWN_BINARY_EXTENSIONS, KNOWN_TEXT_EXTENSIONS, MAX_TEXT_FILE_SIZE, PARALLEL_CONCURRENCY, } from './constants.js';
7
- import { ErrorCode, McpError } from './errors.js';
8
- import { validateExistingPath } from './path-validation.js';
9
- export async function runWorkQueue(initialItems, worker, concurrency, signal) {
10
- const queue = [...initialItems];
11
- let inFlight = 0;
12
- let aborted = false;
13
- let doneResolve;
14
- const donePromise = new Promise((resolve) => {
15
- doneResolve = resolve;
16
- });
17
- const onAbort = () => {
18
- aborted = true;
19
- // Don't modify queue - just stop new work from being enqueued
20
- if (inFlight === 0) {
21
- doneResolve?.();
22
- }
23
- };
24
- signal?.addEventListener('abort', onAbort, { once: true });
25
- const maybeStartNext = () => {
26
- if (aborted)
27
- return;
28
- while (inFlight < concurrency && queue.length > 0) {
29
- const next = queue.shift();
30
- if (next === undefined)
31
- break;
32
- inFlight++;
33
- void worker(next, (item) => {
34
- if (!aborted) {
35
- queue.push(item);
36
- maybeStartNext();
37
- }
38
- })
39
- .catch((error) => {
40
- console.error('[runWorkQueue] Worker error:', error instanceof Error ? error.message : String(error));
41
- })
42
- .finally(() => {
43
- inFlight--;
44
- if (inFlight === 0 && (queue.length === 0 || aborted)) {
45
- doneResolve?.();
46
- }
47
- else if (!aborted) {
48
- maybeStartNext();
49
- }
50
- });
51
- }
52
- };
53
- maybeStartNext();
54
- if (inFlight === 0 && queue.length === 0) {
55
- doneResolve?.();
56
- }
57
- try {
58
- await donePromise;
59
- }
60
- finally {
61
- signal?.removeEventListener('abort', onAbort);
62
- }
63
- }
64
- export function getFileType(stats) {
65
- if (stats.isFile())
66
- return 'file';
67
- if (stats.isDirectory())
68
- return 'directory';
69
- if (stats.isSymbolicLink())
70
- return 'symlink';
71
- return 'other';
72
- }
73
- export function isHidden(name) {
74
- return name.startsWith('.');
75
- }
76
- export async function isProbablyBinary(filePath, existingHandle) {
77
- const ext = path.extname(filePath).toLowerCase();
78
- if (KNOWN_TEXT_EXTENSIONS.has(ext)) {
79
- return false;
80
- }
81
- if (KNOWN_BINARY_EXTENSIONS.has(ext)) {
82
- return true;
83
- }
84
- let handle = existingHandle;
85
- let shouldClose = false;
86
- let effectivePath = filePath;
87
- if (!handle) {
88
- effectivePath = await validateExistingPath(filePath);
89
- handle = await fs.open(effectivePath, 'r');
90
- shouldClose = true;
91
- }
92
- try {
93
- const buffer = Buffer.allocUnsafe(BINARY_CHECK_BUFFER_SIZE);
94
- const { bytesRead } = await handle.read(buffer, 0, BINARY_CHECK_BUFFER_SIZE, 0);
95
- if (bytesRead === 0) {
96
- return false; // Empty file is considered text
97
- }
98
- const slice = buffer.subarray(0, bytesRead);
99
- if (bytesRead >= 3 &&
100
- slice[0] === 0xef &&
101
- slice[1] === 0xbb &&
102
- slice[2] === 0xbf) {
103
- return false;
104
- }
105
- if (bytesRead >= 2 &&
106
- ((slice[0] === 0xff && slice[1] === 0xfe) ||
107
- (slice[0] === 0xfe && slice[1] === 0xff))) {
108
- return false;
109
- }
110
- return slice.includes(0);
111
- }
112
- finally {
113
- if (shouldClose) {
114
- await handle.close().catch(() => { });
115
- }
116
- }
117
- }
118
- async function findUTF8Boundary(handle, position) {
119
- if (position <= 0)
120
- return 0;
121
- const backtrackSize = Math.min(4, position);
122
- const startPos = position - backtrackSize;
123
- const buf = Buffer.allocUnsafe(backtrackSize);
124
- try {
125
- const { bytesRead } = await handle.read(buf, 0, backtrackSize, startPos);
126
- for (let i = bytesRead - 1; i >= 0; i--) {
127
- const byte = buf[i];
128
- if (byte !== undefined && (byte & 0xc0) !== 0x80) {
129
- return startPos + i;
130
- }
131
- }
132
- }
133
- catch (error) {
134
- console.error(`[findUTF8Boundary] Read error at position ${position}:`, error instanceof Error ? error.message : String(error));
135
- return position;
136
- }
137
- // Fallback if all bytes are continuation bytes
138
- return position;
139
- }
140
- export async function tailFile(filePath, numLines) {
141
- const CHUNK_SIZE = 256 * 1024;
142
- const validPath = await validateExistingPath(filePath);
143
- const stats = await fs.stat(validPath);
144
- const fileSize = stats.size;
145
- if (fileSize === 0)
146
- return '';
147
- const handle = await fs.open(validPath, 'r');
148
- try {
149
- const lines = [];
150
- let position = fileSize;
151
- const chunk = Buffer.alloc(CHUNK_SIZE + 4);
152
- let linesFound = 0;
153
- let remainingText = '';
154
- while (position > 0 && linesFound < numLines) {
155
- let size = Math.min(CHUNK_SIZE, position);
156
- let startPos = position - size;
157
- if (startPos > 0) {
158
- const alignedPos = await findUTF8Boundary(handle, startPos);
159
- size = position - alignedPos;
160
- startPos = alignedPos;
161
- }
162
- position = startPos;
163
- const { bytesRead } = await handle.read(chunk, 0, size, position);
164
- if (bytesRead === 0)
165
- break;
166
- const readData = chunk.subarray(0, bytesRead).toString('utf-8');
167
- const chunkText = readData + remainingText;
168
- const chunkLines = chunkText.replace(/\r\n/g, '\n').split('\n');
169
- if (position > 0) {
170
- remainingText = chunkLines[0] ?? '';
171
- chunkLines.shift();
172
- }
173
- for (let i = chunkLines.length - 1; i >= 0 && linesFound < numLines; i--) {
174
- const line = chunkLines[i];
175
- if (line !== undefined) {
176
- lines.unshift(line);
177
- linesFound++;
178
- }
179
- }
180
- }
181
- return lines.join('\n');
182
- }
183
- finally {
184
- await handle.close().catch(() => { });
185
- }
186
- }
187
- export async function headFile(filePath, numLines) {
188
- const validPath = await validateExistingPath(filePath);
189
- const handle = await fs.open(validPath, 'r');
190
- try {
191
- const lines = [];
192
- let bytesRead = 0;
193
- const chunk = Buffer.alloc(64 * 1024);
194
- const decoder = new StringDecoder('utf-8');
195
- let buffer = '';
196
- while (lines.length < numLines) {
197
- const result = await handle.read(chunk, 0, chunk.length, bytesRead);
198
- if (result.bytesRead === 0)
199
- break;
200
- bytesRead += result.bytesRead;
201
- buffer += decoder.write(chunk.subarray(0, result.bytesRead));
202
- const normalizedBuffer = buffer.replace(/\r\n/g, '\n');
203
- const newLineIndex = normalizedBuffer.lastIndexOf('\n');
204
- if (newLineIndex !== -1) {
205
- const completeLines = normalizedBuffer
206
- .substring(0, newLineIndex)
207
- .split('\n');
208
- buffer = normalizedBuffer.substring(newLineIndex + 1);
209
- for (const line of completeLines) {
210
- lines.push(line);
211
- if (lines.length >= numLines)
212
- break;
213
- }
214
- }
215
- }
216
- buffer += decoder.end();
217
- if (buffer.length > 0 && lines.length < numLines) {
218
- const remainingLines = buffer.replace(/\r\n/g, '\n').split('\n');
219
- for (const line of remainingLines) {
220
- lines.push(line);
221
- if (lines.length >= numLines)
222
- break;
223
- }
224
- }
225
- return lines.slice(0, numLines).join('\n');
226
- }
227
- finally {
228
- await handle.close().catch(() => { });
229
- }
230
- }
231
- async function readLineRange(filePath, startLine, endLine) {
232
- const fileStream = createReadStream(filePath, { encoding: 'utf-8' });
233
- const rl = readline.createInterface({
234
- input: fileStream,
235
- crlfDelay: Infinity,
236
- });
237
- const lines = [];
238
- let lineNumber = 0;
239
- let hasMoreLines = false;
240
- try {
241
- for await (const line of rl) {
242
- lineNumber++;
243
- if (lineNumber >= startLine && lineNumber <= endLine) {
244
- lines.push(line);
245
- }
246
- if (lineNumber > endLine) {
247
- hasMoreLines = true;
248
- break;
249
- }
250
- }
251
- return {
252
- content: lines.join('\n'),
253
- linesRead: lines.length,
254
- totalLinesScanned: lineNumber,
255
- hasMoreLines,
256
- };
257
- }
258
- finally {
259
- rl.close();
260
- fileStream.destroy();
261
- }
262
- }
263
- export async function readFile(filePath, options = {}) {
264
- const { encoding = 'utf-8', maxSize = MAX_TEXT_FILE_SIZE, lineRange, head, tail, } = options;
265
- const validPath = await validateExistingPath(filePath);
266
- const stats = await fs.stat(validPath);
267
- if (!stats.isFile()) {
268
- throw new McpError(ErrorCode.E_NOT_FILE, `Not a file: ${filePath}`, filePath);
269
- }
270
- const optionsCount = [lineRange, head, tail].filter(Boolean).length;
271
- if (optionsCount > 1) {
272
- throw new McpError(ErrorCode.E_INVALID_INPUT, 'Cannot specify multiple of lineRange, head, or tail simultaneously', filePath);
273
- }
274
- if (lineRange) {
275
- if (lineRange.start < 1) {
276
- throw new McpError(ErrorCode.E_INVALID_INPUT, `Invalid lineRange: start must be at least 1 (got ${lineRange.start})`, filePath);
277
- }
278
- if (lineRange.end < lineRange.start) {
279
- throw new McpError(ErrorCode.E_INVALID_INPUT, `Invalid lineRange: end (${lineRange.end}) must be >= start (${lineRange.start})`, filePath);
280
- }
281
- }
282
- if (tail !== undefined) {
283
- const content = await tailFile(validPath, tail);
284
- return { path: validPath, content, truncated: true, totalLines: undefined };
285
- }
286
- if (head !== undefined) {
287
- const content = await headFile(validPath, head);
288
- return { path: validPath, content, truncated: true, totalLines: undefined };
289
- }
290
- if (lineRange) {
291
- const result = await readLineRange(validPath, lineRange.start, lineRange.end);
292
- const expectedLines = lineRange.end - lineRange.start + 1;
293
- const isTruncated = lineRange.start > 1 ||
294
- result.linesRead < expectedLines ||
295
- result.hasMoreLines;
296
- return {
297
- path: validPath,
298
- content: result.content,
299
- truncated: isTruncated,
300
- totalLines: undefined,
301
- };
302
- }
303
- if (stats.size > maxSize) {
304
- throw new McpError(ErrorCode.E_TOO_LARGE, `File too large: ${stats.size} bytes (max: ${maxSize} bytes). Use head, tail, or lineRange for partial reads.`, filePath, { size: stats.size, maxSize });
305
- }
306
- const content = await fs.readFile(validPath, { encoding });
307
- const totalLines = content.split('\n').length;
308
- return { path: validPath, content, truncated: false, totalLines };
309
- }
310
- export async function processInParallel(items, processor, concurrency = PARALLEL_CONCURRENCY) {
311
- const results = [];
312
- const errors = [];
313
- if (items.length === 0) {
314
- return { results, errors };
315
- }
316
- await runWorkQueue(items.map((item, index) => ({ item, index })), async ({ item, index }) => {
317
- try {
318
- const result = await processor(item);
319
- results.push(result);
320
- }
321
- catch (reason) {
322
- const error = reason instanceof Error ? reason : new Error(String(reason));
323
- errors.push({ index, error });
324
- }
325
- }, concurrency);
326
- return { results, errors };
327
- }
1
+ export { isProbablyBinary } from './fs-helpers/binary-detect.js';
2
+ export { processInParallel, runWorkQueue } from './fs-helpers/concurrency.js';
3
+ export { getFileType, isHidden } from './fs-helpers/fs-utils.js';
4
+ export { headFile, readFile, tailFile } from './fs-helpers/readers.js';
328
5
  //# sourceMappingURL=fs-helpers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fs-helpers.js","sourceRoot":"","sources":["../../src/lib/fs-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAE1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,OAAO,EACL,wBAAwB,EACxB,uBAAuB,EACvB,qBAAqB,EACrB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,YAAiB,EACjB,MAA8D,EAC9D,WAAmB,EACnB,MAAoB;IAEpB,MAAM,KAAK,GAAQ,CAAC,GAAG,YAAY,CAAC,CAAC;IACrC,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,WAAqC,CAAC;IAC1C,MAAM,WAAW,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAChD,WAAW,GAAG,OAAO,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,GAAS,EAAE;QACzB,OAAO,GAAG,IAAI,CAAC;QACf,8DAA8D;QAC9D,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;YACnB,WAAW,EAAE,EAAE,CAAC;QAClB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAE3D,MAAM,cAAc,GAAG,GAAS,EAAE;QAChC,IAAI,OAAO;YAAE,OAAO;QAEpB,OAAO,QAAQ,GAAG,WAAW,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;YAC3B,IAAI,IAAI,KAAK,SAAS;gBAAE,MAAM;YAE9B,QAAQ,EAAE,CAAC;YACX,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,IAAO,EAAE,EAAE;gBAC5B,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACjB,cAAc,EAAE,CAAC;gBACnB,CAAC;YACH,CAAC,CAAC;iBACC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;gBACxB,OAAO,CAAC,KAAK,CACX,8BAA8B,EAC9B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;YACJ,CAAC,CAAC;iBACD,OAAO,CAAC,GAAG,EAAE;gBACZ,QAAQ,EAAE,CAAC;gBACX,IAAI,QAAQ,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC;oBACtD,WAAW,EAAE,EAAE,CAAC;gBAClB,CAAC;qBAAM,IAAI,CAAC,OAAO,EAAE,CAAC;oBACpB,cAAc,EAAE,CAAC;gBACnB,CAAC;YACH,CAAC,CAAC,CAAC;QACP,CAAC;IACH,CAAC,CAAC;IAEF,cAAc,EAAE,CAAC;IAEjB,IAAI,QAAQ,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzC,WAAW,EAAE,EAAE,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,WAAW,CAAC;IACpB,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAY;IACtC,IAAI,KAAK,CAAC,MAAM,EAAE;QAAE,OAAO,MAAM,CAAC;IAClC,IAAI,KAAK,CAAC,WAAW,EAAE;QAAE,OAAO,WAAW,CAAC;IAC5C,IAAI,KAAK,CAAC,cAAc,EAAE;QAAE,OAAO,SAAS,CAAC;IAC7C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAgB,EAChB,cAA8B;IAE9B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IAEjD,IAAI,qBAAqB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QACnC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,uBAAuB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,MAAM,GAAG,cAAc,CAAC;IAC5B,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,aAAa,GAAG,QAAQ,CAAC;IAE7B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,aAAa,GAAG,MAAM,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QACrD,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;QAC3C,WAAW,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,wBAAwB,CAAC,CAAC;QAC5D,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CACrC,MAAM,EACN,CAAC,EACD,wBAAwB,EACxB,CAAC,CACF,CAAC;QAEF,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC,CAAC,gCAAgC;QAChD,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAE5C,IACE,SAAS,IAAI,CAAC;YACd,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI;YACjB,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI;YACjB,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,EACjB,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IACE,SAAS,IAAI,CAAC;YACd,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;gBACvC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,EAC3C,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;YAAS,CAAC;QACT,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,MAAqB,EACrB,QAAgB;IAEhB,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAE5B,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,QAAQ,GAAG,aAAa,CAAC;IAC1C,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;IAE9C,IAAI,CAAC;QACH,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;QAEzE,KAAK,IAAI,CAAC,GAAG,SAAS,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YACpB,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;gBACjD,OAAO,QAAQ,GAAG,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,6CAA6C,QAAQ,GAAG,EACxD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;QACF,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,+CAA+C;IAC/C,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,QAAgB,EAChB,QAAgB;IAEhB,MAAM,UAAU,GAAG,GAAG,GAAG,IAAI,CAAC;IAC9B,MAAM,SAAS,GAAG,MAAM,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC;IAE5B,IAAI,QAAQ,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAE9B,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IAC7C,IAAI,CAAC;QACH,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,IAAI,QAAQ,GAAG,QAAQ,CAAC;QACxB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QAC3C,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,aAAa,GAAG,EAAE,CAAC;QAEvB,OAAO,QAAQ,GAAG,CAAC,IAAI,UAAU,GAAG,QAAQ,EAAE,CAAC;YAC7C,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAC1C,IAAI,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAAC;YAE/B,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;gBACjB,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;gBAC5D,IAAI,GAAG,QAAQ,GAAG,UAAU,CAAC;gBAC7B,QAAQ,GAAG,UAAU,CAAC;YACxB,CAAC;YAED,QAAQ,GAAG,QAAQ,CAAC;YAEpB,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;YAClE,IAAI,SAAS,KAAK,CAAC;gBAAE,MAAM;YAE3B,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAChE,MAAM,SAAS,GAAG,QAAQ,GAAG,aAAa,CAAC;YAC3C,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAEhE,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;gBACjB,aAAa,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBACpC,UAAU,CAAC,KAAK,EAAE,CAAC;YACrB,CAAC;YAED,KACE,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,EAC7B,CAAC,IAAI,CAAC,IAAI,UAAU,GAAG,QAAQ,EAC/B,CAAC,EAAE,EACH,CAAC;gBACD,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;gBAC3B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;oBACvB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBACpB,UAAU,EAAE,CAAC;gBACf,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,QAAgB,EAChB,QAAgB;IAEhB,MAAM,SAAS,GAAG,MAAM,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IAC7C,IAAI,CAAC;QACH,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,OAAO,KAAK,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YACpE,IAAI,MAAM,CAAC,SAAS,KAAK,CAAC;gBAAE,MAAM;YAClC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC;YAE9B,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;YAC7D,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACvD,MAAM,YAAY,GAAG,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAExD,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE,CAAC;gBACxB,MAAM,aAAa,GAAG,gBAAgB;qBACnC,SAAS,CAAC,CAAC,EAAE,YAAY,CAAC;qBAC1B,KAAK,CAAC,IAAI,CAAC,CAAC;gBACf,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;gBAEtD,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;oBACjC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACjB,IAAI,KAAK,CAAC,MAAM,IAAI,QAAQ;wBAAE,MAAM;gBACtC,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QACxB,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;YACjD,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACjE,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;gBAClC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjB,IAAI,KAAK,CAAC,MAAM,IAAI,QAAQ;oBAAE,MAAM;YACtC,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,QAAgB,EAChB,SAAiB,EACjB,OAAe;IAOf,MAAM,UAAU,GAAG,gBAAgB,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IACrE,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,UAAU;QACjB,SAAS,EAAE,QAAQ;KACpB,CAAC,CAAC;IAEH,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,YAAY,GAAG,KAAK,CAAC;IAEzB,IAAI,CAAC;QACH,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,EAAE,EAAE,CAAC;YAC5B,UAAU,EAAE,CAAC;YAEb,IAAI,UAAU,IAAI,SAAS,IAAI,UAAU,IAAI,OAAO,EAAE,CAAC;gBACrD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;YAED,IAAI,UAAU,GAAG,OAAO,EAAE,CAAC;gBACzB,YAAY,GAAG,IAAI,CAAC;gBACpB,MAAM;YACR,CAAC;QACH,CAAC;QAED,OAAO;YACL,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;YACzB,SAAS,EAAE,KAAK,CAAC,MAAM;YACvB,iBAAiB,EAAE,UAAU;YAC7B,YAAY;SACb,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,UAAU,CAAC,OAAO,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,QAAgB,EAChB,UAMI,EAAE;IAON,MAAM,EACJ,QAAQ,GAAG,OAAO,EAClB,OAAO,GAAG,kBAAkB,EAC5B,SAAS,EACT,IAAI,EACJ,IAAI,GACL,GAAG,OAAO,CAAC;IACZ,MAAM,SAAS,GAAG,MAAM,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAEvD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAEvC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;QACpB,MAAM,IAAI,QAAQ,CAChB,SAAS,CAAC,UAAU,EACpB,eAAe,QAAQ,EAAE,EACzB,QAAQ,CACT,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IACpE,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,QAAQ,CAChB,SAAS,CAAC,eAAe,EACzB,oEAAoE,EACpE,QAAQ,CACT,CAAC;IACJ,CAAC;IAED,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,SAAS,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,QAAQ,CAChB,SAAS,CAAC,eAAe,EACzB,oDAAoD,SAAS,CAAC,KAAK,GAAG,EACtE,QAAQ,CACT,CAAC;QACJ,CAAC;QACD,IAAI,SAAS,CAAC,GAAG,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;YACpC,MAAM,IAAI,QAAQ,CAChB,SAAS,CAAC,eAAe,EACzB,2BAA2B,SAAS,CAAC,GAAG,uBAAuB,SAAS,CAAC,KAAK,GAAG,EACjF,QAAQ,CACT,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAChD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;IAC9E,CAAC;IAED,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAChD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;IAC9E,CAAC;IAED,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,MAAM,GAAG,MAAM,aAAa,CAChC,SAAS,EACT,SAAS,CAAC,KAAK,EACf,SAAS,CAAC,GAAG,CACd,CAAC;QACF,MAAM,aAAa,GAAG,SAAS,CAAC,GAAG,GAAG,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC;QAC1D,MAAM,WAAW,GACf,SAAS,CAAC,KAAK,GAAG,CAAC;YACnB,MAAM,CAAC,SAAS,GAAG,aAAa;YAChC,MAAM,CAAC,YAAY,CAAC;QACtB,OAAO;YACL,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,SAAS,EAAE,WAAW;YACtB,UAAU,EAAE,SAAS;SACtB,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,GAAG,OAAO,EAAE,CAAC;QACzB,MAAM,IAAI,QAAQ,CAChB,SAAS,CAAC,WAAW,EACrB,mBAAmB,KAAK,CAAC,IAAI,gBAAgB,OAAO,0DAA0D,EAC9G,QAAQ,EACR,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,CAC9B,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IAE3D,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IAE9C,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AACpE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAAU,EACV,SAAkC,EAClC,cAAsB,oBAAoB;IAE1C,MAAM,OAAO,GAAQ,EAAE,CAAC;IACxB,MAAM,MAAM,GAAsC,EAAE,CAAC;IAErD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAC7B,CAAC;IAED,MAAM,YAAY,CAChB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,EAC7C,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,MAAM,KAAK,GACT,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YAC/D,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,EACD,WAAW,CACZ,CAAC;IAEF,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC7B,CAAC"}
1
+ {"version":3,"file":"fs-helpers.js","sourceRoot":"","sources":["../../src/lib/fs-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,9 @@
1
+ export declare const RESERVED_DEVICE_NAMES: Set<string>;
2
+ export declare function normalizeForComparison(p: string): string;
3
+ export declare function normalizeAllowedDirectory(dir: string): string;
4
+ export declare function setAllowedDirectories(dirs: string[]): void;
5
+ export declare function getAllowedDirectories(): string[];
6
+ export declare function isPathWithinAllowedDirectories(normalizedPath: string): boolean;
7
+ export declare function expandAllowedDirectories(dirs: string[]): Promise<string[]>;
8
+ export declare function setAllowedDirectoriesResolved(dirs: string[]): Promise<void>;
9
+ //# sourceMappingURL=allowed-directories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"allowed-directories.d.ts","sourceRoot":"","sources":["../../../src/lib/path-validation/allowed-directories.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,qBAAqB,aAuBhC,CAAC;AAEH,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAExD;AAQD,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAU7D;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAK1D;AAED,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAEhD;AAED,wBAAgB,8BAA8B,CAC5C,cAAc,EAAE,MAAM,GACrB,OAAO,CAYT;AAED,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,MAAM,EAAE,GACb,OAAO,CAAC,MAAM,EAAE,CAAC,CAwBnB;AAED,wBAAsB,6BAA6B,CACjD,IAAI,EAAE,MAAM,EAAE,GACb,OAAO,CAAC,IAAI,CAAC,CAGf"}