dmux 3.1.1 → 3.2.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/CleanTextInput.d.ts +9 -0
- package/dist/CleanTextInput.d.ts.map +1 -1
- package/dist/CleanTextInput.js +127 -47
- package/dist/CleanTextInput.js.map +1 -1
- package/dist/DmuxApp.d.ts +2 -2
- package/dist/DmuxApp.d.ts.map +1 -1
- package/dist/DmuxApp.js +1396 -750
- package/dist/DmuxApp.js.map +1 -1
- package/dist/actions/paneActions.d.ts.map +1 -1
- package/dist/actions/paneActions.js +68 -11
- package/dist/actions/paneActions.js.map +1 -1
- package/dist/actions/types.d.ts +1 -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/ActionInputDialog.d.ts.map +1 -1
- package/dist/components/ActionInputDialog.js +3 -2
- package/dist/components/ActionInputDialog.js.map +1 -1
- package/dist/components/DialogBox.d.ts +16 -0
- package/dist/components/DialogBox.d.ts.map +1 -0
- package/dist/components/DialogBox.js +12 -0
- package/dist/components/DialogBox.js.map +1 -0
- package/dist/components/FooterHelp.d.ts +9 -0
- package/dist/components/FooterHelp.d.ts.map +1 -1
- package/dist/components/FooterHelp.js +41 -5
- package/dist/components/FooterHelp.js.map +1 -1
- package/dist/components/PaneCard.d.ts +3 -1
- package/dist/components/PaneCard.d.ts.map +1 -1
- package/dist/components/PaneCard.js +50 -33
- package/dist/components/PaneCard.js.map +1 -1
- package/dist/components/PanesGrid.d.ts +3 -5
- package/dist/components/PanesGrid.d.ts.map +1 -1
- package/dist/components/PanesGrid.js +40 -10
- package/dist/components/PanesGrid.js.map +1 -1
- package/dist/dashboard.js +1 -1
- package/dist/decorative-pane.d.ts +3 -0
- package/dist/decorative-pane.d.ts.map +1 -0
- package/dist/decorative-pane.js +136 -0
- package/dist/decorative-pane.js.map +1 -0
- package/dist/hooks/useActionSystem.d.ts +14 -1
- package/dist/hooks/useActionSystem.d.ts.map +1 -1
- package/dist/hooks/useActionSystem.js +93 -4
- package/dist/hooks/useActionSystem.js.map +1 -1
- 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 +13 -27
- package/dist/hooks/usePaneCreation.js.map +1 -1
- package/dist/hooks/usePaneRunner.d.ts.map +1 -1
- package/dist/hooks/usePaneRunner.js +8 -3
- package/dist/hooks/usePaneRunner.js.map +1 -1
- package/dist/hooks/usePanes.d.ts.map +1 -1
- package/dist/hooks/usePanes.js +210 -37
- package/dist/hooks/usePanes.js.map +1 -1
- package/dist/hooks/useWorktreeActions.d.ts.map +1 -1
- package/dist/hooks/useWorktreeActions.js +7 -13
- package/dist/hooks/useWorktreeActions.js.map +1 -1
- package/dist/index.js +217 -29
- package/dist/index.js.map +1 -1
- package/dist/popups/agentChoicePopup.d.ts +7 -0
- package/dist/popups/agentChoicePopup.d.ts.map +1 -0
- package/dist/popups/agentChoicePopup.js +74 -0
- package/dist/popups/agentChoicePopup.js.map +1 -0
- package/dist/popups/choicePopup.d.ts +7 -0
- package/dist/popups/choicePopup.d.ts.map +1 -0
- package/dist/popups/choicePopup.js +64 -0
- package/dist/popups/choicePopup.js.map +1 -0
- package/dist/popups/components/FileList.d.ts +13 -0
- package/dist/popups/components/FileList.d.ts.map +1 -0
- package/dist/popups/components/FileList.js +61 -0
- package/dist/popups/components/FileList.js.map +1 -0
- package/dist/popups/components/PopupContainer.d.ts +14 -0
- package/dist/popups/components/PopupContainer.d.ts.map +1 -0
- package/dist/popups/components/PopupContainer.js +15 -0
- package/dist/popups/components/PopupContainer.js.map +1 -0
- package/dist/popups/components/PopupInputBox.d.ts +11 -0
- package/dist/popups/components/PopupInputBox.d.ts.map +1 -0
- package/dist/popups/components/PopupInputBox.js +10 -0
- package/dist/popups/components/PopupInputBox.js.map +1 -0
- package/dist/popups/components/PopupWrapper.d.ts +37 -0
- package/dist/popups/components/PopupWrapper.d.ts.map +1 -0
- package/dist/popups/components/PopupWrapper.js +88 -0
- package/dist/popups/components/PopupWrapper.js.map +1 -0
- package/dist/popups/components/index.d.ts +8 -0
- package/dist/popups/components/index.d.ts.map +1 -0
- package/dist/popups/components/index.js +8 -0
- package/dist/popups/components/index.js.map +1 -0
- package/dist/popups/config.d.ts +40 -0
- package/dist/popups/config.d.ts.map +1 -0
- package/dist/popups/config.js +40 -0
- package/dist/popups/config.js.map +1 -0
- package/dist/popups/confirmPopup.d.ts +7 -0
- package/dist/popups/confirmPopup.d.ts.map +1 -0
- package/dist/popups/confirmPopup.js +72 -0
- package/dist/popups/confirmPopup.js.map +1 -0
- package/dist/popups/hooksPopup.d.ts +7 -0
- package/dist/popups/hooksPopup.d.ts.map +1 -0
- package/dist/popups/hooksPopup.js +71 -0
- package/dist/popups/hooksPopup.js.map +1 -0
- package/dist/popups/inputPopup.d.ts +7 -0
- package/dist/popups/inputPopup.d.ts.map +1 -0
- package/dist/popups/inputPopup.js +48 -0
- package/dist/popups/inputPopup.js.map +1 -0
- package/dist/popups/kebabMenuPopup.d.ts +7 -0
- package/dist/popups/kebabMenuPopup.d.ts.map +1 -0
- package/dist/popups/kebabMenuPopup.js +52 -0
- package/dist/popups/kebabMenuPopup.js.map +1 -0
- package/dist/popups/logsPopup.d.ts +12 -0
- package/dist/popups/logsPopup.d.ts.map +1 -0
- package/dist/popups/logsPopup.js +364 -0
- package/dist/popups/logsPopup.js.map +1 -0
- package/dist/popups/mergePopup.d.ts +7 -0
- package/dist/popups/mergePopup.d.ts.map +1 -0
- package/dist/popups/mergePopup.js +310 -0
- package/dist/popups/mergePopup.js.map +1 -0
- package/dist/popups/newPanePopup.d.ts +7 -0
- package/dist/popups/newPanePopup.d.ts.map +1 -0
- package/dist/popups/newPanePopup.js +234 -0
- package/dist/popups/newPanePopup.js.map +1 -0
- package/dist/popups/progressPopup.d.ts +8 -0
- package/dist/popups/progressPopup.d.ts.map +1 -0
- package/dist/popups/progressPopup.js +54 -0
- package/dist/popups/progressPopup.js.map +1 -0
- package/dist/popups/remotePopup.d.ts +6 -0
- package/dist/popups/remotePopup.d.ts.map +1 -0
- package/dist/popups/remotePopup.js +166 -0
- package/dist/popups/remotePopup.js.map +1 -0
- package/dist/popups/settingsPopup.d.ts +7 -0
- package/dist/popups/settingsPopup.d.ts.map +1 -0
- package/dist/popups/settingsPopup.js +212 -0
- package/dist/popups/settingsPopup.js.map +1 -0
- package/dist/popups/shortcutsPopup.d.ts +6 -0
- package/dist/popups/shortcutsPopup.d.ts.map +1 -0
- package/dist/popups/shortcutsPopup.js +74 -0
- package/dist/popups/shortcutsPopup.js.map +1 -0
- package/dist/popups/templates/SimpleInputPopup.d.ts +15 -0
- package/dist/popups/templates/SimpleInputPopup.d.ts.map +1 -0
- package/dist/popups/templates/SimpleInputPopup.js +28 -0
- package/dist/popups/templates/SimpleInputPopup.js.map +1 -0
- package/dist/server/embedded-assets.d.ts.map +1 -1
- package/dist/server/embedded-assets.js +2066 -968
- 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.d.ts +1 -1
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +73 -6
- package/dist/server/routes.js.map +1 -1
- 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/PaneWorkerManager.d.ts.map +1 -1
- package/dist/services/PaneWorkerManager.js +35 -9
- package/dist/services/PaneWorkerManager.js.map +1 -1
- package/dist/services/TunnelService.d.ts +1 -0
- package/dist/services/TunnelService.d.ts.map +1 -1
- package/dist/services/TunnelService.js +56 -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/spacer-pane.d.ts +8 -0
- package/dist/spacer-pane.d.ts.map +1 -0
- package/dist/spacer-pane.js +40 -0
- package/dist/spacer-pane.js.map +1 -0
- 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 +14 -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 +88 -0
- package/dist/utils/asciiArt.js.map +1 -0
- package/dist/utils/conflictResolutionPane.d.ts.map +1 -1
- package/dist/utils/conflictResolutionPane.js +8 -4
- package/dist/utils/conflictResolutionPane.js.map +1 -1
- 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/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 +45 -0
- package/dist/utils/layoutManager.d.ts.map +1 -0
- package/dist/utils/layoutManager.js +500 -0
- package/dist/utils/layoutManager.js.map +1 -0
- package/dist/utils/paneCreation.d.ts.map +1 -1
- package/dist/utils/paneCreation.js +125 -11
- package/dist/utils/paneCreation.js.map +1 -1
- package/dist/utils/popup.d.ts +97 -0
- package/dist/utils/popup.d.ts.map +1 -0
- package/dist/utils/popup.js +509 -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 +53 -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 +175 -0
- package/dist/utils/shellPaneDetection.js.map +1 -0
- package/dist/utils/tmux.d.ts +53 -1
- package/dist/utils/tmux.d.ts.map +1 -1
- package/dist/utils/tmux.js +352 -84
- 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 +119 -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 +2 -0
- package/dist/workers/PaneWorker.js.map +1 -1
- package/package.json +5 -2
- 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
|
@@ -0,0 +1,509 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility for launching tmux popup modals
|
|
3
|
+
* Requires tmux 3.2+
|
|
4
|
+
*/
|
|
5
|
+
import { execSync, spawn } from 'child_process';
|
|
6
|
+
import * as fs from 'fs';
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
import * as os from 'os';
|
|
9
|
+
import { POPUP_CONFIG } from '../popups/config.js';
|
|
10
|
+
/**
|
|
11
|
+
* Calculate actual popup bounds based on tmux terminal dimensions
|
|
12
|
+
*/
|
|
13
|
+
function calculatePopupBounds(options) {
|
|
14
|
+
const { width = 80, height = 20, centered = true, x, y, leftOffset = 0, topOffset = 0, } = options;
|
|
15
|
+
try {
|
|
16
|
+
// Get tmux client dimensions
|
|
17
|
+
const dims = execSync('tmux display-message -p "#{client_width},#{client_height}"', {
|
|
18
|
+
encoding: 'utf-8',
|
|
19
|
+
stdio: 'pipe'
|
|
20
|
+
}).trim();
|
|
21
|
+
const [clientWidth, clientHeight] = dims.split(',').map(Number);
|
|
22
|
+
let posX;
|
|
23
|
+
let posY;
|
|
24
|
+
if (!centered && (leftOffset > 0 || topOffset > 0)) {
|
|
25
|
+
posX = leftOffset;
|
|
26
|
+
posY = topOffset;
|
|
27
|
+
}
|
|
28
|
+
else if (!centered && x !== undefined && y !== undefined) {
|
|
29
|
+
posX = x;
|
|
30
|
+
posY = y;
|
|
31
|
+
}
|
|
32
|
+
else if (centered && leftOffset > 0) {
|
|
33
|
+
posX = Math.floor((clientWidth - width) / 2) + leftOffset;
|
|
34
|
+
posY = Math.floor((clientHeight - height) / 2) + topOffset;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
// Fully centered
|
|
38
|
+
posX = Math.floor((clientWidth - width) / 2);
|
|
39
|
+
posY = Math.floor((clientHeight - height) / 2);
|
|
40
|
+
}
|
|
41
|
+
return { x: posX, y: posY, width, height };
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// Fallback to defaults if we can't get tmux dimensions
|
|
45
|
+
return { x: leftOffset || 0, y: topOffset || 0, width, height };
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Launch a tmux popup modal
|
|
50
|
+
* @param command - Command to run in the popup
|
|
51
|
+
* @param options - Popup display options
|
|
52
|
+
* @returns Promise that resolves when popup closes
|
|
53
|
+
*/
|
|
54
|
+
export async function launchPopup(command, options = {}) {
|
|
55
|
+
const { width = 80, height = 20, title, centered = true, x, y, cwd = process.cwd(), borderStyle = 'double', leftOffset = 0, topOffset = 0, } = options;
|
|
56
|
+
// Create a temp file for the result
|
|
57
|
+
const resultFile = path.join(os.tmpdir(), `dmux-popup-${Date.now()}.json`);
|
|
58
|
+
// Build tmux popup command
|
|
59
|
+
const args = [
|
|
60
|
+
'display-popup',
|
|
61
|
+
'-E', // Close on command exit
|
|
62
|
+
'-w', width.toString(),
|
|
63
|
+
'-h', height.toString(),
|
|
64
|
+
'-d', `"${cwd}"`,
|
|
65
|
+
];
|
|
66
|
+
// Add border style if supported (tmux 3.2+)
|
|
67
|
+
// Skip if borderStyle is 'none' (we want no tmux border)
|
|
68
|
+
if (borderStyle && borderStyle !== 'none') {
|
|
69
|
+
args.push('-b', borderStyle);
|
|
70
|
+
}
|
|
71
|
+
// Add popup border color (foreground only - respects user's terminal background)
|
|
72
|
+
args.push('-s', `'border-fg=colour${POPUP_CONFIG.tmuxBorderColor}'`);
|
|
73
|
+
// Position: centered or custom
|
|
74
|
+
if (!centered && (leftOffset > 0 || topOffset > 0)) {
|
|
75
|
+
// Absolute positioning with leftOffset/topOffset
|
|
76
|
+
args.push('-x', leftOffset.toString());
|
|
77
|
+
args.push('-y', topOffset.toString());
|
|
78
|
+
}
|
|
79
|
+
else if (!centered && x !== undefined && y !== undefined) {
|
|
80
|
+
// Absolute positioning with x/y
|
|
81
|
+
args.push('-x', x.toString());
|
|
82
|
+
args.push('-y', y.toString());
|
|
83
|
+
}
|
|
84
|
+
else if (centered && leftOffset > 0) {
|
|
85
|
+
// Centered with sidebar offset
|
|
86
|
+
args.push('-x', leftOffset.toString());
|
|
87
|
+
args.push('-y', topOffset.toString());
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
// Fully centered
|
|
91
|
+
args.push('-x', 'C');
|
|
92
|
+
args.push('-y', 'C');
|
|
93
|
+
}
|
|
94
|
+
// Title
|
|
95
|
+
if (title) {
|
|
96
|
+
args.push('-T', `"${title}"`);
|
|
97
|
+
}
|
|
98
|
+
// Escape the command for tmux
|
|
99
|
+
const escapedCommand = command.replace(/'/g, "'\\''");
|
|
100
|
+
const fullCommand = `tmux ${args.join(' ')} '${escapedCommand}'`;
|
|
101
|
+
return new Promise((resolve) => {
|
|
102
|
+
// Launch popup with spawn (non-blocking)
|
|
103
|
+
const child = spawn('sh', ['-c', fullCommand], {
|
|
104
|
+
stdio: 'inherit',
|
|
105
|
+
});
|
|
106
|
+
child.on('close', () => {
|
|
107
|
+
// Read result from temp file
|
|
108
|
+
if (fs.existsSync(resultFile)) {
|
|
109
|
+
try {
|
|
110
|
+
const resultData = fs.readFileSync(resultFile, 'utf-8');
|
|
111
|
+
fs.unlinkSync(resultFile); // Clean up
|
|
112
|
+
try {
|
|
113
|
+
const result = JSON.parse(resultData);
|
|
114
|
+
resolve(result);
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
// Not JSON, treat as plain text
|
|
118
|
+
resolve({
|
|
119
|
+
success: true,
|
|
120
|
+
data: resultData,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
resolve({
|
|
126
|
+
success: false,
|
|
127
|
+
error: error.message,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
// No result file = cancelled
|
|
133
|
+
resolve({
|
|
134
|
+
success: false,
|
|
135
|
+
cancelled: true,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
child.on('error', (error) => {
|
|
140
|
+
// Clean up temp file if it exists
|
|
141
|
+
if (fs.existsSync(resultFile)) {
|
|
142
|
+
fs.unlinkSync(resultFile);
|
|
143
|
+
}
|
|
144
|
+
resolve({
|
|
145
|
+
success: false,
|
|
146
|
+
error: error.message,
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Launch a popup that runs a Node.js script
|
|
153
|
+
* @param scriptPath - Path to the compiled JS script
|
|
154
|
+
* @param args - Arguments to pass to the script
|
|
155
|
+
* @param options - Popup display options
|
|
156
|
+
*/
|
|
157
|
+
export async function launchNodePopup(scriptPath, args = [], options = {}) {
|
|
158
|
+
// Get the result file path that the script will write to
|
|
159
|
+
const resultFile = path.join(os.tmpdir(), `dmux-popup-${Date.now()}.json`);
|
|
160
|
+
// Build node command with proper escaping
|
|
161
|
+
// Escape each argument for shell: replace backslashes, then single quotes
|
|
162
|
+
const escapedArgs = [scriptPath, resultFile, ...args].map(arg => {
|
|
163
|
+
// Escape for shell: replace ' with '\''
|
|
164
|
+
const escaped = arg.replace(/\\/g, '\\\\').replace(/'/g, "'\\''");
|
|
165
|
+
return `'${escaped}'`;
|
|
166
|
+
});
|
|
167
|
+
const command = `node ${escapedArgs.join(' ')}`;
|
|
168
|
+
return launchPopup(command, options);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Launch a popup non-blocking (returns handle immediately)
|
|
172
|
+
* @param command - Command to run in the popup
|
|
173
|
+
* @param options - Popup display options
|
|
174
|
+
* @returns Handle with PID, bounds, and result promise
|
|
175
|
+
*/
|
|
176
|
+
export function launchPopupNonBlocking(command, options = {}) {
|
|
177
|
+
const { width = 80, height = 20, title, centered = true, x, y, cwd = process.cwd(), borderStyle = 'double', leftOffset = 0, topOffset = 0, } = options;
|
|
178
|
+
// Calculate popup bounds
|
|
179
|
+
const bounds = calculatePopupBounds(options);
|
|
180
|
+
// Create a temp file for the result
|
|
181
|
+
const resultFile = path.join(os.tmpdir(), `dmux-popup-${Date.now()}.json`);
|
|
182
|
+
// Build tmux popup command
|
|
183
|
+
const args = [
|
|
184
|
+
'display-popup',
|
|
185
|
+
'-E', // Close on command exit
|
|
186
|
+
'-w', width.toString(),
|
|
187
|
+
'-h', height.toString(),
|
|
188
|
+
'-d', `"${cwd}"`,
|
|
189
|
+
];
|
|
190
|
+
// Add border style if supported (tmux 3.2+)
|
|
191
|
+
if (borderStyle && borderStyle !== 'none') {
|
|
192
|
+
args.push('-b', borderStyle);
|
|
193
|
+
}
|
|
194
|
+
// Add popup border color (foreground only - respects user's terminal background)
|
|
195
|
+
args.push('-s', `'border-fg=colour${POPUP_CONFIG.tmuxBorderColor}'`);
|
|
196
|
+
// Position: centered or custom
|
|
197
|
+
if (!centered && (leftOffset > 0 || topOffset > 0)) {
|
|
198
|
+
args.push('-x', leftOffset.toString());
|
|
199
|
+
args.push('-y', topOffset.toString());
|
|
200
|
+
}
|
|
201
|
+
else if (!centered && x !== undefined && y !== undefined) {
|
|
202
|
+
args.push('-x', x.toString());
|
|
203
|
+
args.push('-y', y.toString());
|
|
204
|
+
}
|
|
205
|
+
else if (centered && leftOffset > 0) {
|
|
206
|
+
args.push('-x', leftOffset.toString());
|
|
207
|
+
args.push('-y', topOffset.toString());
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
args.push('-x', 'C');
|
|
211
|
+
args.push('-y', 'C');
|
|
212
|
+
}
|
|
213
|
+
// Title
|
|
214
|
+
if (title) {
|
|
215
|
+
args.push('-T', `"${title}"`);
|
|
216
|
+
}
|
|
217
|
+
// Escape the command for tmux
|
|
218
|
+
const escapedCommand = command.replace(/'/g, "'\\''");
|
|
219
|
+
const fullCommand = `tmux ${args.join(' ')} '${escapedCommand}'`;
|
|
220
|
+
// Launch popup with spawn (non-blocking)
|
|
221
|
+
const child = spawn('sh', ['-c', fullCommand], {
|
|
222
|
+
stdio: 'inherit',
|
|
223
|
+
});
|
|
224
|
+
const resultPromise = new Promise((resolve) => {
|
|
225
|
+
child.on('close', () => {
|
|
226
|
+
// Small delay to ensure file is written
|
|
227
|
+
setTimeout(() => {
|
|
228
|
+
// Read result from temp file
|
|
229
|
+
if (fs.existsSync(resultFile)) {
|
|
230
|
+
try {
|
|
231
|
+
const resultData = fs.readFileSync(resultFile, 'utf-8');
|
|
232
|
+
fs.unlinkSync(resultFile); // Clean up
|
|
233
|
+
try {
|
|
234
|
+
const result = JSON.parse(resultData);
|
|
235
|
+
resolve(result);
|
|
236
|
+
}
|
|
237
|
+
catch {
|
|
238
|
+
// Not JSON, treat as plain text
|
|
239
|
+
resolve({
|
|
240
|
+
success: true,
|
|
241
|
+
data: resultData,
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
catch (error) {
|
|
246
|
+
resolve({
|
|
247
|
+
success: false,
|
|
248
|
+
error: error.message,
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
// No result file = cancelled
|
|
254
|
+
console.error(`[popup] Result file not found: ${resultFile}`);
|
|
255
|
+
resolve({
|
|
256
|
+
success: false,
|
|
257
|
+
cancelled: true,
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
}, 100); // Wait 100ms for file to be written
|
|
261
|
+
});
|
|
262
|
+
child.on('error', (error) => {
|
|
263
|
+
// Clean up temp file if it exists
|
|
264
|
+
if (fs.existsSync(resultFile)) {
|
|
265
|
+
fs.unlinkSync(resultFile);
|
|
266
|
+
}
|
|
267
|
+
resolve({
|
|
268
|
+
success: false,
|
|
269
|
+
error: error.message,
|
|
270
|
+
});
|
|
271
|
+
});
|
|
272
|
+
});
|
|
273
|
+
return {
|
|
274
|
+
pid: child.pid,
|
|
275
|
+
bounds,
|
|
276
|
+
resultPromise,
|
|
277
|
+
kill: () => {
|
|
278
|
+
try {
|
|
279
|
+
child.kill('SIGTERM');
|
|
280
|
+
// Clean up temp file
|
|
281
|
+
if (fs.existsSync(resultFile)) {
|
|
282
|
+
fs.unlinkSync(resultFile);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
catch {
|
|
286
|
+
// Ignore errors if process already dead
|
|
287
|
+
}
|
|
288
|
+
},
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Launch a Node.js popup non-blocking (returns handle immediately)
|
|
293
|
+
* @param scriptPath - Path to the compiled JS script
|
|
294
|
+
* @param args - Arguments to pass to the script
|
|
295
|
+
* @param options - Popup display options
|
|
296
|
+
* @returns Handle with PID, bounds, and result promise
|
|
297
|
+
*/
|
|
298
|
+
export function launchNodePopupNonBlocking(scriptPath, args = [], options = {}) {
|
|
299
|
+
const { width = 80, height = 20, title, centered = true, x, y, cwd = process.cwd(), borderStyle = 'double', leftOffset = 0, topOffset = 0, } = options;
|
|
300
|
+
// Calculate popup bounds
|
|
301
|
+
const bounds = calculatePopupBounds(options);
|
|
302
|
+
// Get the result file path that the script will write to
|
|
303
|
+
// IMPORTANT: Only create this ONCE - do NOT create it again in child.on('close')
|
|
304
|
+
const resultFile = path.join(os.tmpdir(), `dmux-popup-${Date.now()}.json`);
|
|
305
|
+
// Build node command with proper escaping
|
|
306
|
+
const escapedArgs = [scriptPath, resultFile, ...args].map(arg => {
|
|
307
|
+
const escaped = arg.replace(/\\/g, '\\\\').replace(/'/g, "'\\''");
|
|
308
|
+
return `'${escaped}'`;
|
|
309
|
+
});
|
|
310
|
+
const command = `node ${escapedArgs.join(' ')}`;
|
|
311
|
+
// Build tmux popup command
|
|
312
|
+
const tmuxArgs = [
|
|
313
|
+
'display-popup',
|
|
314
|
+
'-E', // Close on command exit
|
|
315
|
+
'-w', width.toString(),
|
|
316
|
+
'-h', height.toString(),
|
|
317
|
+
'-d', `"${cwd}"`,
|
|
318
|
+
];
|
|
319
|
+
// Add border style if supported (tmux 3.2+)
|
|
320
|
+
if (borderStyle && borderStyle !== 'none') {
|
|
321
|
+
tmuxArgs.push('-b', borderStyle);
|
|
322
|
+
}
|
|
323
|
+
// Add popup border color (foreground only - respects user's terminal background)
|
|
324
|
+
tmuxArgs.push('-s', `'border-fg=colour${POPUP_CONFIG.tmuxBorderColor}'`);
|
|
325
|
+
// Position: centered or custom
|
|
326
|
+
if (!centered && (leftOffset > 0 || topOffset > 0)) {
|
|
327
|
+
tmuxArgs.push('-x', leftOffset.toString());
|
|
328
|
+
tmuxArgs.push('-y', topOffset.toString());
|
|
329
|
+
}
|
|
330
|
+
else if (!centered && x !== undefined && y !== undefined) {
|
|
331
|
+
tmuxArgs.push('-x', x.toString());
|
|
332
|
+
tmuxArgs.push('-y', y.toString());
|
|
333
|
+
}
|
|
334
|
+
else if (centered && leftOffset > 0) {
|
|
335
|
+
tmuxArgs.push('-x', leftOffset.toString());
|
|
336
|
+
tmuxArgs.push('-y', topOffset.toString());
|
|
337
|
+
}
|
|
338
|
+
else {
|
|
339
|
+
tmuxArgs.push('-x', 'C');
|
|
340
|
+
tmuxArgs.push('-y', 'C');
|
|
341
|
+
}
|
|
342
|
+
// Title
|
|
343
|
+
if (title) {
|
|
344
|
+
tmuxArgs.push('-T', `"${title}"`);
|
|
345
|
+
}
|
|
346
|
+
// Escape the command for tmux
|
|
347
|
+
const escapedCommand = command.replace(/'/g, "'\\''");
|
|
348
|
+
const fullCommand = `tmux ${tmuxArgs.join(' ')} '${escapedCommand}'`;
|
|
349
|
+
// DEBUG: Log the actual tmux command
|
|
350
|
+
console.error('[DEBUG popup.ts launchNodePopupNonBlocking] Full tmux command:', fullCommand);
|
|
351
|
+
console.error('[DEBUG popup.ts] tmuxBorderColor:', POPUP_CONFIG.tmuxBorderColor);
|
|
352
|
+
// Launch popup with spawn (non-blocking)
|
|
353
|
+
const child = spawn('sh', ['-c', fullCommand], {
|
|
354
|
+
stdio: 'inherit',
|
|
355
|
+
});
|
|
356
|
+
const resultPromise = new Promise((resolve) => {
|
|
357
|
+
child.on('close', () => {
|
|
358
|
+
// Small delay to ensure file is written
|
|
359
|
+
setTimeout(() => {
|
|
360
|
+
// Read result from temp file using the SAME resultFile path we passed to the script
|
|
361
|
+
if (fs.existsSync(resultFile)) {
|
|
362
|
+
try {
|
|
363
|
+
const resultData = fs.readFileSync(resultFile, 'utf-8');
|
|
364
|
+
fs.unlinkSync(resultFile); // Clean up
|
|
365
|
+
try {
|
|
366
|
+
const result = JSON.parse(resultData);
|
|
367
|
+
resolve(result);
|
|
368
|
+
}
|
|
369
|
+
catch {
|
|
370
|
+
// Not JSON, treat as plain text
|
|
371
|
+
resolve({
|
|
372
|
+
success: true,
|
|
373
|
+
data: resultData,
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
catch (error) {
|
|
378
|
+
resolve({
|
|
379
|
+
success: false,
|
|
380
|
+
error: error.message,
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
else {
|
|
385
|
+
// No result file = cancelled
|
|
386
|
+
console.error(`[popup] Result file not found: ${resultFile}`);
|
|
387
|
+
resolve({
|
|
388
|
+
success: false,
|
|
389
|
+
cancelled: true,
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
}, 100); // Wait 100ms for file to be written
|
|
393
|
+
});
|
|
394
|
+
child.on('error', (error) => {
|
|
395
|
+
// Clean up temp file if it exists
|
|
396
|
+
if (fs.existsSync(resultFile)) {
|
|
397
|
+
fs.unlinkSync(resultFile);
|
|
398
|
+
}
|
|
399
|
+
resolve({
|
|
400
|
+
success: false,
|
|
401
|
+
error: error.message,
|
|
402
|
+
});
|
|
403
|
+
});
|
|
404
|
+
});
|
|
405
|
+
return {
|
|
406
|
+
pid: child.pid,
|
|
407
|
+
bounds,
|
|
408
|
+
resultPromise,
|
|
409
|
+
kill: () => {
|
|
410
|
+
try {
|
|
411
|
+
child.kill('SIGTERM');
|
|
412
|
+
// Clean up temp file
|
|
413
|
+
if (fs.existsSync(resultFile)) {
|
|
414
|
+
fs.unlinkSync(resultFile);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
catch {
|
|
418
|
+
// Ignore errors if process already dead
|
|
419
|
+
}
|
|
420
|
+
},
|
|
421
|
+
};
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* Enable tmux mouse mode for click-outside-to-close popup behavior (session-specific)
|
|
425
|
+
* @param sessionName - The tmux session name to enable mouse mode for
|
|
426
|
+
*/
|
|
427
|
+
export function ensureMouseMode(sessionName) {
|
|
428
|
+
try {
|
|
429
|
+
// Check if mouse mode is already enabled for this session
|
|
430
|
+
const mouseStatus = execSync(`tmux show -t ${sessionName} mouse`, {
|
|
431
|
+
encoding: 'utf-8',
|
|
432
|
+
stdio: 'pipe'
|
|
433
|
+
}).trim();
|
|
434
|
+
// If mouse is off, enable it for this session only (not global)
|
|
435
|
+
if (mouseStatus.includes('off')) {
|
|
436
|
+
execSync(`tmux set -t ${sessionName} mouse on`, { stdio: 'pipe' });
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
catch {
|
|
440
|
+
// Ignore errors - might not be in tmux session or session doesn't exist yet
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
/**
|
|
444
|
+
* Check if tmux supports popups (3.2+)
|
|
445
|
+
*/
|
|
446
|
+
export function supportsPopups() {
|
|
447
|
+
try {
|
|
448
|
+
const version = execSync('tmux -V', { encoding: 'utf-8' }).trim();
|
|
449
|
+
// Extract version number (e.g., "tmux 3.2" -> "3.2")
|
|
450
|
+
const match = version.match(/tmux (\d+\.\d+)/);
|
|
451
|
+
if (match) {
|
|
452
|
+
const versionNum = parseFloat(match[1]);
|
|
453
|
+
return versionNum >= 3.2;
|
|
454
|
+
}
|
|
455
|
+
return false;
|
|
456
|
+
}
|
|
457
|
+
catch {
|
|
458
|
+
return false;
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
/**
|
|
462
|
+
* Standard popup positioning presets for consistent UX
|
|
463
|
+
*/
|
|
464
|
+
export const POPUP_POSITIONING = {
|
|
465
|
+
/**
|
|
466
|
+
* Standard position: top-left corner, offset from sidebar
|
|
467
|
+
* Use this for most popups (menus, dialogs, forms)
|
|
468
|
+
*/
|
|
469
|
+
standard(sidebarWidth) {
|
|
470
|
+
return {
|
|
471
|
+
centered: false,
|
|
472
|
+
leftOffset: sidebarWidth + 1,
|
|
473
|
+
topOffset: 0,
|
|
474
|
+
};
|
|
475
|
+
},
|
|
476
|
+
/**
|
|
477
|
+
* Centered with sidebar offset
|
|
478
|
+
* Use for important dialogs like new pane creation
|
|
479
|
+
*/
|
|
480
|
+
centeredWithSidebar(sidebarWidth) {
|
|
481
|
+
return {
|
|
482
|
+
centered: true,
|
|
483
|
+
leftOffset: sidebarWidth,
|
|
484
|
+
};
|
|
485
|
+
},
|
|
486
|
+
/**
|
|
487
|
+
* Fully centered (no sidebar consideration)
|
|
488
|
+
* Use only when sidebar doesn't exist or doesn't matter
|
|
489
|
+
*/
|
|
490
|
+
fullyCentered() {
|
|
491
|
+
return {
|
|
492
|
+
centered: true,
|
|
493
|
+
};
|
|
494
|
+
},
|
|
495
|
+
/**
|
|
496
|
+
* Large popup that takes up most of the available space
|
|
497
|
+
* Use for logs viewer and other content-heavy popups
|
|
498
|
+
*/
|
|
499
|
+
large(sidebarWidth, terminalWidth, terminalHeight) {
|
|
500
|
+
return {
|
|
501
|
+
centered: false,
|
|
502
|
+
leftOffset: sidebarWidth + 1,
|
|
503
|
+
topOffset: 0,
|
|
504
|
+
width: Math.min(terminalWidth - sidebarWidth - 2, 100),
|
|
505
|
+
height: Math.floor(terminalHeight * 0.9),
|
|
506
|
+
};
|
|
507
|
+
},
|
|
508
|
+
};
|
|
509
|
+
//# sourceMappingURL=popup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"popup.js","sourceRoot":"","sources":["../../src/utils/popup.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAuCnD;;GAEG;AACH,SAAS,oBAAoB,CAAC,OAAqB;IACjD,MAAM,EACJ,KAAK,GAAG,EAAE,EACV,MAAM,GAAG,EAAE,EACX,QAAQ,GAAG,IAAI,EACf,CAAC,EACD,CAAC,EACD,UAAU,GAAG,CAAC,EACd,SAAS,GAAG,CAAC,GACd,GAAG,OAAO,CAAC;IAEZ,IAAI,CAAC;QACH,6BAA6B;QAC7B,MAAM,IAAI,GAAG,QAAQ,CAAC,4DAA4D,EAAE;YAClF,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,MAAM;SACd,CAAC,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEhE,IAAI,IAAY,CAAC;QACjB,IAAI,IAAY,CAAC;QAEjB,IAAI,CAAC,QAAQ,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC;YACnD,IAAI,GAAG,UAAU,CAAC;YAClB,IAAI,GAAG,SAAS,CAAC;QACnB,CAAC;aAAM,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YAC3D,IAAI,GAAG,CAAC,CAAC;YACT,IAAI,GAAG,CAAC,CAAC;QACX,CAAC;aAAM,IAAI,QAAQ,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACtC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC;YAC1D,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC;QAC7D,CAAC;aAAM,CAAC;YACN,iBAAiB;YACjB,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7C,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACjD,CAAC;QAED,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,uDAAuD;QACvD,OAAO,EAAE,CAAC,EAAE,UAAU,IAAI,CAAC,EAAE,CAAC,EAAE,SAAS,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAClE,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAe,EACf,UAAwB,EAAE;IAE1B,MAAM,EACJ,KAAK,GAAG,EAAE,EACV,MAAM,GAAG,EAAE,EACX,KAAK,EACL,QAAQ,GAAG,IAAI,EACf,CAAC,EACD,CAAC,EACD,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EACnB,WAAW,GAAG,QAAQ,EACtB,UAAU,GAAG,CAAC,EACd,SAAS,GAAG,CAAC,GACd,GAAG,OAAO,CAAC;IAEZ,oCAAoC;IACpC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,cAAc,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAE3E,2BAA2B;IAC3B,MAAM,IAAI,GAAa;QACrB,eAAe;QACf,IAAI,EAAE,wBAAwB;QAC9B,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE;QACtB,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE;QACvB,IAAI,EAAE,IAAI,GAAG,GAAG;KACjB,CAAC;IAEF,4CAA4C;IAC5C,yDAAyD;IACzD,IAAI,WAAW,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;QAC1C,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAC/B,CAAC;IAED,iFAAiF;IACjF,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,oBAAoB,YAAY,CAAC,eAAe,GAAG,CAAC,CAAC;IAErE,+BAA+B;IAC/B,IAAI,CAAC,QAAQ,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC;QACnD,iDAAiD;QACjD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;IACxC,CAAC;SAAM,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;QAC3D,gCAAgC;QAChC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IAChC,CAAC;SAAM,IAAI,QAAQ,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACtC,+BAA+B;QAC/B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,iBAAiB;QACjB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACvB,CAAC;IAED,QAAQ;IACR,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,KAAK,GAAG,CAAC,CAAC;IAChC,CAAC;IAED,8BAA8B;IAC9B,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAEtD,MAAM,WAAW,GAAG,QAAQ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,cAAc,GAAG,CAAC;IAEjE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,yCAAyC;QACzC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE;YAC7C,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACrB,6BAA6B;YAC7B,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC9B,IAAI,CAAC;oBACH,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;oBACxD,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW;oBAEtC,IAAI,CAAC;wBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;wBACtC,OAAO,CAAC,MAAM,CAAC,CAAC;oBAClB,CAAC;oBAAC,MAAM,CAAC;wBACP,gCAAgC;wBAChC,OAAO,CAAC;4BACN,OAAO,EAAE,IAAI;4BACb,IAAI,EAAE,UAAU;yBACjB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAU,EAAE,CAAC;oBACpB,OAAO,CAAC;wBACN,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,KAAK,CAAC,OAAO;qBACrB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,6BAA6B;gBAC7B,OAAO,CAAC;oBACN,OAAO,EAAE,KAAK;oBACd,SAAS,EAAE,IAAI;iBAChB,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1B,kCAAkC;YAClC,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC9B,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YAC5B,CAAC;YAED,OAAO,CAAC;gBACN,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,KAAK,CAAC,OAAO;aACrB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,UAAkB,EAClB,OAAiB,EAAE,EACnB,UAAwB,EAAE;IAE1B,yDAAyD;IACzD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,cAAc,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAE3E,0CAA0C;IAC1C,0EAA0E;IAC1E,MAAM,WAAW,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;QAC9D,wCAAwC;QACxC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAClE,OAAO,IAAI,OAAO,GAAG,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,QAAQ,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IAEhD,OAAO,WAAW,CAAC,OAAO,EAAE,OAAO,CAA4B,CAAC;AAClE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CACpC,OAAe,EACf,UAAwB,EAAE;IAE1B,MAAM,EACJ,KAAK,GAAG,EAAE,EACV,MAAM,GAAG,EAAE,EACX,KAAK,EACL,QAAQ,GAAG,IAAI,EACf,CAAC,EACD,CAAC,EACD,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EACnB,WAAW,GAAG,QAAQ,EACtB,UAAU,GAAG,CAAC,EACd,SAAS,GAAG,CAAC,GACd,GAAG,OAAO,CAAC;IAEZ,yBAAyB;IACzB,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAE7C,oCAAoC;IACpC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,cAAc,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAE3E,2BAA2B;IAC3B,MAAM,IAAI,GAAa;QACrB,eAAe;QACf,IAAI,EAAE,wBAAwB;QAC9B,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE;QACtB,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE;QACvB,IAAI,EAAE,IAAI,GAAG,GAAG;KACjB,CAAC;IAEF,4CAA4C;IAC5C,IAAI,WAAW,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;QAC1C,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAC/B,CAAC;IAED,iFAAiF;IACjF,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,oBAAoB,YAAY,CAAC,eAAe,GAAG,CAAC,CAAC;IAErE,+BAA+B;IAC/B,IAAI,CAAC,QAAQ,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC;QACnD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;IACxC,CAAC;SAAM,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;QAC3D,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IAChC,CAAC;SAAM,IAAI,QAAQ,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACvB,CAAC;IAED,QAAQ;IACR,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,KAAK,GAAG,CAAC,CAAC;IAChC,CAAC;IAED,8BAA8B;IAC9B,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACtD,MAAM,WAAW,GAAG,QAAQ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,cAAc,GAAG,CAAC;IAEjE,yCAAyC;IACzC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE;QAC7C,KAAK,EAAE,SAAS;KACjB,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,IAAI,OAAO,CAAsB,CAAC,OAAO,EAAE,EAAE;QACjE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACrB,wCAAwC;YACxC,UAAU,CAAC,GAAG,EAAE;gBACd,6BAA6B;gBAC7B,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC9B,IAAI,CAAC;wBACH,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;wBACxD,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW;wBAEtC,IAAI,CAAC;4BACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;4BACtC,OAAO,CAAC,MAAM,CAAC,CAAC;wBAClB,CAAC;wBAAC,MAAM,CAAC;4BACP,gCAAgC;4BAChC,OAAO,CAAC;gCACN,OAAO,EAAE,IAAI;gCACb,IAAI,EAAE,UAAU;6BACjB,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;oBAAC,OAAO,KAAU,EAAE,CAAC;wBACpB,OAAO,CAAC;4BACN,OAAO,EAAE,KAAK;4BACd,KAAK,EAAE,KAAK,CAAC,OAAO;yBACrB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,6BAA6B;oBAC7B,OAAO,CAAC,KAAK,CAAC,kCAAkC,UAAU,EAAE,CAAC,CAAC;oBAC9D,OAAO,CAAC;wBACN,OAAO,EAAE,KAAK;wBACd,SAAS,EAAE,IAAI;qBAChB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,oCAAoC;QAC/C,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1B,kCAAkC;YAClC,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC9B,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YAC5B,CAAC;YAED,OAAO,CAAC;gBACN,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,KAAK,CAAC,OAAO;aACrB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,GAAG,EAAE,KAAK,CAAC,GAAI;QACf,MAAM;QACN,aAAa;QACb,IAAI,EAAE,GAAG,EAAE;YACT,IAAI,CAAC;gBACH,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACtB,qBAAqB;gBACrB,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC9B,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,wCAAwC;YAC1C,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,0BAA0B,CACxC,UAAkB,EAClB,OAAiB,EAAE,EACnB,UAAwB,EAAE;IAE1B,MAAM,EACJ,KAAK,GAAG,EAAE,EACV,MAAM,GAAG,EAAE,EACX,KAAK,EACL,QAAQ,GAAG,IAAI,EACf,CAAC,EACD,CAAC,EACD,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EACnB,WAAW,GAAG,QAAQ,EACtB,UAAU,GAAG,CAAC,EACd,SAAS,GAAG,CAAC,GACd,GAAG,OAAO,CAAC;IAEZ,yBAAyB;IACzB,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAE7C,yDAAyD;IACzD,iFAAiF;IACjF,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,cAAc,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAE3E,0CAA0C;IAC1C,MAAM,WAAW,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;QAC9D,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAClE,OAAO,IAAI,OAAO,GAAG,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,QAAQ,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IAEhD,2BAA2B;IAC3B,MAAM,QAAQ,GAAa;QACzB,eAAe;QACf,IAAI,EAAE,wBAAwB;QAC9B,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE;QACtB,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE;QACvB,IAAI,EAAE,IAAI,GAAG,GAAG;KACjB,CAAC;IAEF,4CAA4C;IAC5C,IAAI,WAAW,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;QAC1C,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACnC,CAAC;IAED,iFAAiF;IACjF,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,oBAAoB,YAAY,CAAC,eAAe,GAAG,CAAC,CAAC;IAEzE,+BAA+B;IAC/B,IAAI,CAAC,QAAQ,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC;QACnD,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC3C,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC5C,CAAC;SAAM,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;QAC3D,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QAClC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IACpC,CAAC;SAAM,IAAI,QAAQ,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACtC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC3C,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC5C,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACzB,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,QAAQ;IACR,IAAI,KAAK,EAAE,CAAC;QACV,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,KAAK,GAAG,CAAC,CAAC;IACpC,CAAC;IAED,8BAA8B;IAC9B,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACtD,MAAM,WAAW,GAAG,QAAQ,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,cAAc,GAAG,CAAC;IAErE,qCAAqC;IACrC,OAAO,CAAC,KAAK,CAAC,gEAAgE,EAAE,WAAW,CAAC,CAAC;IAC7F,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,YAAY,CAAC,eAAe,CAAC,CAAC;IAEjF,yCAAyC;IACzC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE;QAC7C,KAAK,EAAE,SAAS;KACjB,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,IAAI,OAAO,CAAiB,CAAC,OAAO,EAAE,EAAE;QAC5D,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACrB,wCAAwC;YACxC,UAAU,CAAC,GAAG,EAAE;gBACd,oFAAoF;gBACpF,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC9B,IAAI,CAAC;wBACH,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;wBACxD,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW;wBAEtC,IAAI,CAAC;4BACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;4BACtC,OAAO,CAAC,MAAM,CAAC,CAAC;wBAClB,CAAC;wBAAC,MAAM,CAAC;4BACP,gCAAgC;4BAChC,OAAO,CAAC;gCACN,OAAO,EAAE,IAAI;gCACb,IAAI,EAAE,UAAU;6BACV,CAAC,CAAC;wBACZ,CAAC;oBACH,CAAC;oBAAC,OAAO,KAAU,EAAE,CAAC;wBACpB,OAAO,CAAC;4BACN,OAAO,EAAE,KAAK;4BACd,KAAK,EAAE,KAAK,CAAC,OAAO;yBACrB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,6BAA6B;oBAC7B,OAAO,CAAC,KAAK,CAAC,kCAAkC,UAAU,EAAE,CAAC,CAAC;oBAC9D,OAAO,CAAC;wBACN,OAAO,EAAE,KAAK;wBACd,SAAS,EAAE,IAAI;qBAChB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,oCAAoC;QAC/C,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1B,kCAAkC;YAClC,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC9B,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YAC5B,CAAC;YAED,OAAO,CAAC;gBACN,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,KAAK,CAAC,OAAO;aACrB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,GAAG,EAAE,KAAK,CAAC,GAAI;QACf,MAAM;QACN,aAAa;QACb,IAAI,EAAE,GAAG,EAAE;YACT,IAAI,CAAC;gBACH,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACtB,qBAAqB;gBACrB,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC9B,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,wCAAwC;YAC1C,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,WAAmB;IACjD,IAAI,CAAC;QACH,0DAA0D;QAC1D,MAAM,WAAW,GAAG,QAAQ,CAAC,gBAAgB,WAAW,QAAQ,EAAE;YAChE,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,MAAM;SACd,CAAC,CAAC,IAAI,EAAE,CAAC;QAEV,gEAAgE;QAChE,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,QAAQ,CAAC,eAAe,WAAW,WAAW,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,4EAA4E;IAC9E,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAClE,qDAAqD;QACrD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAC/C,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACxC,OAAO,UAAU,IAAI,GAAG,CAAC;QAC3B,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B;;;OAGG;IACH,QAAQ,CAAC,YAAoB;QAC3B,OAAO;YACL,QAAQ,EAAE,KAAK;YACf,UAAU,EAAE,YAAY,GAAG,CAAC;YAC5B,SAAS,EAAE,CAAC;SACb,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,mBAAmB,CAAC,YAAoB;QACtC,OAAO;YACL,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,YAAY;SACzB,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,aAAa;QACX,OAAO;YACL,QAAQ,EAAE,IAAI;SACf,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,YAAoB,EAAE,aAAqB,EAAE,cAAsB;QACvE,OAAO;YACL,QAAQ,EAAE,KAAK;YACf,UAAU,EAAE,YAAY,GAAG,CAAC;YAC5B,SAAS,EAAE,CAAC;YACZ,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,aAAa,GAAG,YAAY,GAAG,CAAC,EAAE,GAAG,CAAC;YACtD,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,GAAG,CAAC;SACzC,CAAC;IACJ,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utility for post-pane cleanup operations
|
|
3
|
+
* Handles welcome pane recreation and layout recalculation when last pane is removed
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Recreate welcome pane and recalculate layout after the last pane is removed
|
|
7
|
+
* This should be called whenever panes.length transitions from >0 to 0
|
|
8
|
+
*
|
|
9
|
+
* @param projectRoot - The project root directory
|
|
10
|
+
*/
|
|
11
|
+
export declare function handleLastPaneRemoved(projectRoot: string): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=postPaneCleanup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postPaneCleanup.d.ts","sourceRoot":"","sources":["../../src/utils/postPaneCleanup.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH;;;;;GAKG;AACH,wBAAsB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuD9E"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utility for post-pane cleanup operations
|
|
3
|
+
* Handles welcome pane recreation and layout recalculation when last pane is removed
|
|
4
|
+
*/
|
|
5
|
+
import { execSync } from 'child_process';
|
|
6
|
+
import { LogService } from '../services/LogService.js';
|
|
7
|
+
/**
|
|
8
|
+
* Recreate welcome pane and recalculate layout after the last pane is removed
|
|
9
|
+
* This should be called whenever panes.length transitions from >0 to 0
|
|
10
|
+
*
|
|
11
|
+
* @param projectRoot - The project root directory
|
|
12
|
+
*/
|
|
13
|
+
export async function handleLastPaneRemoved(projectRoot) {
|
|
14
|
+
try {
|
|
15
|
+
// Get the ACTUAL current control pane ID from tmux (don't trust config)
|
|
16
|
+
let controlPaneId;
|
|
17
|
+
try {
|
|
18
|
+
controlPaneId = execSync('tmux display-message -p "#{pane_id}"', {
|
|
19
|
+
encoding: 'utf-8',
|
|
20
|
+
stdio: 'pipe'
|
|
21
|
+
}).trim();
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
LogService.getInstance().debug('Failed to get current pane ID from tmux', 'postPaneCleanup');
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (!controlPaneId) {
|
|
28
|
+
LogService.getInstance().debug('No controlPaneId from tmux, skipping welcome pane recreation', 'postPaneCleanup');
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
LogService.getInstance().debug(`Last pane removed, recreating welcome pane and recalculating layout (controlPaneId: ${controlPaneId})`, 'postPaneCleanup');
|
|
32
|
+
// Recreate welcome pane
|
|
33
|
+
const { createWelcomePaneCoordinated } = await import('./welcomePaneManager.js');
|
|
34
|
+
const created = await createWelcomePaneCoordinated(projectRoot, controlPaneId);
|
|
35
|
+
if (created) {
|
|
36
|
+
LogService.getInstance().debug('Recreated welcome pane after last pane removed', 'postPaneCleanup');
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
LogService.getInstance().debug('Failed to recreate welcome pane', 'postPaneCleanup');
|
|
40
|
+
}
|
|
41
|
+
// Recalculate layout to fix sidebar size
|
|
42
|
+
const { recalculateAndApplyLayout } = await import('./layoutManager.js');
|
|
43
|
+
const { getTerminalDimensions } = await import('./tmux.js');
|
|
44
|
+
const dimensions = getTerminalDimensions();
|
|
45
|
+
recalculateAndApplyLayout(controlPaneId, [], // No content panes
|
|
46
|
+
dimensions.width, dimensions.height);
|
|
47
|
+
LogService.getInstance().debug('Recalculated layout after last pane removed', 'postPaneCleanup');
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
LogService.getInstance().error('Failed to handle last pane removal', 'postPaneCleanup', undefined, error instanceof Error ? error : undefined);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=postPaneCleanup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postPaneCleanup.js","sourceRoot":"","sources":["../../src/utils/postPaneCleanup.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAIzC,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAEvD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,WAAmB;IAC7D,IAAI,CAAC;QACH,wEAAwE;QACxE,IAAI,aAAqB,CAAC;QAC1B,IAAI,CAAC;YACH,aAAa,GAAG,QAAQ,CAAC,sCAAsC,EAAE;gBAC/D,QAAQ,EAAE,OAAO;gBACjB,KAAK,EAAE,MAAM;aACd,CAAC,CAAC,IAAI,EAAE,CAAC;QACZ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,UAAU,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,yCAAyC,EAAE,iBAAiB,CAAC,CAAC;YAC7F,OAAO;QACT,CAAC;QAED,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,UAAU,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,8DAA8D,EAAE,iBAAiB,CAAC,CAAC;YAClH,OAAO;QACT,CAAC;QAED,UAAU,CAAC,WAAW,EAAE,CAAC,KAAK,CAC5B,uFAAuF,aAAa,GAAG,EACvG,iBAAiB,CAClB,CAAC;QAEF,wBAAwB;QACxB,MAAM,EAAE,4BAA4B,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;QACjF,MAAM,OAAO,GAAG,MAAM,4BAA4B,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QAE/E,IAAI,OAAO,EAAE,CAAC;YACZ,UAAU,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,gDAAgD,EAAE,iBAAiB,CAAC,CAAC;QACtG,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,iCAAiC,EAAE,iBAAiB,CAAC,CAAC;QACvF,CAAC;QAED,yCAAyC;QACzC,MAAM,EAAE,yBAAyB,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACzE,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QAC5D,MAAM,UAAU,GAAG,qBAAqB,EAAE,CAAC;QAE3C,yBAAyB,CACvB,aAAa,EACb,EAAE,EAAE,mBAAmB;QACvB,UAAU,CAAC,KAAK,EAChB,UAAU,CAAC,MAAM,CAClB,CAAC;QAEF,UAAU,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,6CAA6C,EAAE,iBAAiB,CAAC,CAAC;IACnG,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,UAAU,CAAC,WAAW,EAAE,CAAC,KAAK,CAC5B,oCAAoC,EACpC,iBAAiB,EACjB,SAAS,EACT,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAC3C,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shell Pane Detection Utility
|
|
3
|
+
*
|
|
4
|
+
* Detects manually-created tmux panes and determines their shell type.
|
|
5
|
+
*/
|
|
6
|
+
import type { DmuxPane } from '../types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Detects the shell type running in a tmux pane
|
|
9
|
+
* @param paneId The tmux pane ID (e.g., %1)
|
|
10
|
+
* @returns Shell type (bash, zsh, fish, etc) or 'shell' as fallback
|
|
11
|
+
*/
|
|
12
|
+
export declare function detectShellType(paneId: string): string;
|
|
13
|
+
/**
|
|
14
|
+
* Information about an untracked pane
|
|
15
|
+
*/
|
|
16
|
+
export interface UntrackedPaneInfo {
|
|
17
|
+
paneId: string;
|
|
18
|
+
title: string;
|
|
19
|
+
command: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Gets all untracked tmux panes (panes not in dmux config)
|
|
23
|
+
* @param sessionName The tmux session name
|
|
24
|
+
* @param trackedPaneIds Array of pane IDs already tracked by dmux
|
|
25
|
+
* @param controlPaneId Optional control pane ID to exclude
|
|
26
|
+
* @param welcomePaneId Optional welcome pane ID to exclude
|
|
27
|
+
* @returns Array of untracked pane information
|
|
28
|
+
*/
|
|
29
|
+
export declare function getUntrackedPanes(sessionName: string, trackedPaneIds: string[], controlPaneId?: string, welcomePaneId?: string): UntrackedPaneInfo[];
|
|
30
|
+
/**
|
|
31
|
+
* Creates a DmuxPane object for a shell pane
|
|
32
|
+
* @param paneId The tmux pane ID
|
|
33
|
+
* @param nextId The next available dmux ID number
|
|
34
|
+
* @param existingTitle Optional existing title to preserve
|
|
35
|
+
* @returns DmuxPane object for the shell pane
|
|
36
|
+
*/
|
|
37
|
+
export declare function createShellPane(paneId: string, nextId: number, existingTitle?: string): DmuxPane;
|
|
38
|
+
/**
|
|
39
|
+
* Gets the next available dmux ID number
|
|
40
|
+
* @param existingPanes Array of existing panes
|
|
41
|
+
* @returns Next available ID number
|
|
42
|
+
*/
|
|
43
|
+
export declare function getNextDmuxId(existingPanes: DmuxPane[]): number;
|
|
44
|
+
//# sourceMappingURL=shellPaneDetection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shellPaneDetection.d.ts","sourceRoot":"","sources":["../../src/utils/shellPaneDetection.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG5C;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA2DtD;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EAAE,EACxB,aAAa,CAAC,EAAE,MAAM,EACtB,aAAa,CAAC,EAAE,MAAM,GACrB,iBAAiB,EAAE,CA+DrB;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,QAAQ,CAgChG;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,aAAa,EAAE,QAAQ,EAAE,GAAG,MAAM,CAc/D"}
|