@machina.ai/cell-cli-core 1.0.13-rc3

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 (435) hide show
  1. package/dist/.last_build +0 -0
  2. package/dist/index.d.ts +7 -0
  3. package/dist/index.js +8 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/src/__mocks__/fs/promises.d.ts +11 -0
  6. package/dist/src/__mocks__/fs/promises.js +17 -0
  7. package/dist/src/__mocks__/fs/promises.js.map +1 -0
  8. package/dist/src/code_assist/codeAssist.d.ts +9 -0
  9. package/dist/src/code_assist/codeAssist.js +19 -0
  10. package/dist/src/code_assist/codeAssist.js.map +1 -0
  11. package/dist/src/code_assist/converter.d.ts +68 -0
  12. package/dist/src/code_assist/converter.js +125 -0
  13. package/dist/src/code_assist/converter.js.map +1 -0
  14. package/dist/src/code_assist/converter.test.d.ts +6 -0
  15. package/dist/src/code_assist/converter.test.js +229 -0
  16. package/dist/src/code_assist/converter.test.js.map +1 -0
  17. package/dist/src/code_assist/oauth2.d.ts +20 -0
  18. package/dist/src/code_assist/oauth2.js +329 -0
  19. package/dist/src/code_assist/oauth2.js.map +1 -0
  20. package/dist/src/code_assist/oauth2.test.d.ts +6 -0
  21. package/dist/src/code_assist/oauth2.test.js +244 -0
  22. package/dist/src/code_assist/oauth2.test.js.map +1 -0
  23. package/dist/src/code_assist/server.d.ts +37 -0
  24. package/dist/src/code_assist/server.js +125 -0
  25. package/dist/src/code_assist/server.js.map +1 -0
  26. package/dist/src/code_assist/server.test.d.ts +6 -0
  27. package/dist/src/code_assist/server.test.js +131 -0
  28. package/dist/src/code_assist/server.test.js.map +1 -0
  29. package/dist/src/code_assist/setup.d.ts +20 -0
  30. package/dist/src/code_assist/setup.js +70 -0
  31. package/dist/src/code_assist/setup.js.map +1 -0
  32. package/dist/src/code_assist/setup.test.d.ts +6 -0
  33. package/dist/src/code_assist/setup.test.js +65 -0
  34. package/dist/src/code_assist/setup.test.js.map +1 -0
  35. package/dist/src/code_assist/types.d.ts +148 -0
  36. package/dist/src/code_assist/types.js +46 -0
  37. package/dist/src/code_assist/types.js.map +1 -0
  38. package/dist/src/config/config.d.ts +239 -0
  39. package/dist/src/config/config.js +484 -0
  40. package/dist/src/config/config.js.map +1 -0
  41. package/dist/src/config/config.test.d.ts +6 -0
  42. package/dist/src/config/config.test.js +304 -0
  43. package/dist/src/config/config.test.js.map +1 -0
  44. package/dist/src/config/flashFallback.test.d.ts +6 -0
  45. package/dist/src/config/flashFallback.test.js +115 -0
  46. package/dist/src/config/flashFallback.test.js.map +1 -0
  47. package/dist/src/config/models.d.ts +8 -0
  48. package/dist/src/config/models.js +9 -0
  49. package/dist/src/config/models.js.map +1 -0
  50. package/dist/src/core/client.d.ts +60 -0
  51. package/dist/src/core/client.js +502 -0
  52. package/dist/src/core/client.js.map +1 -0
  53. package/dist/src/core/client.test.d.ts +6 -0
  54. package/dist/src/core/client.test.js +853 -0
  55. package/dist/src/core/client.test.js.map +1 -0
  56. package/dist/src/core/contentGenerator.d.ts +36 -0
  57. package/dist/src/core/contentGenerator.js +110 -0
  58. package/dist/src/core/contentGenerator.js.map +1 -0
  59. package/dist/src/core/contentGenerator.test.d.ts +6 -0
  60. package/dist/src/core/contentGenerator.test.js +225 -0
  61. package/dist/src/core/contentGenerator.test.js.map +1 -0
  62. package/dist/src/core/coreToolScheduler.d.ts +104 -0
  63. package/dist/src/core/coreToolScheduler.js +410 -0
  64. package/dist/src/core/coreToolScheduler.js.map +1 -0
  65. package/dist/src/core/coreToolScheduler.test.d.ts +6 -0
  66. package/dist/src/core/coreToolScheduler.test.js +402 -0
  67. package/dist/src/core/coreToolScheduler.test.js.map +1 -0
  68. package/dist/src/core/geminiChat.d.ts +116 -0
  69. package/dist/src/core/geminiChat.js +511 -0
  70. package/dist/src/core/geminiChat.js.map +1 -0
  71. package/dist/src/core/geminiChat.test.d.ts +6 -0
  72. package/dist/src/core/geminiChat.test.js +424 -0
  73. package/dist/src/core/geminiChat.test.js.map +1 -0
  74. package/dist/src/core/geminiRequest.d.ts +13 -0
  75. package/dist/src/core/geminiRequest.js +45 -0
  76. package/dist/src/core/geminiRequest.js.map +1 -0
  77. package/dist/src/core/geminiRequest.test.d.ts +6 -0
  78. package/dist/src/core/geminiRequest.test.js +72 -0
  79. package/dist/src/core/geminiRequest.test.js.map +1 -0
  80. package/dist/src/core/logger.d.ts +35 -0
  81. package/dist/src/core/logger.js +235 -0
  82. package/dist/src/core/logger.js.map +1 -0
  83. package/dist/src/core/logger.test.d.ts +6 -0
  84. package/dist/src/core/logger.test.js +387 -0
  85. package/dist/src/core/logger.test.js.map +1 -0
  86. package/dist/src/core/modelCheck.d.ts +14 -0
  87. package/dist/src/core/modelCheck.js +62 -0
  88. package/dist/src/core/modelCheck.js.map +1 -0
  89. package/dist/src/core/nonInteractiveToolExecutor.d.ts +12 -0
  90. package/dist/src/core/nonInteractiveToolExecutor.js +97 -0
  91. package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -0
  92. package/dist/src/core/nonInteractiveToolExecutor.test.d.ts +6 -0
  93. package/dist/src/core/nonInteractiveToolExecutor.test.js +189 -0
  94. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -0
  95. package/dist/src/core/prompts.d.ts +12 -0
  96. package/dist/src/core/prompts.js +335 -0
  97. package/dist/src/core/prompts.js.map +1 -0
  98. package/dist/src/core/prompts.test.d.ts +6 -0
  99. package/dist/src/core/prompts.test.js +97 -0
  100. package/dist/src/core/prompts.test.js.map +1 -0
  101. package/dist/src/core/tokenLimits.d.ts +10 -0
  102. package/dist/src/core/tokenLimits.js +27 -0
  103. package/dist/src/core/tokenLimits.js.map +1 -0
  104. package/dist/src/core/turn.d.ts +111 -0
  105. package/dist/src/core/turn.js +139 -0
  106. package/dist/src/core/turn.js.map +1 -0
  107. package/dist/src/core/turn.test.d.ts +6 -0
  108. package/dist/src/core/turn.test.js +365 -0
  109. package/dist/src/core/turn.test.js.map +1 -0
  110. package/dist/src/index.d.ts +57 -0
  111. package/dist/src/index.js +64 -0
  112. package/dist/src/index.js.map +1 -0
  113. package/dist/src/index.test.d.ts +6 -0
  114. package/dist/src/index.test.js +12 -0
  115. package/dist/src/index.test.js.map +1 -0
  116. package/dist/src/mcp/oauth-provider.d.ts +142 -0
  117. package/dist/src/mcp/oauth-provider.js +446 -0
  118. package/dist/src/mcp/oauth-provider.js.map +1 -0
  119. package/dist/src/mcp/oauth-provider.test.d.ts +6 -0
  120. package/dist/src/mcp/oauth-provider.test.js +520 -0
  121. package/dist/src/mcp/oauth-provider.test.js.map +1 -0
  122. package/dist/src/mcp/oauth-token-storage.d.ts +81 -0
  123. package/dist/src/mcp/oauth-token-storage.js +149 -0
  124. package/dist/src/mcp/oauth-token-storage.js.map +1 -0
  125. package/dist/src/mcp/oauth-token-storage.test.d.ts +6 -0
  126. package/dist/src/mcp/oauth-token-storage.test.js +205 -0
  127. package/dist/src/mcp/oauth-token-storage.test.js.map +1 -0
  128. package/dist/src/mcp/oauth-utils.d.ts +109 -0
  129. package/dist/src/mcp/oauth-utils.js +183 -0
  130. package/dist/src/mcp/oauth-utils.js.map +1 -0
  131. package/dist/src/mcp/oauth-utils.test.d.ts +6 -0
  132. package/dist/src/mcp/oauth-utils.test.js +144 -0
  133. package/dist/src/mcp/oauth-utils.test.js.map +1 -0
  134. package/dist/src/services/fileDiscoveryService.d.ts +35 -0
  135. package/dist/src/services/fileDiscoveryService.js +91 -0
  136. package/dist/src/services/fileDiscoveryService.js.map +1 -0
  137. package/dist/src/services/fileDiscoveryService.test.d.ts +6 -0
  138. package/dist/src/services/fileDiscoveryService.test.js +102 -0
  139. package/dist/src/services/fileDiscoveryService.test.js.map +1 -0
  140. package/dist/src/services/gitService.d.ts +21 -0
  141. package/dist/src/services/gitService.js +101 -0
  142. package/dist/src/services/gitService.js.map +1 -0
  143. package/dist/src/services/gitService.test.d.ts +6 -0
  144. package/dist/src/services/gitService.test.js +228 -0
  145. package/dist/src/services/gitService.test.js.map +1 -0
  146. package/dist/src/services/ideContext.d.ts +178 -0
  147. package/dist/src/services/ideContext.js +105 -0
  148. package/dist/src/services/ideContext.js.map +1 -0
  149. package/dist/src/services/ideContext.test.d.ts +6 -0
  150. package/dist/src/services/ideContext.test.js +111 -0
  151. package/dist/src/services/ideContext.test.js.map +1 -0
  152. package/dist/src/services/loopDetectionService.d.ts +51 -0
  153. package/dist/src/services/loopDetectionService.js +232 -0
  154. package/dist/src/services/loopDetectionService.js.map +1 -0
  155. package/dist/src/services/loopDetectionService.test.d.ts +6 -0
  156. package/dist/src/services/loopDetectionService.test.js +339 -0
  157. package/dist/src/services/loopDetectionService.test.js.map +1 -0
  158. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +37 -0
  159. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +456 -0
  160. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -0
  161. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +49 -0
  162. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +127 -0
  163. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -0
  164. package/dist/src/telemetry/constants.d.ts +20 -0
  165. package/dist/src/telemetry/constants.js +21 -0
  166. package/dist/src/telemetry/constants.js.map +1 -0
  167. package/dist/src/telemetry/index.d.ts +18 -0
  168. package/dist/src/telemetry/index.js +20 -0
  169. package/dist/src/telemetry/index.js.map +1 -0
  170. package/dist/src/telemetry/integration.test.circular.d.ts +6 -0
  171. package/dist/src/telemetry/integration.test.circular.js +53 -0
  172. package/dist/src/telemetry/integration.test.circular.js.map +1 -0
  173. package/dist/src/telemetry/loggers.d.ts +15 -0
  174. package/dist/src/telemetry/loggers.js +220 -0
  175. package/dist/src/telemetry/loggers.js.map +1 -0
  176. package/dist/src/telemetry/loggers.test.circular.d.ts +6 -0
  177. package/dist/src/telemetry/loggers.test.circular.js +100 -0
  178. package/dist/src/telemetry/loggers.test.circular.js.map +1 -0
  179. package/dist/src/telemetry/loggers.test.d.ts +6 -0
  180. package/dist/src/telemetry/loggers.test.js +558 -0
  181. package/dist/src/telemetry/loggers.test.js.map +1 -0
  182. package/dist/src/telemetry/metrics.d.ts +19 -0
  183. package/dist/src/telemetry/metrics.js +144 -0
  184. package/dist/src/telemetry/metrics.js.map +1 -0
  185. package/dist/src/telemetry/metrics.test.d.ts +6 -0
  186. package/dist/src/telemetry/metrics.test.js +162 -0
  187. package/dist/src/telemetry/metrics.test.js.map +1 -0
  188. package/dist/src/telemetry/sdk.d.ts +9 -0
  189. package/dist/src/telemetry/sdk.js +116 -0
  190. package/dist/src/telemetry/sdk.js.map +1 -0
  191. package/dist/src/telemetry/telemetry.test.d.ts +6 -0
  192. package/dist/src/telemetry/telemetry.test.js +50 -0
  193. package/dist/src/telemetry/telemetry.test.js.map +1 -0
  194. package/dist/src/telemetry/types.d.ts +116 -0
  195. package/dist/src/telemetry/types.js +218 -0
  196. package/dist/src/telemetry/types.js.map +1 -0
  197. package/dist/src/telemetry/uiTelemetry.d.ts +68 -0
  198. package/dist/src/telemetry/uiTelemetry.js +138 -0
  199. package/dist/src/telemetry/uiTelemetry.js.map +1 -0
  200. package/dist/src/telemetry/uiTelemetry.test.d.ts +6 -0
  201. package/dist/src/telemetry/uiTelemetry.test.js +504 -0
  202. package/dist/src/telemetry/uiTelemetry.test.js.map +1 -0
  203. package/dist/src/tools/diffOptions.d.ts +7 -0
  204. package/dist/src/tools/diffOptions.js +10 -0
  205. package/dist/src/tools/diffOptions.js.map +1 -0
  206. package/dist/src/tools/edit.d.ts +79 -0
  207. package/dist/src/tools/edit.js +362 -0
  208. package/dist/src/tools/edit.js.map +1 -0
  209. package/dist/src/tools/edit.test.d.ts +6 -0
  210. package/dist/src/tools/edit.test.js +512 -0
  211. package/dist/src/tools/edit.test.js.map +1 -0
  212. package/dist/src/tools/glob.d.ts +58 -0
  213. package/dist/src/tools/glob.js +193 -0
  214. package/dist/src/tools/glob.js.map +1 -0
  215. package/dist/src/tools/glob.test.d.ts +6 -0
  216. package/dist/src/tools/glob.test.js +294 -0
  217. package/dist/src/tools/glob.test.js.map +1 -0
  218. package/dist/src/tools/grep.d.ts +78 -0
  219. package/dist/src/tools/grep.js +422 -0
  220. package/dist/src/tools/grep.js.map +1 -0
  221. package/dist/src/tools/grep.test.d.ts +6 -0
  222. package/dist/src/tools/grep.test.js +188 -0
  223. package/dist/src/tools/grep.test.js.map +1 -0
  224. package/dist/src/tools/ls.d.ts +86 -0
  225. package/dist/src/tools/ls.js +223 -0
  226. package/dist/src/tools/ls.js.map +1 -0
  227. package/dist/src/tools/mcp-client.d.ts +110 -0
  228. package/dist/src/tools/mcp-client.js +319 -0
  229. package/dist/src/tools/mcp-client.js.map +1 -0
  230. package/dist/src/tools/mcp-client.test.d.ts +6 -0
  231. package/dist/src/tools/mcp-client.test.js +156 -0
  232. package/dist/src/tools/mcp-client.test.js.map +1 -0
  233. package/dist/src/tools/mcp-tool.d.ts +29 -0
  234. package/dist/src/tools/mcp-tool.js +143 -0
  235. package/dist/src/tools/mcp-tool.js.map +1 -0
  236. package/dist/src/tools/mcp-tool.test.d.ts +6 -0
  237. package/dist/src/tools/mcp-tool.test.js +189 -0
  238. package/dist/src/tools/mcp-tool.test.js.map +1 -0
  239. package/dist/src/tools/memoryTool.d.ts +28 -0
  240. package/dist/src/tools/memoryTool.js +172 -0
  241. package/dist/src/tools/memoryTool.js.map +1 -0
  242. package/dist/src/tools/memoryTool.test.d.ts +6 -0
  243. package/dist/src/tools/memoryTool.test.js +181 -0
  244. package/dist/src/tools/memoryTool.test.js.map +1 -0
  245. package/dist/src/tools/modifiable-tool.d.ts +29 -0
  246. package/dist/src/tools/modifiable-tool.js +85 -0
  247. package/dist/src/tools/modifiable-tool.js.map +1 -0
  248. package/dist/src/tools/modifiable-tool.test.d.ts +6 -0
  249. package/dist/src/tools/modifiable-tool.test.js +204 -0
  250. package/dist/src/tools/modifiable-tool.test.js.map +1 -0
  251. package/dist/src/tools/read-file.d.ts +36 -0
  252. package/dist/src/tools/read-file.js +102 -0
  253. package/dist/src/tools/read-file.js.map +1 -0
  254. package/dist/src/tools/read-file.test.d.ts +6 -0
  255. package/dist/src/tools/read-file.test.js +181 -0
  256. package/dist/src/tools/read-file.test.js.map +1 -0
  257. package/dist/src/tools/read-many-files.d.ts +62 -0
  258. package/dist/src/tools/read-many-files.js +362 -0
  259. package/dist/src/tools/read-many-files.js.map +1 -0
  260. package/dist/src/tools/read-many-files.test.d.ts +6 -0
  261. package/dist/src/tools/read-many-files.test.js +315 -0
  262. package/dist/src/tools/read-many-files.test.js.map +1 -0
  263. package/dist/src/tools/shell.d.ts +43 -0
  264. package/dist/src/tools/shell.js +435 -0
  265. package/dist/src/tools/shell.js.map +1 -0
  266. package/dist/src/tools/shell.test.d.ts +6 -0
  267. package/dist/src/tools/shell.test.js +406 -0
  268. package/dist/src/tools/shell.test.js.map +1 -0
  269. package/dist/src/tools/tool-registry.d.ts +66 -0
  270. package/dist/src/tools/tool-registry.js +329 -0
  271. package/dist/src/tools/tool-registry.js.map +1 -0
  272. package/dist/src/tools/tool-registry.test.d.ts +6 -0
  273. package/dist/src/tools/tool-registry.test.js +424 -0
  274. package/dist/src/tools/tool-registry.test.js.map +1 -0
  275. package/dist/src/tools/tools.d.ts +219 -0
  276. package/dist/src/tools/tools.js +111 -0
  277. package/dist/src/tools/tools.js.map +1 -0
  278. package/dist/src/tools/web-fetch.d.ts +29 -0
  279. package/dist/src/tools/web-fetch.js +246 -0
  280. package/dist/src/tools/web-fetch.js.map +1 -0
  281. package/dist/src/tools/web-fetch.test.d.ts +6 -0
  282. package/dist/src/tools/web-fetch.test.js +71 -0
  283. package/dist/src/tools/web-fetch.test.js.map +1 -0
  284. package/dist/src/tools/web-search.d.ts +49 -0
  285. package/dist/src/tools/web-search.js +120 -0
  286. package/dist/src/tools/web-search.js.map +1 -0
  287. package/dist/src/tools/write-file.d.ts +42 -0
  288. package/dist/src/tools/write-file.js +253 -0
  289. package/dist/src/tools/write-file.js.map +1 -0
  290. package/dist/src/tools/write-file.test.d.ts +6 -0
  291. package/dist/src/tools/write-file.test.js +413 -0
  292. package/dist/src/tools/write-file.test.js.map +1 -0
  293. package/dist/src/utils/LruCache.d.ts +13 -0
  294. package/dist/src/utils/LruCache.js +38 -0
  295. package/dist/src/utils/LruCache.js.map +1 -0
  296. package/dist/src/utils/bfsFileSearch.d.ts +24 -0
  297. package/dist/src/utils/bfsFileSearch.js +65 -0
  298. package/dist/src/utils/bfsFileSearch.js.map +1 -0
  299. package/dist/src/utils/bfsFileSearch.test.d.ts +6 -0
  300. package/dist/src/utils/bfsFileSearch.test.js +162 -0
  301. package/dist/src/utils/bfsFileSearch.test.js.map +1 -0
  302. package/dist/src/utils/browser.d.ts +13 -0
  303. package/dist/src/utils/browser.js +49 -0
  304. package/dist/src/utils/browser.js.map +1 -0
  305. package/dist/src/utils/editCorrector.d.ts +53 -0
  306. package/dist/src/utils/editCorrector.js +546 -0
  307. package/dist/src/utils/editCorrector.js.map +1 -0
  308. package/dist/src/utils/editCorrector.test.d.ts +6 -0
  309. package/dist/src/utils/editCorrector.test.js +564 -0
  310. package/dist/src/utils/editCorrector.test.js.map +1 -0
  311. package/dist/src/utils/editor.d.ts +28 -0
  312. package/dist/src/utils/editor.js +169 -0
  313. package/dist/src/utils/editor.js.map +1 -0
  314. package/dist/src/utils/editor.test.d.ts +6 -0
  315. package/dist/src/utils/editor.test.js +393 -0
  316. package/dist/src/utils/editor.test.js.map +1 -0
  317. package/dist/src/utils/errorReporting.d.ts +14 -0
  318. package/dist/src/utils/errorReporting.js +88 -0
  319. package/dist/src/utils/errorReporting.js.map +1 -0
  320. package/dist/src/utils/errorReporting.test.d.ts +6 -0
  321. package/dist/src/utils/errorReporting.test.js +124 -0
  322. package/dist/src/utils/errorReporting.test.js.map +1 -0
  323. package/dist/src/utils/errors.d.ts +14 -0
  324. package/dist/src/utils/errors.js +54 -0
  325. package/dist/src/utils/errors.js.map +1 -0
  326. package/dist/src/utils/fetch.d.ts +11 -0
  327. package/dist/src/utils/fetch.js +51 -0
  328. package/dist/src/utils/fetch.js.map +1 -0
  329. package/dist/src/utils/fileUtils.d.ts +49 -0
  330. package/dist/src/utils/fileUtils.js +300 -0
  331. package/dist/src/utils/fileUtils.js.map +1 -0
  332. package/dist/src/utils/fileUtils.test.d.ts +6 -0
  333. package/dist/src/utils/fileUtils.test.js +321 -0
  334. package/dist/src/utils/fileUtils.test.js.map +1 -0
  335. package/dist/src/utils/flashFallback.integration.test.d.ts +6 -0
  336. package/dist/src/utils/flashFallback.integration.test.js +112 -0
  337. package/dist/src/utils/flashFallback.integration.test.js.map +1 -0
  338. package/dist/src/utils/generateContentResponseUtilities.d.ts +14 -0
  339. package/dist/src/utils/generateContentResponseUtilities.js +92 -0
  340. package/dist/src/utils/generateContentResponseUtilities.js.map +1 -0
  341. package/dist/src/utils/generateContentResponseUtilities.test.d.ts +6 -0
  342. package/dist/src/utils/generateContentResponseUtilities.test.js +273 -0
  343. package/dist/src/utils/generateContentResponseUtilities.test.js.map +1 -0
  344. package/dist/src/utils/getFolderStructure.d.ts +31 -0
  345. package/dist/src/utils/getFolderStructure.js +246 -0
  346. package/dist/src/utils/getFolderStructure.js.map +1 -0
  347. package/dist/src/utils/getFolderStructure.test.d.ts +6 -0
  348. package/dist/src/utils/getFolderStructure.test.js +284 -0
  349. package/dist/src/utils/getFolderStructure.test.js.map +1 -0
  350. package/dist/src/utils/gitIgnoreParser.d.ts +20 -0
  351. package/dist/src/utils/gitIgnoreParser.js +67 -0
  352. package/dist/src/utils/gitIgnoreParser.js.map +1 -0
  353. package/dist/src/utils/gitIgnoreParser.test.d.ts +6 -0
  354. package/dist/src/utils/gitIgnoreParser.test.js +157 -0
  355. package/dist/src/utils/gitIgnoreParser.test.js.map +1 -0
  356. package/dist/src/utils/gitUtils.d.ts +17 -0
  357. package/dist/src/utils/gitUtils.js +61 -0
  358. package/dist/src/utils/gitUtils.js.map +1 -0
  359. package/dist/src/utils/memoryDiscovery.d.ts +15 -0
  360. package/dist/src/utils/memoryDiscovery.js +226 -0
  361. package/dist/src/utils/memoryDiscovery.js.map +1 -0
  362. package/dist/src/utils/memoryDiscovery.test.d.ts +6 -0
  363. package/dist/src/utils/memoryDiscovery.test.js +432 -0
  364. package/dist/src/utils/memoryDiscovery.test.js.map +1 -0
  365. package/dist/src/utils/memoryImportProcessor.d.ts +35 -0
  366. package/dist/src/utils/memoryImportProcessor.js +141 -0
  367. package/dist/src/utils/memoryImportProcessor.js.map +1 -0
  368. package/dist/src/utils/memoryImportProcessor.test.d.ts +6 -0
  369. package/dist/src/utils/memoryImportProcessor.test.js +170 -0
  370. package/dist/src/utils/memoryImportProcessor.test.js.map +1 -0
  371. package/dist/src/utils/messageInspectors.d.ts +8 -0
  372. package/dist/src/utils/messageInspectors.js +16 -0
  373. package/dist/src/utils/messageInspectors.js.map +1 -0
  374. package/dist/src/utils/nextSpeakerChecker.d.ts +12 -0
  375. package/dist/src/utils/nextSpeakerChecker.js +112 -0
  376. package/dist/src/utils/nextSpeakerChecker.js.map +1 -0
  377. package/dist/src/utils/nextSpeakerChecker.test.d.ts +6 -0
  378. package/dist/src/utils/nextSpeakerChecker.test.js +168 -0
  379. package/dist/src/utils/nextSpeakerChecker.test.js.map +1 -0
  380. package/dist/src/utils/paths.d.ts +59 -0
  381. package/dist/src/utils/paths.js +153 -0
  382. package/dist/src/utils/paths.js.map +1 -0
  383. package/dist/src/utils/quotaErrorDetection.d.ts +22 -0
  384. package/dist/src/utils/quotaErrorDetection.js +65 -0
  385. package/dist/src/utils/quotaErrorDetection.js.map +1 -0
  386. package/dist/src/utils/retry.d.ts +27 -0
  387. package/dist/src/utils/retry.js +276 -0
  388. package/dist/src/utils/retry.js.map +1 -0
  389. package/dist/src/utils/retry.test.d.ts +6 -0
  390. package/dist/src/utils/retry.test.js +322 -0
  391. package/dist/src/utils/retry.test.js.map +1 -0
  392. package/dist/src/utils/safeJsonStringify.d.ts +13 -0
  393. package/dist/src/utils/safeJsonStringify.js +25 -0
  394. package/dist/src/utils/safeJsonStringify.js.map +1 -0
  395. package/dist/src/utils/safeJsonStringify.test.d.ts +6 -0
  396. package/dist/src/utils/safeJsonStringify.test.js +61 -0
  397. package/dist/src/utils/safeJsonStringify.test.js.map +1 -0
  398. package/dist/src/utils/schemaValidator.d.ts +22 -0
  399. package/dist/src/utils/schemaValidator.js +65 -0
  400. package/dist/src/utils/schemaValidator.js.map +1 -0
  401. package/dist/src/utils/session.d.ts +6 -0
  402. package/dist/src/utils/session.js +8 -0
  403. package/dist/src/utils/session.js.map +1 -0
  404. package/dist/src/utils/stripJsonCodeBlock.d.ts +13 -0
  405. package/dist/src/utils/stripJsonCodeBlock.js +21 -0
  406. package/dist/src/utils/stripJsonCodeBlock.js.map +1 -0
  407. package/dist/src/utils/summarizer.d.ts +25 -0
  408. package/dist/src/utils/summarizer.js +80 -0
  409. package/dist/src/utils/summarizer.js.map +1 -0
  410. package/dist/src/utils/summarizer.test.d.ts +6 -0
  411. package/dist/src/utils/summarizer.test.js +131 -0
  412. package/dist/src/utils/summarizer.test.js.map +1 -0
  413. package/dist/src/utils/systemEncoding.d.ts +40 -0
  414. package/dist/src/utils/systemEncoding.js +149 -0
  415. package/dist/src/utils/systemEncoding.js.map +1 -0
  416. package/dist/src/utils/systemEncoding.test.d.ts +6 -0
  417. package/dist/src/utils/systemEncoding.test.js +368 -0
  418. package/dist/src/utils/systemEncoding.test.js.map +1 -0
  419. package/dist/src/utils/testUtils.d.ts +29 -0
  420. package/dist/src/utils/testUtils.js +70 -0
  421. package/dist/src/utils/testUtils.js.map +1 -0
  422. package/dist/src/utils/user_account.d.ts +9 -0
  423. package/dist/src/utils/user_account.js +99 -0
  424. package/dist/src/utils/user_account.js.map +1 -0
  425. package/dist/src/utils/user_account.test.d.ts +6 -0
  426. package/dist/src/utils/user_account.test.js +153 -0
  427. package/dist/src/utils/user_account.test.js.map +1 -0
  428. package/dist/src/utils/user_id.d.ts +11 -0
  429. package/dist/src/utils/user_id.js +49 -0
  430. package/dist/src/utils/user_id.js.map +1 -0
  431. package/dist/src/utils/user_id.test.d.ts +6 -0
  432. package/dist/src/utils/user_id.test.js +21 -0
  433. package/dist/src/utils/user_id.test.js.map +1 -0
  434. package/dist/tsconfig.tsbuildinfo +1 -0
  435. package/package.json +62 -0
@@ -0,0 +1,246 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import * as fs from 'fs/promises';
7
+ import * as path from 'path';
8
+ import { getErrorMessage, isNodeError } from './errors.js';
9
+ import { DEFAULT_FILE_FILTERING_OPTIONS } from '../config/config.js';
10
+ const MAX_ITEMS = 200;
11
+ const TRUNCATION_INDICATOR = '...';
12
+ const DEFAULT_IGNORED_FOLDERS = new Set(['node_modules', '.git', 'dist']);
13
+ // --- Interfaces ---
14
+ // --- Helper Functions ---
15
+ async function readFullStructure(rootPath, options) {
16
+ const rootName = path.basename(rootPath);
17
+ const rootNode = {
18
+ name: rootName,
19
+ path: rootPath,
20
+ files: [],
21
+ subFolders: [],
22
+ totalChildren: 0,
23
+ totalFiles: 0,
24
+ };
25
+ const queue = [
26
+ { folderInfo: rootNode, currentPath: rootPath },
27
+ ];
28
+ let currentItemCount = 0;
29
+ // Count the root node itself as one item if we are not just listing its content
30
+ const processedPaths = new Set(); // To avoid processing same path if symlinks create loops
31
+ while (queue.length > 0) {
32
+ const { folderInfo, currentPath } = queue.shift();
33
+ if (processedPaths.has(currentPath)) {
34
+ continue;
35
+ }
36
+ processedPaths.add(currentPath);
37
+ if (currentItemCount >= options.maxItems) {
38
+ // If the root itself caused us to exceed, we can't really show anything.
39
+ // Otherwise, this folder won't be processed further.
40
+ // The parent that queued this would have set its own hasMoreSubfolders flag.
41
+ continue;
42
+ }
43
+ let entries;
44
+ try {
45
+ const rawEntries = await fs.readdir(currentPath, { withFileTypes: true });
46
+ // Sort entries alphabetically by name for consistent processing order
47
+ entries = rawEntries.sort((a, b) => a.name.localeCompare(b.name));
48
+ }
49
+ catch (error) {
50
+ if (isNodeError(error) &&
51
+ (error.code === 'EACCES' || error.code === 'ENOENT')) {
52
+ console.warn(`Warning: Could not read directory ${currentPath}: ${error.message}`);
53
+ if (currentPath === rootPath && error.code === 'ENOENT') {
54
+ return null; // Root directory itself not found
55
+ }
56
+ // For other EACCES/ENOENT on subdirectories, just skip them.
57
+ continue;
58
+ }
59
+ throw error;
60
+ }
61
+ const filesInCurrentDir = [];
62
+ const subFoldersInCurrentDir = [];
63
+ // Process files first in the current directory
64
+ for (const entry of entries) {
65
+ if (entry.isFile()) {
66
+ if (currentItemCount >= options.maxItems) {
67
+ folderInfo.hasMoreFiles = true;
68
+ break;
69
+ }
70
+ const fileName = entry.name;
71
+ const filePath = path.join(currentPath, fileName);
72
+ if (options.fileService) {
73
+ const shouldIgnore = (options.fileFilteringOptions.respectGitIgnore &&
74
+ options.fileService.shouldGitIgnoreFile(filePath)) ||
75
+ (options.fileFilteringOptions.respectGeminiIgnore &&
76
+ options.fileService.shouldGeminiIgnoreFile(filePath));
77
+ if (shouldIgnore) {
78
+ continue;
79
+ }
80
+ }
81
+ if (!options.fileIncludePattern ||
82
+ options.fileIncludePattern.test(fileName)) {
83
+ filesInCurrentDir.push(fileName);
84
+ currentItemCount++;
85
+ folderInfo.totalFiles++;
86
+ folderInfo.totalChildren++;
87
+ }
88
+ }
89
+ }
90
+ folderInfo.files = filesInCurrentDir;
91
+ // Then process directories and queue them
92
+ for (const entry of entries) {
93
+ if (entry.isDirectory()) {
94
+ // Check if adding this directory ITSELF would meet or exceed maxItems
95
+ // (currentItemCount refers to items *already* added before this one)
96
+ if (currentItemCount >= options.maxItems) {
97
+ folderInfo.hasMoreSubfolders = true;
98
+ break; // Already at limit, cannot add this folder or any more
99
+ }
100
+ // If adding THIS folder makes us hit the limit exactly, and it might have children,
101
+ // it's better to show '...' for the parent, unless this is the very last item slot.
102
+ // This logic is tricky. Let's try a simpler: if we can't add this item, mark and break.
103
+ const subFolderName = entry.name;
104
+ const subFolderPath = path.join(currentPath, subFolderName);
105
+ let isIgnored = false;
106
+ if (options.fileService) {
107
+ isIgnored =
108
+ (options.fileFilteringOptions.respectGitIgnore &&
109
+ options.fileService.shouldGitIgnoreFile(subFolderPath)) ||
110
+ (options.fileFilteringOptions.respectGeminiIgnore &&
111
+ options.fileService.shouldGeminiIgnoreFile(subFolderPath));
112
+ }
113
+ if (options.ignoredFolders.has(subFolderName) || isIgnored) {
114
+ const ignoredSubFolder = {
115
+ name: subFolderName,
116
+ path: subFolderPath,
117
+ files: [],
118
+ subFolders: [],
119
+ totalChildren: 0,
120
+ totalFiles: 0,
121
+ isIgnored: true,
122
+ };
123
+ subFoldersInCurrentDir.push(ignoredSubFolder);
124
+ currentItemCount++; // Count the ignored folder itself
125
+ folderInfo.totalChildren++; // Also counts towards parent's children
126
+ continue;
127
+ }
128
+ const subFolderNode = {
129
+ name: subFolderName,
130
+ path: subFolderPath,
131
+ files: [],
132
+ subFolders: [],
133
+ totalChildren: 0,
134
+ totalFiles: 0,
135
+ };
136
+ subFoldersInCurrentDir.push(subFolderNode);
137
+ currentItemCount++;
138
+ folderInfo.totalChildren++; // Counts towards parent's children
139
+ // Add to queue for processing its children later
140
+ queue.push({ folderInfo: subFolderNode, currentPath: subFolderPath });
141
+ }
142
+ }
143
+ folderInfo.subFolders = subFoldersInCurrentDir;
144
+ }
145
+ return rootNode;
146
+ }
147
+ /**
148
+ * Reads the directory structure using BFS, respecting maxItems.
149
+ * @param node The current node in the reduced structure.
150
+ * @param indent The current indentation string.
151
+ * @param isLast Sibling indicator.
152
+ * @param builder Array to build the string lines.
153
+ */
154
+ function formatStructure(node, currentIndent, isLastChildOfParent, isProcessingRootNode, builder) {
155
+ const connector = isLastChildOfParent ? '└───' : '├───';
156
+ // The root node of the structure (the one passed initially to getFolderStructure)
157
+ // is not printed with a connector line itself, only its name as a header.
158
+ // Its children are printed relative to that conceptual root.
159
+ // Ignored root nodes ARE printed with a connector.
160
+ if (!isProcessingRootNode || node.isIgnored) {
161
+ builder.push(`${currentIndent}${connector}${node.name}${path.sep}${node.isIgnored ? TRUNCATION_INDICATOR : ''}`);
162
+ }
163
+ // Determine the indent for the children of *this* node.
164
+ // If *this* node was the root of the whole structure, its children start with no indent before their connectors.
165
+ // Otherwise, children's indent extends from the current node's indent.
166
+ const indentForChildren = isProcessingRootNode
167
+ ? ''
168
+ : currentIndent + (isLastChildOfParent ? ' ' : '│ ');
169
+ // Render files of the current node
170
+ const fileCount = node.files.length;
171
+ for (let i = 0; i < fileCount; i++) {
172
+ const isLastFileAmongSiblings = i === fileCount - 1 &&
173
+ node.subFolders.length === 0 &&
174
+ !node.hasMoreSubfolders;
175
+ const fileConnector = isLastFileAmongSiblings ? '└───' : '├───';
176
+ builder.push(`${indentForChildren}${fileConnector}${node.files[i]}`);
177
+ }
178
+ if (node.hasMoreFiles) {
179
+ const isLastIndicatorAmongSiblings = node.subFolders.length === 0 && !node.hasMoreSubfolders;
180
+ const fileConnector = isLastIndicatorAmongSiblings ? '└───' : '├───';
181
+ builder.push(`${indentForChildren}${fileConnector}${TRUNCATION_INDICATOR}`);
182
+ }
183
+ // Render subfolders of the current node
184
+ const subFolderCount = node.subFolders.length;
185
+ for (let i = 0; i < subFolderCount; i++) {
186
+ const isLastSubfolderAmongSiblings = i === subFolderCount - 1 && !node.hasMoreSubfolders;
187
+ // Children are never the root node being processed initially.
188
+ formatStructure(node.subFolders[i], indentForChildren, isLastSubfolderAmongSiblings, false, builder);
189
+ }
190
+ if (node.hasMoreSubfolders) {
191
+ builder.push(`${indentForChildren}└───${TRUNCATION_INDICATOR}`);
192
+ }
193
+ }
194
+ // --- Main Exported Function ---
195
+ /**
196
+ * Generates a string representation of a directory's structure,
197
+ * limiting the number of items displayed. Ignored folders are shown
198
+ * followed by '...' instead of their contents.
199
+ *
200
+ * @param directory The absolute or relative path to the directory.
201
+ * @param options Optional configuration settings.
202
+ * @returns A promise resolving to the formatted folder structure string.
203
+ */
204
+ export async function getFolderStructure(directory, options) {
205
+ const resolvedPath = path.resolve(directory);
206
+ const mergedOptions = {
207
+ maxItems: options?.maxItems ?? MAX_ITEMS,
208
+ ignoredFolders: options?.ignoredFolders ?? DEFAULT_IGNORED_FOLDERS,
209
+ fileIncludePattern: options?.fileIncludePattern,
210
+ fileService: options?.fileService,
211
+ fileFilteringOptions: options?.fileFilteringOptions ?? DEFAULT_FILE_FILTERING_OPTIONS,
212
+ };
213
+ try {
214
+ // 1. Read the structure using BFS, respecting maxItems
215
+ const structureRoot = await readFullStructure(resolvedPath, mergedOptions);
216
+ if (!structureRoot) {
217
+ return `Error: Could not read directory "${resolvedPath}". Check path and permissions.`;
218
+ }
219
+ // 2. Format the structure into a string
220
+ const structureLines = [];
221
+ // Pass true for isRoot for the initial call
222
+ formatStructure(structureRoot, '', true, true, structureLines);
223
+ // 3. Build the final output string
224
+ function isTruncated(node) {
225
+ if (node.hasMoreFiles || node.hasMoreSubfolders || node.isIgnored) {
226
+ return true;
227
+ }
228
+ for (const sub of node.subFolders) {
229
+ if (isTruncated(sub)) {
230
+ return true;
231
+ }
232
+ }
233
+ return false;
234
+ }
235
+ let summary = `Showing up to ${mergedOptions.maxItems} items (files + folders).`;
236
+ if (isTruncated(structureRoot)) {
237
+ summary += ` Folders or files indicated with ${TRUNCATION_INDICATOR} contain more items not shown, were ignored, or the display limit (${mergedOptions.maxItems} items) was reached.`;
238
+ }
239
+ return `${summary}\n\n${resolvedPath}${path.sep}\n${structureLines.join('\n')}`;
240
+ }
241
+ catch (error) {
242
+ console.error(`Error getting folder structure for ${resolvedPath}:`, error);
243
+ return `Error processing directory "${resolvedPath}": ${getErrorMessage(error)}`;
244
+ }
245
+ }
246
+ //# sourceMappingURL=getFolderStructure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getFolderStructure.js","sourceRoot":"","sources":["../../../src/utils/getFolderStructure.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};
@@ -0,0 +1,284 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
7
+ import fsPromises from 'fs/promises';
8
+ import * as nodePath from 'path';
9
+ import * as os from 'os';
10
+ import { getFolderStructure } from './getFolderStructure.js';
11
+ import * as gitUtils from './gitUtils.js';
12
+ import { FileDiscoveryService } from '../services/fileDiscoveryService.js';
13
+ import * as path from 'path';
14
+ vi.mock('./gitUtils.js');
15
+ describe('getFolderStructure', () => {
16
+ let testRootDir;
17
+ const createEmptyDir = async (...pathSegments) => {
18
+ const fullPath = path.join(testRootDir, ...pathSegments);
19
+ await fsPromises.mkdir(fullPath, { recursive: true });
20
+ };
21
+ const createTestFile = async (...pathSegments) => {
22
+ const fullPath = path.join(testRootDir, ...pathSegments);
23
+ await fsPromises.mkdir(path.dirname(fullPath), { recursive: true });
24
+ await fsPromises.writeFile(fullPath, '');
25
+ return fullPath;
26
+ };
27
+ beforeEach(async () => {
28
+ testRootDir = await fsPromises.mkdtemp(path.join(os.tmpdir(), 'folder-structure-test-'));
29
+ vi.resetAllMocks();
30
+ });
31
+ afterEach(async () => {
32
+ await fsPromises.rm(testRootDir, { recursive: true, force: true });
33
+ vi.restoreAllMocks();
34
+ });
35
+ it('should return basic folder structure', async () => {
36
+ await createTestFile('fileA1.ts');
37
+ await createTestFile('fileA2.js');
38
+ await createTestFile('subfolderB', 'fileB1.md');
39
+ const structure = await getFolderStructure(testRootDir);
40
+ expect(structure.trim()).toBe(`
41
+ Showing up to 200 items (files + folders).
42
+
43
+ ${testRootDir}${path.sep}
44
+ ├───fileA1.ts
45
+ ├───fileA2.js
46
+ └───subfolderB${path.sep}
47
+ └───fileB1.md
48
+ `.trim());
49
+ });
50
+ it('should handle an empty folder', async () => {
51
+ const structure = await getFolderStructure(testRootDir);
52
+ expect(structure.trim()).toBe(`
53
+ Showing up to 200 items (files + folders).
54
+
55
+ ${testRootDir}${path.sep}
56
+ `
57
+ .trim()
58
+ .trim());
59
+ });
60
+ it('should ignore folders specified in ignoredFolders (default)', async () => {
61
+ await createTestFile('.hiddenfile');
62
+ await createTestFile('file1.txt');
63
+ await createEmptyDir('emptyFolder');
64
+ await createTestFile('node_modules', 'somepackage', 'index.js');
65
+ await createTestFile('subfolderA', 'fileA1.ts');
66
+ await createTestFile('subfolderA', 'fileA2.js');
67
+ await createTestFile('subfolderA', 'subfolderB', 'fileB1.md');
68
+ const structure = await getFolderStructure(testRootDir);
69
+ expect(structure.trim()).toBe(`
70
+ Showing up to 200 items (files + folders). Folders or files indicated with ... contain more items not shown, were ignored, or the display limit (200 items) was reached.
71
+
72
+ ${testRootDir}${path.sep}
73
+ ├───.hiddenfile
74
+ ├───file1.txt
75
+ ├───emptyFolder${path.sep}
76
+ ├───node_modules${path.sep}...
77
+ └───subfolderA${path.sep}
78
+ ├───fileA1.ts
79
+ ├───fileA2.js
80
+ └───subfolderB${path.sep}
81
+ └───fileB1.md
82
+ `.trim());
83
+ });
84
+ it('should ignore folders specified in custom ignoredFolders', async () => {
85
+ await createTestFile('.hiddenfile');
86
+ await createTestFile('file1.txt');
87
+ await createEmptyDir('emptyFolder');
88
+ await createTestFile('node_modules', 'somepackage', 'index.js');
89
+ await createTestFile('subfolderA', 'fileA1.ts');
90
+ const structure = await getFolderStructure(testRootDir, {
91
+ ignoredFolders: new Set(['subfolderA', 'node_modules']),
92
+ });
93
+ const expected = `
94
+ Showing up to 200 items (files + folders). Folders or files indicated with ... contain more items not shown, were ignored, or the display limit (200 items) was reached.
95
+
96
+ ${testRootDir}${path.sep}
97
+ ├───.hiddenfile
98
+ ├───file1.txt
99
+ ├───emptyFolder${path.sep}
100
+ ├───node_modules${path.sep}...
101
+ └───subfolderA${path.sep}...
102
+ `.trim();
103
+ expect(structure.trim()).toBe(expected);
104
+ });
105
+ it('should filter files by fileIncludePattern', async () => {
106
+ await createTestFile('fileA1.ts');
107
+ await createTestFile('fileA2.js');
108
+ await createTestFile('subfolderB', 'fileB1.md');
109
+ const structure = await getFolderStructure(testRootDir, {
110
+ fileIncludePattern: /\.ts$/,
111
+ });
112
+ const expected = `
113
+ Showing up to 200 items (files + folders).
114
+
115
+ ${testRootDir}${path.sep}
116
+ ├───fileA1.ts
117
+ └───subfolderB${path.sep}
118
+ `.trim();
119
+ expect(structure.trim()).toBe(expected);
120
+ });
121
+ it('should handle maxItems truncation for files within a folder', async () => {
122
+ await createTestFile('fileA1.ts');
123
+ await createTestFile('fileA2.js');
124
+ await createTestFile('subfolderB', 'fileB1.md');
125
+ const structure = await getFolderStructure(testRootDir, {
126
+ maxItems: 3,
127
+ });
128
+ const expected = `
129
+ Showing up to 3 items (files + folders).
130
+
131
+ ${testRootDir}${path.sep}
132
+ ├───fileA1.ts
133
+ ├───fileA2.js
134
+ └───subfolderB${path.sep}
135
+ `.trim();
136
+ expect(structure.trim()).toBe(expected);
137
+ });
138
+ it('should handle maxItems truncation for subfolders', async () => {
139
+ for (let i = 0; i < 5; i++) {
140
+ await createTestFile(`folder-${i}`, 'child.txt');
141
+ }
142
+ const structure = await getFolderStructure(testRootDir, {
143
+ maxItems: 4,
144
+ });
145
+ const expectedRevised = `
146
+ Showing up to 4 items (files + folders). Folders or files indicated with ... contain more items not shown, were ignored, or the display limit (4 items) was reached.
147
+
148
+ ${testRootDir}${path.sep}
149
+ ├───folder-0${path.sep}
150
+ ├───folder-1${path.sep}
151
+ ├───folder-2${path.sep}
152
+ ├───folder-3${path.sep}
153
+ └───...
154
+ `.trim();
155
+ expect(structure.trim()).toBe(expectedRevised);
156
+ });
157
+ it('should handle maxItems that only allows the root folder itself', async () => {
158
+ await createTestFile('fileA1.ts');
159
+ await createTestFile('fileA2.ts');
160
+ await createTestFile('subfolderB', 'fileB1.ts');
161
+ const structure = await getFolderStructure(testRootDir, {
162
+ maxItems: 1,
163
+ });
164
+ const expected = `
165
+ Showing up to 1 items (files + folders). Folders or files indicated with ... contain more items not shown, were ignored, or the display limit (1 items) was reached.
166
+
167
+ ${testRootDir}${path.sep}
168
+ ├───fileA1.ts
169
+ ├───...
170
+ └───...
171
+ `.trim();
172
+ expect(structure.trim()).toBe(expected);
173
+ });
174
+ it('should handle non-existent directory', async () => {
175
+ const nonExistentPath = path.join(testRootDir, 'non-existent');
176
+ const structure = await getFolderStructure(nonExistentPath);
177
+ expect(structure).toContain(`Error: Could not read directory "${nonExistentPath}". Check path and permissions.`);
178
+ });
179
+ it('should handle deep folder structure within limits', async () => {
180
+ await createTestFile('level1', 'level2', 'level3', 'file.txt');
181
+ const structure = await getFolderStructure(testRootDir, {
182
+ maxItems: 10,
183
+ });
184
+ const expected = `
185
+ Showing up to 10 items (files + folders).
186
+
187
+ ${testRootDir}${path.sep}
188
+ └───level1${path.sep}
189
+ └───level2${path.sep}
190
+ └───level3${path.sep}
191
+ └───file.txt
192
+ `.trim();
193
+ expect(structure.trim()).toBe(expected);
194
+ });
195
+ it('should truncate deep folder structure if maxItems is small', async () => {
196
+ await createTestFile('level1', 'level2', 'level3', 'file.txt');
197
+ const structure = await getFolderStructure(testRootDir, {
198
+ maxItems: 3,
199
+ });
200
+ const expected = `
201
+ Showing up to 3 items (files + folders).
202
+
203
+ ${testRootDir}${path.sep}
204
+ └───level1${path.sep}
205
+ └───level2${path.sep}
206
+ └───level3${path.sep}
207
+ `.trim();
208
+ expect(structure.trim()).toBe(expected);
209
+ });
210
+ describe('with gitignore', () => {
211
+ beforeEach(() => {
212
+ vi.mocked(gitUtils.isGitRepository).mockReturnValue(true);
213
+ });
214
+ it('should ignore files and folders specified in .gitignore', async () => {
215
+ await fsPromises.writeFile(nodePath.join(testRootDir, '.gitignore'), 'ignored.txt\nnode_modules/\n.gemini/*\n!/.gemini/config.yaml');
216
+ await createTestFile('file1.txt');
217
+ await createTestFile('node_modules', 'some-package', 'index.js');
218
+ await createTestFile('ignored.txt');
219
+ await createTestFile('.gemini', 'config.yaml');
220
+ await createTestFile('.gemini', 'logs.json');
221
+ const fileService = new FileDiscoveryService(testRootDir);
222
+ const structure = await getFolderStructure(testRootDir, {
223
+ fileService,
224
+ });
225
+ expect(structure).not.toContain('ignored.txt');
226
+ expect(structure).toContain(`node_modules${path.sep}...`);
227
+ expect(structure).not.toContain('logs.json');
228
+ expect(structure).toContain('config.yaml');
229
+ expect(structure).toContain('file1.txt');
230
+ });
231
+ it('should not ignore files if respectGitIgnore is false', async () => {
232
+ await fsPromises.writeFile(nodePath.join(testRootDir, '.gitignore'), 'ignored.txt');
233
+ await createTestFile('file1.txt');
234
+ await createTestFile('ignored.txt');
235
+ const fileService = new FileDiscoveryService(testRootDir);
236
+ const structure = await getFolderStructure(testRootDir, {
237
+ fileService,
238
+ fileFilteringOptions: {
239
+ respectGeminiIgnore: false,
240
+ respectGitIgnore: false,
241
+ },
242
+ });
243
+ expect(structure).toContain('ignored.txt');
244
+ expect(structure).toContain('file1.txt');
245
+ });
246
+ });
247
+ describe('with geminiignore', () => {
248
+ it('should ignore geminiignore files by default', async () => {
249
+ await fsPromises.writeFile(nodePath.join(testRootDir, '.geminiignore'), 'ignored.txt\nnode_modules/\n.gemini/\n!/.gemini/config.yaml');
250
+ await createTestFile('file1.txt');
251
+ await createTestFile('node_modules', 'some-package', 'index.js');
252
+ await createTestFile('ignored.txt');
253
+ await createTestFile('.gemini', 'config.yaml');
254
+ await createTestFile('.gemini', 'logs.json');
255
+ const fileService = new FileDiscoveryService(testRootDir);
256
+ const structure = await getFolderStructure(testRootDir, {
257
+ fileService,
258
+ });
259
+ expect(structure).not.toContain('ignored.txt');
260
+ expect(structure).toContain('node_modules/...');
261
+ expect(structure).not.toContain('logs.json');
262
+ });
263
+ it('should not ignore files if respectGeminiIgnore is false', async () => {
264
+ await fsPromises.writeFile(nodePath.join(testRootDir, '.geminiignore'), 'ignored.txt\nnode_modules/\n.gemini/\n!/.gemini/config.yaml');
265
+ await createTestFile('file1.txt');
266
+ await createTestFile('node_modules', 'some-package', 'index.js');
267
+ await createTestFile('ignored.txt');
268
+ await createTestFile('.gemini', 'config.yaml');
269
+ await createTestFile('.gemini', 'logs.json');
270
+ const fileService = new FileDiscoveryService(testRootDir);
271
+ const structure = await getFolderStructure(testRootDir, {
272
+ fileService,
273
+ fileFilteringOptions: {
274
+ respectGeminiIgnore: false,
275
+ respectGitIgnore: true, // Explicitly disable gemini ignore only
276
+ },
277
+ });
278
+ expect(structure).toContain('ignored.txt');
279
+ // node_modules is still ignored by default
280
+ expect(structure).toContain('node_modules/...');
281
+ });
282
+ });
283
+ });
284
+ //# sourceMappingURL=getFolderStructure.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getFolderStructure.test.js","sourceRoot":"","sources":["../../../src/utils/getFolderStructure.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export interface GitIgnoreFilter {
7
+ isIgnored(filePath: string): boolean;
8
+ getPatterns(): string[];
9
+ }
10
+ export declare class GitIgnoreParser implements GitIgnoreFilter {
11
+ private projectRoot;
12
+ private ig;
13
+ private patterns;
14
+ constructor(projectRoot: string);
15
+ loadGitRepoPatterns(): void;
16
+ loadPatterns(patternsFileName: string): void;
17
+ private addPatterns;
18
+ isIgnored(filePath: string): boolean;
19
+ getPatterns(): string[];
20
+ }
@@ -0,0 +1,67 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import * as fs from 'fs';
7
+ import * as path from 'path';
8
+ import ignore from 'ignore';
9
+ import { isGitRepository } from './gitUtils.js';
10
+ export class GitIgnoreParser {
11
+ projectRoot;
12
+ ig = ignore();
13
+ patterns = [];
14
+ constructor(projectRoot) {
15
+ this.projectRoot = path.resolve(projectRoot);
16
+ }
17
+ loadGitRepoPatterns() {
18
+ if (!isGitRepository(this.projectRoot))
19
+ return;
20
+ // Always ignore .git directory regardless of .gitignore content
21
+ this.addPatterns(['.git']);
22
+ const patternFiles = ['.gitignore', path.join('.git', 'info', 'exclude')];
23
+ for (const pf of patternFiles) {
24
+ this.loadPatterns(pf);
25
+ }
26
+ }
27
+ loadPatterns(patternsFileName) {
28
+ const patternsFilePath = path.join(this.projectRoot, patternsFileName);
29
+ let content;
30
+ try {
31
+ content = fs.readFileSync(patternsFilePath, 'utf-8');
32
+ }
33
+ catch (_error) {
34
+ // ignore file not found
35
+ return;
36
+ }
37
+ const patterns = (content ?? '')
38
+ .split('\n')
39
+ .map((p) => p.trim())
40
+ .filter((p) => p !== '' && !p.startsWith('#'));
41
+ this.addPatterns(patterns);
42
+ }
43
+ addPatterns(patterns) {
44
+ this.ig.add(patterns);
45
+ this.patterns.push(...patterns);
46
+ }
47
+ isIgnored(filePath) {
48
+ const relativePath = path.isAbsolute(filePath)
49
+ ? path.relative(this.projectRoot, filePath)
50
+ : filePath;
51
+ if (relativePath === '' ||
52
+ relativePath.startsWith('..') ||
53
+ relativePath === '/' ||
54
+ relativePath.startsWith('/')) {
55
+ return false;
56
+ }
57
+ let normalizedPath = relativePath.replace(/\\/g, '/');
58
+ if (normalizedPath.startsWith('./')) {
59
+ normalizedPath = normalizedPath.substring(2);
60
+ }
61
+ return this.ig.ignores(normalizedPath);
62
+ }
63
+ getPatterns() {
64
+ return this.patterns;
65
+ }
66
+ }
67
+ //# sourceMappingURL=gitIgnoreParser.js.map