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.
Files changed (240) hide show
  1. package/README.md +9 -5
  2. package/dist/DmuxApp.d.ts.map +1 -1
  3. package/dist/DmuxApp.js +100 -56
  4. package/dist/DmuxApp.js.map +1 -1
  5. package/dist/actions/implementations/closeAction.d.ts.map +1 -1
  6. package/dist/actions/implementations/closeAction.js +84 -13
  7. package/dist/actions/implementations/closeAction.js.map +1 -1
  8. package/dist/actions/implementations/index.d.ts +1 -0
  9. package/dist/actions/implementations/index.d.ts.map +1 -1
  10. package/dist/actions/implementations/index.js +3 -0
  11. package/dist/actions/implementations/index.js.map +1 -1
  12. package/dist/actions/implementations/mergeAction.d.ts.map +1 -1
  13. package/dist/actions/implementations/mergeAction.js +59 -19
  14. package/dist/actions/implementations/mergeAction.js.map +1 -1
  15. package/dist/actions/index.d.ts.map +1 -1
  16. package/dist/actions/index.js +18 -0
  17. package/dist/actions/index.js.map +1 -1
  18. package/dist/actions/merge/conflictResolution.d.ts.map +1 -1
  19. package/dist/actions/merge/conflictResolution.js +17 -12
  20. package/dist/actions/merge/conflictResolution.js.map +1 -1
  21. package/dist/actions/merge/issueHandlers/mainDirtyHandler.d.ts.map +1 -1
  22. package/dist/actions/merge/issueHandlers/mainDirtyHandler.js +8 -6
  23. package/dist/actions/merge/issueHandlers/mainDirtyHandler.js.map +1 -1
  24. package/dist/actions/merge/issueHandlers/worktreeUncommittedHandler.d.ts +1 -1
  25. package/dist/actions/merge/issueHandlers/worktreeUncommittedHandler.d.ts.map +1 -1
  26. package/dist/actions/merge/issueHandlers/worktreeUncommittedHandler.js +9 -2
  27. package/dist/actions/merge/issueHandlers/worktreeUncommittedHandler.js.map +1 -1
  28. package/dist/actions/merge/multiMergeOrchestrator.d.ts.map +1 -1
  29. package/dist/actions/merge/multiMergeOrchestrator.js +33 -14
  30. package/dist/actions/merge/multiMergeOrchestrator.js.map +1 -1
  31. package/dist/actions/types.d.ts +5 -2
  32. package/dist/actions/types.d.ts.map +1 -1
  33. package/dist/actions/types.js +28 -1
  34. package/dist/actions/types.js.map +1 -1
  35. package/dist/components/dialogs/AgentChoiceDialog.d.ts +2 -1
  36. package/dist/components/dialogs/AgentChoiceDialog.d.ts.map +1 -1
  37. package/dist/components/dialogs/AgentChoiceDialog.js +4 -5
  38. package/dist/components/dialogs/AgentChoiceDialog.js.map +1 -1
  39. package/dist/components/panes/PaneCard.d.ts +1 -3
  40. package/dist/components/panes/PaneCard.d.ts.map +1 -1
  41. package/dist/components/panes/PaneCard.js +54 -37
  42. package/dist/components/panes/PaneCard.js.map +1 -1
  43. package/dist/components/panes/PanesGrid.d.ts +1 -0
  44. package/dist/components/panes/PanesGrid.d.ts.map +1 -1
  45. package/dist/components/panes/PanesGrid.js +60 -78
  46. package/dist/components/panes/PanesGrid.js.map +1 -1
  47. package/dist/components/popups/agentChoicePopup.d.ts +2 -2
  48. package/dist/components/popups/agentChoicePopup.js +90 -56
  49. package/dist/components/popups/agentChoicePopup.js.map +1 -1
  50. package/dist/components/popups/agentChoiceSelection.d.ts +8 -0
  51. package/dist/components/popups/agentChoiceSelection.d.ts.map +1 -0
  52. package/dist/components/popups/agentChoiceSelection.js +14 -0
  53. package/dist/components/popups/agentChoiceSelection.js.map +1 -0
  54. package/dist/components/popups/diffPeekPopup.d.ts +7 -0
  55. package/dist/components/popups/diffPeekPopup.d.ts.map +1 -0
  56. package/dist/components/popups/diffPeekPopup.js +99 -0
  57. package/dist/components/popups/diffPeekPopup.js.map +1 -0
  58. package/dist/components/popups/enabledAgentsPopup.d.ts +7 -0
  59. package/dist/components/popups/enabledAgentsPopup.d.ts.map +1 -0
  60. package/dist/components/popups/enabledAgentsPopup.js +196 -0
  61. package/dist/components/popups/enabledAgentsPopup.js.map +1 -0
  62. package/dist/components/popups/kebabMenuPopup.js +2 -2
  63. package/dist/components/popups/kebabMenuPopup.js.map +1 -1
  64. package/dist/components/popups/mergeUncommittedChoicePopup.d.ts +7 -0
  65. package/dist/components/popups/mergeUncommittedChoicePopup.d.ts.map +1 -0
  66. package/dist/components/popups/mergeUncommittedChoicePopup.js +289 -0
  67. package/dist/components/popups/mergeUncommittedChoicePopup.js.map +1 -0
  68. package/dist/components/popups/newPanePopup.js +8 -0
  69. package/dist/components/popups/newPanePopup.js.map +1 -1
  70. package/dist/components/popups/reopenWorktreePopup.js +33 -3
  71. package/dist/components/popups/reopenWorktreePopup.js.map +1 -1
  72. package/dist/components/popups/settingsPopup.js +346 -25
  73. package/dist/components/popups/settingsPopup.js.map +1 -1
  74. package/dist/components/popups/shortcutsPopup.js +17 -13
  75. package/dist/components/popups/shortcutsPopup.js.map +1 -1
  76. package/dist/components/popups/singleAgentChoicePopup.d.ts +7 -0
  77. package/dist/components/popups/singleAgentChoicePopup.d.ts.map +1 -0
  78. package/dist/components/popups/singleAgentChoicePopup.js +95 -0
  79. package/dist/components/popups/singleAgentChoicePopup.js.map +1 -0
  80. package/dist/components/ui/FooterHelp.js +1 -1
  81. package/dist/components/ui/FooterHelp.js.map +1 -1
  82. package/dist/constants/layout.d.ts +9 -0
  83. package/dist/constants/layout.d.ts.map +1 -0
  84. package/dist/constants/layout.js +9 -0
  85. package/dist/constants/layout.js.map +1 -0
  86. package/dist/hooks/useActionSystem.d.ts +1 -1
  87. package/dist/hooks/useActionSystem.d.ts.map +1 -1
  88. package/dist/hooks/useActionSystem.js +1 -1
  89. package/dist/hooks/useActionSystem.js.map +1 -1
  90. package/dist/hooks/useAgentDetection.d.ts +2 -2
  91. package/dist/hooks/useAgentDetection.d.ts.map +1 -1
  92. package/dist/hooks/useAgentDetection.js +18 -88
  93. package/dist/hooks/useAgentDetection.js.map +1 -1
  94. package/dist/hooks/useAutoUpdater.d.ts.map +1 -1
  95. package/dist/hooks/useAutoUpdater.js +2 -4
  96. package/dist/hooks/useAutoUpdater.js.map +1 -1
  97. package/dist/hooks/useInputHandling.d.ts +5 -0
  98. package/dist/hooks/useInputHandling.d.ts.map +1 -1
  99. package/dist/hooks/useInputHandling.js +230 -22
  100. package/dist/hooks/useInputHandling.js.map +1 -1
  101. package/dist/hooks/useNavigation.d.ts +1 -1
  102. package/dist/hooks/useNavigation.d.ts.map +1 -1
  103. package/dist/hooks/useNavigation.js +26 -4
  104. package/dist/hooks/useNavigation.js.map +1 -1
  105. package/dist/hooks/usePaneCreation.d.ts +5 -2
  106. package/dist/hooks/usePaneCreation.d.ts.map +1 -1
  107. package/dist/hooks/usePaneCreation.js +123 -23
  108. package/dist/hooks/usePaneCreation.js.map +1 -1
  109. package/dist/hooks/usePaneSync.d.ts +1 -1
  110. package/dist/hooks/usePaneSync.d.ts.map +1 -1
  111. package/dist/hooks/usePaneSync.js +14 -1
  112. package/dist/hooks/usePaneSync.js.map +1 -1
  113. package/dist/hooks/usePanes.d.ts.map +1 -1
  114. package/dist/hooks/usePanes.js +19 -5
  115. package/dist/hooks/usePanes.js.map +1 -1
  116. package/dist/hooks/useServices.d.ts +2 -1
  117. package/dist/hooks/useServices.d.ts.map +1 -1
  118. package/dist/hooks/useServices.js +4 -2
  119. package/dist/hooks/useServices.js.map +1 -1
  120. package/dist/index.js +200 -21
  121. package/dist/index.js.map +1 -1
  122. package/dist/layout/LayoutCalculator.d.ts.map +1 -1
  123. package/dist/layout/LayoutCalculator.js +4 -1
  124. package/dist/layout/LayoutCalculator.js.map +1 -1
  125. package/dist/layout/SpacerManager.d.ts.map +1 -1
  126. package/dist/layout/SpacerManager.js +2 -1
  127. package/dist/layout/SpacerManager.js.map +1 -1
  128. package/dist/services/PaneEventService.d.ts.map +1 -1
  129. package/dist/services/PaneEventService.js +2 -5
  130. package/dist/services/PaneEventService.js.map +1 -1
  131. package/dist/services/PaneWorkerManager.d.ts.map +1 -1
  132. package/dist/services/PaneWorkerManager.js +2 -14
  133. package/dist/services/PaneWorkerManager.js.map +1 -1
  134. package/dist/services/PopupManager.d.ts +14 -2
  135. package/dist/services/PopupManager.d.ts.map +1 -1
  136. package/dist/services/PopupManager.js +162 -24
  137. package/dist/services/PopupManager.js.map +1 -1
  138. package/dist/services/TmuxHookManager.d.ts.map +1 -1
  139. package/dist/services/TmuxHookManager.js +4 -2
  140. package/dist/services/TmuxHookManager.js.map +1 -1
  141. package/dist/services/TmuxService.d.ts +9 -0
  142. package/dist/services/TmuxService.d.ts.map +1 -1
  143. package/dist/services/TmuxService.js +18 -2
  144. package/dist/services/TmuxService.js.map +1 -1
  145. package/dist/types.d.ts +11 -3
  146. package/dist/types.d.ts.map +1 -1
  147. package/dist/utils/agentDetection.d.ts +15 -8
  148. package/dist/utils/agentDetection.d.ts.map +1 -1
  149. package/dist/utils/agentDetection.js +49 -73
  150. package/dist/utils/agentDetection.js.map +1 -1
  151. package/dist/utils/agentLaunch.d.ts +60 -2
  152. package/dist/utils/agentLaunch.d.ts.map +1 -1
  153. package/dist/utils/agentLaunch.js +490 -41
  154. package/dist/utils/agentLaunch.js.map +1 -1
  155. package/dist/utils/agentPromptDispatch.d.ts +33 -0
  156. package/dist/utils/agentPromptDispatch.d.ts.map +1 -0
  157. package/dist/utils/agentPromptDispatch.js +99 -0
  158. package/dist/utils/agentPromptDispatch.js.map +1 -0
  159. package/dist/utils/asciiArt.d.ts.map +1 -1
  160. package/dist/utils/asciiArt.js +6 -7
  161. package/dist/utils/asciiArt.js.map +1 -1
  162. package/dist/utils/attachAgent.d.ts +25 -0
  163. package/dist/utils/attachAgent.d.ts.map +1 -0
  164. package/dist/utils/attachAgent.js +139 -0
  165. package/dist/utils/attachAgent.js.map +1 -0
  166. package/dist/utils/conflictResolutionPane.d.ts +2 -1
  167. package/dist/utils/conflictResolutionPane.d.ts.map +1 -1
  168. package/dist/utils/conflictResolutionPane.js +48 -53
  169. package/dist/utils/conflictResolutionPane.js.map +1 -1
  170. package/dist/utils/controlPaneRecovery.d.ts +2 -0
  171. package/dist/utils/controlPaneRecovery.d.ts.map +1 -0
  172. package/dist/utils/controlPaneRecovery.js +156 -0
  173. package/dist/utils/controlPaneRecovery.js.map +1 -0
  174. package/dist/utils/devSource.d.ts +7 -0
  175. package/dist/utils/devSource.d.ts.map +1 -0
  176. package/dist/utils/devSource.js +19 -0
  177. package/dist/utils/devSource.js.map +1 -0
  178. package/dist/utils/devWatchCommand.d.ts +8 -0
  179. package/dist/utils/devWatchCommand.d.ts.map +1 -0
  180. package/dist/utils/devWatchCommand.js +14 -0
  181. package/dist/utils/devWatchCommand.js.map +1 -0
  182. package/dist/utils/geminiTrust.d.ts +8 -0
  183. package/dist/utils/geminiTrust.d.ts.map +1 -0
  184. package/dist/utils/geminiTrust.js +67 -0
  185. package/dist/utils/geminiTrust.js.map +1 -0
  186. package/dist/utils/generated-agents-doc.d.ts +1 -1
  187. package/dist/utils/generated-agents-doc.js +3 -3
  188. package/dist/utils/hooksDocs.d.ts +2 -9
  189. package/dist/utils/hooksDocs.d.ts.map +1 -1
  190. package/dist/utils/hooksDocs.js +26 -6
  191. package/dist/utils/hooksDocs.js.map +1 -1
  192. package/dist/utils/layoutManager.d.ts +5 -1
  193. package/dist/utils/layoutManager.d.ts.map +1 -1
  194. package/dist/utils/layoutManager.js +103 -26
  195. package/dist/utils/layoutManager.js.map +1 -1
  196. package/dist/utils/paneCreation.d.ts +8 -2
  197. package/dist/utils/paneCreation.d.ts.map +1 -1
  198. package/dist/utils/paneCreation.js +82 -105
  199. package/dist/utils/paneCreation.js.map +1 -1
  200. package/dist/utils/paneGrouping.d.ts.map +1 -1
  201. package/dist/utils/paneGrouping.js +30 -0
  202. package/dist/utils/paneGrouping.js.map +1 -1
  203. package/dist/utils/projectActions.d.ts +5 -0
  204. package/dist/utils/projectActions.d.ts.map +1 -1
  205. package/dist/utils/projectActions.js +15 -4
  206. package/dist/utils/projectActions.js.map +1 -1
  207. package/dist/utils/reopenWorktree.d.ts +1 -1
  208. package/dist/utils/reopenWorktree.d.ts.map +1 -1
  209. package/dist/utils/reopenWorktree.js +23 -31
  210. package/dist/utils/reopenWorktree.js.map +1 -1
  211. package/dist/utils/runtimePaths.d.ts +2 -0
  212. package/dist/utils/runtimePaths.d.ts.map +1 -0
  213. package/dist/utils/runtimePaths.js +8 -0
  214. package/dist/utils/runtimePaths.js.map +1 -0
  215. package/dist/utils/settingsManager.d.ts +3 -0
  216. package/dist/utils/settingsManager.d.ts.map +1 -1
  217. package/dist/utils/settingsManager.js +200 -9
  218. package/dist/utils/settingsManager.js.map +1 -1
  219. package/dist/utils/systemCheck.d.ts.map +1 -1
  220. package/dist/utils/systemCheck.js +0 -13
  221. package/dist/utils/systemCheck.js.map +1 -1
  222. package/dist/utils/tmux.d.ts +5 -1
  223. package/dist/utils/tmux.d.ts.map +1 -1
  224. package/dist/utils/tmux.js +23 -5
  225. package/dist/utils/tmux.js.map +1 -1
  226. package/dist/utils/tmuxHookCommands.d.ts +14 -0
  227. package/dist/utils/tmuxHookCommands.d.ts.map +1 -0
  228. package/dist/utils/tmuxHookCommands.js +30 -0
  229. package/dist/utils/tmuxHookCommands.js.map +1 -0
  230. package/dist/utils/welcomePane.d.ts +2 -1
  231. package/dist/utils/welcomePane.d.ts.map +1 -1
  232. package/dist/utils/welcomePane.js +3 -2
  233. package/dist/utils/welcomePane.js.map +1 -1
  234. package/dist/utils/welcomePaneManager.js +1 -1
  235. package/dist/utils/welcomePaneManager.js.map +1 -1
  236. package/dist/workers/PaneWorker.js.map +1 -1
  237. package/dist/workers/WorkerMessages.d.ts +2 -1
  238. package/dist/workers/WorkerMessages.d.ts.map +1 -1
  239. package/dist/workers/WorkerMessages.js.map +1 -1
  240. 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: 50,
12
- MAX_COMFORTABLE_WIDTH: 80,
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 = DEFAULT_LAYOUT_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
- LogService.getInstance().warn('Invalid controlPaneId, skipping layout', 'Layout');
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
- LogService.getInstance().warn(`Invalid terminal dimensions: ${terminalWidth}x${terminalHeight}, skipping layout`, 'Layout');
95
+ if (!suppressLogs) {
96
+ LogService.getInstance().warn(`Invalid terminal dimensions: ${terminalWidth}x${terminalHeight}, skipping layout`, 'Layout');
97
+ }
48
98
  return;
49
99
  }
50
- // Create class instances with config
51
- const calculator = new LayoutCalculator(config);
52
- const spacerManager = new SpacerManager(config);
53
- const layoutApplier = new TmuxLayoutApplier(config);
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
- LogService.getInstance().debug(`Failed to find spacer pane: ${error}`, 'Layout');
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
- LogService.getInstance().debug(`Skipping stale pane ID ${id} (no longer exists in tmux)`, 'Layout');
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
- LogService.getInstance().debug(`Failed to validate pane IDs: ${error}`, 'Layout');
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
- // Check if dimensions and pane count have changed since last layout
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
- if (dimensionsUnchanged) {
90
- // Layout unchanged - skip ALL layout operations to prevent Ink redraw
91
- // This prevents the dmux UI from being cleared on resize when nothing changed
92
- // (Removed noisy debug log that fires on every check)
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
- // Only log when dimensions actually change (much less noisy)
96
- LogService.getInstance().info(`Layout dimensions changed: ${terminalWidth}x${terminalHeight}, ${realContentPanes.length} panes`, 'layout');
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
- LogService.getInstance().warn(`Spacer pane ${spacerId} not verified, continuing anyway`, 'Layout');
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
- LogService.getInstance().debug(`Pane ${id} disappeared before layout application`, 'Layout');
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
- LogService.getInstance().warn(`Panes changed during layout calculation (${finalContentPanes.length} → ${validFinalPanes.length}), skipping layout apply`, 'Layout');
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
- LogService.getInstance().warn(`Control pane ${actualControlPaneId} no longer exists, skipping layout apply`, 'Layout');
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
- LogService.getInstance().debug(`Final validation failed: ${validationError}, attempting layout anyway`, 'Layout');
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?: 'claude' | 'opencode' | 'codex';
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: Array<'claude' | 'opencode' | 'codex'>): Promise<CreatePaneResult>;
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;AAsBxD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;IACxC,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,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,KAAK,CAAC,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC,GACtD,OAAO,CAAC,gBAAgB,CAAC,CA+e3B"}
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, getPermissionFlags } from './agentLaunch.js';
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
- // Build worktree command:
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
- const startTime = Date.now();
292
- while (!fs.existsSync(worktreePath) && (Date.now() - startTime) < maxWaitTime) {
293
- await new Promise((resolve) => setTimeout(resolve, checkInterval));
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 (!fs.existsSync(worktreePath)) {
297
- throw new Error(`Worktree directory not created at ${worktreePath} after ${maxWaitTime}ms`);
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 === 'claude') {
319
- const permissionFlags = getPermissionFlags('claude', settings.permissionMode);
320
- const permissionSuffix = permissionFlags ? ` ${permissionFlags}` : '';
321
- let claudeCmd;
322
- if (hasInitialPrompt) {
323
- let promptFilePath = null;
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
- promptFilePath = await writePromptFile(projectRoot, slug, prompt);
338
+ baselineCommand = await tmuxService.getPaneCurrentCommand(paneInfo);
326
339
  }
327
340
  catch {
328
- // Fall back to inline escaping if prompt file write fails
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
- // Send the claude command (auto-quoted by sendShellCommand)
347
- await tmuxService.sendShellCommand(paneInfo, claudeCmd);
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
- codexCmd = `${promptBootstrap}; codex "$DMUX_PROMPT_CONTENT"${permissionSuffix}`;
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
- codexCmd = `codex "${escapedPrompt}"${permissionSuffix}`;
363
+ launchCommand = buildInitialPromptCommand(agent, `"${escapedPrompt}"`, settings.permissionMode);
377
364
  }
378
365
  }
379
366
  else {
380
- codexCmd = `codex${permissionSuffix}`;
367
+ launchCommand = buildAgentCommand(agent, settings.permissionMode);
381
368
  }
382
- await tmuxService.sendShellCommand(paneInfo, codexCmd);
369
+ await tmuxService.sendShellCommand(paneInfo, launchCommand);
383
370
  await tmuxService.sendTmuxKeys(paneInfo, 'Enter');
384
- }
385
- else if (agent === 'opencode') {
386
- let opencodeCmd;
387
- if (hasInitialPrompt) {
388
- let promptFilePath = null;
389
- try {
390
- promptFilePath = await writePromptFile(projectRoot, slug, prompt);
391
- }
392
- catch {
393
- // Fall back to inline escaping if prompt file write fails
394
- }
395
- if (promptFilePath) {
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
- else {
409
- opencodeCmd = 'opencode';
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, `dmux-${projectName}`);
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