dmux 5.2.0 → 5.4.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/README.md +9 -5
- package/dist/DmuxApp.d.ts.map +1 -1
- package/dist/DmuxApp.js +100 -56
- package/dist/DmuxApp.js.map +1 -1
- package/dist/actions/implementations/closeAction.d.ts.map +1 -1
- package/dist/actions/implementations/closeAction.js +84 -13
- package/dist/actions/implementations/closeAction.js.map +1 -1
- package/dist/actions/implementations/index.d.ts +1 -0
- package/dist/actions/implementations/index.d.ts.map +1 -1
- package/dist/actions/implementations/index.js +3 -0
- package/dist/actions/implementations/index.js.map +1 -1
- package/dist/actions/implementations/mergeAction.d.ts.map +1 -1
- package/dist/actions/implementations/mergeAction.js +59 -19
- package/dist/actions/implementations/mergeAction.js.map +1 -1
- package/dist/actions/index.d.ts.map +1 -1
- package/dist/actions/index.js +18 -0
- package/dist/actions/index.js.map +1 -1
- package/dist/actions/merge/conflictResolution.d.ts.map +1 -1
- package/dist/actions/merge/conflictResolution.js +17 -12
- package/dist/actions/merge/conflictResolution.js.map +1 -1
- package/dist/actions/merge/issueHandlers/mainDirtyHandler.d.ts.map +1 -1
- package/dist/actions/merge/issueHandlers/mainDirtyHandler.js +8 -6
- package/dist/actions/merge/issueHandlers/mainDirtyHandler.js.map +1 -1
- package/dist/actions/merge/issueHandlers/worktreeUncommittedHandler.d.ts +1 -1
- package/dist/actions/merge/issueHandlers/worktreeUncommittedHandler.d.ts.map +1 -1
- package/dist/actions/merge/issueHandlers/worktreeUncommittedHandler.js +9 -2
- package/dist/actions/merge/issueHandlers/worktreeUncommittedHandler.js.map +1 -1
- package/dist/actions/merge/multiMergeOrchestrator.d.ts.map +1 -1
- package/dist/actions/merge/multiMergeOrchestrator.js +33 -14
- package/dist/actions/merge/multiMergeOrchestrator.js.map +1 -1
- package/dist/actions/types.d.ts +5 -2
- package/dist/actions/types.d.ts.map +1 -1
- package/dist/actions/types.js +28 -1
- package/dist/actions/types.js.map +1 -1
- package/dist/components/dialogs/AgentChoiceDialog.d.ts +2 -1
- package/dist/components/dialogs/AgentChoiceDialog.d.ts.map +1 -1
- package/dist/components/dialogs/AgentChoiceDialog.js +4 -5
- package/dist/components/dialogs/AgentChoiceDialog.js.map +1 -1
- package/dist/components/panes/PaneCard.d.ts +1 -3
- package/dist/components/panes/PaneCard.d.ts.map +1 -1
- package/dist/components/panes/PaneCard.js +54 -37
- package/dist/components/panes/PaneCard.js.map +1 -1
- package/dist/components/panes/PanesGrid.d.ts +1 -0
- package/dist/components/panes/PanesGrid.d.ts.map +1 -1
- package/dist/components/panes/PanesGrid.js +60 -78
- package/dist/components/panes/PanesGrid.js.map +1 -1
- package/dist/components/popups/agentChoicePopup.d.ts +2 -2
- package/dist/components/popups/agentChoicePopup.js +90 -56
- package/dist/components/popups/agentChoicePopup.js.map +1 -1
- package/dist/components/popups/agentChoiceSelection.d.ts +8 -0
- package/dist/components/popups/agentChoiceSelection.d.ts.map +1 -0
- package/dist/components/popups/agentChoiceSelection.js +14 -0
- package/dist/components/popups/agentChoiceSelection.js.map +1 -0
- package/dist/components/popups/diffPeekPopup.d.ts +7 -0
- package/dist/components/popups/diffPeekPopup.d.ts.map +1 -0
- package/dist/components/popups/diffPeekPopup.js +99 -0
- package/dist/components/popups/diffPeekPopup.js.map +1 -0
- package/dist/components/popups/enabledAgentsPopup.d.ts +7 -0
- package/dist/components/popups/enabledAgentsPopup.d.ts.map +1 -0
- package/dist/components/popups/enabledAgentsPopup.js +196 -0
- package/dist/components/popups/enabledAgentsPopup.js.map +1 -0
- package/dist/components/popups/kebabMenuPopup.js +2 -2
- package/dist/components/popups/kebabMenuPopup.js.map +1 -1
- package/dist/components/popups/mergeUncommittedChoicePopup.d.ts +7 -0
- package/dist/components/popups/mergeUncommittedChoicePopup.d.ts.map +1 -0
- package/dist/components/popups/mergeUncommittedChoicePopup.js +289 -0
- package/dist/components/popups/mergeUncommittedChoicePopup.js.map +1 -0
- package/dist/components/popups/newPanePopup.js +8 -0
- package/dist/components/popups/newPanePopup.js.map +1 -1
- package/dist/components/popups/reopenWorktreePopup.js +33 -3
- package/dist/components/popups/reopenWorktreePopup.js.map +1 -1
- package/dist/components/popups/settingsPopup.js +346 -25
- package/dist/components/popups/settingsPopup.js.map +1 -1
- package/dist/components/popups/shortcutsPopup.js +17 -13
- package/dist/components/popups/shortcutsPopup.js.map +1 -1
- package/dist/components/popups/singleAgentChoicePopup.d.ts +7 -0
- package/dist/components/popups/singleAgentChoicePopup.d.ts.map +1 -0
- package/dist/components/popups/singleAgentChoicePopup.js +95 -0
- package/dist/components/popups/singleAgentChoicePopup.js.map +1 -0
- package/dist/components/ui/FooterHelp.js +1 -1
- package/dist/components/ui/FooterHelp.js.map +1 -1
- package/dist/constants/layout.d.ts +9 -0
- package/dist/constants/layout.d.ts.map +1 -0
- package/dist/constants/layout.js +9 -0
- package/dist/constants/layout.js.map +1 -0
- package/dist/hooks/useActionSystem.d.ts +1 -1
- package/dist/hooks/useActionSystem.d.ts.map +1 -1
- package/dist/hooks/useActionSystem.js +1 -1
- package/dist/hooks/useActionSystem.js.map +1 -1
- package/dist/hooks/useAgentDetection.d.ts +2 -2
- package/dist/hooks/useAgentDetection.d.ts.map +1 -1
- package/dist/hooks/useAgentDetection.js +18 -88
- package/dist/hooks/useAgentDetection.js.map +1 -1
- package/dist/hooks/useAutoUpdater.d.ts.map +1 -1
- package/dist/hooks/useAutoUpdater.js +2 -4
- package/dist/hooks/useAutoUpdater.js.map +1 -1
- package/dist/hooks/useInputHandling.d.ts +5 -0
- package/dist/hooks/useInputHandling.d.ts.map +1 -1
- package/dist/hooks/useInputHandling.js +230 -22
- package/dist/hooks/useInputHandling.js.map +1 -1
- package/dist/hooks/useNavigation.d.ts +1 -1
- package/dist/hooks/useNavigation.d.ts.map +1 -1
- package/dist/hooks/useNavigation.js +26 -4
- package/dist/hooks/useNavigation.js.map +1 -1
- package/dist/hooks/usePaneCreation.d.ts +5 -2
- package/dist/hooks/usePaneCreation.d.ts.map +1 -1
- package/dist/hooks/usePaneCreation.js +123 -23
- package/dist/hooks/usePaneCreation.js.map +1 -1
- package/dist/hooks/usePaneSync.d.ts +1 -1
- package/dist/hooks/usePaneSync.d.ts.map +1 -1
- package/dist/hooks/usePaneSync.js +14 -1
- package/dist/hooks/usePaneSync.js.map +1 -1
- package/dist/hooks/usePanes.d.ts.map +1 -1
- package/dist/hooks/usePanes.js +19 -5
- package/dist/hooks/usePanes.js.map +1 -1
- package/dist/hooks/useServices.d.ts +2 -1
- package/dist/hooks/useServices.d.ts.map +1 -1
- package/dist/hooks/useServices.js +4 -2
- package/dist/hooks/useServices.js.map +1 -1
- package/dist/index.js +200 -21
- package/dist/index.js.map +1 -1
- package/dist/layout/LayoutCalculator.d.ts.map +1 -1
- package/dist/layout/LayoutCalculator.js +4 -1
- package/dist/layout/LayoutCalculator.js.map +1 -1
- package/dist/layout/SpacerManager.d.ts.map +1 -1
- package/dist/layout/SpacerManager.js +2 -1
- package/dist/layout/SpacerManager.js.map +1 -1
- package/dist/services/PaneEventService.d.ts.map +1 -1
- package/dist/services/PaneEventService.js +2 -5
- package/dist/services/PaneEventService.js.map +1 -1
- package/dist/services/PaneWorkerManager.d.ts.map +1 -1
- package/dist/services/PaneWorkerManager.js +2 -14
- package/dist/services/PaneWorkerManager.js.map +1 -1
- package/dist/services/PopupManager.d.ts +14 -2
- package/dist/services/PopupManager.d.ts.map +1 -1
- package/dist/services/PopupManager.js +162 -24
- package/dist/services/PopupManager.js.map +1 -1
- package/dist/services/TmuxHookManager.d.ts.map +1 -1
- package/dist/services/TmuxHookManager.js +4 -2
- package/dist/services/TmuxHookManager.js.map +1 -1
- package/dist/services/TmuxService.d.ts +9 -0
- package/dist/services/TmuxService.d.ts.map +1 -1
- package/dist/services/TmuxService.js +18 -2
- package/dist/services/TmuxService.js.map +1 -1
- package/dist/types.d.ts +11 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/agentDetection.d.ts +15 -8
- package/dist/utils/agentDetection.d.ts.map +1 -1
- package/dist/utils/agentDetection.js +49 -73
- package/dist/utils/agentDetection.js.map +1 -1
- package/dist/utils/agentLaunch.d.ts +60 -2
- package/dist/utils/agentLaunch.d.ts.map +1 -1
- package/dist/utils/agentLaunch.js +490 -41
- package/dist/utils/agentLaunch.js.map +1 -1
- package/dist/utils/agentPromptDispatch.d.ts +33 -0
- package/dist/utils/agentPromptDispatch.d.ts.map +1 -0
- package/dist/utils/agentPromptDispatch.js +99 -0
- package/dist/utils/agentPromptDispatch.js.map +1 -0
- package/dist/utils/asciiArt.d.ts.map +1 -1
- package/dist/utils/asciiArt.js +6 -7
- package/dist/utils/asciiArt.js.map +1 -1
- package/dist/utils/attachAgent.d.ts +25 -0
- package/dist/utils/attachAgent.d.ts.map +1 -0
- package/dist/utils/attachAgent.js +139 -0
- package/dist/utils/attachAgent.js.map +1 -0
- package/dist/utils/conflictResolutionPane.d.ts +2 -1
- package/dist/utils/conflictResolutionPane.d.ts.map +1 -1
- package/dist/utils/conflictResolutionPane.js +48 -53
- package/dist/utils/conflictResolutionPane.js.map +1 -1
- package/dist/utils/controlPaneRecovery.d.ts +2 -0
- package/dist/utils/controlPaneRecovery.d.ts.map +1 -0
- package/dist/utils/controlPaneRecovery.js +156 -0
- package/dist/utils/controlPaneRecovery.js.map +1 -0
- package/dist/utils/devSource.d.ts +7 -0
- package/dist/utils/devSource.d.ts.map +1 -0
- package/dist/utils/devSource.js +19 -0
- package/dist/utils/devSource.js.map +1 -0
- package/dist/utils/devWatchCommand.d.ts +8 -0
- package/dist/utils/devWatchCommand.d.ts.map +1 -0
- package/dist/utils/devWatchCommand.js +14 -0
- package/dist/utils/devWatchCommand.js.map +1 -0
- package/dist/utils/geminiTrust.d.ts +8 -0
- package/dist/utils/geminiTrust.d.ts.map +1 -0
- package/dist/utils/geminiTrust.js +67 -0
- package/dist/utils/geminiTrust.js.map +1 -0
- package/dist/utils/generated-agents-doc.d.ts +1 -1
- package/dist/utils/generated-agents-doc.js +3 -3
- package/dist/utils/hooksDocs.d.ts +2 -9
- package/dist/utils/hooksDocs.d.ts.map +1 -1
- package/dist/utils/hooksDocs.js +26 -6
- package/dist/utils/hooksDocs.js.map +1 -1
- package/dist/utils/layoutManager.d.ts +5 -1
- package/dist/utils/layoutManager.d.ts.map +1 -1
- package/dist/utils/layoutManager.js +103 -26
- package/dist/utils/layoutManager.js.map +1 -1
- package/dist/utils/paneCreation.d.ts +8 -2
- package/dist/utils/paneCreation.d.ts.map +1 -1
- package/dist/utils/paneCreation.js +82 -105
- package/dist/utils/paneCreation.js.map +1 -1
- package/dist/utils/paneGrouping.d.ts.map +1 -1
- package/dist/utils/paneGrouping.js +30 -0
- package/dist/utils/paneGrouping.js.map +1 -1
- package/dist/utils/projectActions.d.ts +5 -0
- package/dist/utils/projectActions.d.ts.map +1 -1
- package/dist/utils/projectActions.js +15 -4
- package/dist/utils/projectActions.js.map +1 -1
- package/dist/utils/reopenWorktree.d.ts +1 -1
- package/dist/utils/reopenWorktree.d.ts.map +1 -1
- package/dist/utils/reopenWorktree.js +23 -31
- package/dist/utils/reopenWorktree.js.map +1 -1
- package/dist/utils/runtimePaths.d.ts +2 -0
- package/dist/utils/runtimePaths.d.ts.map +1 -0
- package/dist/utils/runtimePaths.js +8 -0
- package/dist/utils/runtimePaths.js.map +1 -0
- package/dist/utils/settingsManager.d.ts +3 -0
- package/dist/utils/settingsManager.d.ts.map +1 -1
- package/dist/utils/settingsManager.js +200 -9
- package/dist/utils/settingsManager.js.map +1 -1
- package/dist/utils/systemCheck.d.ts.map +1 -1
- package/dist/utils/systemCheck.js +0 -13
- package/dist/utils/systemCheck.js.map +1 -1
- package/dist/utils/tmux.d.ts +5 -1
- package/dist/utils/tmux.d.ts.map +1 -1
- package/dist/utils/tmux.js +23 -5
- package/dist/utils/tmux.js.map +1 -1
- package/dist/utils/tmuxHookCommands.d.ts +14 -0
- package/dist/utils/tmuxHookCommands.d.ts.map +1 -0
- package/dist/utils/tmuxHookCommands.js +30 -0
- package/dist/utils/tmuxHookCommands.js.map +1 -0
- package/dist/utils/welcomePane.d.ts +2 -1
- package/dist/utils/welcomePane.d.ts.map +1 -1
- package/dist/utils/welcomePane.js +3 -2
- package/dist/utils/welcomePane.js.map +1 -1
- package/dist/utils/welcomePaneManager.js +1 -1
- package/dist/utils/welcomePaneManager.js.map +1 -1
- package/dist/workers/PaneWorker.js.map +1 -1
- package/dist/workers/WorkerMessages.d.ts +2 -1
- package/dist/workers/WorkerMessages.d.ts.map +1 -1
- package/dist/workers/WorkerMessages.js.map +1 -1
- package/package.json +11 -6
|
@@ -2,14 +2,17 @@ import { getWindowDimensions } from './tmux.js';
|
|
|
2
2
|
import { TmuxService } from '../services/TmuxService.js';
|
|
3
3
|
import { LogService } from '../services/LogService.js';
|
|
4
4
|
import { TMUX_PANE_CREATION_DELAY } from '../constants/timing.js';
|
|
5
|
+
import { DEFAULT_MIN_PANE_WIDTH, DEFAULT_MAX_PANE_WIDTH, MAX_MIN_PANE_WIDTH, MAX_MAX_PANE_WIDTH, MIN_MIN_PANE_WIDTH, MIN_MAX_PANE_WIDTH, } from '../constants/layout.js';
|
|
6
|
+
import { SettingsManager } from './settingsManager.js';
|
|
7
|
+
import { StateManager } from '../shared/StateManager.js';
|
|
5
8
|
// Import new focused classes
|
|
6
9
|
import { LayoutCalculator } from '../layout/LayoutCalculator.js';
|
|
7
10
|
import { SpacerManager } from '../layout/SpacerManager.js';
|
|
8
11
|
import { TmuxLayoutApplier } from '../layout/TmuxLayoutApplier.js';
|
|
9
12
|
export const DEFAULT_LAYOUT_CONFIG = {
|
|
10
13
|
SIDEBAR_WIDTH: 40,
|
|
11
|
-
MIN_COMFORTABLE_WIDTH:
|
|
12
|
-
MAX_COMFORTABLE_WIDTH:
|
|
14
|
+
MIN_COMFORTABLE_WIDTH: DEFAULT_MIN_PANE_WIDTH,
|
|
15
|
+
MAX_COMFORTABLE_WIDTH: DEFAULT_MAX_PANE_WIDTH,
|
|
13
16
|
MIN_COMFORTABLE_HEIGHT: 15,
|
|
14
17
|
};
|
|
15
18
|
// Export individual constants for convenience (allows direct imports)
|
|
@@ -19,6 +22,48 @@ export const MAX_COMFORTABLE_WIDTH = DEFAULT_LAYOUT_CONFIG.MAX_COMFORTABLE_WIDTH
|
|
|
19
22
|
export const MIN_COMFORTABLE_HEIGHT = DEFAULT_LAYOUT_CONFIG.MIN_COMFORTABLE_HEIGHT;
|
|
20
23
|
// Cache last layout dimensions to avoid unnecessary spacer recreation
|
|
21
24
|
let lastLayoutDimensions = null;
|
|
25
|
+
function clampMinPaneWidth(value) {
|
|
26
|
+
if (typeof value !== 'number' || !Number.isFinite(value)) {
|
|
27
|
+
return DEFAULT_MIN_PANE_WIDTH;
|
|
28
|
+
}
|
|
29
|
+
const rounded = Math.round(value);
|
|
30
|
+
return Math.max(MIN_MIN_PANE_WIDTH, Math.min(MAX_MIN_PANE_WIDTH, rounded));
|
|
31
|
+
}
|
|
32
|
+
function clampMaxPaneWidth(value) {
|
|
33
|
+
if (typeof value !== 'number' || !Number.isFinite(value)) {
|
|
34
|
+
return DEFAULT_MAX_PANE_WIDTH;
|
|
35
|
+
}
|
|
36
|
+
const rounded = Math.round(value);
|
|
37
|
+
return Math.max(MIN_MAX_PANE_WIDTH, Math.min(MAX_MAX_PANE_WIDTH, rounded));
|
|
38
|
+
}
|
|
39
|
+
function resolveLayoutConfig(config) {
|
|
40
|
+
if (config) {
|
|
41
|
+
return config;
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
const stateProjectRoot = StateManager.getInstance().getState().projectRoot;
|
|
45
|
+
const settings = new SettingsManager(stateProjectRoot || process.cwd()).getSettings();
|
|
46
|
+
const minPaneWidth = clampMinPaneWidth(settings.minPaneWidth);
|
|
47
|
+
const maxPaneWidth = clampMaxPaneWidth(settings.maxPaneWidth);
|
|
48
|
+
let normalizedMinPaneWidth = minPaneWidth;
|
|
49
|
+
let normalizedMaxPaneWidth = maxPaneWidth;
|
|
50
|
+
if (normalizedMinPaneWidth > normalizedMaxPaneWidth) {
|
|
51
|
+
normalizedMaxPaneWidth = normalizedMinPaneWidth;
|
|
52
|
+
}
|
|
53
|
+
if (normalizedMinPaneWidth === DEFAULT_LAYOUT_CONFIG.MIN_COMFORTABLE_WIDTH &&
|
|
54
|
+
normalizedMaxPaneWidth === DEFAULT_LAYOUT_CONFIG.MAX_COMFORTABLE_WIDTH) {
|
|
55
|
+
return DEFAULT_LAYOUT_CONFIG;
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
...DEFAULT_LAYOUT_CONFIG,
|
|
59
|
+
MIN_COMFORTABLE_WIDTH: normalizedMinPaneWidth,
|
|
60
|
+
MAX_COMFORTABLE_WIDTH: normalizedMaxPaneWidth,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return DEFAULT_LAYOUT_CONFIG;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
22
67
|
/**
|
|
23
68
|
* MASTER LAYOUT FUNCTION
|
|
24
69
|
* Single entry point for all layout operations
|
|
@@ -35,29 +80,37 @@ let lastLayoutDimensions = null;
|
|
|
35
80
|
* 8. Re-enforce sidebar width (after window resize)
|
|
36
81
|
* 9. Apply layout to tmux
|
|
37
82
|
*/
|
|
38
|
-
export async function recalculateAndApplyLayout(controlPaneId, contentPaneIds, terminalWidth, terminalHeight, config
|
|
83
|
+
export async function recalculateAndApplyLayout(controlPaneId, contentPaneIds, terminalWidth, terminalHeight, config, options) {
|
|
39
84
|
// Wrap entire function in try-catch to prevent crashes during resize
|
|
40
85
|
try {
|
|
86
|
+
const suppressLogs = options?.suppressLogs === true;
|
|
41
87
|
// Validate inputs to prevent crashes from bad data
|
|
42
88
|
if (!controlPaneId || typeof controlPaneId !== 'string') {
|
|
43
|
-
|
|
89
|
+
if (!suppressLogs) {
|
|
90
|
+
LogService.getInstance().warn('Invalid controlPaneId, skipping layout', 'Layout');
|
|
91
|
+
}
|
|
44
92
|
return;
|
|
45
93
|
}
|
|
46
94
|
if (terminalWidth <= 0 || terminalHeight <= 0) {
|
|
47
|
-
|
|
95
|
+
if (!suppressLogs) {
|
|
96
|
+
LogService.getInstance().warn(`Invalid terminal dimensions: ${terminalWidth}x${terminalHeight}, skipping layout`, 'Layout');
|
|
97
|
+
}
|
|
48
98
|
return;
|
|
49
99
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
const
|
|
53
|
-
const
|
|
100
|
+
const effectiveConfig = resolveLayoutConfig(config);
|
|
101
|
+
// Create class instances with resolved config
|
|
102
|
+
const calculator = new LayoutCalculator(effectiveConfig);
|
|
103
|
+
const spacerManager = new SpacerManager(effectiveConfig);
|
|
104
|
+
const layoutApplier = new TmuxLayoutApplier(effectiveConfig);
|
|
54
105
|
// Step 1: Filter out any existing spacer from content panes
|
|
55
106
|
let existingSpacerId = null;
|
|
56
107
|
try {
|
|
57
108
|
existingSpacerId = spacerManager.findSpacerPane();
|
|
58
109
|
}
|
|
59
110
|
catch (error) {
|
|
60
|
-
|
|
111
|
+
if (!suppressLogs) {
|
|
112
|
+
LogService.getInstance().debug(`Failed to find spacer pane: ${error}`, 'Layout');
|
|
113
|
+
}
|
|
61
114
|
}
|
|
62
115
|
// CRITICAL FIX: Validate that content panes actually exist in tmux before proceeding
|
|
63
116
|
// This prevents crashes when panes have been killed but we still have stale IDs
|
|
@@ -69,7 +122,9 @@ export async function recalculateAndApplyLayout(controlPaneId, contentPaneIds, t
|
|
|
69
122
|
if (id === existingSpacerId)
|
|
70
123
|
return false; // Filter out spacer
|
|
71
124
|
if (!allTmuxPaneIds.includes(id)) {
|
|
72
|
-
|
|
125
|
+
if (!suppressLogs) {
|
|
126
|
+
LogService.getInstance().debug(`Skipping stale pane ID ${id} (no longer exists in tmux)`, 'Layout');
|
|
127
|
+
}
|
|
73
128
|
return false;
|
|
74
129
|
}
|
|
75
130
|
return true;
|
|
@@ -77,33 +132,45 @@ export async function recalculateAndApplyLayout(controlPaneId, contentPaneIds, t
|
|
|
77
132
|
}
|
|
78
133
|
catch (error) {
|
|
79
134
|
// If we can't get tmux pane list, use the provided IDs but filter spacer
|
|
80
|
-
|
|
135
|
+
if (!suppressLogs) {
|
|
136
|
+
LogService.getInstance().debug(`Failed to validate pane IDs: ${error}`, 'Layout');
|
|
137
|
+
}
|
|
81
138
|
validContentPaneIds = contentPaneIds.filter(id => id !== existingSpacerId);
|
|
82
139
|
}
|
|
83
140
|
const realContentPanes = validContentPaneIds;
|
|
84
|
-
|
|
141
|
+
const forceLayout = options?.force === true;
|
|
142
|
+
const disableSpacer = options?.disableSpacer === true;
|
|
143
|
+
// Check if dimensions and pane count have changed since last layout.
|
|
85
144
|
const dimensionsUnchanged = lastLayoutDimensions &&
|
|
86
145
|
lastLayoutDimensions.width === terminalWidth &&
|
|
87
146
|
lastLayoutDimensions.height === terminalHeight &&
|
|
88
|
-
lastLayoutDimensions.paneCount === realContentPanes.length
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
//
|
|
147
|
+
lastLayoutDimensions.paneCount === realContentPanes.length &&
|
|
148
|
+
lastLayoutDimensions.minPaneWidth === effectiveConfig.MIN_COMFORTABLE_WIDTH &&
|
|
149
|
+
lastLayoutDimensions.maxPaneWidth === effectiveConfig.MAX_COMFORTABLE_WIDTH;
|
|
150
|
+
if (dimensionsUnchanged && !forceLayout) {
|
|
151
|
+
// Layout unchanged - skip ALL layout operations to prevent Ink redraw.
|
|
93
152
|
return;
|
|
94
153
|
}
|
|
95
|
-
|
|
96
|
-
|
|
154
|
+
if (!suppressLogs) {
|
|
155
|
+
if (forceLayout) {
|
|
156
|
+
LogService.getInstance().info(`Forcing layout apply: ${terminalWidth}x${terminalHeight}, ${realContentPanes.length} panes`, 'layout');
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
LogService.getInstance().info(`Layout dimensions changed: ${terminalWidth}x${terminalHeight}, ${realContentPanes.length} panes`, 'layout');
|
|
160
|
+
}
|
|
161
|
+
}
|
|
97
162
|
// Update last layout dimensions
|
|
98
163
|
lastLayoutDimensions = {
|
|
99
164
|
width: terminalWidth,
|
|
100
165
|
height: terminalHeight,
|
|
101
166
|
paneCount: realContentPanes.length,
|
|
167
|
+
minPaneWidth: effectiveConfig.MIN_COMFORTABLE_WIDTH,
|
|
168
|
+
maxPaneWidth: effectiveConfig.MAX_COMFORTABLE_WIDTH,
|
|
102
169
|
};
|
|
103
170
|
// Step 2: Calculate layout for real content panes only
|
|
104
171
|
const layout = calculator.calculateOptimalLayout(realContentPanes.length, terminalWidth, terminalHeight);
|
|
105
172
|
// Step 3: Determine if we need a spacer pane
|
|
106
|
-
const needsSpacer = spacerManager.needsSpacerPane(realContentPanes.length, layout);
|
|
173
|
+
const needsSpacer = !disableSpacer && spacerManager.needsSpacerPane(realContentPanes.length, layout);
|
|
107
174
|
// Step 4: Manage spacer pane creation/destruction
|
|
108
175
|
// ALWAYS destroy existing spacer on layout recalc to ensure fresh positioning
|
|
109
176
|
let spacerId = null;
|
|
@@ -149,7 +216,9 @@ export async function recalculateAndApplyLayout(controlPaneId, contentPaneIds, t
|
|
|
149
216
|
}
|
|
150
217
|
}
|
|
151
218
|
if (!paneVerified) {
|
|
152
|
-
|
|
219
|
+
if (!suppressLogs) {
|
|
220
|
+
LogService.getInstance().warn(`Spacer pane ${spacerId} not verified, continuing anyway`, 'Layout');
|
|
221
|
+
}
|
|
153
222
|
// Don't throw - continue and let it fail with better logs
|
|
154
223
|
}
|
|
155
224
|
}
|
|
@@ -300,25 +369,33 @@ export async function recalculateAndApplyLayout(controlPaneId, contentPaneIds, t
|
|
|
300
369
|
const currentPaneIds = tmuxService.getAllPaneIdsSync();
|
|
301
370
|
const validFinalPanes = finalContentPanes.filter(id => {
|
|
302
371
|
if (!currentPaneIds.includes(id)) {
|
|
303
|
-
|
|
372
|
+
if (!suppressLogs) {
|
|
373
|
+
LogService.getInstance().debug(`Pane ${id} disappeared before layout application`, 'Layout');
|
|
374
|
+
}
|
|
304
375
|
return false;
|
|
305
376
|
}
|
|
306
377
|
return true;
|
|
307
378
|
});
|
|
308
379
|
// Only proceed if we still have the same panes (or if spacer was the only one removed)
|
|
309
380
|
if (validFinalPanes.length < finalContentPanes.length - (spacerId ? 1 : 0)) {
|
|
310
|
-
|
|
381
|
+
if (!suppressLogs) {
|
|
382
|
+
LogService.getInstance().warn(`Panes changed during layout calculation (${finalContentPanes.length} → ${validFinalPanes.length}), skipping layout apply`, 'Layout');
|
|
383
|
+
}
|
|
311
384
|
return;
|
|
312
385
|
}
|
|
313
386
|
// Also verify control pane still exists
|
|
314
387
|
if (!currentPaneIds.includes(actualControlPaneId)) {
|
|
315
|
-
|
|
388
|
+
if (!suppressLogs) {
|
|
389
|
+
LogService.getInstance().warn(`Control pane ${actualControlPaneId} no longer exists, skipping layout apply`, 'Layout');
|
|
390
|
+
}
|
|
316
391
|
return;
|
|
317
392
|
}
|
|
318
393
|
layoutApplier.applyPaneLayout(actualControlPaneId, validFinalPanes, finalLayout, terminalHeight);
|
|
319
394
|
}
|
|
320
395
|
catch (validationError) {
|
|
321
|
-
|
|
396
|
+
if (!suppressLogs) {
|
|
397
|
+
LogService.getInstance().debug(`Final validation failed: ${validationError}, attempting layout anyway`, 'Layout');
|
|
398
|
+
}
|
|
322
399
|
layoutApplier.applyPaneLayout(actualControlPaneId, finalContentPanes, finalLayout, terminalHeight);
|
|
323
400
|
}
|
|
324
401
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layoutManager.js","sourceRoot":"","sources":["../../src/utils/layoutManager.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"layoutManager.js","sourceRoot":"","sources":["../../src/utils/layoutManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import type { DmuxPane } from '../types.js';
|
|
2
|
+
import { type AgentName } from './agentLaunch.js';
|
|
2
3
|
export interface CreatePaneOptions {
|
|
3
4
|
prompt: string;
|
|
4
|
-
agent?:
|
|
5
|
+
agent?: AgentName;
|
|
5
6
|
slugSuffix?: string;
|
|
6
7
|
slugBase?: string;
|
|
7
8
|
projectName: string;
|
|
8
9
|
existingPanes: DmuxPane[];
|
|
9
10
|
projectRoot?: string;
|
|
11
|
+
skipAgentSelection?: boolean;
|
|
10
12
|
sessionConfigPath?: string;
|
|
11
13
|
sessionProjectRoot?: string;
|
|
12
14
|
}
|
|
@@ -18,5 +20,9 @@ export interface CreatePaneResult {
|
|
|
18
20
|
* Core pane creation logic that can be used by both TUI and API
|
|
19
21
|
* Returns the newly created pane and whether agent choice is needed
|
|
20
22
|
*/
|
|
21
|
-
export declare function createPane(options: CreatePaneOptions, availableAgents:
|
|
23
|
+
export declare function createPane(options: CreatePaneOptions, availableAgents: AgentName[]): Promise<CreatePaneResult>;
|
|
24
|
+
/**
|
|
25
|
+
* Auto-approve Claude trust prompts
|
|
26
|
+
*/
|
|
27
|
+
export declare function autoApproveTrustPrompt(paneInfo: string, prompt: string): Promise<void>;
|
|
22
28
|
//# sourceMappingURL=paneCreation.d.ts.map
|
|
@@ -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;AAcxD,OAAO,EAUL,KAAK,SAAS,EACf,MAAM,kBAAkB,CAAC;AAU1B,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,QAAQ,EAAE,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,QAAQ,CAAC;IACf,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAgBD;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,iBAAiB,EAC1B,eAAe,EAAE,SAAS,EAAE,GAC3B,OAAO,CAAC,gBAAgB,CAAC,CAye3B;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAsHf"}
|
|
@@ -10,10 +10,12 @@ import { triggerHook, initializeHooksDirectory } from './hooks.js';
|
|
|
10
10
|
import { TMUX_LAYOUT_APPLY_DELAY, TMUX_SPLIT_DELAY } from '../constants/timing.js';
|
|
11
11
|
import { atomicWriteJsonSync } from './atomicWrite.js';
|
|
12
12
|
import { LogService } from '../services/LogService.js';
|
|
13
|
-
import { appendSlugSuffix,
|
|
13
|
+
import { appendSlugSuffix, buildAgentCommand, buildInitialPromptCommand, getAgentProcessName, getPromptTransport, getSendKeysPostPasteDelayMs, getSendKeysPrePrompt, getSendKeysReadyDelayMs, getSendKeysSubmit, } from './agentLaunch.js';
|
|
14
14
|
import { buildWorktreePaneTitle } from './paneTitle.js';
|
|
15
15
|
import { buildPromptReadAndDeleteSnippet, writePromptFile, } from './promptStore.js';
|
|
16
|
+
import { ensureGeminiFolderTrusted } from './geminiTrust.js';
|
|
16
17
|
import { isValidBranchName } from './git.js';
|
|
18
|
+
import { sendPromptViaTmux } from './agentPromptDispatch.js';
|
|
17
19
|
async function waitForPaneReady(tmuxService, paneId, timeoutMs = 600) {
|
|
18
20
|
const start = Date.now();
|
|
19
21
|
while ((Date.now() - start) < timeoutMs) {
|
|
@@ -28,7 +30,7 @@ async function waitForPaneReady(tmuxService, paneId, timeoutMs = 600) {
|
|
|
28
30
|
* Returns the newly created pane and whether agent choice is needed
|
|
29
31
|
*/
|
|
30
32
|
export async function createPane(options, availableAgents) {
|
|
31
|
-
const { prompt, projectName, existingPanes, slugSuffix, slugBase, sessionConfigPath: optionsSessionConfigPath, sessionProjectRoot: optionsSessionProjectRoot, } = options;
|
|
33
|
+
const { prompt, projectName, existingPanes, slugSuffix, slugBase, skipAgentSelection = false, sessionConfigPath: optionsSessionConfigPath, sessionProjectRoot: optionsSessionProjectRoot, } = options;
|
|
32
34
|
let { agent, projectRoot: optionsProjectRoot } = options;
|
|
33
35
|
// Load settings to check for default agent and autopilot
|
|
34
36
|
const { SettingsManager } = await import('./settingsManager.js');
|
|
@@ -68,15 +70,15 @@ export async function createPane(options, availableAgents) {
|
|
|
68
70
|
const sessionProjectRoot = optionsSessionProjectRoot
|
|
69
71
|
|| (optionsSessionConfigPath ? path.dirname(path.dirname(optionsSessionConfigPath)) : projectRoot);
|
|
70
72
|
const paneProjectName = path.basename(projectRoot);
|
|
71
|
-
// If no agent specified, check settings for default agent
|
|
72
|
-
if (!agent && settings.defaultAgent) {
|
|
73
|
+
// If no agent specified, check settings for default agent unless caller explicitly disabled auto-selection.
|
|
74
|
+
if (!agent && !skipAgentSelection && settings.defaultAgent) {
|
|
73
75
|
// Only use default if it's available
|
|
74
76
|
if (availableAgents.includes(settings.defaultAgent)) {
|
|
75
77
|
agent = settings.defaultAgent;
|
|
76
78
|
}
|
|
77
79
|
}
|
|
78
80
|
// Determine if we need agent choice
|
|
79
|
-
if (!agent && availableAgents.length > 1) {
|
|
81
|
+
if (!agent && !skipAgentSelection && availableAgents.length > 1) {
|
|
80
82
|
// Need to ask which agent to use
|
|
81
83
|
return {
|
|
82
84
|
pane: null,
|
|
@@ -84,7 +86,7 @@ export async function createPane(options, availableAgents) {
|
|
|
84
86
|
};
|
|
85
87
|
}
|
|
86
88
|
// Auto-select agent if only one is available or if not specified
|
|
87
|
-
if (!agent && availableAgents.length === 1) {
|
|
89
|
+
if (!agent && !skipAgentSelection && availableAgents.length === 1) {
|
|
88
90
|
agent = availableAgents[0];
|
|
89
91
|
}
|
|
90
92
|
// Trigger before_pane_create hook
|
|
@@ -245,18 +247,6 @@ export async function createPane(options, availableAgents) {
|
|
|
245
247
|
catch {
|
|
246
248
|
// Ignore prune errors, proceed anyway
|
|
247
249
|
}
|
|
248
|
-
// Check if branch already exists (from a deleted worktree)
|
|
249
|
-
let branchExists = false;
|
|
250
|
-
try {
|
|
251
|
-
execSync(`git show-ref --verify --quiet "refs/heads/${branchName}"`, {
|
|
252
|
-
stdio: 'pipe',
|
|
253
|
-
cwd: projectRoot,
|
|
254
|
-
});
|
|
255
|
-
branchExists = true;
|
|
256
|
-
}
|
|
257
|
-
catch {
|
|
258
|
-
// Branch doesn't exist, which is good
|
|
259
|
-
}
|
|
260
250
|
// Validate and resolve base branch for new worktrees
|
|
261
251
|
const baseBranch = settings.baseBranch || '';
|
|
262
252
|
if (baseBranch && !isValidBranchName(baseBranch)) {
|
|
@@ -273,28 +263,46 @@ export async function createPane(options, availableAgents) {
|
|
|
273
263
|
throw new Error(`Base branch "${baseBranch}" does not exist. Update the baseBranch setting to a valid branch name.`);
|
|
274
264
|
}
|
|
275
265
|
}
|
|
276
|
-
|
|
277
|
-
// - If branch exists, use it (don't create with -b)
|
|
278
|
-
// - If branch doesn't exist, create it with -b, optionally from a configured base branch
|
|
279
|
-
// - DON'T silence errors (we want to see them in the pane for debugging)
|
|
280
|
-
const startPoint = baseBranch ? ` "${baseBranch}"` : '';
|
|
281
|
-
const worktreeAddCmd = branchExists
|
|
282
|
-
? `git worktree add "${worktreePath}" "${branchName}"`
|
|
283
|
-
: `git worktree add "${worktreePath}" -b "${branchName}"${startPoint}`;
|
|
284
|
-
const worktreeCmd = `cd "${projectRoot}" && ${worktreeAddCmd} && cd "${worktreePath}"`;
|
|
285
|
-
// Send the git worktree command (auto-quoted by sendShellCommand)
|
|
286
|
-
await tmuxService.sendShellCommand(paneInfo, worktreeCmd);
|
|
287
|
-
await tmuxService.sendTmuxKeys(paneInfo, 'Enter');
|
|
288
|
-
// Wait for worktree to actually exist on the filesystem
|
|
266
|
+
const maxWorktreeAttempts = 3;
|
|
289
267
|
const maxWaitTime = 5000; // 5 seconds max
|
|
290
268
|
const checkInterval = 100; // Check every 100ms
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
269
|
+
let worktreeCreated = fs.existsSync(worktreePath);
|
|
270
|
+
for (let attempt = 1; attempt <= maxWorktreeAttempts && !worktreeCreated; attempt++) {
|
|
271
|
+
// Check if branch already exists (from a deleted worktree or a previous attempt)
|
|
272
|
+
let branchExists = false;
|
|
273
|
+
try {
|
|
274
|
+
execSync(`git show-ref --verify --quiet "refs/heads/${branchName}"`, {
|
|
275
|
+
stdio: 'pipe',
|
|
276
|
+
cwd: projectRoot,
|
|
277
|
+
});
|
|
278
|
+
branchExists = true;
|
|
279
|
+
}
|
|
280
|
+
catch {
|
|
281
|
+
// Branch doesn't exist yet
|
|
282
|
+
}
|
|
283
|
+
// Build worktree command:
|
|
284
|
+
// - If branch exists, use it (don't create with -b)
|
|
285
|
+
// - If branch doesn't exist, create it with -b, optionally from a configured base branch
|
|
286
|
+
const startPoint = baseBranch ? ` "${baseBranch}"` : '';
|
|
287
|
+
const worktreeAddCmd = branchExists
|
|
288
|
+
? `git worktree add "${worktreePath}" "${branchName}"`
|
|
289
|
+
: `git worktree add "${worktreePath}" -b "${branchName}"${startPoint}`;
|
|
290
|
+
const worktreeCmd = `cd "${projectRoot}" && ${worktreeAddCmd} && cd "${worktreePath}"`;
|
|
291
|
+
// Send the git worktree command (auto-quoted by sendShellCommand)
|
|
292
|
+
await tmuxService.sendShellCommand(paneInfo, worktreeCmd);
|
|
293
|
+
await tmuxService.sendTmuxKeys(paneInfo, 'Enter');
|
|
294
|
+
const startTime = Date.now();
|
|
295
|
+
while (!fs.existsSync(worktreePath) && (Date.now() - startTime) < maxWaitTime) {
|
|
296
|
+
await new Promise((resolve) => setTimeout(resolve, checkInterval));
|
|
297
|
+
}
|
|
298
|
+
worktreeCreated = fs.existsSync(worktreePath);
|
|
299
|
+
if (!worktreeCreated && attempt < maxWorktreeAttempts) {
|
|
300
|
+
await new Promise((resolve) => setTimeout(resolve, 250 * attempt));
|
|
301
|
+
}
|
|
294
302
|
}
|
|
295
303
|
// Verify worktree was created successfully
|
|
296
|
-
if (!
|
|
297
|
-
throw new Error(`Worktree directory not created at ${worktreePath} after ${
|
|
304
|
+
if (!worktreeCreated) {
|
|
305
|
+
throw new Error(`Worktree directory not created at ${worktreePath} after ${maxWorktreeAttempts} attempts`);
|
|
298
306
|
}
|
|
299
307
|
// Give a bit more time for git to finish setting up the worktree
|
|
300
308
|
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
@@ -315,47 +323,26 @@ export async function createPane(options, availableAgents) {
|
|
|
315
323
|
}
|
|
316
324
|
// Launch agent if specified
|
|
317
325
|
const hasInitialPrompt = !!(prompt && prompt.trim());
|
|
318
|
-
if (agent
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
326
|
+
if (agent) {
|
|
327
|
+
if (agent === 'gemini') {
|
|
328
|
+
const geminiWorkspacePath = fs.existsSync(worktreePath)
|
|
329
|
+
? worktreePath
|
|
330
|
+
: projectRoot;
|
|
331
|
+
ensureGeminiFolderTrusted(geminiWorkspacePath);
|
|
332
|
+
}
|
|
333
|
+
const promptTransport = getPromptTransport(agent);
|
|
334
|
+
const shouldSendPromptViaTmux = hasInitialPrompt && promptTransport === 'send-keys';
|
|
335
|
+
let baselineCommand;
|
|
336
|
+
if (shouldSendPromptViaTmux) {
|
|
324
337
|
try {
|
|
325
|
-
|
|
338
|
+
baselineCommand = await tmuxService.getPaneCurrentCommand(paneInfo);
|
|
326
339
|
}
|
|
327
340
|
catch {
|
|
328
|
-
|
|
329
|
-
}
|
|
330
|
-
if (promptFilePath) {
|
|
331
|
-
const promptBootstrap = buildPromptReadAndDeleteSnippet(promptFilePath);
|
|
332
|
-
claudeCmd = `${promptBootstrap}; claude "$DMUX_PROMPT_CONTENT"${permissionSuffix}`;
|
|
341
|
+
baselineCommand = undefined;
|
|
333
342
|
}
|
|
334
|
-
else {
|
|
335
|
-
const escapedPrompt = prompt
|
|
336
|
-
.replace(/\\/g, '\\\\')
|
|
337
|
-
.replace(/"/g, '\\"')
|
|
338
|
-
.replace(/`/g, '\\`')
|
|
339
|
-
.replace(/\$/g, '\\$');
|
|
340
|
-
claudeCmd = `claude "${escapedPrompt}"${permissionSuffix}`;
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
else {
|
|
344
|
-
claudeCmd = `claude${permissionSuffix}`;
|
|
345
343
|
}
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
await tmuxService.sendTmuxKeys(paneInfo, 'Enter');
|
|
349
|
-
// Auto-approve trust prompts for Claude (workspace trust, not edit permissions)
|
|
350
|
-
autoApproveTrustPrompt(paneInfo, prompt).catch(() => {
|
|
351
|
-
// Ignore errors in background monitoring
|
|
352
|
-
});
|
|
353
|
-
}
|
|
354
|
-
else if (agent === 'codex') {
|
|
355
|
-
const permissionFlags = getPermissionFlags('codex', settings.permissionMode);
|
|
356
|
-
const permissionSuffix = permissionFlags ? ` ${permissionFlags}` : '';
|
|
357
|
-
let codexCmd;
|
|
358
|
-
if (hasInitialPrompt) {
|
|
344
|
+
let launchCommand;
|
|
345
|
+
if (hasInitialPrompt && !shouldSendPromptViaTmux) {
|
|
359
346
|
let promptFilePath = null;
|
|
360
347
|
try {
|
|
361
348
|
promptFilePath = await writePromptFile(projectRoot, slug, prompt);
|
|
@@ -365,7 +352,7 @@ export async function createPane(options, availableAgents) {
|
|
|
365
352
|
}
|
|
366
353
|
if (promptFilePath) {
|
|
367
354
|
const promptBootstrap = buildPromptReadAndDeleteSnippet(promptFilePath);
|
|
368
|
-
|
|
355
|
+
launchCommand = `${promptBootstrap}; ${buildInitialPromptCommand(agent, '"$DMUX_PROMPT_CONTENT"', settings.permissionMode)}`;
|
|
369
356
|
}
|
|
370
357
|
else {
|
|
371
358
|
const escapedPrompt = prompt
|
|
@@ -373,43 +360,33 @@ export async function createPane(options, availableAgents) {
|
|
|
373
360
|
.replace(/"/g, '\\"')
|
|
374
361
|
.replace(/`/g, '\\`')
|
|
375
362
|
.replace(/\$/g, '\\$');
|
|
376
|
-
|
|
363
|
+
launchCommand = buildInitialPromptCommand(agent, `"${escapedPrompt}"`, settings.permissionMode);
|
|
377
364
|
}
|
|
378
365
|
}
|
|
379
366
|
else {
|
|
380
|
-
|
|
367
|
+
launchCommand = buildAgentCommand(agent, settings.permissionMode);
|
|
381
368
|
}
|
|
382
|
-
await tmuxService.sendShellCommand(paneInfo,
|
|
369
|
+
await tmuxService.sendShellCommand(paneInfo, launchCommand);
|
|
383
370
|
await tmuxService.sendTmuxKeys(paneInfo, 'Enter');
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
const promptBootstrap = buildPromptReadAndDeleteSnippet(promptFilePath);
|
|
397
|
-
opencodeCmd = `${promptBootstrap}; opencode --prompt "$DMUX_PROMPT_CONTENT"`;
|
|
398
|
-
}
|
|
399
|
-
else {
|
|
400
|
-
const escapedPrompt = prompt
|
|
401
|
-
.replace(/\\/g, '\\\\')
|
|
402
|
-
.replace(/"/g, '\\"')
|
|
403
|
-
.replace(/`/g, '\\`')
|
|
404
|
-
.replace(/\$/g, '\\$');
|
|
405
|
-
opencodeCmd = `opencode --prompt "${escapedPrompt}"`;
|
|
406
|
-
}
|
|
371
|
+
if (shouldSendPromptViaTmux) {
|
|
372
|
+
await sendPromptViaTmux({
|
|
373
|
+
paneId: paneInfo,
|
|
374
|
+
prompt,
|
|
375
|
+
tmuxService,
|
|
376
|
+
expectedCommand: getAgentProcessName(agent),
|
|
377
|
+
baselineCommand,
|
|
378
|
+
prePromptKeys: getSendKeysPrePrompt(agent),
|
|
379
|
+
submitKeys: getSendKeysSubmit(agent),
|
|
380
|
+
postPasteDelayMs: getSendKeysPostPasteDelayMs(agent),
|
|
381
|
+
readyDelayMs: getSendKeysReadyDelayMs(agent),
|
|
382
|
+
});
|
|
407
383
|
}
|
|
408
|
-
|
|
409
|
-
|
|
384
|
+
if (agent === 'claude') {
|
|
385
|
+
// Auto-approve trust prompts for Claude (workspace trust, not edit permissions)
|
|
386
|
+
autoApproveTrustPrompt(paneInfo, prompt).catch(() => {
|
|
387
|
+
// Ignore errors in background monitoring
|
|
388
|
+
});
|
|
410
389
|
}
|
|
411
|
-
await tmuxService.sendShellCommand(paneInfo, opencodeCmd);
|
|
412
|
-
await tmuxService.sendTmuxKeys(paneInfo, 'Enter');
|
|
413
390
|
}
|
|
414
391
|
// Keep focus on the new pane
|
|
415
392
|
await tmuxService.selectPane(paneInfo);
|
|
@@ -451,7 +428,7 @@ export async function createPane(options, availableAgents) {
|
|
|
451
428
|
await tmuxService.selectPane(originalPaneId);
|
|
452
429
|
// Re-set the title for the dmux pane
|
|
453
430
|
try {
|
|
454
|
-
await tmuxService.setPaneTitle(originalPaneId,
|
|
431
|
+
await tmuxService.setPaneTitle(originalPaneId, "dmux");
|
|
455
432
|
}
|
|
456
433
|
catch {
|
|
457
434
|
// Ignore if setting title fails
|
|
@@ -464,7 +441,7 @@ export async function createPane(options, availableAgents) {
|
|
|
464
441
|
/**
|
|
465
442
|
* Auto-approve Claude trust prompts
|
|
466
443
|
*/
|
|
467
|
-
async function autoApproveTrustPrompt(paneInfo, prompt) {
|
|
444
|
+
export async function autoApproveTrustPrompt(paneInfo, prompt) {
|
|
468
445
|
// Wait longer for Claude to start up before checking for prompts
|
|
469
446
|
await new Promise((resolve) => setTimeout(resolve, 1200));
|
|
470
447
|
const maxChecks = 100; // 100 checks * 100ms = 10 seconds total
|