dmux 3.1.1 → 3.3.0

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 (635) hide show
  1. package/dist/DmuxApp.d.ts +2 -2
  2. package/dist/DmuxApp.d.ts.map +1 -1
  3. package/dist/DmuxApp.js +405 -1134
  4. package/dist/DmuxApp.js.map +1 -1
  5. package/dist/actions/implementations/closeAction.d.ts +10 -0
  6. package/dist/actions/implementations/closeAction.d.ts.map +1 -0
  7. package/dist/actions/implementations/closeAction.js +197 -0
  8. package/dist/actions/implementations/closeAction.js.map +1 -0
  9. package/dist/actions/implementations/copyPathAction.d.ts +10 -0
  10. package/dist/actions/implementations/copyPathAction.d.ts.map +1 -0
  11. package/dist/actions/implementations/copyPathAction.js +34 -0
  12. package/dist/actions/implementations/copyPathAction.js.map +1 -0
  13. package/dist/actions/implementations/duplicateAction.d.ts +10 -0
  14. package/dist/actions/implementations/duplicateAction.d.ts.map +1 -0
  15. package/dist/actions/implementations/duplicateAction.js +25 -0
  16. package/dist/actions/implementations/duplicateAction.js.map +1 -0
  17. package/dist/actions/implementations/index.d.ts +14 -0
  18. package/dist/actions/implementations/index.d.ts.map +1 -0
  19. package/dist/actions/implementations/index.js +14 -0
  20. package/dist/actions/implementations/index.js.map +1 -0
  21. package/dist/actions/implementations/mergeAction.d.ts +14 -0
  22. package/dist/actions/implementations/mergeAction.d.ts.map +1 -0
  23. package/dist/actions/implementations/mergeAction.js +84 -0
  24. package/dist/actions/implementations/mergeAction.js.map +1 -0
  25. package/dist/actions/implementations/openInEditorAction.d.ts +12 -0
  26. package/dist/actions/implementations/openInEditorAction.d.ts.map +1 -0
  27. package/dist/actions/implementations/openInEditorAction.js +33 -0
  28. package/dist/actions/implementations/openInEditorAction.js.map +1 -0
  29. package/dist/actions/implementations/renameAction.d.ts +13 -0
  30. package/dist/actions/implementations/renameAction.d.ts.map +1 -0
  31. package/dist/actions/implementations/renameAction.js +18 -0
  32. package/dist/actions/implementations/renameAction.js.map +1 -0
  33. package/dist/actions/implementations/toggleAutopilotAction.d.ts +10 -0
  34. package/dist/actions/implementations/toggleAutopilotAction.d.ts.map +1 -0
  35. package/dist/actions/implementations/toggleAutopilotAction.js +33 -0
  36. package/dist/actions/implementations/toggleAutopilotAction.js.map +1 -0
  37. package/dist/actions/implementations/viewAction.d.ts +10 -0
  38. package/dist/actions/implementations/viewAction.d.ts.map +1 -0
  39. package/dist/actions/implementations/viewAction.js +26 -0
  40. package/dist/actions/implementations/viewAction.js.map +1 -0
  41. package/dist/actions/merge/commitMessageHandler.d.ts +27 -0
  42. package/dist/actions/merge/commitMessageHandler.d.ts.map +1 -0
  43. package/dist/actions/merge/commitMessageHandler.js +131 -0
  44. package/dist/actions/merge/commitMessageHandler.js.map +1 -0
  45. package/dist/actions/merge/conflictResolution.d.ts +13 -0
  46. package/dist/actions/merge/conflictResolution.d.ts.map +1 -0
  47. package/dist/actions/merge/conflictResolution.js +134 -0
  48. package/dist/actions/merge/conflictResolution.js.map +1 -0
  49. package/dist/actions/merge/issueHandlers/index.d.ts +11 -0
  50. package/dist/actions/merge/issueHandlers/index.d.ts.map +1 -0
  51. package/dist/actions/merge/issueHandlers/index.js +8 -0
  52. package/dist/actions/merge/issueHandlers/index.js.map +1 -0
  53. package/dist/actions/merge/issueHandlers/mainDirtyHandler.d.ts +13 -0
  54. package/dist/actions/merge/issueHandlers/mainDirtyHandler.d.ts.map +1 -0
  55. package/dist/actions/merge/issueHandlers/mainDirtyHandler.js +72 -0
  56. package/dist/actions/merge/issueHandlers/mainDirtyHandler.js.map +1 -0
  57. package/dist/actions/merge/issueHandlers/mergeConflictHandler.d.ts +13 -0
  58. package/dist/actions/merge/issueHandlers/mergeConflictHandler.d.ts.map +1 -0
  59. package/dist/actions/merge/issueHandlers/mergeConflictHandler.js +52 -0
  60. package/dist/actions/merge/issueHandlers/mergeConflictHandler.js.map +1 -0
  61. package/dist/actions/merge/issueHandlers/nothingToMergeHandler.d.ts +7 -0
  62. package/dist/actions/merge/issueHandlers/nothingToMergeHandler.d.ts.map +1 -0
  63. package/dist/actions/merge/issueHandlers/nothingToMergeHandler.js +12 -0
  64. package/dist/actions/merge/issueHandlers/nothingToMergeHandler.js.map +1 -0
  65. package/dist/actions/merge/issueHandlers/worktreeUncommittedHandler.d.ts +13 -0
  66. package/dist/actions/merge/issueHandlers/worktreeUncommittedHandler.d.ts.map +1 -0
  67. package/dist/actions/merge/issueHandlers/worktreeUncommittedHandler.js +49 -0
  68. package/dist/actions/merge/issueHandlers/worktreeUncommittedHandler.js.map +1 -0
  69. package/dist/actions/merge/mergeExecution.d.ts +22 -0
  70. package/dist/actions/merge/mergeExecution.d.ts.map +1 -0
  71. package/dist/actions/merge/mergeExecution.js +180 -0
  72. package/dist/actions/merge/mergeExecution.js.map +1 -0
  73. package/dist/actions/paneActions.d.ts +3 -40
  74. package/dist/actions/paneActions.d.ts.map +1 -1
  75. package/dist/actions/paneActions.js +4 -981
  76. package/dist/actions/paneActions.js.map +1 -1
  77. package/dist/actions/types.d.ts +2 -0
  78. package/dist/actions/types.d.ts.map +1 -1
  79. package/dist/actions/types.js +1 -0
  80. package/dist/actions/types.js.map +1 -1
  81. package/dist/components/{ActionChoiceDialog.d.ts → dialogs/ActionChoiceDialog.d.ts} +1 -1
  82. package/dist/components/dialogs/ActionChoiceDialog.d.ts.map +1 -0
  83. package/dist/components/dialogs/ActionChoiceDialog.js.map +1 -0
  84. package/dist/components/dialogs/ActionConfirmDialog.d.ts.map +1 -0
  85. package/dist/components/dialogs/ActionConfirmDialog.js.map +1 -0
  86. package/dist/components/dialogs/ActionInputDialog.d.ts.map +1 -0
  87. package/dist/components/{ActionInputDialog.js → dialogs/ActionInputDialog.js} +4 -3
  88. package/dist/components/dialogs/ActionInputDialog.js.map +1 -0
  89. package/dist/components/dialogs/ActionProgressDialog.d.ts.map +1 -0
  90. package/dist/components/dialogs/ActionProgressDialog.js.map +1 -0
  91. package/dist/components/dialogs/AgentChoiceDialog.d.ts.map +1 -0
  92. package/dist/components/dialogs/AgentChoiceDialog.js.map +1 -0
  93. package/dist/components/{CloseOptionsDialog.d.ts → dialogs/CloseOptionsDialog.d.ts} +1 -1
  94. package/dist/components/dialogs/CloseOptionsDialog.d.ts.map +1 -0
  95. package/dist/components/dialogs/CloseOptionsDialog.js.map +1 -0
  96. package/dist/components/dialogs/CommandPromptDialog.d.ts.map +1 -0
  97. package/dist/components/{CommandPromptDialog.js → dialogs/CommandPromptDialog.js} +1 -1
  98. package/dist/components/dialogs/CommandPromptDialog.js.map +1 -0
  99. package/dist/components/dialogs/DialogBox.d.ts +16 -0
  100. package/dist/components/dialogs/DialogBox.d.ts.map +1 -0
  101. package/dist/components/dialogs/DialogBox.js +12 -0
  102. package/dist/components/dialogs/DialogBox.js.map +1 -0
  103. package/dist/components/dialogs/HooksDialog.d.ts.map +1 -0
  104. package/dist/components/dialogs/HooksDialog.js.map +1 -0
  105. package/dist/components/{MergeConfirmationDialog.d.ts → dialogs/MergeConfirmationDialog.d.ts} +1 -1
  106. package/dist/components/dialogs/MergeConfirmationDialog.d.ts.map +1 -0
  107. package/dist/components/dialogs/MergeConfirmationDialog.js.map +1 -0
  108. package/dist/components/{SettingsDialog.d.ts → dialogs/SettingsDialog.d.ts} +1 -1
  109. package/dist/components/dialogs/SettingsDialog.d.ts.map +1 -0
  110. package/dist/components/dialogs/SettingsDialog.js.map +1 -0
  111. package/dist/components/dialogs/UpdateDialog.d.ts.map +1 -0
  112. package/dist/components/dialogs/UpdateDialog.js.map +1 -0
  113. package/dist/components/indicators/CreatingIndicator.d.ts.map +1 -0
  114. package/dist/components/indicators/CreatingIndicator.js.map +1 -0
  115. package/dist/components/indicators/LoadingIndicator.d.ts.map +1 -0
  116. package/dist/components/indicators/LoadingIndicator.js.map +1 -0
  117. package/dist/components/indicators/RunningIndicator.d.ts.map +1 -0
  118. package/dist/components/indicators/RunningIndicator.js.map +1 -0
  119. package/dist/components/indicators/Spinner.d.ts.map +1 -0
  120. package/dist/components/indicators/Spinner.js.map +1 -0
  121. package/dist/components/indicators/UpdatingIndicator.d.ts.map +1 -0
  122. package/dist/components/indicators/UpdatingIndicator.js.map +1 -0
  123. package/dist/components/indicators/index.d.ts +6 -0
  124. package/dist/components/indicators/index.d.ts.map +1 -0
  125. package/dist/components/indicators/index.js +6 -0
  126. package/dist/components/indicators/index.js.map +1 -0
  127. package/dist/components/inputs/CleanTextInput.d.ts +19 -0
  128. package/dist/components/inputs/CleanTextInput.d.ts.map +1 -0
  129. package/dist/{CleanTextInput.js → components/inputs/CleanTextInput.js} +98 -160
  130. package/dist/components/inputs/CleanTextInput.js.map +1 -0
  131. package/dist/components/inputs/StyledTextInput.d.ts.map +1 -0
  132. package/dist/components/inputs/StyledTextInput.js.map +1 -0
  133. package/dist/components/inputs/index.d.ts +3 -0
  134. package/dist/components/inputs/index.d.ts.map +1 -0
  135. package/dist/components/inputs/index.js +3 -0
  136. package/dist/components/inputs/index.js.map +1 -0
  137. package/dist/components/{KebabMenu.d.ts → panes/KebabMenu.d.ts} +1 -1
  138. package/dist/components/panes/KebabMenu.d.ts.map +1 -0
  139. package/dist/components/panes/KebabMenu.js.map +1 -0
  140. package/dist/components/panes/MergePane.d.ts.map +1 -0
  141. package/dist/{MergePane.js → components/panes/MergePane.js} +1 -1
  142. package/dist/components/panes/MergePane.js.map +1 -0
  143. package/dist/components/{PaneCard.d.ts → panes/PaneCard.d.ts} +4 -2
  144. package/dist/components/panes/PaneCard.d.ts.map +1 -0
  145. package/dist/components/panes/PaneCard.js +55 -0
  146. package/dist/components/panes/PaneCard.js.map +1 -0
  147. package/dist/components/panes/PanesGrid.d.ts +12 -0
  148. package/dist/components/panes/PanesGrid.d.ts.map +1 -0
  149. package/dist/components/panes/PanesGrid.js +49 -0
  150. package/dist/components/panes/PanesGrid.js.map +1 -0
  151. package/dist/components/panes/index.d.ts +5 -0
  152. package/dist/components/panes/index.d.ts.map +1 -0
  153. package/dist/components/panes/index.js +5 -0
  154. package/dist/components/panes/index.js.map +1 -0
  155. package/dist/components/popups/agentChoicePopup.d.ts +7 -0
  156. package/dist/components/popups/agentChoicePopup.d.ts.map +1 -0
  157. package/dist/components/popups/agentChoicePopup.js +74 -0
  158. package/dist/components/popups/agentChoicePopup.js.map +1 -0
  159. package/dist/components/popups/choicePopup.d.ts +7 -0
  160. package/dist/components/popups/choicePopup.d.ts.map +1 -0
  161. package/dist/components/popups/choicePopup.js +64 -0
  162. package/dist/components/popups/choicePopup.js.map +1 -0
  163. package/dist/components/popups/config.d.ts +40 -0
  164. package/dist/components/popups/config.d.ts.map +1 -0
  165. package/dist/components/popups/config.js +40 -0
  166. package/dist/components/popups/config.js.map +1 -0
  167. package/dist/components/popups/confirmPopup.d.ts +7 -0
  168. package/dist/components/popups/confirmPopup.d.ts.map +1 -0
  169. package/dist/components/popups/confirmPopup.js +71 -0
  170. package/dist/components/popups/confirmPopup.js.map +1 -0
  171. package/dist/components/popups/hooksPopup.d.ts +7 -0
  172. package/dist/components/popups/hooksPopup.d.ts.map +1 -0
  173. package/dist/components/popups/hooksPopup.js +71 -0
  174. package/dist/components/popups/hooksPopup.js.map +1 -0
  175. package/dist/components/popups/inputPopup.d.ts +7 -0
  176. package/dist/components/popups/inputPopup.d.ts.map +1 -0
  177. package/dist/components/popups/inputPopup.js +47 -0
  178. package/dist/components/popups/inputPopup.js.map +1 -0
  179. package/dist/components/popups/kebabMenuPopup.d.ts +7 -0
  180. package/dist/components/popups/kebabMenuPopup.d.ts.map +1 -0
  181. package/dist/components/popups/kebabMenuPopup.js +52 -0
  182. package/dist/components/popups/kebabMenuPopup.js.map +1 -0
  183. package/dist/components/popups/logsPopup.d.ts +12 -0
  184. package/dist/components/popups/logsPopup.d.ts.map +1 -0
  185. package/dist/components/popups/logsPopup.js +372 -0
  186. package/dist/components/popups/logsPopup.js.map +1 -0
  187. package/dist/components/popups/mergePopup.d.ts +7 -0
  188. package/dist/components/popups/mergePopup.d.ts.map +1 -0
  189. package/dist/components/popups/mergePopup.js +310 -0
  190. package/dist/components/popups/mergePopup.js.map +1 -0
  191. package/dist/components/popups/newPanePopup.d.ts +7 -0
  192. package/dist/components/popups/newPanePopup.d.ts.map +1 -0
  193. package/dist/components/popups/newPanePopup.js +234 -0
  194. package/dist/components/popups/newPanePopup.js.map +1 -0
  195. package/dist/components/popups/progressPopup.d.ts +8 -0
  196. package/dist/components/popups/progressPopup.d.ts.map +1 -0
  197. package/dist/components/popups/progressPopup.js +53 -0
  198. package/dist/components/popups/progressPopup.js.map +1 -0
  199. package/dist/components/popups/remotePopup.d.ts +6 -0
  200. package/dist/components/popups/remotePopup.d.ts.map +1 -0
  201. package/dist/components/popups/remotePopup.js +166 -0
  202. package/dist/components/popups/remotePopup.js.map +1 -0
  203. package/dist/components/popups/settingsPopup.d.ts +7 -0
  204. package/dist/components/popups/settingsPopup.d.ts.map +1 -0
  205. package/dist/components/popups/settingsPopup.js +212 -0
  206. package/dist/components/popups/settingsPopup.js.map +1 -0
  207. package/dist/components/popups/shared/FileList.d.ts +13 -0
  208. package/dist/components/popups/shared/FileList.d.ts.map +1 -0
  209. package/dist/components/popups/shared/FileList.js +61 -0
  210. package/dist/components/popups/shared/FileList.js.map +1 -0
  211. package/dist/components/popups/shared/PopupContainer.d.ts +14 -0
  212. package/dist/components/popups/shared/PopupContainer.d.ts.map +1 -0
  213. package/dist/components/popups/shared/PopupContainer.js +15 -0
  214. package/dist/components/popups/shared/PopupContainer.js.map +1 -0
  215. package/dist/components/popups/shared/PopupInputBox.d.ts +11 -0
  216. package/dist/components/popups/shared/PopupInputBox.d.ts.map +1 -0
  217. package/dist/components/popups/shared/PopupInputBox.js +10 -0
  218. package/dist/components/popups/shared/PopupInputBox.js.map +1 -0
  219. package/dist/components/popups/shared/PopupWrapper.d.ts +37 -0
  220. package/dist/components/popups/shared/PopupWrapper.d.ts.map +1 -0
  221. package/dist/components/popups/shared/PopupWrapper.js +88 -0
  222. package/dist/components/popups/shared/PopupWrapper.js.map +1 -0
  223. package/dist/components/popups/shared/index.d.ts +8 -0
  224. package/dist/components/popups/shared/index.d.ts.map +1 -0
  225. package/dist/components/popups/shared/index.js +8 -0
  226. package/dist/components/popups/shared/index.js.map +1 -0
  227. package/dist/components/popups/shortcutsPopup.d.ts +6 -0
  228. package/dist/components/popups/shortcutsPopup.d.ts.map +1 -0
  229. package/dist/components/popups/shortcutsPopup.js +74 -0
  230. package/dist/components/popups/shortcutsPopup.js.map +1 -0
  231. package/dist/components/popups/templates/SimpleInputPopup.d.ts +15 -0
  232. package/dist/components/popups/templates/SimpleInputPopup.d.ts.map +1 -0
  233. package/dist/components/popups/templates/SimpleInputPopup.js +28 -0
  234. package/dist/components/popups/templates/SimpleInputPopup.js.map +1 -0
  235. package/dist/components/ui/FileCopyPrompt.d.ts.map +1 -0
  236. package/dist/components/ui/FileCopyPrompt.js.map +1 -0
  237. package/dist/components/ui/FooterHelp.d.ts +19 -0
  238. package/dist/components/ui/FooterHelp.d.ts.map +1 -0
  239. package/dist/components/ui/FooterHelp.js +55 -0
  240. package/dist/components/ui/FooterHelp.js.map +1 -0
  241. package/dist/components/ui/QRCode.d.ts.map +1 -0
  242. package/dist/components/ui/QRCode.js.map +1 -0
  243. package/dist/components/ui/index.d.ts +4 -0
  244. package/dist/components/ui/index.d.ts.map +1 -0
  245. package/dist/components/ui/index.js +4 -0
  246. package/dist/components/ui/index.js.map +1 -0
  247. package/dist/constants/timing.d.ts +22 -0
  248. package/dist/constants/timing.d.ts.map +1 -0
  249. package/dist/constants/timing.js +26 -0
  250. package/dist/constants/timing.js.map +1 -0
  251. package/dist/dashboard.js +1 -1
  252. package/dist/hooks/useActionSystem.d.ts +18 -4
  253. package/dist/hooks/useActionSystem.d.ts.map +1 -1
  254. package/dist/hooks/useActionSystem.js +125 -30
  255. package/dist/hooks/useActionSystem.js.map +1 -1
  256. package/dist/hooks/useDebugInfo.d.ts +11 -0
  257. package/dist/hooks/useDebugInfo.d.ts.map +1 -0
  258. package/dist/hooks/useDebugInfo.js +34 -0
  259. package/dist/hooks/useDebugInfo.js.map +1 -0
  260. package/dist/hooks/useDialogState.d.ts +22 -0
  261. package/dist/hooks/useDialogState.d.ts.map +1 -0
  262. package/dist/hooks/useDialogState.js +62 -0
  263. package/dist/hooks/useDialogState.js.map +1 -0
  264. package/dist/hooks/useInputHandling.d.ts +60 -0
  265. package/dist/hooks/useInputHandling.d.ts.map +1 -0
  266. package/dist/hooks/useInputHandling.js +280 -0
  267. package/dist/hooks/useInputHandling.js.map +1 -0
  268. package/dist/hooks/useLayoutManagement.d.ts +12 -0
  269. package/dist/hooks/useLayoutManagement.d.ts.map +1 -0
  270. package/dist/hooks/useLayoutManagement.js +58 -0
  271. package/dist/hooks/useLayoutManagement.js.map +1 -0
  272. package/dist/hooks/useNavigation.js +1 -1
  273. package/dist/hooks/useNavigation.js.map +1 -1
  274. package/dist/hooks/usePaneCreation.d.ts +1 -2
  275. package/dist/hooks/usePaneCreation.d.ts.map +1 -1
  276. package/dist/hooks/usePaneCreation.js +17 -36
  277. package/dist/hooks/usePaneCreation.js.map +1 -1
  278. package/dist/hooks/usePaneLoading.d.ts +45 -0
  279. package/dist/hooks/usePaneLoading.d.ts.map +1 -0
  280. package/dist/hooks/usePaneLoading.js +188 -0
  281. package/dist/hooks/usePaneLoading.js.map +1 -0
  282. package/dist/hooks/usePaneRunner.d.ts.map +1 -1
  283. package/dist/hooks/usePaneRunner.js +16 -8
  284. package/dist/hooks/usePaneRunner.js.map +1 -1
  285. package/dist/hooks/usePaneSync.d.ts +34 -0
  286. package/dist/hooks/usePaneSync.d.ts.map +1 -0
  287. package/dist/hooks/usePaneSync.js +182 -0
  288. package/dist/hooks/usePaneSync.js.map +1 -0
  289. package/dist/hooks/usePanes.d.ts.map +1 -1
  290. package/dist/hooks/usePanes.js +81 -258
  291. package/dist/hooks/usePanes.js.map +1 -1
  292. package/dist/hooks/useServices.d.ts +24 -0
  293. package/dist/hooks/useServices.d.ts.map +1 -0
  294. package/dist/hooks/useServices.js +39 -0
  295. package/dist/hooks/useServices.js.map +1 -0
  296. package/dist/hooks/useShellDetection.d.ts +10 -0
  297. package/dist/hooks/useShellDetection.d.ts.map +1 -0
  298. package/dist/hooks/useShellDetection.js +53 -0
  299. package/dist/hooks/useShellDetection.js.map +1 -0
  300. package/dist/hooks/useStatusMessages.d.ts +11 -0
  301. package/dist/hooks/useStatusMessages.d.ts.map +1 -0
  302. package/dist/hooks/useStatusMessages.js +32 -0
  303. package/dist/hooks/useStatusMessages.js.map +1 -0
  304. package/dist/hooks/useTemporaryStatus.d.ts +13 -0
  305. package/dist/hooks/useTemporaryStatus.d.ts.map +1 -0
  306. package/dist/hooks/useTemporaryStatus.js +30 -0
  307. package/dist/hooks/useTemporaryStatus.js.map +1 -0
  308. package/dist/hooks/useTerminalWidth.d.ts.map +1 -1
  309. package/dist/hooks/useTerminalWidth.js +7 -12
  310. package/dist/hooks/useTerminalWidth.js.map +1 -1
  311. package/dist/hooks/useTunnelManagement.d.ts +18 -0
  312. package/dist/hooks/useTunnelManagement.d.ts.map +1 -0
  313. package/dist/hooks/useTunnelManagement.js +55 -0
  314. package/dist/hooks/useTunnelManagement.js.map +1 -0
  315. package/dist/hooks/useWorktreeActions.d.ts.map +1 -1
  316. package/dist/hooks/useWorktreeActions.js +23 -24
  317. package/dist/hooks/useWorktreeActions.js.map +1 -1
  318. package/dist/index.js +279 -73
  319. package/dist/index.js.map +1 -1
  320. package/dist/layout/LayoutCalculator.d.ts +62 -0
  321. package/dist/layout/LayoutCalculator.d.ts.map +1 -0
  322. package/dist/layout/LayoutCalculator.js +143 -0
  323. package/dist/layout/LayoutCalculator.js.map +1 -0
  324. package/dist/layout/SpacerManager.d.ts +64 -0
  325. package/dist/layout/SpacerManager.d.ts.map +1 -0
  326. package/dist/layout/SpacerManager.js +148 -0
  327. package/dist/layout/SpacerManager.js.map +1 -0
  328. package/dist/layout/TmuxLayoutApplier.d.ts +59 -0
  329. package/dist/layout/TmuxLayoutApplier.d.ts.map +1 -0
  330. package/dist/layout/TmuxLayoutApplier.js +135 -0
  331. package/dist/layout/TmuxLayoutApplier.js.map +1 -0
  332. package/dist/panes/decorative-pane.d.ts +3 -0
  333. package/dist/panes/decorative-pane.d.ts.map +1 -0
  334. package/dist/panes/decorative-pane.js +136 -0
  335. package/dist/panes/decorative-pane.js.map +1 -0
  336. package/dist/panes/spacer-pane.d.ts +8 -0
  337. package/dist/panes/spacer-pane.d.ts.map +1 -0
  338. package/dist/panes/spacer-pane.js +40 -0
  339. package/dist/panes/spacer-pane.js.map +1 -0
  340. package/dist/server/embedded-assets.d.ts.map +1 -1
  341. package/dist/server/embedded-assets.js +849 -4752
  342. package/dist/server/embedded-assets.js.map +1 -1
  343. package/dist/server/index.js +1 -1
  344. package/dist/server/index.js.map +1 -1
  345. package/dist/server/routes/actionsRoutes.d.ts +2 -0
  346. package/dist/server/routes/actionsRoutes.d.ts.map +1 -0
  347. package/dist/server/routes/actionsRoutes.js +110 -0
  348. package/dist/server/routes/actionsRoutes.js.map +1 -0
  349. package/dist/server/routes/healthRoutes.d.ts +13 -0
  350. package/dist/server/routes/healthRoutes.d.ts.map +1 -0
  351. package/dist/server/routes/healthRoutes.js +70 -0
  352. package/dist/server/routes/healthRoutes.js.map +1 -0
  353. package/dist/server/routes/index.d.ts +8 -0
  354. package/dist/server/routes/index.d.ts.map +1 -0
  355. package/dist/server/routes/index.js +67 -0
  356. package/dist/server/routes/index.js.map +1 -0
  357. package/dist/server/routes/keysRoutes.d.ts +20 -0
  358. package/dist/server/routes/keysRoutes.d.ts.map +1 -0
  359. package/dist/server/routes/keysRoutes.js +111 -0
  360. package/dist/server/routes/keysRoutes.js.map +1 -0
  361. package/dist/server/routes/panesRoutes.d.ts +2 -0
  362. package/dist/server/routes/panesRoutes.d.ts.map +1 -0
  363. package/dist/server/routes/panesRoutes.js +373 -0
  364. package/dist/server/routes/panesRoutes.js.map +1 -0
  365. package/dist/server/routes/settingsRoutes.d.ts +94 -0
  366. package/dist/server/routes/settingsRoutes.d.ts.map +1 -0
  367. package/dist/server/routes/settingsRoutes.js +159 -0
  368. package/dist/server/routes/settingsRoutes.js.map +1 -0
  369. package/dist/server/routes/streamRoutes.d.ts +18 -0
  370. package/dist/server/routes/streamRoutes.d.ts.map +1 -0
  371. package/dist/server/routes/streamRoutes.js +87 -0
  372. package/dist/server/routes/streamRoutes.js.map +1 -0
  373. package/dist/server/routes/tunnelRoutes.d.ts +11 -0
  374. package/dist/server/routes/tunnelRoutes.d.ts.map +1 -0
  375. package/dist/server/routes/tunnelRoutes.js +28 -0
  376. package/dist/server/routes/tunnelRoutes.js.map +1 -0
  377. package/dist/server/routes.d.ts +16 -2
  378. package/dist/server/routes.d.ts.map +1 -1
  379. package/dist/server/routes.js +16 -811
  380. package/dist/server/routes.js.map +1 -1
  381. package/dist/{AutoUpdater.d.ts → services/AutoUpdater.d.ts} +1 -0
  382. package/dist/services/AutoUpdater.d.ts.map +1 -0
  383. package/dist/{AutoUpdater.js → services/AutoUpdater.js} +42 -9
  384. package/dist/services/AutoUpdater.js.map +1 -0
  385. package/dist/services/ConfigWatcher.d.ts.map +1 -1
  386. package/dist/services/ConfigWatcher.js +10 -3
  387. package/dist/services/ConfigWatcher.js.map +1 -1
  388. package/dist/services/LogService.d.ts +112 -0
  389. package/dist/services/LogService.d.ts.map +1 -0
  390. package/dist/services/LogService.js +252 -0
  391. package/dist/services/LogService.js.map +1 -0
  392. package/dist/services/PaneAnalyzer.d.ts.map +1 -0
  393. package/dist/{PaneAnalyzer.js → services/PaneAnalyzer.js} +1 -1
  394. package/dist/services/PaneAnalyzer.js.map +1 -0
  395. package/dist/services/PaneLifecycleManager.d.ts +60 -0
  396. package/dist/services/PaneLifecycleManager.d.ts.map +1 -0
  397. package/dist/services/PaneLifecycleManager.js +119 -0
  398. package/dist/services/PaneLifecycleManager.js.map +1 -0
  399. package/dist/services/PaneWorkerManager.d.ts.map +1 -1
  400. package/dist/services/PaneWorkerManager.js +41 -12
  401. package/dist/services/PaneWorkerManager.js.map +1 -1
  402. package/dist/services/PopupManager.d.ts +68 -0
  403. package/dist/services/PopupManager.d.ts.map +1 -0
  404. package/dist/services/PopupManager.js +415 -0
  405. package/dist/services/PopupManager.js.map +1 -0
  406. package/dist/services/StatusDetector.js +1 -1
  407. package/dist/services/StatusDetector.js.map +1 -1
  408. package/dist/services/TerminalStreamer.d.ts +1 -0
  409. package/dist/services/TerminalStreamer.d.ts.map +1 -1
  410. package/dist/services/TerminalStreamer.js +22 -16
  411. package/dist/services/TerminalStreamer.js.map +1 -1
  412. package/dist/services/TmuxService.d.ts +298 -0
  413. package/dist/services/TmuxService.d.ts.map +1 -0
  414. package/dist/services/TmuxService.js +768 -0
  415. package/dist/services/TmuxService.js.map +1 -0
  416. package/dist/services/TunnelService.d.ts +1 -0
  417. package/dist/services/TunnelService.d.ts.map +1 -1
  418. package/dist/services/TunnelService.js +57 -15
  419. package/dist/services/TunnelService.js.map +1 -1
  420. package/dist/shared/StateManager.d.ts +49 -1
  421. package/dist/shared/StateManager.d.ts.map +1 -1
  422. package/dist/shared/StateManager.js +97 -2
  423. package/dist/shared/StateManager.js.map +1 -1
  424. package/dist/theme/colors.d.ts +25 -0
  425. package/dist/theme/colors.d.ts.map +1 -0
  426. package/dist/theme/colors.js +33 -0
  427. package/dist/theme/colors.js.map +1 -0
  428. package/dist/types.d.ts +18 -0
  429. package/dist/types.d.ts.map +1 -1
  430. package/dist/utils/asciiArt.d.ts +26 -0
  431. package/dist/utils/asciiArt.d.ts.map +1 -0
  432. package/dist/utils/asciiArt.js +75 -0
  433. package/dist/utils/asciiArt.js.map +1 -0
  434. package/dist/utils/conflictMonitor.d.ts +20 -0
  435. package/dist/utils/conflictMonitor.d.ts.map +1 -0
  436. package/dist/utils/conflictMonitor.js +113 -0
  437. package/dist/utils/conflictMonitor.js.map +1 -0
  438. package/dist/utils/conflictResolutionPane.d.ts.map +1 -1
  439. package/dist/utils/conflictResolutionPane.js +75 -80
  440. package/dist/utils/conflictResolutionPane.js.map +1 -1
  441. package/dist/utils/errorHandling.d.ts +37 -0
  442. package/dist/utils/errorHandling.d.ts.map +1 -0
  443. package/dist/utils/errorHandling.js +112 -0
  444. package/dist/utils/errorHandling.js.map +1 -0
  445. package/dist/utils/fileScanner.d.ts +23 -0
  446. package/dist/utils/fileScanner.d.ts.map +1 -0
  447. package/dist/utils/fileScanner.js +123 -0
  448. package/dist/utils/fileScanner.js.map +1 -0
  449. package/dist/utils/generated-agents-doc.d.ts +1 -1
  450. package/dist/utils/generated-agents-doc.js +1 -1
  451. package/dist/utils/git.d.ts +4 -0
  452. package/dist/utils/git.d.ts.map +1 -1
  453. package/dist/utils/git.js +15 -0
  454. package/dist/utils/git.js.map +1 -1
  455. package/dist/utils/hooks.d.ts.map +1 -1
  456. package/dist/utils/hooks.js +65 -36
  457. package/dist/utils/hooks.js.map +1 -1
  458. package/dist/utils/hooksDocs.d.ts +1 -1
  459. package/dist/utils/layoutManager.d.ts +49 -0
  460. package/dist/utils/layoutManager.d.ts.map +1 -0
  461. package/dist/utils/layoutManager.js +249 -0
  462. package/dist/utils/layoutManager.js.map +1 -0
  463. package/dist/utils/mergeExecution.d.ts.map +1 -1
  464. package/dist/utils/mergeExecution.js +8 -1
  465. package/dist/utils/mergeExecution.js.map +1 -1
  466. package/dist/utils/mergeValidation.d.ts.map +1 -1
  467. package/dist/utils/mergeValidation.js +42 -13
  468. package/dist/utils/mergeValidation.js.map +1 -1
  469. package/dist/utils/paneCreation.d.ts.map +1 -1
  470. package/dist/utils/paneCreation.js +210 -88
  471. package/dist/utils/paneCreation.js.map +1 -1
  472. package/dist/utils/paneRebinding.d.ts +14 -0
  473. package/dist/utils/paneRebinding.d.ts.map +1 -0
  474. package/dist/utils/paneRebinding.js +28 -0
  475. package/dist/utils/paneRebinding.js.map +1 -0
  476. package/dist/utils/popup.d.ts +97 -0
  477. package/dist/utils/popup.d.ts.map +1 -0
  478. package/dist/utils/popup.js +503 -0
  479. package/dist/utils/popup.js.map +1 -0
  480. package/dist/utils/postPaneCleanup.d.ts +12 -0
  481. package/dist/utils/postPaneCleanup.d.ts.map +1 -0
  482. package/dist/utils/postPaneCleanup.js +54 -0
  483. package/dist/utils/postPaneCleanup.js.map +1 -0
  484. package/dist/utils/shellPaneDetection.d.ts +44 -0
  485. package/dist/utils/shellPaneDetection.d.ts.map +1 -0
  486. package/dist/utils/shellPaneDetection.js +179 -0
  487. package/dist/utils/shellPaneDetection.js.map +1 -0
  488. package/dist/utils/systemCheck.d.ts +19 -0
  489. package/dist/utils/systemCheck.d.ts.map +1 -0
  490. package/dist/utils/systemCheck.js +160 -0
  491. package/dist/utils/systemCheck.js.map +1 -0
  492. package/dist/utils/tmux.d.ts +72 -1
  493. package/dist/utils/tmux.d.ts.map +1 -1
  494. package/dist/utils/tmux.js +369 -99
  495. package/dist/utils/tmux.js.map +1 -1
  496. package/dist/utils/welcomePane.d.ts +22 -0
  497. package/dist/utils/welcomePane.d.ts.map +1 -0
  498. package/dist/utils/welcomePane.js +111 -0
  499. package/dist/utils/welcomePane.js.map +1 -0
  500. package/dist/utils/welcomePaneManager.d.ts +36 -0
  501. package/dist/utils/welcomePaneManager.d.ts.map +1 -0
  502. package/dist/utils/welcomePaneManager.js +160 -0
  503. package/dist/utils/welcomePaneManager.js.map +1 -0
  504. package/dist/workers/PaneWorker.js +8 -8
  505. package/dist/workers/PaneWorker.js.map +1 -1
  506. package/dist/workers/updateChecker.js +1 -1
  507. package/dist/workers/updateChecker.js.map +1 -1
  508. package/package.json +7 -2
  509. package/dist/AutoUpdater.d.ts.map +0 -1
  510. package/dist/AutoUpdater.js.map +0 -1
  511. package/dist/BetterTextInput.d.ts +0 -10
  512. package/dist/BetterTextInput.d.ts.map +0 -1
  513. package/dist/BetterTextInput.js +0 -177
  514. package/dist/BetterTextInput.js.map +0 -1
  515. package/dist/CleanTextInput.d.ts +0 -10
  516. package/dist/CleanTextInput.d.ts.map +0 -1
  517. package/dist/CleanTextInput.js.map +0 -1
  518. package/dist/EnhancedTextInput.d.ts +0 -13
  519. package/dist/EnhancedTextInput.d.ts.map +0 -1
  520. package/dist/EnhancedTextInput.js +0 -443
  521. package/dist/EnhancedTextInput.js.map +0 -1
  522. package/dist/GeminiTextInput.d.ts +0 -12
  523. package/dist/GeminiTextInput.d.ts.map +0 -1
  524. package/dist/GeminiTextInput.js +0 -210
  525. package/dist/GeminiTextInput.js.map +0 -1
  526. package/dist/MergePane.d.ts.map +0 -1
  527. package/dist/MergePane.js.map +0 -1
  528. package/dist/MultilineTextInput.d.ts +0 -10
  529. package/dist/MultilineTextInput.d.ts.map +0 -1
  530. package/dist/MultilineTextInput.js +0 -184
  531. package/dist/MultilineTextInput.js.map +0 -1
  532. package/dist/PaneAnalyzer.d.ts.map +0 -1
  533. package/dist/PaneAnalyzer.js.map +0 -1
  534. package/dist/SimpleEnhancedInput.d.ts +0 -13
  535. package/dist/SimpleEnhancedInput.d.ts.map +0 -1
  536. package/dist/SimpleEnhancedInput.js +0 -639
  537. package/dist/SimpleEnhancedInput.js.map +0 -1
  538. package/dist/SimpleGeminiInput.d.ts +0 -12
  539. package/dist/SimpleGeminiInput.d.ts.map +0 -1
  540. package/dist/SimpleGeminiInput.js +0 -223
  541. package/dist/SimpleGeminiInput.js.map +0 -1
  542. package/dist/StyledTextInput.d.ts.map +0 -1
  543. package/dist/StyledTextInput.js.map +0 -1
  544. package/dist/components/ActionChoiceDialog.d.ts.map +0 -1
  545. package/dist/components/ActionChoiceDialog.js.map +0 -1
  546. package/dist/components/ActionConfirmDialog.d.ts.map +0 -1
  547. package/dist/components/ActionConfirmDialog.js.map +0 -1
  548. package/dist/components/ActionInputDialog.d.ts.map +0 -1
  549. package/dist/components/ActionInputDialog.js.map +0 -1
  550. package/dist/components/ActionProgressDialog.d.ts.map +0 -1
  551. package/dist/components/ActionProgressDialog.js.map +0 -1
  552. package/dist/components/AgentChoiceDialog.d.ts.map +0 -1
  553. package/dist/components/AgentChoiceDialog.js.map +0 -1
  554. package/dist/components/CloseOptionsDialog.d.ts.map +0 -1
  555. package/dist/components/CloseOptionsDialog.js.map +0 -1
  556. package/dist/components/CommandPromptDialog.d.ts.map +0 -1
  557. package/dist/components/CommandPromptDialog.js.map +0 -1
  558. package/dist/components/CreatingIndicator.d.ts.map +0 -1
  559. package/dist/components/CreatingIndicator.js.map +0 -1
  560. package/dist/components/FileCopyPrompt.d.ts.map +0 -1
  561. package/dist/components/FileCopyPrompt.js.map +0 -1
  562. package/dist/components/FooterHelp.d.ts +0 -10
  563. package/dist/components/FooterHelp.d.ts.map +0 -1
  564. package/dist/components/FooterHelp.js +0 -19
  565. package/dist/components/FooterHelp.js.map +0 -1
  566. package/dist/components/HooksDialog.d.ts.map +0 -1
  567. package/dist/components/HooksDialog.js.map +0 -1
  568. package/dist/components/KebabMenu.d.ts.map +0 -1
  569. package/dist/components/KebabMenu.js.map +0 -1
  570. package/dist/components/LoadingIndicator.d.ts.map +0 -1
  571. package/dist/components/LoadingIndicator.js.map +0 -1
  572. package/dist/components/MergeConfirmationDialog.d.ts.map +0 -1
  573. package/dist/components/MergeConfirmationDialog.js.map +0 -1
  574. package/dist/components/NewPaneDialog.d.ts +0 -9
  575. package/dist/components/NewPaneDialog.d.ts.map +0 -1
  576. package/dist/components/NewPaneDialog.js +0 -11
  577. package/dist/components/NewPaneDialog.js.map +0 -1
  578. package/dist/components/PaneCard.d.ts.map +0 -1
  579. package/dist/components/PaneCard.js +0 -38
  580. package/dist/components/PaneCard.js.map +0 -1
  581. package/dist/components/PanesGrid.d.ts +0 -14
  582. package/dist/components/PanesGrid.d.ts.map +0 -1
  583. package/dist/components/PanesGrid.js +0 -19
  584. package/dist/components/PanesGrid.js.map +0 -1
  585. package/dist/components/QRCode.d.ts.map +0 -1
  586. package/dist/components/QRCode.js.map +0 -1
  587. package/dist/components/RunningIndicator.d.ts.map +0 -1
  588. package/dist/components/RunningIndicator.js.map +0 -1
  589. package/dist/components/SettingsDialog.d.ts.map +0 -1
  590. package/dist/components/SettingsDialog.js.map +0 -1
  591. package/dist/components/Spinner.d.ts.map +0 -1
  592. package/dist/components/Spinner.js.map +0 -1
  593. package/dist/components/UpdateDialog.d.ts.map +0 -1
  594. package/dist/components/UpdateDialog.js.map +0 -1
  595. package/dist/components/UpdatingIndicator.d.ts.map +0 -1
  596. package/dist/components/UpdatingIndicator.js.map +0 -1
  597. package/dist/server/static.d.ts +0 -6
  598. package/dist/server/static.d.ts.map +0 -1
  599. package/dist/server/static.js +0 -3040
  600. package/dist/server/static.js.map +0 -1
  601. /package/dist/components/{ActionChoiceDialog.js → dialogs/ActionChoiceDialog.js} +0 -0
  602. /package/dist/components/{ActionConfirmDialog.d.ts → dialogs/ActionConfirmDialog.d.ts} +0 -0
  603. /package/dist/components/{ActionConfirmDialog.js → dialogs/ActionConfirmDialog.js} +0 -0
  604. /package/dist/components/{ActionInputDialog.d.ts → dialogs/ActionInputDialog.d.ts} +0 -0
  605. /package/dist/components/{ActionProgressDialog.d.ts → dialogs/ActionProgressDialog.d.ts} +0 -0
  606. /package/dist/components/{ActionProgressDialog.js → dialogs/ActionProgressDialog.js} +0 -0
  607. /package/dist/components/{AgentChoiceDialog.d.ts → dialogs/AgentChoiceDialog.d.ts} +0 -0
  608. /package/dist/components/{AgentChoiceDialog.js → dialogs/AgentChoiceDialog.js} +0 -0
  609. /package/dist/components/{CloseOptionsDialog.js → dialogs/CloseOptionsDialog.js} +0 -0
  610. /package/dist/components/{CommandPromptDialog.d.ts → dialogs/CommandPromptDialog.d.ts} +0 -0
  611. /package/dist/components/{HooksDialog.d.ts → dialogs/HooksDialog.d.ts} +0 -0
  612. /package/dist/components/{HooksDialog.js → dialogs/HooksDialog.js} +0 -0
  613. /package/dist/components/{MergeConfirmationDialog.js → dialogs/MergeConfirmationDialog.js} +0 -0
  614. /package/dist/components/{SettingsDialog.js → dialogs/SettingsDialog.js} +0 -0
  615. /package/dist/components/{UpdateDialog.d.ts → dialogs/UpdateDialog.d.ts} +0 -0
  616. /package/dist/components/{UpdateDialog.js → dialogs/UpdateDialog.js} +0 -0
  617. /package/dist/components/{CreatingIndicator.d.ts → indicators/CreatingIndicator.d.ts} +0 -0
  618. /package/dist/components/{CreatingIndicator.js → indicators/CreatingIndicator.js} +0 -0
  619. /package/dist/components/{LoadingIndicator.d.ts → indicators/LoadingIndicator.d.ts} +0 -0
  620. /package/dist/components/{LoadingIndicator.js → indicators/LoadingIndicator.js} +0 -0
  621. /package/dist/components/{RunningIndicator.d.ts → indicators/RunningIndicator.d.ts} +0 -0
  622. /package/dist/components/{RunningIndicator.js → indicators/RunningIndicator.js} +0 -0
  623. /package/dist/components/{Spinner.d.ts → indicators/Spinner.d.ts} +0 -0
  624. /package/dist/components/{Spinner.js → indicators/Spinner.js} +0 -0
  625. /package/dist/components/{UpdatingIndicator.d.ts → indicators/UpdatingIndicator.d.ts} +0 -0
  626. /package/dist/components/{UpdatingIndicator.js → indicators/UpdatingIndicator.js} +0 -0
  627. /package/dist/{StyledTextInput.d.ts → components/inputs/StyledTextInput.d.ts} +0 -0
  628. /package/dist/{StyledTextInput.js → components/inputs/StyledTextInput.js} +0 -0
  629. /package/dist/components/{KebabMenu.js → panes/KebabMenu.js} +0 -0
  630. /package/dist/{MergePane.d.ts → components/panes/MergePane.d.ts} +0 -0
  631. /package/dist/components/{FileCopyPrompt.d.ts → ui/FileCopyPrompt.d.ts} +0 -0
  632. /package/dist/components/{FileCopyPrompt.js → ui/FileCopyPrompt.js} +0 -0
  633. /package/dist/components/{QRCode.d.ts → ui/QRCode.d.ts} +0 -0
  634. /package/dist/components/{QRCode.js → ui/QRCode.js} +0 -0
  635. /package/dist/{PaneAnalyzer.d.ts → services/PaneAnalyzer.d.ts} +0 -0
@@ -1,986 +1,9 @@
1
1
  /**
2
2
  * Standardized Pane Actions
3
3
  *
4
- * Core action implementations that work across all interfaces.
5
- * Each action returns a standardized ActionResult that interfaces can handle.
4
+ * Re-exports all action implementations from the implementations directory.
5
+ * This file maintains backward compatibility while actions are now split into separate files.
6
6
  */
7
- import { execSync } from 'child_process';
8
- import { StateManager } from '../shared/StateManager.js';
9
- import { triggerHook } from '../utils/hooks.js';
10
- /**
11
- * Generate commit message with timeout and error handling
12
- * Returns null if it fails, so caller can fall back to manual input
13
- */
14
- async function generateCommitMessageSafe(repoPath, timeoutMs = 15000) {
15
- try {
16
- const { generateCommitMessage } = await import('../utils/aiMerge.js');
17
- // Race between generation and timeout
18
- const result = await Promise.race([
19
- generateCommitMessage(repoPath),
20
- new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), timeoutMs)),
21
- ]);
22
- if (!result) {
23
- StateManager.getInstance().setDebugMessage('[AI] Commit message generation returned null');
24
- }
25
- return result;
26
- }
27
- catch (error) {
28
- StateManager.getInstance().setDebugMessage(`[AI] Commit message generation error: ${error}`);
29
- return null;
30
- }
31
- }
32
- /**
33
- * View/Jump to a pane
34
- */
35
- export async function viewPane(pane, context) {
36
- try {
37
- execSync(`tmux select-pane -t '${pane.paneId}'`, { stdio: 'pipe' });
38
- return {
39
- type: 'navigation',
40
- message: `Jumped to pane: ${pane.slug}`,
41
- targetPaneId: pane.id,
42
- dismissable: true,
43
- };
44
- }
45
- catch (error) {
46
- return {
47
- type: 'error',
48
- message: 'Failed to jump to pane - it may have been closed',
49
- dismissable: true,
50
- };
51
- }
52
- }
53
- /**
54
- * Close a pane - presents options for how to close
55
- */
56
- export async function closePane(pane, context) {
57
- const options = [
58
- {
59
- id: 'kill_only',
60
- label: 'Just close pane',
61
- description: 'Keep worktree and branch',
62
- default: true,
63
- },
64
- ];
65
- if (pane.worktreePath) {
66
- options.push({
67
- id: 'kill_and_clean',
68
- label: 'Close and remove worktree',
69
- description: 'Delete worktree but keep branch',
70
- danger: true,
71
- }, {
72
- id: 'kill_clean_branch',
73
- label: 'Close and delete everything',
74
- description: 'Remove worktree and delete branch',
75
- danger: true,
76
- });
77
- }
78
- return {
79
- type: 'choice',
80
- title: 'Close Pane',
81
- message: `How do you want to close "${pane.slug}"?`,
82
- options,
83
- onSelect: async (optionId) => {
84
- return executeCloseOption(pane, context, optionId);
85
- },
86
- dismissable: true,
87
- };
88
- }
89
- /**
90
- * Execute the selected close option
91
- */
92
- async function executeCloseOption(pane, context, option) {
93
- try {
94
- // Get project root for hooks
95
- const state = StateManager.getInstance().getState();
96
- const projectRoot = state.projectRoot || process.cwd();
97
- // Trigger before_pane_close hook
98
- await triggerHook('before_pane_close', projectRoot, pane);
99
- // CRITICAL: Pause ConfigWatcher to prevent race condition where
100
- // the watcher reloads the pane list from disk before our save completes
101
- StateManager.getInstance().pauseConfigWatcher();
102
- try {
103
- // Kill the tmux pane
104
- try {
105
- execSync(`tmux kill-pane -t '${pane.paneId}'`, { stdio: 'pipe' });
106
- }
107
- catch {
108
- // Pane might already be dead
109
- }
110
- // Handle worktree cleanup based on option
111
- if (pane.worktreePath && (option === 'kill_and_clean' || option === 'kill_clean_branch')) {
112
- const mainRepoPath = pane.worktreePath.replace(/\/\.dmux\/worktrees\/[^/]+$/, '');
113
- // Trigger before_worktree_remove hook
114
- await triggerHook('before_worktree_remove', projectRoot, pane);
115
- try {
116
- execSync(`git worktree remove "${pane.worktreePath}" --force`, {
117
- stdio: 'pipe',
118
- cwd: mainRepoPath,
119
- });
120
- }
121
- catch {
122
- // Worktree might already be removed
123
- }
124
- // Trigger worktree_removed hook
125
- await triggerHook('worktree_removed', projectRoot, pane);
126
- // Delete branch if requested
127
- if (option === 'kill_clean_branch') {
128
- try {
129
- execSync(`git branch -D ${pane.slug}`, {
130
- stdio: 'pipe',
131
- cwd: mainRepoPath,
132
- });
133
- }
134
- catch {
135
- // Branch might not exist or already deleted
136
- }
137
- }
138
- }
139
- // Remove from panes list
140
- const updatedPanes = context.panes.filter(p => p.id !== pane.id);
141
- await context.savePanes(updatedPanes);
142
- if (context.onPaneRemove) {
143
- context.onPaneRemove(pane.id);
144
- }
145
- // Wait a bit for the file save to stabilize
146
- await new Promise(resolve => setTimeout(resolve, 200));
147
- // CRITICAL: Aggressively clear terminal BEFORE returning success
148
- // This prevents artifacts when Ink re-renders the status message
149
- try {
150
- // Clear screen with ANSI codes
151
- process.stdout.write('\x1b[2J\x1b[3J\x1b[H');
152
- // Clear tmux history and scrollback
153
- execSync('tmux clear-history', { stdio: 'pipe' });
154
- // Force tmux client refresh
155
- execSync('tmux refresh-client', { stdio: 'pipe' });
156
- }
157
- catch {
158
- // Ignore clearing errors
159
- }
160
- // Trigger pane_closed hook (after everything is cleaned up)
161
- await triggerHook('pane_closed', projectRoot, pane);
162
- return {
163
- type: 'success',
164
- message: `Pane "${pane.slug}" closed successfully`,
165
- dismissable: true,
166
- };
167
- }
168
- finally {
169
- // CRITICAL: Always resume watcher, even if there was an error
170
- StateManager.getInstance().resumeConfigWatcher();
171
- }
172
- }
173
- catch (error) {
174
- // Clear before showing error too
175
- try {
176
- process.stdout.write('\x1b[2J\x1b[3J\x1b[H');
177
- execSync('tmux clear-history', { stdio: 'pipe' });
178
- execSync('tmux refresh-client', { stdio: 'pipe' });
179
- }
180
- catch { }
181
- return {
182
- type: 'error',
183
- message: `Failed to close pane: ${error}`,
184
- dismissable: true,
185
- };
186
- }
187
- }
188
- /**
189
- * Merge a worktree into the main branch with comprehensive pre-checks
190
- */
191
- export async function mergePane(pane, context, params) {
192
- if (!pane.worktreePath) {
193
- return {
194
- type: 'error',
195
- message: 'This pane has no worktree to merge',
196
- dismissable: true,
197
- };
198
- }
199
- // Import merge utilities dynamically
200
- const { validateMerge } = await import('../utils/mergeValidation.js');
201
- const mainRepoPath = pane.worktreePath.replace(/\/\.dmux\/worktrees\/[^/]+$/, '');
202
- // Run pre-merge validation
203
- const validation = validateMerge(mainRepoPath, pane.worktreePath, pane.slug);
204
- // If there are issues, present them to the user
205
- if (!validation.canMerge) {
206
- return handleMergeIssues(pane, context, validation, mainRepoPath);
207
- }
208
- // No issues detected, proceed with merge confirmation
209
- return {
210
- type: 'confirm',
211
- title: 'Merge Worktree',
212
- message: `Merge "${pane.slug}" into ${validation.mainBranch}?`,
213
- confirmLabel: 'Merge',
214
- cancelLabel: 'Cancel',
215
- onConfirm: async () => {
216
- // Trigger pre_merge hook before starting merge
217
- await triggerHook('pre_merge', mainRepoPath, pane, {
218
- DMUX_TARGET_BRANCH: validation.mainBranch,
219
- });
220
- return executeMerge(pane, context, validation.mainBranch, mainRepoPath);
221
- },
222
- onCancel: async () => {
223
- return {
224
- type: 'info',
225
- message: 'Merge cancelled',
226
- dismissable: true,
227
- };
228
- },
229
- };
230
- }
231
- /**
232
- * Handle detected merge issues
233
- */
234
- async function handleMergeIssues(pane, context, validation, mainRepoPath) {
235
- const { issues, mainBranch } = validation;
236
- const { commitChanges, stashChanges } = await import('../utils/mergeValidation.js');
237
- const { generateCommitMessage } = await import('../utils/aiMerge.js');
238
- // Group issues by type for clearer handling
239
- const mainDirty = issues.find((i) => i.type === 'main_dirty');
240
- const worktreeUncommitted = issues.find((i) => i.type === 'worktree_uncommitted');
241
- const mergeConflict = issues.find((i) => i.type === 'merge_conflict');
242
- const nothingToMerge = issues.find((i) => i.type === 'nothing_to_merge');
243
- // Handle "nothing to merge" case
244
- if (nothingToMerge) {
245
- return {
246
- type: 'info',
247
- message: 'No new commits to merge',
248
- dismissable: true,
249
- };
250
- }
251
- // Handle main branch dirty
252
- if (mainDirty) {
253
- return {
254
- type: 'choice',
255
- title: 'Main Branch Has Uncommitted Changes',
256
- message: `${mainBranch} has uncommitted changes in:\n${mainDirty.files.slice(0, 5).join('\n')}${mainDirty.files.length > 5 ? '\n...' : ''}`,
257
- options: [
258
- {
259
- id: 'commit_automatic',
260
- label: 'AI commit (automatic)',
261
- description: 'Auto-generate and commit immediately',
262
- default: true,
263
- },
264
- {
265
- id: 'commit_ai_editable',
266
- label: 'AI commit (editable)',
267
- description: 'Generate message from diff, edit before commit',
268
- },
269
- {
270
- id: 'commit_manual',
271
- label: 'Manual commit message',
272
- description: 'Write your own commit message',
273
- },
274
- {
275
- id: 'stash_main',
276
- label: 'Stash changes in main',
277
- description: 'Temporarily stash uncommitted changes',
278
- },
279
- {
280
- id: 'cancel',
281
- label: 'Cancel merge',
282
- description: 'Resolve manually later',
283
- },
284
- ],
285
- onSelect: async (optionId) => {
286
- if (optionId === 'cancel') {
287
- return { type: 'info', message: 'Merge cancelled', dismissable: true };
288
- }
289
- if (optionId === 'stash_main') {
290
- const result = stashChanges(mainRepoPath);
291
- if (!result.success) {
292
- return { type: 'error', message: `Stash failed: ${result.error}`, dismissable: true };
293
- }
294
- // Retry merge after stashing
295
- return mergePane(pane, context, { mainBranch });
296
- }
297
- if (optionId === 'commit_ai_editable') {
298
- try {
299
- const { stageAllChanges } = await import('../utils/mergeValidation.js');
300
- const { getComprehensiveDiff } = await import('../utils/aiMerge.js');
301
- // Stage all changes first
302
- const stageResult = stageAllChanges(mainRepoPath);
303
- if (!stageResult.success) {
304
- return { type: 'error', message: `Failed to stage changes: ${stageResult.error}`, dismissable: true };
305
- }
306
- // Get diff and generate message
307
- const { diff, summary } = getComprehensiveDiff(mainRepoPath);
308
- StateManager.getInstance().setDebugMessage('[AI] Generating commit message for main repo...');
309
- const generatedMessage = await generateCommitMessageSafe(mainRepoPath);
310
- if (generatedMessage) {
311
- StateManager.getInstance().setDebugMessage(`[AI] Generated message: ${generatedMessage.split('\n')[0]}`);
312
- }
313
- // If AI generation failed, fall back to manual with explanation
314
- if (!generatedMessage) {
315
- StateManager.getInstance().setDebugMessage('[AI] Generation failed, falling back to manual input');
316
- return {
317
- type: 'input',
318
- title: 'Enter Commit Message',
319
- message: `⚠️ Auto-generation failed or timed out. Please write a commit message manually.\n\nFiles changed:\n${summary}`,
320
- placeholder: 'feat: add new feature',
321
- onSubmit: async (message) => {
322
- if (!message || !message.trim()) {
323
- return { type: 'error', message: 'Commit message cannot be empty', dismissable: true };
324
- }
325
- const result = commitChanges(mainRepoPath, message.trim());
326
- if (!result.success) {
327
- return { type: 'error', message: `Commit failed: ${result.error}`, dismissable: true };
328
- }
329
- // Retry merge after committing
330
- return mergePane(pane, context, { mainBranch });
331
- },
332
- dismissable: true,
333
- };
334
- }
335
- return {
336
- type: 'input',
337
- title: 'Review & Edit Commit Message',
338
- message: `Files changed:\n${summary}\n\nGenerated message (edit as needed):`,
339
- placeholder: 'feat: add new feature',
340
- defaultValue: generatedMessage,
341
- onSubmit: async (message) => {
342
- if (!message || !message.trim()) {
343
- return { type: 'error', message: 'Commit message cannot be empty', dismissable: true };
344
- }
345
- const result = commitChanges(mainRepoPath, message.trim());
346
- if (!result.success) {
347
- return { type: 'error', message: `Commit failed: ${result.error}`, dismissable: true };
348
- }
349
- // Retry merge after committing
350
- return mergePane(pane, context, { mainBranch });
351
- },
352
- dismissable: true,
353
- };
354
- }
355
- catch (error) {
356
- StateManager.getInstance().setDebugMessage(`[AI] Unexpected error: ${error}`);
357
- return {
358
- type: 'error',
359
- message: `Unexpected error: ${error instanceof Error ? error.message : String(error)}`,
360
- dismissable: true,
361
- };
362
- }
363
- }
364
- if (optionId === 'commit_automatic') {
365
- const { stageAllChanges } = await import('../utils/mergeValidation.js');
366
- const { getComprehensiveDiff } = await import('../utils/aiMerge.js');
367
- // Stage all changes first
368
- const stageResult = stageAllChanges(mainRepoPath);
369
- if (!stageResult.success) {
370
- return { type: 'error', message: `Failed to stage changes: ${stageResult.error}`, dismissable: true };
371
- }
372
- // Generate commit message
373
- const message = await generateCommitMessageSafe(mainRepoPath);
374
- // If AI generation failed, fall back to manual input
375
- if (!message) {
376
- const { summary } = getComprehensiveDiff(mainRepoPath);
377
- return {
378
- type: 'input',
379
- title: 'Enter Commit Message',
380
- message: `⚠️ Auto-generation failed or timed out. Please write a commit message manually.\n\nFiles changed:\n${summary}`,
381
- placeholder: 'feat: add new feature',
382
- onSubmit: async (manualMessage) => {
383
- if (!manualMessage || !manualMessage.trim()) {
384
- return { type: 'error', message: 'Commit message cannot be empty', dismissable: true };
385
- }
386
- const result = commitChanges(mainRepoPath, manualMessage.trim());
387
- if (!result.success) {
388
- return { type: 'error', message: `Commit failed: ${result.error}`, dismissable: true };
389
- }
390
- // Retry merge after committing
391
- return mergePane(pane, context, { mainBranch });
392
- },
393
- dismissable: true,
394
- };
395
- }
396
- const result = commitChanges(mainRepoPath, message);
397
- if (!result.success) {
398
- return { type: 'error', message: `Commit failed: ${result.error}`, dismissable: true };
399
- }
400
- // Retry merge after committing
401
- return mergePane(pane, context, { mainBranch });
402
- }
403
- if (optionId === 'commit_manual') {
404
- const { stageAllChanges } = await import('../utils/mergeValidation.js');
405
- // Stage all changes first
406
- const stageResult = stageAllChanges(mainRepoPath);
407
- if (!stageResult.success) {
408
- return { type: 'error', message: `Failed to stage changes: ${stageResult.error}`, dismissable: true };
409
- }
410
- return {
411
- type: 'input',
412
- title: 'Enter Commit Message',
413
- message: 'Write a commit message for the changes in main:',
414
- placeholder: 'feat: add new feature',
415
- onSubmit: async (message) => {
416
- if (!message || !message.trim()) {
417
- return { type: 'error', message: 'Commit message cannot be empty', dismissable: true };
418
- }
419
- const result = commitChanges(mainRepoPath, message.trim());
420
- if (!result.success) {
421
- return { type: 'error', message: `Commit failed: ${result.error}`, dismissable: true };
422
- }
423
- // Retry merge after committing
424
- return mergePane(pane, context, { mainBranch });
425
- },
426
- dismissable: true,
427
- };
428
- }
429
- return { type: 'info', message: 'Unknown option', dismissable: true };
430
- },
431
- dismissable: true,
432
- };
433
- }
434
- // Handle worktree uncommitted changes
435
- if (worktreeUncommitted) {
436
- return {
437
- type: 'choice',
438
- title: 'Worktree Has Uncommitted Changes',
439
- message: `Changes in:\n${worktreeUncommitted.files.slice(0, 5).join('\n')}${worktreeUncommitted.files.length > 5 ? '\n...' : ''}`,
440
- options: [
441
- {
442
- id: 'commit_automatic',
443
- label: 'AI commit (automatic)',
444
- description: 'Auto-generate and commit immediately',
445
- default: true,
446
- },
447
- {
448
- id: 'commit_ai_editable',
449
- label: 'AI commit (editable)',
450
- description: 'Generate message from diff, edit before commit',
451
- },
452
- {
453
- id: 'commit_manual',
454
- label: 'Manual commit message',
455
- description: 'Write your own commit message',
456
- },
457
- {
458
- id: 'cancel',
459
- label: 'Cancel merge',
460
- description: 'Resolve manually later',
461
- },
462
- ],
463
- onSelect: async (optionId) => {
464
- if (optionId === 'cancel') {
465
- return { type: 'info', message: 'Merge cancelled', dismissable: true };
466
- }
467
- if (optionId === 'commit_ai_editable') {
468
- try {
469
- const { stageAllChanges } = await import('../utils/mergeValidation.js');
470
- const { getComprehensiveDiff } = await import('../utils/aiMerge.js');
471
- // Stage all changes first
472
- const stageResult = stageAllChanges(pane.worktreePath);
473
- if (!stageResult.success) {
474
- return { type: 'error', message: `Failed to stage changes: ${stageResult.error}`, dismissable: true };
475
- }
476
- // Get diff and generate message
477
- const { diff, summary } = getComprehensiveDiff(pane.worktreePath);
478
- StateManager.getInstance().setDebugMessage('[AI] Generating commit message for worktree...');
479
- const generatedMessage = await generateCommitMessageSafe(pane.worktreePath);
480
- if (generatedMessage) {
481
- StateManager.getInstance().setDebugMessage(`[AI] Generated message: ${generatedMessage.split('\n')[0]}`);
482
- }
483
- // If AI generation failed, fall back to manual with explanation
484
- if (!generatedMessage) {
485
- StateManager.getInstance().setDebugMessage('[AI] Generation failed, falling back to manual input');
486
- return {
487
- type: 'input',
488
- title: 'Enter Commit Message',
489
- message: `⚠️ Auto-generation failed or timed out. Please write a commit message manually.\n\nFiles changed:\n${summary}`,
490
- placeholder: 'feat: add new feature',
491
- onSubmit: async (message) => {
492
- if (!message || !message.trim()) {
493
- return { type: 'error', message: 'Commit message cannot be empty', dismissable: true };
494
- }
495
- const result = commitChanges(pane.worktreePath, message.trim());
496
- if (!result.success) {
497
- return { type: 'error', message: `Commit failed: ${result.error}`, dismissable: true };
498
- }
499
- // Retry merge after committing
500
- return mergePane(pane, context, { mainBranch });
501
- },
502
- dismissable: true,
503
- };
504
- }
505
- return {
506
- type: 'input',
507
- title: 'Review & Edit Commit Message',
508
- message: `Files changed:\n${summary}\n\nGenerated message (edit as needed):`,
509
- placeholder: 'feat: add new feature',
510
- defaultValue: generatedMessage,
511
- onSubmit: async (message) => {
512
- if (!message || !message.trim()) {
513
- return { type: 'error', message: 'Commit message cannot be empty', dismissable: true };
514
- }
515
- const result = commitChanges(pane.worktreePath, message.trim());
516
- if (!result.success) {
517
- return { type: 'error', message: `Commit failed: ${result.error}`, dismissable: true };
518
- }
519
- // Retry merge after committing
520
- return mergePane(pane, context, { mainBranch });
521
- },
522
- dismissable: true,
523
- };
524
- }
525
- catch (error) {
526
- StateManager.getInstance().setDebugMessage(`[AI] Unexpected error: ${error}`);
527
- return {
528
- type: 'error',
529
- message: `Unexpected error: ${error instanceof Error ? error.message : String(error)}`,
530
- dismissable: true,
531
- };
532
- }
533
- }
534
- if (optionId === 'commit_automatic') {
535
- const { stageAllChanges } = await import('../utils/mergeValidation.js');
536
- const { getComprehensiveDiff } = await import('../utils/aiMerge.js');
537
- // Stage all changes first
538
- const stageResult = stageAllChanges(pane.worktreePath);
539
- if (!stageResult.success) {
540
- return { type: 'error', message: `Failed to stage changes: ${stageResult.error}`, dismissable: true };
541
- }
542
- const message = await generateCommitMessageSafe(pane.worktreePath);
543
- // If AI generation failed, fall back to manual input
544
- if (!message) {
545
- const { summary } = getComprehensiveDiff(pane.worktreePath);
546
- return {
547
- type: 'input',
548
- title: 'Enter Commit Message',
549
- message: `⚠️ Auto-generation failed or timed out. Please write a commit message manually.\n\nFiles changed:\n${summary}`,
550
- placeholder: 'feat: add new feature',
551
- onSubmit: async (manualMessage) => {
552
- if (!manualMessage || !manualMessage.trim()) {
553
- return { type: 'error', message: 'Commit message cannot be empty', dismissable: true };
554
- }
555
- const result = commitChanges(pane.worktreePath, manualMessage.trim());
556
- if (!result.success) {
557
- return { type: 'error', message: `Commit failed: ${result.error}`, dismissable: true };
558
- }
559
- // Retry merge after committing
560
- return mergePane(pane, context, { mainBranch });
561
- },
562
- dismissable: true,
563
- };
564
- }
565
- const result = commitChanges(pane.worktreePath, message);
566
- if (!result.success) {
567
- return { type: 'error', message: `Commit failed: ${result.error}`, dismissable: true };
568
- }
569
- // Retry merge after committing
570
- return mergePane(pane, context, { mainBranch });
571
- }
572
- if (optionId === 'commit_manual') {
573
- const { stageAllChanges } = await import('../utils/mergeValidation.js');
574
- // Stage all changes first
575
- const stageResult = stageAllChanges(pane.worktreePath);
576
- if (!stageResult.success) {
577
- return { type: 'error', message: `Failed to stage changes: ${stageResult.error}`, dismissable: true };
578
- }
579
- return {
580
- type: 'input',
581
- title: 'Enter Commit Message',
582
- message: 'Write a commit message for the changes:',
583
- placeholder: 'feat: add new feature',
584
- onSubmit: async (message) => {
585
- if (!message || !message.trim()) {
586
- return { type: 'error', message: 'Commit message cannot be empty', dismissable: true };
587
- }
588
- const result = commitChanges(pane.worktreePath, message.trim());
589
- if (!result.success) {
590
- return { type: 'error', message: `Commit failed: ${result.error}`, dismissable: true };
591
- }
592
- // Retry merge after committing
593
- return mergePane(pane, context, { mainBranch });
594
- },
595
- dismissable: true,
596
- };
597
- }
598
- return { type: 'info', message: 'Unknown option', dismissable: true };
599
- },
600
- dismissable: true,
601
- };
602
- }
603
- // Handle merge conflicts
604
- if (mergeConflict) {
605
- return {
606
- type: 'choice',
607
- title: 'Merge Conflicts Detected',
608
- message: `Conflicts will occur in:\n${mergeConflict.files.slice(0, 5).join('\n')}${mergeConflict.files.length > 5 ? '\n...' : ''}`,
609
- options: [
610
- {
611
- id: 'ai_merge',
612
- label: 'Try AI-assisted merge',
613
- description: 'Let AI intelligently combine both versions',
614
- default: true,
615
- },
616
- {
617
- id: 'manual_merge',
618
- label: 'Manual resolution',
619
- description: 'Jump to pane to resolve conflicts',
620
- },
621
- {
622
- id: 'cancel',
623
- label: 'Cancel merge',
624
- description: 'Do nothing',
625
- },
626
- ],
627
- onSelect: async (optionId) => {
628
- if (optionId === 'cancel') {
629
- return { type: 'info', message: 'Merge cancelled', dismissable: true };
630
- }
631
- if (optionId === 'manual_merge') {
632
- // Start the merge process and let user resolve manually
633
- return executeMergeWithConflictHandling(pane, context, mainBranch, mainRepoPath, 'manual');
634
- }
635
- if (optionId === 'ai_merge') {
636
- // Attempt AI-assisted merge via new pane
637
- return createConflictResolutionPaneForMerge(pane, context, mainBranch, mainRepoPath);
638
- }
639
- return { type: 'info', message: 'Unknown option', dismissable: true };
640
- },
641
- dismissable: true,
642
- };
643
- }
644
- // Generic issue display
645
- return {
646
- type: 'error',
647
- title: 'Merge Issues Detected',
648
- message: issues.map((i) => i.message).join('\n'),
649
- dismissable: true,
650
- };
651
- }
652
- /**
653
- * Create a new pane for AI-assisted conflict resolution
654
- */
655
- async function createConflictResolutionPaneForMerge(pane, context, targetBranch, targetRepoPath) {
656
- // First, check which agents are available
657
- const { findClaudeCommand, findOpencodeCommand } = await import('../utils/agentDetection.js');
658
- const availableAgents = [];
659
- if (await findClaudeCommand())
660
- availableAgents.push('claude');
661
- if (await findOpencodeCommand())
662
- availableAgents.push('opencode');
663
- if (availableAgents.length === 0) {
664
- return {
665
- type: 'error',
666
- message: 'No AI agents available. Please install claude or opencode.',
667
- dismissable: true,
668
- };
669
- }
670
- // If multiple agents available, ask user to choose
671
- if (availableAgents.length > 1) {
672
- return {
673
- type: 'choice',
674
- title: 'Choose AI Agent for Conflict Resolution',
675
- message: 'Which agent would you like to use to resolve merge conflicts?',
676
- options: availableAgents.map(agent => ({
677
- id: agent,
678
- label: agent === 'claude' ? 'Claude Code' : 'OpenCode',
679
- description: agent === 'claude' ? 'Anthropic Claude' : 'Open-source alternative',
680
- default: agent === 'claude',
681
- })),
682
- onSelect: async (agentId) => {
683
- return createAndLaunchConflictPane(pane, context, targetBranch, targetRepoPath, agentId);
684
- },
685
- dismissable: true,
686
- };
687
- }
688
- // Only one agent available, use it directly
689
- return createAndLaunchConflictPane(pane, context, targetBranch, targetRepoPath, availableAgents[0]);
690
- }
691
- /**
692
- * Actually create and launch the conflict resolution pane
693
- */
694
- async function createAndLaunchConflictPane(pane, context, targetBranch, targetRepoPath, agent) {
695
- try {
696
- const { createConflictResolutionPane } = await import('../utils/conflictResolutionPane.js');
697
- // Create the new pane
698
- const conflictPane = await createConflictResolutionPane({
699
- sourceBranch: pane.slug,
700
- targetBranch,
701
- targetRepoPath,
702
- agent,
703
- projectName: context.projectName,
704
- existingPanes: context.panes,
705
- });
706
- // Add the new pane to the panes list
707
- const updatedPanes = [...context.panes, conflictPane];
708
- await context.savePanes(updatedPanes);
709
- // Notify about the new pane
710
- if (context.onPaneUpdate) {
711
- context.onPaneUpdate(conflictPane);
712
- }
713
- return {
714
- type: 'navigation',
715
- title: 'Conflict Resolution Pane Created',
716
- message: `Created pane "${conflictPane.slug}" with ${agent} to help resolve conflicts. Switch to it to see the AI working.`,
717
- targetPaneId: conflictPane.id,
718
- dismissable: true,
719
- };
720
- }
721
- catch (error) {
722
- return {
723
- type: 'error',
724
- message: `Failed to create conflict resolution pane: ${error instanceof Error ? error.message : String(error)}`,
725
- dismissable: true,
726
- };
727
- }
728
- }
729
- /**
730
- * Execute merge with conflict handling
731
- */
732
- async function executeMergeWithConflictHandling(pane, context, mainBranch, mainRepoPath, strategy) {
733
- const { mergeMainIntoWorktree, getConflictingFiles, completeMerge } = await import('../utils/mergeExecution.js');
734
- // Step 1: Merge main into worktree
735
- const result = mergeMainIntoWorktree(pane.worktreePath, mainBranch);
736
- if (!result.success && result.needsManualResolution) {
737
- if (strategy === 'ai') {
738
- // Try AI resolution
739
- const { aiResolveAllConflicts } = await import('../utils/aiMerge.js');
740
- const aiResult = await aiResolveAllConflicts(pane.worktreePath, result.conflictFiles || []);
741
- if (aiResult.success) {
742
- // AI resolved all conflicts, complete the merge
743
- const completeResult = completeMerge(pane.worktreePath, 'Merge with AI-resolved conflicts');
744
- if (completeResult.success) {
745
- // Continue with the second phase of merge
746
- return executeMerge(pane, context, mainBranch, mainRepoPath);
747
- }
748
- else {
749
- return {
750
- type: 'error',
751
- message: `Failed to complete merge: ${completeResult.error}`,
752
- dismissable: true,
753
- };
754
- }
755
- }
756
- else {
757
- // AI couldn't resolve, fall back to manual
758
- return {
759
- type: 'error',
760
- title: 'AI Merge Failed',
761
- message: `AI couldn't resolve conflicts in: ${aiResult.failedFiles.join(', ')}.\nPlease resolve manually.`,
762
- dismissable: true,
763
- };
764
- }
765
- }
766
- else {
767
- // Manual resolution - jump to pane
768
- return {
769
- type: 'navigation',
770
- title: 'Manual Conflict Resolution',
771
- message: `Conflicts in: ${result.conflictFiles?.join(', ')}.\nResolve in the pane, then try merge again.`,
772
- targetPaneId: pane.id,
773
- dismissable: true,
774
- };
775
- }
776
- }
777
- if (!result.success) {
778
- return {
779
- type: 'error',
780
- message: `Merge failed: ${result.error}`,
781
- dismissable: true,
782
- };
783
- }
784
- // No conflicts, proceed with the main merge
785
- return executeMerge(pane, context, mainBranch, mainRepoPath);
786
- }
787
- /**
788
- * Execute the actual merge operation (called after all pre-checks pass)
789
- */
790
- async function executeMerge(pane, context, mainBranch, mainRepoPath) {
791
- const { mergeWorktreeIntoMain, cleanupAfterMerge } = await import('../utils/mergeExecution.js');
792
- // Step 2: Merge worktree into main
793
- const result = mergeWorktreeIntoMain(mainRepoPath, pane.slug);
794
- if (!result.success) {
795
- return {
796
- type: 'error',
797
- title: 'Merge Failed',
798
- message: `Failed to merge into ${mainBranch}: ${result.error}`,
799
- dismissable: true,
800
- };
801
- }
802
- // Trigger post_merge hook after successful merge
803
- await triggerHook('post_merge', mainRepoPath, pane, {
804
- DMUX_TARGET_BRANCH: mainBranch,
805
- });
806
- // Merge successful! Ask about cleanup
807
- return {
808
- type: 'confirm',
809
- title: 'Merge Complete',
810
- message: `Successfully merged "${pane.slug}" into ${mainBranch}. Close the pane and cleanup worktree?`,
811
- confirmLabel: 'Yes, close it',
812
- cancelLabel: 'No, keep it',
813
- onConfirm: async () => {
814
- // Cleanup worktree and branch
815
- const cleanup = cleanupAfterMerge(mainRepoPath, pane.worktreePath, pane.slug);
816
- if (!cleanup.success) {
817
- return {
818
- type: 'error',
819
- message: `Merge succeeded but cleanup failed: ${cleanup.error}`,
820
- dismissable: true,
821
- };
822
- }
823
- // Close the pane
824
- return executeCloseOption(pane, context, 'kill_only');
825
- },
826
- onCancel: async () => {
827
- return {
828
- type: 'success',
829
- message: 'Merge complete. Pane kept open.',
830
- dismissable: true,
831
- };
832
- },
833
- };
834
- }
835
- /**
836
- * Rename a pane
837
- */
838
- export async function renamePane(pane, context) {
839
- return {
840
- type: 'input',
841
- title: 'Rename Pane',
842
- message: 'Enter new name for pane:',
843
- placeholder: pane.slug,
844
- defaultValue: pane.slug,
845
- onSubmit: async (value) => {
846
- if (!value || value === pane.slug) {
847
- return {
848
- type: 'info',
849
- message: 'Rename cancelled',
850
- dismissable: true,
851
- };
852
- }
853
- // Update pane name
854
- const updatedPane = {
855
- ...pane,
856
- slug: value,
857
- };
858
- // Update tmux pane title
859
- try {
860
- execSync(`tmux select-pane -t '${pane.paneId}' -T "${value}"`, { stdio: 'pipe' });
861
- }
862
- catch {
863
- // Ignore if title update fails
864
- }
865
- // Update in panes list
866
- const updatedPanes = context.panes.map(p => p.id === pane.id ? updatedPane : p);
867
- await context.savePanes(updatedPanes);
868
- if (context.onPaneUpdate) {
869
- context.onPaneUpdate(updatedPane);
870
- }
871
- return {
872
- type: 'success',
873
- message: `Renamed to "${value}"`,
874
- dismissable: true,
875
- };
876
- },
877
- };
878
- }
879
- /**
880
- * Copy worktree path to clipboard
881
- */
882
- export async function copyPath(pane, context) {
883
- if (!pane.worktreePath) {
884
- return {
885
- type: 'error',
886
- message: 'This pane has no worktree path',
887
- dismissable: true,
888
- };
889
- }
890
- try {
891
- // Try to copy to clipboard (works on macOS)
892
- execSync(`echo "${pane.worktreePath}" | pbcopy`, { stdio: 'pipe' });
893
- return {
894
- type: 'success',
895
- message: `Path copied: ${pane.worktreePath}`,
896
- dismissable: true,
897
- };
898
- }
899
- catch {
900
- // If clipboard copy fails, just show the path
901
- return {
902
- type: 'info',
903
- message: `Path: ${pane.worktreePath}`,
904
- dismissable: true,
905
- };
906
- }
907
- }
908
- /**
909
- * Open worktree in external editor
910
- */
911
- export async function openInEditor(pane, context, params) {
912
- if (!pane.worktreePath) {
913
- return {
914
- type: 'error',
915
- message: 'This pane has no worktree to open',
916
- dismissable: true,
917
- };
918
- }
919
- const editor = params?.editor || process.env.EDITOR || 'code';
920
- try {
921
- execSync(`${editor} "${pane.worktreePath}"`, { stdio: 'pipe' });
922
- return {
923
- type: 'success',
924
- message: `Opened in ${editor}`,
925
- dismissable: true,
926
- };
927
- }
928
- catch (error) {
929
- return {
930
- type: 'error',
931
- message: `Failed to open in editor: ${error}`,
932
- dismissable: true,
933
- };
934
- }
935
- }
936
- /**
937
- * Duplicate a pane (create a new pane with the same prompt)
938
- */
939
- export async function duplicatePane(pane, context) {
940
- return {
941
- type: 'confirm',
942
- title: 'Duplicate Pane',
943
- message: `Create a new pane with the same prompt as "${pane.slug}"?`,
944
- confirmLabel: 'Duplicate',
945
- cancelLabel: 'Cancel',
946
- onConfirm: async () => {
947
- // This would trigger the new pane creation flow with the same prompt
948
- return {
949
- type: 'info',
950
- message: 'Duplication not yet implemented',
951
- data: { action: 'create_pane', prompt: pane.prompt, agent: pane.agent },
952
- dismissable: true,
953
- };
954
- },
955
- };
956
- }
957
- /**
958
- * Toggle autopilot mode for a pane
959
- */
960
- export async function toggleAutopilot(pane, context) {
961
- try {
962
- // Toggle the autopilot setting
963
- const newAutopilotState = !pane.autopilot;
964
- // Update the pane
965
- const updatedPanes = context.panes.map(p => p.id === pane.id ? { ...p, autopilot: newAutopilotState } : p);
966
- // Save the updated panes
967
- await context.savePanes(updatedPanes);
968
- // Notify about the update
969
- if (context.onPaneUpdate) {
970
- context.onPaneUpdate({ ...pane, autopilot: newAutopilotState });
971
- }
972
- return {
973
- type: 'success',
974
- message: `Autopilot ${newAutopilotState ? 'enabled' : 'disabled'} for "${pane.slug}"`,
975
- dismissable: true,
976
- };
977
- }
978
- catch (error) {
979
- return {
980
- type: 'error',
981
- message: `Failed to toggle autopilot: ${error instanceof Error ? error.message : 'Unknown error'}`,
982
- dismissable: true,
983
- };
984
- }
985
- }
7
+ // Re-export all actions from their individual files
8
+ export { viewPane, closePane, mergePane, renamePane, duplicatePane, copyPath, openInEditor, toggleAutopilot, } from './implementations/index.js';
986
9
  //# sourceMappingURL=paneActions.js.map