dmux 3.2.0 → 3.3.1

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 (655) hide show
  1. package/dist/DmuxApp.d.ts.map +1 -1
  2. package/dist/DmuxApp.js +270 -1606
  3. package/dist/DmuxApp.js.map +1 -1
  4. package/dist/actions/implementations/closeAction.d.ts +10 -0
  5. package/dist/actions/implementations/closeAction.d.ts.map +1 -0
  6. package/dist/actions/implementations/closeAction.js +201 -0
  7. package/dist/actions/implementations/closeAction.js.map +1 -0
  8. package/dist/actions/implementations/copyPathAction.d.ts +10 -0
  9. package/dist/actions/implementations/copyPathAction.d.ts.map +1 -0
  10. package/dist/actions/implementations/copyPathAction.js +34 -0
  11. package/dist/actions/implementations/copyPathAction.js.map +1 -0
  12. package/dist/actions/implementations/duplicateAction.d.ts +10 -0
  13. package/dist/actions/implementations/duplicateAction.d.ts.map +1 -0
  14. package/dist/actions/implementations/duplicateAction.js +25 -0
  15. package/dist/actions/implementations/duplicateAction.js.map +1 -0
  16. package/dist/actions/implementations/index.d.ts +14 -0
  17. package/dist/actions/implementations/index.d.ts.map +1 -0
  18. package/dist/actions/implementations/index.js +14 -0
  19. package/dist/actions/implementations/index.js.map +1 -0
  20. package/dist/actions/implementations/mergeAction.d.ts +14 -0
  21. package/dist/actions/implementations/mergeAction.d.ts.map +1 -0
  22. package/dist/actions/implementations/mergeAction.js +84 -0
  23. package/dist/actions/implementations/mergeAction.js.map +1 -0
  24. package/dist/actions/implementations/openInEditorAction.d.ts +12 -0
  25. package/dist/actions/implementations/openInEditorAction.d.ts.map +1 -0
  26. package/dist/actions/implementations/openInEditorAction.js +33 -0
  27. package/dist/actions/implementations/openInEditorAction.js.map +1 -0
  28. package/dist/actions/implementations/renameAction.d.ts +13 -0
  29. package/dist/actions/implementations/renameAction.d.ts.map +1 -0
  30. package/dist/actions/implementations/renameAction.js +18 -0
  31. package/dist/actions/implementations/renameAction.js.map +1 -0
  32. package/dist/actions/implementations/toggleAutopilotAction.d.ts +10 -0
  33. package/dist/actions/implementations/toggleAutopilotAction.d.ts.map +1 -0
  34. package/dist/actions/implementations/toggleAutopilotAction.js +33 -0
  35. package/dist/actions/implementations/toggleAutopilotAction.js.map +1 -0
  36. package/dist/actions/implementations/viewAction.d.ts +10 -0
  37. package/dist/actions/implementations/viewAction.d.ts.map +1 -0
  38. package/dist/actions/implementations/viewAction.js +26 -0
  39. package/dist/actions/implementations/viewAction.js.map +1 -0
  40. package/dist/actions/merge/commitMessageHandler.d.ts +27 -0
  41. package/dist/actions/merge/commitMessageHandler.d.ts.map +1 -0
  42. package/dist/actions/merge/commitMessageHandler.js +123 -0
  43. package/dist/actions/merge/commitMessageHandler.js.map +1 -0
  44. package/dist/actions/merge/conflictResolution.d.ts +13 -0
  45. package/dist/actions/merge/conflictResolution.d.ts.map +1 -0
  46. package/dist/actions/merge/conflictResolution.js +134 -0
  47. package/dist/actions/merge/conflictResolution.js.map +1 -0
  48. package/dist/actions/merge/issueHandlers/index.d.ts +11 -0
  49. package/dist/actions/merge/issueHandlers/index.d.ts.map +1 -0
  50. package/dist/actions/merge/issueHandlers/index.js +8 -0
  51. package/dist/actions/merge/issueHandlers/index.js.map +1 -0
  52. package/dist/actions/merge/issueHandlers/mainDirtyHandler.d.ts +13 -0
  53. package/dist/actions/merge/issueHandlers/mainDirtyHandler.d.ts.map +1 -0
  54. package/dist/actions/merge/issueHandlers/mainDirtyHandler.js +72 -0
  55. package/dist/actions/merge/issueHandlers/mainDirtyHandler.js.map +1 -0
  56. package/dist/actions/merge/issueHandlers/mergeConflictHandler.d.ts +13 -0
  57. package/dist/actions/merge/issueHandlers/mergeConflictHandler.d.ts.map +1 -0
  58. package/dist/actions/merge/issueHandlers/mergeConflictHandler.js +52 -0
  59. package/dist/actions/merge/issueHandlers/mergeConflictHandler.js.map +1 -0
  60. package/dist/actions/merge/issueHandlers/nothingToMergeHandler.d.ts +7 -0
  61. package/dist/actions/merge/issueHandlers/nothingToMergeHandler.d.ts.map +1 -0
  62. package/dist/actions/merge/issueHandlers/nothingToMergeHandler.js +12 -0
  63. package/dist/actions/merge/issueHandlers/nothingToMergeHandler.js.map +1 -0
  64. package/dist/actions/merge/issueHandlers/worktreeUncommittedHandler.d.ts +13 -0
  65. package/dist/actions/merge/issueHandlers/worktreeUncommittedHandler.d.ts.map +1 -0
  66. package/dist/actions/merge/issueHandlers/worktreeUncommittedHandler.js +49 -0
  67. package/dist/actions/merge/issueHandlers/worktreeUncommittedHandler.js.map +1 -0
  68. package/dist/actions/merge/mergeExecution.d.ts +22 -0
  69. package/dist/actions/merge/mergeExecution.d.ts.map +1 -0
  70. package/dist/actions/merge/mergeExecution.js +184 -0
  71. package/dist/actions/merge/mergeExecution.js.map +1 -0
  72. package/dist/actions/paneActions.d.ts +3 -40
  73. package/dist/actions/paneActions.d.ts.map +1 -1
  74. package/dist/actions/paneActions.js +4 -1038
  75. package/dist/actions/paneActions.js.map +1 -1
  76. package/dist/actions/types.d.ts +1 -0
  77. package/dist/actions/types.d.ts.map +1 -1
  78. package/dist/actions/types.js.map +1 -1
  79. package/dist/components/{ActionChoiceDialog.d.ts → dialogs/ActionChoiceDialog.d.ts} +1 -1
  80. package/dist/components/dialogs/ActionChoiceDialog.d.ts.map +1 -0
  81. package/dist/components/dialogs/ActionChoiceDialog.js.map +1 -0
  82. package/dist/components/dialogs/ActionConfirmDialog.d.ts.map +1 -0
  83. package/dist/components/dialogs/ActionConfirmDialog.js.map +1 -0
  84. package/dist/components/dialogs/ActionInputDialog.d.ts.map +1 -0
  85. package/dist/components/{ActionInputDialog.js → dialogs/ActionInputDialog.js} +2 -2
  86. package/dist/components/dialogs/ActionInputDialog.js.map +1 -0
  87. package/dist/components/dialogs/ActionProgressDialog.d.ts.map +1 -0
  88. package/dist/components/dialogs/ActionProgressDialog.js.map +1 -0
  89. package/dist/components/dialogs/AgentChoiceDialog.d.ts.map +1 -0
  90. package/dist/components/dialogs/AgentChoiceDialog.js.map +1 -0
  91. package/dist/components/{CloseOptionsDialog.d.ts → dialogs/CloseOptionsDialog.d.ts} +1 -1
  92. package/dist/components/dialogs/CloseOptionsDialog.d.ts.map +1 -0
  93. package/dist/components/dialogs/CloseOptionsDialog.js.map +1 -0
  94. package/dist/components/dialogs/CommandPromptDialog.d.ts.map +1 -0
  95. package/dist/components/{CommandPromptDialog.js → dialogs/CommandPromptDialog.js} +1 -1
  96. package/dist/components/dialogs/CommandPromptDialog.js.map +1 -0
  97. package/dist/components/dialogs/DialogBox.d.ts.map +1 -0
  98. package/dist/components/dialogs/DialogBox.js.map +1 -0
  99. package/dist/components/dialogs/HooksDialog.d.ts.map +1 -0
  100. package/dist/components/dialogs/HooksDialog.js.map +1 -0
  101. package/dist/components/{MergeConfirmationDialog.d.ts → dialogs/MergeConfirmationDialog.d.ts} +1 -1
  102. package/dist/components/dialogs/MergeConfirmationDialog.d.ts.map +1 -0
  103. package/dist/components/dialogs/MergeConfirmationDialog.js.map +1 -0
  104. package/dist/components/{SettingsDialog.d.ts → dialogs/SettingsDialog.d.ts} +1 -1
  105. package/dist/components/dialogs/SettingsDialog.d.ts.map +1 -0
  106. package/dist/components/dialogs/SettingsDialog.js.map +1 -0
  107. package/dist/components/dialogs/UpdateDialog.d.ts.map +1 -0
  108. package/dist/components/dialogs/UpdateDialog.js.map +1 -0
  109. package/dist/components/indicators/CreatingIndicator.d.ts.map +1 -0
  110. package/dist/components/indicators/CreatingIndicator.js.map +1 -0
  111. package/dist/components/indicators/LoadingIndicator.d.ts.map +1 -0
  112. package/dist/components/indicators/LoadingIndicator.js.map +1 -0
  113. package/dist/components/indicators/RunningIndicator.d.ts.map +1 -0
  114. package/dist/components/indicators/RunningIndicator.js.map +1 -0
  115. package/dist/components/indicators/Spinner.d.ts.map +1 -0
  116. package/dist/components/indicators/Spinner.js.map +1 -0
  117. package/dist/components/indicators/UpdatingIndicator.d.ts.map +1 -0
  118. package/dist/components/indicators/UpdatingIndicator.js.map +1 -0
  119. package/dist/components/indicators/index.d.ts +6 -0
  120. package/dist/components/indicators/index.d.ts.map +1 -0
  121. package/dist/components/indicators/index.js +6 -0
  122. package/dist/components/indicators/index.js.map +1 -0
  123. package/dist/components/inputs/CleanTextInput.d.ts.map +1 -0
  124. package/dist/{CleanTextInput.js → components/inputs/CleanTextInput.js} +2 -144
  125. package/dist/components/inputs/CleanTextInput.js.map +1 -0
  126. package/dist/components/inputs/StyledTextInput.d.ts.map +1 -0
  127. package/dist/components/inputs/StyledTextInput.js.map +1 -0
  128. package/dist/components/inputs/index.d.ts +3 -0
  129. package/dist/components/inputs/index.d.ts.map +1 -0
  130. package/dist/components/inputs/index.js +3 -0
  131. package/dist/components/inputs/index.js.map +1 -0
  132. package/dist/components/{KebabMenu.d.ts → panes/KebabMenu.d.ts} +1 -1
  133. package/dist/components/panes/KebabMenu.d.ts.map +1 -0
  134. package/dist/components/panes/KebabMenu.js.map +1 -0
  135. package/dist/components/panes/MergePane.d.ts.map +1 -0
  136. package/dist/{MergePane.js → components/panes/MergePane.js} +1 -1
  137. package/dist/components/panes/MergePane.js.map +1 -0
  138. package/dist/components/{PaneCard.d.ts → panes/PaneCard.d.ts} +1 -1
  139. package/dist/components/panes/PaneCard.d.ts.map +1 -0
  140. package/dist/components/{PaneCard.js → panes/PaneCard.js} +1 -1
  141. package/dist/components/panes/PaneCard.js.map +1 -0
  142. package/dist/components/{PanesGrid.d.ts → panes/PanesGrid.d.ts} +2 -2
  143. package/dist/components/panes/PanesGrid.d.ts.map +1 -0
  144. package/dist/components/{PanesGrid.js → panes/PanesGrid.js} +1 -1
  145. package/dist/components/panes/PanesGrid.js.map +1 -0
  146. package/dist/components/panes/index.d.ts +5 -0
  147. package/dist/components/panes/index.d.ts.map +1 -0
  148. package/dist/components/panes/index.js +5 -0
  149. package/dist/components/panes/index.js.map +1 -0
  150. package/dist/components/popups/agentChoicePopup.d.ts.map +1 -0
  151. package/dist/{popups → components/popups}/agentChoicePopup.js +1 -1
  152. package/dist/components/popups/agentChoicePopup.js.map +1 -0
  153. package/dist/components/popups/choicePopup.d.ts.map +1 -0
  154. package/dist/{popups → components/popups}/choicePopup.js +3 -3
  155. package/dist/components/popups/choicePopup.js.map +1 -0
  156. package/dist/components/popups/config.d.ts.map +1 -0
  157. package/dist/{popups → components/popups}/config.js +1 -1
  158. package/dist/components/popups/config.js.map +1 -0
  159. package/dist/components/popups/confirmPopup.d.ts.map +1 -0
  160. package/dist/{popups → components/popups}/confirmPopup.js +2 -3
  161. package/dist/components/popups/confirmPopup.js.map +1 -0
  162. package/dist/components/popups/hooksPopup.d.ts.map +1 -0
  163. package/dist/{popups → components/popups}/hooksPopup.js +1 -1
  164. package/dist/components/popups/hooksPopup.js.map +1 -0
  165. package/dist/components/popups/inputPopup.d.ts.map +1 -0
  166. package/dist/{popups → components/popups}/inputPopup.js +3 -4
  167. package/dist/components/popups/inputPopup.js.map +1 -0
  168. package/dist/components/popups/kebabMenuPopup.d.ts.map +1 -0
  169. package/dist/{popups → components/popups}/kebabMenuPopup.js +1 -1
  170. package/dist/components/popups/kebabMenuPopup.js.map +1 -0
  171. package/dist/components/popups/logsPopup.d.ts.map +1 -0
  172. package/dist/{popups → components/popups}/logsPopup.js +15 -7
  173. package/dist/components/popups/logsPopup.js.map +1 -0
  174. package/dist/components/popups/mergePopup.d.ts.map +1 -0
  175. package/dist/{popups → components/popups}/mergePopup.js +6 -6
  176. package/dist/components/popups/mergePopup.js.map +1 -0
  177. package/dist/components/popups/newPanePopup.d.ts.map +1 -0
  178. package/dist/{popups → components/popups}/newPanePopup.js +3 -3
  179. package/dist/components/popups/newPanePopup.js.map +1 -0
  180. package/dist/components/popups/progressPopup.d.ts.map +1 -0
  181. package/dist/{popups → components/popups}/progressPopup.js +1 -2
  182. package/dist/components/popups/progressPopup.js.map +1 -0
  183. package/dist/components/popups/remotePopup.d.ts.map +1 -0
  184. package/dist/{popups → components/popups}/remotePopup.js +1 -1
  185. package/dist/components/popups/remotePopup.js.map +1 -0
  186. package/dist/components/popups/settingsPopup.d.ts.map +1 -0
  187. package/dist/{popups → components/popups}/settingsPopup.js +1 -1
  188. package/dist/components/popups/settingsPopup.js.map +1 -0
  189. package/dist/components/popups/shared/FileList.d.ts.map +1 -0
  190. package/dist/components/popups/shared/FileList.js.map +1 -0
  191. package/dist/components/popups/shared/PopupContainer.d.ts.map +1 -0
  192. package/dist/components/popups/shared/PopupContainer.js.map +1 -0
  193. package/dist/components/popups/shared/PopupInputBox.d.ts.map +1 -0
  194. package/dist/components/popups/shared/PopupInputBox.js.map +1 -0
  195. package/dist/components/popups/shared/PopupWrapper.d.ts.map +1 -0
  196. package/dist/components/popups/shared/PopupWrapper.js.map +1 -0
  197. package/dist/components/popups/shared/index.d.ts.map +1 -0
  198. package/dist/components/popups/shared/index.js.map +1 -0
  199. package/dist/components/popups/shortcutsPopup.d.ts.map +1 -0
  200. package/dist/{popups → components/popups}/shortcutsPopup.js +1 -1
  201. package/dist/components/popups/shortcutsPopup.js.map +1 -0
  202. package/dist/components/popups/templates/SimpleInputPopup.d.ts.map +1 -0
  203. package/dist/{popups → components/popups}/templates/SimpleInputPopup.js +2 -2
  204. package/dist/components/popups/templates/SimpleInputPopup.js.map +1 -0
  205. package/dist/components/ui/FileCopyPrompt.d.ts.map +1 -0
  206. package/dist/components/ui/FileCopyPrompt.js.map +1 -0
  207. package/dist/components/{FooterHelp.d.ts → ui/FooterHelp.d.ts} +4 -0
  208. package/dist/components/ui/FooterHelp.d.ts.map +1 -0
  209. package/dist/components/{FooterHelp.js → ui/FooterHelp.js} +45 -1
  210. package/dist/components/ui/FooterHelp.js.map +1 -0
  211. package/dist/components/ui/QRCode.d.ts.map +1 -0
  212. package/dist/components/ui/QRCode.js.map +1 -0
  213. package/dist/components/ui/ToastNotification.d.ts +13 -0
  214. package/dist/components/ui/ToastNotification.d.ts.map +1 -0
  215. package/dist/components/ui/ToastNotification.js +22 -0
  216. package/dist/components/ui/ToastNotification.js.map +1 -0
  217. package/dist/components/ui/index.d.ts +4 -0
  218. package/dist/components/ui/index.d.ts.map +1 -0
  219. package/dist/components/ui/index.js +4 -0
  220. package/dist/components/ui/index.js.map +1 -0
  221. package/dist/constants/timing.d.ts +22 -0
  222. package/dist/constants/timing.d.ts.map +1 -0
  223. package/dist/constants/timing.js +26 -0
  224. package/dist/constants/timing.js.map +1 -0
  225. package/dist/dashboard.js +2 -2
  226. package/dist/hooks/useActionSystem.d.ts +5 -4
  227. package/dist/hooks/useActionSystem.d.ts.map +1 -1
  228. package/dist/hooks/useActionSystem.js +105 -114
  229. package/dist/hooks/useActionSystem.js.map +1 -1
  230. package/dist/hooks/useDebugInfo.d.ts +11 -0
  231. package/dist/hooks/useDebugInfo.d.ts.map +1 -0
  232. package/dist/hooks/useDebugInfo.js +34 -0
  233. package/dist/hooks/useDebugInfo.js.map +1 -0
  234. package/dist/hooks/useDialogState.d.ts +22 -0
  235. package/dist/hooks/useDialogState.d.ts.map +1 -0
  236. package/dist/hooks/useDialogState.js +62 -0
  237. package/dist/hooks/useDialogState.js.map +1 -0
  238. package/dist/hooks/useInputHandling.d.ts +60 -0
  239. package/dist/hooks/useInputHandling.d.ts.map +1 -0
  240. package/dist/hooks/useInputHandling.js +294 -0
  241. package/dist/hooks/useInputHandling.js.map +1 -0
  242. package/dist/hooks/useLayoutManagement.d.ts +12 -0
  243. package/dist/hooks/useLayoutManagement.d.ts.map +1 -0
  244. package/dist/hooks/useLayoutManagement.js +63 -0
  245. package/dist/hooks/useLayoutManagement.js.map +1 -0
  246. package/dist/hooks/usePaneCreation.d.ts.map +1 -1
  247. package/dist/hooks/usePaneCreation.js +4 -9
  248. package/dist/hooks/usePaneCreation.js.map +1 -1
  249. package/dist/hooks/usePaneLoading.d.ts +45 -0
  250. package/dist/hooks/usePaneLoading.d.ts.map +1 -0
  251. package/dist/hooks/usePaneLoading.js +208 -0
  252. package/dist/hooks/usePaneLoading.js.map +1 -0
  253. package/dist/hooks/usePaneRunner.d.ts.map +1 -1
  254. package/dist/hooks/usePaneRunner.js +9 -6
  255. package/dist/hooks/usePaneRunner.js.map +1 -1
  256. package/dist/hooks/usePaneSync.d.ts +34 -0
  257. package/dist/hooks/usePaneSync.d.ts.map +1 -0
  258. package/dist/hooks/usePaneSync.js +186 -0
  259. package/dist/hooks/usePaneSync.js.map +1 -0
  260. package/dist/hooks/usePanes.d.ts.map +1 -1
  261. package/dist/hooks/usePanes.js +68 -406
  262. package/dist/hooks/usePanes.js.map +1 -1
  263. package/dist/hooks/useServices.d.ts +24 -0
  264. package/dist/hooks/useServices.d.ts.map +1 -0
  265. package/dist/hooks/useServices.js +39 -0
  266. package/dist/hooks/useServices.js.map +1 -0
  267. package/dist/hooks/useShellDetection.d.ts +10 -0
  268. package/dist/hooks/useShellDetection.d.ts.map +1 -0
  269. package/dist/hooks/useShellDetection.js +67 -0
  270. package/dist/hooks/useShellDetection.js.map +1 -0
  271. package/dist/hooks/useStatusMessages.d.ts +11 -0
  272. package/dist/hooks/useStatusMessages.d.ts.map +1 -0
  273. package/dist/hooks/useStatusMessages.js +32 -0
  274. package/dist/hooks/useStatusMessages.js.map +1 -0
  275. package/dist/hooks/useTemporaryStatus.d.ts +13 -0
  276. package/dist/hooks/useTemporaryStatus.d.ts.map +1 -0
  277. package/dist/hooks/useTemporaryStatus.js +30 -0
  278. package/dist/hooks/useTemporaryStatus.js.map +1 -0
  279. package/dist/hooks/useTerminalWidth.d.ts.map +1 -1
  280. package/dist/hooks/useTerminalWidth.js +7 -12
  281. package/dist/hooks/useTerminalWidth.js.map +1 -1
  282. package/dist/hooks/useTunnelManagement.d.ts +18 -0
  283. package/dist/hooks/useTunnelManagement.d.ts.map +1 -0
  284. package/dist/hooks/useTunnelManagement.js +55 -0
  285. package/dist/hooks/useTunnelManagement.js.map +1 -0
  286. package/dist/hooks/useWorktreeActions.d.ts.map +1 -1
  287. package/dist/hooks/useWorktreeActions.js +18 -13
  288. package/dist/hooks/useWorktreeActions.js.map +1 -1
  289. package/dist/index.js +124 -94
  290. package/dist/index.js.map +1 -1
  291. package/dist/layout/LayoutCalculator.d.ts +62 -0
  292. package/dist/layout/LayoutCalculator.d.ts.map +1 -0
  293. package/dist/layout/LayoutCalculator.js +140 -0
  294. package/dist/layout/LayoutCalculator.js.map +1 -0
  295. package/dist/layout/SpacerManager.d.ts +64 -0
  296. package/dist/layout/SpacerManager.d.ts.map +1 -0
  297. package/dist/layout/SpacerManager.js +156 -0
  298. package/dist/layout/SpacerManager.js.map +1 -0
  299. package/dist/layout/TmuxLayoutApplier.d.ts +62 -0
  300. package/dist/layout/TmuxLayoutApplier.d.ts.map +1 -0
  301. package/dist/layout/TmuxLayoutApplier.js +147 -0
  302. package/dist/layout/TmuxLayoutApplier.js.map +1 -0
  303. package/dist/panes/decorative-pane.d.ts.map +1 -0
  304. package/dist/{decorative-pane.js → panes/decorative-pane.js} +1 -1
  305. package/dist/panes/decorative-pane.js.map +1 -0
  306. package/dist/panes/spacer-pane.d.ts.map +1 -0
  307. package/dist/panes/spacer-pane.js.map +1 -0
  308. package/dist/server/embedded-assets.d.ts.map +1 -1
  309. package/dist/server/embedded-assets.js +727 -5677
  310. package/dist/server/embedded-assets.js.map +1 -1
  311. package/dist/server/routes/actionsRoutes.d.ts +2 -0
  312. package/dist/server/routes/actionsRoutes.d.ts.map +1 -0
  313. package/dist/server/routes/actionsRoutes.js +110 -0
  314. package/dist/server/routes/actionsRoutes.js.map +1 -0
  315. package/dist/server/routes/healthRoutes.d.ts +13 -0
  316. package/dist/server/routes/healthRoutes.d.ts.map +1 -0
  317. package/dist/server/routes/healthRoutes.js +70 -0
  318. package/dist/server/routes/healthRoutes.js.map +1 -0
  319. package/dist/server/routes/index.d.ts +8 -0
  320. package/dist/server/routes/index.d.ts.map +1 -0
  321. package/dist/server/routes/index.js +67 -0
  322. package/dist/server/routes/index.js.map +1 -0
  323. package/dist/server/routes/keysRoutes.d.ts +33 -0
  324. package/dist/server/routes/keysRoutes.d.ts.map +1 -0
  325. package/dist/server/routes/keysRoutes.js +128 -0
  326. package/dist/server/routes/keysRoutes.js.map +1 -0
  327. package/dist/server/routes/panesRoutes.d.ts +2 -0
  328. package/dist/server/routes/panesRoutes.d.ts.map +1 -0
  329. package/dist/server/routes/panesRoutes.js +373 -0
  330. package/dist/server/routes/panesRoutes.js.map +1 -0
  331. package/dist/server/routes/settingsRoutes.d.ts +94 -0
  332. package/dist/server/routes/settingsRoutes.d.ts.map +1 -0
  333. package/dist/server/routes/settingsRoutes.js +159 -0
  334. package/dist/server/routes/settingsRoutes.js.map +1 -0
  335. package/dist/server/routes/streamRoutes.d.ts +18 -0
  336. package/dist/server/routes/streamRoutes.d.ts.map +1 -0
  337. package/dist/server/routes/streamRoutes.js +87 -0
  338. package/dist/server/routes/streamRoutes.js.map +1 -0
  339. package/dist/server/routes/tunnelRoutes.d.ts +11 -0
  340. package/dist/server/routes/tunnelRoutes.d.ts.map +1 -0
  341. package/dist/server/routes/tunnelRoutes.js +28 -0
  342. package/dist/server/routes/tunnelRoutes.js.map +1 -0
  343. package/dist/server/routes.d.ts +16 -2
  344. package/dist/server/routes.d.ts.map +1 -1
  345. package/dist/server/routes.js +16 -878
  346. package/dist/server/routes.js.map +1 -1
  347. package/dist/{AutoUpdater.d.ts → services/AutoUpdater.d.ts} +1 -0
  348. package/dist/services/AutoUpdater.d.ts.map +1 -0
  349. package/dist/{AutoUpdater.js → services/AutoUpdater.js} +44 -10
  350. package/dist/services/AutoUpdater.js.map +1 -0
  351. package/dist/services/PaneAnalyzer.d.ts.map +1 -0
  352. package/dist/{PaneAnalyzer.js → services/PaneAnalyzer.js} +1 -1
  353. package/dist/services/PaneAnalyzer.js.map +1 -0
  354. package/dist/services/PaneLifecycleManager.d.ts +60 -0
  355. package/dist/services/PaneLifecycleManager.d.ts.map +1 -0
  356. package/dist/services/PaneLifecycleManager.js +119 -0
  357. package/dist/services/PaneLifecycleManager.js.map +1 -0
  358. package/dist/services/PaneWorkerManager.d.ts.map +1 -1
  359. package/dist/services/PaneWorkerManager.js +6 -3
  360. package/dist/services/PaneWorkerManager.js.map +1 -1
  361. package/dist/services/PopupManager.d.ts +68 -0
  362. package/dist/services/PopupManager.d.ts.map +1 -0
  363. package/dist/services/PopupManager.js +415 -0
  364. package/dist/services/PopupManager.js.map +1 -0
  365. package/dist/services/StatusDetector.d.ts.map +1 -1
  366. package/dist/services/StatusDetector.js +6 -8
  367. package/dist/services/StatusDetector.js.map +1 -1
  368. package/dist/services/TerminalStreamer.d.ts +1 -0
  369. package/dist/services/TerminalStreamer.d.ts.map +1 -1
  370. package/dist/services/TerminalStreamer.js +22 -16
  371. package/dist/services/TerminalStreamer.js.map +1 -1
  372. package/dist/services/TmuxService.d.ts +346 -0
  373. package/dist/services/TmuxService.d.ts.map +1 -0
  374. package/dist/services/TmuxService.js +849 -0
  375. package/dist/services/TmuxService.js.map +1 -0
  376. package/dist/services/ToastService.d.ts +71 -0
  377. package/dist/services/ToastService.d.ts.map +1 -0
  378. package/dist/services/ToastService.js +151 -0
  379. package/dist/services/ToastService.js.map +1 -0
  380. package/dist/services/TunnelService.d.ts.map +1 -1
  381. package/dist/services/TunnelService.js +2 -1
  382. package/dist/services/TunnelService.js.map +1 -1
  383. package/dist/shared/StateManager.d.ts +22 -0
  384. package/dist/shared/StateManager.d.ts.map +1 -1
  385. package/dist/shared/StateManager.js +68 -1
  386. package/dist/shared/StateManager.js.map +1 -1
  387. package/dist/terminal.js +3 -3
  388. package/dist/types.d.ts +7 -0
  389. package/dist/types.d.ts.map +1 -1
  390. package/dist/utils/asciiArt.d.ts.map +1 -1
  391. package/dist/utils/asciiArt.js +9 -22
  392. package/dist/utils/asciiArt.js.map +1 -1
  393. package/dist/utils/atomicWrite.d.ts +33 -0
  394. package/dist/utils/atomicWrite.d.ts.map +1 -0
  395. package/dist/utils/atomicWrite.js +89 -0
  396. package/dist/utils/atomicWrite.js.map +1 -0
  397. package/dist/utils/conflictMonitor.d.ts +20 -0
  398. package/dist/utils/conflictMonitor.d.ts.map +1 -0
  399. package/dist/utils/conflictMonitor.js +113 -0
  400. package/dist/utils/conflictMonitor.js.map +1 -0
  401. package/dist/utils/conflictResolutionPane.d.ts.map +1 -1
  402. package/dist/utils/conflictResolutionPane.js +70 -79
  403. package/dist/utils/conflictResolutionPane.js.map +1 -1
  404. package/dist/utils/errorHandling.d.ts +37 -0
  405. package/dist/utils/errorHandling.d.ts.map +1 -0
  406. package/dist/utils/errorHandling.js +138 -0
  407. package/dist/utils/errorHandling.js.map +1 -0
  408. package/dist/utils/generated-agents-doc.d.ts +1 -1
  409. package/dist/utils/generated-agents-doc.js +1 -1
  410. package/dist/utils/git.d.ts +4 -0
  411. package/dist/utils/git.d.ts.map +1 -1
  412. package/dist/utils/git.js +15 -0
  413. package/dist/utils/git.js.map +1 -1
  414. package/dist/utils/hooksDocs.d.ts +1 -1
  415. package/dist/utils/layoutManager.d.ts +20 -16
  416. package/dist/utils/layoutManager.d.ts.map +1 -1
  417. package/dist/utils/layoutManager.js +159 -380
  418. package/dist/utils/layoutManager.js.map +1 -1
  419. package/dist/utils/mergeExecution.d.ts.map +1 -1
  420. package/dist/utils/mergeExecution.js +8 -1
  421. package/dist/utils/mergeExecution.js.map +1 -1
  422. package/dist/utils/mergeValidation.d.ts.map +1 -1
  423. package/dist/utils/mergeValidation.js +46 -13
  424. package/dist/utils/mergeValidation.js.map +1 -1
  425. package/dist/utils/paneCreation.d.ts.map +1 -1
  426. package/dist/utils/paneCreation.js +115 -106
  427. package/dist/utils/paneCreation.js.map +1 -1
  428. package/dist/utils/paneRebinding.d.ts +14 -0
  429. package/dist/utils/paneRebinding.d.ts.map +1 -0
  430. package/dist/utils/paneRebinding.js +30 -0
  431. package/dist/utils/paneRebinding.js.map +1 -0
  432. package/dist/utils/popup.d.ts.map +1 -1
  433. package/dist/utils/popup.js +11 -17
  434. package/dist/utils/popup.js.map +1 -1
  435. package/dist/utils/postPaneCleanup.d.ts.map +1 -1
  436. package/dist/utils/postPaneCleanup.js +5 -14
  437. package/dist/utils/postPaneCleanup.js.map +1 -1
  438. package/dist/utils/shellPaneDetection.d.ts +3 -3
  439. package/dist/utils/shellPaneDetection.d.ts.map +1 -1
  440. package/dist/utils/shellPaneDetection.js +43 -29
  441. package/dist/utils/shellPaneDetection.js.map +1 -1
  442. package/dist/utils/systemCheck.d.ts +19 -0
  443. package/dist/utils/systemCheck.d.ts.map +1 -0
  444. package/dist/utils/systemCheck.js +160 -0
  445. package/dist/utils/systemCheck.js.map +1 -0
  446. package/dist/utils/tmux.d.ts +26 -7
  447. package/dist/utils/tmux.d.ts.map +1 -1
  448. package/dist/utils/tmux.js +84 -76
  449. package/dist/utils/tmux.js.map +1 -1
  450. package/dist/utils/welcomePane.d.ts +2 -2
  451. package/dist/utils/welcomePane.d.ts.map +1 -1
  452. package/dist/utils/welcomePane.js +19 -33
  453. package/dist/utils/welcomePane.js.map +1 -1
  454. package/dist/utils/welcomePaneManager.d.ts.map +1 -1
  455. package/dist/utils/welcomePaneManager.js +11 -25
  456. package/dist/utils/welcomePaneManager.js.map +1 -1
  457. package/dist/workers/PaneWorker.js +7 -9
  458. package/dist/workers/PaneWorker.js.map +1 -1
  459. package/dist/workers/updateChecker.js +1 -1
  460. package/dist/workers/updateChecker.js.map +1 -1
  461. package/package.json +3 -1
  462. package/dist/AutoUpdater.d.ts.map +0 -1
  463. package/dist/AutoUpdater.js.map +0 -1
  464. package/dist/BetterTextInput.d.ts +0 -10
  465. package/dist/BetterTextInput.d.ts.map +0 -1
  466. package/dist/BetterTextInput.js +0 -177
  467. package/dist/BetterTextInput.js.map +0 -1
  468. package/dist/CleanTextInput.d.ts.map +0 -1
  469. package/dist/CleanTextInput.js.map +0 -1
  470. package/dist/EnhancedTextInput.d.ts +0 -13
  471. package/dist/EnhancedTextInput.d.ts.map +0 -1
  472. package/dist/EnhancedTextInput.js +0 -443
  473. package/dist/EnhancedTextInput.js.map +0 -1
  474. package/dist/GeminiTextInput.d.ts +0 -12
  475. package/dist/GeminiTextInput.d.ts.map +0 -1
  476. package/dist/GeminiTextInput.js +0 -210
  477. package/dist/GeminiTextInput.js.map +0 -1
  478. package/dist/MergePane.d.ts.map +0 -1
  479. package/dist/MergePane.js.map +0 -1
  480. package/dist/MultilineTextInput.d.ts +0 -10
  481. package/dist/MultilineTextInput.d.ts.map +0 -1
  482. package/dist/MultilineTextInput.js +0 -184
  483. package/dist/MultilineTextInput.js.map +0 -1
  484. package/dist/PaneAnalyzer.d.ts.map +0 -1
  485. package/dist/PaneAnalyzer.js.map +0 -1
  486. package/dist/SimpleEnhancedInput.d.ts +0 -13
  487. package/dist/SimpleEnhancedInput.d.ts.map +0 -1
  488. package/dist/SimpleEnhancedInput.js +0 -639
  489. package/dist/SimpleEnhancedInput.js.map +0 -1
  490. package/dist/SimpleGeminiInput.d.ts +0 -12
  491. package/dist/SimpleGeminiInput.d.ts.map +0 -1
  492. package/dist/SimpleGeminiInput.js +0 -223
  493. package/dist/SimpleGeminiInput.js.map +0 -1
  494. package/dist/StyledTextInput.d.ts.map +0 -1
  495. package/dist/StyledTextInput.js.map +0 -1
  496. package/dist/components/ActionChoiceDialog.d.ts.map +0 -1
  497. package/dist/components/ActionChoiceDialog.js.map +0 -1
  498. package/dist/components/ActionConfirmDialog.d.ts.map +0 -1
  499. package/dist/components/ActionConfirmDialog.js.map +0 -1
  500. package/dist/components/ActionInputDialog.d.ts.map +0 -1
  501. package/dist/components/ActionInputDialog.js.map +0 -1
  502. package/dist/components/ActionProgressDialog.d.ts.map +0 -1
  503. package/dist/components/ActionProgressDialog.js.map +0 -1
  504. package/dist/components/AgentChoiceDialog.d.ts.map +0 -1
  505. package/dist/components/AgentChoiceDialog.js.map +0 -1
  506. package/dist/components/CloseOptionsDialog.d.ts.map +0 -1
  507. package/dist/components/CloseOptionsDialog.js.map +0 -1
  508. package/dist/components/CommandPromptDialog.d.ts.map +0 -1
  509. package/dist/components/CommandPromptDialog.js.map +0 -1
  510. package/dist/components/CreatingIndicator.d.ts.map +0 -1
  511. package/dist/components/CreatingIndicator.js.map +0 -1
  512. package/dist/components/DialogBox.d.ts.map +0 -1
  513. package/dist/components/DialogBox.js.map +0 -1
  514. package/dist/components/FileCopyPrompt.d.ts.map +0 -1
  515. package/dist/components/FileCopyPrompt.js.map +0 -1
  516. package/dist/components/FooterHelp.d.ts.map +0 -1
  517. package/dist/components/FooterHelp.js.map +0 -1
  518. package/dist/components/HooksDialog.d.ts.map +0 -1
  519. package/dist/components/HooksDialog.js.map +0 -1
  520. package/dist/components/KebabMenu.d.ts.map +0 -1
  521. package/dist/components/KebabMenu.js.map +0 -1
  522. package/dist/components/LoadingIndicator.d.ts.map +0 -1
  523. package/dist/components/LoadingIndicator.js.map +0 -1
  524. package/dist/components/MergeConfirmationDialog.d.ts.map +0 -1
  525. package/dist/components/MergeConfirmationDialog.js.map +0 -1
  526. package/dist/components/PaneCard.d.ts.map +0 -1
  527. package/dist/components/PaneCard.js.map +0 -1
  528. package/dist/components/PanesGrid.d.ts.map +0 -1
  529. package/dist/components/PanesGrid.js.map +0 -1
  530. package/dist/components/QRCode.d.ts.map +0 -1
  531. package/dist/components/QRCode.js.map +0 -1
  532. package/dist/components/RunningIndicator.d.ts.map +0 -1
  533. package/dist/components/RunningIndicator.js.map +0 -1
  534. package/dist/components/SettingsDialog.d.ts.map +0 -1
  535. package/dist/components/SettingsDialog.js.map +0 -1
  536. package/dist/components/Spinner.d.ts.map +0 -1
  537. package/dist/components/Spinner.js.map +0 -1
  538. package/dist/components/UpdateDialog.d.ts.map +0 -1
  539. package/dist/components/UpdateDialog.js.map +0 -1
  540. package/dist/components/UpdatingIndicator.d.ts.map +0 -1
  541. package/dist/components/UpdatingIndicator.js.map +0 -1
  542. package/dist/decorative-pane.d.ts.map +0 -1
  543. package/dist/decorative-pane.js.map +0 -1
  544. package/dist/popups/agentChoicePopup.d.ts.map +0 -1
  545. package/dist/popups/agentChoicePopup.js.map +0 -1
  546. package/dist/popups/choicePopup.d.ts.map +0 -1
  547. package/dist/popups/choicePopup.js.map +0 -1
  548. package/dist/popups/components/FileList.d.ts.map +0 -1
  549. package/dist/popups/components/FileList.js.map +0 -1
  550. package/dist/popups/components/PopupContainer.d.ts.map +0 -1
  551. package/dist/popups/components/PopupContainer.js.map +0 -1
  552. package/dist/popups/components/PopupInputBox.d.ts.map +0 -1
  553. package/dist/popups/components/PopupInputBox.js.map +0 -1
  554. package/dist/popups/components/PopupWrapper.d.ts.map +0 -1
  555. package/dist/popups/components/PopupWrapper.js.map +0 -1
  556. package/dist/popups/components/index.d.ts.map +0 -1
  557. package/dist/popups/components/index.js.map +0 -1
  558. package/dist/popups/config.d.ts.map +0 -1
  559. package/dist/popups/config.js.map +0 -1
  560. package/dist/popups/confirmPopup.d.ts.map +0 -1
  561. package/dist/popups/confirmPopup.js.map +0 -1
  562. package/dist/popups/hooksPopup.d.ts.map +0 -1
  563. package/dist/popups/hooksPopup.js.map +0 -1
  564. package/dist/popups/inputPopup.d.ts.map +0 -1
  565. package/dist/popups/inputPopup.js.map +0 -1
  566. package/dist/popups/kebabMenuPopup.d.ts.map +0 -1
  567. package/dist/popups/kebabMenuPopup.js.map +0 -1
  568. package/dist/popups/logsPopup.d.ts.map +0 -1
  569. package/dist/popups/logsPopup.js.map +0 -1
  570. package/dist/popups/mergePopup.d.ts.map +0 -1
  571. package/dist/popups/mergePopup.js.map +0 -1
  572. package/dist/popups/newPanePopup.d.ts.map +0 -1
  573. package/dist/popups/newPanePopup.js.map +0 -1
  574. package/dist/popups/progressPopup.d.ts.map +0 -1
  575. package/dist/popups/progressPopup.js.map +0 -1
  576. package/dist/popups/remotePopup.d.ts.map +0 -1
  577. package/dist/popups/remotePopup.js.map +0 -1
  578. package/dist/popups/settingsPopup.d.ts.map +0 -1
  579. package/dist/popups/settingsPopup.js.map +0 -1
  580. package/dist/popups/shortcutsPopup.d.ts.map +0 -1
  581. package/dist/popups/shortcutsPopup.js.map +0 -1
  582. package/dist/popups/templates/SimpleInputPopup.d.ts.map +0 -1
  583. package/dist/popups/templates/SimpleInputPopup.js.map +0 -1
  584. package/dist/server/static.d.ts +0 -6
  585. package/dist/server/static.d.ts.map +0 -1
  586. package/dist/server/static.js +0 -3040
  587. package/dist/server/static.js.map +0 -1
  588. package/dist/spacer-pane.d.ts.map +0 -1
  589. package/dist/spacer-pane.js.map +0 -1
  590. /package/dist/components/{ActionChoiceDialog.js → dialogs/ActionChoiceDialog.js} +0 -0
  591. /package/dist/components/{ActionConfirmDialog.d.ts → dialogs/ActionConfirmDialog.d.ts} +0 -0
  592. /package/dist/components/{ActionConfirmDialog.js → dialogs/ActionConfirmDialog.js} +0 -0
  593. /package/dist/components/{ActionInputDialog.d.ts → dialogs/ActionInputDialog.d.ts} +0 -0
  594. /package/dist/components/{ActionProgressDialog.d.ts → dialogs/ActionProgressDialog.d.ts} +0 -0
  595. /package/dist/components/{ActionProgressDialog.js → dialogs/ActionProgressDialog.js} +0 -0
  596. /package/dist/components/{AgentChoiceDialog.d.ts → dialogs/AgentChoiceDialog.d.ts} +0 -0
  597. /package/dist/components/{AgentChoiceDialog.js → dialogs/AgentChoiceDialog.js} +0 -0
  598. /package/dist/components/{CloseOptionsDialog.js → dialogs/CloseOptionsDialog.js} +0 -0
  599. /package/dist/components/{CommandPromptDialog.d.ts → dialogs/CommandPromptDialog.d.ts} +0 -0
  600. /package/dist/components/{DialogBox.d.ts → dialogs/DialogBox.d.ts} +0 -0
  601. /package/dist/components/{DialogBox.js → dialogs/DialogBox.js} +0 -0
  602. /package/dist/components/{HooksDialog.d.ts → dialogs/HooksDialog.d.ts} +0 -0
  603. /package/dist/components/{HooksDialog.js → dialogs/HooksDialog.js} +0 -0
  604. /package/dist/components/{MergeConfirmationDialog.js → dialogs/MergeConfirmationDialog.js} +0 -0
  605. /package/dist/components/{SettingsDialog.js → dialogs/SettingsDialog.js} +0 -0
  606. /package/dist/components/{UpdateDialog.d.ts → dialogs/UpdateDialog.d.ts} +0 -0
  607. /package/dist/components/{UpdateDialog.js → dialogs/UpdateDialog.js} +0 -0
  608. /package/dist/components/{CreatingIndicator.d.ts → indicators/CreatingIndicator.d.ts} +0 -0
  609. /package/dist/components/{CreatingIndicator.js → indicators/CreatingIndicator.js} +0 -0
  610. /package/dist/components/{LoadingIndicator.d.ts → indicators/LoadingIndicator.d.ts} +0 -0
  611. /package/dist/components/{LoadingIndicator.js → indicators/LoadingIndicator.js} +0 -0
  612. /package/dist/components/{RunningIndicator.d.ts → indicators/RunningIndicator.d.ts} +0 -0
  613. /package/dist/components/{RunningIndicator.js → indicators/RunningIndicator.js} +0 -0
  614. /package/dist/components/{Spinner.d.ts → indicators/Spinner.d.ts} +0 -0
  615. /package/dist/components/{Spinner.js → indicators/Spinner.js} +0 -0
  616. /package/dist/components/{UpdatingIndicator.d.ts → indicators/UpdatingIndicator.d.ts} +0 -0
  617. /package/dist/components/{UpdatingIndicator.js → indicators/UpdatingIndicator.js} +0 -0
  618. /package/dist/{CleanTextInput.d.ts → components/inputs/CleanTextInput.d.ts} +0 -0
  619. /package/dist/{StyledTextInput.d.ts → components/inputs/StyledTextInput.d.ts} +0 -0
  620. /package/dist/{StyledTextInput.js → components/inputs/StyledTextInput.js} +0 -0
  621. /package/dist/components/{KebabMenu.js → panes/KebabMenu.js} +0 -0
  622. /package/dist/{MergePane.d.ts → components/panes/MergePane.d.ts} +0 -0
  623. /package/dist/{popups → components/popups}/agentChoicePopup.d.ts +0 -0
  624. /package/dist/{popups → components/popups}/choicePopup.d.ts +0 -0
  625. /package/dist/{popups → components/popups}/config.d.ts +0 -0
  626. /package/dist/{popups → components/popups}/confirmPopup.d.ts +0 -0
  627. /package/dist/{popups → components/popups}/hooksPopup.d.ts +0 -0
  628. /package/dist/{popups → components/popups}/inputPopup.d.ts +0 -0
  629. /package/dist/{popups → components/popups}/kebabMenuPopup.d.ts +0 -0
  630. /package/dist/{popups → components/popups}/logsPopup.d.ts +0 -0
  631. /package/dist/{popups → components/popups}/mergePopup.d.ts +0 -0
  632. /package/dist/{popups → components/popups}/newPanePopup.d.ts +0 -0
  633. /package/dist/{popups → components/popups}/progressPopup.d.ts +0 -0
  634. /package/dist/{popups → components/popups}/remotePopup.d.ts +0 -0
  635. /package/dist/{popups → components/popups}/settingsPopup.d.ts +0 -0
  636. /package/dist/{popups/components → components/popups/shared}/FileList.d.ts +0 -0
  637. /package/dist/{popups/components → components/popups/shared}/FileList.js +0 -0
  638. /package/dist/{popups/components → components/popups/shared}/PopupContainer.d.ts +0 -0
  639. /package/dist/{popups/components → components/popups/shared}/PopupContainer.js +0 -0
  640. /package/dist/{popups/components → components/popups/shared}/PopupInputBox.d.ts +0 -0
  641. /package/dist/{popups/components → components/popups/shared}/PopupInputBox.js +0 -0
  642. /package/dist/{popups/components → components/popups/shared}/PopupWrapper.d.ts +0 -0
  643. /package/dist/{popups/components → components/popups/shared}/PopupWrapper.js +0 -0
  644. /package/dist/{popups/components → components/popups/shared}/index.d.ts +0 -0
  645. /package/dist/{popups/components → components/popups/shared}/index.js +0 -0
  646. /package/dist/{popups → components/popups}/shortcutsPopup.d.ts +0 -0
  647. /package/dist/{popups → components/popups}/templates/SimpleInputPopup.d.ts +0 -0
  648. /package/dist/components/{FileCopyPrompt.d.ts → ui/FileCopyPrompt.d.ts} +0 -0
  649. /package/dist/components/{FileCopyPrompt.js → ui/FileCopyPrompt.js} +0 -0
  650. /package/dist/components/{QRCode.d.ts → ui/QRCode.d.ts} +0 -0
  651. /package/dist/components/{QRCode.js → ui/QRCode.js} +0 -0
  652. /package/dist/{decorative-pane.d.ts → panes/decorative-pane.d.ts} +0 -0
  653. /package/dist/{spacer-pane.d.ts → panes/spacer-pane.d.ts} +0 -0
  654. /package/dist/{spacer-pane.js → panes/spacer-pane.js} +0 -0
  655. /package/dist/{PaneAnalyzer.d.ts → services/PaneAnalyzer.d.ts} +0 -0
@@ -0,0 +1,849 @@
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
+ const result = await this.executeWithRetry(() => {
198
+ const output = this.execute(`tmux display-message -t '${paneId}' -p '#{pane_id}'`, { silent: true });
199
+ return output;
200
+ }, RetryStrategy.FAST, `paneExists(${paneId})`);
201
+ // Verify the pane ID is actually returned (not empty)
202
+ // Empty output indicates a zombie pane that exists but has no properties
203
+ return result.trim() === paneId;
204
+ }
205
+ catch {
206
+ // Expected - pane doesn't exist
207
+ return false;
208
+ }
209
+ }
210
+ /**
211
+ * Get content pane IDs (excludes control pane and spacer panes)
212
+ */
213
+ async getContentPaneIds(controlPaneId) {
214
+ const allPanes = await this.getAllPaneIds();
215
+ const contentPanes = [];
216
+ for (const id of allPanes) {
217
+ if (id === controlPaneId)
218
+ continue;
219
+ try {
220
+ const title = await this.getPaneTitle(id);
221
+ if (title !== 'dmux-spacer') {
222
+ contentPanes.push(id);
223
+ }
224
+ }
225
+ catch {
226
+ // Include pane if we can't get title
227
+ contentPanes.push(id);
228
+ }
229
+ }
230
+ return contentPanes;
231
+ }
232
+ // ===== WRITE OPERATIONS (careful with retry strategy) =====
233
+ /**
234
+ * Split a pane horizontally
235
+ * Returns the new pane ID
236
+ */
237
+ async splitPane(options = {}) {
238
+ return this.executeWithRetry(() => {
239
+ let cmd = 'tmux split-window -h -P -F \'#{pane_id}\'';
240
+ if (options.targetPane) {
241
+ cmd += ` -t '${options.targetPane}'`;
242
+ }
243
+ if (options.cwd) {
244
+ cmd += ` -c "${options.cwd}"`;
245
+ }
246
+ if (options.command) {
247
+ cmd += ` "${options.command}"`;
248
+ }
249
+ return this.execute(cmd);
250
+ }, RetryStrategy.FAST, // UI operation, fast retry
251
+ 'splitPane');
252
+ }
253
+ /**
254
+ * Resize a pane
255
+ */
256
+ async resizePane(paneId, dimensions) {
257
+ await this.executeWithRetry(() => {
258
+ if (dimensions.width !== undefined) {
259
+ this.execute(`tmux resize-pane -t '${paneId}' -x ${dimensions.width}`);
260
+ }
261
+ if (dimensions.height !== undefined) {
262
+ this.execute(`tmux resize-pane -t '${paneId}' -y ${dimensions.height}`);
263
+ }
264
+ }, RetryStrategy.FAST, `resizePane(${paneId})`);
265
+ }
266
+ /**
267
+ * Resize window
268
+ */
269
+ async resizeWindow(dimensions) {
270
+ await this.executeWithRetry(() => {
271
+ this.execute(`tmux resize-window -x ${dimensions.width} -y ${dimensions.height}`);
272
+ }, RetryStrategy.FAST, 'resizeWindow');
273
+ }
274
+ /**
275
+ * Select a layout string
276
+ */
277
+ async selectLayout(layoutString) {
278
+ await this.executeWithRetry(() => {
279
+ this.execute(`tmux select-layout '${layoutString}'`);
280
+ }, RetryStrategy.FAST, 'selectLayout');
281
+ }
282
+ /**
283
+ * Set pane title
284
+ */
285
+ async setPaneTitle(paneId, title) {
286
+ await this.executeWithRetry(() => {
287
+ this.execute(`tmux select-pane -t '${paneId}' -T '${title}'`);
288
+ }, RetryStrategy.FAST, `setPaneTitle(${paneId})`);
289
+ }
290
+ /**
291
+ * Select a pane (make it active)
292
+ */
293
+ async selectPane(paneId) {
294
+ await this.executeWithRetry(() => {
295
+ this.execute(`tmux select-pane -t '${paneId}'`);
296
+ }, RetryStrategy.FAST, `selectPane(${paneId})`);
297
+ }
298
+ /**
299
+ * Set global tmux option
300
+ */
301
+ async setOption(option, value) {
302
+ await this.executeWithRetry(() => {
303
+ this.execute(`tmux set-option -g ${option} ${value}`);
304
+ }, RetryStrategy.FAST, `setOption(${option})`);
305
+ }
306
+ /**
307
+ * Send keys to a pane
308
+ * @deprecated Use sendShellCommand() for shell commands or sendTmuxKeys() for tmux keys
309
+ */
310
+ async sendKeys(paneId, keys) {
311
+ await this.executeWithRetry(() => {
312
+ this.execute(`tmux send-keys -t '${paneId}' ${keys}`);
313
+ }, RetryStrategy.FAST, `sendKeys(${paneId})`);
314
+ }
315
+ /**
316
+ * Send a shell command to a pane (auto-quotes to preserve spaces)
317
+ *
318
+ * Use this for shell commands like: `claude "my prompt"`, `git status`, etc.
319
+ * The command will be automatically quoted to prevent tmux from splitting on spaces.
320
+ *
321
+ * @example
322
+ * await tmuxService.sendShellCommand(paneId, 'claude "fix the bug" --permission-mode=acceptEdits');
323
+ * await tmuxService.sendTmuxKeys(paneId, 'Enter'); // Then send Enter key
324
+ *
325
+ * @param paneId The tmux pane ID (e.g., "%1")
326
+ * @param command The shell command to execute (will be auto-quoted)
327
+ * @see sendTmuxKeys For sending tmux key sequences (Enter, C-l, etc.)
328
+ */
329
+ async sendShellCommand(paneId, command) {
330
+ // Quote the command to preserve spaces, escaping any single quotes
331
+ const quotedCommand = `'${command.replace(/'/g, "'\\''")}'`;
332
+ await this.executeWithRetry(() => {
333
+ this.execute(`tmux send-keys -t '${paneId}' ${quotedCommand}`);
334
+ }, RetryStrategy.FAST, `sendShellCommand(${paneId})`);
335
+ }
336
+ /**
337
+ * Send tmux key sequences to a pane (no quoting)
338
+ *
339
+ * Use this for tmux keys like: Enter, C-l, Escape, Tab, C-c, etc.
340
+ * Keys are sent as-is without quoting.
341
+ *
342
+ * @example
343
+ * await tmuxService.sendShellCommand(paneId, 'git status');
344
+ * await tmuxService.sendTmuxKeys(paneId, 'Enter'); // Execute the command
345
+ *
346
+ * @example
347
+ * await tmuxService.sendTmuxKeys(paneId, 'C-l'); // Clear screen
348
+ *
349
+ * @param paneId The tmux pane ID (e.g., "%1")
350
+ * @param keys The tmux key sequence (Enter, C-l, Escape, etc.)
351
+ * @see sendShellCommand For sending shell commands (auto-quoted)
352
+ */
353
+ async sendTmuxKeys(paneId, keys) {
354
+ await this.executeWithRetry(() => {
355
+ this.execute(`tmux send-keys -t '${paneId}' ${keys}`);
356
+ }, RetryStrategy.FAST, `sendTmuxKeys(${paneId})`);
357
+ }
358
+ /**
359
+ * Set a tmux buffer with content
360
+ */
361
+ async setBuffer(bufferName, content) {
362
+ await this.executeWithRetry(() => {
363
+ // Escape content for shell
364
+ const escaped = content.replace(/\\/g, '\\\\').replace(/'/g, "'\\''");
365
+ this.execute(`tmux set-buffer -b '${bufferName}' -- '${escaped}'`);
366
+ }, RetryStrategy.FAST, `setBuffer(${bufferName})`);
367
+ }
368
+ /**
369
+ * Paste a tmux buffer to a pane
370
+ */
371
+ async pasteBuffer(bufferName, paneId) {
372
+ await this.executeWithRetry(() => {
373
+ this.execute(`tmux paste-buffer -b '${bufferName}' -t '${paneId}'`);
374
+ }, RetryStrategy.FAST, `pasteBuffer(${bufferName})`);
375
+ }
376
+ /**
377
+ * Delete a tmux buffer
378
+ */
379
+ async deleteBuffer(bufferName) {
380
+ await this.executeWithRetry(() => {
381
+ this.execute(`tmux delete-buffer -b '${bufferName}'`);
382
+ }, RetryStrategy.FAST, `deleteBuffer(${bufferName})`);
383
+ }
384
+ /**
385
+ * Refresh the tmux client (UI operation, optional)
386
+ */
387
+ async refreshClient() {
388
+ try {
389
+ await this.executeWithRetry(() => {
390
+ this.execute('tmux refresh-client', { silent: true });
391
+ }, RetryStrategy.FAST, 'refreshClient');
392
+ }
393
+ catch {
394
+ // Intentionally silent - UI refresh is optional
395
+ this.logger.debug('tmux refresh-client failed (non-critical)', 'debug');
396
+ }
397
+ }
398
+ // ===== DESTRUCTIVE OPERATIONS (NO RETRY) =====
399
+ /**
400
+ * Kill a pane (DESTRUCTIVE - no retry)
401
+ * Gracefully handles case where pane doesn't exist (considered success)
402
+ */
403
+ async killPane(paneId) {
404
+ try {
405
+ await this.executeWithRetry(() => {
406
+ this.execute(`tmux kill-pane -t '${paneId}'`);
407
+ }, RetryStrategy.NONE, // Destructive operation
408
+ `killPane(${paneId})`);
409
+ }
410
+ catch (error) {
411
+ // If pane doesn't exist, consider it success (already killed)
412
+ const errorMessage = error instanceof Error ? error.message : String(error);
413
+ if (errorMessage.includes("can't find pane")) {
414
+ this.logger.debug(`Pane ${paneId} already gone, treating as success`, 'killPane');
415
+ return;
416
+ }
417
+ // Re-throw other errors
418
+ throw error;
419
+ }
420
+ }
421
+ /**
422
+ * Kill a window (DESTRUCTIVE - no retry)
423
+ */
424
+ async killWindow(windowId) {
425
+ await this.executeWithRetry(() => {
426
+ this.execute(`tmux kill-window -t '${windowId}'`);
427
+ }, RetryStrategy.NONE, // Destructive operation
428
+ `killWindow(${windowId})`);
429
+ }
430
+ /**
431
+ * Create a new window
432
+ * Returns the window ID
433
+ */
434
+ async newWindow(options = {}) {
435
+ return this.executeWithRetry(() => {
436
+ let cmd = 'tmux new-window';
437
+ if (options.detached) {
438
+ cmd += ' -d';
439
+ }
440
+ if (options.name) {
441
+ cmd += ` -n '${options.name}'`;
442
+ }
443
+ cmd += " -P -F '#{window_id}'";
444
+ return this.execute(cmd);
445
+ }, RetryStrategy.FAST, 'newWindow');
446
+ }
447
+ /**
448
+ * Join a pane from a window (pulls pane into current window)
449
+ */
450
+ async joinPane(sourceWindowId, horizontal = true) {
451
+ await this.executeWithRetry(() => {
452
+ const direction = horizontal ? '-h' : '-v';
453
+ this.execute(`tmux join-pane ${direction} -s '${sourceWindowId}'`);
454
+ }, RetryStrategy.FAST, `joinPane(${sourceWindowId})`);
455
+ }
456
+ /**
457
+ * Check if a window exists
458
+ */
459
+ async windowExists(windowId) {
460
+ try {
461
+ await this.executeWithRetry(() => {
462
+ this.execute(`tmux list-windows -F '#{window_id}' | grep -q '${windowId}'`, { silent: true });
463
+ return true;
464
+ }, RetryStrategy.FAST, `windowExists(${windowId})`);
465
+ return true;
466
+ }
467
+ catch {
468
+ return false;
469
+ }
470
+ }
471
+ // ===== SYNCHRONOUS FALLBACKS (for gradual migration) =====
472
+ /**
473
+ * Get window dimensions (sync version for compatibility)
474
+ */
475
+ getWindowDimensionsSync() {
476
+ try {
477
+ const output = this.execute('tmux display-message -p "#{window_width} #{window_height}"');
478
+ const [width, height] = output.split(' ').map(n => parseInt(n, 10));
479
+ return { width, height };
480
+ }
481
+ catch (error) {
482
+ this.logger.warn('Failed to get window dimensions, using fallback', 'TmuxService');
483
+ return { width: 120, height: 40 }; // Fallback dimensions
484
+ }
485
+ }
486
+ /**
487
+ * Get terminal dimensions (sync version for compatibility)
488
+ */
489
+ getTerminalDimensionsSync() {
490
+ try {
491
+ const output = this.execute('tmux display-message -p "#{client_width} #{client_height}"');
492
+ const [width, height] = output.split(' ').map(n => parseInt(n, 10));
493
+ return { width, height };
494
+ }
495
+ catch (error) {
496
+ this.logger.warn('Failed to get terminal dimensions, using fallback', 'TmuxService');
497
+ return { width: 120, height: 40 }; // Fallback dimensions
498
+ }
499
+ }
500
+ /**
501
+ * Get status bar height in lines
502
+ * Returns the number of lines the status bar occupies
503
+ *
504
+ * IMPORTANT DIMENSION RELATIONSHIPS:
505
+ *
506
+ * When window-size is "latest" (automatic):
507
+ * - tmux automatically manages window size to fit client
508
+ * - window_height = client_height (tmux handles status bar internally)
509
+ *
510
+ * When window-size is "manual" (dmux uses this):
511
+ * - You control window dimensions explicitly
512
+ * - total_terminal = window_height + status_bar_height
513
+ * - When setting window size: window_height = client_height - status_bar_height
514
+ *
515
+ * Therefore, when calculating layouts in manual mode:
516
+ * - Get client_height (terminal size)
517
+ * - Subtract status bar height to get available window height
518
+ * - Set window to that calculated height
519
+ *
520
+ * @returns Number of lines occupied by status bar (0 if disabled)
521
+ */
522
+ getStatusBarHeightSync() {
523
+ try {
524
+ // Check if status bar is enabled
525
+ const statusEnabled = this.execute('tmux display-message -p "#{status}"').trim();
526
+ if (statusEnabled !== 'on') {
527
+ return 0;
528
+ }
529
+ // Count the number of status-format lines
530
+ // Each status-format line adds one line to the status bar height
531
+ const statusFormats = this.execute('tmux show-options -gv status-format');
532
+ const formatLines = statusFormats.split('\n').filter(line => line.trim()).length;
533
+ return formatLines;
534
+ }
535
+ catch (error) {
536
+ this.logger.debug('Failed to get status bar height, assuming 0', 'TmuxService');
537
+ return 0;
538
+ }
539
+ }
540
+ /**
541
+ * Get comprehensive dimension information for debugging
542
+ * Shows the relationship between terminal, window, and status bar dimensions
543
+ */
544
+ getDimensionInfoSync() {
545
+ const client = this.getTerminalDimensionsSync();
546
+ const window = this.getWindowDimensionsSync();
547
+ const statusBarHeight = this.getStatusBarHeightSync();
548
+ return {
549
+ clientWidth: client.width,
550
+ clientHeight: client.height,
551
+ windowWidth: window.width,
552
+ windowHeight: window.height,
553
+ statusBarHeight,
554
+ statusBarEnabled: statusBarHeight > 0,
555
+ };
556
+ }
557
+ /**
558
+ * Calculate the proper window dimensions for manual window-size mode
559
+ *
560
+ * SINGLE SOURCE OF TRUTH for window dimension calculations.
561
+ *
562
+ * When window-size is "manual", we must subtract the status bar height
563
+ * to prevent terminal scrolling.
564
+ *
565
+ * Formula: windowHeight = terminalHeight - statusBarHeight
566
+ *
567
+ * @returns Calculated window dimensions that fit within the terminal
568
+ */
569
+ calculateWindowDimensions() {
570
+ const termDims = this.getTerminalDimensionsSync();
571
+ const statusBarHeight = this.getStatusBarHeightSync();
572
+ // Calculate window height: terminal height - status bar
573
+ const windowHeight = termDims.height - statusBarHeight;
574
+ return {
575
+ width: termDims.width,
576
+ height: windowHeight,
577
+ };
578
+ }
579
+ /**
580
+ * Get all pane IDs (sync version for compatibility)
581
+ */
582
+ getAllPaneIdsSync() {
583
+ try {
584
+ const output = this.execute('tmux list-panes -F "#{pane_id}"');
585
+ return output.split('\n').filter(id => id.trim());
586
+ }
587
+ catch (error) {
588
+ this.logger.warn('Failed to get pane IDs, returning empty array', 'TmuxService');
589
+ return [];
590
+ }
591
+ }
592
+ /**
593
+ * Get pane positions (sync version for compatibility)
594
+ */
595
+ getPanePositionsSync() {
596
+ try {
597
+ const output = this.execute(`tmux list-panes -F '#{pane_id} #{pane_left} #{pane_top} #{pane_width} #{pane_height}'`);
598
+ return output.split('\n').map(line => {
599
+ const [paneId, left, top, width, height] = line.split(' ');
600
+ return {
601
+ paneId,
602
+ left: parseInt(left, 10),
603
+ top: parseInt(top, 10),
604
+ width: parseInt(width, 10),
605
+ height: parseInt(height, 10),
606
+ };
607
+ });
608
+ }
609
+ catch (error) {
610
+ this.logger.warn('Failed to get pane positions, returning empty array', 'TmuxService');
611
+ return [];
612
+ }
613
+ }
614
+ /**
615
+ * Get pane title (sync version for compatibility)
616
+ */
617
+ getPaneTitleSync(paneId) {
618
+ try {
619
+ return this.execute(`tmux display-message -t '${paneId}' -p '#{pane_title}'`);
620
+ }
621
+ catch (error) {
622
+ this.logger.warn(`Failed to get pane title for ${paneId}, returning empty string`, 'TmuxService');
623
+ return '';
624
+ }
625
+ }
626
+ /**
627
+ * Split pane (sync version for compatibility)
628
+ */
629
+ splitPaneSync(options = {}) {
630
+ let cmd = 'tmux split-window -h -P -F \'#{pane_id}\'';
631
+ if (options.targetPane) {
632
+ cmd += ` -t '${options.targetPane}'`;
633
+ }
634
+ if (options.cwd) {
635
+ cmd += ` -c "${options.cwd}"`;
636
+ }
637
+ if (options.command) {
638
+ cmd += ` "${options.command}"`;
639
+ }
640
+ return this.execute(cmd);
641
+ }
642
+ /**
643
+ * Refresh client (sync version for compatibility)
644
+ */
645
+ refreshClientSync() {
646
+ try {
647
+ this.execute('tmux refresh-client', { silent: true });
648
+ }
649
+ catch {
650
+ // Intentionally silent - UI refresh is optional
651
+ }
652
+ }
653
+ /**
654
+ * Clear tmux history (sync version for compatibility)
655
+ */
656
+ clearHistorySync() {
657
+ try {
658
+ this.execute('tmux clear-history', { silent: true });
659
+ }
660
+ catch {
661
+ // Intentionally silent - history clearing is optional
662
+ }
663
+ }
664
+ /**
665
+ * Get tmux version string
666
+ */
667
+ getVersionSync() {
668
+ try {
669
+ return this.execute('tmux -V');
670
+ }
671
+ catch (error) {
672
+ this.logger.warn('Failed to get tmux version', 'TmuxService');
673
+ return '';
674
+ }
675
+ }
676
+ /**
677
+ * Get a session option value
678
+ */
679
+ getSessionOptionSync(sessionName, option) {
680
+ try {
681
+ return this.execute(`tmux show -t ${sessionName} ${option}`);
682
+ }
683
+ catch (error) {
684
+ this.logger.warn(`Failed to get session option ${option} for ${sessionName}`, 'TmuxService');
685
+ return '';
686
+ }
687
+ }
688
+ /**
689
+ * Set a session option
690
+ */
691
+ setSessionOptionSync(sessionName, option, value) {
692
+ try {
693
+ this.execute(`tmux set -t ${sessionName} ${option} ${value}`, { silent: true });
694
+ }
695
+ catch (error) {
696
+ this.logger.warn(`Failed to set session option ${option} for ${sessionName}`, 'TmuxService');
697
+ }
698
+ }
699
+ /**
700
+ * Get current pane ID (sync version for compatibility)
701
+ */
702
+ getCurrentPaneIdSync() {
703
+ try {
704
+ return this.execute('tmux display-message -p "#{pane_id}"');
705
+ }
706
+ catch (error) {
707
+ this.logger.warn('Failed to get current pane ID', 'TmuxService');
708
+ throw error;
709
+ }
710
+ }
711
+ /**
712
+ * Set window option (sync version for compatibility)
713
+ */
714
+ setWindowOptionSync(option, value) {
715
+ try {
716
+ this.execute(`tmux set-window-option ${option} ${value}`, { silent: true });
717
+ }
718
+ catch (error) {
719
+ this.logger.warn(`Failed to set window option ${option}`, 'TmuxService');
720
+ }
721
+ }
722
+ /**
723
+ * Select layout by name (sync version for compatibility)
724
+ */
725
+ selectLayoutSync(layout) {
726
+ try {
727
+ this.execute(`tmux select-layout '${layout}'`);
728
+ }
729
+ catch (error) {
730
+ this.logger.warn(`Failed to select layout ${layout}`, 'TmuxService');
731
+ throw error;
732
+ }
733
+ }
734
+ /**
735
+ * Resize pane (sync version for compatibility)
736
+ */
737
+ resizePaneSync(paneId, dimensions) {
738
+ try {
739
+ if (dimensions.width !== undefined) {
740
+ this.execute(`tmux resize-pane -t '${paneId}' -x ${dimensions.width}`);
741
+ }
742
+ if (dimensions.height !== undefined) {
743
+ this.execute(`tmux resize-pane -t '${paneId}' -y ${dimensions.height}`);
744
+ }
745
+ }
746
+ catch (error) {
747
+ this.logger.warn(`Failed to resize pane ${paneId}`, 'TmuxService');
748
+ throw error;
749
+ }
750
+ }
751
+ /**
752
+ * Resize window (sync version for compatibility)
753
+ */
754
+ resizeWindowSync(dimensions) {
755
+ try {
756
+ this.execute(`tmux resize-window -x ${dimensions.width} -y ${dimensions.height}`);
757
+ }
758
+ catch (error) {
759
+ this.logger.warn('Failed to resize window', 'TmuxService');
760
+ throw error;
761
+ }
762
+ }
763
+ /**
764
+ * Select pane (sync version for compatibility)
765
+ */
766
+ selectPaneSync(paneId) {
767
+ try {
768
+ this.execute(`tmux select-pane -t '${paneId}'`);
769
+ }
770
+ catch (error) {
771
+ this.logger.warn(`Failed to select pane ${paneId}`, 'TmuxService');
772
+ throw error;
773
+ }
774
+ }
775
+ /**
776
+ * Set pane title (sync version for compatibility)
777
+ */
778
+ setPaneTitleSync(paneId, title) {
779
+ try {
780
+ this.execute(`tmux select-pane -t '${paneId}' -T '${title}'`);
781
+ }
782
+ catch (error) {
783
+ this.logger.warn(`Failed to set pane title for ${paneId}`, 'TmuxService');
784
+ throw error;
785
+ }
786
+ }
787
+ /**
788
+ * Kill pane (sync version for compatibility)
789
+ */
790
+ killPaneSync(paneId) {
791
+ try {
792
+ this.execute(`tmux kill-pane -t '${paneId}'`);
793
+ }
794
+ catch (error) {
795
+ this.logger.warn(`Failed to kill pane ${paneId}`, 'TmuxService');
796
+ throw error;
797
+ }
798
+ }
799
+ /**
800
+ * List panes formatted (sync version for compatibility)
801
+ */
802
+ listPanesSync(format) {
803
+ try {
804
+ const formatStr = format || '#{pane_id}=#{pane_index}';
805
+ return this.execute(`tmux list-panes -F "${formatStr}"`);
806
+ }
807
+ catch (error) {
808
+ this.logger.warn('Failed to list panes', 'TmuxService');
809
+ return '';
810
+ }
811
+ }
812
+ /**
813
+ * Set global tmux option (sync version for compatibility)
814
+ */
815
+ setGlobalOptionSync(option, value) {
816
+ try {
817
+ this.execute(`tmux set-option -g ${option} ${value}`, { silent: true });
818
+ }
819
+ catch (error) {
820
+ this.logger.warn(`Failed to set global option ${option}`, 'TmuxService');
821
+ }
822
+ }
823
+ /**
824
+ * Get pane width (sync version for compatibility)
825
+ */
826
+ getPaneWidthSync(paneId) {
827
+ try {
828
+ const output = this.execute(`tmux display-message -t '${paneId}' -p '#{pane_width}'`);
829
+ return parseInt(output, 10);
830
+ }
831
+ catch (error) {
832
+ this.logger.warn(`Failed to get pane width for ${paneId}`, 'TmuxService');
833
+ return 0;
834
+ }
835
+ }
836
+ /**
837
+ * Get current layout string (sync version for compatibility)
838
+ */
839
+ getCurrentLayoutSync() {
840
+ try {
841
+ return this.execute('tmux display-message -p "#{window_layout}"');
842
+ }
843
+ catch (error) {
844
+ this.logger.warn('Failed to get current layout', 'TmuxService');
845
+ return '';
846
+ }
847
+ }
848
+ }
849
+ //# sourceMappingURL=TmuxService.js.map