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
@@ -0,0 +1,768 @@
1
+ import { execSync } from 'child_process';
2
+ import { LogService } from './LogService.js';
3
+ /**
4
+ * Retry strategy for tmux operations
5
+ * - NONE: No retries (destructive operations like delete, close pane)
6
+ * - FAST: Fast retries for UI operations (max 200ms total)
7
+ * - IDEMPOTENT: Safe to retry read operations
8
+ */
9
+ export var RetryStrategy;
10
+ (function (RetryStrategy) {
11
+ RetryStrategy["NONE"] = "none";
12
+ RetryStrategy["FAST"] = "fast";
13
+ RetryStrategy["IDEMPOTENT"] = "idempotent";
14
+ })(RetryStrategy || (RetryStrategy = {}));
15
+ const RETRY_CONFIGS = {
16
+ [RetryStrategy.NONE]: { strategy: RetryStrategy.NONE, maxRetries: 0, baseDelay: 0, maxDelay: 0 },
17
+ [RetryStrategy.FAST]: { strategy: RetryStrategy.FAST, maxRetries: 2, baseDelay: 50, maxDelay: 100 },
18
+ [RetryStrategy.IDEMPOTENT]: { strategy: RetryStrategy.IDEMPOTENT, maxRetries: 3, baseDelay: 100, maxDelay: 500 },
19
+ };
20
+ // Errors that should NEVER be retried
21
+ const PERMANENT_ERRORS = [
22
+ 'tmux not found',
23
+ 'command not found',
24
+ 'permission denied',
25
+ 'no such session',
26
+ 'no session found',
27
+ 'can\'t find pane',
28
+ 'invalid',
29
+ ];
30
+ function sleep(ms) {
31
+ return new Promise(resolve => setTimeout(resolve, ms));
32
+ }
33
+ function isPermanentError(error) {
34
+ const message = String(error).toLowerCase();
35
+ return PERMANENT_ERRORS.some(pattern => message.includes(pattern));
36
+ }
37
+ /**
38
+ * Centralized tmux command execution service
39
+ * Provides:
40
+ * - Consistent error handling
41
+ * - Retry logic for transient failures
42
+ * - Logging and debugging
43
+ * - Type-safe tmux operations
44
+ */
45
+ export class TmuxService {
46
+ static instance;
47
+ logger = LogService.getInstance();
48
+ constructor() { }
49
+ static getInstance() {
50
+ if (!TmuxService.instance) {
51
+ TmuxService.instance = new TmuxService();
52
+ }
53
+ return TmuxService.instance;
54
+ }
55
+ /**
56
+ * Execute a tmux command with retry logic
57
+ */
58
+ async executeWithRetry(operation, strategy = RetryStrategy.IDEMPOTENT, context) {
59
+ const config = RETRY_CONFIGS[strategy];
60
+ if (config.maxRetries === 0) {
61
+ return operation();
62
+ }
63
+ let lastError;
64
+ for (let attempt = 0; attempt <= config.maxRetries; attempt++) {
65
+ try {
66
+ return operation();
67
+ }
68
+ catch (error) {
69
+ lastError = error;
70
+ // Don't retry permanent errors
71
+ if (isPermanentError(error)) {
72
+ this.logger.debug(`Permanent error detected${context ? ` (${context})` : ''}, not retrying`, 'error', error instanceof Error ? error.message : String(error));
73
+ throw error;
74
+ }
75
+ // Don't sleep on last attempt
76
+ if (attempt < config.maxRetries) {
77
+ const delay = Math.min(config.baseDelay * (attempt + 1), config.maxDelay);
78
+ this.logger.debug(`Retry attempt ${attempt + 1}/${config.maxRetries}${context ? ` (${context})` : ''}, waiting ${delay}ms`, 'debug');
79
+ await sleep(delay);
80
+ }
81
+ }
82
+ }
83
+ throw lastError;
84
+ }
85
+ /**
86
+ * Execute a synchronous tmux command (most common case)
87
+ */
88
+ execute(command, options = {}) {
89
+ const { encoding = 'utf-8', stdio = 'pipe', silent = false } = options;
90
+ try {
91
+ const result = execSync(command, {
92
+ encoding,
93
+ stdio,
94
+ });
95
+ return typeof result === 'string' ? result.trim() : '';
96
+ }
97
+ catch (error) {
98
+ if (!silent) {
99
+ this.logger.debug(`tmux command failed: ${command}`, 'error', error instanceof Error ? error.message : String(error));
100
+ }
101
+ throw error;
102
+ }
103
+ }
104
+ // ===== READ OPERATIONS (IDEMPOTENT - safe to retry) =====
105
+ /**
106
+ * Get current pane ID
107
+ */
108
+ async getCurrentPaneId() {
109
+ return this.executeWithRetry(() => {
110
+ return this.execute('tmux display-message -p "#{pane_id}"');
111
+ }, RetryStrategy.IDEMPOTENT, 'getCurrentPaneId');
112
+ }
113
+ /**
114
+ * Get current window dimensions
115
+ */
116
+ async getWindowDimensions() {
117
+ return this.executeWithRetry(() => {
118
+ const output = this.execute('tmux display-message -p "#{window_width} #{window_height}"');
119
+ const [width, height] = output.split(' ').map(n => parseInt(n, 10));
120
+ return { width, height };
121
+ }, RetryStrategy.IDEMPOTENT, 'getWindowDimensions');
122
+ }
123
+ /**
124
+ * Get current terminal (client) dimensions
125
+ */
126
+ async getTerminalDimensions() {
127
+ return this.executeWithRetry(() => {
128
+ const output = this.execute('tmux display-message -p "#{client_width} #{client_height}"');
129
+ const [width, height] = output.split(' ').map(n => parseInt(n, 10));
130
+ return { width, height };
131
+ }, RetryStrategy.IDEMPOTENT, 'getTerminalDimensions');
132
+ }
133
+ /**
134
+ * Get all pane IDs in current window
135
+ */
136
+ async getAllPaneIds() {
137
+ return this.executeWithRetry(() => {
138
+ const output = this.execute('tmux list-panes -F "#{pane_id}"');
139
+ return output.split('\n').filter(id => id.trim());
140
+ }, RetryStrategy.IDEMPOTENT, 'getAllPaneIds');
141
+ }
142
+ /**
143
+ * Get pane count in current window
144
+ */
145
+ async getPaneCount() {
146
+ return this.executeWithRetry(() => {
147
+ const output = this.execute('tmux list-panes | wc -l');
148
+ return parseInt(output, 10);
149
+ }, RetryStrategy.IDEMPOTENT, 'getPaneCount');
150
+ }
151
+ /**
152
+ * Get pane positions for all panes
153
+ */
154
+ async getPanePositions() {
155
+ return this.executeWithRetry(() => {
156
+ const output = this.execute(`tmux list-panes -F '#{pane_id} #{pane_left} #{pane_top} #{pane_width} #{pane_height}'`);
157
+ return output.split('\n').map(line => {
158
+ const [paneId, left, top, width, height] = line.split(' ');
159
+ return {
160
+ paneId,
161
+ left: parseInt(left, 10),
162
+ top: parseInt(top, 10),
163
+ width: parseInt(width, 10),
164
+ height: parseInt(height, 10),
165
+ };
166
+ });
167
+ }, RetryStrategy.IDEMPOTENT, 'getPanePositions');
168
+ }
169
+ /**
170
+ * Get pane title
171
+ */
172
+ async getPaneTitle(paneId) {
173
+ return this.executeWithRetry(() => {
174
+ return this.execute(`tmux display-message -t '${paneId}' -p '#{pane_title}'`);
175
+ }, RetryStrategy.IDEMPOTENT, `getPaneTitle(${paneId})`);
176
+ }
177
+ /**
178
+ * Get pane content (capture-pane)
179
+ */
180
+ async getPaneContent(paneId, options) {
181
+ return this.executeWithRetry(() => {
182
+ let cmd = `tmux capture-pane -t '${paneId}' -p`;
183
+ if (options?.start !== undefined) {
184
+ cmd += ` -S ${options.start}`;
185
+ }
186
+ if (options?.end !== undefined) {
187
+ cmd += ` -E ${options.end}`;
188
+ }
189
+ return this.execute(cmd);
190
+ }, RetryStrategy.IDEMPOTENT, `getPaneContent(${paneId})`);
191
+ }
192
+ /**
193
+ * Check if a pane exists
194
+ */
195
+ async paneExists(paneId) {
196
+ try {
197
+ await this.executeWithRetry(() => {
198
+ this.execute(`tmux display-message -t '${paneId}' -p '#{pane_id}'`, { silent: true });
199
+ return true;
200
+ }, RetryStrategy.FAST, `paneExists(${paneId})`);
201
+ return true;
202
+ }
203
+ catch {
204
+ // Expected - pane doesn't exist
205
+ return false;
206
+ }
207
+ }
208
+ /**
209
+ * Get content pane IDs (excludes control pane and spacer panes)
210
+ */
211
+ async getContentPaneIds(controlPaneId) {
212
+ const allPanes = await this.getAllPaneIds();
213
+ const contentPanes = [];
214
+ for (const id of allPanes) {
215
+ if (id === controlPaneId)
216
+ continue;
217
+ try {
218
+ const title = await this.getPaneTitle(id);
219
+ if (title !== 'dmux-spacer') {
220
+ contentPanes.push(id);
221
+ }
222
+ }
223
+ catch {
224
+ // Include pane if we can't get title
225
+ contentPanes.push(id);
226
+ }
227
+ }
228
+ return contentPanes;
229
+ }
230
+ // ===== WRITE OPERATIONS (careful with retry strategy) =====
231
+ /**
232
+ * Split a pane horizontally
233
+ * Returns the new pane ID
234
+ */
235
+ async splitPane(options = {}) {
236
+ return this.executeWithRetry(() => {
237
+ let cmd = 'tmux split-window -h -P -F \'#{pane_id}\'';
238
+ if (options.targetPane) {
239
+ cmd += ` -t '${options.targetPane}'`;
240
+ }
241
+ if (options.cwd) {
242
+ cmd += ` -c "${options.cwd}"`;
243
+ }
244
+ if (options.command) {
245
+ cmd += ` "${options.command}"`;
246
+ }
247
+ return this.execute(cmd);
248
+ }, RetryStrategy.FAST, // UI operation, fast retry
249
+ 'splitPane');
250
+ }
251
+ /**
252
+ * Resize a pane
253
+ */
254
+ async resizePane(paneId, dimensions) {
255
+ await this.executeWithRetry(() => {
256
+ if (dimensions.width !== undefined) {
257
+ this.execute(`tmux resize-pane -t '${paneId}' -x ${dimensions.width}`);
258
+ }
259
+ if (dimensions.height !== undefined) {
260
+ this.execute(`tmux resize-pane -t '${paneId}' -y ${dimensions.height}`);
261
+ }
262
+ }, RetryStrategy.FAST, `resizePane(${paneId})`);
263
+ }
264
+ /**
265
+ * Resize window
266
+ */
267
+ async resizeWindow(dimensions) {
268
+ await this.executeWithRetry(() => {
269
+ this.execute(`tmux resize-window -x ${dimensions.width} -y ${dimensions.height}`);
270
+ }, RetryStrategy.FAST, 'resizeWindow');
271
+ }
272
+ /**
273
+ * Select a layout string
274
+ */
275
+ async selectLayout(layoutString) {
276
+ await this.executeWithRetry(() => {
277
+ this.execute(`tmux select-layout '${layoutString}'`);
278
+ }, RetryStrategy.FAST, 'selectLayout');
279
+ }
280
+ /**
281
+ * Set pane title
282
+ */
283
+ async setPaneTitle(paneId, title) {
284
+ await this.executeWithRetry(() => {
285
+ this.execute(`tmux select-pane -t '${paneId}' -T '${title}'`);
286
+ }, RetryStrategy.FAST, `setPaneTitle(${paneId})`);
287
+ }
288
+ /**
289
+ * Select a pane (make it active)
290
+ */
291
+ async selectPane(paneId) {
292
+ await this.executeWithRetry(() => {
293
+ this.execute(`tmux select-pane -t '${paneId}'`);
294
+ }, RetryStrategy.FAST, `selectPane(${paneId})`);
295
+ }
296
+ /**
297
+ * Set global tmux option
298
+ */
299
+ async setOption(option, value) {
300
+ await this.executeWithRetry(() => {
301
+ this.execute(`tmux set-option -g ${option} ${value}`);
302
+ }, RetryStrategy.FAST, `setOption(${option})`);
303
+ }
304
+ /**
305
+ * Send keys to a pane
306
+ * @deprecated Use sendShellCommand() for shell commands or sendTmuxKeys() for tmux keys
307
+ */
308
+ async sendKeys(paneId, keys) {
309
+ await this.executeWithRetry(() => {
310
+ this.execute(`tmux send-keys -t '${paneId}' ${keys}`);
311
+ }, RetryStrategy.FAST, `sendKeys(${paneId})`);
312
+ }
313
+ /**
314
+ * Send a shell command to a pane (auto-quotes to preserve spaces)
315
+ *
316
+ * Use this for shell commands like: `claude "my prompt"`, `git status`, etc.
317
+ * The command will be automatically quoted to prevent tmux from splitting on spaces.
318
+ *
319
+ * @example
320
+ * await tmuxService.sendShellCommand(paneId, 'claude "fix the bug" --permission-mode=acceptEdits');
321
+ * await tmuxService.sendTmuxKeys(paneId, 'Enter'); // Then send Enter key
322
+ *
323
+ * @param paneId The tmux pane ID (e.g., "%1")
324
+ * @param command The shell command to execute (will be auto-quoted)
325
+ * @see sendTmuxKeys For sending tmux key sequences (Enter, C-l, etc.)
326
+ */
327
+ async sendShellCommand(paneId, command) {
328
+ // Quote the command to preserve spaces, escaping any single quotes
329
+ const quotedCommand = `'${command.replace(/'/g, "'\\''")}'`;
330
+ await this.executeWithRetry(() => {
331
+ this.execute(`tmux send-keys -t '${paneId}' ${quotedCommand}`);
332
+ }, RetryStrategy.FAST, `sendShellCommand(${paneId})`);
333
+ }
334
+ /**
335
+ * Send tmux key sequences to a pane (no quoting)
336
+ *
337
+ * Use this for tmux keys like: Enter, C-l, Escape, Tab, C-c, etc.
338
+ * Keys are sent as-is without quoting.
339
+ *
340
+ * @example
341
+ * await tmuxService.sendShellCommand(paneId, 'git status');
342
+ * await tmuxService.sendTmuxKeys(paneId, 'Enter'); // Execute the command
343
+ *
344
+ * @example
345
+ * await tmuxService.sendTmuxKeys(paneId, 'C-l'); // Clear screen
346
+ *
347
+ * @param paneId The tmux pane ID (e.g., "%1")
348
+ * @param keys The tmux key sequence (Enter, C-l, Escape, etc.)
349
+ * @see sendShellCommand For sending shell commands (auto-quoted)
350
+ */
351
+ async sendTmuxKeys(paneId, keys) {
352
+ await this.executeWithRetry(() => {
353
+ this.execute(`tmux send-keys -t '${paneId}' ${keys}`);
354
+ }, RetryStrategy.FAST, `sendTmuxKeys(${paneId})`);
355
+ }
356
+ /**
357
+ * Set a tmux buffer with content
358
+ */
359
+ async setBuffer(bufferName, content) {
360
+ await this.executeWithRetry(() => {
361
+ // Escape content for shell
362
+ const escaped = content.replace(/\\/g, '\\\\').replace(/'/g, "'\\''");
363
+ this.execute(`tmux set-buffer -b '${bufferName}' -- '${escaped}'`);
364
+ }, RetryStrategy.FAST, `setBuffer(${bufferName})`);
365
+ }
366
+ /**
367
+ * Paste a tmux buffer to a pane
368
+ */
369
+ async pasteBuffer(bufferName, paneId) {
370
+ await this.executeWithRetry(() => {
371
+ this.execute(`tmux paste-buffer -b '${bufferName}' -t '${paneId}'`);
372
+ }, RetryStrategy.FAST, `pasteBuffer(${bufferName})`);
373
+ }
374
+ /**
375
+ * Delete a tmux buffer
376
+ */
377
+ async deleteBuffer(bufferName) {
378
+ await this.executeWithRetry(() => {
379
+ this.execute(`tmux delete-buffer -b '${bufferName}'`);
380
+ }, RetryStrategy.FAST, `deleteBuffer(${bufferName})`);
381
+ }
382
+ /**
383
+ * Refresh the tmux client (UI operation, optional)
384
+ */
385
+ async refreshClient() {
386
+ try {
387
+ await this.executeWithRetry(() => {
388
+ this.execute('tmux refresh-client', { silent: true });
389
+ }, RetryStrategy.FAST, 'refreshClient');
390
+ }
391
+ catch {
392
+ // Intentionally silent - UI refresh is optional
393
+ this.logger.debug('tmux refresh-client failed (non-critical)', 'debug');
394
+ }
395
+ }
396
+ // ===== DESTRUCTIVE OPERATIONS (NO RETRY) =====
397
+ /**
398
+ * Kill a pane (DESTRUCTIVE - no retry)
399
+ * Gracefully handles case where pane doesn't exist (considered success)
400
+ */
401
+ async killPane(paneId) {
402
+ try {
403
+ await this.executeWithRetry(() => {
404
+ this.execute(`tmux kill-pane -t '${paneId}'`);
405
+ }, RetryStrategy.NONE, // Destructive operation
406
+ `killPane(${paneId})`);
407
+ }
408
+ catch (error) {
409
+ // If pane doesn't exist, consider it success (already killed)
410
+ const errorMessage = error instanceof Error ? error.message : String(error);
411
+ if (errorMessage.includes("can't find pane")) {
412
+ this.logger.debug(`Pane ${paneId} already gone, treating as success`, 'killPane');
413
+ return;
414
+ }
415
+ // Re-throw other errors
416
+ throw error;
417
+ }
418
+ }
419
+ /**
420
+ * Kill a window (DESTRUCTIVE - no retry)
421
+ */
422
+ async killWindow(windowId) {
423
+ await this.executeWithRetry(() => {
424
+ this.execute(`tmux kill-window -t '${windowId}'`);
425
+ }, RetryStrategy.NONE, // Destructive operation
426
+ `killWindow(${windowId})`);
427
+ }
428
+ /**
429
+ * Create a new window
430
+ * Returns the window ID
431
+ */
432
+ async newWindow(options = {}) {
433
+ return this.executeWithRetry(() => {
434
+ let cmd = 'tmux new-window';
435
+ if (options.detached) {
436
+ cmd += ' -d';
437
+ }
438
+ if (options.name) {
439
+ cmd += ` -n '${options.name}'`;
440
+ }
441
+ cmd += " -P -F '#{window_id}'";
442
+ return this.execute(cmd);
443
+ }, RetryStrategy.FAST, 'newWindow');
444
+ }
445
+ /**
446
+ * Join a pane from a window (pulls pane into current window)
447
+ */
448
+ async joinPane(sourceWindowId, horizontal = true) {
449
+ await this.executeWithRetry(() => {
450
+ const direction = horizontal ? '-h' : '-v';
451
+ this.execute(`tmux join-pane ${direction} -s '${sourceWindowId}'`);
452
+ }, RetryStrategy.FAST, `joinPane(${sourceWindowId})`);
453
+ }
454
+ /**
455
+ * Check if a window exists
456
+ */
457
+ async windowExists(windowId) {
458
+ try {
459
+ await this.executeWithRetry(() => {
460
+ this.execute(`tmux list-windows -F '#{window_id}' | grep -q '${windowId}'`, { silent: true });
461
+ return true;
462
+ }, RetryStrategy.FAST, `windowExists(${windowId})`);
463
+ return true;
464
+ }
465
+ catch {
466
+ return false;
467
+ }
468
+ }
469
+ // ===== SYNCHRONOUS FALLBACKS (for gradual migration) =====
470
+ /**
471
+ * Get window dimensions (sync version for compatibility)
472
+ */
473
+ getWindowDimensionsSync() {
474
+ try {
475
+ const output = this.execute('tmux display-message -p "#{window_width} #{window_height}"');
476
+ const [width, height] = output.split(' ').map(n => parseInt(n, 10));
477
+ return { width, height };
478
+ }
479
+ catch (error) {
480
+ this.logger.warn('Failed to get window dimensions, using fallback', 'TmuxService');
481
+ return { width: 120, height: 40 }; // Fallback dimensions
482
+ }
483
+ }
484
+ /**
485
+ * Get terminal dimensions (sync version for compatibility)
486
+ */
487
+ getTerminalDimensionsSync() {
488
+ try {
489
+ const output = this.execute('tmux display-message -p "#{client_width} #{client_height}"');
490
+ const [width, height] = output.split(' ').map(n => parseInt(n, 10));
491
+ return { width, height };
492
+ }
493
+ catch (error) {
494
+ this.logger.warn('Failed to get terminal dimensions, using fallback', 'TmuxService');
495
+ return { width: 120, height: 40 }; // Fallback dimensions
496
+ }
497
+ }
498
+ /**
499
+ * Get all pane IDs (sync version for compatibility)
500
+ */
501
+ getAllPaneIdsSync() {
502
+ try {
503
+ const output = this.execute('tmux list-panes -F "#{pane_id}"');
504
+ return output.split('\n').filter(id => id.trim());
505
+ }
506
+ catch (error) {
507
+ this.logger.warn('Failed to get pane IDs, returning empty array', 'TmuxService');
508
+ return [];
509
+ }
510
+ }
511
+ /**
512
+ * Get pane positions (sync version for compatibility)
513
+ */
514
+ getPanePositionsSync() {
515
+ try {
516
+ const output = this.execute(`tmux list-panes -F '#{pane_id} #{pane_left} #{pane_top} #{pane_width} #{pane_height}'`);
517
+ return output.split('\n').map(line => {
518
+ const [paneId, left, top, width, height] = line.split(' ');
519
+ return {
520
+ paneId,
521
+ left: parseInt(left, 10),
522
+ top: parseInt(top, 10),
523
+ width: parseInt(width, 10),
524
+ height: parseInt(height, 10),
525
+ };
526
+ });
527
+ }
528
+ catch (error) {
529
+ this.logger.warn('Failed to get pane positions, returning empty array', 'TmuxService');
530
+ return [];
531
+ }
532
+ }
533
+ /**
534
+ * Get pane title (sync version for compatibility)
535
+ */
536
+ getPaneTitleSync(paneId) {
537
+ try {
538
+ return this.execute(`tmux display-message -t '${paneId}' -p '#{pane_title}'`);
539
+ }
540
+ catch (error) {
541
+ this.logger.warn(`Failed to get pane title for ${paneId}, returning empty string`, 'TmuxService');
542
+ return '';
543
+ }
544
+ }
545
+ /**
546
+ * Split pane (sync version for compatibility)
547
+ */
548
+ splitPaneSync(options = {}) {
549
+ let cmd = 'tmux split-window -h -P -F \'#{pane_id}\'';
550
+ if (options.targetPane) {
551
+ cmd += ` -t '${options.targetPane}'`;
552
+ }
553
+ if (options.cwd) {
554
+ cmd += ` -c "${options.cwd}"`;
555
+ }
556
+ if (options.command) {
557
+ cmd += ` "${options.command}"`;
558
+ }
559
+ return this.execute(cmd);
560
+ }
561
+ /**
562
+ * Refresh client (sync version for compatibility)
563
+ */
564
+ refreshClientSync() {
565
+ try {
566
+ this.execute('tmux refresh-client', { silent: true });
567
+ }
568
+ catch {
569
+ // Intentionally silent - UI refresh is optional
570
+ }
571
+ }
572
+ /**
573
+ * Clear tmux history (sync version for compatibility)
574
+ */
575
+ clearHistorySync() {
576
+ try {
577
+ this.execute('tmux clear-history', { silent: true });
578
+ }
579
+ catch {
580
+ // Intentionally silent - history clearing is optional
581
+ }
582
+ }
583
+ /**
584
+ * Get tmux version string
585
+ */
586
+ getVersionSync() {
587
+ try {
588
+ return this.execute('tmux -V');
589
+ }
590
+ catch (error) {
591
+ this.logger.warn('Failed to get tmux version', 'TmuxService');
592
+ return '';
593
+ }
594
+ }
595
+ /**
596
+ * Get a session option value
597
+ */
598
+ getSessionOptionSync(sessionName, option) {
599
+ try {
600
+ return this.execute(`tmux show -t ${sessionName} ${option}`);
601
+ }
602
+ catch (error) {
603
+ this.logger.warn(`Failed to get session option ${option} for ${sessionName}`, 'TmuxService');
604
+ return '';
605
+ }
606
+ }
607
+ /**
608
+ * Set a session option
609
+ */
610
+ setSessionOptionSync(sessionName, option, value) {
611
+ try {
612
+ this.execute(`tmux set -t ${sessionName} ${option} ${value}`, { silent: true });
613
+ }
614
+ catch (error) {
615
+ this.logger.warn(`Failed to set session option ${option} for ${sessionName}`, 'TmuxService');
616
+ }
617
+ }
618
+ /**
619
+ * Get current pane ID (sync version for compatibility)
620
+ */
621
+ getCurrentPaneIdSync() {
622
+ try {
623
+ return this.execute('tmux display-message -p "#{pane_id}"');
624
+ }
625
+ catch (error) {
626
+ this.logger.warn('Failed to get current pane ID', 'TmuxService');
627
+ throw error;
628
+ }
629
+ }
630
+ /**
631
+ * Set window option (sync version for compatibility)
632
+ */
633
+ setWindowOptionSync(option, value) {
634
+ try {
635
+ this.execute(`tmux set-window-option ${option} ${value}`, { silent: true });
636
+ }
637
+ catch (error) {
638
+ this.logger.warn(`Failed to set window option ${option}`, 'TmuxService');
639
+ }
640
+ }
641
+ /**
642
+ * Select layout by name (sync version for compatibility)
643
+ */
644
+ selectLayoutSync(layout) {
645
+ try {
646
+ this.execute(`tmux select-layout '${layout}'`);
647
+ }
648
+ catch (error) {
649
+ this.logger.warn(`Failed to select layout ${layout}`, 'TmuxService');
650
+ throw error;
651
+ }
652
+ }
653
+ /**
654
+ * Resize pane (sync version for compatibility)
655
+ */
656
+ resizePaneSync(paneId, dimensions) {
657
+ try {
658
+ if (dimensions.width !== undefined) {
659
+ this.execute(`tmux resize-pane -t '${paneId}' -x ${dimensions.width}`);
660
+ }
661
+ if (dimensions.height !== undefined) {
662
+ this.execute(`tmux resize-pane -t '${paneId}' -y ${dimensions.height}`);
663
+ }
664
+ }
665
+ catch (error) {
666
+ this.logger.warn(`Failed to resize pane ${paneId}`, 'TmuxService');
667
+ throw error;
668
+ }
669
+ }
670
+ /**
671
+ * Resize window (sync version for compatibility)
672
+ */
673
+ resizeWindowSync(dimensions) {
674
+ try {
675
+ this.execute(`tmux resize-window -x ${dimensions.width} -y ${dimensions.height}`);
676
+ }
677
+ catch (error) {
678
+ this.logger.warn('Failed to resize window', 'TmuxService');
679
+ throw error;
680
+ }
681
+ }
682
+ /**
683
+ * Select pane (sync version for compatibility)
684
+ */
685
+ selectPaneSync(paneId) {
686
+ try {
687
+ this.execute(`tmux select-pane -t '${paneId}'`);
688
+ }
689
+ catch (error) {
690
+ this.logger.warn(`Failed to select pane ${paneId}`, 'TmuxService');
691
+ throw error;
692
+ }
693
+ }
694
+ /**
695
+ * Set pane title (sync version for compatibility)
696
+ */
697
+ setPaneTitleSync(paneId, title) {
698
+ try {
699
+ this.execute(`tmux select-pane -t '${paneId}' -T '${title}'`);
700
+ }
701
+ catch (error) {
702
+ this.logger.warn(`Failed to set pane title for ${paneId}`, 'TmuxService');
703
+ throw error;
704
+ }
705
+ }
706
+ /**
707
+ * Kill pane (sync version for compatibility)
708
+ */
709
+ killPaneSync(paneId) {
710
+ try {
711
+ this.execute(`tmux kill-pane -t '${paneId}'`);
712
+ }
713
+ catch (error) {
714
+ this.logger.warn(`Failed to kill pane ${paneId}`, 'TmuxService');
715
+ throw error;
716
+ }
717
+ }
718
+ /**
719
+ * List panes formatted (sync version for compatibility)
720
+ */
721
+ listPanesSync(format) {
722
+ try {
723
+ const formatStr = format || '#{pane_id}=#{pane_index}';
724
+ return this.execute(`tmux list-panes -F "${formatStr}"`);
725
+ }
726
+ catch (error) {
727
+ this.logger.warn('Failed to list panes', 'TmuxService');
728
+ return '';
729
+ }
730
+ }
731
+ /**
732
+ * Set global tmux option (sync version for compatibility)
733
+ */
734
+ setGlobalOptionSync(option, value) {
735
+ try {
736
+ this.execute(`tmux set-option -g ${option} ${value}`, { silent: true });
737
+ }
738
+ catch (error) {
739
+ this.logger.warn(`Failed to set global option ${option}`, 'TmuxService');
740
+ }
741
+ }
742
+ /**
743
+ * Get pane width (sync version for compatibility)
744
+ */
745
+ getPaneWidthSync(paneId) {
746
+ try {
747
+ const output = this.execute(`tmux display-message -t '${paneId}' -p '#{pane_width}'`);
748
+ return parseInt(output, 10);
749
+ }
750
+ catch (error) {
751
+ this.logger.warn(`Failed to get pane width for ${paneId}`, 'TmuxService');
752
+ return 0;
753
+ }
754
+ }
755
+ /**
756
+ * Get current layout string (sync version for compatibility)
757
+ */
758
+ getCurrentLayoutSync() {
759
+ try {
760
+ return this.execute('tmux display-message -p "#{window_layout}"');
761
+ }
762
+ catch (error) {
763
+ this.logger.warn('Failed to get current layout', 'TmuxService');
764
+ return '';
765
+ }
766
+ }
767
+ }
768
+ //# sourceMappingURL=TmuxService.js.map