@machina.ai/cell-cli 1.36.0-rc1 → 1.38.1-rc2

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 (580) hide show
  1. package/dist/index.d.ts +1 -1
  2. package/dist/index.js +1 -1
  3. package/dist/package.json +4 -4
  4. package/dist/src/acp/acpClient.js +297 -32
  5. package/dist/src/acp/acpClient.js.map +1 -1
  6. package/dist/src/acp/acpClient.test.js +419 -19
  7. package/dist/src/acp/acpClient.test.js.map +1 -1
  8. package/dist/src/acp/acpResume.test.js +8 -0
  9. package/dist/src/acp/acpResume.test.js.map +1 -1
  10. package/dist/src/acp/commandHandler.js +4 -0
  11. package/dist/src/acp/commandHandler.js.map +1 -1
  12. package/dist/src/acp/commandHandler.test.js +4 -0
  13. package/dist/src/acp/commandHandler.test.js.map +1 -1
  14. package/dist/src/acp/commands/about.d.ts +11 -0
  15. package/dist/src/acp/commands/about.js +53 -0
  16. package/dist/src/acp/commands/about.js.map +1 -0
  17. package/dist/src/acp/commands/extensions.js +1 -1
  18. package/dist/src/acp/commands/extensions.js.map +1 -1
  19. package/dist/src/acp/commands/help.d.ts +14 -0
  20. package/dist/src/acp/commands/help.js +35 -0
  21. package/dist/src/acp/commands/help.js.map +1 -0
  22. package/dist/src/acp/commands/help.test.d.ts +6 -0
  23. package/dist/src/acp/commands/help.test.js +40 -0
  24. package/dist/src/acp/commands/help.test.js.map +1 -0
  25. package/dist/src/acp/commands/restore.js +2 -2
  26. package/dist/src/acp/commands/restore.js.map +1 -1
  27. package/dist/src/commands/extensions/new.js +1 -1
  28. package/dist/src/commands/extensions/new.js.map +1 -1
  29. package/dist/src/commands/mcp/list.js +2 -2
  30. package/dist/src/commands/mcp/list.js.map +1 -1
  31. package/dist/src/commands/mcp.test.js +1 -1
  32. package/dist/src/commands/mcp.test.js.map +1 -1
  33. package/dist/src/commands/skills/list.js +5 -8
  34. package/dist/src/commands/skills/list.js.map +1 -1
  35. package/dist/src/commands/skills/list.test.js +17 -13
  36. package/dist/src/commands/skills/list.test.js.map +1 -1
  37. package/dist/src/config/config.js +22 -9
  38. package/dist/src/config/config.js.map +1 -1
  39. package/dist/src/config/config.test.js +121 -36
  40. package/dist/src/config/config.test.js.map +1 -1
  41. package/dist/src/config/extension-manager-permissions.test.js +1 -1
  42. package/dist/src/config/extension-manager-permissions.test.js.map +1 -1
  43. package/dist/src/config/extension-manager-themes.spec.js +1 -0
  44. package/dist/src/config/extension-manager-themes.spec.js.map +1 -1
  45. package/dist/src/config/extension-manager.test.js +1 -1
  46. package/dist/src/config/extension-manager.test.js.map +1 -1
  47. package/dist/src/config/extension.js +1 -1
  48. package/dist/src/config/extension.js.map +1 -1
  49. package/dist/src/config/extensions/github.js +1 -1
  50. package/dist/src/config/extensions/github.js.map +1 -1
  51. package/dist/src/config/footerItems.d.ts +4 -0
  52. package/dist/src/config/footerItems.js +12 -2
  53. package/dist/src/config/footerItems.js.map +1 -1
  54. package/dist/src/config/footerItems.test.js +129 -72
  55. package/dist/src/config/footerItems.test.js.map +1 -1
  56. package/dist/src/config/policy-engine.integration.test.js +1 -3
  57. package/dist/src/config/policy-engine.integration.test.js.map +1 -1
  58. package/dist/src/config/policy.d.ts +1 -1
  59. package/dist/src/config/policy.js +2 -2
  60. package/dist/src/config/policy.js.map +1 -1
  61. package/dist/src/config/settings.js +19 -3
  62. package/dist/src/config/settings.js.map +1 -1
  63. package/dist/src/config/settingsSchema.d.ts +272 -53
  64. package/dist/src/config/settingsSchema.js +262 -48
  65. package/dist/src/config/settingsSchema.js.map +1 -1
  66. package/dist/src/config/settingsSchema.test.js +22 -4
  67. package/dist/src/config/settingsSchema.test.js.map +1 -1
  68. package/dist/src/config/workspace-policy-cli.test.js +7 -7
  69. package/dist/src/config/workspace-policy-cli.test.js.map +1 -1
  70. package/dist/src/gemini.js +24 -7
  71. package/dist/src/gemini.js.map +1 -1
  72. package/dist/src/gemini.test.js +74 -4
  73. package/dist/src/gemini.test.js.map +1 -1
  74. package/dist/src/gemini_cleanup.test.js +69 -4
  75. package/dist/src/gemini_cleanup.test.js.map +1 -1
  76. package/dist/src/generated/git-commit.d.ts +2 -2
  77. package/dist/src/generated/git-commit.js +2 -2
  78. package/dist/src/integration-tests/modelSteering.test.js +1 -1
  79. package/dist/src/integration-tests/modelSteering.test.js.map +1 -1
  80. package/dist/src/interactiveCli.js +4 -2
  81. package/dist/src/interactiveCli.js.map +1 -1
  82. package/dist/src/nonInteractiveCli.d.ts +1 -1
  83. package/dist/src/nonInteractiveCli.js +11 -2
  84. package/dist/src/nonInteractiveCli.js.map +1 -1
  85. package/dist/src/nonInteractiveCli.test.js +4 -2
  86. package/dist/src/nonInteractiveCli.test.js.map +1 -1
  87. package/dist/src/nonInteractiveCliAgentSession.d.ts +16 -0
  88. package/dist/src/nonInteractiveCliAgentSession.js +484 -0
  89. package/dist/src/nonInteractiveCliAgentSession.js.map +1 -0
  90. package/dist/src/nonInteractiveCliAgentSession.test.js +1837 -0
  91. package/dist/src/nonInteractiveCliAgentSession.test.js.map +1 -0
  92. package/dist/src/services/BuiltinCommandLoader.js +4 -2
  93. package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
  94. package/dist/src/test-utils/mockCommandContext.js +1 -0
  95. package/dist/src/test-utils/mockCommandContext.js.map +1 -1
  96. package/dist/src/test-utils/mockConfig.js +16 -0
  97. package/dist/src/test-utils/mockConfig.js.map +1 -1
  98. package/dist/src/test-utils/mockSpinner.d.ts +6 -0
  99. package/dist/src/test-utils/mockSpinner.js +21 -0
  100. package/dist/src/test-utils/mockSpinner.js.map +1 -0
  101. package/dist/src/test-utils/render.d.ts +8 -1
  102. package/dist/src/test-utils/render.js +37 -11
  103. package/dist/src/test-utils/render.js.map +1 -1
  104. package/dist/src/ui/App.test.js +1 -1
  105. package/dist/src/ui/App.test.js.map +1 -1
  106. package/dist/src/ui/AppContainer.js +225 -99
  107. package/dist/src/ui/AppContainer.js.map +1 -1
  108. package/dist/src/ui/AppContainer.test.js +50 -38
  109. package/dist/src/ui/AppContainer.test.js.map +1 -1
  110. package/dist/src/ui/commands/chatCommand.js +15 -5
  111. package/dist/src/ui/commands/chatCommand.js.map +1 -1
  112. package/dist/src/ui/commands/clearCommand.js +3 -1
  113. package/dist/src/ui/commands/clearCommand.js.map +1 -1
  114. package/dist/src/ui/commands/directoryCommand.js +1 -1
  115. package/dist/src/ui/commands/directoryCommand.js.map +1 -1
  116. package/dist/src/ui/commands/extensionsCommand.js +22 -11
  117. package/dist/src/ui/commands/extensionsCommand.js.map +1 -1
  118. package/dist/src/ui/commands/marketplaceCommand.d.ts +7 -0
  119. package/dist/src/ui/commands/marketplaceCommand.js +135 -0
  120. package/dist/src/ui/commands/marketplaceCommand.js.map +1 -0
  121. package/dist/src/ui/commands/mcpCommand.js +26 -7
  122. package/dist/src/ui/commands/mcpCommand.js.map +1 -1
  123. package/dist/src/ui/commands/mcpCommand.test.js +26 -0
  124. package/dist/src/ui/commands/mcpCommand.test.js.map +1 -1
  125. package/dist/src/ui/commands/planCommand.js +9 -0
  126. package/dist/src/ui/commands/planCommand.js.map +1 -1
  127. package/dist/src/ui/commands/planCommand.test.js +29 -0
  128. package/dist/src/ui/commands/planCommand.test.js.map +1 -1
  129. package/dist/src/ui/commands/restoreCommand.js +1 -1
  130. package/dist/src/ui/commands/restoreCommand.js.map +1 -1
  131. package/dist/src/ui/commands/rewindCommand.js +3 -1
  132. package/dist/src/ui/commands/rewindCommand.js.map +1 -1
  133. package/dist/src/ui/commands/rewindCommand.test.js +1 -1
  134. package/dist/src/ui/commands/rewindCommand.test.js.map +1 -1
  135. package/dist/src/ui/commands/setupGithubCommand.js +5 -5
  136. package/dist/src/ui/commands/setupGithubCommand.js.map +1 -1
  137. package/dist/src/ui/commands/skillsCommand.js +11 -1
  138. package/dist/src/ui/commands/skillsCommand.js.map +1 -1
  139. package/dist/src/ui/commands/skillsCommand.test.js +1 -0
  140. package/dist/src/ui/commands/skillsCommand.test.js.map +1 -1
  141. package/dist/src/ui/commands/{shellsCommand.d.ts → tasksCommand.d.ts} +1 -1
  142. package/dist/src/ui/commands/{shellsCommand.js → tasksCommand.js} +6 -6
  143. package/dist/src/ui/commands/tasksCommand.js.map +1 -0
  144. package/dist/src/ui/commands/tasksCommand.test.js +30 -0
  145. package/dist/src/ui/commands/tasksCommand.test.js.map +1 -0
  146. package/dist/src/ui/commands/types.d.ts +9 -1
  147. package/dist/src/ui/components/AnsiOutput.js +7 -5
  148. package/dist/src/ui/components/AnsiOutput.js.map +1 -1
  149. package/dist/src/ui/components/AnsiOutput.test.js +13 -0
  150. package/dist/src/ui/components/AnsiOutput.test.js.map +1 -1
  151. package/dist/src/ui/components/AppHeader.js +11 -11
  152. package/dist/src/ui/components/AppHeader.js.map +1 -1
  153. package/dist/src/ui/components/AppHeader.test.js +6 -2
  154. package/dist/src/ui/components/AppHeader.test.js.map +1 -1
  155. package/dist/src/ui/components/AsciiArt.d.ts +6 -6
  156. package/dist/src/ui/components/AsciiArt.js +6 -6
  157. package/dist/src/ui/components/AskUserDialog.js +13 -13
  158. package/dist/src/ui/components/AskUserDialog.js.map +1 -1
  159. package/dist/src/ui/components/AskUserDialog.test.js +31 -0
  160. package/dist/src/ui/components/AskUserDialog.test.js.map +1 -1
  161. package/dist/src/ui/components/BackgroundTaskDisplay.d.ts +16 -0
  162. package/dist/src/ui/components/{BackgroundShellDisplay.js → BackgroundTaskDisplay.js} +12 -12
  163. package/dist/src/ui/components/BackgroundTaskDisplay.js.map +1 -0
  164. package/dist/src/ui/components/{BackgroundShellDisplay.test.js → BackgroundTaskDisplay.test.js} +26 -26
  165. package/dist/src/ui/components/BackgroundTaskDisplay.test.js.map +1 -0
  166. package/dist/src/ui/components/Composer.js +20 -208
  167. package/dist/src/ui/components/Composer.js.map +1 -1
  168. package/dist/src/ui/components/Composer.test.js +22 -17
  169. package/dist/src/ui/components/Composer.test.js.map +1 -1
  170. package/dist/src/ui/components/ContextSummaryDisplay.js +3 -1
  171. package/dist/src/ui/components/ContextSummaryDisplay.js.map +1 -1
  172. package/dist/src/ui/components/CopyModeWarning.js +3 -6
  173. package/dist/src/ui/components/CopyModeWarning.js.map +1 -1
  174. package/dist/src/ui/components/CopyModeWarning.test.js +7 -8
  175. package/dist/src/ui/components/CopyModeWarning.test.js.map +1 -1
  176. package/dist/src/ui/components/ExitPlanModeDialog.js +9 -0
  177. package/dist/src/ui/components/ExitPlanModeDialog.js.map +1 -1
  178. package/dist/src/ui/components/ExitPlanModeDialog.test.js +15 -3
  179. package/dist/src/ui/components/ExitPlanModeDialog.test.js.map +1 -1
  180. package/dist/src/ui/components/FolderTrustDialog.test.js +7 -8
  181. package/dist/src/ui/components/FolderTrustDialog.test.js.map +1 -1
  182. package/dist/src/ui/components/Footer.js +36 -9
  183. package/dist/src/ui/components/Footer.js.map +1 -1
  184. package/dist/src/ui/components/Footer.test.js +85 -6
  185. package/dist/src/ui/components/Footer.test.js.map +1 -1
  186. package/dist/src/ui/components/FooterConfigDialog.js +1 -0
  187. package/dist/src/ui/components/FooterConfigDialog.js.map +1 -1
  188. package/dist/src/ui/components/FooterConfigDialog.test.js +1 -1
  189. package/dist/src/ui/components/Help.test.js +1 -1
  190. package/dist/src/ui/components/Help.test.js.map +1 -1
  191. package/dist/src/ui/components/HistoryItemDisplay.d.ts +2 -0
  192. package/dist/src/ui/components/HistoryItemDisplay.js +14 -12
  193. package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
  194. package/dist/src/ui/components/InputPrompt.d.ts +10 -5
  195. package/dist/src/ui/components/InputPrompt.js +195 -90
  196. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  197. package/dist/src/ui/components/InputPrompt.test.d.ts +12 -1
  198. package/dist/src/ui/components/InputPrompt.test.js +370 -160
  199. package/dist/src/ui/components/InputPrompt.test.js.map +1 -1
  200. package/dist/src/ui/components/LoadingIndicator.js +1 -2
  201. package/dist/src/ui/components/LoadingIndicator.js.map +1 -1
  202. package/dist/src/ui/components/LoadingIndicator.test.js +7 -0
  203. package/dist/src/ui/components/LoadingIndicator.test.js.map +1 -1
  204. package/dist/src/ui/components/MainContent.d.ts +1 -1
  205. package/dist/src/ui/components/MainContent.js +105 -34
  206. package/dist/src/ui/components/MainContent.js.map +1 -1
  207. package/dist/src/ui/components/MainContent.test.js +12 -9
  208. package/dist/src/ui/components/MainContent.test.js.map +1 -1
  209. package/dist/src/ui/components/MemoryUsageDisplay.d.ts +1 -0
  210. package/dist/src/ui/components/MemoryUsageDisplay.js +5 -2
  211. package/dist/src/ui/components/MemoryUsageDisplay.js.map +1 -1
  212. package/dist/src/ui/components/ModelDialog.js +50 -72
  213. package/dist/src/ui/components/ModelDialog.js.map +1 -1
  214. package/dist/src/ui/components/ModelDialog.test.js +1 -0
  215. package/dist/src/ui/components/ModelDialog.test.js.map +1 -1
  216. package/dist/src/ui/components/ModelQuotaDisplay.d.ts +18 -0
  217. package/dist/src/ui/components/ModelQuotaDisplay.js +104 -0
  218. package/dist/src/ui/components/ModelQuotaDisplay.js.map +1 -0
  219. package/dist/src/ui/components/ModelQuotaDisplay.test.d.ts +6 -0
  220. package/dist/src/ui/components/ModelQuotaDisplay.test.js +62 -0
  221. package/dist/src/ui/components/ModelQuotaDisplay.test.js.map +1 -0
  222. package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js +1 -1
  223. package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js.map +1 -1
  224. package/dist/src/ui/components/ProgressBar.d.ts +13 -0
  225. package/dist/src/ui/components/ProgressBar.js +17 -0
  226. package/dist/src/ui/components/ProgressBar.js.map +1 -0
  227. package/dist/src/ui/components/ProgressBar.test.d.ts +6 -0
  228. package/dist/src/ui/components/ProgressBar.test.js +28 -0
  229. package/dist/src/ui/components/ProgressBar.test.js.map +1 -0
  230. package/dist/src/ui/components/StatsDisplay.d.ts +2 -2
  231. package/dist/src/ui/components/StatsDisplay.js +47 -128
  232. package/dist/src/ui/components/StatsDisplay.js.map +1 -1
  233. package/dist/src/ui/components/StatsDisplay.test.js +65 -136
  234. package/dist/src/ui/components/StatsDisplay.test.js.map +1 -1
  235. package/dist/src/ui/components/StatusDisplay.js +1 -1
  236. package/dist/src/ui/components/StatusDisplay.js.map +1 -1
  237. package/dist/src/ui/components/StatusDisplay.test.js +3 -3
  238. package/dist/src/ui/components/StatusDisplay.test.js.map +1 -1
  239. package/dist/src/ui/components/StatusRow.d.ts +32 -0
  240. package/dist/src/ui/components/StatusRow.js +180 -0
  241. package/dist/src/ui/components/StatusRow.js.map +1 -0
  242. package/dist/src/ui/components/StatusRow.test.d.ts +6 -0
  243. package/dist/src/ui/components/StatusRow.test.js +99 -0
  244. package/dist/src/ui/components/StatusRow.test.js.map +1 -0
  245. package/dist/src/ui/components/ToastDisplay.d.ts +2 -1
  246. package/dist/src/ui/components/ToastDisplay.js +7 -5
  247. package/dist/src/ui/components/ToastDisplay.js.map +1 -1
  248. package/dist/src/ui/components/ToastDisplay.test.js +34 -20
  249. package/dist/src/ui/components/ToastDisplay.test.js.map +1 -1
  250. package/dist/src/ui/components/ToolConfirmationQueue.js +24 -9
  251. package/dist/src/ui/components/ToolConfirmationQueue.js.map +1 -1
  252. package/dist/src/ui/components/ToolConfirmationQueue.test.js +4 -6
  253. package/dist/src/ui/components/ToolConfirmationQueue.test.js.map +1 -1
  254. package/dist/src/ui/components/UserIdentity.js +8 -5
  255. package/dist/src/ui/components/UserIdentity.js.map +1 -1
  256. package/dist/src/ui/components/messages/DenseToolMessage.d.ts +13 -0
  257. package/dist/src/ui/components/messages/DenseToolMessage.js +270 -0
  258. package/dist/src/ui/components/messages/DenseToolMessage.js.map +1 -0
  259. package/dist/src/ui/components/messages/DenseToolMessage.test.d.ts +6 -0
  260. package/dist/src/ui/components/messages/DenseToolMessage.test.js +383 -0
  261. package/dist/src/ui/components/messages/DenseToolMessage.test.js.map +1 -0
  262. package/dist/src/ui/components/messages/DiffRenderer.d.ts +18 -0
  263. package/dist/src/ui/components/messages/DiffRenderer.js +54 -34
  264. package/dist/src/ui/components/messages/DiffRenderer.js.map +1 -1
  265. package/dist/src/ui/components/messages/DiffRenderer.test.js +12 -6
  266. package/dist/src/ui/components/messages/DiffRenderer.test.js.map +1 -1
  267. package/dist/src/ui/components/messages/InfoMessage.d.ts +1 -0
  268. package/dist/src/ui/components/messages/InfoMessage.js +2 -2
  269. package/dist/src/ui/components/messages/InfoMessage.js.map +1 -1
  270. package/dist/src/ui/components/messages/RedirectionConfirmation.test.js +1 -1
  271. package/dist/src/ui/components/messages/RedirectionConfirmation.test.js.map +1 -1
  272. package/dist/src/ui/components/messages/ShellToolMessage.test.js +44 -33
  273. package/dist/src/ui/components/messages/ShellToolMessage.test.js.map +1 -1
  274. package/dist/src/ui/components/messages/SubagentGroupDisplay.js +3 -2
  275. package/dist/src/ui/components/messages/SubagentGroupDisplay.js.map +1 -1
  276. package/dist/src/ui/components/messages/SubagentGroupDisplay.test.js +1 -1
  277. package/dist/src/ui/components/messages/SubagentGroupDisplay.test.js.map +1 -1
  278. package/dist/src/ui/components/messages/SubagentHistoryMessage.d.ts +13 -0
  279. package/dist/src/ui/components/messages/SubagentHistoryMessage.js +4 -0
  280. package/dist/src/ui/components/messages/SubagentHistoryMessage.js.map +1 -0
  281. package/dist/src/ui/components/messages/SubagentHistoryMessage.test.d.ts +6 -0
  282. package/dist/src/ui/components/messages/SubagentHistoryMessage.test.js +68 -0
  283. package/dist/src/ui/components/messages/SubagentHistoryMessage.test.js.map +1 -0
  284. package/dist/src/ui/components/messages/SubagentProgressDisplay.d.ts +2 -1
  285. package/dist/src/ui/components/messages/SubagentProgressDisplay.js +2 -2
  286. package/dist/src/ui/components/messages/SubagentProgressDisplay.js.map +1 -1
  287. package/dist/src/ui/components/messages/SubagentProgressDisplay.test.js +0 -4
  288. package/dist/src/ui/components/messages/SubagentProgressDisplay.test.js.map +1 -1
  289. package/dist/src/ui/components/messages/ToolConfirmationMessage.d.ts +1 -0
  290. package/dist/src/ui/components/messages/ToolConfirmationMessage.js +108 -70
  291. package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
  292. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js +40 -25
  293. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js.map +1 -1
  294. package/dist/src/ui/components/messages/ToolGroupMessage.compact.test.d.ts +6 -0
  295. package/dist/src/ui/components/messages/ToolGroupMessage.compact.test.js +147 -0
  296. package/dist/src/ui/components/messages/ToolGroupMessage.compact.test.js.map +1 -0
  297. package/dist/src/ui/components/messages/ToolGroupMessage.d.ts +3 -0
  298. package/dist/src/ui/components/messages/ToolGroupMessage.js +219 -52
  299. package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -1
  300. package/dist/src/ui/components/messages/ToolGroupMessage.test.js +55 -3
  301. package/dist/src/ui/components/messages/ToolGroupMessage.test.js.map +1 -1
  302. package/dist/src/ui/components/messages/ToolMessage.test.js +8 -7
  303. package/dist/src/ui/components/messages/ToolMessage.test.js.map +1 -1
  304. package/dist/src/ui/components/messages/ToolOverflowConsistencyChecks.test.js +1 -1
  305. package/dist/src/ui/components/messages/ToolOverflowConsistencyChecks.test.js.map +1 -1
  306. package/dist/src/ui/components/messages/ToolResultDisplay.js +57 -15
  307. package/dist/src/ui/components/messages/ToolResultDisplay.js.map +1 -1
  308. package/dist/src/ui/components/messages/ToolResultDisplay.test.js +66 -3
  309. package/dist/src/ui/components/messages/ToolResultDisplay.test.js.map +1 -1
  310. package/dist/src/ui/components/messages/ToolResultDisplayOverflow.test.js +5 -4
  311. package/dist/src/ui/components/messages/ToolResultDisplayOverflow.test.js.map +1 -1
  312. package/dist/src/ui/components/messages/ToolStickyHeaderRegression.test.js +3 -3
  313. package/dist/src/ui/components/messages/ToolStickyHeaderRegression.test.js.map +1 -1
  314. package/dist/src/ui/components/messages/TopicMessage.d.ts +15 -0
  315. package/dist/src/ui/components/messages/TopicMessage.js +56 -0
  316. package/dist/src/ui/components/messages/TopicMessage.js.map +1 -0
  317. package/dist/src/ui/components/messages/TopicMessage.test.d.ts +6 -0
  318. package/dist/src/ui/components/messages/TopicMessage.test.js +77 -0
  319. package/dist/src/ui/components/messages/TopicMessage.test.js.map +1 -0
  320. package/dist/src/ui/components/shared/MaxSizedBox.d.ts +1 -0
  321. package/dist/src/ui/components/shared/MaxSizedBox.js +10 -7
  322. package/dist/src/ui/components/shared/MaxSizedBox.js.map +1 -1
  323. package/dist/src/ui/components/shared/Scrollable.d.ts +3 -0
  324. package/dist/src/ui/components/shared/Scrollable.js +6 -2
  325. package/dist/src/ui/components/shared/Scrollable.js.map +1 -1
  326. package/dist/src/ui/components/shared/ScrollableList.d.ts +9 -12
  327. package/dist/src/ui/components/shared/ScrollableList.js +2 -2
  328. package/dist/src/ui/components/shared/ScrollableList.js.map +1 -1
  329. package/dist/src/ui/components/shared/VirtualizedList.d.ts +13 -1
  330. package/dist/src/ui/components/shared/VirtualizedList.js +148 -37
  331. package/dist/src/ui/components/shared/VirtualizedList.js.map +1 -1
  332. package/dist/src/ui/components/shared/VirtualizedList.test.js +1 -10
  333. package/dist/src/ui/components/shared/VirtualizedList.test.js.map +1 -1
  334. package/dist/src/ui/components/shared/text-buffer.d.ts +1 -0
  335. package/dist/src/ui/components/shared/text-buffer.js +19 -21
  336. package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
  337. package/dist/src/ui/components/views/ExtensionDetails.d.ts +4 -1
  338. package/dist/src/ui/components/views/ExtensionDetails.js +14 -4
  339. package/dist/src/ui/components/views/ExtensionDetails.js.map +1 -1
  340. package/dist/src/ui/components/views/ExtensionDetails.test.js +25 -1
  341. package/dist/src/ui/components/views/ExtensionDetails.test.js.map +1 -1
  342. package/dist/src/ui/components/views/ExtensionRegistryView.js +19 -5
  343. package/dist/src/ui/components/views/ExtensionRegistryView.js.map +1 -1
  344. package/dist/src/ui/components/views/ExtensionRegistryView.test.js +38 -0
  345. package/dist/src/ui/components/views/ExtensionRegistryView.test.js.map +1 -1
  346. package/dist/src/ui/components/views/SkillsList.js +2 -1
  347. package/dist/src/ui/components/views/SkillsList.js.map +1 -1
  348. package/dist/src/ui/components/views/SkillsList.test.js +3 -1
  349. package/dist/src/ui/components/views/SkillsList.test.js.map +1 -1
  350. package/dist/src/ui/constants/tips.js +2 -2
  351. package/dist/src/ui/constants/tips.js.map +1 -1
  352. package/dist/src/ui/constants.d.ts +6 -0
  353. package/dist/src/ui/constants.js +15 -0
  354. package/dist/src/ui/constants.js.map +1 -1
  355. package/dist/src/ui/contexts/InputContext.d.ts +17 -0
  356. package/dist/src/ui/contexts/InputContext.js +15 -0
  357. package/dist/src/ui/contexts/InputContext.js.map +1 -0
  358. package/dist/src/ui/contexts/KeypressContext.js +1 -1
  359. package/dist/src/ui/contexts/KeypressContext.js.map +1 -1
  360. package/dist/src/ui/contexts/KeypressContext.test.js +25 -1
  361. package/dist/src/ui/contexts/KeypressContext.test.js.map +1 -1
  362. package/dist/src/ui/contexts/ScrollProvider.js +25 -3
  363. package/dist/src/ui/contexts/ScrollProvider.js.map +1 -1
  364. package/dist/src/ui/contexts/ScrollProvider.test.js +100 -0
  365. package/dist/src/ui/contexts/ScrollProvider.test.js.map +1 -1
  366. package/dist/src/ui/contexts/SessionContext.d.ts +2 -2
  367. package/dist/src/ui/contexts/SessionContext.js.map +1 -1
  368. package/dist/src/ui/contexts/ToolActionsContext.d.ts +6 -0
  369. package/dist/src/ui/contexts/ToolActionsContext.js +19 -11
  370. package/dist/src/ui/contexts/ToolActionsContext.js.map +1 -1
  371. package/dist/src/ui/contexts/ToolActionsContext.test.js +90 -7
  372. package/dist/src/ui/contexts/ToolActionsContext.test.js.map +1 -1
  373. package/dist/src/ui/contexts/UIActionsContext.d.ts +4 -3
  374. package/dist/src/ui/contexts/UIActionsContext.js.map +1 -1
  375. package/dist/src/ui/contexts/UIStateContext.d.ts +10 -16
  376. package/dist/src/ui/contexts/UIStateContext.js.map +1 -1
  377. package/dist/src/ui/hooks/atCommandProcessor.test.js +2 -1
  378. package/dist/src/ui/hooks/atCommandProcessor.test.js.map +1 -1
  379. package/dist/src/ui/hooks/atCommandProcessor_agents.test.js +2 -1
  380. package/dist/src/ui/hooks/atCommandProcessor_agents.test.js.map +1 -1
  381. package/dist/src/ui/hooks/shellReducer.d.ts +12 -10
  382. package/dist/src/ui/hooks/shellReducer.js +67 -37
  383. package/dist/src/ui/hooks/shellReducer.js.map +1 -1
  384. package/dist/src/ui/hooks/shellReducer.test.js +207 -36
  385. package/dist/src/ui/hooks/shellReducer.test.js.map +1 -1
  386. package/dist/src/ui/hooks/slashCommandProcessor.d.ts +1 -1
  387. package/dist/src/ui/hooks/slashCommandProcessor.js +1 -1
  388. package/dist/src/ui/hooks/slashCommandProcessor.test.js +1 -1
  389. package/dist/src/ui/hooks/toolMapping.js +7 -0
  390. package/dist/src/ui/hooks/toolMapping.js.map +1 -1
  391. package/dist/src/ui/hooks/useAlternateBuffer.js +6 -1
  392. package/dist/src/ui/hooks/useAlternateBuffer.js.map +1 -1
  393. package/dist/src/ui/hooks/useAlternateBuffer.test.js +5 -0
  394. package/dist/src/ui/hooks/useAlternateBuffer.test.js.map +1 -1
  395. package/dist/src/ui/hooks/useAnimatedScrollbar.js +2 -2
  396. package/dist/src/ui/hooks/useAnimatedScrollbar.js.map +1 -1
  397. package/dist/src/ui/hooks/useAtCompletion.js +1 -1
  398. package/dist/src/ui/hooks/useAtCompletion.js.map +1 -1
  399. package/dist/src/ui/hooks/useBackgroundTaskManager.d.ts +22 -0
  400. package/dist/src/ui/hooks/useBackgroundTaskManager.js +58 -0
  401. package/dist/src/ui/hooks/useBackgroundTaskManager.js.map +1 -0
  402. package/dist/src/ui/hooks/{useBackgroundShellManager.test.js → useBackgroundTaskManager.test.js} +50 -50
  403. package/dist/src/ui/hooks/useBackgroundTaskManager.test.js.map +1 -0
  404. package/dist/src/ui/hooks/useBanner.d.ts +1 -0
  405. package/dist/src/ui/hooks/useBanner.js +16 -9
  406. package/dist/src/ui/hooks/useBanner.js.map +1 -1
  407. package/dist/src/ui/hooks/useBanner.test.js +7 -4
  408. package/dist/src/ui/hooks/useBanner.test.js.map +1 -1
  409. package/dist/src/ui/hooks/useBatchedScroll.js +2 -2
  410. package/dist/src/ui/hooks/useBatchedScroll.js.map +1 -1
  411. package/dist/src/ui/hooks/useCommandCompletion.d.ts +2 -1
  412. package/dist/src/ui/hooks/useCommandCompletion.js +13 -3
  413. package/dist/src/ui/hooks/useCommandCompletion.js.map +1 -1
  414. package/dist/src/ui/hooks/useCommandCompletion.test.d.ts +1 -1
  415. package/dist/src/ui/hooks/useCommandCompletion.test.js +82 -6
  416. package/dist/src/ui/hooks/useCommandCompletion.test.js.map +1 -1
  417. package/dist/src/ui/hooks/useComposerStatus.d.ts +21 -0
  418. package/dist/src/ui/hooks/useComposerStatus.js +78 -0
  419. package/dist/src/ui/hooks/useComposerStatus.js.map +1 -0
  420. package/dist/src/ui/hooks/useConsoleMessages.test.js +2 -2
  421. package/dist/src/ui/hooks/useConsoleMessages.test.js.map +1 -1
  422. package/dist/src/ui/hooks/useExecutionLifecycle.d.ts +28 -0
  423. package/dist/src/ui/hooks/{shellCommandProcessor.js → useExecutionLifecycle.js} +140 -58
  424. package/dist/src/ui/hooks/useExecutionLifecycle.js.map +1 -0
  425. package/dist/src/ui/hooks/useExecutionLifecycle.test.d.ts +6 -0
  426. package/dist/src/ui/hooks/{shellCommandProcessor.test.js → useExecutionLifecycle.test.js} +123 -81
  427. package/dist/src/ui/hooks/useExecutionLifecycle.test.js.map +1 -0
  428. package/dist/src/ui/hooks/useFolderTrust.js +1 -1
  429. package/dist/src/ui/hooks/useFolderTrust.js.map +1 -1
  430. package/dist/src/ui/hooks/useFolderTrust.test.js +1 -1
  431. package/dist/src/ui/hooks/useFolderTrust.test.js.map +1 -1
  432. package/dist/src/ui/hooks/useGeminiStream.d.ts +6 -6
  433. package/dist/src/ui/hooks/useGeminiStream.js +140 -38
  434. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  435. package/dist/src/ui/hooks/useGeminiStream.test.js +176 -22
  436. package/dist/src/ui/hooks/useGeminiStream.test.js.map +1 -1
  437. package/dist/src/ui/hooks/useGitBranchName.js +2 -2
  438. package/dist/src/ui/hooks/useGitBranchName.js.map +1 -1
  439. package/dist/src/ui/hooks/useLoadingIndicator.js +1 -1
  440. package/dist/src/ui/hooks/useLoadingIndicator.js.map +1 -1
  441. package/dist/src/ui/hooks/useLoadingIndicator.test.js +10 -0
  442. package/dist/src/ui/hooks/useLoadingIndicator.test.js.map +1 -1
  443. package/dist/src/ui/hooks/usePermissionsModifyTrust.js +2 -2
  444. package/dist/src/ui/hooks/usePermissionsModifyTrust.js.map +1 -1
  445. package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js +1 -1
  446. package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js.map +1 -1
  447. package/dist/src/ui/hooks/usePhraseCycler.js +4 -2
  448. package/dist/src/ui/hooks/usePhraseCycler.js.map +1 -1
  449. package/dist/src/ui/hooks/useSessionBrowser.d.ts +1 -1
  450. package/dist/src/ui/hooks/useSessionBrowser.js +2 -2
  451. package/dist/src/ui/hooks/useSessionBrowser.js.map +1 -1
  452. package/dist/src/ui/hooks/useSlashCompletion.d.ts +1 -1
  453. package/dist/src/ui/hooks/useSlashCompletion.js +37 -63
  454. package/dist/src/ui/hooks/useSlashCompletion.js.map +1 -1
  455. package/dist/src/ui/hooks/useSlashCompletion.test.d.ts +1 -1
  456. package/dist/src/ui/hooks/useSlashCompletion.test.js +57 -47
  457. package/dist/src/ui/hooks/useSlashCompletion.test.js.map +1 -1
  458. package/dist/src/ui/hooks/useToolScheduler.d.ts +2 -1
  459. package/dist/src/ui/hooks/useToolScheduler.js +55 -1
  460. package/dist/src/ui/hooks/useToolScheduler.js.map +1 -1
  461. package/dist/src/ui/hooks/useToolScheduler.test.js +107 -9
  462. package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
  463. package/dist/src/ui/key/keyBindings.d.ts +9 -1
  464. package/dist/src/ui/key/keyBindings.js +40 -3
  465. package/dist/src/ui/key/keyBindings.js.map +1 -1
  466. package/dist/src/ui/key/keyMatchers.test.js +12 -2
  467. package/dist/src/ui/key/keyMatchers.test.js.map +1 -1
  468. package/dist/src/ui/layouts/DefaultAppLayout.js +8 -6
  469. package/dist/src/ui/layouts/DefaultAppLayout.js.map +1 -1
  470. package/dist/src/ui/layouts/DefaultAppLayout.test.js +27 -22
  471. package/dist/src/ui/layouts/DefaultAppLayout.test.js.map +1 -1
  472. package/dist/src/ui/noninteractive/nonInteractiveUi.js +1 -1
  473. package/dist/src/ui/themes/builtin/dark/tokyonight-dark.d.ts +7 -0
  474. package/dist/src/ui/themes/builtin/dark/tokyonight-dark.js +147 -0
  475. package/dist/src/ui/themes/builtin/dark/tokyonight-dark.js.map +1 -0
  476. package/dist/src/ui/themes/theme-manager.js +2 -0
  477. package/dist/src/ui/themes/theme-manager.js.map +1 -1
  478. package/dist/src/ui/themes/theme.js +1 -1
  479. package/dist/src/ui/themes/theme.js.map +1 -1
  480. package/dist/src/ui/types.d.ts +10 -2
  481. package/dist/src/ui/types.js.map +1 -1
  482. package/dist/src/ui/utils/CodeColorizer.d.ts +1 -0
  483. package/dist/src/ui/utils/CodeColorizer.js +17 -18
  484. package/dist/src/ui/utils/CodeColorizer.js.map +1 -1
  485. package/dist/src/ui/utils/ConsolePatcher.d.ts +1 -0
  486. package/dist/src/ui/utils/ConsolePatcher.js +12 -5
  487. package/dist/src/ui/utils/ConsolePatcher.js.map +1 -1
  488. package/dist/src/ui/utils/ConsolePatcher.test.d.ts +6 -0
  489. package/dist/src/ui/utils/ConsolePatcher.test.js +199 -0
  490. package/dist/src/ui/utils/ConsolePatcher.test.js.map +1 -0
  491. package/dist/src/ui/utils/TableRenderer.js +3 -3
  492. package/dist/src/ui/utils/TableRenderer.js.map +1 -1
  493. package/dist/src/ui/utils/borderStyles.d.ts +2 -2
  494. package/dist/src/ui/utils/borderStyles.js +2 -2
  495. package/dist/src/ui/utils/borderStyles.js.map +1 -1
  496. package/dist/src/ui/utils/directoryUtils.js +1 -1
  497. package/dist/src/ui/utils/directoryUtils.js.map +1 -1
  498. package/dist/src/ui/utils/fileUtils.d.ts +10 -0
  499. package/dist/src/ui/utils/fileUtils.js +17 -0
  500. package/dist/src/ui/utils/fileUtils.js.map +1 -0
  501. package/dist/src/ui/utils/terminalCapabilityManager.d.ts +1 -0
  502. package/dist/src/ui/utils/terminalCapabilityManager.js +8 -0
  503. package/dist/src/ui/utils/terminalCapabilityManager.js.map +1 -1
  504. package/dist/src/ui/utils/terminalCapabilityManager.test.js +38 -0
  505. package/dist/src/ui/utils/terminalCapabilityManager.test.js.map +1 -1
  506. package/dist/src/ui/utils/toolLayoutUtils.d.ts +1 -1
  507. package/dist/src/ui/utils/toolLayoutUtils.js +1 -1
  508. package/dist/src/ui/utils/ui-sizing.test.js +1 -0
  509. package/dist/src/ui/utils/ui-sizing.test.js.map +1 -1
  510. package/dist/src/ui/utils/updateCheck.d.ts +1 -0
  511. package/dist/src/ui/utils/updateCheck.js.map +1 -1
  512. package/dist/src/utils/activityLogger.js +16 -0
  513. package/dist/src/utils/activityLogger.js.map +1 -1
  514. package/dist/src/utils/cleanup.js +12 -5
  515. package/dist/src/utils/cleanup.js.map +1 -1
  516. package/dist/src/utils/commands.js +15 -0
  517. package/dist/src/utils/commands.js.map +1 -1
  518. package/dist/src/utils/commands.test.js +79 -0
  519. package/dist/src/utils/commands.test.js.map +1 -1
  520. package/dist/src/utils/envVarResolver.d.ts +5 -2
  521. package/dist/src/utils/envVarResolver.js +15 -6
  522. package/dist/src/utils/envVarResolver.js.map +1 -1
  523. package/dist/src/utils/envVarResolver.test.js +41 -24
  524. package/dist/src/utils/envVarResolver.test.js.map +1 -1
  525. package/dist/src/utils/errors.js +4 -4
  526. package/dist/src/utils/errors.js.map +1 -1
  527. package/dist/src/utils/events.d.ts +3 -1
  528. package/dist/src/utils/events.js +1 -0
  529. package/dist/src/utils/events.js.map +1 -1
  530. package/dist/src/utils/gitUtils.js +4 -4
  531. package/dist/src/utils/gitUtils.js.map +1 -1
  532. package/dist/src/utils/handleAutoUpdate.js +10 -3
  533. package/dist/src/utils/handleAutoUpdate.js.map +1 -1
  534. package/dist/src/utils/handleAutoUpdate.test.js +8 -2
  535. package/dist/src/utils/handleAutoUpdate.test.js.map +1 -1
  536. package/dist/src/utils/installationInfo.js +1 -1
  537. package/dist/src/utils/installationInfo.js.map +1 -1
  538. package/dist/src/utils/jsonoutput.js +1 -1
  539. package/dist/src/utils/jsonoutput.js.map +1 -1
  540. package/dist/src/utils/sandboxUtils.js +1 -1
  541. package/dist/src/utils/sandboxUtils.js.map +1 -1
  542. package/dist/src/utils/sessionCleanup.js +7 -30
  543. package/dist/src/utils/sessionCleanup.js.map +1 -1
  544. package/dist/src/utils/sessionCleanup.test.js +3 -0
  545. package/dist/src/utils/sessionCleanup.test.js.map +1 -1
  546. package/dist/src/utils/sessionUtils.js +1 -0
  547. package/dist/src/utils/sessionUtils.js.map +1 -1
  548. package/dist/src/utils/sessionUtils.test.js +179 -3
  549. package/dist/src/utils/sessionUtils.test.js.map +1 -1
  550. package/dist/src/utils/sessions.js +1 -1
  551. package/dist/src/utils/sessions.js.map +1 -1
  552. package/dist/src/utils/skillUtils.js +3 -1
  553. package/dist/src/utils/skillUtils.js.map +1 -1
  554. package/dist/src/utils/skillUtils.test.js +4 -6
  555. package/dist/src/utils/skillUtils.test.js.map +1 -1
  556. package/dist/src/utils/terminalNotifications.js +2 -4
  557. package/dist/src/utils/terminalNotifications.js.map +1 -1
  558. package/dist/src/utils/terminalNotifications.test.js +5 -3
  559. package/dist/src/utils/terminalNotifications.test.js.map +1 -1
  560. package/dist/src/utils/userStartupWarnings.js +2 -2
  561. package/dist/src/utils/userStartupWarnings.js.map +1 -1
  562. package/dist/tsconfig.tsbuildinfo +1 -1
  563. package/package.json +4 -4
  564. package/dist/src/ui/commands/shellsCommand.js.map +0 -1
  565. package/dist/src/ui/commands/shellsCommand.test.js +0 -29
  566. package/dist/src/ui/commands/shellsCommand.test.js.map +0 -1
  567. package/dist/src/ui/components/BackgroundShellDisplay.d.ts +0 -16
  568. package/dist/src/ui/components/BackgroundShellDisplay.js.map +0 -1
  569. package/dist/src/ui/components/BackgroundShellDisplay.test.js.map +0 -1
  570. package/dist/src/ui/hooks/shellCommandProcessor.d.ts +0 -28
  571. package/dist/src/ui/hooks/shellCommandProcessor.js.map +0 -1
  572. package/dist/src/ui/hooks/shellCommandProcessor.test.js.map +0 -1
  573. package/dist/src/ui/hooks/useBackgroundShellManager.d.ts +0 -22
  574. package/dist/src/ui/hooks/useBackgroundShellManager.js +0 -58
  575. package/dist/src/ui/hooks/useBackgroundShellManager.js.map +0 -1
  576. package/dist/src/ui/hooks/useBackgroundShellManager.test.js.map +0 -1
  577. /package/dist/src/{ui/commands/shellsCommand.test.d.ts → nonInteractiveCliAgentSession.test.d.ts} +0 -0
  578. /package/dist/src/ui/{components/BackgroundShellDisplay.test.d.ts → commands/tasksCommand.test.d.ts} +0 -0
  579. /package/dist/src/ui/{hooks/shellCommandProcessor.test.d.ts → components/BackgroundTaskDisplay.test.d.ts} +0 -0
  580. /package/dist/src/ui/hooks/{useBackgroundShellManager.test.d.ts → useBackgroundTaskManager.test.d.ts} +0 -0
@@ -0,0 +1,383 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * @license
4
+ * Copyright 2026 Google LLC
5
+ * SPDX-License-Identifier: Apache-2.0
6
+ */
7
+ import { describe, it, expect } from 'vitest';
8
+ import { renderWithProviders } from '../../../test-utils/render.js';
9
+ import { createMockSettings } from '../../../test-utils/settings.js';
10
+ import { waitFor } from '../../../test-utils/async.js';
11
+ import { DenseToolMessage } from './DenseToolMessage.js';
12
+ import { CoreToolCallStatus, makeFakeConfig, } from '@google/gemini-cli-core';
13
+ describe('DenseToolMessage', () => {
14
+ const defaultProps = {
15
+ callId: 'call-1',
16
+ name: 'test-tool',
17
+ description: 'Test description',
18
+ status: CoreToolCallStatus.Success,
19
+ resultDisplay: 'Success result',
20
+ confirmationDetails: undefined,
21
+ terminalWidth: 80,
22
+ };
23
+ it('renders correctly for a successful string result', async () => {
24
+ const { lastFrame, waitUntilReady } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps }));
25
+ await waitUntilReady();
26
+ const output = lastFrame();
27
+ expect(output).toContain('test-tool');
28
+ expect(output).toContain('Test description');
29
+ expect(output).toContain('→ Success result');
30
+ expect(output).toMatchSnapshot();
31
+ });
32
+ it('truncates long string results', async () => {
33
+ const longResult = 'A'.repeat(200);
34
+ const { lastFrame, waitUntilReady } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, resultDisplay: longResult }));
35
+ await waitUntilReady();
36
+ const output = lastFrame();
37
+ expect(output).toContain('…');
38
+ expect(lastFrame()).toMatchSnapshot();
39
+ });
40
+ it('flattens newlines in string results', async () => {
41
+ const multilineResult = 'Line 1\nLine 2';
42
+ const { lastFrame, waitUntilReady } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, resultDisplay: multilineResult }));
43
+ await waitUntilReady();
44
+ const output = lastFrame();
45
+ expect(output).toContain('→ Line 1 Line 2');
46
+ expect(output).toMatchSnapshot();
47
+ });
48
+ it('renders correctly for file diff results with stats', async () => {
49
+ const diffResult = {
50
+ fileDiff: '@@ -1,1 +1,1 @@\n-old line\n+diff content',
51
+ fileName: 'test.ts',
52
+ filePath: '/path/to/test.ts',
53
+ originalContent: 'old content',
54
+ newContent: 'new content',
55
+ diffStat: {
56
+ user_added_lines: 5,
57
+ user_removed_lines: 2,
58
+ user_added_chars: 50,
59
+ user_removed_chars: 20,
60
+ model_added_lines: 10,
61
+ model_removed_lines: 4,
62
+ model_added_chars: 100,
63
+ model_removed_chars: 40,
64
+ },
65
+ };
66
+ const { lastFrame } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, resultDisplay: diffResult }), {
67
+ settings: createMockSettings({
68
+ merged: { useAlternateBuffer: false, useTerminalBuffer: false },
69
+ }),
70
+ });
71
+ await waitFor(() => expect(lastFrame()).toContain('test-tool'));
72
+ await waitFor(() => expect(lastFrame()).toContain('test.ts → Accepted (+15, -6)'));
73
+ const output = lastFrame();
74
+ expect(output).toMatchSnapshot();
75
+ });
76
+ it('renders correctly for Edit tool using confirmationDetails', async () => {
77
+ const confirmationDetails = {
78
+ type: 'edit',
79
+ title: 'Confirm Edit',
80
+ fileName: 'styles.scss',
81
+ filePath: '/path/to/styles.scss',
82
+ fileDiff: '@@ -1,1 +1,1 @@\n-body { color: blue; }\n+body { color: red; }',
83
+ originalContent: 'body { color: blue; }',
84
+ newContent: 'body { color: red; }',
85
+ };
86
+ const { lastFrame, waitUntilReady } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, name: "Edit", status: CoreToolCallStatus.AwaitingApproval, resultDisplay: undefined, confirmationDetails: confirmationDetails }), {});
87
+ await waitUntilReady();
88
+ const output = lastFrame();
89
+ expect(output).toContain('Edit');
90
+ expect(output).toContain('styles.scss');
91
+ expect(output).toContain('→ Confirming');
92
+ expect(output).toMatchSnapshot();
93
+ });
94
+ it('renders correctly for Rejected Edit tool', async () => {
95
+ const diffResult = {
96
+ fileDiff: '@@ -1,1 +1,1 @@\n-old line\n+new line',
97
+ fileName: 'styles.scss',
98
+ filePath: '/path/to/styles.scss',
99
+ originalContent: 'old line',
100
+ newContent: 'new line',
101
+ diffStat: {
102
+ user_added_lines: 1,
103
+ user_removed_lines: 1,
104
+ user_added_chars: 0,
105
+ user_removed_chars: 0,
106
+ model_added_lines: 0,
107
+ model_removed_lines: 0,
108
+ model_added_chars: 0,
109
+ model_removed_chars: 0,
110
+ },
111
+ };
112
+ const { lastFrame, waitUntilReady } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, name: "Edit", status: CoreToolCallStatus.Cancelled, resultDisplay: diffResult }), {});
113
+ await waitUntilReady();
114
+ const output = lastFrame();
115
+ expect(output).toContain('Edit');
116
+ expect(output).toContain('styles.scss → Rejected (+1, -1)');
117
+ expect(output).toMatchSnapshot();
118
+ });
119
+ it('renders correctly for Rejected Edit tool with confirmationDetails and diffStat', async () => {
120
+ const confirmationDetails = {
121
+ type: 'edit',
122
+ title: 'Confirm Edit',
123
+ fileName: 'styles.scss',
124
+ filePath: '/path/to/styles.scss',
125
+ fileDiff: '@@ -1,1 +1,1 @@\n-body { color: blue; }\n+body { color: red; }',
126
+ originalContent: 'body { color: blue; }',
127
+ newContent: 'body { color: red; }',
128
+ diffStat: {
129
+ user_added_lines: 1,
130
+ user_removed_lines: 1,
131
+ user_added_chars: 0,
132
+ user_removed_chars: 0,
133
+ model_added_lines: 0,
134
+ model_removed_lines: 0,
135
+ model_added_chars: 0,
136
+ model_removed_chars: 0,
137
+ },
138
+ };
139
+ const { lastFrame, waitUntilReady } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, name: "Edit", status: CoreToolCallStatus.Cancelled, resultDisplay: undefined, confirmationDetails: confirmationDetails }), {});
140
+ await waitUntilReady();
141
+ const output = lastFrame();
142
+ expect(output).toContain('Edit');
143
+ expect(output).toContain('styles.scss → Rejected (+1, -1)');
144
+ expect(output).toMatchSnapshot();
145
+ });
146
+ it('renders correctly for WriteFile tool', async () => {
147
+ const diffResult = {
148
+ fileDiff: '@@ -1,1 +1,1 @@\n-old content\n+new content',
149
+ fileName: 'config.json',
150
+ filePath: '/path/to/config.json',
151
+ originalContent: 'old content',
152
+ newContent: 'new content',
153
+ diffStat: {
154
+ user_added_lines: 1,
155
+ user_removed_lines: 1,
156
+ user_added_chars: 0,
157
+ user_removed_chars: 0,
158
+ model_added_lines: 0,
159
+ model_removed_lines: 0,
160
+ model_added_chars: 0,
161
+ model_removed_chars: 0,
162
+ },
163
+ };
164
+ const { lastFrame, waitUntilReady } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, name: "WriteFile", status: CoreToolCallStatus.Success, resultDisplay: diffResult }), {});
165
+ await waitUntilReady();
166
+ const output = lastFrame();
167
+ expect(output).toContain('WriteFile');
168
+ expect(output).toContain('config.json → Accepted (+1, -1)');
169
+ expect(output).toMatchSnapshot();
170
+ });
171
+ it('renders correctly for Rejected WriteFile tool', async () => {
172
+ const diffResult = {
173
+ fileDiff: '@@ -1,1 +1,1 @@\n-old content\n+new content',
174
+ fileName: 'config.json',
175
+ filePath: '/path/to/config.json',
176
+ originalContent: 'old content',
177
+ newContent: 'new content',
178
+ };
179
+ const { lastFrame, waitUntilReady } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, name: "WriteFile", status: CoreToolCallStatus.Cancelled, resultDisplay: diffResult }), {});
180
+ await waitUntilReady();
181
+ const output = lastFrame();
182
+ expect(output).toContain('WriteFile');
183
+ expect(output).toContain('config.json');
184
+ expect(output).toContain('→ Rejected');
185
+ expect(output).toMatchSnapshot();
186
+ });
187
+ it('renders correctly for Errored Edit tool', async () => {
188
+ const diffResult = {
189
+ fileDiff: '@@ -1,1 +1,1 @@\n-old line\n+new line',
190
+ fileName: 'styles.scss',
191
+ filePath: '/path/to/styles.scss',
192
+ originalContent: 'old line',
193
+ newContent: 'new line',
194
+ diffStat: {
195
+ user_added_lines: 1,
196
+ user_removed_lines: 1,
197
+ user_added_chars: 0,
198
+ user_removed_chars: 0,
199
+ model_added_lines: 0,
200
+ model_removed_lines: 0,
201
+ model_added_chars: 0,
202
+ model_removed_chars: 0,
203
+ },
204
+ };
205
+ const { lastFrame, waitUntilReady } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, name: "Edit", status: CoreToolCallStatus.Error, resultDisplay: diffResult }));
206
+ await waitUntilReady();
207
+ const output = lastFrame();
208
+ expect(output).toContain('Edit');
209
+ expect(output).toContain('styles.scss → Failed (+1, -1)');
210
+ expect(output).toMatchSnapshot();
211
+ });
212
+ it('renders correctly for grep results', async () => {
213
+ const grepResult = {
214
+ summary: 'Found 2 matches',
215
+ matches: [
216
+ {
217
+ filePath: 'file1.ts',
218
+ absolutePath: '/file1.ts',
219
+ lineNumber: 10,
220
+ line: 'match 1',
221
+ },
222
+ {
223
+ filePath: 'file2.ts',
224
+ absolutePath: '/file2.ts',
225
+ lineNumber: 20,
226
+ line: 'match 2',
227
+ },
228
+ ],
229
+ };
230
+ const { lastFrame, waitUntilReady } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, resultDisplay: grepResult }));
231
+ await waitUntilReady();
232
+ const output = lastFrame();
233
+ expect(output).toContain('→ Found 2 matches');
234
+ // Matches are rendered in a secondary list for high-signal summaries
235
+ expect(output).toContain('file1.ts:10: match 1');
236
+ expect(output).toContain('file2.ts:20: match 2');
237
+ expect(output).toMatchSnapshot();
238
+ });
239
+ it('renders correctly for ls results', async () => {
240
+ const lsResult = {
241
+ summary: 'Listed 2 files. (1 ignored)',
242
+ files: ['file1.ts', 'dir1'],
243
+ };
244
+ const { lastFrame, waitUntilReady } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, resultDisplay: lsResult }));
245
+ await waitUntilReady();
246
+ const output = lastFrame();
247
+ expect(output).toContain('→ Listed 2 files. (1 ignored)');
248
+ // Directory listings should not have a payload in dense mode
249
+ expect(output).not.toContain('file1.ts');
250
+ expect(output).not.toContain('dir1');
251
+ expect(output).toMatchSnapshot();
252
+ });
253
+ it('renders correctly for ReadManyFiles results', async () => {
254
+ const rmfResult = {
255
+ summary: 'Read 3 file(s)',
256
+ files: ['file1.ts', 'file2.ts', 'file3.ts'],
257
+ include: ['**/*.ts'],
258
+ skipped: [{ path: 'skipped.bin', reason: 'binary' }],
259
+ };
260
+ const { lastFrame, waitUntilReady } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, resultDisplay: rmfResult }));
261
+ await waitUntilReady();
262
+ const output = lastFrame();
263
+ expect(output).toContain('Attempting to read files from **/*.ts');
264
+ expect(output).toContain('→ Read 3 file(s) (1 ignored)');
265
+ expect(output).toContain('file1.ts');
266
+ expect(output).toContain('file2.ts');
267
+ expect(output).toContain('file3.ts');
268
+ expect(output).toMatchSnapshot();
269
+ });
270
+ it('renders correctly for todo updates', async () => {
271
+ const todoResult = {
272
+ todos: [],
273
+ };
274
+ const { lastFrame, waitUntilReady } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, resultDisplay: todoResult }));
275
+ await waitUntilReady();
276
+ const output = lastFrame();
277
+ expect(output).toContain('→ Todos updated');
278
+ expect(output).toMatchSnapshot();
279
+ });
280
+ it('renders generic output message for unknown object results', async () => {
281
+ const genericResult = {
282
+ some: 'data',
283
+ };
284
+ const { lastFrame, waitUntilReady } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, resultDisplay: genericResult }));
285
+ await waitUntilReady();
286
+ const output = lastFrame();
287
+ expect(output).toContain('→ Returned (possible empty result)');
288
+ expect(output).toMatchSnapshot();
289
+ });
290
+ it('renders correctly for error status with string message', async () => {
291
+ const { lastFrame, waitUntilReady } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, status: CoreToolCallStatus.Error, resultDisplay: 'Error occurred' }));
292
+ await waitUntilReady();
293
+ const output = lastFrame();
294
+ expect(output).toContain('→ Error occurred');
295
+ expect(output).toMatchSnapshot();
296
+ });
297
+ it('renders generic failure message for error status without string message', async () => {
298
+ const { lastFrame, waitUntilReady } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, status: CoreToolCallStatus.Error, resultDisplay: undefined }));
299
+ await waitUntilReady();
300
+ const output = lastFrame();
301
+ expect(output).toContain('→ Failed');
302
+ expect(output).toMatchSnapshot();
303
+ });
304
+ it('does not render result arrow if resultDisplay is missing', async () => {
305
+ const { lastFrame, waitUntilReady } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, status: CoreToolCallStatus.Scheduled, resultDisplay: undefined }));
306
+ await waitUntilReady();
307
+ const output = lastFrame();
308
+ expect(output).not.toContain('→');
309
+ expect(output).toMatchSnapshot();
310
+ });
311
+ describe('Toggleable Diff View (Alternate Buffer)', () => {
312
+ const diffResult = {
313
+ fileDiff: '@@ -1,1 +1,1 @@\n-old line\n+new line',
314
+ fileName: 'test.ts',
315
+ filePath: '/path/to/test.ts',
316
+ originalContent: 'old content',
317
+ newContent: 'new content',
318
+ };
319
+ it('hides diff content by default when in alternate buffer mode', async () => {
320
+ const { lastFrame, waitUntilReady } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, resultDisplay: diffResult, status: CoreToolCallStatus.Success }), {
321
+ config: makeFakeConfig({ useAlternateBuffer: true }),
322
+ settings: createMockSettings({ ui: { useAlternateBuffer: true } }),
323
+ });
324
+ await waitUntilReady();
325
+ const output = lastFrame();
326
+ expect(output).toContain('Accepted');
327
+ expect(output).not.toContain('new line');
328
+ expect(output).toMatchSnapshot();
329
+ });
330
+ it('shows diff content by default when NOT in alternate buffer mode', async () => {
331
+ const { lastFrame, waitUntilReady } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, resultDisplay: diffResult, status: CoreToolCallStatus.Success }), {
332
+ config: makeFakeConfig({ useAlternateBuffer: false }),
333
+ settings: createMockSettings({ ui: { useAlternateBuffer: false } }),
334
+ });
335
+ await waitUntilReady();
336
+ const output = lastFrame();
337
+ expect(output).toContain('Accepted');
338
+ expect(output).toMatchSnapshot();
339
+ });
340
+ it('shows diff content when expanded via ToolActionsContext', async () => {
341
+ const { lastFrame, waitUntilReady } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, resultDisplay: diffResult, status: CoreToolCallStatus.Success }), {
342
+ config: makeFakeConfig({ useAlternateBuffer: true }),
343
+ settings: createMockSettings({ ui: { useAlternateBuffer: true } }),
344
+ toolActions: {
345
+ isExpanded: () => true,
346
+ },
347
+ });
348
+ await waitUntilReady();
349
+ // Verify it shows the diff when expanded
350
+ expect(lastFrame()).toContain('new line');
351
+ });
352
+ });
353
+ describe('Visual Regression', () => {
354
+ it('matches SVG snapshot for an Accepted file edit with diff stats', async () => {
355
+ const diffResult = {
356
+ fileName: 'test.ts',
357
+ filePath: '/mock/test.ts',
358
+ fileDiff: '--- a/test.ts\n+++ b/test.ts\n@@ -1 +1 @@\n-old\n+new',
359
+ originalContent: 'old',
360
+ newContent: 'new',
361
+ diffStat: {
362
+ model_added_lines: 1,
363
+ model_removed_lines: 1,
364
+ model_added_chars: 3,
365
+ model_removed_chars: 3,
366
+ user_added_lines: 0,
367
+ user_removed_lines: 0,
368
+ user_added_chars: 0,
369
+ user_removed_chars: 0,
370
+ },
371
+ };
372
+ const renderResult = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, name: "edit", description: "Editing test.ts", resultDisplay: diffResult, status: CoreToolCallStatus.Success }));
373
+ await renderResult.waitUntilReady();
374
+ await expect(renderResult).toMatchSvgSnapshot();
375
+ });
376
+ it('matches SVG snapshot for a Rejected tool call', async () => {
377
+ const renderResult = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, name: "read_file", description: "Reading important.txt", resultDisplay: "Rejected by user", status: CoreToolCallStatus.Cancelled }));
378
+ await renderResult.waitUntilReady();
379
+ await expect(renderResult).toMatchSvgSnapshot();
380
+ });
381
+ });
382
+ });
383
+ //# sourceMappingURL=DenseToolMessage.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DenseToolMessage.test.js","sourceRoot":"","sources":["../../../../../src/ui/components/messages/DenseToolMessage.test.tsx"],"names":[],"mappings":"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"}
@@ -5,6 +5,13 @@
5
5
  */
6
6
  import type React from 'react';
7
7
  import type { Theme } from '../../themes/theme.js';
8
+ export interface DiffLine {
9
+ type: 'add' | 'del' | 'context' | 'hunk' | 'other';
10
+ oldLine?: number;
11
+ newLine?: number;
12
+ content: string;
13
+ }
14
+ export declare function parseDiffWithLineNumbers(diffContent: string): DiffLine[];
8
15
  interface DiffRendererProps {
9
16
  diffContent: string;
10
17
  filename?: string;
@@ -12,6 +19,17 @@ interface DiffRendererProps {
12
19
  availableTerminalHeight?: number;
13
20
  terminalWidth: number;
14
21
  theme?: Theme;
22
+ disableColor?: boolean;
23
+ paddingX?: number;
15
24
  }
16
25
  export declare const DiffRenderer: React.FC<DiffRendererProps>;
26
+ export declare const isNewFile: (parsedLines: DiffLine[]) => boolean;
27
+ export interface RenderDiffLinesOptions {
28
+ parsedLines: DiffLine[];
29
+ filename?: string;
30
+ tabWidth?: number;
31
+ terminalWidth: number;
32
+ disableColor?: boolean;
33
+ }
34
+ export declare const renderDiffLines: ({ parsedLines, filename, tabWidth, terminalWidth, disableColor, }: RenderDiffLinesOptions) => React.ReactNode[];
17
35
  export {};
@@ -1,12 +1,12 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { useMemo } from 'react';
3
3
  import { Box, Text, useIsScreenReaderEnabled } from 'ink';
4
- import crypto from 'node:crypto';
5
4
  import { colorizeCode, colorizeLine } from '../../utils/CodeColorizer.js';
6
5
  import { MaxSizedBox } from '../shared/MaxSizedBox.js';
7
6
  import { theme as semanticTheme } from '../../semantic-colors.js';
8
7
  import { useSettings } from '../../contexts/SettingsContext.js';
9
- function parseDiffWithLineNumbers(diffContent) {
8
+ import { getFileExtension } from '../../utils/fileUtils.js';
9
+ export function parseDiffWithLineNumbers(diffContent) {
10
10
  const lines = diffContent.split(/\r?\n/);
11
11
  const result = [];
12
12
  let currentOldLine = 0;
@@ -16,6 +16,7 @@ function parseDiffWithLineNumbers(diffContent) {
16
16
  for (const line of lines) {
17
17
  const hunkMatch = line.match(hunkHeaderRegex);
18
18
  if (hunkMatch) {
19
+ currentOldLine = parseInt(hunkMatch[1], 10);
19
20
  currentOldLine = parseInt(hunkMatch[1], 10);
20
21
  currentNewLine = parseInt(hunkMatch[2], 10);
21
22
  inHunk = true;
@@ -68,7 +69,7 @@ function parseDiffWithLineNumbers(diffContent) {
68
69
  return result;
69
70
  }
70
71
  const DEFAULT_TAB_WIDTH = 4; // Spaces per tab for normalization
71
- export const DiffRenderer = ({ diffContent, filename, tabWidth = DEFAULT_TAB_WIDTH, availableTerminalHeight, terminalWidth, theme, }) => {
72
+ export const DiffRenderer = ({ diffContent, filename, tabWidth = DEFAULT_TAB_WIDTH, availableTerminalHeight, terminalWidth, theme, disableColor = false, paddingX = 0, }) => {
72
73
  const settings = useSettings();
73
74
  const screenReaderEnabled = useIsScreenReaderEnabled();
74
75
  const parsedLines = useMemo(() => {
@@ -77,33 +78,25 @@ export const DiffRenderer = ({ diffContent, filename, tabWidth = DEFAULT_TAB_WID
77
78
  }
78
79
  return parseDiffWithLineNumbers(diffContent);
79
80
  }, [diffContent]);
80
- const isNewFile = useMemo(() => {
81
- if (parsedLines.length === 0)
82
- return false;
83
- return parsedLines.every((line) => line.type === 'add' ||
84
- line.type === 'hunk' ||
85
- line.type === 'other' ||
86
- line.content.startsWith('diff --git') ||
87
- line.content.startsWith('new file mode'));
88
- }, [parsedLines]);
81
+ const isNewFileResult = useMemo(() => isNewFile(parsedLines), [parsedLines]);
89
82
  const renderedOutput = useMemo(() => {
90
83
  if (!diffContent || typeof diffContent !== 'string') {
91
84
  return _jsx(Text, { color: semanticTheme.status.warning, children: "No diff content." });
92
85
  }
93
86
  if (parsedLines.length === 0) {
94
- return (_jsx(Box, { borderStyle: "round", borderColor: semanticTheme.border.default, padding: 1, children: _jsx(Text, { dimColor: true, children: "No changes detected." }) }));
87
+ return (_jsx(Box, { padding: 1, children: _jsx(Text, { dimColor: true, children: "No changes detected." }) }));
95
88
  }
96
89
  if (screenReaderEnabled) {
97
90
  return (_jsx(Box, { flexDirection: "column", children: parsedLines.map((line, index) => (_jsxs(Text, { children: [line.type, ": ", line.content] }, index))) }));
98
91
  }
99
- if (isNewFile) {
92
+ if (isNewFileResult) {
100
93
  // Extract only the added lines' content
101
94
  const addedContent = parsedLines
102
95
  .filter((line) => line.type === 'add')
103
96
  .map((line) => line.content)
104
97
  .join('\n');
105
98
  // Attempt to infer language from filename, default to plain text if no filename
106
- const fileExtension = filename?.split('.').pop() || null;
99
+ const fileExtension = getFileExtension(filename);
107
100
  const language = fileExtension
108
101
  ? getLanguageFromExtension(fileExtension)
109
102
  : null;
@@ -114,26 +107,46 @@ export const DiffRenderer = ({ diffContent, filename, tabWidth = DEFAULT_TAB_WID
114
107
  maxWidth: terminalWidth,
115
108
  theme,
116
109
  settings,
110
+ disableColor,
111
+ paddingX,
117
112
  });
118
113
  }
119
114
  else {
120
- return renderDiffContent(parsedLines, filename, tabWidth, availableTerminalHeight, terminalWidth);
115
+ const key = filename ? `diff-box-${filename}` : undefined;
116
+ return (_jsx(MaxSizedBox, { paddingX: paddingX, maxHeight: availableTerminalHeight, maxWidth: terminalWidth, children: renderDiffLines({
117
+ parsedLines,
118
+ filename,
119
+ tabWidth,
120
+ terminalWidth,
121
+ disableColor,
122
+ }) }, key));
121
123
  }
122
124
  }, [
123
125
  diffContent,
124
126
  parsedLines,
125
127
  screenReaderEnabled,
126
- isNewFile,
128
+ isNewFileResult,
127
129
  filename,
128
130
  availableTerminalHeight,
129
131
  terminalWidth,
130
132
  theme,
131
133
  settings,
132
134
  tabWidth,
135
+ disableColor,
136
+ paddingX,
133
137
  ]);
134
138
  return renderedOutput;
135
139
  };
136
- const renderDiffContent = (parsedLines, filename, tabWidth = DEFAULT_TAB_WIDTH, availableTerminalHeight, terminalWidth) => {
140
+ export const isNewFile = (parsedLines) => {
141
+ if (parsedLines.length === 0)
142
+ return false;
143
+ return parsedLines.every((line) => line.type === 'add' ||
144
+ line.type === 'hunk' ||
145
+ line.type === 'other' ||
146
+ line.content.startsWith('diff --git') ||
147
+ line.content.startsWith('new file mode'));
148
+ };
149
+ export const renderDiffLines = ({ parsedLines, filename, tabWidth = DEFAULT_TAB_WIDTH, terminalWidth, disableColor = false, }) => {
137
150
  // 1. Normalize whitespace (replace tabs with spaces) *before* further processing
138
151
  const normalizedLines = parsedLines.map((line) => ({
139
152
  ...line,
@@ -142,11 +155,13 @@ const renderDiffContent = (parsedLines, filename, tabWidth = DEFAULT_TAB_WIDTH,
142
155
  // Filter out non-displayable lines (hunks, potentially 'other') using the normalized list
143
156
  const displayableLines = normalizedLines.filter((l) => l.type !== 'hunk' && l.type !== 'other');
144
157
  if (displayableLines.length === 0) {
145
- return (_jsx(Box, { borderStyle: "round", borderColor: semanticTheme.border.default, padding: 1, children: _jsx(Text, { dimColor: true, children: "No changes detected." }) }));
158
+ return [
159
+ _jsx(Box, { padding: 1, children: _jsx(Text, { dimColor: true, children: "No changes detected." }) }, "no-changes"),
160
+ ];
146
161
  }
147
162
  const maxLineNumber = Math.max(0, ...displayableLines.map((l) => l.oldLine ?? 0), ...displayableLines.map((l) => l.newLine ?? 0));
148
163
  const gutterWidth = Math.max(1, maxLineNumber.toString().length);
149
- const fileExtension = filename?.split('.').pop() || null;
164
+ const fileExtension = getFileExtension(filename);
150
165
  const language = fileExtension
151
166
  ? getLanguageFromExtension(fileExtension)
152
167
  : null;
@@ -164,9 +179,6 @@ const renderDiffContent = (parsedLines, filename, tabWidth = DEFAULT_TAB_WIDTH,
164
179
  if (!isFinite(baseIndentation)) {
165
180
  baseIndentation = 0;
166
181
  }
167
- const key = filename
168
- ? `diff-box-${filename}`
169
- : `diff-box-${crypto.createHash('sha1').update(JSON.stringify(parsedLines)).digest('hex')}`;
170
182
  let lastLineNumber = null;
171
183
  const MAX_CONTEXT_LINES_WITHOUT_GAP = 5;
172
184
  const content = displayableLines.reduce((acc, line, index) => {
@@ -213,19 +225,27 @@ const renderDiffContent = (parsedLines, filename, tabWidth = DEFAULT_TAB_WIDTH,
213
225
  return acc;
214
226
  }
215
227
  const displayContent = line.content.substring(baseIndentation);
216
- const backgroundColor = line.type === 'add'
217
- ? semanticTheme.background.diff.added
218
- : line.type === 'del'
219
- ? semanticTheme.background.diff.removed
220
- : undefined;
221
- acc.push(_jsxs(Box, { flexDirection: "row", children: [_jsx(Box, { width: gutterWidth + 1, paddingRight: 1, flexShrink: 0, backgroundColor: backgroundColor, justifyContent: "flex-end", children: _jsx(Text, { color: semanticTheme.text.secondary, children: gutterNumStr }) }), line.type === 'context' ? (_jsxs(_Fragment, { children: [_jsxs(Text, { children: [prefixSymbol, " "] }), _jsx(Text, { wrap: "wrap", children: colorizeLine(displayContent, language) })] })) : (_jsxs(Text, { backgroundColor: line.type === 'add'
222
- ? semanticTheme.background.diff.added
223
- : semanticTheme.background.diff.removed, wrap: "wrap", children: [_jsx(Text, { color: line.type === 'add'
224
- ? semanticTheme.status.success
225
- : semanticTheme.status.error, children: prefixSymbol }), ' ', colorizeLine(displayContent, language)] }))] }, lineKey));
228
+ const backgroundColor = disableColor
229
+ ? undefined
230
+ : line.type === 'add'
231
+ ? semanticTheme.background.diff.added
232
+ : line.type === 'del'
233
+ ? semanticTheme.background.diff.removed
234
+ : undefined;
235
+ const gutterColor = disableColor
236
+ ? undefined
237
+ : semanticTheme.text.secondary;
238
+ const symbolColor = disableColor
239
+ ? undefined
240
+ : line.type === 'add'
241
+ ? semanticTheme.status.success
242
+ : line.type === 'del'
243
+ ? semanticTheme.status.error
244
+ : undefined;
245
+ acc.push(_jsxs(Box, { flexDirection: "row", children: [_jsx(Box, { width: gutterWidth + 1, paddingRight: 1, flexShrink: 0, backgroundColor: backgroundColor, justifyContent: "flex-end", children: _jsx(Text, { color: gutterColor, children: gutterNumStr }) }), line.type === 'context' ? (_jsxs(_Fragment, { children: [_jsxs(Text, { children: [prefixSymbol, " "] }), _jsx(Text, { wrap: "wrap", children: colorizeLine(displayContent, language, undefined, disableColor) })] })) : (_jsxs(Text, { backgroundColor: backgroundColor, wrap: "wrap", children: [_jsx(Text, { color: symbolColor, children: prefixSymbol }), ' ', colorizeLine(displayContent, language, undefined, disableColor)] }))] }, lineKey));
226
246
  return acc;
227
247
  }, []);
228
- return (_jsx(MaxSizedBox, { maxHeight: availableTerminalHeight, maxWidth: terminalWidth, children: content }, key));
248
+ return content;
229
249
  };
230
250
  const getLanguageFromExtension = (extension) => {
231
251
  const languageMap = {