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.
- package/dist/DmuxApp.d.ts +2 -2
- package/dist/DmuxApp.d.ts.map +1 -1
- package/dist/DmuxApp.js +405 -1134
- package/dist/DmuxApp.js.map +1 -1
- package/dist/actions/implementations/closeAction.d.ts +10 -0
- package/dist/actions/implementations/closeAction.d.ts.map +1 -0
- package/dist/actions/implementations/closeAction.js +197 -0
- package/dist/actions/implementations/closeAction.js.map +1 -0
- package/dist/actions/implementations/copyPathAction.d.ts +10 -0
- package/dist/actions/implementations/copyPathAction.d.ts.map +1 -0
- package/dist/actions/implementations/copyPathAction.js +34 -0
- package/dist/actions/implementations/copyPathAction.js.map +1 -0
- package/dist/actions/implementations/duplicateAction.d.ts +10 -0
- package/dist/actions/implementations/duplicateAction.d.ts.map +1 -0
- package/dist/actions/implementations/duplicateAction.js +25 -0
- package/dist/actions/implementations/duplicateAction.js.map +1 -0
- package/dist/actions/implementations/index.d.ts +14 -0
- package/dist/actions/implementations/index.d.ts.map +1 -0
- package/dist/actions/implementations/index.js +14 -0
- package/dist/actions/implementations/index.js.map +1 -0
- package/dist/actions/implementations/mergeAction.d.ts +14 -0
- package/dist/actions/implementations/mergeAction.d.ts.map +1 -0
- package/dist/actions/implementations/mergeAction.js +84 -0
- package/dist/actions/implementations/mergeAction.js.map +1 -0
- package/dist/actions/implementations/openInEditorAction.d.ts +12 -0
- package/dist/actions/implementations/openInEditorAction.d.ts.map +1 -0
- package/dist/actions/implementations/openInEditorAction.js +33 -0
- package/dist/actions/implementations/openInEditorAction.js.map +1 -0
- package/dist/actions/implementations/renameAction.d.ts +13 -0
- package/dist/actions/implementations/renameAction.d.ts.map +1 -0
- package/dist/actions/implementations/renameAction.js +18 -0
- package/dist/actions/implementations/renameAction.js.map +1 -0
- package/dist/actions/implementations/toggleAutopilotAction.d.ts +10 -0
- package/dist/actions/implementations/toggleAutopilotAction.d.ts.map +1 -0
- package/dist/actions/implementations/toggleAutopilotAction.js +33 -0
- package/dist/actions/implementations/toggleAutopilotAction.js.map +1 -0
- package/dist/actions/implementations/viewAction.d.ts +10 -0
- package/dist/actions/implementations/viewAction.d.ts.map +1 -0
- package/dist/actions/implementations/viewAction.js +26 -0
- package/dist/actions/implementations/viewAction.js.map +1 -0
- package/dist/actions/merge/commitMessageHandler.d.ts +27 -0
- package/dist/actions/merge/commitMessageHandler.d.ts.map +1 -0
- package/dist/actions/merge/commitMessageHandler.js +131 -0
- package/dist/actions/merge/commitMessageHandler.js.map +1 -0
- package/dist/actions/merge/conflictResolution.d.ts +13 -0
- package/dist/actions/merge/conflictResolution.d.ts.map +1 -0
- package/dist/actions/merge/conflictResolution.js +134 -0
- package/dist/actions/merge/conflictResolution.js.map +1 -0
- package/dist/actions/merge/issueHandlers/index.d.ts +11 -0
- package/dist/actions/merge/issueHandlers/index.d.ts.map +1 -0
- package/dist/actions/merge/issueHandlers/index.js +8 -0
- package/dist/actions/merge/issueHandlers/index.js.map +1 -0
- package/dist/actions/merge/issueHandlers/mainDirtyHandler.d.ts +13 -0
- package/dist/actions/merge/issueHandlers/mainDirtyHandler.d.ts.map +1 -0
- package/dist/actions/merge/issueHandlers/mainDirtyHandler.js +72 -0
- package/dist/actions/merge/issueHandlers/mainDirtyHandler.js.map +1 -0
- package/dist/actions/merge/issueHandlers/mergeConflictHandler.d.ts +13 -0
- package/dist/actions/merge/issueHandlers/mergeConflictHandler.d.ts.map +1 -0
- package/dist/actions/merge/issueHandlers/mergeConflictHandler.js +52 -0
- package/dist/actions/merge/issueHandlers/mergeConflictHandler.js.map +1 -0
- package/dist/actions/merge/issueHandlers/nothingToMergeHandler.d.ts +7 -0
- package/dist/actions/merge/issueHandlers/nothingToMergeHandler.d.ts.map +1 -0
- package/dist/actions/merge/issueHandlers/nothingToMergeHandler.js +12 -0
- package/dist/actions/merge/issueHandlers/nothingToMergeHandler.js.map +1 -0
- package/dist/actions/merge/issueHandlers/worktreeUncommittedHandler.d.ts +13 -0
- package/dist/actions/merge/issueHandlers/worktreeUncommittedHandler.d.ts.map +1 -0
- package/dist/actions/merge/issueHandlers/worktreeUncommittedHandler.js +49 -0
- package/dist/actions/merge/issueHandlers/worktreeUncommittedHandler.js.map +1 -0
- package/dist/actions/merge/mergeExecution.d.ts +22 -0
- package/dist/actions/merge/mergeExecution.d.ts.map +1 -0
- package/dist/actions/merge/mergeExecution.js +180 -0
- package/dist/actions/merge/mergeExecution.js.map +1 -0
- package/dist/actions/paneActions.d.ts +3 -40
- package/dist/actions/paneActions.d.ts.map +1 -1
- package/dist/actions/paneActions.js +4 -981
- package/dist/actions/paneActions.js.map +1 -1
- package/dist/actions/types.d.ts +2 -0
- package/dist/actions/types.d.ts.map +1 -1
- package/dist/actions/types.js +1 -0
- package/dist/actions/types.js.map +1 -1
- package/dist/components/{ActionChoiceDialog.d.ts → dialogs/ActionChoiceDialog.d.ts} +1 -1
- package/dist/components/dialogs/ActionChoiceDialog.d.ts.map +1 -0
- package/dist/components/dialogs/ActionChoiceDialog.js.map +1 -0
- package/dist/components/dialogs/ActionConfirmDialog.d.ts.map +1 -0
- package/dist/components/dialogs/ActionConfirmDialog.js.map +1 -0
- package/dist/components/dialogs/ActionInputDialog.d.ts.map +1 -0
- package/dist/components/{ActionInputDialog.js → dialogs/ActionInputDialog.js} +4 -3
- package/dist/components/dialogs/ActionInputDialog.js.map +1 -0
- package/dist/components/dialogs/ActionProgressDialog.d.ts.map +1 -0
- package/dist/components/dialogs/ActionProgressDialog.js.map +1 -0
- package/dist/components/dialogs/AgentChoiceDialog.d.ts.map +1 -0
- package/dist/components/dialogs/AgentChoiceDialog.js.map +1 -0
- package/dist/components/{CloseOptionsDialog.d.ts → dialogs/CloseOptionsDialog.d.ts} +1 -1
- package/dist/components/dialogs/CloseOptionsDialog.d.ts.map +1 -0
- package/dist/components/dialogs/CloseOptionsDialog.js.map +1 -0
- package/dist/components/dialogs/CommandPromptDialog.d.ts.map +1 -0
- package/dist/components/{CommandPromptDialog.js → dialogs/CommandPromptDialog.js} +1 -1
- package/dist/components/dialogs/CommandPromptDialog.js.map +1 -0
- package/dist/components/dialogs/DialogBox.d.ts +16 -0
- package/dist/components/dialogs/DialogBox.d.ts.map +1 -0
- package/dist/components/dialogs/DialogBox.js +12 -0
- package/dist/components/dialogs/DialogBox.js.map +1 -0
- package/dist/components/dialogs/HooksDialog.d.ts.map +1 -0
- package/dist/components/dialogs/HooksDialog.js.map +1 -0
- package/dist/components/{MergeConfirmationDialog.d.ts → dialogs/MergeConfirmationDialog.d.ts} +1 -1
- package/dist/components/dialogs/MergeConfirmationDialog.d.ts.map +1 -0
- package/dist/components/dialogs/MergeConfirmationDialog.js.map +1 -0
- package/dist/components/{SettingsDialog.d.ts → dialogs/SettingsDialog.d.ts} +1 -1
- package/dist/components/dialogs/SettingsDialog.d.ts.map +1 -0
- package/dist/components/dialogs/SettingsDialog.js.map +1 -0
- package/dist/components/dialogs/UpdateDialog.d.ts.map +1 -0
- package/dist/components/dialogs/UpdateDialog.js.map +1 -0
- package/dist/components/indicators/CreatingIndicator.d.ts.map +1 -0
- package/dist/components/indicators/CreatingIndicator.js.map +1 -0
- package/dist/components/indicators/LoadingIndicator.d.ts.map +1 -0
- package/dist/components/indicators/LoadingIndicator.js.map +1 -0
- package/dist/components/indicators/RunningIndicator.d.ts.map +1 -0
- package/dist/components/indicators/RunningIndicator.js.map +1 -0
- package/dist/components/indicators/Spinner.d.ts.map +1 -0
- package/dist/components/indicators/Spinner.js.map +1 -0
- package/dist/components/indicators/UpdatingIndicator.d.ts.map +1 -0
- package/dist/components/indicators/UpdatingIndicator.js.map +1 -0
- package/dist/components/indicators/index.d.ts +6 -0
- package/dist/components/indicators/index.d.ts.map +1 -0
- package/dist/components/indicators/index.js +6 -0
- package/dist/components/indicators/index.js.map +1 -0
- package/dist/components/inputs/CleanTextInput.d.ts +19 -0
- package/dist/components/inputs/CleanTextInput.d.ts.map +1 -0
- package/dist/{CleanTextInput.js → components/inputs/CleanTextInput.js} +98 -160
- package/dist/components/inputs/CleanTextInput.js.map +1 -0
- package/dist/components/inputs/StyledTextInput.d.ts.map +1 -0
- package/dist/components/inputs/StyledTextInput.js.map +1 -0
- package/dist/components/inputs/index.d.ts +3 -0
- package/dist/components/inputs/index.d.ts.map +1 -0
- package/dist/components/inputs/index.js +3 -0
- package/dist/components/inputs/index.js.map +1 -0
- package/dist/components/{KebabMenu.d.ts → panes/KebabMenu.d.ts} +1 -1
- package/dist/components/panes/KebabMenu.d.ts.map +1 -0
- package/dist/components/panes/KebabMenu.js.map +1 -0
- package/dist/components/panes/MergePane.d.ts.map +1 -0
- package/dist/{MergePane.js → components/panes/MergePane.js} +1 -1
- package/dist/components/panes/MergePane.js.map +1 -0
- package/dist/components/{PaneCard.d.ts → panes/PaneCard.d.ts} +4 -2
- package/dist/components/panes/PaneCard.d.ts.map +1 -0
- package/dist/components/panes/PaneCard.js +55 -0
- package/dist/components/panes/PaneCard.js.map +1 -0
- package/dist/components/panes/PanesGrid.d.ts +12 -0
- package/dist/components/panes/PanesGrid.d.ts.map +1 -0
- package/dist/components/panes/PanesGrid.js +49 -0
- package/dist/components/panes/PanesGrid.js.map +1 -0
- package/dist/components/panes/index.d.ts +5 -0
- package/dist/components/panes/index.d.ts.map +1 -0
- package/dist/components/panes/index.js +5 -0
- package/dist/components/panes/index.js.map +1 -0
- package/dist/components/popups/agentChoicePopup.d.ts +7 -0
- package/dist/components/popups/agentChoicePopup.d.ts.map +1 -0
- package/dist/components/popups/agentChoicePopup.js +74 -0
- package/dist/components/popups/agentChoicePopup.js.map +1 -0
- package/dist/components/popups/choicePopup.d.ts +7 -0
- package/dist/components/popups/choicePopup.d.ts.map +1 -0
- package/dist/components/popups/choicePopup.js +64 -0
- package/dist/components/popups/choicePopup.js.map +1 -0
- package/dist/components/popups/config.d.ts +40 -0
- package/dist/components/popups/config.d.ts.map +1 -0
- package/dist/components/popups/config.js +40 -0
- package/dist/components/popups/config.js.map +1 -0
- package/dist/components/popups/confirmPopup.d.ts +7 -0
- package/dist/components/popups/confirmPopup.d.ts.map +1 -0
- package/dist/components/popups/confirmPopup.js +71 -0
- package/dist/components/popups/confirmPopup.js.map +1 -0
- package/dist/components/popups/hooksPopup.d.ts +7 -0
- package/dist/components/popups/hooksPopup.d.ts.map +1 -0
- package/dist/components/popups/hooksPopup.js +71 -0
- package/dist/components/popups/hooksPopup.js.map +1 -0
- package/dist/components/popups/inputPopup.d.ts +7 -0
- package/dist/components/popups/inputPopup.d.ts.map +1 -0
- package/dist/components/popups/inputPopup.js +47 -0
- package/dist/components/popups/inputPopup.js.map +1 -0
- package/dist/components/popups/kebabMenuPopup.d.ts +7 -0
- package/dist/components/popups/kebabMenuPopup.d.ts.map +1 -0
- package/dist/components/popups/kebabMenuPopup.js +52 -0
- package/dist/components/popups/kebabMenuPopup.js.map +1 -0
- package/dist/components/popups/logsPopup.d.ts +12 -0
- package/dist/components/popups/logsPopup.d.ts.map +1 -0
- package/dist/components/popups/logsPopup.js +372 -0
- package/dist/components/popups/logsPopup.js.map +1 -0
- package/dist/components/popups/mergePopup.d.ts +7 -0
- package/dist/components/popups/mergePopup.d.ts.map +1 -0
- package/dist/components/popups/mergePopup.js +310 -0
- package/dist/components/popups/mergePopup.js.map +1 -0
- package/dist/components/popups/newPanePopup.d.ts +7 -0
- package/dist/components/popups/newPanePopup.d.ts.map +1 -0
- package/dist/components/popups/newPanePopup.js +234 -0
- package/dist/components/popups/newPanePopup.js.map +1 -0
- package/dist/components/popups/progressPopup.d.ts +8 -0
- package/dist/components/popups/progressPopup.d.ts.map +1 -0
- package/dist/components/popups/progressPopup.js +53 -0
- package/dist/components/popups/progressPopup.js.map +1 -0
- package/dist/components/popups/remotePopup.d.ts +6 -0
- package/dist/components/popups/remotePopup.d.ts.map +1 -0
- package/dist/components/popups/remotePopup.js +166 -0
- package/dist/components/popups/remotePopup.js.map +1 -0
- package/dist/components/popups/settingsPopup.d.ts +7 -0
- package/dist/components/popups/settingsPopup.d.ts.map +1 -0
- package/dist/components/popups/settingsPopup.js +212 -0
- package/dist/components/popups/settingsPopup.js.map +1 -0
- package/dist/components/popups/shared/FileList.d.ts +13 -0
- package/dist/components/popups/shared/FileList.d.ts.map +1 -0
- package/dist/components/popups/shared/FileList.js +61 -0
- package/dist/components/popups/shared/FileList.js.map +1 -0
- package/dist/components/popups/shared/PopupContainer.d.ts +14 -0
- package/dist/components/popups/shared/PopupContainer.d.ts.map +1 -0
- package/dist/components/popups/shared/PopupContainer.js +15 -0
- package/dist/components/popups/shared/PopupContainer.js.map +1 -0
- package/dist/components/popups/shared/PopupInputBox.d.ts +11 -0
- package/dist/components/popups/shared/PopupInputBox.d.ts.map +1 -0
- package/dist/components/popups/shared/PopupInputBox.js +10 -0
- package/dist/components/popups/shared/PopupInputBox.js.map +1 -0
- package/dist/components/popups/shared/PopupWrapper.d.ts +37 -0
- package/dist/components/popups/shared/PopupWrapper.d.ts.map +1 -0
- package/dist/components/popups/shared/PopupWrapper.js +88 -0
- package/dist/components/popups/shared/PopupWrapper.js.map +1 -0
- package/dist/components/popups/shared/index.d.ts +8 -0
- package/dist/components/popups/shared/index.d.ts.map +1 -0
- package/dist/components/popups/shared/index.js +8 -0
- package/dist/components/popups/shared/index.js.map +1 -0
- package/dist/components/popups/shortcutsPopup.d.ts +6 -0
- package/dist/components/popups/shortcutsPopup.d.ts.map +1 -0
- package/dist/components/popups/shortcutsPopup.js +74 -0
- package/dist/components/popups/shortcutsPopup.js.map +1 -0
- package/dist/components/popups/templates/SimpleInputPopup.d.ts +15 -0
- package/dist/components/popups/templates/SimpleInputPopup.d.ts.map +1 -0
- package/dist/components/popups/templates/SimpleInputPopup.js +28 -0
- package/dist/components/popups/templates/SimpleInputPopup.js.map +1 -0
- package/dist/components/ui/FileCopyPrompt.d.ts.map +1 -0
- package/dist/components/ui/FileCopyPrompt.js.map +1 -0
- package/dist/components/ui/FooterHelp.d.ts +19 -0
- package/dist/components/ui/FooterHelp.d.ts.map +1 -0
- package/dist/components/ui/FooterHelp.js +55 -0
- package/dist/components/ui/FooterHelp.js.map +1 -0
- package/dist/components/ui/QRCode.d.ts.map +1 -0
- package/dist/components/ui/QRCode.js.map +1 -0
- package/dist/components/ui/index.d.ts +4 -0
- package/dist/components/ui/index.d.ts.map +1 -0
- package/dist/components/ui/index.js +4 -0
- package/dist/components/ui/index.js.map +1 -0
- package/dist/constants/timing.d.ts +22 -0
- package/dist/constants/timing.d.ts.map +1 -0
- package/dist/constants/timing.js +26 -0
- package/dist/constants/timing.js.map +1 -0
- package/dist/dashboard.js +1 -1
- package/dist/hooks/useActionSystem.d.ts +18 -4
- package/dist/hooks/useActionSystem.d.ts.map +1 -1
- package/dist/hooks/useActionSystem.js +125 -30
- package/dist/hooks/useActionSystem.js.map +1 -1
- package/dist/hooks/useDebugInfo.d.ts +11 -0
- package/dist/hooks/useDebugInfo.d.ts.map +1 -0
- package/dist/hooks/useDebugInfo.js +34 -0
- package/dist/hooks/useDebugInfo.js.map +1 -0
- package/dist/hooks/useDialogState.d.ts +22 -0
- package/dist/hooks/useDialogState.d.ts.map +1 -0
- package/dist/hooks/useDialogState.js +62 -0
- package/dist/hooks/useDialogState.js.map +1 -0
- package/dist/hooks/useInputHandling.d.ts +60 -0
- package/dist/hooks/useInputHandling.d.ts.map +1 -0
- package/dist/hooks/useInputHandling.js +280 -0
- package/dist/hooks/useInputHandling.js.map +1 -0
- package/dist/hooks/useLayoutManagement.d.ts +12 -0
- package/dist/hooks/useLayoutManagement.d.ts.map +1 -0
- package/dist/hooks/useLayoutManagement.js +58 -0
- package/dist/hooks/useLayoutManagement.js.map +1 -0
- package/dist/hooks/useNavigation.js +1 -1
- package/dist/hooks/useNavigation.js.map +1 -1
- package/dist/hooks/usePaneCreation.d.ts +1 -2
- package/dist/hooks/usePaneCreation.d.ts.map +1 -1
- package/dist/hooks/usePaneCreation.js +17 -36
- package/dist/hooks/usePaneCreation.js.map +1 -1
- package/dist/hooks/usePaneLoading.d.ts +45 -0
- package/dist/hooks/usePaneLoading.d.ts.map +1 -0
- package/dist/hooks/usePaneLoading.js +188 -0
- package/dist/hooks/usePaneLoading.js.map +1 -0
- package/dist/hooks/usePaneRunner.d.ts.map +1 -1
- package/dist/hooks/usePaneRunner.js +16 -8
- package/dist/hooks/usePaneRunner.js.map +1 -1
- package/dist/hooks/usePaneSync.d.ts +34 -0
- package/dist/hooks/usePaneSync.d.ts.map +1 -0
- package/dist/hooks/usePaneSync.js +182 -0
- package/dist/hooks/usePaneSync.js.map +1 -0
- package/dist/hooks/usePanes.d.ts.map +1 -1
- package/dist/hooks/usePanes.js +81 -258
- package/dist/hooks/usePanes.js.map +1 -1
- package/dist/hooks/useServices.d.ts +24 -0
- package/dist/hooks/useServices.d.ts.map +1 -0
- package/dist/hooks/useServices.js +39 -0
- package/dist/hooks/useServices.js.map +1 -0
- package/dist/hooks/useShellDetection.d.ts +10 -0
- package/dist/hooks/useShellDetection.d.ts.map +1 -0
- package/dist/hooks/useShellDetection.js +53 -0
- package/dist/hooks/useShellDetection.js.map +1 -0
- package/dist/hooks/useStatusMessages.d.ts +11 -0
- package/dist/hooks/useStatusMessages.d.ts.map +1 -0
- package/dist/hooks/useStatusMessages.js +32 -0
- package/dist/hooks/useStatusMessages.js.map +1 -0
- package/dist/hooks/useTemporaryStatus.d.ts +13 -0
- package/dist/hooks/useTemporaryStatus.d.ts.map +1 -0
- package/dist/hooks/useTemporaryStatus.js +30 -0
- package/dist/hooks/useTemporaryStatus.js.map +1 -0
- package/dist/hooks/useTerminalWidth.d.ts.map +1 -1
- package/dist/hooks/useTerminalWidth.js +7 -12
- package/dist/hooks/useTerminalWidth.js.map +1 -1
- package/dist/hooks/useTunnelManagement.d.ts +18 -0
- package/dist/hooks/useTunnelManagement.d.ts.map +1 -0
- package/dist/hooks/useTunnelManagement.js +55 -0
- package/dist/hooks/useTunnelManagement.js.map +1 -0
- package/dist/hooks/useWorktreeActions.d.ts.map +1 -1
- package/dist/hooks/useWorktreeActions.js +23 -24
- package/dist/hooks/useWorktreeActions.js.map +1 -1
- package/dist/index.js +279 -73
- package/dist/index.js.map +1 -1
- package/dist/layout/LayoutCalculator.d.ts +62 -0
- package/dist/layout/LayoutCalculator.d.ts.map +1 -0
- package/dist/layout/LayoutCalculator.js +143 -0
- package/dist/layout/LayoutCalculator.js.map +1 -0
- package/dist/layout/SpacerManager.d.ts +64 -0
- package/dist/layout/SpacerManager.d.ts.map +1 -0
- package/dist/layout/SpacerManager.js +148 -0
- package/dist/layout/SpacerManager.js.map +1 -0
- package/dist/layout/TmuxLayoutApplier.d.ts +59 -0
- package/dist/layout/TmuxLayoutApplier.d.ts.map +1 -0
- package/dist/layout/TmuxLayoutApplier.js +135 -0
- package/dist/layout/TmuxLayoutApplier.js.map +1 -0
- package/dist/panes/decorative-pane.d.ts +3 -0
- package/dist/panes/decorative-pane.d.ts.map +1 -0
- package/dist/panes/decorative-pane.js +136 -0
- package/dist/panes/decorative-pane.js.map +1 -0
- package/dist/panes/spacer-pane.d.ts +8 -0
- package/dist/panes/spacer-pane.d.ts.map +1 -0
- package/dist/panes/spacer-pane.js +40 -0
- package/dist/panes/spacer-pane.js.map +1 -0
- package/dist/server/embedded-assets.d.ts.map +1 -1
- package/dist/server/embedded-assets.js +849 -4752
- package/dist/server/embedded-assets.js.map +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/routes/actionsRoutes.d.ts +2 -0
- package/dist/server/routes/actionsRoutes.d.ts.map +1 -0
- package/dist/server/routes/actionsRoutes.js +110 -0
- package/dist/server/routes/actionsRoutes.js.map +1 -0
- package/dist/server/routes/healthRoutes.d.ts +13 -0
- package/dist/server/routes/healthRoutes.d.ts.map +1 -0
- package/dist/server/routes/healthRoutes.js +70 -0
- package/dist/server/routes/healthRoutes.js.map +1 -0
- package/dist/server/routes/index.d.ts +8 -0
- package/dist/server/routes/index.d.ts.map +1 -0
- package/dist/server/routes/index.js +67 -0
- package/dist/server/routes/index.js.map +1 -0
- package/dist/server/routes/keysRoutes.d.ts +20 -0
- package/dist/server/routes/keysRoutes.d.ts.map +1 -0
- package/dist/server/routes/keysRoutes.js +111 -0
- package/dist/server/routes/keysRoutes.js.map +1 -0
- package/dist/server/routes/panesRoutes.d.ts +2 -0
- package/dist/server/routes/panesRoutes.d.ts.map +1 -0
- package/dist/server/routes/panesRoutes.js +373 -0
- package/dist/server/routes/panesRoutes.js.map +1 -0
- package/dist/server/routes/settingsRoutes.d.ts +94 -0
- package/dist/server/routes/settingsRoutes.d.ts.map +1 -0
- package/dist/server/routes/settingsRoutes.js +159 -0
- package/dist/server/routes/settingsRoutes.js.map +1 -0
- package/dist/server/routes/streamRoutes.d.ts +18 -0
- package/dist/server/routes/streamRoutes.d.ts.map +1 -0
- package/dist/server/routes/streamRoutes.js +87 -0
- package/dist/server/routes/streamRoutes.js.map +1 -0
- package/dist/server/routes/tunnelRoutes.d.ts +11 -0
- package/dist/server/routes/tunnelRoutes.d.ts.map +1 -0
- package/dist/server/routes/tunnelRoutes.js +28 -0
- package/dist/server/routes/tunnelRoutes.js.map +1 -0
- package/dist/server/routes.d.ts +16 -2
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +16 -811
- package/dist/server/routes.js.map +1 -1
- package/dist/{AutoUpdater.d.ts → services/AutoUpdater.d.ts} +1 -0
- package/dist/services/AutoUpdater.d.ts.map +1 -0
- package/dist/{AutoUpdater.js → services/AutoUpdater.js} +42 -9
- package/dist/services/AutoUpdater.js.map +1 -0
- package/dist/services/ConfigWatcher.d.ts.map +1 -1
- package/dist/services/ConfigWatcher.js +10 -3
- package/dist/services/ConfigWatcher.js.map +1 -1
- package/dist/services/LogService.d.ts +112 -0
- package/dist/services/LogService.d.ts.map +1 -0
- package/dist/services/LogService.js +252 -0
- package/dist/services/LogService.js.map +1 -0
- package/dist/services/PaneAnalyzer.d.ts.map +1 -0
- package/dist/{PaneAnalyzer.js → services/PaneAnalyzer.js} +1 -1
- package/dist/services/PaneAnalyzer.js.map +1 -0
- package/dist/services/PaneLifecycleManager.d.ts +60 -0
- package/dist/services/PaneLifecycleManager.d.ts.map +1 -0
- package/dist/services/PaneLifecycleManager.js +119 -0
- package/dist/services/PaneLifecycleManager.js.map +1 -0
- package/dist/services/PaneWorkerManager.d.ts.map +1 -1
- package/dist/services/PaneWorkerManager.js +41 -12
- package/dist/services/PaneWorkerManager.js.map +1 -1
- package/dist/services/PopupManager.d.ts +68 -0
- package/dist/services/PopupManager.d.ts.map +1 -0
- package/dist/services/PopupManager.js +415 -0
- package/dist/services/PopupManager.js.map +1 -0
- package/dist/services/StatusDetector.js +1 -1
- package/dist/services/StatusDetector.js.map +1 -1
- package/dist/services/TerminalStreamer.d.ts +1 -0
- package/dist/services/TerminalStreamer.d.ts.map +1 -1
- package/dist/services/TerminalStreamer.js +22 -16
- package/dist/services/TerminalStreamer.js.map +1 -1
- package/dist/services/TmuxService.d.ts +298 -0
- package/dist/services/TmuxService.d.ts.map +1 -0
- package/dist/services/TmuxService.js +768 -0
- package/dist/services/TmuxService.js.map +1 -0
- package/dist/services/TunnelService.d.ts +1 -0
- package/dist/services/TunnelService.d.ts.map +1 -1
- package/dist/services/TunnelService.js +57 -15
- package/dist/services/TunnelService.js.map +1 -1
- package/dist/shared/StateManager.d.ts +49 -1
- package/dist/shared/StateManager.d.ts.map +1 -1
- package/dist/shared/StateManager.js +97 -2
- package/dist/shared/StateManager.js.map +1 -1
- package/dist/theme/colors.d.ts +25 -0
- package/dist/theme/colors.d.ts.map +1 -0
- package/dist/theme/colors.js +33 -0
- package/dist/theme/colors.js.map +1 -0
- package/dist/types.d.ts +18 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/asciiArt.d.ts +26 -0
- package/dist/utils/asciiArt.d.ts.map +1 -0
- package/dist/utils/asciiArt.js +75 -0
- package/dist/utils/asciiArt.js.map +1 -0
- package/dist/utils/conflictMonitor.d.ts +20 -0
- package/dist/utils/conflictMonitor.d.ts.map +1 -0
- package/dist/utils/conflictMonitor.js +113 -0
- package/dist/utils/conflictMonitor.js.map +1 -0
- package/dist/utils/conflictResolutionPane.d.ts.map +1 -1
- package/dist/utils/conflictResolutionPane.js +75 -80
- package/dist/utils/conflictResolutionPane.js.map +1 -1
- package/dist/utils/errorHandling.d.ts +37 -0
- package/dist/utils/errorHandling.d.ts.map +1 -0
- package/dist/utils/errorHandling.js +112 -0
- package/dist/utils/errorHandling.js.map +1 -0
- package/dist/utils/fileScanner.d.ts +23 -0
- package/dist/utils/fileScanner.d.ts.map +1 -0
- package/dist/utils/fileScanner.js +123 -0
- package/dist/utils/fileScanner.js.map +1 -0
- package/dist/utils/generated-agents-doc.d.ts +1 -1
- package/dist/utils/generated-agents-doc.js +1 -1
- package/dist/utils/git.d.ts +4 -0
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +15 -0
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/hooks.d.ts.map +1 -1
- package/dist/utils/hooks.js +65 -36
- package/dist/utils/hooks.js.map +1 -1
- package/dist/utils/hooksDocs.d.ts +1 -1
- package/dist/utils/layoutManager.d.ts +49 -0
- package/dist/utils/layoutManager.d.ts.map +1 -0
- package/dist/utils/layoutManager.js +249 -0
- package/dist/utils/layoutManager.js.map +1 -0
- package/dist/utils/mergeExecution.d.ts.map +1 -1
- package/dist/utils/mergeExecution.js +8 -1
- package/dist/utils/mergeExecution.js.map +1 -1
- package/dist/utils/mergeValidation.d.ts.map +1 -1
- package/dist/utils/mergeValidation.js +42 -13
- package/dist/utils/mergeValidation.js.map +1 -1
- package/dist/utils/paneCreation.d.ts.map +1 -1
- package/dist/utils/paneCreation.js +210 -88
- package/dist/utils/paneCreation.js.map +1 -1
- package/dist/utils/paneRebinding.d.ts +14 -0
- package/dist/utils/paneRebinding.d.ts.map +1 -0
- package/dist/utils/paneRebinding.js +28 -0
- package/dist/utils/paneRebinding.js.map +1 -0
- package/dist/utils/popup.d.ts +97 -0
- package/dist/utils/popup.d.ts.map +1 -0
- package/dist/utils/popup.js +503 -0
- package/dist/utils/popup.js.map +1 -0
- package/dist/utils/postPaneCleanup.d.ts +12 -0
- package/dist/utils/postPaneCleanup.d.ts.map +1 -0
- package/dist/utils/postPaneCleanup.js +54 -0
- package/dist/utils/postPaneCleanup.js.map +1 -0
- package/dist/utils/shellPaneDetection.d.ts +44 -0
- package/dist/utils/shellPaneDetection.d.ts.map +1 -0
- package/dist/utils/shellPaneDetection.js +179 -0
- package/dist/utils/shellPaneDetection.js.map +1 -0
- package/dist/utils/systemCheck.d.ts +19 -0
- package/dist/utils/systemCheck.d.ts.map +1 -0
- package/dist/utils/systemCheck.js +160 -0
- package/dist/utils/systemCheck.js.map +1 -0
- package/dist/utils/tmux.d.ts +72 -1
- package/dist/utils/tmux.d.ts.map +1 -1
- package/dist/utils/tmux.js +369 -99
- package/dist/utils/tmux.js.map +1 -1
- package/dist/utils/welcomePane.d.ts +22 -0
- package/dist/utils/welcomePane.d.ts.map +1 -0
- package/dist/utils/welcomePane.js +111 -0
- package/dist/utils/welcomePane.js.map +1 -0
- package/dist/utils/welcomePaneManager.d.ts +36 -0
- package/dist/utils/welcomePaneManager.d.ts.map +1 -0
- package/dist/utils/welcomePaneManager.js +160 -0
- package/dist/utils/welcomePaneManager.js.map +1 -0
- package/dist/workers/PaneWorker.js +8 -8
- package/dist/workers/PaneWorker.js.map +1 -1
- package/dist/workers/updateChecker.js +1 -1
- package/dist/workers/updateChecker.js.map +1 -1
- package/package.json +7 -2
- package/dist/AutoUpdater.d.ts.map +0 -1
- package/dist/AutoUpdater.js.map +0 -1
- package/dist/BetterTextInput.d.ts +0 -10
- package/dist/BetterTextInput.d.ts.map +0 -1
- package/dist/BetterTextInput.js +0 -177
- package/dist/BetterTextInput.js.map +0 -1
- package/dist/CleanTextInput.d.ts +0 -10
- package/dist/CleanTextInput.d.ts.map +0 -1
- package/dist/CleanTextInput.js.map +0 -1
- package/dist/EnhancedTextInput.d.ts +0 -13
- package/dist/EnhancedTextInput.d.ts.map +0 -1
- package/dist/EnhancedTextInput.js +0 -443
- package/dist/EnhancedTextInput.js.map +0 -1
- package/dist/GeminiTextInput.d.ts +0 -12
- package/dist/GeminiTextInput.d.ts.map +0 -1
- package/dist/GeminiTextInput.js +0 -210
- package/dist/GeminiTextInput.js.map +0 -1
- package/dist/MergePane.d.ts.map +0 -1
- package/dist/MergePane.js.map +0 -1
- package/dist/MultilineTextInput.d.ts +0 -10
- package/dist/MultilineTextInput.d.ts.map +0 -1
- package/dist/MultilineTextInput.js +0 -184
- package/dist/MultilineTextInput.js.map +0 -1
- package/dist/PaneAnalyzer.d.ts.map +0 -1
- package/dist/PaneAnalyzer.js.map +0 -1
- package/dist/SimpleEnhancedInput.d.ts +0 -13
- package/dist/SimpleEnhancedInput.d.ts.map +0 -1
- package/dist/SimpleEnhancedInput.js +0 -639
- package/dist/SimpleEnhancedInput.js.map +0 -1
- package/dist/SimpleGeminiInput.d.ts +0 -12
- package/dist/SimpleGeminiInput.d.ts.map +0 -1
- package/dist/SimpleGeminiInput.js +0 -223
- package/dist/SimpleGeminiInput.js.map +0 -1
- package/dist/StyledTextInput.d.ts.map +0 -1
- package/dist/StyledTextInput.js.map +0 -1
- package/dist/components/ActionChoiceDialog.d.ts.map +0 -1
- package/dist/components/ActionChoiceDialog.js.map +0 -1
- package/dist/components/ActionConfirmDialog.d.ts.map +0 -1
- package/dist/components/ActionConfirmDialog.js.map +0 -1
- package/dist/components/ActionInputDialog.d.ts.map +0 -1
- package/dist/components/ActionInputDialog.js.map +0 -1
- package/dist/components/ActionProgressDialog.d.ts.map +0 -1
- package/dist/components/ActionProgressDialog.js.map +0 -1
- package/dist/components/AgentChoiceDialog.d.ts.map +0 -1
- package/dist/components/AgentChoiceDialog.js.map +0 -1
- package/dist/components/CloseOptionsDialog.d.ts.map +0 -1
- package/dist/components/CloseOptionsDialog.js.map +0 -1
- package/dist/components/CommandPromptDialog.d.ts.map +0 -1
- package/dist/components/CommandPromptDialog.js.map +0 -1
- package/dist/components/CreatingIndicator.d.ts.map +0 -1
- package/dist/components/CreatingIndicator.js.map +0 -1
- package/dist/components/FileCopyPrompt.d.ts.map +0 -1
- package/dist/components/FileCopyPrompt.js.map +0 -1
- package/dist/components/FooterHelp.d.ts +0 -10
- package/dist/components/FooterHelp.d.ts.map +0 -1
- package/dist/components/FooterHelp.js +0 -19
- package/dist/components/FooterHelp.js.map +0 -1
- package/dist/components/HooksDialog.d.ts.map +0 -1
- package/dist/components/HooksDialog.js.map +0 -1
- package/dist/components/KebabMenu.d.ts.map +0 -1
- package/dist/components/KebabMenu.js.map +0 -1
- package/dist/components/LoadingIndicator.d.ts.map +0 -1
- package/dist/components/LoadingIndicator.js.map +0 -1
- package/dist/components/MergeConfirmationDialog.d.ts.map +0 -1
- package/dist/components/MergeConfirmationDialog.js.map +0 -1
- package/dist/components/NewPaneDialog.d.ts +0 -9
- package/dist/components/NewPaneDialog.d.ts.map +0 -1
- package/dist/components/NewPaneDialog.js +0 -11
- package/dist/components/NewPaneDialog.js.map +0 -1
- package/dist/components/PaneCard.d.ts.map +0 -1
- package/dist/components/PaneCard.js +0 -38
- package/dist/components/PaneCard.js.map +0 -1
- package/dist/components/PanesGrid.d.ts +0 -14
- package/dist/components/PanesGrid.d.ts.map +0 -1
- package/dist/components/PanesGrid.js +0 -19
- package/dist/components/PanesGrid.js.map +0 -1
- package/dist/components/QRCode.d.ts.map +0 -1
- package/dist/components/QRCode.js.map +0 -1
- package/dist/components/RunningIndicator.d.ts.map +0 -1
- package/dist/components/RunningIndicator.js.map +0 -1
- package/dist/components/SettingsDialog.d.ts.map +0 -1
- package/dist/components/SettingsDialog.js.map +0 -1
- package/dist/components/Spinner.d.ts.map +0 -1
- package/dist/components/Spinner.js.map +0 -1
- package/dist/components/UpdateDialog.d.ts.map +0 -1
- package/dist/components/UpdateDialog.js.map +0 -1
- package/dist/components/UpdatingIndicator.d.ts.map +0 -1
- package/dist/components/UpdatingIndicator.js.map +0 -1
- package/dist/server/static.d.ts +0 -6
- package/dist/server/static.d.ts.map +0 -1
- package/dist/server/static.js +0 -3040
- package/dist/server/static.js.map +0 -1
- /package/dist/components/{ActionChoiceDialog.js → dialogs/ActionChoiceDialog.js} +0 -0
- /package/dist/components/{ActionConfirmDialog.d.ts → dialogs/ActionConfirmDialog.d.ts} +0 -0
- /package/dist/components/{ActionConfirmDialog.js → dialogs/ActionConfirmDialog.js} +0 -0
- /package/dist/components/{ActionInputDialog.d.ts → dialogs/ActionInputDialog.d.ts} +0 -0
- /package/dist/components/{ActionProgressDialog.d.ts → dialogs/ActionProgressDialog.d.ts} +0 -0
- /package/dist/components/{ActionProgressDialog.js → dialogs/ActionProgressDialog.js} +0 -0
- /package/dist/components/{AgentChoiceDialog.d.ts → dialogs/AgentChoiceDialog.d.ts} +0 -0
- /package/dist/components/{AgentChoiceDialog.js → dialogs/AgentChoiceDialog.js} +0 -0
- /package/dist/components/{CloseOptionsDialog.js → dialogs/CloseOptionsDialog.js} +0 -0
- /package/dist/components/{CommandPromptDialog.d.ts → dialogs/CommandPromptDialog.d.ts} +0 -0
- /package/dist/components/{HooksDialog.d.ts → dialogs/HooksDialog.d.ts} +0 -0
- /package/dist/components/{HooksDialog.js → dialogs/HooksDialog.js} +0 -0
- /package/dist/components/{MergeConfirmationDialog.js → dialogs/MergeConfirmationDialog.js} +0 -0
- /package/dist/components/{SettingsDialog.js → dialogs/SettingsDialog.js} +0 -0
- /package/dist/components/{UpdateDialog.d.ts → dialogs/UpdateDialog.d.ts} +0 -0
- /package/dist/components/{UpdateDialog.js → dialogs/UpdateDialog.js} +0 -0
- /package/dist/components/{CreatingIndicator.d.ts → indicators/CreatingIndicator.d.ts} +0 -0
- /package/dist/components/{CreatingIndicator.js → indicators/CreatingIndicator.js} +0 -0
- /package/dist/components/{LoadingIndicator.d.ts → indicators/LoadingIndicator.d.ts} +0 -0
- /package/dist/components/{LoadingIndicator.js → indicators/LoadingIndicator.js} +0 -0
- /package/dist/components/{RunningIndicator.d.ts → indicators/RunningIndicator.d.ts} +0 -0
- /package/dist/components/{RunningIndicator.js → indicators/RunningIndicator.js} +0 -0
- /package/dist/components/{Spinner.d.ts → indicators/Spinner.d.ts} +0 -0
- /package/dist/components/{Spinner.js → indicators/Spinner.js} +0 -0
- /package/dist/components/{UpdatingIndicator.d.ts → indicators/UpdatingIndicator.d.ts} +0 -0
- /package/dist/components/{UpdatingIndicator.js → indicators/UpdatingIndicator.js} +0 -0
- /package/dist/{StyledTextInput.d.ts → components/inputs/StyledTextInput.d.ts} +0 -0
- /package/dist/{StyledTextInput.js → components/inputs/StyledTextInput.js} +0 -0
- /package/dist/components/{KebabMenu.js → panes/KebabMenu.js} +0 -0
- /package/dist/{MergePane.d.ts → components/panes/MergePane.d.ts} +0 -0
- /package/dist/components/{FileCopyPrompt.d.ts → ui/FileCopyPrompt.d.ts} +0 -0
- /package/dist/components/{FileCopyPrompt.js → ui/FileCopyPrompt.js} +0 -0
- /package/dist/components/{QRCode.d.ts → ui/QRCode.d.ts} +0 -0
- /package/dist/components/{QRCode.js → ui/QRCode.js} +0 -0
- /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
|