@machina.ai/cell-cli-core 1.0.21-rc3 → 1.2.2-rc1

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 (479) hide show
  1. package/dist/index.d.ts +3 -1
  2. package/dist/index.js +3 -1
  3. package/dist/index.js.map +1 -1
  4. package/dist/package.json +24 -11
  5. package/dist/src/code_assist/codeAssist.d.ts +4 -3
  6. package/dist/src/code_assist/codeAssist.js.map +1 -1
  7. package/dist/src/code_assist/converter.d.ts +2 -1
  8. package/dist/src/code_assist/converter.js +36 -4
  9. package/dist/src/code_assist/converter.js.map +1 -1
  10. package/dist/src/code_assist/converter.test.js +83 -0
  11. package/dist/src/code_assist/converter.test.js.map +1 -1
  12. package/dist/src/code_assist/oauth2.d.ts +2 -1
  13. package/dist/src/code_assist/oauth2.js +29 -24
  14. package/dist/src/code_assist/oauth2.js.map +1 -1
  15. package/dist/src/code_assist/oauth2.test.js +65 -15
  16. package/dist/src/code_assist/oauth2.test.js.map +1 -1
  17. package/dist/src/code_assist/server.d.ts +5 -5
  18. package/dist/src/code_assist/server.js +1 -1
  19. package/dist/src/code_assist/server.js.map +1 -1
  20. package/dist/src/code_assist/setup.d.ts +1 -1
  21. package/dist/src/code_assist/setup.js +1 -1
  22. package/dist/src/code_assist/setup.js.map +1 -1
  23. package/dist/src/code_assist/setup.test.js.map +1 -1
  24. package/dist/src/config/config.d.ts +53 -11
  25. package/dist/src/config/config.js +113 -29
  26. package/dist/src/config/config.js.map +1 -1
  27. package/dist/src/config/config.test.js +103 -5
  28. package/dist/src/config/config.test.js.map +1 -1
  29. package/dist/src/config/models.d.ts +1 -0
  30. package/dist/src/config/models.js +2 -0
  31. package/dist/src/config/models.js.map +1 -1
  32. package/dist/src/config/storage.d.ts +32 -0
  33. package/dist/src/config/storage.js +90 -0
  34. package/dist/src/config/storage.js.map +1 -0
  35. package/dist/src/config/storage.test.js +43 -0
  36. package/dist/src/config/storage.test.js.map +1 -0
  37. package/dist/src/core/client.d.ts +17 -9
  38. package/dist/src/core/client.js +76 -19
  39. package/dist/src/core/client.js.map +1 -1
  40. package/dist/src/core/client.test.js +366 -84
  41. package/dist/src/core/client.test.js.map +1 -1
  42. package/dist/src/core/contentGenerator.d.ts +6 -6
  43. package/dist/src/core/contentGenerator.js +14 -5
  44. package/dist/src/core/contentGenerator.js.map +1 -1
  45. package/dist/src/core/contentGenerator.test.js.map +1 -1
  46. package/dist/src/core/coreToolScheduler.d.ts +14 -5
  47. package/dist/src/core/coreToolScheduler.js +120 -49
  48. package/dist/src/core/coreToolScheduler.js.map +1 -1
  49. package/dist/src/core/coreToolScheduler.test.js +365 -72
  50. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  51. package/dist/src/core/geminiChat.d.ts +18 -14
  52. package/dist/src/core/geminiChat.js +223 -156
  53. package/dist/src/core/geminiChat.js.map +1 -1
  54. package/dist/src/core/geminiChat.test.js +862 -257
  55. package/dist/src/core/geminiChat.test.js.map +1 -1
  56. package/dist/src/core/geminiRequest.js +1 -0
  57. package/dist/src/core/geminiRequest.js.map +1 -1
  58. package/dist/src/core/logger.d.ts +4 -2
  59. package/dist/src/core/logger.js +4 -3
  60. package/dist/src/core/logger.js.map +1 -1
  61. package/dist/src/core/logger.test.js +19 -18
  62. package/dist/src/core/logger.test.js.map +1 -1
  63. package/dist/src/core/loggingContentGenerator.d.ts +3 -3
  64. package/dist/src/core/loggingContentGenerator.js +3 -1
  65. package/dist/src/core/loggingContentGenerator.js.map +1 -1
  66. package/dist/src/core/nonInteractiveToolExecutor.d.ts +3 -5
  67. package/dist/src/core/nonInteractiveToolExecutor.js +15 -123
  68. package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -1
  69. package/dist/src/core/nonInteractiveToolExecutor.test.js +114 -90
  70. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
  71. package/dist/src/core/prompts.js +8 -7
  72. package/dist/src/core/prompts.js.map +1 -1
  73. package/dist/src/core/prompts.test.js +21 -21
  74. package/dist/src/core/prompts.test.js.map +1 -1
  75. package/dist/src/core/subagent.d.ts +24 -18
  76. package/dist/src/core/subagent.js +125 -87
  77. package/dist/src/core/subagent.js.map +1 -1
  78. package/dist/src/core/subagent.test.js +31 -26
  79. package/dist/src/core/subagent.test.js.map +1 -1
  80. package/dist/src/core/turn.d.ts +24 -7
  81. package/dist/src/core/turn.js +41 -11
  82. package/dist/src/core/turn.js.map +1 -1
  83. package/dist/src/core/turn.test.js +157 -1
  84. package/dist/src/core/turn.test.js.map +1 -1
  85. package/dist/src/generated/git-commit.d.ts +2 -2
  86. package/dist/src/generated/git-commit.js +2 -2
  87. package/dist/src/generated/git-commit.js.map +1 -1
  88. package/dist/src/ide/constants.d.ts +1 -1
  89. package/dist/src/ide/constants.js +1 -1
  90. package/dist/src/ide/constants.js.map +1 -1
  91. package/dist/src/ide/detect-ide.d.ts +8 -3
  92. package/dist/src/ide/detect-ide.js +29 -11
  93. package/dist/src/ide/detect-ide.js.map +1 -1
  94. package/dist/src/ide/detect-ide.test.js +96 -52
  95. package/dist/src/ide/detect-ide.test.js.map +1 -1
  96. package/dist/src/ide/ide-client.d.ts +11 -7
  97. package/dist/src/ide/ide-client.js +127 -29
  98. package/dist/src/ide/ide-client.js.map +1 -1
  99. package/dist/src/ide/ide-client.test.js +147 -25
  100. package/dist/src/ide/ide-client.test.js.map +1 -1
  101. package/dist/src/ide/ide-installer.d.ts +1 -1
  102. package/dist/src/ide/ide-installer.js +31 -22
  103. package/dist/src/ide/ide-installer.js.map +1 -1
  104. package/dist/src/ide/ide-installer.test.js +82 -22
  105. package/dist/src/ide/ide-installer.test.js.map +1 -1
  106. package/dist/src/ide/process-utils.d.ts +14 -6
  107. package/dist/src/ide/process-utils.js +136 -34
  108. package/dist/src/ide/process-utils.js.map +1 -1
  109. package/dist/src/ide/process-utils.test.js +158 -0
  110. package/dist/src/ide/process-utils.test.js.map +1 -0
  111. package/dist/src/index.d.ts +11 -2
  112. package/dist/src/index.js +10 -1
  113. package/dist/src/index.js.map +1 -1
  114. package/dist/src/mcp/google-auth-provider.d.ts +3 -3
  115. package/dist/src/mcp/google-auth-provider.test.js.map +1 -1
  116. package/dist/src/mcp/oauth-provider.d.ts +2 -2
  117. package/dist/src/mcp/oauth-provider.js.map +1 -1
  118. package/dist/src/mcp/oauth-provider.test.js +1 -1
  119. package/dist/src/mcp/oauth-provider.test.js.map +1 -1
  120. package/dist/src/mcp/oauth-token-storage.d.ts +5 -27
  121. package/dist/src/mcp/oauth-token-storage.js +2 -5
  122. package/dist/src/mcp/oauth-token-storage.js.map +1 -1
  123. package/dist/src/mcp/oauth-token-storage.test.js +7 -6
  124. package/dist/src/mcp/oauth-token-storage.test.js.map +1 -1
  125. package/dist/src/mcp/oauth-utils.d.ts +9 -1
  126. package/dist/src/mcp/oauth-utils.js +41 -27
  127. package/dist/src/mcp/oauth-utils.js.map +1 -1
  128. package/dist/src/mcp/oauth-utils.test.js +41 -1
  129. package/dist/src/mcp/oauth-utils.test.js.map +1 -1
  130. package/dist/src/mcp/token-storage/base-token-storage.d.ts +19 -0
  131. package/dist/src/mcp/token-storage/base-token-storage.js +36 -0
  132. package/dist/src/mcp/token-storage/base-token-storage.js.map +1 -0
  133. package/dist/src/mcp/token-storage/base-token-storage.test.d.ts +6 -0
  134. package/dist/src/mcp/token-storage/base-token-storage.test.js +160 -0
  135. package/dist/src/mcp/token-storage/base-token-storage.test.js.map +1 -0
  136. package/dist/src/mcp/token-storage/file-token-storage.d.ts +24 -0
  137. package/dist/src/mcp/token-storage/file-token-storage.js +144 -0
  138. package/dist/src/mcp/token-storage/file-token-storage.js.map +1 -0
  139. package/dist/src/mcp/token-storage/file-token-storage.test.d.ts +6 -0
  140. package/dist/src/mcp/token-storage/file-token-storage.test.js +235 -0
  141. package/dist/src/mcp/token-storage/file-token-storage.test.js.map +1 -0
  142. package/dist/src/mcp/token-storage/types.d.ts +34 -0
  143. package/dist/src/mcp/token-storage/types.js +7 -0
  144. package/dist/src/mcp/token-storage/types.js.map +1 -0
  145. package/dist/src/prompts/mcp-prompts.d.ts +2 -2
  146. package/dist/src/prompts/prompt-registry.d.ts +1 -1
  147. package/dist/src/services/chatRecordingService.d.ts +2 -2
  148. package/dist/src/services/chatRecordingService.js +6 -3
  149. package/dist/src/services/chatRecordingService.js.map +1 -1
  150. package/dist/src/services/chatRecordingService.test.js +10 -8
  151. package/dist/src/services/chatRecordingService.test.js.map +1 -1
  152. package/dist/src/services/fileDiscoveryService.js +1 -1
  153. package/dist/src/services/fileDiscoveryService.js.map +1 -1
  154. package/dist/src/services/fileDiscoveryService.test.js +3 -3
  155. package/dist/src/services/fileDiscoveryService.test.js.map +1 -1
  156. package/dist/src/services/fileSystemService.js +1 -1
  157. package/dist/src/services/fileSystemService.js.map +1 -1
  158. package/dist/src/services/fileSystemService.test.js +1 -1
  159. package/dist/src/services/fileSystemService.test.js.map +1 -1
  160. package/dist/src/services/gitService.d.ts +3 -1
  161. package/dist/src/services/gitService.js +21 -12
  162. package/dist/src/services/gitService.js.map +1 -1
  163. package/dist/src/services/gitService.test.js +22 -19
  164. package/dist/src/services/gitService.test.js.map +1 -1
  165. package/dist/src/services/loopDetectionService.d.ts +2 -2
  166. package/dist/src/services/loopDetectionService.js +9 -3
  167. package/dist/src/services/loopDetectionService.js.map +1 -1
  168. package/dist/src/services/loopDetectionService.test.js +23 -1
  169. package/dist/src/services/loopDetectionService.test.js.map +1 -1
  170. package/dist/src/services/shellExecutionService.d.ts +8 -10
  171. package/dist/src/services/shellExecutionService.js +292 -135
  172. package/dist/src/services/shellExecutionService.js.map +1 -1
  173. package/dist/src/services/shellExecutionService.test.js +277 -42
  174. package/dist/src/services/shellExecutionService.test.js.map +1 -1
  175. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +16 -4
  176. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +140 -9
  177. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  178. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +84 -11
  179. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
  180. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +26 -1
  181. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +62 -0
  182. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  183. package/dist/src/telemetry/constants.d.ts +8 -0
  184. package/dist/src/telemetry/constants.js +8 -0
  185. package/dist/src/telemetry/constants.js.map +1 -1
  186. package/dist/src/telemetry/file-exporters.d.ts +5 -4
  187. package/dist/src/telemetry/file-exporters.js +1 -1
  188. package/dist/src/telemetry/file-exporters.js.map +1 -1
  189. package/dist/src/telemetry/index.d.ts +5 -2
  190. package/dist/src/telemetry/index.js +3 -2
  191. package/dist/src/telemetry/index.js.map +1 -1
  192. package/dist/src/telemetry/loggers.d.ts +8 -2
  193. package/dist/src/telemetry/loggers.js +105 -2
  194. package/dist/src/telemetry/loggers.js.map +1 -1
  195. package/dist/src/telemetry/loggers.test.circular.js.map +1 -1
  196. package/dist/src/telemetry/loggers.test.js +69 -9
  197. package/dist/src/telemetry/loggers.test.js.map +1 -1
  198. package/dist/src/telemetry/metrics.d.ts +15 -4
  199. package/dist/src/telemetry/metrics.js +46 -8
  200. package/dist/src/telemetry/metrics.js.map +1 -1
  201. package/dist/src/telemetry/metrics.test.js +5 -25
  202. package/dist/src/telemetry/metrics.test.js.map +1 -1
  203. package/dist/src/telemetry/sdk.d.ts +1 -1
  204. package/dist/src/telemetry/sdk.js +3 -3
  205. package/dist/src/telemetry/sdk.js.map +1 -1
  206. package/dist/src/telemetry/telemetry-utils.d.ts +6 -0
  207. package/dist/src/telemetry/telemetry-utils.js +14 -0
  208. package/dist/src/telemetry/telemetry-utils.js.map +1 -0
  209. package/dist/src/telemetry/telemetry-utils.test.d.ts +6 -0
  210. package/dist/src/telemetry/telemetry-utils.test.js +40 -0
  211. package/dist/src/telemetry/telemetry-utils.test.js.map +1 -0
  212. package/dist/src/telemetry/types.d.ts +52 -6
  213. package/dist/src/telemetry/types.js +87 -2
  214. package/dist/src/telemetry/types.js.map +1 -1
  215. package/dist/src/telemetry/uiTelemetry.d.ts +2 -2
  216. package/dist/src/telemetry/uiTelemetry.js +1 -1
  217. package/dist/src/telemetry/uiTelemetry.js.map +1 -1
  218. package/dist/src/telemetry/uiTelemetry.test.js +16 -12
  219. package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
  220. package/dist/src/test-utils/config.d.ts +2 -1
  221. package/dist/src/test-utils/config.js.map +1 -1
  222. package/dist/src/test-utils/index.d.ts +6 -0
  223. package/dist/src/test-utils/index.js +7 -0
  224. package/dist/src/test-utils/index.js.map +1 -0
  225. package/dist/src/test-utils/mock-tool.d.ts +41 -0
  226. package/dist/src/test-utils/mock-tool.js +51 -0
  227. package/dist/src/test-utils/mock-tool.js.map +1 -0
  228. package/dist/src/test-utils/mockWorkspaceContext.d.ts +1 -1
  229. package/dist/src/test-utils/tools.d.ts +3 -2
  230. package/dist/src/test-utils/tools.js.map +1 -1
  231. package/dist/src/tools/diffOptions.d.ts +1 -1
  232. package/dist/src/tools/edit.d.ts +6 -5
  233. package/dist/src/tools/edit.js +36 -17
  234. package/dist/src/tools/edit.js.map +1 -1
  235. package/dist/src/tools/edit.test.js +45 -8
  236. package/dist/src/tools/edit.test.js.map +1 -1
  237. package/dist/src/tools/glob.d.ts +3 -2
  238. package/dist/src/tools/glob.js +17 -6
  239. package/dist/src/tools/glob.js.map +1 -1
  240. package/dist/src/tools/glob.test.js +29 -4
  241. package/dist/src/tools/glob.test.js.map +1 -1
  242. package/dist/src/tools/grep.d.ts +3 -2
  243. package/dist/src/tools/grep.js +35 -15
  244. package/dist/src/tools/grep.js.map +1 -1
  245. package/dist/src/tools/grep.test.js +26 -3
  246. package/dist/src/tools/grep.test.js.map +1 -1
  247. package/dist/src/tools/ls.d.ts +3 -2
  248. package/dist/src/tools/ls.js +12 -7
  249. package/dist/src/tools/ls.js.map +1 -1
  250. package/dist/src/tools/ls.test.js +7 -2
  251. package/dist/src/tools/ls.test.js.map +1 -1
  252. package/dist/src/tools/mcp-client-manager.d.ts +8 -6
  253. package/dist/src/tools/mcp-client-manager.js +30 -5
  254. package/dist/src/tools/mcp-client-manager.js.map +1 -1
  255. package/dist/src/tools/mcp-client-manager.test.js +20 -1
  256. package/dist/src/tools/mcp-client-manager.test.js.map +1 -1
  257. package/dist/src/tools/mcp-client.d.ts +18 -11
  258. package/dist/src/tools/mcp-client.js +78 -33
  259. package/dist/src/tools/mcp-client.js.map +1 -1
  260. package/dist/src/tools/mcp-client.test.js +29 -4
  261. package/dist/src/tools/mcp-client.test.js.map +1 -1
  262. package/dist/src/tools/mcp-tool.d.ts +6 -3
  263. package/dist/src/tools/mcp-tool.js +21 -7
  264. package/dist/src/tools/mcp-tool.js.map +1 -1
  265. package/dist/src/tools/mcp-tool.test.js +49 -6
  266. package/dist/src/tools/mcp-tool.test.js.map +1 -1
  267. package/dist/src/tools/memoryTool.d.ts +4 -3
  268. package/dist/src/tools/memoryTool.js +15 -38
  269. package/dist/src/tools/memoryTool.js.map +1 -1
  270. package/dist/src/tools/memoryTool.test.js +24 -12
  271. package/dist/src/tools/memoryTool.test.js.map +1 -1
  272. package/dist/src/tools/modifiable-tool.d.ts +2 -2
  273. package/dist/src/tools/modifiable-tool.js +3 -3
  274. package/dist/src/tools/modifiable-tool.js.map +1 -1
  275. package/dist/src/tools/modifiable-tool.test.js +4 -4
  276. package/dist/src/tools/modifiable-tool.test.js.map +1 -1
  277. package/dist/src/tools/read-file.d.ts +3 -2
  278. package/dist/src/tools/read-file.js +12 -34
  279. package/dist/src/tools/read-file.js.map +1 -1
  280. package/dist/src/tools/read-file.test.js +9 -6
  281. package/dist/src/tools/read-file.test.js.map +1 -1
  282. package/dist/src/tools/read-many-files.d.ts +3 -2
  283. package/dist/src/tools/read-many-files.js +35 -58
  284. package/dist/src/tools/read-many-files.js.map +1 -1
  285. package/dist/src/tools/read-many-files.test.js +60 -7
  286. package/dist/src/tools/read-many-files.test.js.map +1 -1
  287. package/dist/src/tools/ripGrep.d.ts +47 -0
  288. package/dist/src/tools/ripGrep.js +368 -0
  289. package/dist/src/tools/ripGrep.js.map +1 -0
  290. package/dist/src/tools/ripGrep.test.d.ts +6 -0
  291. package/dist/src/tools/ripGrep.test.js +874 -0
  292. package/dist/src/tools/ripGrep.test.js.map +1 -0
  293. package/dist/src/tools/shell.d.ts +3 -2
  294. package/dist/src/tools/shell.js +26 -24
  295. package/dist/src/tools/shell.js.map +1 -1
  296. package/dist/src/tools/shell.test.js +33 -24
  297. package/dist/src/tools/shell.test.js.map +1 -1
  298. package/dist/src/tools/smart-edit.d.ts +73 -0
  299. package/dist/src/tools/smart-edit.js +607 -0
  300. package/dist/src/tools/smart-edit.js.map +1 -0
  301. package/dist/src/tools/smart-edit.test.d.ts +6 -0
  302. package/dist/src/tools/smart-edit.test.js +397 -0
  303. package/dist/src/tools/smart-edit.test.js.map +1 -0
  304. package/dist/src/tools/tool-error.d.ts +17 -1
  305. package/dist/src/tools/tool-error.js +26 -0
  306. package/dist/src/tools/tool-error.js.map +1 -1
  307. package/dist/src/tools/tool-registry.d.ts +10 -4
  308. package/dist/src/tools/tool-registry.js +19 -7
  309. package/dist/src/tools/tool-registry.js.map +1 -1
  310. package/dist/src/tools/tool-registry.test.js +86 -3
  311. package/dist/src/tools/tool-registry.test.js.map +1 -1
  312. package/dist/src/tools/tools.d.ts +9 -7
  313. package/dist/src/tools/tools.js +12 -0
  314. package/dist/src/tools/tools.js.map +1 -1
  315. package/dist/src/tools/tools.test.js +1 -2
  316. package/dist/src/tools/tools.test.js.map +1 -1
  317. package/dist/src/tools/web-fetch.d.ts +3 -2
  318. package/dist/src/tools/web-fetch.js +10 -7
  319. package/dist/src/tools/web-fetch.js.map +1 -1
  320. package/dist/src/tools/web-fetch.test.js +55 -16
  321. package/dist/src/tools/web-fetch.test.js.map +1 -1
  322. package/dist/src/tools/web-search.d.ts +4 -3
  323. package/dist/src/tools/web-search.js +28 -7
  324. package/dist/src/tools/web-search.js.map +1 -1
  325. package/dist/src/tools/web-search.test.js +69 -1
  326. package/dist/src/tools/web-search.test.js.map +1 -1
  327. package/dist/src/tools/write-file.d.ts +4 -3
  328. package/dist/src/tools/write-file.js +13 -13
  329. package/dist/src/tools/write-file.js.map +1 -1
  330. package/dist/src/tools/write-file.test.js +9 -5
  331. package/dist/src/tools/write-file.test.js.map +1 -1
  332. package/dist/src/utils/bfsFileSearch.d.ts +2 -2
  333. package/dist/src/utils/bfsFileSearch.js +2 -2
  334. package/dist/src/utils/bfsFileSearch.js.map +1 -1
  335. package/dist/src/utils/bfsFileSearch.test.js +3 -3
  336. package/dist/src/utils/bfsFileSearch.test.js.map +1 -1
  337. package/dist/src/utils/editCorrector.d.ts +2 -2
  338. package/dist/src/utils/editCorrector.js +1 -1
  339. package/dist/src/utils/editCorrector.js.map +1 -1
  340. package/dist/src/utils/editCorrector.test.js +3 -3
  341. package/dist/src/utils/editCorrector.test.js.map +1 -1
  342. package/dist/src/utils/editor.js +2 -2
  343. package/dist/src/utils/editor.js.map +1 -1
  344. package/dist/src/utils/editor.test.js +2 -2
  345. package/dist/src/utils/editor.test.js.map +1 -1
  346. package/dist/src/utils/environmentContext.d.ts +2 -2
  347. package/dist/src/utils/environmentContext.js +1 -1
  348. package/dist/src/utils/environmentContext.js.map +1 -1
  349. package/dist/src/utils/environmentContext.test.js +1 -1
  350. package/dist/src/utils/environmentContext.test.js.map +1 -1
  351. package/dist/src/utils/errorReporting.d.ts +1 -1
  352. package/dist/src/utils/errors.d.ts +19 -0
  353. package/dist/src/utils/errors.js +32 -0
  354. package/dist/src/utils/errors.js.map +1 -1
  355. package/dist/src/utils/fetch.js +1 -1
  356. package/dist/src/utils/fetch.js.map +1 -1
  357. package/dist/src/utils/fileUtils.d.ts +23 -12
  358. package/dist/src/utils/fileUtils.js +155 -75
  359. package/dist/src/utils/fileUtils.js.map +1 -1
  360. package/dist/src/utils/fileUtils.test.js +293 -1
  361. package/dist/src/utils/fileUtils.test.js.map +1 -1
  362. package/dist/src/utils/filesearch/crawler.d.ts +1 -1
  363. package/dist/src/utils/filesearch/crawler.test.js +2 -2
  364. package/dist/src/utils/filesearch/crawler.test.js.map +1 -1
  365. package/dist/src/utils/filesearch/fileSearch.d.ts +1 -0
  366. package/dist/src/utils/filesearch/fileSearch.js +14 -9
  367. package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
  368. package/dist/src/utils/filesearch/fileSearch.test.js +90 -0
  369. package/dist/src/utils/filesearch/fileSearch.test.js.map +1 -1
  370. package/dist/src/utils/generateContentResponseUtilities.d.ts +1 -2
  371. package/dist/src/utils/generateContentResponseUtilities.js +1 -13
  372. package/dist/src/utils/generateContentResponseUtilities.js.map +1 -1
  373. package/dist/src/utils/generateContentResponseUtilities.test.js +2 -40
  374. package/dist/src/utils/generateContentResponseUtilities.test.js.map +1 -1
  375. package/dist/src/utils/getFolderStructure.d.ts +2 -2
  376. package/dist/src/utils/getFolderStructure.js +2 -2
  377. package/dist/src/utils/getFolderStructure.js.map +1 -1
  378. package/dist/src/utils/getFolderStructure.test.js +13 -13
  379. package/dist/src/utils/getFolderStructure.test.js.map +1 -1
  380. package/dist/src/utils/getPty.d.ts +19 -0
  381. package/dist/src/utils/getPty.js +23 -0
  382. package/dist/src/utils/getPty.js.map +1 -0
  383. package/dist/src/utils/gitIgnoreParser.js +3 -3
  384. package/dist/src/utils/gitIgnoreParser.js.map +1 -1
  385. package/dist/src/utils/gitIgnoreParser.test.js +3 -3
  386. package/dist/src/utils/gitIgnoreParser.test.js.map +1 -1
  387. package/dist/src/utils/gitUtils.js +2 -2
  388. package/dist/src/utils/gitUtils.js.map +1 -1
  389. package/dist/src/utils/ignorePatterns.d.ts +103 -0
  390. package/dist/src/utils/ignorePatterns.js +220 -0
  391. package/dist/src/utils/ignorePatterns.js.map +1 -0
  392. package/dist/src/utils/ignorePatterns.test.d.ts +6 -0
  393. package/dist/src/utils/ignorePatterns.test.js +250 -0
  394. package/dist/src/utils/ignorePatterns.test.js.map +1 -0
  395. package/dist/src/utils/installationManager.d.ts +16 -0
  396. package/dist/src/utils/installationManager.js +50 -0
  397. package/dist/src/utils/installationManager.js.map +1 -0
  398. package/dist/src/utils/installationManager.test.d.ts +6 -0
  399. package/dist/src/utils/installationManager.test.js +83 -0
  400. package/dist/src/utils/installationManager.test.js.map +1 -0
  401. package/dist/src/utils/language-detection.d.ts +6 -0
  402. package/dist/src/utils/language-detection.js +101 -0
  403. package/dist/src/utils/language-detection.js.map +1 -0
  404. package/dist/src/utils/llm-edit-fixer.d.ts +25 -0
  405. package/dist/src/utils/llm-edit-fixer.js +112 -0
  406. package/dist/src/utils/llm-edit-fixer.js.map +1 -0
  407. package/dist/src/utils/memoryDiscovery.d.ts +7 -6
  408. package/dist/src/utils/memoryDiscovery.js +68 -33
  409. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  410. package/dist/src/utils/memoryDiscovery.test.js +76 -20
  411. package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
  412. package/dist/src/utils/memoryImportProcessor.js +2 -2
  413. package/dist/src/utils/memoryImportProcessor.js.map +1 -1
  414. package/dist/src/utils/memoryImportProcessor.test.js +2 -141
  415. package/dist/src/utils/memoryImportProcessor.test.js.map +1 -1
  416. package/dist/src/utils/messageInspectors.d.ts +1 -1
  417. package/dist/src/utils/nextSpeakerChecker.d.ts +2 -2
  418. package/dist/src/utils/nextSpeakerChecker.test.js.map +1 -1
  419. package/dist/src/utils/partUtils.d.ts +22 -1
  420. package/dist/src/utils/partUtils.js +68 -0
  421. package/dist/src/utils/partUtils.js.map +1 -1
  422. package/dist/src/utils/partUtils.test.js +112 -1
  423. package/dist/src/utils/partUtils.test.js.map +1 -1
  424. package/dist/src/utils/pathReader.d.ts +17 -0
  425. package/dist/src/utils/pathReader.js +92 -0
  426. package/dist/src/utils/pathReader.js.map +1 -0
  427. package/dist/src/utils/pathReader.test.d.ts +6 -0
  428. package/dist/src/utils/pathReader.test.js +363 -0
  429. package/dist/src/utils/pathReader.test.js.map +1 -0
  430. package/dist/src/utils/paths.d.ts +1 -18
  431. package/dist/src/utils/paths.js +3 -29
  432. package/dist/src/utils/paths.js.map +1 -1
  433. package/dist/src/utils/quotaErrorDetection.d.ts +1 -1
  434. package/dist/src/utils/retry.test.js +4 -1
  435. package/dist/src/utils/retry.test.js.map +1 -1
  436. package/dist/src/utils/schemaValidator.js +4 -0
  437. package/dist/src/utils/schemaValidator.js.map +1 -1
  438. package/dist/src/utils/session.js +1 -1
  439. package/dist/src/utils/session.js.map +1 -1
  440. package/dist/src/utils/shell-utils.d.ts +1 -1
  441. package/dist/src/utils/shell-utils.js +23 -29
  442. package/dist/src/utils/shell-utils.js.map +1 -1
  443. package/dist/src/utils/shell-utils.test.js +8 -1
  444. package/dist/src/utils/shell-utils.test.js.map +1 -1
  445. package/dist/src/utils/summarizer.d.ts +2 -2
  446. package/dist/src/utils/summarizer.test.js.map +1 -1
  447. package/dist/src/utils/systemEncoding.js +2 -2
  448. package/dist/src/utils/systemEncoding.js.map +1 -1
  449. package/dist/src/utils/systemEncoding.test.js +2 -2
  450. package/dist/src/utils/systemEncoding.test.js.map +1 -1
  451. package/dist/src/utils/tool-utils.d.ts +19 -0
  452. package/dist/src/utils/tool-utils.js +58 -0
  453. package/dist/src/utils/tool-utils.js.map +1 -0
  454. package/dist/src/utils/tool-utils.test.d.ts +6 -0
  455. package/dist/src/utils/tool-utils.test.js +61 -0
  456. package/dist/src/utils/tool-utils.test.js.map +1 -0
  457. package/dist/src/utils/userAccountManager.d.ts +20 -0
  458. package/dist/src/utils/userAccountManager.js +114 -0
  459. package/dist/src/utils/userAccountManager.js.map +1 -0
  460. package/dist/src/utils/userAccountManager.test.d.ts +6 -0
  461. package/dist/src/utils/{user_account.test.js → userAccountManager.test.js} +33 -30
  462. package/dist/src/utils/userAccountManager.test.js.map +1 -0
  463. package/dist/src/utils/workspaceContext.js +13 -7
  464. package/dist/src/utils/workspaceContext.js.map +1 -1
  465. package/dist/src/utils/workspaceContext.test.js +41 -16
  466. package/dist/src/utils/workspaceContext.test.js.map +1 -1
  467. package/dist/tsconfig.tsbuildinfo +1 -1
  468. package/package.json +25 -12
  469. package/dist/src/utils/user_account.d.ts +0 -9
  470. package/dist/src/utils/user_account.js +0 -109
  471. package/dist/src/utils/user_account.js.map +0 -1
  472. package/dist/src/utils/user_account.test.js.map +0 -1
  473. package/dist/src/utils/user_id.d.ts +0 -11
  474. package/dist/src/utils/user_id.js +0 -49
  475. package/dist/src/utils/user_id.js.map +0 -1
  476. package/dist/src/utils/user_id.test.js +0 -21
  477. package/dist/src/utils/user_id.test.js.map +0 -1
  478. /package/dist/src/{utils/user_account.test.d.ts → config/storage.test.d.ts} +0 -0
  479. /package/dist/src/{utils/user_id.test.d.ts → ide/process-utils.test.d.ts} +0 -0
@@ -4,7 +4,7 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import { describe, it, expect } from 'vitest';
7
- import { partToString, getResponseText } from './partUtils.js';
7
+ import { partToString, getResponseText, flatMapTextParts, appendToLastTextPart, } from './partUtils.js';
8
8
  const mockResponse = (parts) => ({
9
9
  candidates: parts
10
10
  ? [{ content: { parts: parts, role: 'model' }, index: 0 }]
@@ -125,6 +125,117 @@ describe('partUtils', () => {
125
125
  const result = mockResponse([]);
126
126
  expect(getResponseText(result)).toBeNull();
127
127
  });
128
+ it('should return null if the first candidate has no content property', () => {
129
+ const response = {
130
+ candidates: [
131
+ {
132
+ index: 0,
133
+ },
134
+ ],
135
+ promptFeedback: { safetyRatings: [] },
136
+ text: undefined,
137
+ data: undefined,
138
+ functionCalls: undefined,
139
+ executableCode: undefined,
140
+ codeExecutionResult: undefined,
141
+ };
142
+ expect(getResponseText(response)).toBeNull();
143
+ });
144
+ });
145
+ describe('flatMapTextParts', () => {
146
+ // A simple async transform function that splits a string into character parts.
147
+ const splitCharsTransform = async (text) => text.split('').map((char) => ({ text: char }));
148
+ it('should return an empty array for empty input', async () => {
149
+ const result = await flatMapTextParts([], splitCharsTransform);
150
+ expect(result).toEqual([]);
151
+ });
152
+ it('should transform a simple string input', async () => {
153
+ const result = await flatMapTextParts('hi', splitCharsTransform);
154
+ expect(result).toEqual([{ text: 'h' }, { text: 'i' }]);
155
+ });
156
+ it('should transform a single text part object', async () => {
157
+ const result = await flatMapTextParts({ text: 'cat' }, splitCharsTransform);
158
+ expect(result).toEqual([{ text: 'c' }, { text: 'a' }, { text: 't' }]);
159
+ });
160
+ it('should transform an array of text parts and flatten the result', async () => {
161
+ // A transform that duplicates the text to test the "flatMap" behavior.
162
+ const duplicateTransform = async (text) => [
163
+ { text: `${text}` },
164
+ { text: `${text}` },
165
+ ];
166
+ const parts = [{ text: 'a' }, { text: 'b' }];
167
+ const result = await flatMapTextParts(parts, duplicateTransform);
168
+ expect(result).toEqual([
169
+ { text: 'a' },
170
+ { text: 'a' },
171
+ { text: 'b' },
172
+ { text: 'b' },
173
+ ]);
174
+ });
175
+ it('should pass through non-text parts unmodified', async () => {
176
+ const nonTextPart = { functionCall: { name: 'do_stuff' } };
177
+ const result = await flatMapTextParts(nonTextPart, splitCharsTransform);
178
+ expect(result).toEqual([nonTextPart]);
179
+ });
180
+ it('should handle a mix of text and non-text parts in an array', async () => {
181
+ const nonTextPart = {
182
+ inlineData: { mimeType: 'image/jpeg', data: '' },
183
+ };
184
+ const parts = [{ text: 'go' }, nonTextPart, ' stop'];
185
+ const result = await flatMapTextParts(parts, splitCharsTransform);
186
+ expect(result).toEqual([
187
+ { text: 'g' },
188
+ { text: 'o' },
189
+ nonTextPart, // Should be passed through
190
+ { text: ' ' },
191
+ { text: 's' },
192
+ { text: 't' },
193
+ { text: 'o' },
194
+ { text: 'p' },
195
+ ]);
196
+ });
197
+ it('should handle a transform that returns an empty array', async () => {
198
+ const removeTransform = async (_text) => [];
199
+ const parts = [
200
+ { text: 'remove' },
201
+ { functionCall: { name: 'keep' } },
202
+ ];
203
+ const result = await flatMapTextParts(parts, removeTransform);
204
+ expect(result).toEqual([{ functionCall: { name: 'keep' } }]);
205
+ });
206
+ });
207
+ describe('appendToLastTextPart', () => {
208
+ it('should append to an empty prompt', () => {
209
+ const prompt = [];
210
+ const result = appendToLastTextPart(prompt, 'new text');
211
+ expect(result).toEqual([{ text: 'new text' }]);
212
+ });
213
+ it('should append to a prompt with a string as the last part', () => {
214
+ const prompt = ['first part'];
215
+ const result = appendToLastTextPart(prompt, 'new text');
216
+ expect(result).toEqual(['first part\n\nnew text']);
217
+ });
218
+ it('should append to a prompt with a text part object as the last part', () => {
219
+ const prompt = [{ text: 'first part' }];
220
+ const result = appendToLastTextPart(prompt, 'new text');
221
+ expect(result).toEqual([{ text: 'first part\n\nnew text' }]);
222
+ });
223
+ it('should append a new text part if the last part is not a text part', () => {
224
+ const nonTextPart = { functionCall: { name: 'do_stuff' } };
225
+ const prompt = [nonTextPart];
226
+ const result = appendToLastTextPart(prompt, 'new text');
227
+ expect(result).toEqual([nonTextPart, { text: '\n\nnew text' }]);
228
+ });
229
+ it('should not append anything if the text to append is empty', () => {
230
+ const prompt = ['first part'];
231
+ const result = appendToLastTextPart(prompt, '');
232
+ expect(result).toEqual(['first part']);
233
+ });
234
+ it('should use a custom separator', () => {
235
+ const prompt = ['first part'];
236
+ const result = appendToLastTextPart(prompt, 'new text', '---');
237
+ expect(result).toEqual(['first part---new text']);
238
+ });
128
239
  });
129
240
  });
130
241
  //# sourceMappingURL=partUtils.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"partUtils.test.js","sourceRoot":"","sources":["../../../src/utils/partUtils.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"partUtils.test.js","sourceRoot":"","sources":["../../../src/utils/partUtils.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import type { PartUnion } from '@google/genai';
7
+ import type { Config } from '../config/config.js';
8
+ /**
9
+ * Reads the content of a file or recursively expands a directory from
10
+ * within the workspace, returning content suitable for LLM input.
11
+ *
12
+ * @param pathStr The path to read (can be absolute or relative).
13
+ * @param config The application configuration, providing workspace context and services.
14
+ * @returns A promise that resolves to an array of PartUnion (string | Part).
15
+ * @throws An error if the path is not found or is outside the workspace.
16
+ */
17
+ export declare function readPathFromWorkspace(pathStr: string, config: Config): Promise<PartUnion[]>;
@@ -0,0 +1,92 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { promises as fs } from 'node:fs';
7
+ import path from 'node:path';
8
+ import { glob } from 'glob';
9
+ import { processSingleFileContent } from './fileUtils.js';
10
+ /**
11
+ * Reads the content of a file or recursively expands a directory from
12
+ * within the workspace, returning content suitable for LLM input.
13
+ *
14
+ * @param pathStr The path to read (can be absolute or relative).
15
+ * @param config The application configuration, providing workspace context and services.
16
+ * @returns A promise that resolves to an array of PartUnion (string | Part).
17
+ * @throws An error if the path is not found or is outside the workspace.
18
+ */
19
+ export async function readPathFromWorkspace(pathStr, config) {
20
+ const workspace = config.getWorkspaceContext();
21
+ const fileService = config.getFileService();
22
+ let absolutePath = null;
23
+ if (path.isAbsolute(pathStr)) {
24
+ if (!workspace.isPathWithinWorkspace(pathStr)) {
25
+ throw new Error(`Absolute path is outside of the allowed workspace: ${pathStr}`);
26
+ }
27
+ absolutePath = pathStr;
28
+ }
29
+ else {
30
+ // Prioritized search for relative paths.
31
+ const searchDirs = workspace.getDirectories();
32
+ for (const dir of searchDirs) {
33
+ const potentialPath = path.resolve(dir, pathStr);
34
+ try {
35
+ await fs.access(potentialPath);
36
+ absolutePath = potentialPath;
37
+ break; // Found the first match.
38
+ }
39
+ catch {
40
+ // Not found, continue to the next directory.
41
+ }
42
+ }
43
+ }
44
+ if (!absolutePath) {
45
+ throw new Error(`Path not found in workspace: ${pathStr}`);
46
+ }
47
+ const stats = await fs.stat(absolutePath);
48
+ if (stats.isDirectory()) {
49
+ const allParts = [];
50
+ allParts.push({
51
+ text: `--- Start of content for directory: ${pathStr} ---\n`,
52
+ });
53
+ // Use glob to recursively find all files within the directory.
54
+ const files = await glob('**/*', {
55
+ cwd: absolutePath,
56
+ nodir: true, // We only want files
57
+ dot: true, // Include dotfiles
58
+ absolute: true,
59
+ });
60
+ const relativeFiles = files.map((p) => path.relative(config.getTargetDir(), p));
61
+ const filteredFiles = fileService.filterFiles(relativeFiles, {
62
+ respectGitIgnore: true,
63
+ respectGeminiIgnore: true,
64
+ });
65
+ const finalFiles = filteredFiles.map((p) => path.resolve(config.getTargetDir(), p));
66
+ for (const filePath of finalFiles) {
67
+ const relativePathForDisplay = path.relative(absolutePath, filePath);
68
+ allParts.push({ text: `--- ${relativePathForDisplay} ---\n` });
69
+ const result = await processSingleFileContent(filePath, config.getTargetDir(), config.getFileSystemService());
70
+ allParts.push(result.llmContent);
71
+ allParts.push({ text: '\n' }); // Add a newline for separation
72
+ }
73
+ allParts.push({ text: `--- End of content for directory: ${pathStr} ---` });
74
+ return allParts;
75
+ }
76
+ else {
77
+ // It's a single file, check if it's ignored.
78
+ const relativePath = path.relative(config.getTargetDir(), absolutePath);
79
+ const filtered = fileService.filterFiles([relativePath], {
80
+ respectGitIgnore: true,
81
+ respectGeminiIgnore: true,
82
+ });
83
+ if (filtered.length === 0) {
84
+ // File is ignored, return empty array to silently skip.
85
+ return [];
86
+ }
87
+ // It's a single file, process it directly.
88
+ const result = await processSingleFileContent(absolutePath, config.getTargetDir(), config.getFileSystemService());
89
+ return [result.llmContent];
90
+ }
91
+ }
92
+ //# sourceMappingURL=pathReader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pathReader.js","sourceRoot":"","sources":["../../../src/utils/pathReader.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,363 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, afterEach, vi } from 'vitest';
7
+ import mock from 'mock-fs';
8
+ import * as path from 'node:path';
9
+ import { WorkspaceContext } from './workspaceContext.js';
10
+ import { readPathFromWorkspace } from './pathReader.js';
11
+ import { StandardFileSystemService } from '../services/fileSystemService.js';
12
+ // --- Helper for creating a mock Config object ---
13
+ // We use the actual implementations of WorkspaceContext and FileSystemService
14
+ // to test the integration against mock-fs.
15
+ const createMockConfig = (cwd, otherDirs = [], mockFileService) => {
16
+ const workspace = new WorkspaceContext(cwd, otherDirs);
17
+ const fileSystemService = new StandardFileSystemService();
18
+ return {
19
+ getWorkspaceContext: () => workspace,
20
+ // TargetDir is used by processSingleFileContent to generate relative paths in errors/output
21
+ getTargetDir: () => cwd,
22
+ getFileSystemService: () => fileSystemService,
23
+ getFileService: () => mockFileService,
24
+ };
25
+ };
26
+ describe('readPathFromWorkspace', () => {
27
+ const CWD = path.resolve('/test/cwd');
28
+ const OTHER_DIR = path.resolve('/test/other');
29
+ const OUTSIDE_DIR = path.resolve('/test/outside');
30
+ afterEach(() => {
31
+ mock.restore();
32
+ vi.resetAllMocks();
33
+ });
34
+ it('should read a text file from the CWD', async () => {
35
+ mock({
36
+ [CWD]: {
37
+ 'file.txt': 'hello from cwd',
38
+ },
39
+ });
40
+ const mockFileService = {
41
+ filterFiles: vi.fn((files) => files),
42
+ };
43
+ const config = createMockConfig(CWD, [], mockFileService);
44
+ const result = await readPathFromWorkspace('file.txt', config);
45
+ // Expect [string] for text content
46
+ expect(result).toEqual(['hello from cwd']);
47
+ expect(mockFileService.filterFiles).toHaveBeenCalled();
48
+ });
49
+ it('should read a file from a secondary workspace directory', async () => {
50
+ mock({
51
+ [CWD]: {},
52
+ [OTHER_DIR]: {
53
+ 'file.txt': 'hello from other dir',
54
+ },
55
+ });
56
+ const mockFileService = {
57
+ filterFiles: vi.fn((files) => files),
58
+ };
59
+ const config = createMockConfig(CWD, [OTHER_DIR], mockFileService);
60
+ const result = await readPathFromWorkspace('file.txt', config);
61
+ expect(result).toEqual(['hello from other dir']);
62
+ });
63
+ it('should prioritize CWD when file exists in both CWD and secondary dir', async () => {
64
+ mock({
65
+ [CWD]: {
66
+ 'file.txt': 'hello from cwd',
67
+ },
68
+ [OTHER_DIR]: {
69
+ 'file.txt': 'hello from other dir',
70
+ },
71
+ });
72
+ const mockFileService = {
73
+ filterFiles: vi.fn((files) => files),
74
+ };
75
+ const config = createMockConfig(CWD, [OTHER_DIR], mockFileService);
76
+ const result = await readPathFromWorkspace('file.txt', config);
77
+ expect(result).toEqual(['hello from cwd']);
78
+ });
79
+ it('should read an image file and return it as inlineData (Part object)', async () => {
80
+ // Use a real PNG header for robustness
81
+ const imageData = Buffer.from([
82
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a,
83
+ ]);
84
+ mock({
85
+ [CWD]: {
86
+ 'image.png': imageData,
87
+ },
88
+ });
89
+ const mockFileService = {
90
+ filterFiles: vi.fn((files) => files),
91
+ };
92
+ const config = createMockConfig(CWD, [], mockFileService);
93
+ const result = await readPathFromWorkspace('image.png', config);
94
+ // Expect [Part] for image content
95
+ expect(result).toEqual([
96
+ {
97
+ inlineData: {
98
+ mimeType: 'image/png',
99
+ data: imageData.toString('base64'),
100
+ },
101
+ },
102
+ ]);
103
+ });
104
+ it('should read a generic binary file and return an info string', async () => {
105
+ // Data that is clearly binary (null bytes)
106
+ const binaryData = Buffer.from([0x00, 0x01, 0x02, 0x03]);
107
+ mock({
108
+ [CWD]: {
109
+ 'data.bin': binaryData,
110
+ },
111
+ });
112
+ const mockFileService = {
113
+ filterFiles: vi.fn((files) => files),
114
+ };
115
+ const config = createMockConfig(CWD, [], mockFileService);
116
+ const result = await readPathFromWorkspace('data.bin', config);
117
+ // Expect [string] containing the skip message from fileUtils
118
+ expect(result).toEqual(['Cannot display content of binary file: data.bin']);
119
+ });
120
+ it('should read a file from an absolute path if within workspace', async () => {
121
+ const absPath = path.join(OTHER_DIR, 'abs.txt');
122
+ mock({
123
+ [CWD]: {},
124
+ [OTHER_DIR]: {
125
+ 'abs.txt': 'absolute content',
126
+ },
127
+ });
128
+ const mockFileService = {
129
+ filterFiles: vi.fn((files) => files),
130
+ };
131
+ const config = createMockConfig(CWD, [OTHER_DIR], mockFileService);
132
+ const result = await readPathFromWorkspace(absPath, config);
133
+ expect(result).toEqual(['absolute content']);
134
+ });
135
+ describe('Directory Expansion', () => {
136
+ it('should expand a directory and read the content of its files', async () => {
137
+ mock({
138
+ [CWD]: {
139
+ 'my-dir': {
140
+ 'file1.txt': 'content of file 1',
141
+ 'file2.md': 'content of file 2',
142
+ },
143
+ },
144
+ });
145
+ const mockFileService = {
146
+ filterFiles: vi.fn((files) => files),
147
+ };
148
+ const config = createMockConfig(CWD, [], mockFileService);
149
+ const result = await readPathFromWorkspace('my-dir', config);
150
+ // Convert to a single string for easier, order-independent checking
151
+ const resultText = result
152
+ .map((p) => {
153
+ if (typeof p === 'string')
154
+ return p;
155
+ if (typeof p === 'object' && p && 'text' in p)
156
+ return p.text;
157
+ // This part is important for handling binary/image data which isn't just text
158
+ if (typeof p === 'object' && p && 'inlineData' in p)
159
+ return '';
160
+ return p;
161
+ })
162
+ .join('');
163
+ expect(resultText).toContain('--- Start of content for directory: my-dir ---');
164
+ expect(resultText).toContain('--- file1.txt ---');
165
+ expect(resultText).toContain('content of file 1');
166
+ expect(resultText).toContain('--- file2.md ---');
167
+ expect(resultText).toContain('content of file 2');
168
+ expect(resultText).toContain('--- End of content for directory: my-dir ---');
169
+ });
170
+ it('should recursively expand a directory and read all nested files', async () => {
171
+ mock({
172
+ [CWD]: {
173
+ 'my-dir': {
174
+ 'file1.txt': 'content of file 1',
175
+ 'sub-dir': {
176
+ 'nested.txt': 'nested content',
177
+ },
178
+ },
179
+ },
180
+ });
181
+ const mockFileService = {
182
+ filterFiles: vi.fn((files) => files),
183
+ };
184
+ const config = createMockConfig(CWD, [], mockFileService);
185
+ const result = await readPathFromWorkspace('my-dir', config);
186
+ const resultText = result
187
+ .map((p) => {
188
+ if (typeof p === 'string')
189
+ return p;
190
+ if (typeof p === 'object' && p && 'text' in p)
191
+ return p.text;
192
+ return '';
193
+ })
194
+ .join('');
195
+ expect(resultText).toContain('content of file 1');
196
+ expect(resultText).toContain('nested content');
197
+ expect(resultText).toContain(`--- ${path.join('sub-dir', 'nested.txt')} ---`);
198
+ });
199
+ it('should handle mixed content and include files from subdirectories', async () => {
200
+ const imageData = Buffer.from([
201
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a,
202
+ ]);
203
+ mock({
204
+ [CWD]: {
205
+ 'mixed-dir': {
206
+ 'info.txt': 'some text',
207
+ 'photo.png': imageData,
208
+ 'sub-dir': {
209
+ 'nested.txt': 'this should be included',
210
+ },
211
+ 'empty-sub-dir': {},
212
+ },
213
+ },
214
+ });
215
+ const mockFileService = {
216
+ filterFiles: vi.fn((files) => files),
217
+ };
218
+ const config = createMockConfig(CWD, [], mockFileService);
219
+ const result = await readPathFromWorkspace('mixed-dir', config);
220
+ // Check for the text part
221
+ const textContent = result
222
+ .map((p) => {
223
+ if (typeof p === 'string')
224
+ return p;
225
+ if (typeof p === 'object' && p && 'text' in p)
226
+ return p.text;
227
+ return ''; // Ignore non-text parts for this assertion
228
+ })
229
+ .join('');
230
+ expect(textContent).toContain('some text');
231
+ expect(textContent).toContain('this should be included');
232
+ // Check for the image part
233
+ const imagePart = result.find((p) => typeof p === 'object' && 'inlineData' in p);
234
+ expect(imagePart).toEqual({
235
+ inlineData: {
236
+ mimeType: 'image/png',
237
+ data: imageData.toString('base64'),
238
+ },
239
+ });
240
+ });
241
+ it('should handle an empty directory', async () => {
242
+ mock({
243
+ [CWD]: {
244
+ 'empty-dir': {},
245
+ },
246
+ });
247
+ const mockFileService = {
248
+ filterFiles: vi.fn((files) => files),
249
+ };
250
+ const config = createMockConfig(CWD, [], mockFileService);
251
+ const result = await readPathFromWorkspace('empty-dir', config);
252
+ expect(result).toEqual([
253
+ { text: '--- Start of content for directory: empty-dir ---\n' },
254
+ { text: '--- End of content for directory: empty-dir ---' },
255
+ ]);
256
+ });
257
+ });
258
+ describe('File Ignoring', () => {
259
+ it('should return an empty array for an ignored file', async () => {
260
+ mock({
261
+ [CWD]: {
262
+ 'ignored.txt': 'ignored content',
263
+ },
264
+ });
265
+ const mockFileService = {
266
+ filterFiles: vi.fn(() => []), // Simulate the file being filtered out
267
+ };
268
+ const config = createMockConfig(CWD, [], mockFileService);
269
+ const result = await readPathFromWorkspace('ignored.txt', config);
270
+ expect(result).toEqual([]);
271
+ expect(mockFileService.filterFiles).toHaveBeenCalledWith(['ignored.txt'], {
272
+ respectGitIgnore: true,
273
+ respectGeminiIgnore: true,
274
+ });
275
+ });
276
+ it('should not read ignored files when expanding a directory', async () => {
277
+ mock({
278
+ [CWD]: {
279
+ 'my-dir': {
280
+ 'not-ignored.txt': 'visible',
281
+ 'ignored.log': 'invisible',
282
+ },
283
+ },
284
+ });
285
+ const mockFileService = {
286
+ filterFiles: vi.fn((files) => files.filter((f) => !f.endsWith('ignored.log'))),
287
+ };
288
+ const config = createMockConfig(CWD, [], mockFileService);
289
+ const result = await readPathFromWorkspace('my-dir', config);
290
+ const resultText = result
291
+ .map((p) => {
292
+ if (typeof p === 'string')
293
+ return p;
294
+ if (typeof p === 'object' && p && 'text' in p)
295
+ return p.text;
296
+ return '';
297
+ })
298
+ .join('');
299
+ expect(resultText).toContain('visible');
300
+ expect(resultText).not.toContain('invisible');
301
+ expect(mockFileService.filterFiles).toHaveBeenCalled();
302
+ });
303
+ });
304
+ it('should throw an error for an absolute path outside the workspace', async () => {
305
+ const absPath = path.join(OUTSIDE_DIR, 'secret.txt');
306
+ mock({
307
+ [CWD]: {},
308
+ [OUTSIDE_DIR]: {
309
+ 'secret.txt': 'secrets',
310
+ },
311
+ });
312
+ // OUTSIDE_DIR is not added to the config's workspace
313
+ const config = createMockConfig(CWD);
314
+ await expect(readPathFromWorkspace(absPath, config)).rejects.toThrow(`Absolute path is outside of the allowed workspace: ${absPath}`);
315
+ });
316
+ it('should throw an error if a relative path is not found anywhere', async () => {
317
+ mock({
318
+ [CWD]: {},
319
+ [OTHER_DIR]: {},
320
+ });
321
+ const config = createMockConfig(CWD, [OTHER_DIR]);
322
+ await expect(readPathFromWorkspace('not-found.txt', config)).rejects.toThrow('Path not found in workspace: not-found.txt');
323
+ });
324
+ // mock-fs permission simulation is unreliable on Windows.
325
+ it.skipIf(process.platform === 'win32')('should return an error string if reading a file with no permissions', async () => {
326
+ mock({
327
+ [CWD]: {
328
+ 'unreadable.txt': mock.file({
329
+ content: 'you cannot read me',
330
+ mode: 0o222, // Write-only
331
+ }),
332
+ },
333
+ });
334
+ const mockFileService = {
335
+ filterFiles: vi.fn((files) => files),
336
+ };
337
+ const config = createMockConfig(CWD, [], mockFileService);
338
+ // processSingleFileContent catches the error and returns an error string.
339
+ const result = await readPathFromWorkspace('unreadable.txt', config);
340
+ const textResult = result[0];
341
+ // processSingleFileContent formats errors using the relative path from the target dir (CWD).
342
+ expect(textResult).toContain('Error reading file unreadable.txt');
343
+ expect(textResult).toMatch(/(EACCES|permission denied)/i);
344
+ });
345
+ it('should return an error string for files exceeding the size limit', async () => {
346
+ // Mock a file slightly larger than the 20MB limit defined in fileUtils.ts
347
+ const largeContent = 'a'.repeat(21 * 1024 * 1024); // 21MB
348
+ mock({
349
+ [CWD]: {
350
+ 'large.txt': largeContent,
351
+ },
352
+ });
353
+ const mockFileService = {
354
+ filterFiles: vi.fn((files) => files),
355
+ };
356
+ const config = createMockConfig(CWD, [], mockFileService);
357
+ const result = await readPathFromWorkspace('large.txt', config);
358
+ const textResult = result[0];
359
+ // The error message comes directly from processSingleFileContent
360
+ expect(textResult).toBe('File size exceeds the 20MB limit.');
361
+ });
362
+ });
363
+ //# sourceMappingURL=pathReader.test.js.map