dmux 3.3.0 → 3.4.3
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.map +1 -1
- package/dist/DmuxApp.js +51 -12
- package/dist/DmuxApp.js.map +1 -1
- package/dist/actions/implementations/closeAction.d.ts.map +1 -1
- package/dist/actions/implementations/closeAction.js +24 -4
- package/dist/actions/implementations/closeAction.js.map +1 -1
- package/dist/actions/merge/commitMessageHandler.d.ts.map +1 -1
- package/dist/actions/merge/commitMessageHandler.js +0 -8
- package/dist/actions/merge/commitMessageHandler.js.map +1 -1
- package/dist/actions/merge/mergeExecution.d.ts.map +1 -1
- package/dist/actions/merge/mergeExecution.js +5 -1
- package/dist/actions/merge/mergeExecution.js.map +1 -1
- package/dist/chunks/styles.css_vue_type_style_index_0_src_true_lang-pW5mq51o.js +17 -0
- package/dist/components/popups/logsPopup.js +35 -19
- package/dist/components/popups/logsPopup.js.map +1 -1
- package/dist/components/ui/FooterHelp.d.ts +4 -0
- package/dist/components/ui/FooterHelp.d.ts.map +1 -1
- package/dist/components/ui/FooterHelp.js +45 -1
- package/dist/components/ui/FooterHelp.js.map +1 -1
- package/dist/components/ui/ToastNotification.d.ts +13 -0
- package/dist/components/ui/ToastNotification.d.ts.map +1 -0
- package/dist/components/ui/ToastNotification.js +22 -0
- package/dist/components/ui/ToastNotification.js.map +1 -0
- package/dist/dashboard.html +2 -2
- package/dist/dashboard.js +2 -2
- package/dist/hooks/useActionSystem.d.ts.map +1 -1
- package/dist/hooks/useActionSystem.js +8 -23
- package/dist/hooks/useActionSystem.js.map +1 -1
- package/dist/hooks/useInputHandling.d.ts.map +1 -1
- package/dist/hooks/useInputHandling.js +16 -2
- package/dist/hooks/useInputHandling.js.map +1 -1
- package/dist/hooks/useLayoutManagement.d.ts.map +1 -1
- package/dist/hooks/useLayoutManagement.js +46 -12
- package/dist/hooks/useLayoutManagement.js.map +1 -1
- package/dist/hooks/usePaneLoading.d.ts +3 -0
- package/dist/hooks/usePaneLoading.d.ts.map +1 -1
- package/dist/hooks/usePaneLoading.js +48 -8
- package/dist/hooks/usePaneLoading.js.map +1 -1
- package/dist/hooks/usePaneSync.d.ts +3 -0
- package/dist/hooks/usePaneSync.d.ts.map +1 -1
- package/dist/hooks/usePaneSync.js +18 -3
- package/dist/hooks/usePaneSync.js.map +1 -1
- package/dist/hooks/usePanes.js +16 -4
- package/dist/hooks/usePanes.js.map +1 -1
- package/dist/hooks/useShellDetection.js +20 -6
- package/dist/hooks/useShellDetection.js.map +1 -1
- package/dist/index.js +58 -46
- package/dist/index.js.map +1 -1
- package/dist/layout/LayoutCalculator.d.ts.map +1 -1
- package/dist/layout/LayoutCalculator.js +0 -3
- package/dist/layout/LayoutCalculator.js.map +1 -1
- package/dist/layout/SpacerManager.js +15 -7
- package/dist/layout/SpacerManager.js.map +1 -1
- package/dist/layout/TmuxLayoutApplier.d.ts +4 -1
- package/dist/layout/TmuxLayoutApplier.d.ts.map +1 -1
- package/dist/layout/TmuxLayoutApplier.js +28 -21
- package/dist/layout/TmuxLayoutApplier.js.map +1 -1
- package/dist/server/embedded-assets.d.ts.map +1 -1
- package/dist/server/embedded-assets.js +137 -97
- package/dist/server/embedded-assets.js.map +1 -1
- package/dist/server/routes/keysRoutes.d.ts +15 -2
- package/dist/server/routes/keysRoutes.d.ts.map +1 -1
- package/dist/server/routes/keysRoutes.js +18 -1
- package/dist/server/routes/keysRoutes.js.map +1 -1
- package/dist/services/AutoUpdater.d.ts.map +1 -1
- package/dist/services/AutoUpdater.js +2 -1
- package/dist/services/AutoUpdater.js.map +1 -1
- package/dist/services/PaneAnalyzer.d.ts +12 -3
- package/dist/services/PaneAnalyzer.d.ts.map +1 -1
- package/dist/services/PaneAnalyzer.js +57 -8
- package/dist/services/PaneAnalyzer.js.map +1 -1
- package/dist/services/PopupManager.d.ts.map +1 -1
- package/dist/services/PopupManager.js +7 -1
- package/dist/services/PopupManager.js.map +1 -1
- package/dist/services/StatusDetector.d.ts.map +1 -1
- package/dist/services/StatusDetector.js +31 -14
- package/dist/services/StatusDetector.js.map +1 -1
- package/dist/services/TmuxService.d.ts +57 -3
- package/dist/services/TmuxService.d.ts.map +1 -1
- package/dist/services/TmuxService.js +97 -7
- package/dist/services/TmuxService.js.map +1 -1
- package/dist/services/ToastService.d.ts +71 -0
- package/dist/services/ToastService.d.ts.map +1 -0
- package/dist/services/ToastService.js +151 -0
- package/dist/services/ToastService.js.map +1 -0
- package/dist/shared/StateManager.d.ts +22 -0
- package/dist/shared/StateManager.d.ts.map +1 -1
- package/dist/shared/StateManager.js +68 -1
- package/dist/shared/StateManager.js.map +1 -1
- package/dist/terminal.html +2 -2
- package/dist/terminal.js +3 -3
- package/dist/types.d.ts +3 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/asciiArt.js +3 -3
- package/dist/utils/asciiArt.js.map +1 -1
- package/dist/utils/atomicWrite.d.ts +33 -0
- package/dist/utils/atomicWrite.d.ts.map +1 -0
- package/dist/utils/atomicWrite.js +89 -0
- package/dist/utils/atomicWrite.js.map +1 -0
- package/dist/utils/errorHandling.js +34 -8
- package/dist/utils/errorHandling.js.map +1 -1
- package/dist/utils/generated-agents-doc.d.ts +1 -1
- package/dist/utils/generated-agents-doc.js +1 -1
- package/dist/utils/hooksDocs.d.ts +1 -1
- package/dist/utils/layoutManager.d.ts.map +1 -1
- package/dist/utils/layoutManager.js +223 -169
- package/dist/utils/layoutManager.js.map +1 -1
- package/dist/utils/mergeValidation.d.ts.map +1 -1
- package/dist/utils/mergeValidation.js +5 -1
- package/dist/utils/mergeValidation.js.map +1 -1
- package/dist/utils/paneCreation.d.ts.map +1 -1
- package/dist/utils/paneCreation.js +5 -4
- package/dist/utils/paneCreation.js.map +1 -1
- package/dist/utils/paneRebinding.js +4 -2
- package/dist/utils/paneRebinding.js.map +1 -1
- package/dist/utils/postPaneCleanup.d.ts.map +1 -1
- package/dist/utils/postPaneCleanup.js +1 -11
- package/dist/utils/postPaneCleanup.js.map +1 -1
- package/dist/utils/shellPaneDetection.js +33 -23
- package/dist/utils/shellPaneDetection.js.map +1 -1
- package/dist/utils/tmux.d.ts.map +1 -1
- package/dist/utils/tmux.js +19 -13
- package/dist/utils/tmux.js.map +1 -1
- package/dist/utils/welcomePane.d.ts.map +1 -1
- package/dist/utils/welcomePane.js +1 -7
- package/dist/utils/welcomePane.js.map +1 -1
- package/dist/utils/welcomePaneManager.d.ts.map +1 -1
- package/dist/utils/welcomePaneManager.js +10 -24
- package/dist/utils/welcomePaneManager.js.map +1 -1
- package/package.json +7 -7
- package/dist/chunks/_plugin-vue_export-helper-Cvoq67hi.js +0 -28
- /package/dist/{_plugin-vue_export-helper.css → styles.css} +0 -0
|
@@ -36,195 +36,249 @@ let lastLayoutDimensions = null;
|
|
|
36
36
|
* 9. Apply layout to tmux
|
|
37
37
|
*/
|
|
38
38
|
export async function recalculateAndApplyLayout(controlPaneId, contentPaneIds, terminalWidth, terminalHeight, config = DEFAULT_LAYOUT_CONFIG) {
|
|
39
|
-
//
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
lastLayoutDimensions = {
|
|
57
|
-
width: terminalWidth,
|
|
58
|
-
height: terminalHeight,
|
|
59
|
-
paneCount: realContentPanes.length,
|
|
60
|
-
};
|
|
61
|
-
// Step 2: Calculate layout for real content panes only
|
|
62
|
-
const layout = calculator.calculateOptimalLayout(realContentPanes.length, terminalWidth, terminalHeight);
|
|
63
|
-
// Step 3: Determine if we need a spacer pane
|
|
64
|
-
const needsSpacer = spacerManager.needsSpacerPane(realContentPanes.length, layout);
|
|
65
|
-
// Step 4: Manage spacer pane creation/destruction
|
|
66
|
-
// ALWAYS destroy existing spacer on layout recalc to ensure fresh positioning
|
|
67
|
-
let spacerId = null;
|
|
68
|
-
LogService.getInstance().debug(`Spacer management: needs=${needsSpacer}, existing=${existingSpacerId || 'none'}`, 'Layout');
|
|
69
|
-
// Destroy existing spacer if present (we'll recreate if needed)
|
|
70
|
-
if (existingSpacerId) {
|
|
71
|
-
LogService.getInstance().debug(`Destroying existing spacer for recreation: ${existingSpacerId}`, 'Layout');
|
|
72
|
-
spacerManager.destroySpacerPane(existingSpacerId);
|
|
73
|
-
}
|
|
74
|
-
// Create new spacer if needed
|
|
75
|
-
if (needsSpacer) {
|
|
39
|
+
// Wrap entire function in try-catch to prevent crashes during resize
|
|
40
|
+
try {
|
|
41
|
+
// Validate inputs to prevent crashes from bad data
|
|
42
|
+
if (!controlPaneId || typeof controlPaneId !== 'string') {
|
|
43
|
+
LogService.getInstance().warn('Invalid controlPaneId, skipping layout', 'Layout');
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (terminalWidth <= 0 || terminalHeight <= 0) {
|
|
47
|
+
LogService.getInstance().warn(`Invalid terminal dimensions: ${terminalWidth}x${terminalHeight}, skipping layout`, 'Layout');
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
// Create class instances with config
|
|
51
|
+
const calculator = new LayoutCalculator(config);
|
|
52
|
+
const spacerManager = new SpacerManager(config);
|
|
53
|
+
const layoutApplier = new TmuxLayoutApplier(config);
|
|
54
|
+
// Step 1: Filter out any existing spacer from content panes
|
|
55
|
+
let existingSpacerId = null;
|
|
76
56
|
try {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
57
|
+
existingSpacerId = spacerManager.findSpacerPane();
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
LogService.getInstance().debug(`Failed to find spacer pane: ${error}`, 'Layout');
|
|
61
|
+
}
|
|
62
|
+
const realContentPanes = contentPaneIds.filter(id => id !== existingSpacerId);
|
|
63
|
+
// Check if dimensions and pane count have changed since last layout
|
|
64
|
+
const dimensionsUnchanged = lastLayoutDimensions &&
|
|
65
|
+
lastLayoutDimensions.width === terminalWidth &&
|
|
66
|
+
lastLayoutDimensions.height === terminalHeight &&
|
|
67
|
+
lastLayoutDimensions.paneCount === realContentPanes.length;
|
|
68
|
+
if (dimensionsUnchanged) {
|
|
69
|
+
// Layout unchanged - skip ALL layout operations to prevent Ink redraw
|
|
70
|
+
// This prevents the dmux UI from being cleared on resize when nothing changed
|
|
71
|
+
// (Removed noisy debug log that fires on every check)
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
// Only log when dimensions actually change (much less noisy)
|
|
75
|
+
LogService.getInstance().info(`Layout dimensions changed: ${terminalWidth}x${terminalHeight}, ${realContentPanes.length} panes`, 'layout');
|
|
76
|
+
// Update last layout dimensions
|
|
77
|
+
lastLayoutDimensions = {
|
|
78
|
+
width: terminalWidth,
|
|
79
|
+
height: terminalHeight,
|
|
80
|
+
paneCount: realContentPanes.length,
|
|
81
|
+
};
|
|
82
|
+
// Step 2: Calculate layout for real content panes only
|
|
83
|
+
const layout = calculator.calculateOptimalLayout(realContentPanes.length, terminalWidth, terminalHeight);
|
|
84
|
+
// Step 3: Determine if we need a spacer pane
|
|
85
|
+
const needsSpacer = spacerManager.needsSpacerPane(realContentPanes.length, layout);
|
|
86
|
+
// Step 4: Manage spacer pane creation/destruction
|
|
87
|
+
// ALWAYS destroy existing spacer on layout recalc to ensure fresh positioning
|
|
88
|
+
let spacerId = null;
|
|
89
|
+
// LogService.getInstance().debug(
|
|
90
|
+
// `Spacer management: needs=${needsSpacer}, existing=${existingSpacerId || 'none'}`,
|
|
91
|
+
// 'Layout'
|
|
92
|
+
// );
|
|
93
|
+
// Destroy existing spacer if present (we'll recreate if needed)
|
|
94
|
+
if (existingSpacerId) {
|
|
95
|
+
// LogService.getInstance().debug(`Destroying existing spacer for recreation: ${existingSpacerId}`, 'Layout');
|
|
96
|
+
spacerManager.destroySpacerPane(existingSpacerId);
|
|
97
|
+
}
|
|
98
|
+
// Create new spacer if needed
|
|
99
|
+
if (needsSpacer) {
|
|
100
|
+
try {
|
|
101
|
+
const lastContentPaneId = realContentPanes[realContentPanes.length - 1];
|
|
102
|
+
if (!lastContentPaneId) {
|
|
103
|
+
throw new Error('No content panes available to split from');
|
|
104
|
+
}
|
|
105
|
+
spacerId = spacerManager.createSpacerPane(lastContentPaneId);
|
|
106
|
+
// LogService.getInstance().debug(`Created fresh spacer pane: ${spacerId}`, 'Layout');
|
|
107
|
+
// CRITICAL: Wait for tmux to fully register the new pane before applying layout
|
|
108
|
+
await new Promise(resolve => setTimeout(resolve, TMUX_PANE_CREATION_DELAY));
|
|
109
|
+
// Verify the pane appears in list-panes output
|
|
110
|
+
const tmuxService = TmuxService.getInstance();
|
|
111
|
+
let paneVerified = false;
|
|
112
|
+
for (let attempts = 0; attempts < 3; attempts++) {
|
|
113
|
+
try {
|
|
114
|
+
const allPaneIds = tmuxService.getAllPaneIdsSync();
|
|
115
|
+
if (allPaneIds.includes(spacerId)) {
|
|
116
|
+
paneVerified = true;
|
|
117
|
+
// LogService.getInstance().debug(
|
|
118
|
+
// `Verified spacer pane ${spacerId} in list-panes (attempt ${attempts + 1})`,
|
|
119
|
+
// 'Layout'
|
|
120
|
+
// );
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
// Pane not ready yet, wait a bit
|
|
126
|
+
if (attempts < 2)
|
|
127
|
+
await new Promise(resolve => setTimeout(resolve, TMUX_PANE_CREATION_DELAY));
|
|
95
128
|
}
|
|
96
129
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
await new Promise(resolve => setTimeout(resolve, TMUX_PANE_CREATION_DELAY));
|
|
130
|
+
if (!paneVerified) {
|
|
131
|
+
LogService.getInstance().warn(`Spacer pane ${spacerId} not verified, continuing anyway`, 'Layout');
|
|
132
|
+
// Don't throw - continue and let it fail with better logs
|
|
101
133
|
}
|
|
102
134
|
}
|
|
103
|
-
|
|
104
|
-
LogService.getInstance().debug(`
|
|
105
|
-
|
|
135
|
+
catch (error) {
|
|
136
|
+
// LogService.getInstance().debug(`Continuing without spacer pane: ${error}`, 'Layout');
|
|
137
|
+
spacerId = null;
|
|
106
138
|
}
|
|
107
139
|
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
140
|
+
// Step 5: Build final pane list (real panes + spacer if exists)
|
|
141
|
+
let finalContentPanes = spacerId ? [...realContentPanes, spacerId] : realContentPanes;
|
|
142
|
+
// CRITICAL: Sort panes by tmux index, then put spacer LAST
|
|
143
|
+
// Tmux applies layout geometry by pane index order!
|
|
144
|
+
const paneIndices = new Map();
|
|
145
|
+
try {
|
|
146
|
+
const tmuxService = TmuxService.getInstance();
|
|
147
|
+
// Get pane index from tmux (pane_index format variable)
|
|
148
|
+
const indexOutput = tmuxService.listPanesSync('#{pane_id}=#{pane_index}');
|
|
149
|
+
const indexLines = indexOutput.split('\n').filter(l => l.trim());
|
|
150
|
+
indexLines.forEach(line => {
|
|
151
|
+
const [paneId, indexStr] = line.split('=');
|
|
152
|
+
if (paneId && indexStr) {
|
|
153
|
+
paneIndices.set(paneId, parseInt(indexStr, 10));
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
// Sort by index, but force spacer to the end
|
|
157
|
+
finalContentPanes = finalContentPanes.sort((a, b) => {
|
|
158
|
+
// Spacer always last
|
|
159
|
+
if (a === spacerId)
|
|
160
|
+
return 1;
|
|
161
|
+
if (b === spacerId)
|
|
162
|
+
return -1;
|
|
163
|
+
// Otherwise sort by tmux index
|
|
164
|
+
const indexA = paneIndices.get(a) || 0;
|
|
165
|
+
const indexB = paneIndices.get(b) || 0;
|
|
166
|
+
return indexA - indexB;
|
|
167
|
+
});
|
|
168
|
+
// LogService.getInstance().debug(
|
|
169
|
+
// `Pane order sorted by index: ${finalContentPanes.map(p => `${p}(idx:${paneIndices.get(p)})`).join(', ')}`,
|
|
170
|
+
// 'Layout'
|
|
171
|
+
// );
|
|
111
172
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
//
|
|
121
|
-
const
|
|
122
|
-
const
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
//
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
if (a === spacerId)
|
|
133
|
-
return 1;
|
|
134
|
-
if (b === spacerId)
|
|
135
|
-
return -1;
|
|
136
|
-
// Otherwise sort by tmux index
|
|
137
|
-
const indexA = paneIndices.get(a) || 0;
|
|
138
|
-
const indexB = paneIndices.get(b) || 0;
|
|
139
|
-
return indexA - indexB;
|
|
140
|
-
});
|
|
141
|
-
LogService.getInstance().debug(`Pane order sorted by index: ${finalContentPanes.map(p => `${p}(idx:${paneIndices.get(p)})`).join(', ')}`, 'Layout');
|
|
142
|
-
}
|
|
143
|
-
catch (err) {
|
|
144
|
-
LogService.getInstance().debug(`Failed to sort by index: ${err}`, 'Layout');
|
|
145
|
-
}
|
|
146
|
-
// Step 6: Recalculate layout with spacer included if present
|
|
147
|
-
const finalLayout = spacerId
|
|
148
|
-
? calculator.calculateOptimalLayout(finalContentPanes.length, terminalWidth, terminalHeight)
|
|
149
|
-
: layout;
|
|
150
|
-
// Log current tmux state before applying layout
|
|
151
|
-
try {
|
|
173
|
+
catch (err) {
|
|
174
|
+
// LogService.getInstance().debug(`Failed to sort by index: ${err}`, 'Layout');
|
|
175
|
+
}
|
|
176
|
+
// Step 6: Recalculate layout with spacer included if present
|
|
177
|
+
const finalLayout = spacerId
|
|
178
|
+
? calculator.calculateOptimalLayout(finalContentPanes.length, terminalWidth, terminalHeight)
|
|
179
|
+
: layout;
|
|
180
|
+
// Log current tmux state before applying layout (commented out to reduce noise)
|
|
181
|
+
// try {
|
|
182
|
+
// const tmuxService = TmuxService.getInstance();
|
|
183
|
+
// const positions = tmuxService.getPanePositionsSync();
|
|
184
|
+
// const positionsStr = positions.map(p =>
|
|
185
|
+
// `${p.paneId} ${p.width}x${p.height} @${p.left},${p.top}`
|
|
186
|
+
// ).join('\n');
|
|
187
|
+
// LogService.getInstance().debug(`Current pane positions before layout:\n${positionsStr}`, 'Layout');
|
|
188
|
+
// } catch {}
|
|
189
|
+
// CRITICAL ORDER: Resize sidebar FIRST (before window), then window
|
|
190
|
+
// This prevents tmux from redistributing window width changes to the sidebar
|
|
191
|
+
// Step 7: Find and verify the actual control pane
|
|
192
|
+
// The control pane ID may change after layout operations, so we need to find it by position
|
|
152
193
|
const tmuxService = TmuxService.getInstance();
|
|
153
|
-
|
|
154
|
-
const positionsStr = positions.map(p => `${p.paneId} ${p.width}x${p.height} @${p.left},${p.top}`).join('\n');
|
|
155
|
-
LogService.getInstance().debug(`Current pane positions before layout:\n${positionsStr}`, 'Layout');
|
|
156
|
-
}
|
|
157
|
-
catch { }
|
|
158
|
-
// CRITICAL ORDER: Resize sidebar FIRST (before window), then window
|
|
159
|
-
// This prevents tmux from redistributing window width changes to the sidebar
|
|
160
|
-
// Step 7: Find and verify the actual control pane
|
|
161
|
-
// The control pane ID may change after layout operations, so we need to find it by position
|
|
162
|
-
const tmuxService = TmuxService.getInstance();
|
|
163
|
-
let actualControlPaneId = controlPaneId;
|
|
164
|
-
try {
|
|
165
|
-
// First, verify the provided controlPaneId still exists
|
|
166
|
-
await tmuxService.paneExists(controlPaneId);
|
|
167
|
-
}
|
|
168
|
-
catch {
|
|
169
|
-
// Control pane ID is stale, find it by position (leftmost pane at x=0)
|
|
170
|
-
// Use the smallest pane at x=0 as the sidebar (allows for slight width variations)
|
|
194
|
+
let actualControlPaneId = controlPaneId;
|
|
171
195
|
try {
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
196
|
+
// First, verify the provided controlPaneId still exists
|
|
197
|
+
await tmuxService.paneExists(controlPaneId);
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
// Control pane ID is stale, find it by position (leftmost pane at x=0)
|
|
201
|
+
// Use the smallest pane at x=0 as the sidebar (allows for slight width variations)
|
|
202
|
+
try {
|
|
203
|
+
const positions = tmuxService.getPanePositionsSync();
|
|
204
|
+
let smallestPaneAtLeft = null;
|
|
205
|
+
for (const pos of positions) {
|
|
206
|
+
// Find the smallest pane at x=0 (likely the sidebar)
|
|
207
|
+
if (pos.left === 0 && (!smallestPaneAtLeft || pos.width < smallestPaneAtLeft.width)) {
|
|
208
|
+
smallestPaneAtLeft = { id: pos.paneId, width: pos.width };
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
if (smallestPaneAtLeft) {
|
|
212
|
+
actualControlPaneId = smallestPaneAtLeft.id;
|
|
213
|
+
// LogService.getInstance().debug(
|
|
214
|
+
// `Control pane ID updated: ${controlPaneId} → ${actualControlPaneId} (width: ${smallestPaneAtLeft.width})`,
|
|
215
|
+
// 'Layout'
|
|
216
|
+
// );
|
|
178
217
|
}
|
|
179
218
|
}
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
LogService.getInstance().debug(`Control pane ID updated: ${controlPaneId} → ${actualControlPaneId} (width: ${smallestPaneAtLeft.width})`, 'Layout');
|
|
219
|
+
catch (findError) {
|
|
220
|
+
// LogService.getInstance().debug(`Failed to find control pane by position: ${findError}`, 'Layout');
|
|
183
221
|
}
|
|
184
222
|
}
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
223
|
+
// Step 8: Check sidebar width (but DON'T resize yet)
|
|
224
|
+
// We'll let the layout application handle the sizing to avoid pane swapping
|
|
225
|
+
// Commented out to reduce log noise
|
|
226
|
+
// try {
|
|
227
|
+
// const currentSidebarWidth = tmuxService.getPaneWidthSync(actualControlPaneId);
|
|
228
|
+
//
|
|
229
|
+
// if (currentSidebarWidth !== config.SIDEBAR_WIDTH) {
|
|
230
|
+
// LogService.getInstance().debug(
|
|
231
|
+
// `Sidebar width mismatch: ${currentSidebarWidth} (current) vs ${config.SIDEBAR_WIDTH} (target), will fix via layout`,
|
|
232
|
+
// 'Layout'
|
|
233
|
+
// );
|
|
234
|
+
// } else {
|
|
235
|
+
// LogService.getInstance().debug(`Sidebar width already correct: ${config.SIDEBAR_WIDTH}`, 'Layout');
|
|
236
|
+
// }
|
|
237
|
+
// } catch (error) {
|
|
238
|
+
// LogService.getInstance().debug(`Failed to check sidebar width: ${error}`, 'Layout');
|
|
239
|
+
// }
|
|
240
|
+
// Step 8: Check window dimensions and resize if needed
|
|
241
|
+
// Do this AFTER sidebar resize so sidebar width is locked
|
|
242
|
+
const currentWindowDims = getWindowDimensions();
|
|
243
|
+
// Calculate target window height (accounting for status bar)
|
|
244
|
+
const statusBarHeight = tmuxService.getStatusBarHeightSync();
|
|
245
|
+
const targetWindowHeight = terminalHeight - statusBarHeight;
|
|
246
|
+
const needsWindowResize = currentWindowDims.width !== finalLayout.windowWidth ||
|
|
247
|
+
currentWindowDims.height !== targetWindowHeight;
|
|
248
|
+
if (needsWindowResize) {
|
|
249
|
+
// LogService.getInstance().debug(
|
|
250
|
+
// `Resizing window: ${currentWindowDims.width}x${currentWindowDims.height} → ${finalLayout.windowWidth}x${targetWindowHeight}`,
|
|
251
|
+
// 'Layout'
|
|
252
|
+
// );
|
|
253
|
+
layoutApplier.setWindowDimensions(finalLayout.windowWidth, terminalHeight);
|
|
254
|
+
// Wait for tmux to complete the window resize
|
|
255
|
+
await new Promise(resolve => setTimeout(resolve, TMUX_PANE_CREATION_DELAY));
|
|
256
|
+
// Note: We don't re-enforce sidebar width here anymore
|
|
257
|
+
// The layout application below will set the correct dimensions for all panes
|
|
195
258
|
}
|
|
196
259
|
else {
|
|
197
|
-
LogService.getInstance().debug(
|
|
260
|
+
// LogService.getInstance().debug(
|
|
261
|
+
// `Window dimensions already correct: ${finalLayout.windowWidth}x${terminalHeight}`,
|
|
262
|
+
// 'Layout'
|
|
263
|
+
// );
|
|
198
264
|
}
|
|
265
|
+
// Log window state after sidebar enforcement (commented out to reduce noise)
|
|
266
|
+
// try {
|
|
267
|
+
// const windowDims = tmuxService.getWindowDimensionsSync();
|
|
268
|
+
// const layout = tmuxService.getCurrentLayoutSync();
|
|
269
|
+
// LogService.getInstance().debug(
|
|
270
|
+
// `After sidebar enforcement: Window: ${windowDims.width}x${windowDims.height}, Layout: ${layout}`,
|
|
271
|
+
// 'Layout'
|
|
272
|
+
// );
|
|
273
|
+
// } catch {}
|
|
274
|
+
// Step 9: Apply the layout to tmux
|
|
275
|
+
layoutApplier.applyPaneLayout(actualControlPaneId, finalContentPanes, finalLayout, terminalHeight);
|
|
199
276
|
}
|
|
200
277
|
catch (error) {
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
// Do this AFTER sidebar resize so sidebar width is locked
|
|
205
|
-
const currentWindowDims = getWindowDimensions();
|
|
206
|
-
const needsWindowResize = currentWindowDims.width !== finalLayout.windowWidth ||
|
|
207
|
-
currentWindowDims.height !== terminalHeight;
|
|
208
|
-
if (needsWindowResize) {
|
|
209
|
-
LogService.getInstance().debug(`Resizing window: ${currentWindowDims.width}x${currentWindowDims.height} → ${finalLayout.windowWidth}x${terminalHeight}`, 'Layout');
|
|
210
|
-
layoutApplier.setWindowDimensions(finalLayout.windowWidth, terminalHeight);
|
|
211
|
-
// Wait for tmux to complete the window resize
|
|
212
|
-
await new Promise(resolve => setTimeout(resolve, TMUX_PANE_CREATION_DELAY));
|
|
213
|
-
// Note: We don't re-enforce sidebar width here anymore
|
|
214
|
-
// The layout application below will set the correct dimensions for all panes
|
|
215
|
-
}
|
|
216
|
-
else {
|
|
217
|
-
LogService.getInstance().debug(`Window dimensions already correct: ${finalLayout.windowWidth}x${terminalHeight}`, 'Layout');
|
|
218
|
-
}
|
|
219
|
-
// Log window state after sidebar enforcement
|
|
220
|
-
try {
|
|
221
|
-
const windowDims = tmuxService.getWindowDimensionsSync();
|
|
222
|
-
const layout = tmuxService.getCurrentLayoutSync();
|
|
223
|
-
LogService.getInstance().debug(`After sidebar enforcement: Window: ${windowDims.width}x${windowDims.height}, Layout: ${layout}`, 'Layout');
|
|
278
|
+
// Catch-all for any errors during layout recalculation
|
|
279
|
+
// Log but don't crash - layout will be retried on next resize event
|
|
280
|
+
LogService.getInstance().error(`Layout recalculation failed: ${error}`, 'Layout', undefined, error instanceof Error ? error : undefined);
|
|
224
281
|
}
|
|
225
|
-
catch { }
|
|
226
|
-
// Step 9: Apply the layout to tmux
|
|
227
|
-
layoutApplier.applyPaneLayout(actualControlPaneId, finalContentPanes, finalLayout, terminalHeight);
|
|
228
282
|
}
|
|
229
283
|
/**
|
|
230
284
|
* Calculates optimal layout configuration based on terminal dimensions
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layoutManager.js","sourceRoot":"","sources":["../../src/utils/layoutManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,wBAAwB,EAA6B,MAAM,wBAAwB,CAAC;AAE7F,6BAA6B;AAC7B,OAAO,EAAE,gBAAgB,EAA4B,MAAM,+BAA+B,CAAC;AAC3F,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAanE,MAAM,CAAC,MAAM,qBAAqB,GAAiB;IACjD,aAAa,EAAE,EAAE;IACjB,qBAAqB,EAAE,EAAE;IACzB,qBAAqB,EAAE,EAAE;IACzB,sBAAsB,EAAE,EAAE;CAC3B,CAAC;AAEF,sEAAsE;AACtE,MAAM,CAAC,MAAM,aAAa,GAAG,qBAAqB,CAAC,aAAa,CAAC;AACjE,MAAM,CAAC,MAAM,qBAAqB,GAAG,qBAAqB,CAAC,qBAAqB,CAAC;AACjF,MAAM,CAAC,MAAM,qBAAqB,GAAG,qBAAqB,CAAC,qBAAqB,CAAC;AACjF,MAAM,CAAC,MAAM,sBAAsB,GAAG,qBAAqB,CAAC,sBAAsB,CAAC;AAKnF,sEAAsE;AACtE,IAAI,oBAAoB,GAAgE,IAAI,CAAC;AAE7F;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,aAAqB,EACrB,cAAwB,EACxB,aAAqB,EACrB,cAAsB,EACtB,SAAuB,qBAAqB;IAE5C,qCAAqC;
|
|
1
|
+
{"version":3,"file":"layoutManager.js","sourceRoot":"","sources":["../../src/utils/layoutManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mergeValidation.d.ts","sourceRoot":"","sources":["../../src/utils/mergeValidation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,YAAY,GAAG,sBAAsB,GAAG,gBAAgB,GAAG,kBAAkB,CAAC;IACpF,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"mergeValidation.d.ts","sourceRoot":"","sources":["../../src/utils/mergeValidation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,YAAY,GAAG,sBAAsB,GAAG,gBAAgB,GAAG,kBAAkB,CAAC;IACpF,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAuCxD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAWjG;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,GACnB;IAAE,YAAY,EAAE,OAAO,CAAC;IAAC,aAAa,EAAE,MAAM,EAAE,CAAA;CAAE,CA0EpD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,MAAM,GACrB,qBAAqB,CAqEvB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CActF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CActC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAanF"}
|
|
@@ -11,6 +11,7 @@ import { getCurrentBranch as getCurrentBranchUtil } from './git.js';
|
|
|
11
11
|
*/
|
|
12
12
|
export function getGitStatus(repoPath) {
|
|
13
13
|
try {
|
|
14
|
+
LogService.getInstance().info(`Getting git status for: ${repoPath}`, 'mergeValidation');
|
|
14
15
|
const statusOutput = execSync('git status --porcelain', {
|
|
15
16
|
cwd: repoPath,
|
|
16
17
|
encoding: 'utf-8',
|
|
@@ -31,7 +32,7 @@ export function getGitStatus(repoPath) {
|
|
|
31
32
|
LogService.getInstance().info(`Git status: "${line}" → "${filename}"`, 'mergeValidation');
|
|
32
33
|
return filename;
|
|
33
34
|
});
|
|
34
|
-
LogService.getInstance().info(`Final files: ${JSON.stringify(files)}`, 'mergeValidation');
|
|
35
|
+
LogService.getInstance().info(`Final files for ${repoPath}: ${JSON.stringify(files)}`, 'mergeValidation');
|
|
35
36
|
return {
|
|
36
37
|
hasChanges: files.length > 0,
|
|
37
38
|
files,
|
|
@@ -151,6 +152,7 @@ export function validateMerge(mainRepoPath, worktreePath, worktreeBranch) {
|
|
|
151
152
|
}
|
|
152
153
|
// Check if worktree has uncommitted changes
|
|
153
154
|
const worktreeStatus = getGitStatus(worktreePath);
|
|
155
|
+
LogService.getInstance().info(`Worktree status: hasChanges=${worktreeStatus.hasChanges}, files=${JSON.stringify(worktreeStatus.files)}`, 'mergeValidation');
|
|
154
156
|
if (worktreeStatus.hasChanges) {
|
|
155
157
|
issues.push({
|
|
156
158
|
type: 'worktree_uncommitted',
|
|
@@ -161,7 +163,9 @@ export function validateMerge(mainRepoPath, worktreePath, worktreeBranch) {
|
|
|
161
163
|
}
|
|
162
164
|
// Check if there's anything to merge (commits OR uncommitted changes)
|
|
163
165
|
const hasCommits = hasCommitsToMerge(mainRepoPath, worktreeBranch, mainBranch);
|
|
166
|
+
LogService.getInstance().info(`Merge check: hasCommits=${hasCommits}, worktreeHasChanges=${worktreeStatus.hasChanges}`, 'mergeValidation');
|
|
164
167
|
if (!hasCommits && !worktreeStatus.hasChanges) {
|
|
168
|
+
LogService.getInstance().info('Adding nothing_to_merge issue', 'mergeValidation');
|
|
165
169
|
issues.push({
|
|
166
170
|
type: 'nothing_to_merge',
|
|
167
171
|
message: 'No new commits to merge',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mergeValidation.js","sourceRoot":"","sources":["../../src/utils/mergeValidation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,gBAAgB,IAAI,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAsBpE;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,QAAQ,CAAC,wBAAwB,EAAE;YACtD,GAAG,EAAE,QAAQ;YACb,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,MAAM;SACd,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,YAAY;aACvB,IAAI,EAAE;aACN,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;aAC3B,GAAG,CAAC,IAAI,CAAC,EAAE;YACV,wCAAwC;YACxC,8DAA8D;YAC9D,6DAA6D;YAC7D,2FAA2F;YAC3F,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YACjC,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACxC,MAAM,QAAQ,GAAG,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YAClF,UAAU,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,gBAAgB,IAAI,QAAQ,QAAQ,GAAG,EAAE,iBAAiB,CAAC,CAAC;YAC1F,OAAO,QAAQ,CAAC;QAClB,CAAC,CAAC,CAAC;QAEL,UAAU,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"mergeValidation.js","sourceRoot":"","sources":["../../src/utils/mergeValidation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paneCreation.d.ts","sourceRoot":"","sources":["../../src/utils/paneCreation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAc,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"paneCreation.d.ts","sourceRoot":"","sources":["../../src/utils/paneCreation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAc,MAAM,aAAa,CAAC;AAexD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,QAAQ,EAAE,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,QAAQ,CAAC;IACf,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,iBAAiB,EAC1B,eAAe,EAAE,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC,GAC5C,OAAO,CAAC,gBAAgB,CAAC,CAoZ3B"}
|
|
@@ -8,6 +8,7 @@ import { generateSlug } from './slug.js';
|
|
|
8
8
|
import { capturePaneContent } from './paneCapture.js';
|
|
9
9
|
import { triggerHook } from './hooks.js';
|
|
10
10
|
import { TMUX_LAYOUT_APPLY_DELAY, TMUX_SPLIT_DELAY } from '../constants/timing.js';
|
|
11
|
+
import { atomicWriteJsonSync } from './atomicWrite.js';
|
|
11
12
|
/**
|
|
12
13
|
* Core pane creation logic that can be used by both TUI and API
|
|
13
14
|
* Returns the newly created pane and whether agent choice is needed
|
|
@@ -96,7 +97,7 @@ export async function createPane(options, availableAgents) {
|
|
|
96
97
|
config.controlPaneId = controlPaneId;
|
|
97
98
|
config.controlPaneSize = SIDEBAR_WIDTH;
|
|
98
99
|
config.lastUpdated = new Date().toISOString();
|
|
99
|
-
|
|
100
|
+
atomicWriteJsonSync(configPath, config);
|
|
100
101
|
}
|
|
101
102
|
// Else: Pane exists, we can use it
|
|
102
103
|
}
|
|
@@ -106,7 +107,7 @@ export async function createPane(options, availableAgents) {
|
|
|
106
107
|
config.controlPaneId = controlPaneId;
|
|
107
108
|
config.controlPaneSize = SIDEBAR_WIDTH;
|
|
108
109
|
config.lastUpdated = new Date().toISOString();
|
|
109
|
-
|
|
110
|
+
atomicWriteJsonSync(configPath, config);
|
|
110
111
|
}
|
|
111
112
|
}
|
|
112
113
|
catch (error) {
|
|
@@ -157,7 +158,7 @@ export async function createPane(options, availableAgents) {
|
|
|
157
158
|
const config = JSON.parse(configContent);
|
|
158
159
|
config.controlPaneId = currentPaneId;
|
|
159
160
|
config.lastUpdated = new Date().toISOString();
|
|
160
|
-
|
|
161
|
+
atomicWriteJsonSync(configPath, config);
|
|
161
162
|
controlPaneId = currentPaneId; // Update local variable
|
|
162
163
|
}
|
|
163
164
|
catch (configError) {
|
|
@@ -341,7 +342,7 @@ export async function createPane(options, availableAgents) {
|
|
|
341
342
|
// Add the new pane to the config (panesCount becomes 1)
|
|
342
343
|
config.panes = [...existingPanes, newPane];
|
|
343
344
|
config.lastUpdated = new Date().toISOString();
|
|
344
|
-
|
|
345
|
+
atomicWriteJsonSync(configPath, config);
|
|
345
346
|
// NOW destroy the welcome pane (event-based destruction)
|
|
346
347
|
const { destroyWelcomePaneCoordinated } = await import('./welcomePaneManager.js');
|
|
347
348
|
destroyWelcomePaneCoordinated(projectRoot);
|