@machina.ai/cell-cli 1.64.0-rc2 → 1.66.0-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 (194) hide show
  1. package/dist/index.js +14 -9
  2. package/dist/index.js.map +1 -1
  3. package/dist/package.json +4 -4
  4. package/dist/src/acp/acpSession.js +9 -13
  5. package/dist/src/acp/acpSession.js.map +1 -1
  6. package/dist/src/acp/acpSession.test.js +88 -0
  7. package/dist/src/acp/acpSession.test.js.map +1 -1
  8. package/dist/src/commands/mcp/add.js +14 -6
  9. package/dist/src/commands/mcp/add.js.map +1 -1
  10. package/dist/src/commands/mcp/add.test.js +61 -0
  11. package/dist/src/commands/mcp/add.test.js.map +1 -1
  12. package/dist/src/commands/mcp/remove.js +14 -1
  13. package/dist/src/commands/mcp/remove.js.map +1 -1
  14. package/dist/src/commands/mcp/remove.test.js +63 -0
  15. package/dist/src/commands/mcp/remove.test.js.map +1 -1
  16. package/dist/src/config/config.js +12 -0
  17. package/dist/src/config/config.js.map +1 -1
  18. package/dist/src/config/config.test.js +17 -0
  19. package/dist/src/config/config.test.js.map +1 -1
  20. package/dist/src/config/envDefaults.d.ts +20 -0
  21. package/dist/src/config/envDefaults.js +29 -0
  22. package/dist/src/config/envDefaults.js.map +1 -0
  23. package/dist/src/config/envDefaults.test.d.ts +6 -0
  24. package/dist/src/config/envDefaults.test.js +23 -0
  25. package/dist/src/config/envDefaults.test.js.map +1 -0
  26. package/dist/src/config/extension-manager.js +13 -4
  27. package/dist/src/config/extension-manager.js.map +1 -1
  28. package/dist/src/config/extension.test.js +117 -0
  29. package/dist/src/config/extension.test.js.map +1 -1
  30. package/dist/src/config/extensions/github.test.js +34 -0
  31. package/dist/src/config/extensions/github.test.js.map +1 -1
  32. package/dist/src/config/extensions/github_fetch.js +110 -18
  33. package/dist/src/config/extensions/github_fetch.js.map +1 -1
  34. package/dist/src/config/extensions/github_fetch.test.js +251 -36
  35. package/dist/src/config/extensions/github_fetch.test.js.map +1 -1
  36. package/dist/src/config/settings.d.ts +1 -0
  37. package/dist/src/config/settings.js +148 -58
  38. package/dist/src/config/settings.js.map +1 -1
  39. package/dist/src/config/settings.test.js +300 -0
  40. package/dist/src/config/settings.test.js.map +1 -1
  41. package/dist/src/config/settingsSchema.d.ts +1 -1
  42. package/dist/src/config/settingsSchema.js +6 -1
  43. package/dist/src/config/settingsSchema.js.map +1 -1
  44. package/dist/src/gemini.test.js +69 -0
  45. package/dist/src/gemini.test.js.map +1 -1
  46. package/dist/src/generated/git-commit.d.ts +2 -2
  47. package/dist/src/generated/git-commit.js +2 -2
  48. package/dist/src/interactiveCli.js +8 -3
  49. package/dist/src/interactiveCli.js.map +1 -1
  50. package/dist/src/services/CommandService.js +1 -1
  51. package/dist/src/services/CommandService.js.map +1 -1
  52. package/dist/src/services/CommandService.test.js +18 -1
  53. package/dist/src/services/CommandService.test.js.map +1 -1
  54. package/dist/src/services/SlashCommandConflictHandler.d.ts +1 -0
  55. package/dist/src/services/SlashCommandConflictHandler.js +18 -2
  56. package/dist/src/services/SlashCommandConflictHandler.js.map +1 -1
  57. package/dist/src/services/SlashCommandConflictHandler.test.js +85 -8
  58. package/dist/src/services/SlashCommandConflictHandler.test.js.map +1 -1
  59. package/dist/src/ui/AppContainer.js +254 -12
  60. package/dist/src/ui/AppContainer.js.map +1 -1
  61. package/dist/src/ui/AppContainer.test.js +362 -6
  62. package/dist/src/ui/AppContainer.test.js.map +1 -1
  63. package/dist/src/ui/auth/AuthDialog.js +21 -5
  64. package/dist/src/ui/auth/AuthDialog.js.map +1 -1
  65. package/dist/src/ui/auth/AuthDialog.test.js +83 -0
  66. package/dist/src/ui/auth/AuthDialog.test.js.map +1 -1
  67. package/dist/src/ui/auth/useAuth.js +7 -1
  68. package/dist/src/ui/auth/useAuth.js.map +1 -1
  69. package/dist/src/ui/auth/useAuth.test.js +9 -0
  70. package/dist/src/ui/auth/useAuth.test.js.map +1 -1
  71. package/dist/src/ui/commands/marketplaceCommand.js +92 -4
  72. package/dist/src/ui/commands/marketplaceCommand.js.map +1 -1
  73. package/dist/src/ui/commands/marketplaceCommand.test.js +98 -1
  74. package/dist/src/ui/commands/marketplaceCommand.test.js.map +1 -1
  75. package/dist/src/ui/components/AsciiArt.d.ts +6 -6
  76. package/dist/src/ui/components/AsciiArt.js +6 -6
  77. package/dist/src/ui/components/CliSpinner.d.ts +3 -2
  78. package/dist/src/ui/components/CliSpinner.js +27 -3
  79. package/dist/src/ui/components/CliSpinner.js.map +1 -1
  80. package/dist/src/ui/components/CliSpinner.test.js +42 -3
  81. package/dist/src/ui/components/CliSpinner.test.js.map +1 -1
  82. package/dist/src/ui/components/Composer.js +3 -3
  83. package/dist/src/ui/components/Composer.js.map +1 -1
  84. package/dist/src/ui/components/Composer.test.js +39 -1
  85. package/dist/src/ui/components/Composer.test.js.map +1 -1
  86. package/dist/src/ui/components/DetailedMessagesDisplay.js +5 -1
  87. package/dist/src/ui/components/DetailedMessagesDisplay.js.map +1 -1
  88. package/dist/src/ui/components/DetailedMessagesDisplay.test.js +19 -1
  89. package/dist/src/ui/components/DetailedMessagesDisplay.test.js.map +1 -1
  90. package/dist/src/ui/components/Footer.js +1 -1
  91. package/dist/src/ui/components/Footer.js.map +1 -1
  92. package/dist/src/ui/components/GeminiRespondingSpinner.d.ts +1 -1
  93. package/dist/src/ui/components/GeminiRespondingSpinner.js +9 -2
  94. package/dist/src/ui/components/GeminiRespondingSpinner.js.map +1 -1
  95. package/dist/src/ui/components/GeminiSpinner.d.ts +1 -1
  96. package/dist/src/ui/components/GeminiSpinner.js +18 -7
  97. package/dist/src/ui/components/GeminiSpinner.js.map +1 -1
  98. package/dist/src/ui/components/HistoryItemDisplay.js +5 -2
  99. package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
  100. package/dist/src/ui/components/HistoryItemDisplay.test.js +21 -0
  101. package/dist/src/ui/components/HistoryItemDisplay.test.js.map +1 -1
  102. package/dist/src/ui/components/LoadingIndicator.d.ts +1 -1
  103. package/dist/src/ui/components/LoadingIndicator.js +4 -2
  104. package/dist/src/ui/components/LoadingIndicator.js.map +1 -1
  105. package/dist/src/ui/components/MainContent.js +47 -9
  106. package/dist/src/ui/components/MainContent.js.map +1 -1
  107. package/dist/src/ui/components/MainContent.test.js +87 -1
  108. package/dist/src/ui/components/MainContent.test.js.map +1 -1
  109. package/dist/src/ui/components/MemoryUsageDisplay.js +8 -4
  110. package/dist/src/ui/components/MemoryUsageDisplay.js.map +1 -1
  111. package/dist/src/ui/components/ModelDialog.js +30 -16
  112. package/dist/src/ui/components/ModelDialog.js.map +1 -1
  113. package/dist/src/ui/components/ModelDialog.test.js +32 -24
  114. package/dist/src/ui/components/ModelDialog.test.js.map +1 -1
  115. package/dist/src/ui/components/StatusRow.d.ts +7 -6
  116. package/dist/src/ui/components/StatusRow.js +24 -10
  117. package/dist/src/ui/components/StatusRow.js.map +1 -1
  118. package/dist/src/ui/components/ValidationDialog.js +13 -6
  119. package/dist/src/ui/components/ValidationDialog.js.map +1 -1
  120. package/dist/src/ui/components/ValidationDialog.test.js +40 -0
  121. package/dist/src/ui/components/ValidationDialog.test.js.map +1 -1
  122. package/dist/src/ui/components/messages/DenseToolMessage.js +17 -12
  123. package/dist/src/ui/components/messages/DenseToolMessage.js.map +1 -1
  124. package/dist/src/ui/components/messages/DenseToolMessage.test.js +71 -0
  125. package/dist/src/ui/components/messages/DenseToolMessage.test.js.map +1 -1
  126. package/dist/src/ui/components/messages/ToolResultDisplay.js +14 -11
  127. package/dist/src/ui/components/messages/ToolResultDisplay.js.map +1 -1
  128. package/dist/src/ui/components/messages/ToolResultDisplay.test.js +32 -0
  129. package/dist/src/ui/components/messages/ToolResultDisplay.test.js.map +1 -1
  130. package/dist/src/ui/components/shared/MaxSizedBox.js +8 -2
  131. package/dist/src/ui/components/shared/MaxSizedBox.js.map +1 -1
  132. package/dist/src/ui/components/shared/MaxSizedBox.test.js +23 -1
  133. package/dist/src/ui/components/shared/MaxSizedBox.test.js.map +1 -1
  134. package/dist/src/ui/contexts/ToolActionsContext.js +7 -1
  135. package/dist/src/ui/contexts/ToolActionsContext.js.map +1 -1
  136. package/dist/src/ui/contexts/ToolActionsContext.test.js +54 -1
  137. package/dist/src/ui/contexts/ToolActionsContext.test.js.map +1 -1
  138. package/dist/src/ui/hooks/atCommandProcessor.d.ts +2 -1
  139. package/dist/src/ui/hooks/atCommandProcessor.js +15 -15
  140. package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
  141. package/dist/src/ui/hooks/useAgentStream.d.ts +9 -2
  142. package/dist/src/ui/hooks/useAgentStream.js +173 -8
  143. package/dist/src/ui/hooks/useAgentStream.js.map +1 -1
  144. package/dist/src/ui/hooks/useAgentStream.test.js +104 -1
  145. package/dist/src/ui/hooks/useAgentStream.test.js.map +1 -1
  146. package/dist/src/ui/hooks/useGeminiStream.d.ts +1 -1
  147. package/dist/src/ui/hooks/useGeminiStream.js +174 -59
  148. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  149. package/dist/src/ui/hooks/useGeminiStream.test.js +230 -3
  150. package/dist/src/ui/hooks/useGeminiStream.test.js.map +1 -1
  151. package/dist/src/ui/hooks/useLoadingIndicator.d.ts +2 -1
  152. package/dist/src/ui/hooks/useLoadingIndicator.js +3 -3
  153. package/dist/src/ui/hooks/useLoadingIndicator.js.map +1 -1
  154. package/dist/src/ui/hooks/useLoadingIndicator.test.js +23 -4
  155. package/dist/src/ui/hooks/useLoadingIndicator.test.js.map +1 -1
  156. package/dist/src/ui/hooks/useReverseSearchCompletion.js +10 -6
  157. package/dist/src/ui/hooks/useReverseSearchCompletion.js.map +1 -1
  158. package/dist/src/ui/hooks/useReverseSearchCompletion.test.js +49 -0
  159. package/dist/src/ui/hooks/useReverseSearchCompletion.test.js.map +1 -1
  160. package/dist/src/ui/key/keyBindings.js +19 -6
  161. package/dist/src/ui/key/keyBindings.js.map +1 -1
  162. package/dist/src/ui/key/keyBindings.test.js +106 -0
  163. package/dist/src/ui/key/keyBindings.test.js.map +1 -1
  164. package/dist/src/ui/utils/formatters.d.ts +2 -0
  165. package/dist/src/ui/utils/formatters.js +13 -5
  166. package/dist/src/ui/utils/formatters.js.map +1 -1
  167. package/dist/src/ui/utils/formatters.test.js +18 -0
  168. package/dist/src/ui/utils/formatters.test.js.map +1 -1
  169. package/dist/src/utils/activityLogger.js +109 -33
  170. package/dist/src/utils/activityLogger.js.map +1 -1
  171. package/dist/src/utils/activityLogger.test.js +441 -0
  172. package/dist/src/utils/activityLogger.test.js.map +1 -1
  173. package/dist/src/utils/handleAutoUpdate.d.ts +4 -1
  174. package/dist/src/utils/handleAutoUpdate.js +45 -3
  175. package/dist/src/utils/handleAutoUpdate.js.map +1 -1
  176. package/dist/src/utils/handleAutoUpdate.test.js +280 -2
  177. package/dist/src/utils/handleAutoUpdate.test.js.map +1 -1
  178. package/dist/src/utils/nodeVersion.d.ts +11 -0
  179. package/dist/src/utils/nodeVersion.js +42 -0
  180. package/dist/src/utils/nodeVersion.js.map +1 -0
  181. package/dist/src/utils/nodeVersion.test.d.ts +6 -0
  182. package/dist/src/utils/nodeVersion.test.js +35 -0
  183. package/dist/src/utils/nodeVersion.test.js.map +1 -0
  184. package/dist/src/utils/processUtils.d.ts +23 -0
  185. package/dist/src/utils/processUtils.js +72 -0
  186. package/dist/src/utils/processUtils.js.map +1 -1
  187. package/dist/src/utils/processUtils.test.js +95 -1
  188. package/dist/src/utils/processUtils.test.js.map +1 -1
  189. package/dist/src/utils/relaunch.js +8 -6
  190. package/dist/src/utils/relaunch.js.map +1 -1
  191. package/dist/src/utils/relaunch.test.js +107 -1
  192. package/dist/src/utils/relaunch.test.js.map +1 -1
  193. package/dist/tsconfig.tsbuildinfo +1 -1
  194. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"SlashCommandConflictHandler.test.js","sourceRoot":"","sources":["../../../src/services/SlashCommandConflictHandler.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EACL,UAAU,EACV,SAAS,GAGV,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,EAAE,CAAC,IAAI,CAAC,yBAAyB,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE;IAC1D,MAAM,MAAM,GACV,MAAM,cAAc,EAA4C,CAAC;IACnE,OAAO;QACL,GAAG,MAAM;QACT,UAAU,EAAE;YACV,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE;YACX,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;YACZ,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE;SACtB;KACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,IAAI,OAAoC,CAAC;IAEzC;;OAEG;IACH,MAAM,aAAa,GAAG,CAAC,SAAiC,EAAE,EAAE;QAC1D,MAAM,QAAQ,GAAG,EAAE;aAChB,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;aACrB,IAAI,CAAC,KAAK,CAAC,IAAI,CACd,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,qBAAqB,CACrD,CAAC,CAAC,CAAoD,CAAC;QAC3D,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IAC1B,CAAC,CAAC;IAEF,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,GAAG,IAAI,2BAA2B,EAAE,CAAC;QAC5C,OAAO,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,oBAAoB,CACxC,SAAS,CAAC,qBAAqB,EAC/B,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CACrB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;QAC9E,aAAa,CAAC;YACZ;gBACE,IAAI,EAAE,QAAQ;gBACd,SAAS,EAAE,iBAAiB;gBAC5B,kBAAkB,EAAE,UAAU;gBAC9B,SAAS,EAAE,WAAW,CAAC,cAAc;gBACrC,UAAU,EAAE,WAAW,CAAC,QAAQ;aACjC;SACF,CAAC,CAAC;QAEH,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAE5B,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAClD,MAAM,EACN,sHAAsH,CACvH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,aAAa,CAAC;YACZ;gBACE,IAAI,EAAE,QAAQ;gBACd,SAAS,EAAE,oBAAoB;gBAC/B,kBAAkB,EAAE,aAAa;gBACjC,SAAS,EAAE,WAAW,CAAC,UAAU;gBACjC,mBAAmB,EAAE,aAAa;gBAClC,UAAU,EAAE,WAAW,CAAC,cAAc;aACvC;SACF,CAAC,CAAC;QAEH,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAE5B,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAClD,MAAM,EACN,4IAA4I,CAC7I,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,aAAa,CAAC;YACZ;gBACE,IAAI,EAAE,QAAQ;gBACd,SAAS,EAAE,aAAa;gBACxB,SAAS,EAAE,WAAW,CAAC,SAAS;gBAChC,UAAU,EAAE,WAAW,CAAC,cAAc;aACvC;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,SAAS,EAAE,kBAAkB;gBAC7B,SAAS,EAAE,WAAW,CAAC,cAAc;gBACrC,UAAU,EAAE,WAAW,CAAC,SAAS;aAClC;SACF,CAAC,CAAC;QAEH,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAE5B,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAClD,MAAM,EACN;;iEAE2D,CAC5D,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,aAAa,CAAC;YACZ;gBACE,IAAI,EAAE,GAAG;gBACT,SAAS,EAAE,QAAQ;gBACnB,SAAS,EAAE,WAAW,CAAC,SAAS;gBAChC,UAAU,EAAE,WAAW,CAAC,QAAQ;aACjC;SACF,CAAC,CAAC;QAEH,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAE5B,aAAa,CAAC;YACZ;gBACE,IAAI,EAAE,GAAG;gBACT,SAAS,EAAE,QAAQ;gBACnB,SAAS,EAAE,WAAW,CAAC,SAAS;gBAChC,UAAU,EAAE,WAAW,CAAC,QAAQ;aACjC;SACF,CAAC,CAAC;QAEH,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAE5B,+DAA+D;QAC/D,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,QAAQ,GAAG;YACf,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,iBAAiB;YAC5B,kBAAkB,EAAE,UAAU;YAC9B,SAAS,EAAE,WAAW,CAAC,cAAc;YACrC,UAAU,EAAE,WAAW,CAAC,QAAQ;SACjC,CAAC;QAEF,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC1B,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAEzD,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,SAAS,EAAE,CAAC;QAE/C,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC1B,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,aAAa,CAAC;YACZ;gBACE,IAAI,EAAE,MAAM;gBACZ,SAAS,EAAE,uBAAuB;gBAClC,kBAAkB,EAAE,kBAAkB;gBACtC,SAAS,EAAE,WAAW,CAAC,KAAK;gBAC5B,UAAU,EAAE,WAAW,CAAC,QAAQ;aACjC;SACF,CAAC,CAAC;QAEH,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAE5B,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAClD,MAAM,EACN,gIAAgI,CACjI,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"SlashCommandConflictHandler.test.js","sourceRoot":"","sources":["../../../src/services/SlashCommandConflictHandler.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EACL,UAAU,EACV,SAAS,GAGV,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,EAAE,CAAC,IAAI,CAAC,yBAAyB,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE;IAC1D,MAAM,MAAM,GACV,MAAM,cAAc,EAA4C,CAAC;IACnE,OAAO;QACL,GAAG,MAAM;QACT,UAAU,EAAE;YACV,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE;YACX,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;YACZ,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE;SACtB;KACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,IAAI,OAAoC,CAAC;IAEzC;;OAEG;IACH,MAAM,aAAa,GAAG,CAAC,SAAiC,EAAE,EAAE;QAC1D,MAAM,QAAQ,GAAG,EAAE;aAChB,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;aACrB,IAAI,CAAC,KAAK,CAAC,IAAI,CACd,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,qBAAqB,CACrD,CAAC,CAAC,CAAoD,CAAC;QAC3D,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IAC1B,CAAC,CAAC;IAEF,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,GAAG,IAAI,2BAA2B,EAAE,CAAC;QAC5C,OAAO,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,oBAAoB,CACxC,SAAS,CAAC,qBAAqB,EAC/B,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CACrB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;QAC9E,aAAa,CAAC;YACZ;gBACE,IAAI,EAAE,QAAQ;gBACd,SAAS,EAAE,iBAAiB;gBAC5B,kBAAkB,EAAE,UAAU;gBAC9B,SAAS,EAAE,WAAW,CAAC,cAAc;gBACrC,UAAU,EAAE,WAAW,CAAC,QAAQ;aACjC;SACF,CAAC,CAAC;QAEH,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAE5B,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAClD,MAAM,EACN,sHAAsH,CACvH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,aAAa,CAAC;YACZ;gBACE,IAAI,EAAE,QAAQ;gBACd,SAAS,EAAE,oBAAoB;gBAC/B,kBAAkB,EAAE,aAAa;gBACjC,SAAS,EAAE,WAAW,CAAC,UAAU;gBACjC,mBAAmB,EAAE,aAAa;gBAClC,UAAU,EAAE,WAAW,CAAC,cAAc;aACvC;SACF,CAAC,CAAC;QAEH,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAE5B,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAClD,MAAM,EACN,4IAA4I,CAC7I,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,aAAa,CAAC;YACZ;gBACE,IAAI,EAAE,QAAQ;gBACd,SAAS,EAAE,aAAa;gBACxB,SAAS,EAAE,WAAW,CAAC,SAAS;gBAChC,UAAU,EAAE,WAAW,CAAC,cAAc;aACvC;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,SAAS,EAAE,kBAAkB;gBAC7B,SAAS,EAAE,WAAW,CAAC,cAAc;gBACrC,UAAU,EAAE,WAAW,CAAC,SAAS;aAClC;SACF,CAAC,CAAC;QAEH,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAE5B,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAClD,MAAM,EACN;;iEAE2D,CAC5D,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,SAAS,GAAG;YAChB,IAAI,EAAE,GAAG;YACT,SAAS,EAAE,QAAQ;YACnB,SAAS,EAAE,WAAW,CAAC,SAAS;YAChC,UAAU,EAAE,WAAW,CAAC,QAAQ;SACjC,CAAC;QAEF,aAAa,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QAE3B,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAE5B,aAAa,CAAC;YACZ,SAAS;YACT;gBACE,IAAI,EAAE,GAAG;gBACT,SAAS,EAAE,QAAQ;gBACnB,SAAS,EAAE,WAAW,CAAC,SAAS;gBAChC,UAAU,EAAE,WAAW,CAAC,QAAQ;aACjC;SACF,CAAC,CAAC;QAEH,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAE5B,+DAA+D;QAC/D,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,QAAQ,GAAG;YACf,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,iBAAiB;YAC5B,kBAAkB,EAAE,UAAU;YAC9B,SAAS,EAAE,WAAW,CAAC,cAAc;YACrC,UAAU,EAAE,WAAW,CAAC,QAAQ;SACjC,CAAC;QAEF,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC1B,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAEzD,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,SAAS,EAAE,CAAC;QAE/C,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC1B,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,QAAQ,GAAG;YACf,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,iBAAiB;YAC5B,kBAAkB,EAAE,UAAU;YAC9B,SAAS,EAAE,WAAW,CAAC,cAAc;YACrC,UAAU,EAAE,WAAW,CAAC,QAAQ;SACjC,CAAC;QAEF,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC1B,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAEzD,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,SAAS,EAAE,CAAC;QAE/C,aAAa,CAAC,EAAE,CAAC,CAAC;QAClB,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAEvD,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC1B,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8GAA8G,EAAE,GAAG,EAAE;QACtH,MAAM,SAAS,GAAG;YAChB,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,iBAAiB;YAC5B,kBAAkB,EAAE,UAAU;YAC9B,SAAS,EAAE,WAAW,CAAC,cAAc;YACrC,UAAU,EAAE,WAAW,CAAC,QAAQ;SACjC,CAAC;QACF,MAAM,SAAS,GAAG;YAChB,IAAI,EAAE,MAAM;YACZ,SAAS,EAAE,WAAW;YACtB,kBAAkB,EAAE,MAAM;YAC1B,SAAS,EAAE,WAAW,CAAC,cAAc;YACrC,UAAU,EAAE,WAAW,CAAC,QAAQ;SACjC,CAAC;QAEF,aAAa,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;QACtC,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAEzD,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,SAAS,EAAE,CAAC;QAE/C,aAAa,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QAC3B,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAEvD,aAAa,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;QACtC,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAClD,MAAM,EACN,sHAAsH,CACvH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oHAAoH,EAAE,GAAG,EAAE;QAC5H,MAAM,QAAQ,GAAG;YACf,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,iBAAiB;YAC5B,kBAAkB,EAAE,UAAU;YAC9B,SAAS,EAAE,WAAW,CAAC,cAAc;YACrC,UAAU,EAAE,WAAW,CAAC,QAAQ;SACjC,CAAC;QAEF,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC1B,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAE5B,aAAa,CAAC,EAAE,CAAC,CAAC;QAClB,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAE5B,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC1B,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAE5B,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAClD,MAAM,EACN,sHAAsH,CACvH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAChF,MAAM,QAAQ,GAAG;YACf,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,iBAAiB;YAC5B,kBAAkB,EAAE,UAAU;YAC9B,SAAS,EAAE,WAAW,CAAC,cAAc;YACrC,UAAU,EAAE,WAAW,CAAC,QAAQ;SACjC,CAAC;QAEF,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC1B,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAE5B,aAAa,CAAC,EAAE,CAAC,CAAC;QAClB,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAE5B,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,aAAa,CAAC;YACZ;gBACE,IAAI,EAAE,MAAM;gBACZ,SAAS,EAAE,uBAAuB;gBAClC,kBAAkB,EAAE,kBAAkB;gBACtC,SAAS,EAAE,WAAW,CAAC,KAAK;gBAC5B,UAAU,EAAE,WAAW,CAAC,QAAQ;aACjC;SACF,CAAC,CAAC;QAEH,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAE5B,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAClD,MAAM,EACN,gIAAgI,CACjI,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -108,6 +108,59 @@ const SHELL_WIDTH_FRACTION = 0.89;
108
108
  * for the shell. This provides vertical padding and space for other UI elements.
109
109
  */
110
110
  const SHELL_HEIGHT_PADDING = 10;
111
+ const ENTER_SYNCHRONIZED_OUTPUT = '\x1b[?2026h';
112
+ const EXIT_SYNCHRONIZED_OUTPUT = '\x1b[?2026l';
113
+ /**
114
+ * Erases only the visible viewport and moves the cursor to the top-left corner.
115
+ *
116
+ * This intentionally avoids `ansiEscapes.clearTerminal`, which also emits
117
+ * `\x1b[3J` (Erase Saved Lines) and causes terminal emulators to purge their
118
+ * native scrollback history, wiping out earlier turns of the conversation.
119
+ */
120
+ const CLEAR_VIEWPORT = ansiEscapes.eraseScreen + ansiEscapes.cursorTo(0, 0);
121
+ const RESIZE_DEBOUNCE_MS = 100;
122
+ const RESIZE_CORK_SAFETY_TIMEOUT_MS = 1000;
123
+ function discardCorkedStdoutBuffer(stream) {
124
+ try {
125
+ const state = stream._writableState;
126
+ if (state && (state.corked ?? 0) > 0 && Array.isArray(state.buffered)) {
127
+ const startIndex = state.bufferedIndex ?? 0;
128
+ const entries = state.buffered.slice(startIndex);
129
+ let discardedLength = 0;
130
+ for (const entry of entries) {
131
+ if (entry?.chunk) {
132
+ if (typeof entry.chunk === 'string') {
133
+ discardedLength += Buffer.byteLength(entry.chunk, entry.encoding ?? 'utf8');
134
+ }
135
+ else if ('length' in entry.chunk &&
136
+ typeof entry.chunk.length === 'number') {
137
+ discardedLength += entry.chunk.length;
138
+ }
139
+ }
140
+ }
141
+ state.buffered.length = startIndex;
142
+ state.length = Math.max(0, (state.length ?? 0) - discardedLength);
143
+ if ('allBuffers' in state)
144
+ state.allBuffers = true;
145
+ if ('allNoop' in state)
146
+ state.allNoop = true;
147
+ for (const entry of entries) {
148
+ if (entry && typeof entry.callback === 'function') {
149
+ entry.callback(null);
150
+ }
151
+ }
152
+ }
153
+ }
154
+ catch (error) {
155
+ debugLogger.warn('Failed to discard corked stdout buffer safely:', error);
156
+ }
157
+ }
158
+ function refreshStdoutSize(stream) {
159
+ const resizableStream = stream;
160
+ if (typeof resizableStream._refreshSize === 'function') {
161
+ resizableStream._refreshSize();
162
+ }
163
+ }
111
164
  export const AppContainer = (props) => {
112
165
  const isHelpDismissKey = useIsHelpDismissKey();
113
166
  const keyMatchers = useKeyMatchers();
@@ -194,6 +247,7 @@ export const AppContainer = (props) => {
194
247
  const overflowState = useOverflowState();
195
248
  const overflowingIdsSize = overflowState?.overflowingIds.size ?? 0;
196
249
  const hasOverflowState = overflowingIdsSize > 0 || !constrainHeight;
250
+ const prevOverflowingIdsSizeRef = useRef(0);
197
251
  /**
198
252
  * Manages the visibility and x-second timer for the expansion hint.
199
253
  *
@@ -206,9 +260,11 @@ export const AppContainer = (props) => {
206
260
  * to avoid noise, but the user can still trigger it manually with Ctrl+O.
207
261
  */
208
262
  useEffect(() => {
209
- if (hasOverflowState) {
263
+ if (overflowingIdsSize > prevOverflowingIdsSizeRef.current &&
264
+ hasOverflowState) {
210
265
  triggerExpandHint(true);
211
266
  }
267
+ prevOverflowingIdsSizeRef.current = overflowingIdsSize;
212
268
  }, [hasOverflowState, overflowingIdsSize, triggerExpandHint]);
213
269
  const [defaultBannerText, setDefaultBannerText] = useState('');
214
270
  const [warningBannerText, setWarningBannerText] = useState('');
@@ -410,12 +466,93 @@ export const AppContainer = (props) => {
410
466
  addConfirmUpdateExtensionRequest,
411
467
  addItem: historyManager.addItem,
412
468
  });
469
+ const isStdoutCorkedRef = useRef(false);
470
+ const isRefreshingStaticRef = useRef(false);
471
+ const resizeCorkSafetyTimerRef = useRef(null);
472
+ const resizeDebounceTimerRef = useRef(null);
473
+ const lastStdoutColumnsRef = useRef(stdout.columns ?? process.stdout.columns ?? terminalWidth);
474
+ const lastRefreshedColumnsRef = useRef(terminalWidth);
475
+ const terminalWidthRef = useRef(terminalWidth);
476
+ terminalWidthRef.current = terminalWidth;
477
+ const clearResizeCorkSafetyTimer = useCallback(() => {
478
+ if (resizeCorkSafetyTimerRef.current) {
479
+ clearTimeout(resizeCorkSafetyTimerRef.current);
480
+ resizeCorkSafetyTimerRef.current = null;
481
+ }
482
+ }, []);
483
+ const clearResizeDebounceTimer = useCallback(() => {
484
+ if (resizeDebounceTimerRef.current) {
485
+ clearTimeout(resizeDebounceTimerRef.current);
486
+ resizeDebounceTimerRef.current = null;
487
+ }
488
+ }, []);
489
+ const corkStdout = useCallback(() => {
490
+ if (!isStdoutCorkedRef.current && typeof stdout.cork === 'function') {
491
+ stdout.cork();
492
+ isStdoutCorkedRef.current = true;
493
+ }
494
+ }, [stdout]);
495
+ const uncorkStdout = useCallback(() => {
496
+ clearResizeCorkSafetyTimer();
497
+ if (isStdoutCorkedRef.current && typeof stdout.uncork === 'function') {
498
+ isStdoutCorkedRef.current = false;
499
+ stdout.uncork();
500
+ }
501
+ }, [stdout, clearResizeCorkSafetyTimer]);
413
502
  const refreshStatic = useCallback(() => {
414
503
  if (!isAlternateBuffer && !config.getUseTerminalBuffer()) {
415
- stdout.write(ansiEscapes.clearTerminal);
504
+ clearResizeDebounceTimer();
505
+ refreshStdoutSize(stdout);
506
+ if (typeof stdout.prependListener === 'function' &&
507
+ stdout.columns !== undefined &&
508
+ stdout.columns !== terminalWidthRef.current) {
509
+ corkStdout();
510
+ clearResizeCorkSafetyTimer();
511
+ resizeCorkSafetyTimerRef.current = setTimeout(() => {
512
+ discardCorkedStdoutBuffer(stdout);
513
+ uncorkStdout();
514
+ }, RESIZE_CORK_SAFETY_TIMEOUT_MS);
515
+ return;
516
+ }
517
+ clearResizeCorkSafetyTimer();
518
+ lastRefreshedColumnsRef.current = terminalWidthRef.current;
519
+ if (typeof stdout.cork === 'function') {
520
+ corkStdout();
521
+ discardCorkedStdoutBuffer(stdout);
522
+ isRefreshingStaticRef.current = true;
523
+ stdout.write(ENTER_SYNCHRONIZED_OUTPUT);
524
+ }
525
+ // Only clear the viewport so the terminal's scrollback is preserved.
526
+ stdout.write(CLEAR_VIEWPORT);
527
+ }
528
+ if (!isAlternateBuffer || config.getUseTerminalBuffer()) {
416
529
  setHistoryRemountKey((prev) => prev + 1);
417
530
  }
418
- }, [setHistoryRemountKey, isAlternateBuffer, stdout, config]);
531
+ }, [
532
+ setHistoryRemountKey,
533
+ isAlternateBuffer,
534
+ stdout,
535
+ config,
536
+ clearResizeDebounceTimer,
537
+ clearResizeCorkSafetyTimer,
538
+ corkStdout,
539
+ uncorkStdout,
540
+ ]);
541
+ useLayoutEffect(() => {
542
+ if (isRefreshingStaticRef.current) {
543
+ isRefreshingStaticRef.current = false;
544
+ refreshStdoutSize(stdout);
545
+ if (stdout.columns !== undefined &&
546
+ stdout.columns !== lastRefreshedColumnsRef.current) {
547
+ discardCorkedStdoutBuffer(stdout);
548
+ stdout.write(EXIT_SYNCHRONIZED_OUTPUT);
549
+ uncorkStdout();
550
+ return;
551
+ }
552
+ stdout.write(EXIT_SYNCHRONIZED_OUTPUT);
553
+ uncorkStdout();
554
+ }
555
+ }, [historyRemountKey, stdout, uncorkStdout]);
419
556
  const shouldUseAlternateScreen = shouldEnterAlternateScreen(isAlternateBuffer, config.getScreenReader());
420
557
  const handleEditorClose = useCallback(() => {
421
558
  if (shouldUseAlternateScreen) {
@@ -463,6 +600,9 @@ export const AppContainer = (props) => {
463
600
  setAuthContext({});
464
601
  }
465
602
  }, [authState, authContext, setAuthState]);
603
+ const handleShowAuthSelection = useCallback(() => {
604
+ setAuthState(AuthState.Updating);
605
+ }, [setAuthState]);
466
606
  const { proQuotaRequest, handleProQuotaChoice, validationRequest, handleValidationChoice,
467
607
  // G1 AI Credits
468
608
  overageMenuRequest, handleOverageMenuChoice, emptyWalletRequest, handleEmptyWalletChoice, } = useQuotaAndFallback({
@@ -472,7 +612,7 @@ export const AppContainer = (props) => {
472
612
  paidTier,
473
613
  settings,
474
614
  setModelSwitchedFromQuotaError,
475
- onShowAuthSelection: () => setAuthState(AuthState.Updating),
615
+ onShowAuthSelection: handleShowAuthSelection,
476
616
  errorVerbosity: settings.merged.ui.errorVerbosity,
477
617
  });
478
618
  // Derive auth state variables for backward compatibility with UIStateContext
@@ -613,6 +753,30 @@ Logging in with Google... Restarting Cell CLI to continue.
613
753
  const setIsBackgroundTaskListOpenRef = useRef(() => { });
614
754
  const [shortcutsHelpVisible, setShortcutsHelpVisible] = useState(false);
615
755
  const { cleanUiDetailsVisible, setCleanUiDetailsVisible, toggleCleanUiDetailsVisible, revealCleanUiDetailsTemporarily, } = useVisibilityToggle();
756
+ const cancelPromiseRef = useRef(null);
757
+ const awaitCancelPromise = useCallback(async () => {
758
+ if (!cancelPromiseRef.current) {
759
+ return;
760
+ }
761
+ let timeoutId;
762
+ try {
763
+ await Promise.race([
764
+ cancelPromiseRef.current,
765
+ new Promise((resolve) => {
766
+ timeoutId = setTimeout(resolve, 1000);
767
+ }),
768
+ ]);
769
+ }
770
+ catch (error) {
771
+ debugLogger.warn(`Error awaiting cancellation: ${error}`);
772
+ }
773
+ finally {
774
+ if (timeoutId !== undefined) {
775
+ clearTimeout(timeoutId);
776
+ }
777
+ cancelPromiseRef.current = null;
778
+ }
779
+ }, []);
616
780
  const slashCommandActions = useMemo(() => ({
617
781
  openAuthDialog: () => setAuthState(AuthState.Updating),
618
782
  openThemeDialog,
@@ -651,8 +815,13 @@ Logging in with Google... Restarting Cell CLI to continue.
651
815
  }
652
816
  }
653
817
  await runExitCleanup();
654
- process.exit(0);
818
+ //process.exit(0);
655
819
  });
820
+ setTimeout(async () => {
821
+ await awaitCancelPromise();
822
+ await runExitCleanup();
823
+ process.exit(0);
824
+ }, 100);
656
825
  },
657
826
  setDebugMessage,
658
827
  toggleCorgiMode: () => setCorgiMode((prev) => !prev),
@@ -685,6 +854,7 @@ Logging in with Google... Restarting Cell CLI to continue.
685
854
  openVoiceModelDialog,
686
855
  openAgentConfigDialog,
687
856
  setQuittingMessages,
857
+ awaitCancelPromise,
688
858
  setDebugMessage,
689
859
  setShowPrivacyNotice,
690
860
  setCorgiMode,
@@ -797,6 +967,7 @@ Logging in with Google... Restarting Cell CLI to continue.
797
967
  ? // eslint-disable-next-line react-hooks/rules-of-hooks
798
968
  useAgentStream({
799
969
  agent: streamAgent,
970
+ config,
800
971
  addItem: historyManager.addItem,
801
972
  onCancelSubmit,
802
973
  isShellFocused: embeddedShellFocused,
@@ -1105,14 +1276,17 @@ Logging in with Google... Restarting Cell CLI to continue.
1105
1276
  const [showErrorDetails, setShowErrorDetails] = useState(false);
1106
1277
  const [showFullTodos, setShowFullTodos] = useState(false);
1107
1278
  const [renderMarkdown, setRenderMarkdown] = useState(true);
1108
- const handleExitRepeat = useCallback((count) => {
1279
+ const handleExitRepeat = useCallback(async (count) => {
1109
1280
  if (count > 2) {
1110
1281
  recordExitFail(config);
1111
1282
  }
1112
1283
  if (count > 1) {
1113
- void handleSlashCommand('/quit', undefined, undefined, false);
1284
+ if (cancelPromiseRef.current) {
1285
+ await awaitCancelPromise();
1286
+ }
1287
+ await handleSlashCommand('/quit', undefined, undefined, false);
1114
1288
  }
1115
- }, [config, handleSlashCommand]);
1289
+ }, [config, handleSlashCommand, awaitCancelPromise]);
1116
1290
  const { pressCount: ctrlCPressCount, handlePress: handleCtrlCPress } = useRepeatedKeyPress({
1117
1291
  windowMs: WARNING_PROMPT_DURATION_MS,
1118
1292
  onRepeat: handleExitRepeat,
@@ -1129,6 +1303,7 @@ Logging in with Google... Restarting Cell CLI to continue.
1129
1303
  const policyUpdateConfirmationRequest = config.getPolicyUpdateConfirmationRequest();
1130
1304
  const [isPolicyUpdateDialogOpen, setIsPolicyUpdateDialogOpen] = useState(!!policyUpdateConfirmationRequest);
1131
1305
  const { needsRestart: ideNeedsRestart, restartReason: ideTrustRestartReason, } = useIdeTrustListener();
1306
+ const prevWidthRef = useRef(terminalWidth);
1132
1307
  useIncludeDirsTrust(config, isTrustedFolder, historyManager, setCustomDialog);
1133
1308
  const tabFocusTimeoutRef = useRef(null);
1134
1309
  useEffect(() => {
@@ -1176,6 +1351,67 @@ Logging in with Google... Restarting Cell CLI to continue.
1176
1351
  setShowIdeRestartPrompt(true);
1177
1352
  }
1178
1353
  }, [ideNeedsRestart]);
1354
+ useEffect(() => {
1355
+ if (isAlternateBuffer ||
1356
+ config.getUseTerminalBuffer() ||
1357
+ typeof stdout.prependListener !== 'function') {
1358
+ return;
1359
+ }
1360
+ const handleResizeStart = () => {
1361
+ const currentColumns = stdout.columns ?? process.stdout.columns;
1362
+ if (currentColumns !== undefined &&
1363
+ currentColumns !== lastStdoutColumnsRef.current) {
1364
+ lastStdoutColumnsRef.current = currentColumns;
1365
+ corkStdout();
1366
+ clearResizeCorkSafetyTimer();
1367
+ resizeCorkSafetyTimerRef.current = setTimeout(() => {
1368
+ discardCorkedStdoutBuffer(stdout);
1369
+ uncorkStdout();
1370
+ }, RESIZE_CORK_SAFETY_TIMEOUT_MS);
1371
+ }
1372
+ };
1373
+ stdout.prependListener('resize', handleResizeStart);
1374
+ return () => {
1375
+ stdout.off('resize', handleResizeStart);
1376
+ clearResizeDebounceTimer();
1377
+ if (isRefreshingStaticRef.current) {
1378
+ isRefreshingStaticRef.current = false;
1379
+ stdout.write(EXIT_SYNCHRONIZED_OUTPUT);
1380
+ }
1381
+ uncorkStdout();
1382
+ };
1383
+ }, [
1384
+ stdout,
1385
+ isAlternateBuffer,
1386
+ config,
1387
+ corkStdout,
1388
+ uncorkStdout,
1389
+ clearResizeDebounceTimer,
1390
+ clearResizeCorkSafetyTimer,
1391
+ ]);
1392
+ useEffect(() => {
1393
+ if (prevWidthRef.current === terminalWidth) {
1394
+ return;
1395
+ }
1396
+ prevWidthRef.current = terminalWidth;
1397
+ if (isAlternateBuffer || config.getUseTerminalBuffer()) {
1398
+ clearResizeDebounceTimer();
1399
+ return;
1400
+ }
1401
+ clearResizeDebounceTimer();
1402
+ resizeDebounceTimerRef.current = setTimeout(() => {
1403
+ refreshStatic();
1404
+ }, RESIZE_DEBOUNCE_MS);
1405
+ return () => {
1406
+ clearResizeDebounceTimer();
1407
+ };
1408
+ }, [
1409
+ terminalWidth,
1410
+ refreshStatic,
1411
+ clearResizeDebounceTimer,
1412
+ isAlternateBuffer,
1413
+ config,
1414
+ ]);
1179
1415
  useEffect(() => {
1180
1416
  const unsubscribe = ideContextStore.subscribe(setIdeContextState);
1181
1417
  setIdeContextState(ideContextStore.get());
@@ -1184,7 +1420,6 @@ Logging in with Google... Restarting Cell CLI to continue.
1184
1420
  useEffect(() => {
1185
1421
  const openDebugConsole = () => {
1186
1422
  setShowErrorDetails(true);
1187
- setConstrainHeight(false);
1188
1423
  };
1189
1424
  appEvents.on(AppEvent.OpenDebugConsole, openDebugConsole);
1190
1425
  return () => {
@@ -1261,8 +1496,10 @@ Logging in with Google... Restarting Cell CLI to continue.
1261
1496
  if (keyMatchers[Command.QUIT](key)) {
1262
1497
  // If the user presses Ctrl+C, we want to cancel any ongoing requests.
1263
1498
  // This should happen regardless of the count.
1264
- void cancelOngoingRequest?.();
1265
- feedbackPromiseResolveRef.current(null);
1499
+ const cancelPromise = cancelOngoingRequest?.();
1500
+ if (cancelPromise) {
1501
+ cancelPromiseRef.current = cancelPromise;
1502
+ }
1266
1503
  handleCtrlCPress();
1267
1504
  return true;
1268
1505
  }
@@ -1366,7 +1603,11 @@ Logging in with Google... Restarting Cell CLI to continue.
1366
1603
  else if (keyMatchers[Command.SHOW_MORE_LINES](key)) {
1367
1604
  setConstrainHeight(false);
1368
1605
  toggleLastTurnTools();
1369
- refreshStatic();
1606
+ if (!isAlternateBuffer &&
1607
+ !config.getUseTerminalBuffer() &&
1608
+ getLastTurnToolCallIds(historyManager.history, []).length > 0) {
1609
+ refreshStatic();
1610
+ }
1370
1611
  return true;
1371
1612
  }
1372
1613
  else if ((keyMatchers[Command.FOCUS_SHELL_INPUT](key) ||
@@ -1620,6 +1861,7 @@ Logging in with Google... Restarting Cell CLI to continue.
1620
1861
  customWittyPhrases: settings.merged.ui.customWittyPhrases,
1621
1862
  errorVerbosity: settings.merged.ui.errorVerbosity,
1622
1863
  maxLength,
1864
+ pauseUpdates: !constrainHeight && !isAlternateBuffer && !config.getUseTerminalBuffer(),
1623
1865
  });
1624
1866
  const allowPlanMode = config.isPlanEnabled() &&
1625
1867
  streamingState === StreamingState.Idle &&